Fast X

Put your brain on cruise control, Fast X is 2.5 hours of vroom vroom things go boom, family, and whatever the h3!! Jason Momoa is doing
67/100137157
Starring
Vin Diesel, Michelle Rodriguez, Tyreses Gibson, Ludacris
Director
Louis Leterrier
Rating
PG-13
Genre
Action, Crime, Mystery
Release date
May 19, 2023
Overall Score
Rating Overview
Story/Plot/Script
Visuals/Cinematography
Performance
Direction
Non-Wokeness
Rating Summary
Fast X is a 6-year-old boy's overstuffed matchbox car play session on HGH and sometimes literally shrooms. From Vin Diesel looking like he's holding in a fart in polite company throughout, to Jason Momoa's puffy face and drug-induced performance, everything in this flick is dumb, and just when the action gets cranked up to 11, this pre-teen boy's fevered dream posing as a movie pulls on the e-brake and dumps the clutch. But don't worry, quickly after, the ignition is cranked back up and you can put your brain on autopilot and enjoy the pretty colors once again.

If you’ve got 1,384 minutes to spare, you can enjoy every nitrous-burning, wheel-spinning, action-packed minute of the Fast & Furious saga. If you’ve already seen them all, be prepared for every moment between action sequences in Fast X to feel like 1,384 minutes.

Fast X

What can be said about Fast X that hasn’t been said about one or every entry in a saga that spans 22 years? Probably nothing. It’s fun, and it knows how dumb it is, and if you’re going to enjoy it, you’ve got to leave your brain at the door. However, while the car chases haven’t slowed down over the decades, FF’s now middle-aged actors have. None of the fight scenes are as crisp as their predecessors, and the filmmakers have to rely on jump cuts and frenetic cinematography to cover for the aging actors.

Unarguably, the main reason that anyone goes to see a Fast & Furious movie is for the cool cars, slick races, and outrageous stunts, both practical and digital. In this, Fast X delivers. However, after all these movies and all the ridiculous, impossible things we’ve seen Dom’s family/crew do over the last two decades, the action pieces in Fast X feel largely old-hat and derivative… of themselves. It’s almost like the filmmakers took every component from every other film in the series and put them in a slot machine: giant fast-moving armored truck | Ramsey | remote control override, Ludacris | celebrity cameo | throw-away joke – rinse and repeat.

Fast X narrative slot machine

X Marks the Spot - Follow us Today!!

With that being said, if you hope to enjoy it, it’s important to occasionally remind yourself that the Fast & Furious Saga isn’t for those who are looking for realistic physics, thoughtful and intricate plots, or normal human behavior. It is for someone who is looking for the live-action movie version of playing with Matchbox cars as a child. At that time in your life, with sheer will and creative shifting, a rear-wheel drive muscle car could force to the ground two powerful helicopters that are tethered to it and have lifted its rear wheels off the road. So too is it with Fast X.

In the same vein, if you were to put any thought into the actions of the “good guys,” you’d realize that their “missions” are responsible for the deaths of hundreds of innocent people. The safe scene from the fifth FF, which is revisited in Fast X’s prologue, would have had to have killed at least 30 people. It makes Bruce’s first time in the Batmobile in Batman Begins look like a leisurely Sunday drive to visit Aunt Dorthy.

In Fast X, the performances range from 100-lb spindly-armed women doing their best tough-guy faces to Jason Momoa’s manic impersonation of a caricature of a woman being visited by the Red Dragon. It’s regrettable that the dialogue isn’t any help. Instead, it reads like someone asked ChatGPT to write the most generic action-movie dialogue possible, leaving extra time for mugging and grimacing.

Furthermore, the “brotherly” sniping between Ludacris’s Tej and Tyrese Gibson’s Roman has more than worn out its welcome. In Fast X, it’s more like a tooth being pulled without Novocaine. You understand that it has to happen, but you can’t wait until it’s out and done with. In this flick, the two have to fight, so that they can make up right before the twist.

