She-Hulk Attorney At Law

She-Hulk: Attorney at Law is a painfully unfunny, plotless, and self-satisfied mess built on weak writing, obnoxious characters, and endless modern identity politics.
613134
Starring
Tatiana Maslany, Mark Ruffalo, Tim Roth, Benedict Wong, Ginger Gonzaga
Duration
9 episodes (30 min each)
Rating
TV-14
Genre
Comedy, Superhero
Release date
August 18, 2022
Where to watch
Disney+
Overall Score
Rating Overview
Story/Plot/Script
Performance
Visuals/Cinematography
Direction
Non-Wokeness
Rating Summary
With no story to speak of, an out-of-touch and shallow point of view, and mediocre CGI, She-Hulk is a waste of resources. There are no standout performances, good or bad, but with such bland and useless dialogue that's not really a surprise. If you're looking for an engaging and exciting Marvel series with interesting characters, turn on Netflix and watch the first two seasons of Daredevil and The Punisher, and the first seasons of Jessica Jones and Luke Cage.

I don’t like to throw around the word “hero,” but since I’m reviewing a comic book adaptation, it seems appropriate. The next time that you see me on a plane, you need to offer me your first-class seat because I am an absolute hero for sitting through this garbage so that you don’t have to. Not only can I save you the time of watching this wreck, but I can save you the time of reading the rest of this review. Don’t watch She-Hulk Attorney at Law. It possesses no redeeming qualities sufficient to outweigh its inherent problems.

Ok, if you’re still reading, I assume you like punishment or are looking for just enough info to piss off your blue-haired Pelosi-loving sister-in-law at the Thanksgiving table. Either way, buckle up.

She-Hulk Review

She-Hulk: Attorney at Law is a contrived, uninspired mess from its very first fade-in—an awkward exposition dump—straight through to its intentionally self-aware snooze of a conclusion. Yes, the show proudly tells the audience that it doesn’t want an exciting ending. So instead of the usual meaningless MCU third-act CGI battle, we get something even less meaning: actual nothingness.

And that’s not hyperbole. By the time Jen returns from her trip outside the show’s reality and into the “real world” (which sounds fun—it’s not), the action is over, the police have arrested the bad guys, and we’re off to a family meal.

At this point, I’d normally give a plot summary, but She-Hulk has no plot to summarize. Jen gets turned into a Hulk, handles a few goofy lawsuits, sleeps with some strangers, and comes to terms with her transformation. That took nine thirty-minute episodes, and yet it’s still not a plot—it’s just a list of things that happened.

X Marks the Spot - Follow us Today!!

Hulk and She-Hulk Jennifer Walters in intense beach training scene from Netflix's She-Hulk Attorney at Law, anti-woke TV review on Worth it or Woke – family-friendly superhero analysis avoiding sexual and transgender content.
Hulk teaches She-Hulk to smash… responsibly?

I’m not under the delusion that every series needs to be plot-driven. Some of the best TV is character-driven—Seinfeld is literally a show about nothing, and it works because the characters are fun. So with that in mind, let’s talk about these characters.

Jen Walters starts the series as a thirty-something deputy district attorney in Los Angeles. We quickly learn she’s a whiny complainer and professional victim who’s so narcissistic that she compares getting cat-called to the decade-long nightmare her cousin Bruce has endured since becoming the Hulk. As he selflessly attempts to help her transition to being superpowered, she belittles him at every opportunity because she’s a “strong modern woman” (read: snarky b!t@h). And maybe she should belittle him, because for no stated reason, she’s immediately better at everything Hulk-related within 24 hours of transforming.

She has perfect control of her strength and form, can fistfight Bruce—who’s twice her size—and can switch between Jen and She-Hulk at will while retaining her personality. Again, there’s no explanation. It’s not as though she’s a martial artist, yogi, or fitness guru. She even mocks Bruce’s attempts to teach her mind-body discipline. The only “reason” offered is her unearned and arrogant insistence that she’s simply better than him. She’s such a Mary Sue that in one scene, while in human form, she’s sucker-punched in the face by a super-powered villain hard enough to fly fifteen feet through the air, lands without a scratch, and stands up unassisted. I still remember Thor: Ragnarok—Bruce jumped out of a plane and died on impact before transforming.

Next up is Titania, the closest thing She-Hulk has to an antagonist. She’s a super-strong influencer with a fragile ego and a greedy streak—full stop. We meet her when she bursts into a courtroom in a rage over a traffic ticket and nearly murders a jury before Jen Hulks out and easily stops her. One might reasonably expect this rampaging criminal to spend the rest of the series in a super-powered prison (a thing that exists in the show) or at least stand trial. After all, this is supposed to be a legal comedy. But no—she’s immediately out and her next move is to trademark “She-Hulk,” slap it on cheap beauty products, and sue Jen. That way, instead of super-powered conflict or wrestling with the role of the superpowered in society, we get to watch tertiary characters argue over trademark law for a few minutes. Riveting!

Tim Roth as Emil Blonsky Abomination in thoughtful therapy session from Disney+'s She-Hulk Attorney at Law, anti-woke TV review on Worth it or Woke – family-friendly superhero analysis avoiding sexual, transgender, and ultra-violent content.
Tim Roth as Emil Blonsky

Some of you might remember Emil Blonsky—the relentless special-forces commander who became the Abomination in 2008’s The Incredible Hulk. Well, buckle up, because he’s back as a neutered cartoon of a man. You get to watch a bored-looking Tim Roth wandering around as a pothead hippie who dreams of running a commune for D-list super-powered lost souls.

