Toy Story 5

While there are far worse sequels out there, Toy Story 5 proves that the IP's heart has been mined out. It's time to move on.
52909
Starring
Tom Hanks, Tim Allen, Joan Cusack
Directors
McKenna Harris, Andrew Stanton
Rating
PG
Genre
Adventure, Comedy, Drama
Release date
June 19, 2026
Rating Summary
Toy Story 5 suffers from a lack of focus, with an unclear central plot and secondary storylines that function more as McGuffins and padding than meaningful threads in a larger narrative. Rather than forming an intricate story whose parts support and strengthen the whole, its pieces feel disconnected and utilitarian.

While children likely won't care, those who grew up with the franchise might also take exception with the treatment of Buzz and Woody, who are only in Toy Story 5 long enough for a quality bait and switch from trailer to final product.

Woody, Buzz Lightyear, Jessie, and the rest of the gang return to Bonnie’s room, where their role as beloved toys faces an unexpected new threat: the rise of high-tech gadgets and a clever tablet named Lilypad. As playtime itself is redefined by electronics, the toys must adapt, unite, and prove that imagination and heart still matter most. Toy Story 5 brings the beloved friends back for a battle between classic toys and the digital age.

X Marks the Spot - Follow us Today!!

Toy Story 5 REVIEW

Same story, different day

Slick visuals and sharp pacing can't hide the fact that this franchise has already told this story three different times (4 sucks, but at least the narrative is slightly different), and done it much better.

My (now) wife and I watched the original Toy Story on our first date. Over thirty years and more than half a dozen children later, I took my ten-year-old daughter on a father-daughter date to see this fifth installment. While it was wonderful spending time with her, I left the theater unimpressed by the well-trodden story, and now, a day later, she hasn't mentioned the movie once, not even to her siblings. No technical breakdown of structural weaknesses a narrative might possess is quite so damning as that.

You've Got a Friend in Formula

The plot is a simple one; children the world over are numbing their brains with dopamine IVs delivered via touchscreen. In an effort to help her make friends, Bonnie's folks buy her a Lilypad, a high-tech children's tablet shaped like a frog, hoping she will use it to make a connection.

Toy Story 5 Lilypad green frog tablet case big eyes smiling 'Hi! Let's play!' screen cute new toy gadget Disney Pixar 2026 movie – conservative alternative to Rotten Tomatoes anti-woke WOKE-O-METER rating & Christian family-friendly verdict exposing woke Hollywood agenda on WorthItOrWoke.com
Lilypad tablet from Toy Story 5

Hi-tech and low end up colliding, however, as Lily begins consuming Bonnie's days and nights, and the little girl quickly forgets about her analog playthings. Seeing that Bonnie is spiraling into deeper depression and isolation as she loses herself in Lilly's digital domain, Jessie, the toy's leader since the fourth film, moves into action.

A Story in Standby

Undeniably, Toy Story 5 raises interesting questions about the effects of excessive screen time among tykes, and were this the primary story rather than a simple plot device for a rather mundane and mostly stationary subplot, Toy Story 5 should be praised for its topical relevance and for taking a fresh look at an increasingly stale IP. But it's 21st Century Disney, so obviously they do not.

Instead of delving into serious questions about how to address cyberbullying or young children's growing disconnect from reality, most of the film's 1h42m is spent rehashing Jessie's trauma of being abandoned by her first owner, a story that was already thoroughly dealt with 28 years ago in Toy Story 2, as she helps a new group of electronic toys to once again get played with and she learns to overcome her bias against them.

To the Background and Nowhere Else

Simultaneously, in what is unarguably one of the biggest cinematic bait-and-switches since Luke tossed his lightsaber over his shoulder, Toy Story 5 reduces Buzz and Woody to background players. The duo spends what little time on screen they have fumbling around and bickering uselessly as they are left to deal with Lily, who ends up becoming a better "person" without anyone's help or intervention.

Meanwhile, an army of upgraded Buzz Lightyear toys, stranded on a tropical island, comes online and manages to make their way to exactly where the primary story is taking place, thousands of miles away, under the guise of looking for Star Command. Their true purpose? To be a safe, easy cutaway for action set pieces and comical hijinks, otherwise unrelated to the story, when things begin to drag, but ultimately they exist to be a McGuffin that solves the final act's major physical threat.

And if all of that isn't enough, Buzz has his own little clock-wasting subplot going on in the background as well. Apparently, he's in love with Jessie and wants to propose, but is too nervous to do so.