No, instead of the high-octane action enhancing the story, Fast X’s story manages to slam on the brakes and ram viewers’ heads through the narrative’s windshield. Every moment, with the exception of a couple of cute scenes between Dom’s son and brother, played by John Cena, in which the characters interact with one another while doing anything other than driving a car, drags on for an eternity. One of the main reasons for this is that everything that the characters do is bull$h!t.

Everyone’s iPhone is also a super-hacker MacGuffin that lets them do or know whatever they need to get to the next set piece, and no one has to work to find out anything. It’s excruciatingly boring. There are absolutely no consequences incurred by anything within the non-action set pieces because each consequence is fixed by a bit of tech that looks like it was ripped out of a Meta Quest game.

In what might be the perfect metaphor for the entire franchise, but most especially Fast X, there’s a scene in which an electronic lock is activated, trapping one of the main cast in a room with a dangerous and hostile man. Fortunately, the super-advanced lock is conveniently and inexplicably accessible via Bluetooth, and the heroes are able to unlock it via bull$h!t. However, after they knowingly unlocked it, they still kicked the door in and busted the lock.

It doesn’t help that every other non-action scene has a size 13 boot shoving in another character from the saga’s past entries. At 2.5 hours, that’s a lot of shoving, and all it manages to do is bloat the film, drag the momentum to a halt, and give even less time to the core cast members.

When the checkered flag has been waved, and the smell of high-test fuel has cleared, fans of the Fast & Furious Saga most likely will enjoy this two-plus-hour romp. Just make sure to leave your IQ in your other pants. We’d strongly suggest going to a theater that serves alcohol, both to improve the movie and because the subsequent potty break will give you an excuse to leave the theater for a few minutes. Don’t worry, you won’t miss anything. I promise that the scene that you leave will still be going on when you get back.

Woke Report

WOKE REPORT

You're Only Getting Half the Picture.

This section is our site's secret sauce, and what truly separates us from the rest. If you don't read it, you haven't read our review.

Have the filmmakers chosenradical progressive messaging over story?
Unlock the insightsthat could change your viewing experience and protect your family.

James Carrick

James Carrick is a passionate film enthusiast with a degree in theater and philosophy. James approaches dramatic criticism from a philosophic foundation grounded in aesthetics and ethics, offering insight and analysis that reveals layers of cinematic narrative with a touch of irreverence and a dash of snark.

