Fly Me To The Moon

Fly Me to the Moon wants to be the rom-com Wag The Dog meets Catch Me If You Can, but for all its rockets, it never reaches lift off
73/100128356
Starring
Scarlett Johansson, Channing Tatum, Woody Harrelson
Direction
Greg Berlanti
Rating
PG-13
Genre
Comedy, Romance
Release date
July 12, 2024
Overall Score
Rating Overview
Story/Plot/Script
Visuals/Cinematography
Performance
Direction
Non-Wokeness
Rating Summary
For a Romantic Comedy/Drama, it has little romance, only a dusting of comedy, and virtually no drama. Set against the backdrop of one of the greatest achievements in all of human history, Fly Me to the Moon only contains about 45 minutes of organic conflict and is otherwise stuffed with side quests to fill the time.

The race to the moon was a seminal chapter in human history, epitomizing the fierce Cold War rivalry between the United States and the Soviet Union. This epic struggle for technological and ideological supremacy ignited with the Soviet Union’s launch of Sputnik 1 in 1957, sending shockwaves through the world and propelling the United States into a fervent quest for space dominance. In a display of unparalleled ambition and ingenuity, the United States embarked on the Apollo program, culminating in the awe-inspiring Apollo 11 mission. On July 20, 1969, the world watched in rapturous wonder as Neil Armstrong and Buzz Aldrin took humanity’s first steps on the lunar surface, a triumph that forever enshrined American prowess and ingenuity. This celestial conquest not only advanced our scientific frontiers but also etched a legacy of exploration, determination, and human achievement into the annals of history.

Fly Me to the Moon

Fly Me to the Moon reimagines the Apollo 11 mission. Set during the first half of 1969, the movie follows an unlikely duo—a marketing maven and a NASA launch director—as they each race to the moon, one on a soundstage and the other from mission control.

 

X Marks the Spot - Follow us Today!!

Fly Me to the Moon Review

It took me a while to pinpoint exactly what’s wrong with Fly Me to the Moon. On it’s surface, it should be great. It’s a well-shot, well-paced piece that benefits from the incredible late 60s aesthetic. The problem(s) isn’t a lack of talent. The film has some heavy hitters in front of the camera. Scarlett Johansson is a pro with a career that spans three decades and boasts Academy Award-winning films, thoughtful indies, and, of course, billion-dollar franchises. Woody Harrelson always gives audiences something interesting. Channing Tatum, while best known for the Magic Mike movies and playing silly characters in comedies, is an underrated performer who nails what there is of his role in this film.

There are actually a couple of problems with the film. The first is one that seems to be a recurring theme in Hollywood these days: a lack of focus. It wants to be a delightful rom-com set in the between moments of one of the greatest achievements in the history of mankind, but it also wants to be a sincere tale of redemption for Channing Tatum’s character who feels responsible for the tragedy of the Apollo 1 mission. Simultaneously, it attempts to be a historical catalog of the bureaucratic hoops NASA had to jump through at the same time that they were putting together the world’s most difficult and important jigsaw puzzle. But wait, there’s more. Fly Me to the Moon desires to put a comedic spin on the long-running and ever-increasingly-popular conspiracy theory that the Moon Landing was faked. Finally, the film mostly wants to be a showcase for Scarlett Johansson. The lion’s share of its “action” consists of her briefly turning up the charm and fast-talking her way into and around various issues, which are then quickly wrapped up with seemingly little effort just in time for the next one. There are actually a few other subplots, but you get the idea.

Despite this lack of focus, arguably, the film’s greatest flaw is that for most of its runtime, it seems as though it is yet another attempt by Hollywood to deconstruct and denigrate yet another moment of American greatness, this time for some very cheap laughs (oh look at the flamboyantly gay primadonna director cliché – hilarious – in fairness, Lance Rash, best known as Dean Pelton in Community, is a film highlight). So, half of the audience is alienated, the ones old enough to remember a time before smartphones and feel a very real and very personal connection to what America used to be. The other half, the ones who have had their unearned and arrogant cynicism strobed into their brains as children, don’t care and aren’t given a reason to.

This is a real shame because there are moments in which one can see the movie that should have been, with a frightened government smack dab in the middle of the Cold War racing its arch-nemesis to the stars. Having already faced setbacks like losing to the Soviets with Sputnik and Yuri Gargarin, not to mention tragedies like Apollo 1, the government decides to make a clandestine production of the moon landing and cheat their way to winning the Space Race. When key characters at NASA get wind of this it becomes a mad dash to see who can get to the moon first, actors on a set, or Neil and the Boys. It practically writes itself.