If that all sounds like a lot to fit into 102 minutes, you're not wrong, and while co-directors McKenna Harris and Andrew Stanton have an excellent sense of timing, it's not enough to overcome the inherently distracted, unfocused nature of the script.

Pulling the String Again

What rescues the movie from complete collapse, aside from adequate performances and incredibly beautiful animation, is the memory of better days. Those few beats that will land solidly will do so because lovers of the franchise will use them as spirit guides to their favorite heartfelt moments from previous entries.

Member Buzz, not knowing he's a toy? Yeah, I member. Member when Buzz thought his arm laser was real? Yeah, I member. Member flying with style? Yeah, I member.

The earlier films used toys to explore growing up, obsolescence, identity, loyalty, and, eventually, letting go. This one uses those old emotions as a shortcut while telling a story that never commits to saying much of anything, and certainly nothing new. Its tech-is-bad backdrop never bytes its teeth (get it) into the story in any meaningful way. Rather, it settles for recycled character beats, side quests, and nostalgia cues delivered with enough polish to keep younger viewers occupied and longtime fans from asking too many questions.

Polished Plastic

In one area, Pixar continues to deliver. As mentioned above, the visuals are stunning with an amazing depth of field and texture that manages to seem both alive and fictional at the same time. However, thanks to its anemic and redundant script, few of the visuals land with any power, and none come close to the earliest entries.

And yet, despite all of that, Toy Story 5 isn't some catastrophic franchise killer. It's watchable. It's occasionally moderately funny. It moves quickly, looks gorgeous, and younger kids will probably enjoy spending time with these characters even if the story doesn't leave much behind once the credits roll.

But that's also the problem.

Toy Story used to feel like an event. The originals stuck around after the theater lights came up. Kids replayed them. Parents quoted them. Scenes embedded themselves into culture.

This one mostly just happens.

I enjoyed my day with my daughter. I certainly don't regret buying the tickets. But if, thirty years from now, she takes her own child to Toy Story 9, I doubt either of them will spend much time talking about Toy Story 5 on the drive home.

Parental Notes

PARENTAL NOTES

Important Information for Parents

Our Parental Notes flag the material parents may want to know about before pressing play, including profanity, blasphemy, adult content, extreme violence, frightening intensity, hyper-stimulating sequences, and other family-content concerns.