Leave a Review
  1. Worst May 31, 2023 at

    I don’t see how this gets a non-woke tag. It’s misleading. The “Woke Elements” section of the review explains enough, it doesn’t matter that it’s a cartoon movie. It has all the elements and beyond. Jason Momoa is over the top gay/tranny/insert new word here. You can say he is a evil lunatics, but we have to sit and watch him paint his nails? Oh and you missed that one of the few white people in the movie a dork loser who has to blow himself up to try and be redeemed as not useless. The other white hero character turns out to be evil anyway.

    The movie is over the top stupid. It’s hard to enjoy any of it without getting completely taken out every 2 minutes by another physical impossibility. It reminds me of that James Bond where the tank did a wheelie. Imagine that over and over again and that’s the movie.

    8
    1
    1. James Carrick May 31, 2023 at

      I think that those are fair criticisms. However, Momoa’s cross dressing was not employed as a celebration of transness, but instead as a symptom of his madness. I’m always down with anything that characterizes trans as 🦇 💩.

  2. Wheeze June 2, 2023 at

    Why exactly would you tag the theme of friends and family being the same under woke? Those don’t exactly seem woke and comraderie is a good value for people to have.

    1. Jay June 14, 2023 at

      Yeah, I’m confused by that as well. What is the issue?

      1. James Carrick June 15, 2023 at

        I hold no reservations when it comes to close friends. They are undoubtedly a source of great joy and an indispensable component of a thriving and gratifying existence. However, my concern lies with the tendency of the political Left to associate dissimilar entities and assert that the nature of a particular thing is contingent upon one’s feelings. It is crucial to acknowledge that family holds a unique status, separate from close friendships; they are distinct entities and possess distinct values.

        Over the course of many years, the American Left has been actively engaged in a campaign to undermine the institution of the American family. This agenda is evident in the recent remarks made by Joe Biden, where he stated, “There’s no such thing as someone else’s children.” These words uttered by a United States President are exceptionally revealing and disturbing. The family unit serves as the foundation of American society and healthy communities worldwide. By perpetuating the falsehood that friends and family are interchangeable, it becomes easier to detach individuals from their primary support system. This separation creates an opportunity for the government to step in and fill that void. Left-leaning ideologies have long employed this tactic.

  3. Bryan June 21, 2023 at

    This movie was a painful waste of time..

    4
    1
  4. Anders June 21, 2023 at

    What about the small and tiny Tess (Brie Larson) walking in to a bar, and beat up four big muscular men trice her size?

    And Dominic (Vin Diesel) and Letty (Michelle Rodriguez) having birthed a child that is black?

    This movie is woke as f***k.

    6
    1
  5. Reelviewer June 26, 2023 at

    There hasn’t been a bigger let down of a story since game of thrones. I was originally excited because I saw a behind the scenes with Mamoa and he hyped his character so much. I was totally let down to see all the “gayness” of his character. And then to leave ot on a cliff hanger. Come on fast franchise. Wow. I bought all the fast on Apple TV to rewatch and again be just as let down as Thrones. I may or may not watch the next one.

  6. Luiz Alves July 23, 2023 at

    I’ve had friends that I considered family & I’m not a leftist. It simply means you’re so close to them, that they are like a family member. I don’t consider that woke at all. Not always anyway.

  7. DoctorMaster July 27, 2023 at

    There was a scene when Jason was painting his nails and if I recall correctly he says he does that to tone down his toxic masculinity while talking to the 2 dead guys in the pool scene. Sounds more woke then insane imo

    1. James Carrick July 27, 2023 at

      I’d agree except that his character is clearly nuts and his cross-dressing proclivities are played for comedy rather than celebration.

  8. captain hmmm August 28, 2023 at

    While I can’t argue that you need to turn your brain off a bit for the movie. You know going into it that’s what your getting. They even sort of mock at it in F9. I also think the plot twist were pretty good. I didn’t see Reacher turning on them at the end. But it could really go either way. My only really discrpensy is the non woke rating. I don’t mind the girl fights, or the girl power hacker brains, or the over the top flamboyant vilain (it was annoying but sort of made sense and was great acting, almost to good at times). The real woke issues is it’s all cjciks at the end. Rodriguez, Thereon, and wonder women at the end, Dom’s sister, the dead baby momma’s sister all live and she would have beat Dom is a race it seemed. The new little miss nobody, CPT Marvel chick is one of the worst actresses ever, in nearly all the movies I’ve seen her in. All the old boys and hseemacker girl seem to die, but who knows. But fast 11 seems like is will be a star stuffed cast of women and frankly Rodriguez is the only one that holds her own on screen and who character I have any interest in seeing. But I did enjoy the movie for the most part. Bit as mentioned you have to enter the movie knowing what you are in for and turn the brain off a bit.

  9. Gowokegochoke January 14, 2025 at

    This is what I’m talking about!! Good old fashioned Sigma male action! No woke baby nonsense, just sweaty, strong, brave, powerful men fueled by nothing but testosterone and family! Felt awesome to get away from the wife for a while and just enjoy a non-woke night out with the boys for some intense group fun! Can’t wait to come again and see what’s next for these guys! FAMILY FOR LIFE!

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

No audience reviews yet. Be the first to leave one.

Related Posts

 

X Marks the Spot - Follow us Today!!

 

 