Then there’s Daredevil—the character many were most excited for. And boy does he exist. He fights a bit until She-Hulk saves him, sleeps with Jen until he doesn’t, then returns for seconds after an awkward chat with her dad about Matt’s sexual relationship with her.

I cannot stress enough how little actually happens in this show, and of what low caliber that which does.

Most of the remaining cast fall into one of three categories:

  1. strong independent women who get everything right,
  2. cartoonish male buffoons—narcissists, chauvinists, or users,
  3. cartoonish right-wing male buffoons—also narcissists, chauvinists, and users.

Oh, and Wong shows up…because reasons. The show even jokes that he’s there solely because fans love him and he boosts popularity.

Ironically, for a show so unaware of itself, self-awareness is a running theme. Like in the comics, Jen breaks the fourth wall, but here it mostly masks weak writing—especially as the series limps toward its finale. Several times, she looks into the camera and admits the episode or arc isn’t heading in the right direction. That’s not clever; it’s a confession.

Here’s the truth: Acknowledging that your writing is weak doesn’t excuse the weakness. She-Hulk claims to be a “legal comedy,” yet spends almost no meaningful time on the law and delivers even less comedy.

Its lack of self-awareness doesn’t stop there. In the opening, Bruce reveals he’s finally created a Hulk inhibitor that lets him remain human after a decade of torment. It’s broken moments later to set up Jen’s transformation. Jen immediately demands that he make another for her, even though the scene that just played out demonstrates that the inhibitor barely works. Bruce explains he can’t—it took years, it’s calibrated to him, and the prototype is ruined. A few episodes later, the super-powered penal system is handing out transformation inhibitors like Halloween candy. No explanation. The show needs them gone, so they’re gone. Then it needs them back, so they’re back.

She-Hulk Jennifer Walters climbing Disney+ menu screen in Disney+'s She-Hulk Attorney at Law – anti-woke MCU review on Worth it or Woke: family-safe superhero streaming guide exposing sexual content and gender ideology in Marvel shows.
She-Hulk breaking the fourth wall… and Disney+’s menu. Even the streaming service can’t escape the woke smash.

In the series’s finale, Jen’s breaking of the fourth wall goes so far as to have her break through the Disney+ menu screen and break into the real world via a making-of documentary. There, she found out that all MCU programs and films are developed via a soulless AI that follows a tested and proven algorithm to produce consumer-friendly content. It’s a common enough complaint in the real-real world, but it falls flat just like everything else in this show. This breaking of the fourth wall is too much and isn’t earned within the context of the rest of She-Hulk. Rather, it’s clear the writers lacked the talent to end a series with no plot, so they skipped the ending and went straight to the mid-credit scene to set up the next MCU product.

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. stanedgie May 16, 2023 at

    definitely one of the worst shows EVER to have (dis)graced our TV’s. This was really the start of (full on) Woke Disney, though many will say it already started in EndGame with the “Girl Super hero’s” bit at the end, but for me, this was when the woke nonsense really hit top gear! I half hope there is not a second season as it does not deserve it, but also, that there is so that it can also be ripped apart like the 1st season was.

    6
    1
  2. ray June 1, 2023 at

    Wow. You mean to tell me that a movie called She Hulk Attorney at Law is Woke?

    From the title I’d have thought it’d be based from start to finish. Will wonders never cease.

    2
    8
    1. Ktuff_morning April 11, 2024 at

      I think the fact you were clearly sarcastic and you still got eight thumbs down from a mostly right wing readership makes me automatically assume right wingers are morons. I always suspected as much and here’s yet another data point. smh

      When viewed critically you can tell this show really did make an effort to tone down the PC. There were several strong white males for example Daredevil who got her hot and left her wanting more, never a nebbish all the way through. She totally shared the screen with him. She was even flustered by him. How’s that for relinquishing female godlike power and showing appreciation to men? To WHITE men FFS! Do you not give the creators of the show any credit at all? When she was attacked in the alleyway she hilariously panics and then says “Oh wait” and she turned into She-Hulk lol. She didn’t beat the guys with resentful viciousness like a PC-signaling show might have. The show is sweet, light-touched, and funny. Can’t you see they aimed at comedy more than virtue-signalling? This website should be honest. Give it another look and give credit where’s it’s due.

      I hereby disallow any negative woken reviews on this page. Erecto Expecto Patronum

      1
      7
  3. ChoketheWoke July 1, 2023 at

    The female writer behind this green vomit was hired because of her sex. Women didn’t create the comic industry, or even contribute to it meaningfully, when all of these characters and stories were originated. It’s Woke as hell when ‘inclusion’ means the exclusion of the groups responsible for doing all the original work.

    8
    2
  4. Ktuff_morning April 9, 2024 at

    I thought the series was fantastic. It was light, funny and interesting. It had a cool comic book feel to it. The ending of the series was unusual I appreciate that. The actress was great. I had no problem with the CGI forehead not a big deal.

    The woke elements didn’t feel particularly poisonous to me; in fact it felt like they kind of toned down the political correctness overall. Woke is political correctness run amok, but I don’t think this series ever went amok. The bad boyfriends she went through for example were hilarious stereotypes and quite un-PC played mostly as comedy. The counseling part was pretty PC but again it was played for comedy more than messaging.

    Is it possible to make any version of She-Hulk that you WOULDN’T find woke?

    Verdict: merely PC, not quite woke.

    1
    4
  5. Trans Rights April 30, 2024 at

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.

 

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