@epic-web/workshop-app 5.4.1 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_-BrkpfnBb.js → _-hAKYb2AG.js} +2 -2
- package/build/client/assets/{_-BrkpfnBb.js.map → _-hAKYb2AG.js.map} +1 -1
- package/build/client/assets/_exerciseNumber-PTdG9GGB.js +2 -0
- package/build/client/assets/_exerciseNumber-PTdG9GGB.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_._stepNumber-BIMJh_sg.js → _exerciseNumber_._stepNumber-03erOIGo.js} +2 -2
- package/build/client/assets/{_exerciseNumber_._stepNumber-BIMJh_sg.js.map → _exerciseNumber_._stepNumber-03erOIGo.js.map} +1 -1
- package/build/client/assets/_exerciseNumber_.finished-DQg4F1NL.js +2 -0
- package/build/client/assets/_exerciseNumber_.finished-DQg4F1NL.js.map +1 -0
- package/build/client/assets/{_layout-88n0To1b.js → _layout-B4JGpA3A.js} +2 -2
- package/build/client/assets/{_layout-88n0To1b.js.map → _layout-B4JGpA3A.js.map} +1 -1
- package/build/client/assets/{_layout-Dfmv2zcn.js → _layout-BJbMl6SJ.js} +2 -2
- package/build/client/assets/{_layout-Dfmv2zcn.js.map → _layout-BJbMl6SJ.js.map} +1 -1
- package/build/client/assets/_layout-Bu0lel3p.js +6 -0
- package/build/client/assets/_layout-Bu0lel3p.js.map +1 -0
- package/build/client/assets/_layout-DHoH74NH.js +2 -0
- package/build/client/assets/_layout-DHoH74NH.js.map +1 -0
- package/build/client/assets/{accordion-D9-D-n9p.js → accordion-DLg7gJkp.js} +2 -2
- package/build/client/assets/{accordion-D9-D-n9p.js.map → accordion-DLg7gJkp.js.map} +1 -1
- package/build/client/assets/account-DLDPrc9J.js +2 -0
- package/build/client/assets/account-DLDPrc9J.js.map +1 -0
- package/build/client/assets/app-DJDjmdlu.js +2 -0
- package/build/client/assets/{app-DgTXXO8s.js.map → app-DJDjmdlu.js.map} +1 -1
- package/build/client/assets/{button-_qPvcoqR.js → button-39zQyNX6.js} +2 -2
- package/build/client/assets/{button-_qPvcoqR.js.map → button-39zQyNX6.js.map} +1 -1
- package/build/client/assets/{components-Be92gVxW.js → components-DUNtf72c.js} +2 -2
- package/build/client/assets/{components-Be92gVxW.js.map → components-DUNtf72c.js.map} +1 -1
- package/build/client/assets/diff-B3oaU_KB.js +2 -0
- package/build/client/assets/{diff-BhRAIPKc.js.map → diff-B3oaU_KB.js.map} +1 -1
- package/build/client/assets/{diff-8nlDkmpc.js → diff-BNCREJvf.js} +2 -2
- package/build/client/assets/{diff-8nlDkmpc.js.map → diff-BNCREJvf.js.map} +1 -1
- package/build/client/assets/{discord-BUWZUTEC.js → discord-CEOqKs_c.js} +2 -2
- package/build/client/assets/{discord-BUWZUTEC.js.map → discord-CEOqKs_c.js.map} +1 -1
- package/build/client/assets/discord-CpIgvYus.js +2 -0
- package/build/client/assets/discord-CpIgvYus.js.map +1 -0
- package/build/client/assets/{entry.client-DqIWuxf8.js → entry.client-CrlHhRMR.js} +2 -2
- package/build/client/assets/{entry.client-DqIWuxf8.js.map → entry.client-CrlHhRMR.js.map} +1 -1
- package/build/client/assets/epic-video-D8ex9vao.js +2 -0
- package/build/client/assets/epic-video-D8ex9vao.js.map +1 -0
- package/build/client/assets/error-boundary-3zItlMUO.js +2 -0
- package/build/client/assets/{error-boundary-BZA-ffa8.js.map → error-boundary-3zItlMUO.js.map} +1 -1
- package/build/client/assets/finished-rUzUjnEm.js +2 -0
- package/build/client/assets/finished-rUzUjnEm.js.map +1 -0
- package/build/client/assets/index-BajUQsFT.js +3053 -0
- package/build/client/assets/index-BajUQsFT.js.map +1 -0
- package/build/client/assets/{index-BCxBKsqT.js → index-CLNXC84j.js} +2 -2
- package/build/client/assets/{index-BCxBKsqT.js.map → index-CLNXC84j.js.map} +1 -1
- package/build/client/assets/{index-BCTr8uu6.js → index-CV3nxGFp.js} +2 -2
- package/build/client/assets/{index-BCTr8uu6.js.map → index-CV3nxGFp.js.map} +1 -1
- package/build/client/assets/{index-BFGhCX_U.js → index-C_B1-9rF.js} +2 -2
- package/build/client/assets/{index-BFGhCX_U.js.map → index-C_B1-9rF.js.map} +1 -1
- package/build/client/assets/{index-pkiQppkK.js → index-DDqzbGM2.js} +2 -2
- package/build/client/assets/{index-pkiQppkK.js.map → index-DDqzbGM2.js.map} +1 -1
- package/build/client/assets/index-DE-jwnOP.js +2 -0
- package/build/client/assets/index-DE-jwnOP.js.map +1 -0
- package/build/client/assets/{index-DZDhtMuq.js → index-DFqQCjCw.js} +2 -2
- package/build/client/assets/{index-DZDhtMuq.js.map → index-DFqQCjCw.js.map} +1 -1
- package/build/client/assets/{index-Bdg3v8tC.js → index-DH1w3QmP.js} +2 -2
- package/build/client/assets/{index-Bdg3v8tC.js.map → index-DH1w3QmP.js.map} +1 -1
- package/build/client/assets/{index-C9Hx0Dey.js → index-LjRZeU7x.js} +2 -2
- package/build/client/assets/{index-C9Hx0Dey.js.map → index-LjRZeU7x.js.map} +1 -1
- package/build/client/assets/index-mivnjq36.js +2 -0
- package/build/client/assets/index-mivnjq36.js.map +1 -0
- package/build/client/assets/{loading-XhMtj4mp.js → loading-DW_I206H.js} +2 -2
- package/build/client/assets/{loading-XhMtj4mp.js.map → loading-DW_I206H.js.map} +1 -1
- package/build/client/assets/{login-C1oOgi98.js → login-CdNej0Z7.js} +2 -2
- package/build/client/assets/{login-C1oOgi98.js.map → login-CdNej0Z7.js.map} +1 -1
- package/build/client/assets/manifest-62ea49c4.js +1 -0
- package/build/client/assets/{mdx-CEjzXoEx.js → mdx-C9dqA6IZ.js} +2 -2
- package/build/client/assets/{mdx-CEjzXoEx.js.map → mdx-C9dqA6IZ.js.map} +1 -1
- package/build/client/assets/{misc-DUy_whwE.js → misc-DIdEn_jt.js} +2 -2
- package/build/client/assets/{misc-DUy_whwE.js.map → misc-DIdEn_jt.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-DnR25VLp.js → nav-chevrons-B3SvZV8B.js} +2 -2
- package/build/client/assets/{nav-chevrons-DnR25VLp.js.map → nav-chevrons-B3SvZV8B.js.map} +1 -1
- package/build/client/assets/onboarding-CC9zz4rl.js +2 -0
- package/build/client/assets/onboarding-CC9zz4rl.js.map +1 -0
- package/build/client/assets/{pe-ChIwTk8v.js → pe-D5h19vSo.js} +2 -2
- package/build/client/assets/{pe-ChIwTk8v.js.map → pe-D5h19vSo.js.map} +1 -1
- package/build/client/assets/presence-D1DPz__2.js +28 -0
- package/build/client/assets/presence-D1DPz__2.js.map +1 -0
- package/build/client/assets/{preview-DaZd0wMb.js → preview-BEtmdi0E.js} +2 -2
- package/build/client/assets/{preview-DaZd0wMb.js.map → preview-BEtmdi0E.js.map} +1 -1
- package/build/client/assets/{product-DIAmCwmZ.js → product-CYOFfeJM.js} +2 -2
- package/build/client/assets/{product-DIAmCwmZ.js.map → product-CYOFfeJM.js.map} +1 -1
- package/build/client/assets/{progress-DQt_Bn9o.js → progress-D6SP0Gec.js} +2 -2
- package/build/client/assets/{progress-DQt_Bn9o.js.map → progress-D6SP0Gec.js.map} +1 -1
- package/build/client/assets/{progress-bar-BaTU3Yx_.js → progress-bar-CBDBzRQ2.js} +2 -2
- package/build/client/assets/{progress-bar-BaTU3Yx_.js.map → progress-bar-CBDBzRQ2.js.map} +1 -1
- package/build/client/assets/{request-info-ByUEfOil.js → request-info-vBkaf3Rk.js} +2 -2
- package/build/client/assets/{request-info-ByUEfOil.js.map → request-info-vBkaf3Rk.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-dUa9CAqr.js → revalidation-ws-DK5QOPlL.js} +2 -2
- package/build/client/assets/{revalidation-ws-dUa9CAqr.js.map → revalidation-ws-DK5QOPlL.js.map} +1 -1
- package/build/client/assets/{root-a3d3Qwip.js → root-Bg-hxaOK.js} +2 -2
- package/build/client/assets/{root-a3d3Qwip.js.map → root-Bg-hxaOK.js.map} +1 -1
- package/build/client/assets/{set-playground-CBHBA46B.js → set-playground-CMoUFgkO.js} +2 -2
- package/build/client/assets/{set-playground-CBHBA46B.js.map → set-playground-CMoUFgkO.js.map} +1 -1
- package/build/client/assets/{support-CIz02V_r.js → support-CPzYlWkd.js} +2 -2
- package/build/client/assets/{support-CIz02V_r.js.map → support-CPzYlWkd.js.map} +1 -1
- package/build/client/assets/test-C8wkLh9a.js +2 -0
- package/build/client/assets/{test-DoKJvNug.js.map → test-C8wkLh9a.js.map} +1 -1
- package/build/client/assets/{tests-DbuyD2cI.js → tests-CiM4RPOf.js} +2 -2
- package/build/client/assets/tests-CiM4RPOf.js.map +1 -0
- package/build/client/assets/{tooltip-DO9uwurQ.js → tooltip-BoVikCa-.js} +2 -2
- package/build/client/assets/{tooltip-DO9uwurQ.js.map → tooltip-BoVikCa-.js.map} +1 -1
- package/build/client/assets/{use-event-source-x59d4R2Z.js → use-event-source-M87p8Tme.js} +2 -2
- package/build/client/assets/{use-event-source-x59d4R2Z.js.map → use-event-source-M87p8Tme.js.map} +1 -1
- package/build/client/assets/{user-Bv6wYhQP.js → user-CbbIYEs8.js} +2 -2
- package/build/client/assets/{user-Bv6wYhQP.js.map → user-CbbIYEs8.js.map} +1 -1
- package/build/client/assets/{version-lxUUxt3s.js → version-CIF3cX3N.js} +2 -2
- package/build/client/assets/{version-lxUUxt3s.js.map → version-CIF3cX3N.js.map} +1 -1
- package/build/client/assets/{workshop-config-WVltG_BV.js → workshop-config-C5sYl312.js} +2 -2
- package/build/client/assets/{workshop-config-WVltG_BV.js.map → workshop-config-C5sYl312.js.map} +1 -1
- package/build/server/index.js +456 -782
- package/build/server/index.js.map +1 -1
- package/package.json +8 -8
- package/build/client/assets/_exerciseNumber-DCSM0NCG.js +0 -2
- package/build/client/assets/_exerciseNumber-DCSM0NCG.js.map +0 -1
- package/build/client/assets/_exerciseNumber_.finished-nbpk1ToO.js +0 -2
- package/build/client/assets/_exerciseNumber_.finished-nbpk1ToO.js.map +0 -1
- package/build/client/assets/_layout-Cbz7Qt-S.js +0 -6
- package/build/client/assets/_layout-Cbz7Qt-S.js.map +0 -1
- package/build/client/assets/_layout-DTAM9xh5.js +0 -2
- package/build/client/assets/_layout-DTAM9xh5.js.map +0 -1
- package/build/client/assets/account-C4Piztoz.js +0 -2
- package/build/client/assets/account-C4Piztoz.js.map +0 -1
- package/build/client/assets/app-DgTXXO8s.js +0 -2
- package/build/client/assets/diff-BhRAIPKc.js +0 -2
- package/build/client/assets/discord-Bdnx7fu-.js +0 -2
- package/build/client/assets/discord-Bdnx7fu-.js.map +0 -1
- package/build/client/assets/epic-video-Bp4BOD2R.js +0 -3053
- package/build/client/assets/epic-video-Bp4BOD2R.js.map +0 -1
- package/build/client/assets/error-boundary-BZA-ffa8.js +0 -2
- package/build/client/assets/finished-C0cpfAFL.js +0 -2
- package/build/client/assets/finished-C0cpfAFL.js.map +0 -1
- package/build/client/assets/index-Bi1TbRTj.js +0 -2
- package/build/client/assets/index-Bi1TbRTj.js.map +0 -1
- package/build/client/assets/index-Ca4vBON4.js +0 -2
- package/build/client/assets/index-Ca4vBON4.js.map +0 -1
- package/build/client/assets/manifest-e5b2a6e1.js +0 -1
- package/build/client/assets/onboarding-C2YNq60k.js +0 -2
- package/build/client/assets/onboarding-C2YNq60k.js.map +0 -1
- package/build/client/assets/presence-DJGFvdDh.js +0 -28
- package/build/client/assets/presence-DJGFvdDh.js.map +0 -1
- package/build/client/assets/test-DoKJvNug.js +0 -2
- package/build/client/assets/tests-DbuyD2cI.js.map +0 -1
- /package/build/client/assets/{epic-video-DUnRvy1A.css → index-DUnRvy1A.css} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as p,j as e}from"./index-C_B1-9rF.js";import{u as L}from"./index-DH1w3QmP.js";import{M as S}from"./index-BajUQsFT.js";import{a as I,I as C}from"./misc-DIdEn_jt.js";import{L as v}from"./loading-DW_I206H.js";import{b as R}from"./user-CbbIYEs8.js";import{u as T}from"./workshop-config-C5sYl312.js";import{A as k,L as f}from"./components-DUNtf72c.js";const b=p.createContext(null);function $({children:r,epicVideoInfosPromise:s}){return e.jsx(b.Provider,{value:s,children:r})}function N(r){let s=new URL("https://epicweb.dev");try{s=new URL(r)}catch(u){return console.error(u),"EpicWeb.dev Video"}const i=s.pathname.split("/").filter(Boolean),t=i.includes("solution");let n=i.pop();const x=["problem","solution","embed","exercise"],a=u=>u&&!x.includes(u);for(;!a(n);)n=i.pop();if(!n)return"EpicWeb.dev Video";const l=n.split("-"),d=["the","a","an","and","but","or","for","nor","on","at","to","from","by","of","in","with","as","npm","git","ssh","cli"],c=["OAuth","UI","UX","API","CSS","HTML","JS","TS","SVG","AI","CSRF","CORS","HTTP","HTTPS","URL","URI","DB","SQL","JSON","YAML","YML","useActionData","useAsyncError","useAsyncValue","useBeforeUnload","useFetcher","useFetchers","useFormAction","useHref","useLoaderData","useLocation","useMatches","useNavigate","useNavigation","useNavigationType","useOutlet","useOutletContext","useParams","useResolvedPath","useRevalidator","useRouteError","useRouteLoaderData","useSearchParams","useSubmit","useCallback","useContext","useDebugValue","useDeferredValue","useEffect","useId","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useSyncExternalStore","useTransition","useForm","useFieldset","useFieldList","useEventSource","useHydrated","useAuthenticityToken","useShouldHydrate","useGlobalNavigationState","useLocales","useDelegatedAnchors","useDebounceFetcher","useFetcherType"],o=l.filter(Boolean).map((u,j)=>{var y;const h=u.toLowerCase(),g=c.find(E=>E.toLowerCase()===h);return g||(d.includes(h)&&j>0?h:((y=h[0])==null?void 0:y.toUpperCase())+h.slice(1))}).join(" ");return t?`${o} (🏁 solution)`:o}function P({url:r,title:s="Video Embed",loadingContent:i=e.jsx(v,{children:e.jsxs("span",{children:['Loading "',s,'"']})})}){const[t,n]=p.useState(!1);return e.jsxs("div",{className:"relative aspect-video w-full flex-shrink-0 shadow-lg dark:shadow-gray-800",children:[t?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:i}),e.jsx("iframe",{onLoad:()=>n(!0),onError:()=>n(!0),src:r,className:I("absolute inset-0 flex h-full w-full transition-opacity duration-300",t?"opacity-100":"opacity-0"),title:s,sandbox:"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allowFullScreen:!0})]})}function w({url:r,title:s}){return e.jsxs("a",{href:r,target:"_blank",className:"flex items-center gap-1 text-base no-underline opacity-70 transition hover:underline hover:opacity-100",rel:"noreferrer",children:[e.jsx(C,{className:"flex-shrink-0",name:"Video",size:"lg"}),s," ",e.jsx("span",{"aria-hidden":!0,children:"↗︎"})]})}function _({url:r,title:s=N(r)}){const{product:{host:i,displayName:t}}=T(),n=R(),x=p.useContext(b),a=e.jsx("div",{children:e.jsx(w,{url:r,title:s})});return e.jsx("div",{children:e.jsx(p.Suspense,{fallback:e.jsxs("div",{children:[e.jsx("div",{className:"flex aspect-video w-full items-center justify-center",children:e.jsx(v,{children:s})}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,e.jsx("div",{className:"h-[32px]"})]})]}),children:e.jsx(k,{errorElement:e.jsx("div",{children:"Sorry, failed loading videos. Check the terminal output?"}),resolve:x,children:l=>{const d=l==null?void 0:l[r],c=ENV.EPICSHOP_DEPLOYED?e.jsxs("div",{children:[e.jsx(f,{to:ENV.EPICSHOP_GITHUB_REPO,className:"underline",children:"Run locally"})," for transcripts"]}):e.jsxs("div",{children:[e.jsx(f,{to:"/login",className:"underline",children:n?"Upgrade":"Login"})," for transcripts"]});if(!d)return e.jsxs("div",{children:[e.jsx(m,{url:r,title:s}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,c]})]});const o=d;return o.status==="success"?e.jsx(U,{url:r,title:s,muxPlaybackId:o.muxPlaybackId,transcript:o.transcript}):o.type==="region-restricted"?e.jsxs("div",{children:[e.jsxs("div",{className:"flex aspect-video min-h-full min-w-full flex-col items-center justify-start gap-2 overflow-y-scroll border-2 p-4 lg:justify-center lg:gap-4 lg:text-xl",children:[e.jsx("div",{className:"!text-foreground-danger",children:"Error: Region Restricted"}),e.jsxs("div",{children:["We've detected you're connecting from"," ",o.requestCountry," but your license has restricted access to ",o.restrictedCountry]}),e.jsxs("div",{children:["To continue watching uninterrupted, please"," ",e.jsxs("a",{href:`https://${i}/products`,className:"underline",children:["upgrade your ",t," license"]})," ","to a full Pro license."]})]}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,e.jsxs("div",{children:[e.jsx(f,{to:`https://${i}/products`,className:"underline",children:"Upgrade"})," for transcripts"]})]})]}):o.statusCode===401?e.jsxs("div",{children:[e.jsx(m,{url:r,title:s}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,c]})]}):o.statusCode===403?e.jsxs("div",{children:[e.jsx(m,{url:r,title:s}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,e.jsxs("div",{children:[e.jsx(f,{to:`https://${i}/products`,className:"underline",children:"Upgrade"})," for transcripts"]})]})]}):o.statusCode===404?e.jsxs("div",{children:[e.jsx(m,{url:r,title:s}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,e.jsx("div",{children:"Transcripts not found"})]})]}):(console.error(o),e.jsxs("div",{children:[e.jsx(m,{url:r,title:s}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[a,e.jsx("div",{className:"!text-foreground-danger",children:"Unknown error (check console)"})]})]}))}})})})}function U({url:r,title:s=N(r),muxPlaybackId:i,transcript:t}){const n=p.useRef(null),x=/(\d+:\d+)/g,a=[];let l,d=0;for(;l=x.exec(t);){const c=l[1];if(!x.lastIndex||!c)break;const o=l.index,u=x.lastIndex,j=t.slice(d+1,o-1);a.push(e.jsx("span",{children:j},o)),a.push(e.jsx("button",{className:"underline",onClick:h=>{n.current&&(n.current.currentTime=V(c),n.current.play(),n.current.scrollIntoView({behavior:"smooth",inline:"center",block:"start"}),h.currentTarget.blur())},children:c},c)),d=u}return a.push(e.jsx("span",{children:t.slice(d+1,t.length)},t.length)),e.jsxs("div",{children:[e.jsx("div",{className:"shadow-lg dark:shadow-gray-800",children:e.jsx(S,{playbackId:i,muxPlayerRef:n,title:s})}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[e.jsx(w,{url:r,title:s}),e.jsxs("details",{children:[e.jsx("summary",{children:"Transcript"}),e.jsx("div",{className:"whitespace-pre-line rounded-md bg-accent p-2 text-accent-foreground",children:a})]})]})]})}function V(r){const s=r.split(":");let i=0,t=1;for(;s.length>0;)i+=t*parseInt(s.pop()??"0",10),t*=60;return i}function m({url:r,title:s}){const i=L();let t=new URL("https://epicweb.dev");try{t=new URL(r)}catch(n){return console.error(n),e.jsxs("div",{children:['Invalid URL: "',r,'"']})}return t.pathname=t.pathname.endsWith("/")?`${t.pathname}embed`:`${t.pathname}/embed`,t.searchParams.set("theme",i),e.jsx(P,{url:t.toString(),title:s,loadingContent:e.jsx(v,{children:e.jsxs("span",{children:['Loading "',e.jsx("a",{className:"underline",href:r,children:s}),'"']})})})}export{_ as D,$ as E,P as V};
|
|
2
|
+
//# sourceMappingURL=epic-video-D8ex9vao.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epic-video-D8ex9vao.js","sources":["../../../app/components/epic-video.tsx"],"sourcesContent":["import { type EpicVideoInfos } from '@epic-web/workshop-utils/epic-api.server'\nimport { type MuxPlayerRefAttributes } from '@mux/mux-player-react'\nimport { Await, Link } from '@remix-run/react'\nimport * as React from 'react'\nimport { useTheme } from '#app/routes/theme/index.tsx'\nimport { MuxPlayer } from '#app/routes/video-player/index.tsx'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from './icons.tsx'\nimport { Loading } from './loading.tsx'\nimport { useOptionalUser } from './user.tsx'\nimport { useWorkshopConfig } from './workshop-config.tsx'\n\nconst EpicVideoInfoContext = React.createContext<\n\tPromise<EpicVideoInfos> | null | undefined\n>(null)\n\nexport function EpicVideoInfoProvider({\n\tchildren,\n\tepicVideoInfosPromise,\n}: {\n\tchildren: React.ReactNode\n\tepicVideoInfosPromise?: Promise<EpicVideoInfos> | null\n}) {\n\treturn (\n\t\t<EpicVideoInfoContext.Provider value={epicVideoInfosPromise}>\n\t\t\t{children}\n\t\t</EpicVideoInfoContext.Provider>\n\t)\n}\n\nfunction extractEpicTitle(urlString: string) {\n\tlet url: URL = new URL('https://epicweb.dev')\n\ttry {\n\t\turl = new URL(urlString)\n\t} catch (error) {\n\t\tconsole.error(error)\n\t\treturn 'EpicWeb.dev Video'\n\t}\n\tconst urlSegments = url.pathname.split('/').filter(Boolean)\n\tconst isSolution = urlSegments.includes('solution')\n\tlet titleSegment = urlSegments.pop()\n\tconst nonTitles = ['problem', 'solution', 'embed', 'exercise']\n\tconst isTitleSegment = (str?: string) => str && !nonTitles.includes(str)\n\twhile (!isTitleSegment(titleSegment)) titleSegment = urlSegments.pop()\n\n\tif (!titleSegment) return 'EpicWeb.dev Video'\n\n\tconst titleWords = titleSegment.split('-')\n\t// prettier-ignore\n\tconst lowerCaseWords = [\n\t\t'the', 'a', 'an', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to',\n\t\t'from', 'by', 'of', 'in', 'with', 'as', 'npm', 'git', 'ssh', 'cli'\n\t]\n\t// prettier-ignore\n\tconst literalWords = [\n\t\t'OAuth', 'UI', 'UX', 'API', 'CSS', 'HTML', 'JS', 'TS', 'SVG', 'AI', 'CSRF',\n\t\t'CORS', 'HTTP', 'HTTPS', 'URL', 'URI', 'DB', 'SQL', 'JSON', 'YAML', 'YML',\n\n\t\t'useActionData', 'useAsyncError', 'useAsyncValue', 'useBeforeUnload',\n\t\t'useFetcher', 'useFetchers', 'useFormAction', 'useHref', 'useLoaderData',\n\t\t'useLocation', 'useMatches', 'useNavigate', 'useNavigation',\n\t\t'useNavigationType', 'useOutlet', 'useOutletContext', 'useParams',\n\t\t'useResolvedPath', 'useRevalidator', 'useRouteError', 'useRouteLoaderData',\n\t\t'useSearchParams', 'useSubmit', 'useCallback', 'useContext',\n\t\t'useDebugValue', 'useDeferredValue', 'useEffect', 'useId',\n\t\t'useImperativeHandle', 'useInsertionEffect', 'useLayoutEffect', 'useMemo',\n\t\t'useReducer', 'useRef', 'useState', 'useSyncExternalStore', 'useTransition',\n\t\t'useForm','useFieldset', 'useFieldList', 'useEventSource', 'useHydrated',\n\t\t'useAuthenticityToken', 'useShouldHydrate', 'useGlobalNavigationState',\n\t\t'useLocales', 'useDelegatedAnchors', 'useDebounceFetcher', 'useFetcherType',\n\t]\n\tconst title = titleWords\n\t\t.filter(Boolean)\n\t\t.map((word, index) => {\n\t\t\tconst lowerWord = word.toLowerCase()\n\t\t\tconst literalWord = literalWords.find(\n\t\t\t\t(w) => w.toLowerCase() === lowerWord,\n\t\t\t)\n\t\t\tif (literalWord) return literalWord\n\t\t\tif (lowerCaseWords.includes(lowerWord) && index > 0) {\n\t\t\t\treturn lowerWord\n\t\t\t}\n\t\t\treturn lowerWord[0]?.toUpperCase() + lowerWord.slice(1)\n\t\t})\n\t\t.join(' ')\n\tif (isSolution) {\n\t\treturn `${title} (🏁 solution)`\n\t}\n\treturn title\n}\n\nexport function VideoEmbed({\n\turl,\n\ttitle = 'Video Embed',\n\tloadingContent = (\n\t\t<Loading>\n\t\t\t<span>Loading \"{title}\"</span>\n\t\t</Loading>\n\t),\n}: {\n\turl: string\n\ttitle?: string\n\tloadingContent?: React.ReactNode\n}) {\n\tconst [iframeLoaded, setIframeLoaded] = React.useState(false)\n\n\treturn (\n\t\t<div className=\"relative aspect-video w-full flex-shrink-0 shadow-lg dark:shadow-gray-800\">\n\t\t\t{iframeLoaded ? null : (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t{loadingContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\tsrc={url}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute inset-0 flex h-full w-full transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t\ttitle={title}\n\t\t\t\tsandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n\t\t\t\tallowFullScreen\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nfunction VideoLink({ url, title }: { url: string; title: string }) {\n\treturn (\n\t\t<a\n\t\t\thref={url}\n\t\t\ttarget=\"_blank\"\n\t\t\tclassName=\"flex items-center gap-1 text-base no-underline opacity-70 transition hover:underline hover:opacity-100\"\n\t\t\trel=\"noreferrer\"\n\t\t>\n\t\t\t<Icon className=\"flex-shrink-0\" name=\"Video\" size=\"lg\" />\n\t\t\t{title} <span aria-hidden>↗︎</span>\n\t\t</a>\n\t)\n}\nexport function DeferredEpicVideo({\n\turl,\n\ttitle = extractEpicTitle(url),\n}: {\n\turl: string\n\ttitle?: string\n}) {\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst user = useOptionalUser()\n\tconst epicVideoInfosPromise = React.useContext(EpicVideoInfoContext)\n\tconst linkUI = (\n\t\t<div>\n\t\t\t<VideoLink url={url} title={title} />\n\t\t</div>\n\t)\n\treturn (\n\t\t<div>\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"flex aspect-video w-full items-center justify-center\">\n\t\t\t\t\t\t\t<Loading>{title}</Loading>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t<div className=\"h-[32px]\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div>Sorry, failed loading videos. Check the terminal output?</div>\n\t\t\t\t\t}\n\t\t\t\t\tresolve={epicVideoInfosPromise}\n\t\t\t\t>\n\t\t\t\t\t{(epicVideoInfos) => {\n\t\t\t\t\t\tconst epicVideoInfo = epicVideoInfos?.[url]\n\t\t\t\t\t\tconst transcriptUI = ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Link to={ENV.EPICSHOP_GITHUB_REPO} className=\"underline\">\n\t\t\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{' for transcripts'}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\t\t\t\t{user ? 'Upgrade' : 'Login'}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{' for transcripts'}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (!epicVideoInfo) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<EpicVideoEmbed url={url} title={title} />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t{transcriptUI}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst info = epicVideoInfo\n\t\t\t\t\t\tif (info.status === 'success') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<EpicVideo\n\t\t\t\t\t\t\t\t\turl={url}\n\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\tmuxPlaybackId={info.muxPlaybackId}\n\t\t\t\t\t\t\t\t\ttranscript={info.transcript}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else if (info.type === 'region-restricted') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div className=\"flex aspect-video min-h-full min-w-full flex-col items-center justify-start gap-2 overflow-y-scroll border-2 p-4 lg:justify-center lg:gap-4 lg:text-xl\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"!text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t\t\tError: Region Restricted\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\tWe've detected you're connecting from{' '}\n\t\t\t\t\t\t\t\t\t\t\t{info.requestCountry} but your license has restricted\n\t\t\t\t\t\t\t\t\t\t\taccess to {info.restrictedCountry}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\tTo continue watching uninterrupted, please{' '}\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\thref={`https://${host}/products`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tupgrade your {displayName} license\n\t\t\t\t\t\t\t\t\t\t\t</a>{' '}\n\t\t\t\t\t\t\t\t\t\t\tto a full Pro license.\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tto={`https://${host}/products`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tUpgrade\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t{' for transcripts'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else if (info.statusCode === 401) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<EpicVideoEmbed url={url} title={title} />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t{transcriptUI}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else if (info.statusCode === 403) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<EpicVideoEmbed url={url} title={title} />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tto={`https://${host}/products`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tUpgrade\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t{' for transcripts'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else if (info.statusCode === 404) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<EpicVideoEmbed url={url} title={title} />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t<div>Transcripts not found</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(info)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<EpicVideoEmbed url={url} title={title} />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t{linkUI}\n\t\t\t\t\t\t\t\t\t\t<div className=\"!text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t\t\tUnknown error (check console)\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t</div>\n\t)\n}\n\nfunction EpicVideo({\n\turl: urlString,\n\ttitle = extractEpicTitle(urlString),\n\tmuxPlaybackId,\n\ttranscript,\n}: {\n\turl: string\n\ttitle?: string\n\tmuxPlaybackId: string\n\ttranscript: string\n}) {\n\tconst muxPlayerRef = React.useRef<MuxPlayerRefAttributes>(null)\n\tconst timestampRegex = /(\\d+:\\d+)/g\n\t// turn the transcript into an array of React elements\n\tconst transcriptElements: Array<React.ReactNode> = []\n\tlet match\n\tlet prevIndex = 0\n\twhile ((match = timestampRegex.exec(transcript))) {\n\t\tconst timestamp = match[1]\n\t\tif (!timestampRegex.lastIndex || !timestamp) break\n\n\t\tconst timestampIndexStart = match.index\n\t\tconst timestampIndexEnd = timestampRegex.lastIndex\n\t\tconst textBeforeTimestamp = transcript.slice(\n\t\t\tprevIndex + 1,\n\t\t\ttimestampIndexStart - 1,\n\t\t)\n\t\ttranscriptElements.push(\n\t\t\t<span key={timestampIndexStart}>{textBeforeTimestamp}</span>,\n\t\t)\n\t\ttranscriptElements.push(\n\t\t\t<button\n\t\t\t\tkey={timestamp}\n\t\t\t\tclassName=\"underline\"\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tif (muxPlayerRef.current) {\n\t\t\t\t\t\tmuxPlayerRef.current.currentTime = hmsToSeconds(timestamp)\n\t\t\t\t\t\tvoid muxPlayerRef.current.play()\n\t\t\t\t\t\tmuxPlayerRef.current.scrollIntoView({\n\t\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t\t\tinline: 'center',\n\t\t\t\t\t\t\tblock: 'start',\n\t\t\t\t\t\t})\n\t\t\t\t\t\tevent.currentTarget.blur()\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{timestamp}\n\t\t\t</button>,\n\t\t)\n\t\tprevIndex = timestampIndexEnd\n\t}\n\ttranscriptElements.push(\n\t\t<span key={transcript.length}>\n\t\t\t{transcript.slice(prevIndex + 1, transcript.length)}\n\t\t</span>,\n\t)\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"shadow-lg dark:shadow-gray-800\">\n\t\t\t\t<MuxPlayer\n\t\t\t\t\tplaybackId={muxPlaybackId}\n\t\t\t\t\tmuxPlayerRef={muxPlayerRef}\n\t\t\t\t\ttitle={title}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t<VideoLink url={urlString} title={title} />\n\t\t\t\t<details>\n\t\t\t\t\t<summary>Transcript</summary>\n\t\t\t\t\t<div className=\"whitespace-pre-line rounded-md bg-accent p-2 text-accent-foreground\">\n\t\t\t\t\t\t{transcriptElements}\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction hmsToSeconds(str: string) {\n\tconst p = str.split(':')\n\tlet s = 0\n\tlet m = 1\n\n\twhile (p.length > 0) {\n\t\ts += m * parseInt(p.pop() ?? '0', 10)\n\t\tm *= 60\n\t}\n\treturn s\n}\n\nfunction EpicVideoEmbed({\n\turl: urlString,\n\ttitle,\n}: {\n\turl: string\n\ttitle: string\n}) {\n\tconst theme = useTheme()\n\tlet url: URL = new URL('https://epicweb.dev')\n\ttry {\n\t\turl = new URL(urlString)\n\t} catch (error) {\n\t\tconsole.error(error)\n\t\treturn <div>Invalid URL: \"{urlString}\"</div>\n\t}\n\turl.pathname = url.pathname.endsWith('/')\n\t\t? `${url.pathname}embed`\n\t\t: `${url.pathname}/embed`\n\turl.searchParams.set('theme', theme)\n\treturn (\n\t\t<VideoEmbed\n\t\t\turl={url.toString()}\n\t\t\ttitle={title}\n\t\t\tloadingContent={\n\t\t\t\t<Loading>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{'Loading \"'}\n\t\t\t\t\t\t<a className=\"underline\" href={urlString}>\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{'\"'}\n\t\t\t\t\t</span>\n\t\t\t\t</Loading>\n\t\t\t}\n\t\t/>\n\t)\n}\n"],"names":["EpicVideoInfoContext","React.createContext","EpicVideoInfoProvider","children","epicVideoInfosPromise","extractEpicTitle","urlString","url","error","urlSegments","isSolution","titleSegment","nonTitles","isTitleSegment","str","titleWords","lowerCaseWords","literalWords","title","word","index","lowerWord","literalWord","w","_a","VideoEmbed","loadingContent","jsx","Loading","jsxs","iframeLoaded","setIframeLoaded","React.useState","cn","VideoLink","Icon","DeferredEpicVideo","host","displayName","useWorkshopConfig","user","useOptionalUser","React.useContext","linkUI","React.Suspense","Await","epicVideoInfos","epicVideoInfo","transcriptUI","Link","EpicVideoEmbed","info","EpicVideo","muxPlaybackId","transcript","muxPlayerRef","React.useRef","timestampRegex","transcriptElements","match","prevIndex","timestamp","timestampIndexStart","timestampIndexEnd","textBeforeTimestamp","event","hmsToSeconds","MuxPlayer","p","s","m","theme","useTheme"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as i,c,j as o,i as a}from"./index-C_B1-9rF.js";import{g as m}from"./misc-DIdEn_jt.js";function f({defaultStatusHandler:s=({error:r})=>o.jsxs("p",{children:[r.status," ",r.data]}),statusHandlers:e,unexpectedErrorHandler:t=r=>o.jsx("p",{children:m(r)})}){const r=i(),n=c();return typeof document<"u"&&console.error(r),o.jsx("div",{className:"container flex items-center justify-center p-20 text-h2",children:a(r)?((e==null?void 0:e[r.status])??s)({error:r,params:n}):t(r)})}export{f as G};
|
|
2
|
+
//# sourceMappingURL=error-boundary-3zItlMUO.js.map
|
package/build/client/assets/{error-boundary-BZA-ffa8.js.map → error-boundary-3zItlMUO.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-boundary-
|
|
1
|
+
{"version":3,"file":"error-boundary-3zItlMUO.js","sources":["../../../app/components/error-boundary.tsx"],"sourcesContent":["import {\n\tisRouteErrorResponse,\n\tuseParams,\n\tuseRouteError,\n\ttype ErrorResponse,\n} from '@remix-run/react'\nimport { getErrorMessage } from '#app/utils/misc.tsx'\n\ntype StatusHandler = (info: {\n\terror: ErrorResponse\n\tparams: Record<string, string | undefined>\n}) => React.ReactNode | null\n\nexport function GeneralErrorBoundary({\n\tdefaultStatusHandler = ({ error }) => (\n\t\t<p>\n\t\t\t{error.status} {error.data}\n\t\t</p>\n\t),\n\tstatusHandlers,\n\tunexpectedErrorHandler = (error) => <p>{getErrorMessage(error)}</p>,\n}: {\n\tdefaultStatusHandler?: StatusHandler\n\tstatusHandlers?: Record<number, StatusHandler>\n\tunexpectedErrorHandler?: (error: unknown) => React.ReactNode | null\n}) {\n\tconst error = useRouteError()\n\tconst params = useParams()\n\n\tif (typeof document !== 'undefined') {\n\t\tconsole.error(error)\n\t}\n\n\treturn (\n\t\t<div className=\"container flex items-center justify-center p-20 text-h2\">\n\t\t\t{isRouteErrorResponse(error)\n\t\t\t\t? (statusHandlers?.[error.status] ?? defaultStatusHandler)({\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t})\n\t\t\t\t: unexpectedErrorHandler(error)}\n\t\t</div>\n\t)\n}\n"],"names":["GeneralErrorBoundary","defaultStatusHandler","error","statusHandlers","unexpectedErrorHandler","getErrorMessage","useRouteError","params","useParams","jsx","isRouteErrorResponse"],"mappings":"+FAaO,SAASA,EAAqB,CACpC,qBAAAC,EAAuB,CAAC,CAAE,MAAAC,CAAM,WAC9B,IACC,CAAA,SAAA,CAAMA,EAAA,OAAO,IAAEA,EAAM,IAAA,EACvB,EAED,eAAAC,EACA,uBAAAC,EAA0BF,SAAW,IAAG,CAAA,SAAAG,EAAgBH,CAAK,EAAE,CAChE,EAIG,CACF,MAAMA,EAAQI,IACRC,EAASC,IAEX,OAAA,OAAO,SAAa,KACvB,QAAQ,MAAMN,CAAK,EAInBO,EAAA,IAAC,MAAI,CAAA,UAAU,0DACb,SAAAC,EAAqBR,CAAK,IACvBC,GAAA,YAAAA,EAAiBD,EAAM,UAAWD,GAAsB,CACzD,MAAAC,EACA,OAAAK,CACA,CAAA,EACAH,EAAuBF,CAAK,CAChC,CAAA,CAEF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,r as t}from"./index-C_B1-9rF.js";import{E as l}from"./index-CLNXC84j.js";import{E as n}from"./epic-video-D8ex9vao.js";import{L as a}from"./loading-DW_I206H.js";import{N as d}from"./nav-chevrons-B3SvZV8B.js";import{u as c}from"./revalidation-ws-DK5QOPlL.js";import{M as m,E as p}from"./mdx-C9dqA6IZ.js";import{a as f}from"./misc-DIdEn_jt.js";import{g as h}from"./seo-pBpFCWsy.js";import{P as x}from"./progress-D6SP0Gec.js";import{u,L as j}from"./components-DUNtf72c.js";import"./index-DH1w3QmP.js";import"./request-info-vBkaf3Rk.js";import"./tooltip-BoVikCa-.js";import"./pe-D5h19vSo.js";import"./index-BajUQsFT.js";import"./user-CbbIYEs8.js";import"./workshop-config-C5sYl312.js";import"./progress-bar-CBDBzRQ2.js";const U={getSitemapEntries:()=>[{route:"/finished"}]},z=({matches:s})=>{var i;const r=(i=s.find(o=>o.id==="root"))==null?void 0:i.data;return r?h({title:`🎉 ${r==null?void 0:r.workshopTitle}`,description:`Elaboration for ${r==null?void 0:r.workshopTitle}`,ogTitle:`Finished ${r==null?void 0:r.workshopTitle}`,ogDescription:"You finished! Time to submit feedback.",instructor:r.instructor,requestInfo:r.requestInfo}):[]},b={h1:()=>null};function G(){const s=u();return c({watchPaths:["./exercises/FINISHED.mdx"]}),e.jsx("div",{className:"flex h-full flex-grow flex-col",children:e.jsxs("main",{className:"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1",children:[e.jsxs("div",{className:"relative col-span-1 row-span-1 flex h-full flex-col lg:border-r",children:[e.jsx("h1",{className:"h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none",children:e.jsx("div",{className:"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2",children:e.jsxs("div",{className:"flex items-center justify-start gap-x-2",children:[e.jsx(j,{to:"/",className:"hover:underline",children:s.workshopTitle}),e.jsx("span",{children:"/"}),e.jsx("span",{children:"Elaboration"})]})})}),e.jsx("article",{className:"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",id:s.articleId,children:s.finishedCode?e.jsx(n,{epicVideoInfosPromise:s.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(m,{code:s.finishedCode,components:b})})}):"No finished instructions yet..."}),e.jsx(l,{elementQuery:`#${s.articleId}`}),e.jsx(x,{type:"workshop-finished",className:"h-14 border-t px-6"}),e.jsxs("div",{className:"flex h-16 justify-between border-b-4 border-t lg:border-b-0",children:[e.jsx("div",{}),s.workshopFinished.status==="success"?e.jsx(p,{file:s.workshopFinished.file,relativePath:s.workshopFinished.relativePath}):null,e.jsx(d,{prev:s.prevStepLink,next:{to:"/"}})]})]}),e.jsx(g,{workshopTitle:s.workshopTitle,workshopFormEmbedUrl:s.workshopFormEmbedUrl})]})})}function g({workshopTitle:s,workshopFormEmbedUrl:r}){const[i,o]=t.useState(!1);return e.jsxs("div",{className:"relative flex-shrink-0",children:[i?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:e.jsx(a,{children:e.jsxs("span",{children:["Loading ",s," Elaboration form"]})})}),e.jsx("iframe",{onLoad:()=>o(!0),onError:()=>o(!0),title:"Elaboration",src:r,className:f("absolute inset-0 flex h-full w-full transition-opacity duration-300",i?"opacity-100":"opacity-0")})]})}export{G as default,U as handle,z as meta};
|
|
2
|
+
//# sourceMappingURL=finished-rUzUjnEm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finished-rUzUjnEm.js","sources":["../../../app/routes/_app+/finished.tsx"],"sourcesContent":["import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetExercises,\n\tgetWorkshopFinished,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n\ttime,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tunstable_data as data,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport { Link, useLoaderData } from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport * as React from 'react'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { getEpicVideoInfos } from '@epic-web/workshop-utils/epic-api.server'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn } from '#app/utils/misc.tsx'\nimport { getSeoMetaTags } from '#app/utils/seo.js'\nimport { EditFileOnGitHub } from '../launch-editor.tsx'\nimport { ProgressToggle } from '../progress.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => [{ route: '/finished' }],\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tmatches,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\tif (!rootData) return []\n\n\treturn getSeoMetaTags({\n\t\ttitle: `🎉 ${rootData?.workshopTitle}`,\n\t\tdescription: `Elaboration for ${rootData?.workshopTitle}`,\n\t\togTitle: `Finished ${rootData?.workshopTitle}`,\n\t\togDescription: `You finished! Time to submit feedback.`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('finishedLoader')\n\tconst exercises = await getExercises({ request, timings })\n\tconst compiledFinished = await time(() => getWorkshopFinished({ request }), {\n\t\ttimings,\n\t\ttype: 'compileMdx',\n\t\tdesc: 'compileMdx in finished',\n\t})\n\n\tconst lastExercises = exercises[exercises.length - 1]\n\tconst workshopConfig = getWorkshopConfig()\n\tconst workshopTitle = workshopConfig.title\n\tconst workshopFormTemplate = workshopConfig.forms.workshop\n\tconst workshopFormEmbedUrl = workshopFormTemplate.replace(\n\t\t'{workshopTitle}',\n\t\tencodeURIComponent(workshopTitle),\n\t)\n\treturn data(\n\t\t{\n\t\t\tarticleId: `workshop-${slugify(workshopTitle)}-finished`,\n\t\t\tworkshopTitle,\n\t\t\tworkshopFormEmbedUrl,\n\t\t\tfinishedCode:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? compiledFinished.compiled.code\n\t\t\t\t\t: null,\n\t\t\tepicVideoInfosPromise:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? getEpicVideoInfos(compiledFinished.compiled.epicVideoEmbeds, {\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t})\n\t\t\t\t\t: null,\n\t\t\tworkshopFinished: {\n\t\t\t\tstatus: compiledFinished.compiled.status,\n\t\t\t\tfile: compiledFinished.file,\n\t\t\t\trelativePath: compiledFinished.relativePath,\n\t\t\t},\n\t\t\tprevStepLink: lastExercises\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${lastExercises.exerciseNumber}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst mdxComponents = { h1: () => null }\n\nexport default function ExerciseFinished() {\n\tconst data = useLoaderData<typeof loader>()\n\tuseRevalidationWS({ watchPaths: ['./exercises/FINISHED.mdx'] })\n\treturn (\n\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t<main className=\"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative col-span-1 row-span-1 flex h-full flex-col lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2\">\n\t\t\t\t\t\t\t\t<Link to=\"/\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{data.workshopTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t<span>/</span>\n\t\t\t\t\t\t\t\t<span>Elaboration</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.finishedCode ? (\n\t\t\t\t\t\t\t<EpicVideoInfoProvider\n\t\t\t\t\t\t\t\tepicVideoInfosPromise={data.epicVideoInfosPromise}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t\t\t\t\t<Mdx code={data.finishedCode} components={mdxComponents} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t// TODO: render a random dad joke...\n\t\t\t\t\t\t\t'No finished instructions yet...'\n\t\t\t\t\t\t)}\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration elementQuery={`#${data.articleId}`} />\n\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\ttype=\"workshop-finished\"\n\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t\t\t<div />\n\t\t\t\t\t\t{data.workshopFinished.status === 'success' ? (\n\t\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\t\tfile={data.workshopFinished.file}\n\t\t\t\t\t\t\t\trelativePath={data.workshopFinished.relativePath}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<NavChevrons prev={data.prevStepLink} next={{ to: '/' }} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Survey\n\t\t\t\t\tworkshopTitle={data.workshopTitle}\n\t\t\t\t\tworkshopFormEmbedUrl={data.workshopFormEmbedUrl}\n\t\t\t\t/>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nfunction Survey({\n\tworkshopTitle,\n\tworkshopFormEmbedUrl,\n}: {\n\tworkshopTitle: string\n\tworkshopFormEmbedUrl: string\n}) {\n\tconst [iframeLoaded, setIframeLoaded] = React.useState(false)\n\treturn (\n\t\t<div className=\"relative flex-shrink-0\">\n\t\t\t{!iframeLoaded ? (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>Loading {workshopTitle} Elaboration form</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\ttitle=\"Elaboration\"\n\t\t\t\tsrc={workshopFormEmbedUrl}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute inset-0 flex h-full w-full transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","route","meta","matches","rootData","find","m","id","data","getSeoMetaTags","title","workshopTitle","description","ogTitle","ogDescription","instructor","requestInfo","mdxComponents","h1","ExerciseFinished","useLoaderData","useRevalidationWS","watchPaths","className","children","jsxs","jsx","Link","to","articleId","finishedCode","EpicVideoInfoProvider","epicVideoInfosPromise","Mdx","code","components","ElementScrollRestoration","elementQuery","ProgressToggle","type","workshopFinished","status","EditFileOnGitHub","file","relativePath","NavChevrons","prev","prevStepLink","next","Survey","workshopFormEmbedUrl","iframeLoaded","setIframeLoaded","React","Loading","onLoad","onError","src","cn"],"mappings":"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"}
|