Fly Me to the Moon may be worth a rent for a date night, but if you’re dead set on going to the theater, go see Thelma. You’ll be glad you did.

 

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. Sweet Deals July 15, 2024 at

    I didn’t see this movie yet. However, I recently read the novel “Lessons in Chemistry”, which was recommended to me because I love science. I may love science, but I hated the novel. It had the same “Mary Sue” phenomenon you mentioned.

    Like this movie about the Apollo program, “Lessons in Chemistry” is also set in the 1960s, and is about a female chemist who leaves academia to host a cooking show where she uses fancy chemistry terms to impress the audience. Not only does the novel contain many anachronistically woke and anti-religious elements (too progressive for 1960, but coincidentally fashionable in 2022), there was also a pervasive sense of bitter smugness emanating from the protagonist. Everything she said and did, every lifestyle choice she made, from her academic credentials, her fancy kitchen and fancy foods, her hobbies, her progressive beliefs, and even her rough childhood, thwarted rape and single motherhood all serve to make her look better and more superior than everyone else around her. She is always right; even when she’s wrong, she’s right. Everyone is supposed to cheer her on, and all the characters who dislike or disagree with her are automatically uncool. It all culminates in what I find to be the ultimate hypocritical “woke” belief: she’s an atheist and secular humanist because that’s what’s an “enlightened” scientist is supposed to be, except her view of humanity is so dismal because of her hardships and her smug superiority that she doesn’t really believe in humanity at all.

    I love the Apollo program, too. I think I’d rather go back to my old history books on the subject, along with films such as “The Right Stuff”, “Apollo 13”, and the documentary “For All Mankind”. It hearkens back to a time when space travel was a story about the ingenuity of the human spirit that we all shared; more than just a playground exclusively for the ultra-smart and ultra-wealthy.

  2. A S July 19, 2024 at

    My husband and I loved the movie and, frankly, I don’t really think what you discerned as “woke” is really woke (but I respect your opinion). I think it’s just a character trait that she was smart and witty, and I don’t see anything woke with it.

    1
    6
    1. James Carrick July 19, 2024 at

      We can’t always agree. Such is life. I’m glad that you liked it. Please be sure to register your Audience Woke Score at the top of the page.

      1. Enlightened Liberal July 19, 2024 at

        Is your profile picture an edited version of Topher Grace?

        1. James Carrick July 19, 2024 at

          Merged one of me and him. It was always meant as a placeholder but I keep forgetting to change it.

  3. Petranic1 July 19, 2024 at

    My wife and I saw it tonight. It was enjoyable but there was a few additional woke moments – such as the lefty assistant hating on Nixon (twice) and I think the gay Director counts too (although he had some good humour moments). In terms of the film itself, Tatum just didn’t cut it as a launch Director (for a real effort – see Ed Harris in Apollo 13). Continuity errors including the prices for food in 1969 (see outrageous prices on wharf cafe board). The story worked in many ways but didn’t in others. I’d rate it 65/100.

    1. Hillary July 20, 2024 at

      Absolutely agree with the additional woke elements. My husband and I weren’t impressed with this movie. It could have been a good movie.

    2. E August 15, 2024 at

      Thanks for adding the note about the “gay” guy – glaring oversight by this website/reviewer. If you see this LMK how much this got screen time … may make or break for me.

      1. James Carrick August 15, 2024 at

        The character is used as comic relief. He’s a stereotypical gay artiste and he’s in it for maybe 5-7% of the runtime.

  4. PhilK July 26, 2024 at

    Why are you so sure the moon landing wasn’t faked?

    1
    1
  5. Ktuff_morning September 30, 2024 at

    Couldn’t get through it. Channing Tatum is a cowbell in the symphony. He’s got the looks, I guess, but he has no flavor. He’s not having fun. I don’t think he’s got the requisite brains or vulnerability. In fact, I sense fear in this one. Fear leads to anger. Anger leads to hate. Hate leads to Trump. A terrible combination for a screwball comedy.

    Imagine George Clooney in his role. He’s got the twinkle in his eye. He’s got the empathy of the audience. He has believable wit. Check out Intolerable Cruelty for screwball comedy done right.

    One minor quibble I don’t know if it qualifies as woke or not. Have you noticed in movies where they have a beautiful starring female lead the supporting female roles are played by women who are pointedly not as cute? Their faces are “hard in the face” let’s say? That always amuses me to imagine myself as the casting director carefully choosing just the right amount of ugly from hundreds of applicants. Mr & Mrs. Smith with Angelina Jolie is a memorable example. Do these pitiable supporting actresses realize it I wonder? I like keeping the word ugly alive in describing women by the way. Very unwoke.

    So I mainly hopped on to compliment you:

    “So, half of the audience is alienated, the ones old enough to remember a time before smartphones and feel a very real and very personal connection to what America used to be. The other half, the ones who have had their unearned and arrogant cynicism strobed into their brains as children, don’t care and aren’t given a reason to.”

    I love that writing. You’re wrong, of course, but great writing. When I stumble upon moments of pith they’re a surprising and interesting contrast to your usual foul-mouthed vituperation.

  6. Kevin December 28, 2024 at

    Definitely woke. In the first fifteen minutes we’re introduced to the bumbling white man, the insufferable girl boss, and the flamboyant queer. That’s where we stopped watching, but seriously, that’s sufficient time for an Apple TV+ film to let you know where its heart is. Woke isn’t just about what’s there, it’s more about *why* it’s there, and in this case, why is pretty obvious.

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); })();