'; win.document.open(); win.document.write(html); win.document.close(); return true; } function escapeHtml(str){ return String(str || '').replace(/[&<>"']/g, function(ch){ return ({'&':'&','<':'<','>':'>','"':'"',"'":'''})[ch] || ch; }); } function renderShareOptionsWindow(win, landscapeUrl, squareUrl, shareUrl, heading){ if (!win || win.closed) return false; var safeHeading = escapeHtml(heading || 'Share options'); var safeLandscape = escapeHtml(landscapeUrl || ''); var safeSquare = escapeHtml(squareUrl || ''); var safeUrl = escapeHtml(shareUrl || ''); // Keep this HTML script-free. A nested script tag inside this inline footer script can break under Cloudflare Rocket Loader. var html = '' + safeHeading + '' + '' + '

' + safeHeading + '

'; win.document.open(); win.document.write(html); win.document.close(); try { var doc = win.document; var btn = doc.getElementById('copyLinkBtn'); var status = doc.getElementById('shareStatus'); var field = doc.getElementById('shareUrlField'); var urlToCopy = String(shareUrl || ''); function setCopied(){ if (status) status.textContent = 'Link copied.'; if (btn) { btn.textContent = 'Copied!'; win.setTimeout(function(){ btn.textContent = 'Copy link'; }, 1500); } } function focusField(){ if (!field) return; field.removeAttribute('readonly'); field.focus(); field.select(); field.setSelectionRange(0, field.value.length); field.setAttribute('readonly','readonly'); } function legacyCopy(text){ var ta = doc.createElement('textarea'); ta.value = text; ta.setAttribute('readonly','readonly'); ta.style.position='fixed'; ta.style.top='0'; ta.style.left='0'; ta.style.opacity='0.01'; ta.style.pointerEvents='none'; doc.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); var ok=false; try{ ok=!!doc.execCommand('copy'); }catch(err){} doc.body.removeChild(ta); return ok; } win.__wiowCopyShareLink = async function(){ if (!urlToCopy) { if (status) status.textContent='No share URL available.'; return false; } focusField(); try { if (win.navigator && win.navigator.clipboard && typeof win.navigator.clipboard.writeText === 'function') { await win.navigator.clipboard.writeText(urlToCopy); setCopied(); return false; } } catch(err) {} if (legacyCopy(urlToCopy)) { setCopied(); return false; } if (status) status.textContent='Press Ctrl+C or Cmd+C to copy the selected link.'; focusField(); return false; }; if (btn) btn.addEventListener('click', function(e){ e.preventDefault(); win.__wiowCopyShareLink(); }); var nextBtn = doc.getElementById('nextComboBtn'); if (nextBtn) nextBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowRefreshShareOptions) win.opener.__wiowRefreshShareOptions(win); }); var mainBtn = doc.getElementById('mainComboBtn'); if (mainBtn) mainBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowResetShareOptions) win.opener.__wiowResetShareOptions(win); }); Array.prototype.slice.call(doc.querySelectorAll('.preview-frame img')).forEach(function(img){ img.addEventListener('click', function(){ var overlay=doc.createElement('div'); overlay.className='overlay'; var full=doc.createElement('img'); full.src=img.getAttribute('data-full') || img.src; full.alt='Preview'; overlay.appendChild(full); overlay.addEventListener('click', function(){ overlay.remove(); }); doc.body.appendChild(overlay); }); }); } catch(err) {} return true; } async function buildShareImage(container, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var posterUrl = container.getAttribute('data-poster-url') || findPosterUrl(); if (!posterUrl){ posterUrl = ''; } var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image' : (isAudience ? 'wiow_build_audience_share_image' : 'wiow_build_share_image'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('poster_url', posterUrl); payload.append('share_context', kind); if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || '', poster_url: data.data.poster_url || posterUrl || '' }; } async function buildShareSquareImage(container, cycleImageUrl, posterUrl, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image_square' : (isAudience ? 'wiow_build_audience_share_image_square' : 'wiow_build_share_image_square'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('share_context', kind); if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } if (cycleImageUrl) { payload.append('cycle_image_url', cycleImageUrl); } if (posterUrl) { payload.append('poster_url', posterUrl); } if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Square share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || cycleImageUrl || '', poster_url: data.data.poster_url || posterUrl || '' }; } window.__wiowRefreshShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build next combo.'; targetWin.document.open(); targetWin.document.write('

Could not build next combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; window.__wiowResetShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true, reset:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true, reset:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build main combo.'; targetWin.document.open(); targetWin.document.write('

Could not build main combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; // Unified capture-phase share handler. Chrome incognito can allow the visual // pointer animation while another script prevents the later bubbling click // handler from ever running. Handle all top-level share buttons here first. document.addEventListener('click', async function(e){ var targetEl = e.target && e.target.nodeType === 1 ? e.target : (e.target && e.target.parentElement ? e.target.parentElement : null); var btn = targetEl && targetEl.closest ? targetEl.closest('.wiow-share-btn') : null; if (!btn) return; // Ignore the Audience modal "Rate" button (it also has wiow-share-btn class in your CSS usage) if (btn.hasAttribute('data-wiow-audience-open')) return; var row = btn.closest('[data-wiow-share="1"], .wiow-share-row'); if (!row) return; var platform = btn.getAttribute('data-platform'); // Public top-level controls must work even when AJAX generation or membership-gated data is unavailable. // Options still uses the full image-builder path below. if (platform === 'x' || platform === 'link') { e.preventDefault(); e.stopPropagation(); var quickStatus = row.querySelector('.wiow-share-status'); var quickUrl = btn.getAttribute('data-copy-url') || row.getAttribute('data-share-page') || row.getAttribute('data-post-url') || wiowShareFallbackUrl(row); if (!quickUrl) { if (quickStatus) quickStatus.textContent = 'No share URL available.'; return; } if (platform === 'x') { openPopup(btn.getAttribute('href') || btn.getAttribute('data-wiow-x-intent') || wiowShareXIntentUrl(row)); if (quickStatus) quickStatus.textContent = ''; return; } if (quickStatus) quickStatus.textContent = 'Copying link…'; var copiedQuick = await wiowCopyShareText(quickUrl); var quickLabel = btn.querySelector('.wiow-share-btn__label'); var quickOriginal = quickLabel ? quickLabel.textContent : 'Copy link'; if (copiedQuick) { if (quickStatus) quickStatus.textContent = 'Link copied.'; if (quickLabel) { quickLabel.textContent = 'Copied!'; window.setTimeout(function(){ quickLabel.textContent = quickOriginal || 'Copy link'; }, 1500); } } else { if (quickStatus) quickStatus.textContent = 'Could not copy link.'; } return; } e.preventDefault(); var previewWin = null; if (platform === 'copy') { previewWin = openShareOptionsWindow(); var preloadKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var preloadHeading = (preloadKind === 'audience' || preloadKind === 'audience-teaser' || preloadKind === 'audience-question') ? 'Audience share options' : ((preloadKind === 'ratings' || preloadKind === 'ratings-admin' || preloadKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); renderShareOptionsLoadingWindow(previewWin, preloadHeading); } var statusEl = row.querySelector('.wiow-share-status'); if (statusEl) statusEl.textContent = (platform === 'link') ? 'Copying link…' : 'Preparing share…'; try { var publicShareUrl = wiowShareFallbackUrl(row); var publicPostTitle = (row.getAttribute('data-post-title') || '').trim(); if (!publicPostTitle) publicPostTitle = 'this'; var publicShareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var publicUpperTitle = publicPostTitle.toUpperCase(); var publicLineTwo = (publicShareKind === 'audience' || publicShareKind === 'audience-teaser' || publicShareKind === 'audience-question') ? 'See what the audience is saying.' : ((publicShareKind === 'ratings' || publicShareKind === 'ratings-admin' || publicShareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var publicBaseText = 'Is ' + publicUpperTitle + ' Worth it or Woke?\n\n' + publicLineTwo + '\n\nFollow @worthitorwoke for more.'; // Public top-level X and Copy Link controls should not depend on AJAX image generation. // The share URL itself carries the OG/Twitter metadata; scrapers can generate/fetch the image from that URL. if ((platform === 'x' || platform === 'link') && publicShareUrl) { if (platform === 'link') { var copiedPublicLink = await wiowCopyShareText(publicShareUrl); var publicLabel = btn.querySelector('.wiow-share-btn__label'); var publicOriginalLabel = publicLabel ? publicLabel.textContent : ''; if (copiedPublicLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (publicLabel) { publicLabel.textContent = 'Copied!'; window.setTimeout(function(){ publicLabel.textContent = publicOriginalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } openPopup('https://twitter.com/intent/tweet?text=' + encodeURIComponent(publicBaseText) + '&url=' + encodeURIComponent(publicShareUrl)); if (statusEl) statusEl.textContent = ''; return; } var built; var builtSquare = null; if (platform === 'copy') { // Build the landscape first so it chooses exactly one featured/gallery cycle image, // then pass that same image to the square builder. This prevents two square // outputs or mismatched gallery states in the Share Options window. built = await buildShareImage(row, { force:true }); builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url) { throw new Error('Landscape share build failed.'); } if (!builtSquare || !builtSquare.image_url) { throw new Error('Square share build failed.'); } } else { built = await buildShareImage(row); } var shareUrl = built.share_url; var postUrl = (row.getAttribute('data-post-url') || '').trim() || shareUrl; var postTitle = (row.getAttribute('data-post-title') || '').trim(); if (!postTitle) postTitle = 'this'; var shareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var upperTitle = postTitle.toUpperCase(); var lineTwo = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'See what the audience is saying.' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var baseText = 'Is ' + upperTitle + ' Worth it or Woke?\n\n' + lineTwo + '\n\nFollow @worthitorwoke for more.'; var textWithUrl = baseText + '\n\n' + shareUrl; var postTextWithUrl = baseText + '\n\n' + postUrl; var encodedUrl = encodeURIComponent(shareUrl); var encodedBaseText = encodeURIComponent(baseText); var encodedTextWithUrl = encodeURIComponent(textWithUrl); if (platform === 'link') { var copiedLink = await wiowCopyShareText(shareUrl); var label = btn.querySelector('.wiow-share-btn__label'); var originalLabel = label ? label.textContent : ''; if (copiedLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (label) { label.textContent = 'Copied!'; window.setTimeout(function(){ label.textContent = originalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } if (platform === 'x'){ // X gets the URL through the intent URL parameter, so do not also duplicate it in the tweet text. openPopup('https://twitter.com/intent/tweet?text=' + encodedBaseText + '&url=' + encodedUrl); } else if (platform === 'facebook'){ // Facebook sharing has been intentionally removed from this plugin flow. if (statusEl) statusEl.textContent = 'Facebook sharing is currently disabled.'; } else if (platform === 'copy'){ var heading = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'Audience share options' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: previewWin }; var shown = renderShareOptionsWindow(previewWin, built.image_url, (builtSquare ? builtSquare.image_url : ''), shareUrl, heading); if (!shown) { var copied = false; if (navigator.clipboard && window.isSecureContext && navigator.clipboard.writeText){ try { await navigator.clipboard.writeText(shareUrl); copied = true; } catch (copyErr) {} } if (!copied) { var ta = document.createElement('textarea'); ta.value = shareUrl; ta.setAttribute('readonly', 'readonly'); ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); copied = !!document.execCommand('copy'); ta.remove(); } } } if (statusEl) statusEl.textContent = (platform === 'copy') ? 'Ready.' : ''; } catch(err){ if (previewWin && !previewWin.closed) { previewWin.close(); } if (statusEl) statusEl.textContent = (err && err.message) ? err.message : 'Could not share.'; } }, true); })();