UNLOCK PARENTAL NOTES.Profanity, blasphemy, adult content, extreme violence, hyper-stimulating intensity, and more.
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. JoshuapBoston1999 June 19, 2026 at

    There is no doubt that this movie is not essential to watch as a Toy Story fan, and that nothing will top the original trilogy. But I feel that it is a solid addition to the story. If you think of it as a bonus chapter, that can help put things into perspective.
    The best way to watch the franchise is to enjoy the first three films, and then have the option to watch the three Toy Story Toons shorts (Hawaiian Vacation, Small Fry, and Partysaurus Rex), Toy Story of Terror!, and Toy Story That Time Forgot, and then have a friend tell you what happens in the fourth film so you don’t have to watch it, and can possibly pick it back up with the 5th one. At least, that’s what I figure.

  2. Bushblocker June 23, 2026 at

    A fat, ugly, lesbian with a nose-bullring directed a crappy movie. Just imagine how many times she had to be reined in to not make it even worse. Really you should have a warning on every movie if it’s directed by a woman now.

    4
    2

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.

  1. The Critic June 26, 2026 at Audience Review Edited
    Not Worth ItWoke-ishC

    After seeing the movie myself, I can say that I agree with James Carrick’s review. Please read his full review and support this site.

    Toy Story 5 is mixed bag: Not terrible, but not great. Somewhat woke, but not so woke that it is totally unwatchable.

    Do I recommend that you take your child to see it?

    No, don’t go.

    Only go if you are desperate to find a movie to take your child to. There are many better movie alternatives out there that you can watch at home. Don’t reward Disney for sexist slop like this if you can avoid it.

    I watched the the movie through a free screening. I don’t plan to show the movie to my child again. It is a forgettable movie and not a “must watch”.

    The good:
    + Mostly nice visuals.
    + Some humorous moments.
    + Will keep kids entertained enough for the duration of the movie.
    + The initial premise is a great and relevant idea for the the series: how do the toys deal with kids becoming obsessed with tablets? Are the tablets doing more harm than good to children? How should parents deal with it? Unfortunately, as James notes, the film’s attention gets sidetracked from this premise due to unnecessary side stories about toy Jessie’s past and Buzz and Woody cameos. As a result, the film doesn’t give very satisfying answers to these questions, implying at the end that some sort of balance with technology can achieved (without clearly explaining how).

    The bad:
    – Yet again it is another girl boss movie where female characters (especially Jessie and Bo Peep) are near perfect and males are mostly buffoons that are emasculated and humiliated. I am sick and tired of movies like this.
    – Buzz and Woody are nearly reduced to cameo roles. This movie would be better titled “Jessie’s Story”.
    – Some of the movie’s messages are questionable: If your friends tease you… they aren’t real friends and you should make new friends? If you are shy and have trouble making friends… new friends will appear at your door thanks to your toys?

    7 out of 10. C

  2. JoshuapBoston1999 June 19, 2026 at Audience Review Edited
    Worth ItMostly NOT WokeB+

    I was skeptical when I went into the theater on Thursday, June 18th, for an early preview screening of Toy Story 5, and when I left, I was essentially blown away with what I saw. Jessie’s story arc is a great one, and it was one that truly makes her shine for infinity and beyond, showing that just because something is newer doesn’t always mean that it’s worse.
    Lilypad also had a very welcome story. Started off bad, by thinking that she was supposed to do what was best for Bonnie by having no toys trying to hold her back. But in the end, as the story progresses, we get to see her realize that it’s not those in the group chat on a screen that matter, but true connections with other people. It is such an interesting concept.
    The rest of the Toy Story gang, outside of Woody and Buzz, took a little bit of a backseat, but that’s okay. Sometimes, in a story, more is less.
    And speaking of Woody and Buzz, their relationship seems a little bit chaotic and argumentative. But I suppose that the power of becoming second in command to the sheriff and have its detriments. But it’s still nice to see that they are still the best of friends at heart, dating all the way back to the first Toy Story back in 1995! They’ve truly got a friend in each other.
    When it comes to Bonnie in particular, I kind of connect with her in a sense. I will be one of the first to admit that being on a screen and on social media all the time is not healthy. It can really change your perceptions and pervert what the actual world is to a person. Sometimes it’s best to put down the device and actually talk to somebody. Sometimes it takes another person who is unique in their own right and has similar interests to break you out of the shell. Blaze is an excellent character and new friend for Bonnie to be with.
    I enjoyed seeing that Emily, Jessie’s first owner, really loved her so much that when she grew up, she named her own daughter after her. It shows that Jessie was truly an irreplaceable part of her heart, even if it was only like a flash in the pan to a toy’s life.
    I find that much of the humor also came from the upgraded High-Tech Buzz figures. I first heard that it was going to be an army of evil Buzz Lightyears that ultimately betrayed the gang, but I’m glad to see that they didn’t. They really balanced both parts toy and technological innovation.
    And I was quite surprised that Bad Bunny in the film really wasn’t as bad as I had thought. Just a simple cameo, and that was it. Much of the Toy Story gang was like that. So much so that Blake Clark reprising the role of Slinky Dog into his 70s and 80s never really felt out of place. The same thing could be said regarding Mr. Potato Head, who had very few lines as a result of Don Rickles’ passing before Toy Story 4. And even though I left the theater with the credits song by Taylor Swift playing in the background, I don’t think it was too bad.
    Andrew Stanton really knocked it out of the park with Toy Story 5. While it isn’t quite up to the same standards as the original trilogy, I would say that it is a very solid and innoffensive film with a very relatable premise.
    I believe that Pixar is in a good spot. Having tempered expectations heading in can really blow the door handles off. And I am glad I enjoyed it. I hope to share it and that others can enjoy it as well, as it speaks to today’s world quite a bit.

    8 out of 10. B+

  3. RAW June 19, 2026 at Audience Review Edited
    Not Worth ItWokeC-

    This movie is super woke! Jesse the cowgirl toy takes center stage and they make sure you know it. Also, they emasculate the male toys (Woody and Buzz Lightyear) is the movie by making them dependent on Jesse in almost every way.

    I don’t wanna spoil it, but there’s a male toy that gets walked to the altar with a toy that calls him, “my son“ to get married and the girl toy is the one waiting at the altar for him. Like, the bride was acting like the groom and the groom was acting like the bride.

    Anyway, the movie oozes female dominance over males. Toy story five is just another woke boss girl movie

    4
    3

 

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