fix: add load timeout + error/retry fallback to Wistia embeds#18396
Draft
posthog[bot] wants to merge 2 commits into
Draft
fix: add load timeout + error/retry fallback to Wistia embeds#18396posthog[bot] wants to merge 2 commits into
posthog[bot] wants to merge 2 commits into
Conversation
MediaPlayer, WistiaVideo, and WistiaCustomPlayer each loaded Wistia's E-v1.js and waited for the player to report ready with no timeout, no error state, and no retry. When the script is blocked (common with ad blockers) or onReady/api() never fires, the embed sat on an eternal loading spinner with no way to recover. Introduce a shared useWistiaPlayer hook that owns deduplicated script loading (with an error handler), a single timeout covering the whole load-to-ready window, retry, and a posthog.capture on failure so the previously-invisible stuck state is measurable. Add a shared WistiaError fallback UI (retry + direct video link) rendered when the load fails, and wire all three components to it. Generated-By: PostHog Code Task-Id: c251c239-219d-40b7-b219-2df13ff75a31
Contributor
Deploy preview
|
Contributor
|
Vale prose linter → found 0 errors, 4 warnings, 0 suggestions in your markdown Full report → Copy the linter results into an LLM to batch-fix issues. Linter being weird? Update the rules!
|
| Line | Severity | Message | Rule |
|---|---|---|---|
| 3:33 | warning | 'Wistia' is a possible misspelling. | PostHogBase.Spelling |
| 4:54 | warning | 'Wistia's' is a possible misspelling. | PostHogBase.Spelling |
| 9:66 | warning | 'Wistia' is a possible misspelling. | PostHogBase.Spelling |
| 47:32 | warning | 'Wistia' is a possible misspelling. | PostHogBase.Spelling |
Contributor
Bundle reportTotal JS (gzip)6.30 MiB (+1.5 KiB / +0.0%) Largest changed named chunks
Eager graph (modules shipped in each entrypoint's initial chunks)
Largest modules in the
|
| Module | Size |
|---|---|
css ./node_modules/.pnpm/css-loader@5.2.7_webpack@5.101.3/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[1]!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.5.6_webpack@5.101.3/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[2]!./src/styles/global.css |
709.6 KiB |
./src/components/Stickers/Stickers.tsx |
696.4 KiB |
./.cache/caches/gatsby-plugin-mdx/mdx-scopes-dir/31a094f140f119e73085d847ae81b99b.js + 2 modules |
614.1 KiB |
./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.3.1/node_modules/@radix-ui/react-icons/dist/react-icons.esm.js |
481.4 KiB |
./node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js + 29 modules |
395.1 KiB |
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.cjs.js |
364.8 KiB |
./src/hooks/useCustomers.tsx + 54 modules |
355.1 KiB |
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
354.8 KiB |
./node_modules/.pnpm/react-markdown@8.0.7_@types+react@16.14.66_react@18.3.1/node_modules/react-markdown/lib/react-markdown.js + 88 modules |
351.4 KiB |
./node_modules/.pnpm/cloudinary-core@2.14.0_lodash@4.17.21/node_modules/cloudinary-core/cloudinary-core.js |
281.9 KiB |
./src/components/ProductComparisonTable/index.tsx + 118 modules |
275.6 KiB |
./node_modules/.pnpm/d3@7.9.0/node_modules/d3/src/index.js + 208 modules |
247.4 KiB |
./src/components/Pricing/PricingSlider/Slider.tsx + 87 modules |
239.9 KiB |
./gatsby-browser.tsx + 41 modules |
239.8 KiB |
./src/components/SearchUI/index.tsx + 73 modules |
223.4 KiB |
Eager-graph budgets are report-only until a baseline is established. Sizes are gzip of public/**/*.js; eager size is webpack module source bytes for the modules actually shipped in the entrypoint's initial chunks (post-tree-shake).
Generated-By: PostHog Code Task-Id: c251c239-219d-40b7-b219-2df13ff75a31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes
Users watching PostHog's demo and AI product videos could get stuck on a loading spinner forever, with no error and no way to recover. The
/demowindow (a WistiaMediaPlayer, opened by a large number of unique users daily) and the/aiproduct demos (WistiaVideo) share the same defect.All three Wistia embed components (
MediaPlayer,WistiaVideo,WistiaCustomPlayer) initialized the player the same fragile way: loadE-v1.jsand wait for a one-shotonReadycallback (or an unbounded 100ms poll) with no timeout, no error state, and no retry. When Wistia's script is blocked (common with ad blockers, which PostHog's developer-heavy audience runs at high rates) oronReady/api()never fires, the container just spins forever.This PR:
useWistiaPlayerhook that owns deduplicated script loading (now with ascripterror handler), a single timeout covering the whole load → ready window, aretry(), and aposthog.capture('wistia_video_load_failed', …)on failure — so this previously-invisible stuck state becomes measurable.WistiaErrorfallback UI (a "Try again" retry action plus a direct link to the video) rendered when the load fails, replacing the eternal spinner with a recoverable error state.The
/democase is a fresh regression from #18241 (commit dcd0fe2), which swapped/demoto the WistiaMediaPlayertwo days before the report.Verification
The change is a direct fix to the exact components and symptom in the report and typechecks cleanly under the project
tsconfig. I was not able to run a live browser reproduction in the sandbox (no dependencies installed, no browser, and Gatsby needs the full 16GB just to build), so this needs a visual check in the Vercel preview.To reproduce/verify manually: open the
/demowindow (and/aidemos), blockfast.wistia.comin devtools' network request-blocking (or enable an ad blocker), and confirm that after the timeout the spinner is replaced by the error/retry fallback instead of spinning forever — and that "Try again" re-attempts the load.Add screenshots or screen recordings for visual / UI-focused changes.
Checklist
vercel.jsonCreated with PostHog Code from an inbox report.