bitsnap-react 1.11.0 → 1.12.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/README.md +10 -4
- package/dist/CartProvider-XNFSUOCB.js +2 -0
- package/dist/CartProvider-XNFSUOCB.js.map +1 -0
- package/dist/CartProvider-YMJ7RFO4.mjs +2 -0
- package/dist/analytics.js +1 -1
- package/dist/analytics.mjs +1 -1
- package/dist/catalog.js +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/{chunk-C5RMHUOG.mjs → chunk-3QG7H2AI.mjs} +2 -2
- package/dist/chunk-4BW6J7FP.js +4 -0
- package/dist/{chunk-CUQ2PNCJ.js.map → chunk-4BW6J7FP.js.map} +1 -1
- package/dist/{chunk-H3YP2QPV.mjs → chunk-5R3WR22A.mjs} +2 -2
- package/dist/{chunk-ASNUY3EU.js → chunk-6IACFTJR.js} +2 -2
- package/dist/{chunk-ASNUY3EU.js.map → chunk-6IACFTJR.js.map} +1 -1
- package/dist/{chunk-GT3OH55Y.js → chunk-DF2IK2GN.js} +2 -2
- package/dist/{chunk-GT3OH55Y.js.map → chunk-DF2IK2GN.js.map} +1 -1
- package/dist/{chunk-VQQBBSK2.js → chunk-DGUIG334.js} +2 -2
- package/dist/{chunk-VQQBBSK2.js.map → chunk-DGUIG334.js.map} +1 -1
- package/dist/{chunk-XQ43IC4M.mjs → chunk-E5DCEFI2.mjs} +2 -2
- package/dist/chunk-ERL4Z7M7.js +2 -0
- package/dist/{chunk-7RGH57QG.js.map → chunk-ERL4Z7M7.js.map} +1 -1
- package/dist/{chunk-T57337WD.mjs → chunk-FF2ICGFQ.mjs} +2 -2
- package/dist/{chunk-T57337WD.mjs.map → chunk-FF2ICGFQ.mjs.map} +1 -1
- package/dist/{chunk-ELGNOAH4.js → chunk-ICFYSZTV.js} +2 -2
- package/dist/{chunk-ELGNOAH4.js.map → chunk-ICFYSZTV.js.map} +1 -1
- package/dist/{chunk-YFETPEI6.js → chunk-MLSKHOA3.js} +2 -2
- package/dist/{chunk-YFETPEI6.js.map → chunk-MLSKHOA3.js.map} +1 -1
- package/dist/chunk-P4Q5KXKS.mjs +2 -0
- package/dist/{chunk-EZWH6BB2.mjs.map → chunk-P4Q5KXKS.mjs.map} +1 -1
- package/dist/chunk-PNTO3L2C.mjs +4 -0
- package/dist/chunk-PNTO3L2C.mjs.map +1 -0
- package/dist/chunk-QSIKRVZL.mjs +2 -0
- package/dist/chunk-QSIKRVZL.mjs.map +1 -0
- package/dist/{chunk-C5Q7DGCD.mjs → chunk-UCESDAEC.mjs} +2 -2
- package/dist/chunk-XTIY6PXH.js +2 -0
- package/dist/{chunk-PUYK4YHE.js.map → chunk-XTIY6PXH.js.map} +1 -1
- package/dist/consent.js +15 -14
- package/dist/consent.js.map +1 -1
- package/dist/consent.mjs +15 -14
- package/dist/consent.mjs.map +1 -1
- package/dist/course.js +1 -1
- package/dist/course.mjs +1 -1
- package/dist/embed/analytics.js +1 -1
- package/dist/embed/consent.js +11 -10
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +49 -1
- package/dist/index.d.ts +49 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/methods-DDGOXLP6.mjs +2 -0
- package/dist/methods-RQPDIUUN.js +2 -0
- package/dist/{methods-CHNMFVFV.js.map → methods-RQPDIUUN.js.map} +1 -1
- package/dist/returns.js +1 -1
- package/dist/returns.mjs +1 -1
- package/package.json +51 -26
- package/dist/CartProvider-ONIOELW5.mjs +0 -2
- package/dist/CartProvider-Q3CIVK5K.js +0 -2
- package/dist/CartProvider-Q3CIVK5K.js.map +0 -1
- package/dist/chunk-7RGH57QG.js +0 -2
- package/dist/chunk-CUQ2PNCJ.js +0 -4
- package/dist/chunk-EZWH6BB2.mjs +0 -2
- package/dist/chunk-GPNALARZ.mjs +0 -2
- package/dist/chunk-GPNALARZ.mjs.map +0 -1
- package/dist/chunk-HG4YOJWE.mjs +0 -4
- package/dist/chunk-HG4YOJWE.mjs.map +0 -1
- package/dist/chunk-PUYK4YHE.js +0 -2
- package/dist/methods-C5HWYPPN.mjs +0 -2
- package/dist/methods-CHNMFVFV.js +0 -2
- /package/dist/{CartProvider-ONIOELW5.mjs.map → CartProvider-YMJ7RFO4.mjs.map} +0 -0
- /package/dist/{chunk-C5RMHUOG.mjs.map → chunk-3QG7H2AI.mjs.map} +0 -0
- /package/dist/{chunk-H3YP2QPV.mjs.map → chunk-5R3WR22A.mjs.map} +0 -0
- /package/dist/{chunk-XQ43IC4M.mjs.map → chunk-E5DCEFI2.mjs.map} +0 -0
- /package/dist/{chunk-C5Q7DGCD.mjs.map → chunk-UCESDAEC.mjs.map} +0 -0
- /package/dist/{methods-C5HWYPPN.mjs.map → methods-DDGOXLP6.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/panel/components/PanelLogin.tsx","../src/ui/card.tsx","../src/ui/input-otp.tsx","../src/panel/LoadingIndicator.tsx","../src/panel/return-url.ts","../src/panel/components/PanelPage.tsx","../src/panel/hooks/useUrlSearchParams.ts","../src/panel/returns-appearance.ts","../src/ui/switch.tsx","../src/panel/components/PanelNotifications.tsx","../src/ui/pagination.tsx","../src/panel/components/PanelOrderHistory.tsx","../src/panel/components/PanelPlans.tsx","../src/panel/components/PanelReturns.tsx","../src/panel/components/PanelProductGrid.tsx","../src/lib/render.text.tsx","../src/panel/components/PanelProductDetails.tsx","../src/panel/audio-player/AudioPlayer.tsx","../src/panel/audio-player/media.session.coordinator.ts","../src/panel/texts.ts","../src/panel/components/ProgressBar.tsx","../src/panel/components/PanelProductHeader.tsx","../src/panel/components/PanelProfile.tsx","../src/panel/components/LazyPanelCourse.tsx","../src/panel/components/PublicOrderPage.tsx","../src/components/checkout/CartProvider.tsx","../src/public.api.client.ts","../src/components/checkout/frontent.analytics.ts","../src/components/checkout/lib/round.number.ts","../src/components/checkout/google.pay.mapper.ts","../src/components/checkout/helper.methods.ts","../src/components/checkout/lib/err.ts","../src/components/checkout/cart-items.ts","../src/components/checkout/state.ts","../src/components/checkout/texts.context.tsx","../src/components/checkout/pending-order.ts","../src/components/checkout/buy-error.ts","../src/components/checkout/methods.ts"],"sourcesContent":["import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport {\n useEffect,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n} from \"react\";\nimport {\n InstrumentProvider,\n useInstrument,\n useInstrumentContext,\n type AnalyticsOption,\n} from \"../../analytics/instrument\";\nimport { cn } from \"../../lib/utils\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../ui/card\";\nimport { Input } from \"../../ui/input\";\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSeparator,\n InputOTPSlot,\n} from \"../../ui/input-otp\";\nimport { REGEXP_ONLY_DIGITS } from \"input-otp\";\nimport { Label } from \"../../ui/label\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport {\n getAllowedReturnOrigins,\n setAllowedReturnOrigins,\n} from \"../config\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport {\n buildAccessTokenRedirect,\n getReturnURLFromSearch,\n persistReturnURL,\n readPersistedReturnURL,\n} from \"../return-url\";\nimport { getPanelSession, savePanelSession } from \"../session-storage\";\n\ntype LoginResponseStatus = \"success\" | \"error\" | \"default\";\n\nif (typeof window !== \"undefined\") {\n const currentOrigin = window.location.origin;\n const knownSiblings = [\n currentOrigin,\n \"https://bitsnap.pl\",\n \"https://kursy.bitsnap.pl\",\n ];\n if (getAllowedReturnOrigins().length === 0) {\n setAllowedReturnOrigins(Array.from(new Set(knownSiblings)));\n }\n}\n\ninterface LoginUserPanelProps {\n projectID?: string;\n host?: string;\n reveal: () => void;\n email: string;\n setEmail: (input: string) => void;\n loginUser: () => void;\n isLoginLoading: boolean;\n errMsg: string;\n}\n\ninterface VerifyCodePanelProps {\n projectID?: string;\n host?: string;\n email: string;\n reveal: () => void;\n setEmail: (input: string) => void;\n loginUser: () => void;\n isLoginLoading: boolean;\n loginUserResponse: {\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null;\n setLoginUserResponse: (\n response: {\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null,\n ) => void;\n responseStatus: LoginResponseStatus;\n setResponseStatus: (status: LoginResponseStatus) => void;\n errMsg: string;\n}\n\nconst LoginUserPanel = ({\n projectID,\n host,\n reveal,\n email,\n setEmail,\n loginUser,\n isLoginLoading,\n errMsg,\n}: LoginUserPanelProps) => {\n const { projectID: configuredProjectID, host: configuredHost } = usePanelConfig();\n if (\n typeof window !== \"undefined\" &&\n getPanelSession(projectID ?? configuredProjectID, host ?? configuredHost) != null\n ) {\n // @ts-ignore\n window.location.href = window.location.href.replaceAll(\"login\", \"\");\n return null;\n }\n\n const [isValidEmail, setIsValidEmail] = useState<boolean>(false);\n\n const emailValidation = (input: string) => {\n const emailPattern =\n /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n if (emailPattern.test(input.trim())) {\n return setIsValidEmail(true);\n }\n\n return setIsValidEmail(false);\n };\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const { value } = e.target;\n emailValidation(value);\n setEmail(value);\n };\n\n function goToVerifyCode() {\n reveal();\n }\n\n function onSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault();\n void loginUser();\n }\n\n return (\n <main className=\"mx-auto flex max-w-sm flex-1 flex-col justify-center space-y-12\">\n <div className={cn(\"flex min-w-sm flex-col gap-6\")}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-2xl\">Zaloguj się</CardTitle>\n <CardDescription>\n Wyślemy do Ciebie kod na maila, dzięki któremu się zalogujesz.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-6\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n onChange={handleInputChange}\n type=\"email\"\n placeholder=\"m@example.com\"\n required\n />\n <span\n className={cn(\n !isValidEmail && email.length > 0\n ? \"font-bold text-red-500\"\n : \"text-neutral-700 dark:text-neutral-400\",\n \"text-xs\",\n )}\n >\n {!isValidEmail && email.length > 0\n ? \"Nieprawidłowy adres email\"\n : \"Wpisz swój adres email\"}\n </span>\n </div>\n\n <div>\n <Button\n type=\"submit\"\n disabled={isLoginLoading}\n className=\"relative w-full\"\n onClick={loginUser}\n >\n {isLoginLoading && (\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n <LoadingIndicator />\n </div>\n )}\n Zaloguj się\n </Button>\n {errMsg.length > 0 && (\n <p className=\"text-xs font-medium text-red-500\">{errMsg}</p>\n )}\n </div>\n </div>\n <div className=\"mt-4 text-center text-sm\">\n Masz już kod?{\" \"}\n <button\n type=\"button\"\n onClick={goToVerifyCode}\n className=\"underline underline-offset-4\"\n >\n Mam już kod\n </button>\n </div>\n </form>\n </CardContent>\n </Card>\n </div>\n </main>\n );\n};\n\nconst VerifyCodePanel = ({\n projectID,\n host,\n email,\n reveal,\n setEmail,\n isLoginLoading,\n loginUserResponse,\n setLoginUserResponse,\n setResponseStatus,\n errMsg,\n}: VerifyCodePanelProps) => {\n const instrument = useInstrumentContext();\n const { mutateAsync: verifyCodeAsync, isPending: isVerifyLoading } =\n useMutation(rpcProvider.publicApi.userPanelLoginWithCode);\n\n const [code, setCode] = useState<string>(\"\");\n const [isValidCode, setIsValidCode] = useState<boolean>(false);\n const [isSubmitted, setIsSubmitted] = useState<boolean>(false);\n const [retryIn, setRetryIn] = useState(0);\n\n const codeValidation = (input: string) => {\n const codePattern = /^\\d+$/;\n\n if (codePattern.test(input.trim())) {\n return setIsValidCode(true);\n }\n\n return setIsValidCode(false);\n };\n\n const handleInputChange = (value: string) => {\n codeValidation(value);\n setCode(value);\n };\n\n async function login() {\n setIsSubmitted(true);\n if (code.length == 0) {\n setIsValidCode(false);\n return;\n }\n const codeValue = parseInt(code);\n\n const verifyCodeResult = await verifyCodeAsync({\n code: codeValue,\n });\n\n let status, message, accessToken;\n\n if (verifyCodeResult.result.case === \"accessToken\") {\n setIsValidCode(true);\n status = \"ok\";\n message = undefined;\n accessToken = verifyCodeResult.result.value;\n } else {\n setIsValidCode(false);\n status = \"error\";\n message = verifyCodeResult.result.value;\n accessToken = undefined;\n }\n\n if (status === \"error\") {\n setIsValidCode(false);\n console.warn(\"error:\", `Kod błędu: ${message}`);\n console.warn(\"Nieprawidłowy kod, spróbuj ponownie.\");\n }\n\n if (status === \"ok\") {\n instrument.track(\"panel_login\", {});\n if (accessToken) {\n savePanelSession(projectID, accessToken, email, host);\n }\n const returnURL = typeof window !== \"undefined\"\n ? readPersistedReturnURL()\n : null;\n setTimeout(() => {\n if (accessToken && returnURL) {\n window.location.href = buildAccessTokenRedirect(returnURL, accessToken);\n return;\n }\n window.location.reload();\n }, 100);\n }\n }\n\n function handleRetryInTime() {\n const intervalId = setInterval(() => {\n setRetryIn((prevRetryIn) => {\n if (prevRetryIn > 0) {\n return prevRetryIn - 1;\n } else {\n clearInterval(intervalId);\n return 0;\n }\n });\n }, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n\n useEffect(() => {\n if (loginUserResponse?.status === \"ok\" && loginUserResponse?.retryIn > 0) {\n setRetryIn(loginUserResponse.retryIn);\n handleRetryInTime();\n }\n }, [loginUserResponse]);\n\n function backToLoginComponent() {\n setEmail(\"\");\n setLoginUserResponse(null);\n setResponseStatus(\"default\");\n reveal();\n }\n\n function onCodeSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault();\n void login();\n }\n\n return (\n <main className=\"mx-auto flex max-w-md flex-1 flex-col justify-center space-y-8\">\n <div className={cn(\"flex min-w-sm flex-col gap-6\")}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-2xl\">Wpisz kod z maila</CardTitle>\n <CardDescription>\n Sprawdź czy przypadkiem nie wylądował w spamie.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={onCodeSubmit} className=\"flex flex-col gap-6\">\n <div className=\"grid gap-2\">\n <div className=\"my-5 flex w-full items-center justify-center\">\n <div className=\"flex flex-col gap-2\">\n <InputOTP\n id=\"verify-code\"\n maxLength={6}\n pattern={REGEXP_ONLY_DIGITS}\n onChange={(newValue) => {\n handleInputChange(newValue);\n }}\n >\n <InputOTPGroup>\n <InputOTPSlot index={0} />\n <InputOTPSlot index={1} />\n <InputOTPSlot index={2} />\n </InputOTPGroup>\n <InputOTPSeparator />\n <InputOTPGroup>\n <InputOTPSlot index={3} />\n <InputOTPSlot index={4} />\n <InputOTPSlot index={5} />\n </InputOTPGroup>\n </InputOTP>\n <span\n className={cn(\n !isValidCode && isSubmitted\n ? \"text-red-500\"\n : \"text-neutral-700 dark:text-neutral-400\",\n \"text-xs\",\n )}\n >\n {!isValidCode && isSubmitted\n ? code.length == 0\n ? \"Kod nie może być pusty\"\n : \"Kod musi składać się z cyfr\"\n : \"Wpisz kod z maila\"}\n </span>\n </div>\n </div>\n </div>\n\n <div>\n <Button\n type=\"submit\"\n disabled={isLoginLoading || isVerifyLoading}\n className=\"relative w-full\"\n >\n {(isLoginLoading || isVerifyLoading) && (\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n <LoadingIndicator />\n </div>\n )}\n Zaloguj się\n </Button>\n {errMsg.length > 0 && (\n <p className=\"text-xs font-medium text-red-500\">{errMsg}</p>\n )}\n </div>\n </form>\n <div className=\"mt-4 text-center text-sm\">\n Nie masz kodu?{\" \"}\n <button\n type=\"button\"\n onClick={backToLoginComponent}\n className=\"underline underline-offset-4\"\n >\n Wróć\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n </main>\n );\n};\n\nconst PanelLoginComponentWrapper = ({\n analytics,\n}: {\n analytics?: AnalyticsOption;\n}) => {\n const { theme, allowedReturnOrigins, projectID, host } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"panel\");\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#FFFFFF\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#FFFFFF\",\n } as CSSProperties;\n\n type Screen = \"login\" | \"verifyCode\";\n\n const [activeScreen, setActiveScreen] = useState<Screen>(\"login\");\n const [parent] = useAutoAnimate({\n duration: 300,\n easing: \"ease-in-out\",\n disrespectUserMotionPreference: false,\n });\n\n const reveal = () =>\n setActiveScreen((prevScreen) =>\n prevScreen === \"login\" ? \"verifyCode\" : \"login\",\n );\n\n const [email, setEmail] = useState<string>(\"\");\n const [responseStatus, setResponseStatus] =\n useState<LoginResponseStatus>(\"default\");\n const [loginUserResponse, setLoginUserResponse] = useState<{\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null>(null);\n const { mutateAsync: loginUserAsync, isPending: isLoginLoading } =\n useMutation(rpcProvider.publicApi.userPanelLogin);\n\n const [errMsg, setErrMsg] = useState(\"\");\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (window.parent !== window) return;\n\n const queryReturnURL = getReturnURLFromSearch(window.location.search);\n if (queryReturnURL) {\n persistReturnURL(queryReturnURL);\n }\n\n const returnURL = queryReturnURL ?? readPersistedReturnURL();\n if (!returnURL) return;\n\n const existingToken = getPanelSession(projectID, host);\n if (!existingToken) return;\n\n window.location.href = buildAccessTokenRedirect(returnURL, existingToken);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [allowedReturnOrigins, projectID, host]);\n\n async function loginUser() {\n setErrMsg(\"\");\n setResponseStatus(\"default\");\n const loginUserResult = await loginUserAsync({\n email: email,\n });\n\n const status = loginUserResult.result.case === \"success\" ? \"ok\" : \"error\";\n let retryIn = 0;\n let message = undefined;\n\n if (loginUserResult.result.case === \"success\") {\n retryIn = loginUserResult.result.value.retryIn;\n }\n\n if (status === \"error\") {\n message = \"Nieprawidłowy adres email, spróbuj ponownie.\";\n }\n\n setLoginUserResponse({\n status: status,\n retryIn: retryIn,\n message: message,\n });\n\n if (status === \"ok\" && activeScreen === \"login\") {\n reveal();\n } else if (status === \"ok\" && activeScreen === \"verifyCode\") {\n setResponseStatus(\"success\");\n } else if (status === \"error\") {\n setErrMsg(message ?? \"Nieprawidłowy adres email, spróbuj ponownie.\");\n }\n }\n\n return (\n <InstrumentProvider value={instrument}>\n <div className=\"bg-white text-black dark:bg-black dark:text-white\">\n <div\n className=\"font-inter flex h-screen w-screen flex-col p-4\"\n style={styles}\n ref={parent}\n >\n <header>\n {theme?.logoDarkURL && (\n <img\n src={theme?.logoDarkURL}\n className=\"hidden dark:inline\"\n alt=\"Company Logo\"\n draggable={false}\n />\n )}\n {theme?.logoURL && (\n <img\n src={theme?.logoURL}\n className=\"dark:hidden\"\n alt=\"Company Logo\"\n draggable={false}\n />\n )}\n </header>\n {activeScreen === \"login\" && (\n <LoginUserPanel\n projectID={projectID}\n host={host}\n reveal={reveal}\n email={email}\n setEmail={setEmail}\n loginUser={loginUser}\n isLoginLoading={isLoginLoading}\n errMsg={errMsg}\n />\n )}\n {activeScreen === \"verifyCode\" && (\n <VerifyCodePanel\n projectID={projectID}\n host={host}\n email={email}\n reveal={reveal}\n setEmail={setEmail}\n loginUser={loginUser}\n isLoginLoading={isLoginLoading}\n loginUserResponse={loginUserResponse}\n setLoginUserResponse={setLoginUserResponse}\n responseStatus={responseStatus}\n setResponseStatus={setResponseStatus}\n errMsg={errMsg}\n />\n )}\n </div>\n </div>\n </InstrumentProvider>\n );\n};\n\nexport const PanelLogin = ({\n analytics,\n}: { analytics?: AnalyticsOption } = {}) => {\n return <PanelLoginComponentWrapper analytics={analytics} />;\n};\n","import * as React from \"react\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","export function LoadingIndicator() {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current [animation-delay:-0.3s]\" />\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current [animation-delay:-0.15s]\" />\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current\" />\n </div>\n );\n}\n\nexport default LoadingIndicator;\n","import { getAllowedReturnOrigins } from \"./config\";\n\nconst RETURN_URL_PARAM = \"return_url\";\nconst RETURN_URL_STORAGE_KEY = \"__return_url\";\nconst ACCESS_TOKEN_PARAM = \"accessToken\";\n\nexport function getReturnURLFromSearch(search: string): string | null {\n const raw = new URLSearchParams(search).get(RETURN_URL_PARAM);\n if (!raw) return null;\n return validateReturnURL(raw);\n}\n\nexport function persistReturnURL(returnURL: string | null): void {\n if (typeof window === \"undefined\") return;\n if (returnURL) {\n window.sessionStorage.setItem(RETURN_URL_STORAGE_KEY, returnURL);\n } else {\n window.sessionStorage.removeItem(RETURN_URL_STORAGE_KEY);\n }\n}\n\nexport function readPersistedReturnURL(): string | null {\n if (typeof window === \"undefined\") return null;\n const stored = window.sessionStorage.getItem(RETURN_URL_STORAGE_KEY);\n if (!stored) return null;\n return validateReturnURL(stored);\n}\n\nfunction isOriginAllowed(origin: string, allowedOrigins: string[]): boolean {\n return allowedOrigins.some((allowed) => {\n if (origin === allowed) return true;\n const allowedHost = new URL(allowed).hostname;\n const originHost = new URL(origin).hostname;\n return originHost.endsWith(`.${allowedHost}`) || originHost === allowedHost;\n });\n}\n\nfunction validateReturnURL(raw: string): string | null {\n try {\n const u = new URL(raw);\n if (u.protocol !== \"https:\" && u.protocol !== \"http:\") return null;\n if (!isOriginAllowed(u.origin, getAllowedReturnOrigins())) return null;\n return u.toString();\n } catch {\n return null;\n }\n}\n\nexport function buildAccessTokenRedirect(\n returnURL: string,\n accessToken: string,\n): string {\n const u = new URL(returnURL);\n u.searchParams.set(ACCESS_TOKEN_PARAM, accessToken);\n return u.toString();\n}\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { useEffect, useState, type CSSProperties } from \"react\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { useUrlSearchParams } from \"../hooks/useUrlSearchParams\";\nimport { InstrumentProvider, useInstrument } from \"../../analytics/instrument\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport { resolvePanelReturnsAppearance } from \"../returns-appearance\";\nimport type { PanelProps } from \"../types\";\nimport {\n buildAccessTokenRedirect,\n getReturnURLFromSearch,\n persistReturnURL,\n readPersistedReturnURL,\n} from \"../return-url\";\n\nimport PanelNotificationsComponent from \"./PanelNotifications\";\nimport PanelOrderHistoryComponent from \"./PanelOrderHistory\";\nimport PanelPlansComponent from \"./PanelPlans\";\nimport PanelReturnsComponent from \"./PanelReturns\";\nimport PanelProductGridComponent from \"./PanelProductGrid\";\nimport PanelProductHeaderComponent from \"./PanelProductHeader\";\nimport PanelProfileComponent from \"./PanelProfile\";\nimport LazyPanelCourse from \"./LazyPanelCourse\";\nimport PublicOrderPage from \"./PublicOrderPage\";\nimport { clearPanelSession, getPanelEmail, getPanelSession } from \"../session-storage\";\n\nexport type PanelScreen =\n | \"products\"\n | \"notifications\"\n | \"profile\"\n | \"plans\"\n | \"orders\"\n | \"order-details\"\n | \"returns\"\n | \"return-details\"\n | \"course\";\n\nexport type PanelSearchParamsType = {\n product?: string;\n state: PanelScreen;\n orderId?: string;\n returnId?: string;\n /** `state: \"course\"`: `UserProduct.accessId` of the open course. */\n course?: string;\n /** `state: \"course\"`: id of the open lesson or test. */\n item?: string;\n};\n\nconst PanelPage = ({\n returnsAppearance,\n returnsTexts,\n analytics,\n}: Pick<PanelProps, \"returnsAppearance\" | \"returnsTexts\" | \"analytics\"> = {}) => {\n const { projectID, theme, loginURL, host } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"panel\");\n\n const accessToken = getPanelSession(projectID, host);\n const email = getPanelEmail(projectID, host);\n\n const { mutateAsync: logoutUserAsync } = useMutation(\n rpcProvider.publicApi.userPanelLogout,\n );\n\n async function logout() {\n if (accessToken) {\n await logoutUserAsync({\n accessToken: accessToken as string,\n });\n }\n if (typeof window !== \"undefined\") {\n clearPanelSession(projectID, host);\n window.location.reload();\n }\n }\n\n const [panelParentRef] = useAutoAnimate();\n const isScreen = (value: unknown): value is PanelScreen =>\n [\n \"products\",\n \"notifications\",\n \"profile\",\n \"plans\",\n \"orders\",\n \"order-details\",\n \"returns\",\n \"return-details\",\n \"course\",\n ].includes(value as string);\n\n const [params, setParams] = useUrlSearchParams<PanelSearchParamsType>({\n product: undefined,\n state: \"products\",\n orderId: undefined,\n returnId: undefined,\n course: undefined,\n item: undefined,\n });\n\n const [activeScreen, setActiveScreen] = useState<PanelScreen>(\n isScreen(params.state) ? params.state : \"products\",\n );\n\n const handleOpenOrderDetails = (orderID: string) => {\n setParams({\n state: \"order-details\",\n orderId: orderID,\n });\n setActiveScreen(\"order-details\");\n };\n\n const handleBackToOrders = () => {\n setParams({\n state: \"orders\",\n orderId: undefined,\n });\n setActiveScreen(\"orders\");\n };\n\n // Navigation starts a screen from scratch, so ids of the previous screen\n // must not leak into it.\n const navigate = (next: { product?: string; state: PanelScreen }) =>\n setParams({\n orderId: undefined,\n returnId: undefined,\n course: undefined,\n item: undefined,\n ...next,\n });\n\n const handleOpenCourse = (accessId: string) => {\n setParams({\n state: \"course\",\n course: accessId,\n item: undefined,\n product: undefined,\n });\n setActiveScreen(\"course\");\n };\n\n const handleLeaveCourse = () => {\n setParams({\n state: \"products\",\n course: undefined,\n item: undefined,\n product: undefined,\n });\n setActiveScreen(\"products\");\n };\n\n // The browser's back and forward buttons move between the lessons of a\n // course and in and out of it.\n useEffect(() => {\n if (!isScreen(params.state)) return;\n if (params.state === \"course\" || activeScreen === \"course\") {\n setActiveScreen(params.state);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [params.state]);\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#000000\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#ffffff\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#000000\",\n } as CSSProperties;\n\n useEffect(() => {\n if (accessToken == null || accessToken.length === 0) {\n window.location.href = loginURL ?? \"/panel/login\";\n return;\n }\n }, []);\n\n useEffect(() => {\n if (accessToken == null || accessToken.length === 0) {\n window.location.href = loginURL ?? \"/panel/login\";\n return;\n }\n }, [activeScreen]);\n\nuseEffect(() => {\n if (typeof window === \"undefined\") return;\n if (window.parent !== window) return;\n if (!accessToken) return;\n\n const queryReturnURL = getReturnURLFromSearch(window.location.search);\n if (queryReturnURL) {\n persistReturnURL(queryReturnURL);\n }\n\n const returnURL = queryReturnURL ?? readPersistedReturnURL();\n if (!returnURL) return;\n\n window.location.href = buildAccessTokenRedirect(returnURL, accessToken);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accessToken]);\n\n return (\n <InstrumentProvider value={instrument}>\n <div\n ref={panelParentRef}\n className=\"font-inter relative min-h-screen w-screen bg-beige-100 text-black dark:bg-black dark:text-white md:flex\"\n >\n <PanelProductHeaderComponent\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={navigate}\n styles={styles}\n theme={theme}\n logout={logout}\n />\n\n <main className=\"flex h-[calc(100vh-80px)] flex-col overflow-y-auto w-full p-5 md:h-screen\">\n {activeScreen === \"products\" && (\n <PanelProductGridComponent\n projectID={projectID ?? \"\"}\n accessToken={accessToken!}\n loginURL={loginURL ?? \"/panel/login\"}\n styles={styles}\n activeScreen={activeScreen}\n params={params as PanelSearchParamsType}\n setParams={setParams}\n openCourse={handleOpenCourse}\n />\n )}\n\n {activeScreen === \"course\" && params.course && accessToken && (\n <LazyPanelCourse\n accessId={params.course}\n accessToken={accessToken}\n theme={theme}\n itemId={params.item}\n onItemChange={(item) => setParams({ item })}\n onBack={handleLeaveCourse}\n />\n )}\n\n {activeScreen === \"notifications\" && <PanelNotificationsComponent />}\n\n {activeScreen === \"plans\" && (\n <PanelPlansComponent projectID={projectID ?? \"\"} />\n )}\n\n {activeScreen === \"orders\" && (\n <PanelOrderHistoryComponent\n projectID={projectID ?? \"\"}\n accessToken={accessToken ?? \"\"}\n openOrderDetails={handleOpenOrderDetails}\n />\n )}\n\n {activeScreen === \"order-details\" && params.orderId && (\n <PublicOrderPage\n orderID={params.orderId}\n onBack={handleBackToOrders}\n />\n )}\n\n {(activeScreen === \"returns\" || activeScreen === \"return-details\") &&\n accessToken && (\n <PanelReturnsComponent\n projectID={projectID ?? \"\"}\n host={host}\n accessToken={accessToken}\n loginURL={loginURL ?? \"/panel/login\"}\n appearance={resolvePanelReturnsAppearance(\n returnsAppearance,\n theme?.colors?.brand,\n )}\n texts={returnsTexts}\n screen={activeScreen}\n params={params as PanelSearchParamsType}\n setParams={setParams}\n setActiveScreen={setActiveScreen}\n />\n )}\n\n {activeScreen === \"profile\" && (\n <PanelProfileComponent email={email} logout={logout} />\n )}\n </main>\n </div>\n </InstrumentProvider>\n );\n};\n\nexport default PanelPage;\n","import { useState, useCallback, useEffect } from \"react\";\n\nexport function useUrlSearchParams<T extends Record<string, unknown>>(\n initialValue: T,\n): [T, (params: Partial<T>) => void] {\n const [params, setParams] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n const urlParams = new URLSearchParams(window.location.search);\n const parsed: Partial<T> = {};\n \n (Object.keys(initialValue) as Array<keyof T>).forEach((key) => {\n const value = urlParams.get(key as string);\n if (value !== null) {\n try {\n (parsed as Record<string, unknown>)[key as string] = JSON.parse(value);\n } catch {\n (parsed as Record<string, unknown>)[key as string] = value as T[keyof T];\n }\n }\n });\n \n return { ...initialValue, ...parsed };\n });\n\n const updateParams = useCallback((newParams: Partial<T>) => {\n setParams((prev) => {\n const updated = { ...prev, ...newParams };\n \n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams();\n (Object.keys(updated) as Array<keyof T>).forEach((key) => {\n const value = updated[key];\n if (value !== undefined && value !== null) {\n urlParams.set(key as string, JSON.stringify(value));\n }\n });\n \n const newUrl = `${window.location.pathname}?${urlParams.toString()}`;\n window.history.pushState({}, \"\", newUrl);\n }\n \n return updated;\n });\n }, []);\n\n useEffect(() => {\n const handlePopState = () => {\n const urlParams = new URLSearchParams(window.location.search);\n const parsed: Partial<T> = {};\n \n (Object.keys(initialValue) as Array<keyof T>).forEach((key) => {\n const value = urlParams.get(key as string);\n if (value !== null) {\n try {\n (parsed as Record<string, unknown>)[key as string] = JSON.parse(value);\n } catch {\n (parsed as Record<string, unknown>)[key as string] = value as T[keyof T];\n }\n }\n });\n \n setParams({ ...initialValue, ...parsed });\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n return () => window.removeEventListener(\"popstate\", handlePopState);\n }, [initialValue]);\n\n return [params, updateParams];\n}\n","import type { ReturnsAppearance } from \"../components/returns/appearance\";\nimport { brandColorTokens, readableForeground } from \"../components/returns/color\";\n\nexport { readableForeground };\n\n/**\n * Returns appearance of the panel Returns screen derived from the panel brand\n * color. An explicit appearance wins; without a brand color the library\n * defaults apply (`undefined`).\n */\nexport function resolvePanelReturnsAppearance(\n explicit: ReturnsAppearance | undefined,\n brand: string | undefined,\n): ReturnsAppearance | undefined {\n if (explicit != null) {\n return explicit;\n }\n const color = brand?.trim();\n if (color == null || color === \"\") {\n return undefined;\n }\n return { tokens: brandColorTokens(color) };\n}\n","import * as React from \"react\"\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","import { Label } from \"../../ui/label\";\nimport { Switch } from \"../../ui/switch\";\nimport { useState } from \"react\";\n\ninterface PanelNotificationsComponentProps {}\n\nfunction PanelNotificationsComponent({}: PanelNotificationsComponentProps) {\n const [notifications, setNotifications] = useState<Record<string, boolean>>({\n disableAll: false,\n });\n\n return (\n <>\n <h3 className=\"text-2xl\">Powiadomienia</h3>\n <p className=\"text-sm text-neutral-500\">\n Zarządzaj swoimi powiadomieniami\n </p>\n <div className=\"mt-6\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"disable-all-notifications\"\n checked={notifications.disableAll}\n onCheckedChange={(checked) =>\n setNotifications((prevState) => ({\n ...prevState,\n disableAll: checked,\n }))\n }\n />\n <Label\n htmlFor=\"disable-all-notifications\"\n className=\"flex flex-col gap-1 text-base\"\n >\n Wszystkie powiadomienia\n <span className=\"text-xs font-normal text-neutral-500 md:text-sm\">\n Ten przycisk może wyłączyć wszystkie powiadomienia\n </span>\n </Label>\n </div>\n </div>\n </>\n );\n}\n\nexport default PanelNotificationsComponent;\n","import * as React from \"react\"\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"@/src/lib/utils\"\nimport { buttonVariants, type Button } from \"@/src/ui/button\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import { rpcProvider, useQuery } from \"../../rpc-provider\";\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"../../ui/pagination\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { useState } from \"react\";\n\ninterface PanelOrderHistoryComponentProps {\n projectID: string;\n accessToken: string;\n openOrderDetails: (orderId: string) => void;\n}\n\nconst formatDate = (ts: number): string =>\n new Date(ts * 1000).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n\nconst formatAmount = (amount: number, currency: string): string =>\n new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currency.toUpperCase(),\n }).format(amount / 100);\n\nconst statusLabel: Record<string, string> = {\n draft: \"Szkic\",\n unpaid: \"Nieopłacona\",\n paid: \"Opłacona\",\n overdue: \"Zaległa\",\n cancelled: \"Anulowana\",\n completed: \"Zakończone\",\n processing: \"Przetwarzane\",\n refunded: \"Zwrócone\",\n};\n\nconst statusColor: Record<string, string> = {\n draft: \"text-neutral-400\",\n unpaid: \"text-yellow-500\",\n paid: \"text-green-600\",\n overdue: \"text-red-500\",\n cancelled: \"text-neutral-400 line-through\",\n completed: \"text-green-600\",\n processing: \"text-blue-500\",\n refunded: \"text-purple-500\",\n};\n\nfunction PanelOrderHistory({\n openOrderDetails,\n projectID,\n accessToken,\n}: PanelOrderHistoryComponentProps) {\n const [offset, setOffset] = useState(0);\n const limit = 20;\n\n const { data, isFetching } = useQuery(rpcProvider.publicApi.getOrders, {\n projectId: projectID,\n accessToken,\n offset,\n limit,\n });\n\n const orders = data?.orders ?? [];\n const totalCount = data?.totalCount ?? 0;\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(totalCount / limit);\n\n const handlePageChange = (newOffset: number) => {\n setOffset(newOffset);\n };\n\n return (\n <>\n <h3 className=\"text-2xl\">Historia zamówień</h3>\n <p className=\"text-sm text-neutral-500 dark:text-neutral-400\">\n Twoje zamówienia\n </p>\n\n {isFetching ? (\n <div className=\"mt-6 flex w-full flex-col gap-3\">\n {[...Array(5)].map((_, i) => (\n <div\n key={i}\n className=\"rounded-xl bg-white p-4 shadow-sm dark:bg-neutral-800\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n <div className=\"space-y-2 text-right\">\n <Skeleton className=\"ml-auto h-4 w-16\" />\n <Skeleton className=\"ml-auto h-3 w-12\" />\n </div>\n </div>\n <div className=\"mt-3\">\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : orders.length === 0 ? (\n <div className=\"mt-6 text-sm text-neutral-400\">Brak zamówień.</div>\n ) : (\n <div>\n <div className=\"mt-6 flex w-full flex-col gap-3\">\n {orders.map((order) => (\n <button\n key={order.id}\n onClick={() => openOrderDetails(order.id)}\n className=\"block rounded-xl bg-white p-4 text-left shadow-sm transition-colors hover:bg-neutral-50 dark:bg-neutral-800 dark:hover:bg-neutral-700\"\n >\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Zamówienie #{order.id}</p>\n <p className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {order.customerName || \"Klient\"}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n {formatAmount(order.totalAmount, order.currency)}\n </p>\n <p\n className={`text-xs font-medium ${statusColor[order.status] ?? \"text-neutral-400\"}`}\n >\n {statusLabel[order.status] ?? order.status}\n </p>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between text-xs text-neutral-500 dark:text-neutral-400\">\n <span>\n Data:{\" \"}\n {order.createdAt\n ? formatDate(Number(order.createdAt.seconds))\n : \"-\"}\n </span>\n </div>\n </button>\n ))}\n </div>\n\n {totalPages > 1 && !isFetching && (\n <div className=\"mt-4 flex justify-center\">\n <Pagination>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious\n onClick={() => handlePageChange(offset - limit)}\n />\n </PaginationItem>\n )}\n\n {currentPage > 2 && (\n <PaginationItem>\n <PaginationLink onClick={() => handlePageChange(0)}>\n 1\n </PaginationLink>\n </PaginationItem>\n )}\n\n {currentPage > 3 && (\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n )}\n\n {[currentPage - 1, currentPage, currentPage + 1]\n .filter((page) => page > 0 && page <= totalPages)\n .map((page) => (\n <PaginationItem key={page}>\n <PaginationLink\n onClick={() => handlePageChange((page - 1) * limit)}\n isActive={currentPage === page}\n >\n {page}\n </PaginationLink>\n </PaginationItem>\n ))}\n\n {currentPage < totalPages - 2 && (\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n )}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationLink\n onClick={() =>\n handlePageChange((totalPages - 1) * limit)\n }\n >\n {totalPages}\n </PaginationLink>\n </PaginationItem>\n )}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext\n onClick={() => handlePageChange(offset + limit)}\n />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\nexport default PanelOrderHistory;\n","import { useState } from \"react\";\n\ninterface Plan {\n id: number;\n tierKey: string;\n tierName: string;\n configName: string;\n status: string;\n billingDay: number;\n startDate: number;\n endDate: number | null;\n}\n\ninterface PanelPlansComponentProps {\n projectID: string;\n}\n\nconst formatDate = (ts: number): string =>\n new Date(ts * 1000).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n\nconst statusLabel: Record<string, string> = {\n active: \"Aktywny\",\n cancelled: \"Anulowany\",\n paused: \"Wstrzymany\",\n};\n\nconst statusColor: Record<string, string> = {\n active: \"text-green-600\",\n cancelled: \"text-red-500\",\n paused: \"text-yellow-500\",\n};\n\nfunction PanelPlansComponent({ projectID: _projectID }: PanelPlansComponentProps) {\n const [plans, setPlans] = useState<Plan[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n return (\n <>\n <h3 className=\"text-2xl\">Plany</h3>\n <p className=\"text-sm text-neutral-500\">Twoje aktywne subskrypcje</p>\n\n {isLoading ? (\n <div className=\"mt-6 text-sm text-neutral-400\">Ładowanie...</div>\n ) : plans.length === 0 ? (\n <div className=\"mt-6 text-sm text-neutral-400\">\n Brak aktywnych planów.\n </div>\n ) : (\n <div className=\"mt-6 flex flex-col gap-4\">\n {plans.map((plan) => (\n <div\n key={plan.id}\n className=\"rounded-xl bg-white p-5 shadow-sm dark:bg-neutral-800\"\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-semibold\">{plan.tierName}</p>\n {plan.configName && (\n <p className=\"text-sm text-neutral-500\">{plan.configName}</p>\n )}\n </div>\n <span\n className={`text-sm font-medium ${statusColor[plan.status] ?? \"text-neutral-500\"}`}\n >\n {statusLabel[plan.status] ?? plan.status}\n </span>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-sm text-neutral-600 dark:text-neutral-400\">\n <div>\n <span className=\"font-medium\">Dzień rozliczenia:</span>{\" \"}\n {plan.billingDay}\n </div>\n <div>\n <span className=\"font-medium\">Data startu:</span>{\" \"}\n {formatDate(plan.startDate)}\n </div>\n {plan.endDate && (\n <div>\n <span className=\"font-medium\">Data zakończenia:</span>{\" \"}\n {formatDate(plan.endDate)}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </>\n );\n}\n\nexport default PanelPlansComponent;\n","import { useEffect, useState } from \"react\";\nimport {\n ReturnsConfirmation,\n ReturnsOrderDetail,\n ReturnsOrderList,\n ReturnsResult,\n} from \"../../components/returns/OrderSteps\";\nimport {\n ReturnsMyReturnDetail,\n ReturnsMyReturnsList,\n} from \"../../components/returns/MyReturns\";\nimport {\n ReturnsProvider,\n useReturnsContext,\n} from \"../../components/returns/ReturnsProvider\";\nimport { SkeletonRows } from \"../../components/returns/internal\";\nimport { isSessionExpiredError, mapReturnsError } from \"../../components/returns/errors\";\nimport { useReturnsText } from \"../../components/returns/texts.context\";\nimport type { SelectedReturnLine } from \"../../components/returns/state-machine\";\nimport type { ReturnsAppearance } from \"../../components/returns/appearance\";\nimport type { ReturnsTexts } from \"../../components/returns/texts\";\nimport { Button } from \"../../ui/button\";\nimport { clearPanelSession } from \"../session-storage\";\nimport type { PanelScreen, PanelSearchParamsType } from \"../types\";\n\ntype Props = {\n projectID: string;\n host?: string;\n accessToken: string;\n loginURL: string;\n appearance?: ReturnsAppearance;\n texts?: Partial<ReturnsTexts>;\n screen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: Partial<PanelSearchParamsType>) => void;\n setActiveScreen: (screen: PanelScreen) => void;\n};\n\ntype Draft = { items: SelectedReturnLine[]; note: string };\n\nfunction redirectToLogin(\n loginURL: string,\n dropToken: boolean,\n projectID: string,\n host?: string,\n) {\n if (typeof window === \"undefined\") return;\n if (dropToken) {\n clearPanelSession(projectID, host);\n }\n window.location.href = loginURL;\n}\n\nfunction ReturnsScreens({\n projectID,\n host,\n loginURL,\n screen,\n params,\n setParams,\n setActiveScreen,\n}: Pick<\n Props,\n \"projectID\" | \"host\" | \"loginURL\" | \"screen\" | \"params\" | \"setParams\" | \"setActiveScreen\"\n>) {\n const { status, exchangeError } = useReturnsContext(\"PanelReturns\");\n const text = useReturnsText();\n\n // The panel token is the login, so there is no email or code step. A failed\n // exchange or a dropped session means the panel session is no longer valid.\n const expired =\n status === \"anonymous\" &&\n (exchangeError == null || isSessionExpiredError(exchangeError));\n useEffect(() => {\n if (expired) {\n redirectToLogin(loginURL, exchangeError != null, projectID, host);\n }\n }, [expired, loginURL, exchangeError, projectID, host]);\n\n const [view, setView] = useState<\"orders\" | \"myReturns\" | \"confirmation\" | \"result\">(\n \"orders\",\n );\n const [draft, setDraft] = useState<Draft>({ items: [], note: \"\" });\n const [createdReturnId, setCreatedReturnId] = useState<string>();\n\n if (status === \"anonymous\" && !expired) {\n return (\n <div role=\"alert\" className=\"flex flex-col items-start gap-3\">\n <p className=\"text-sm\">{text(mapReturnsError(exchangeError))}</p>\n <Button type=\"button\" onClick={() => window.location.reload()}>\n {text(\"errorRetry\")}\n </Button>\n </div>\n );\n }\n\n if (status !== \"authenticated\") {\n return <SkeletonRows />;\n }\n\n const openReturns = (next: \"orders\" | \"myReturns\") => {\n setView(next);\n setParams({ state: \"returns\", orderId: undefined, returnId: undefined });\n setActiveScreen(\"returns\");\n };\n\n if (screen === \"return-details\" && params.returnId) {\n return (\n <ReturnsMyReturnDetail\n returnId={params.returnId}\n onBack={() => openReturns(\"myReturns\")}\n />\n );\n }\n\n if (view === \"myReturns\") {\n return (\n <ReturnsMyReturnsList\n onBack={() => openReturns(\"orders\")}\n onSelectReturn={(returnId) => {\n setParams({ state: \"return-details\", returnId, orderId: undefined });\n setActiveScreen(\"return-details\");\n }}\n />\n );\n }\n\n if (view === \"result\" && createdReturnId != null) {\n return (\n <ReturnsResult\n returnId={createdReturnId}\n onContinue={() => openReturns(\"orders\")}\n onOpenMyReturns={() => openReturns(\"myReturns\")}\n />\n );\n }\n\n if (params.orderId) {\n const orderId = params.orderId;\n\n if (view === \"confirmation\") {\n return (\n <ReturnsConfirmation\n orderId={orderId}\n items={draft.items}\n note={draft.note}\n onBack={() => setView(\"orders\")}\n onSubmitted={(returnId) => {\n setCreatedReturnId(returnId);\n setDraft({ items: [], note: \"\" });\n setView(\"result\");\n setParams({ orderId: undefined });\n }}\n />\n );\n }\n\n return (\n <ReturnsOrderDetail\n orderId={orderId}\n initialItems={draft.items.length > 0 ? draft.items : undefined}\n initialNote={draft.note}\n onBack={() => {\n setDraft({ items: [], note: \"\" });\n setParams({ orderId: undefined });\n }}\n onContinue={(selection) => {\n setDraft(selection);\n setView(\"confirmation\");\n }}\n />\n );\n }\n\n return (\n <ReturnsOrderList\n showLogout={false}\n onSelectOrder={(orderId) => {\n setDraft({ items: [], note: \"\" });\n setView(\"orders\");\n setParams({ orderId });\n }}\n onOpenMyReturns={() => openReturns(\"myReturns\")}\n />\n );\n}\n\n/**\n * Panel Returns screen: the exported returns step components under a\n * `ReturnsProvider` that exchanges the panel access token for a returns\n * session.\n */\nexport default function PanelReturns({\n accessToken,\n appearance,\n texts,\n ...rest\n}: Props) {\n return (\n <ReturnsProvider\n projectID={rest.projectID}\n host={rest.host}\n appearance={appearance}\n texts={texts}\n panelAccessToken={accessToken}\n >\n <ReturnsScreens {...rest} />\n </ReturnsProvider>\n );\n}\n","import { useState, type CSSProperties } from \"react\";\nimport {\n UserProductSchema,\n UserProductType,\n type UserProduct,\n} from \"../../gen/proto/public/v1/public_api_pb\";\nimport { rpcProvider, useQuery } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport LoadingIndicator from \"../LoadingIndicator\";\n\nimport { renderText } from \"@/src/lib/render.text\";\nimport { fromJsonString, toJsonString } from \"@bufbuild/protobuf\";\nimport type { PanelScreen, PanelSearchParamsType } from \"../types\";\nimport PanelProductDetails from \"./PanelProductDetails\";\nimport { clearPanelSession } from \"../session-storage\";\n\ninterface PanelProductGridComponentProps {\n projectID: string;\n accessToken: string;\n loginURL: string;\n styles: CSSProperties;\n activeScreen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: PanelSearchParamsType) => void;\n openCourse: (accessId: string) => void;\n}\n\nconst PanelProductGridComponent = ({\n accessToken,\n projectID,\n loginURL,\n styles,\n activeScreen,\n params,\n setParams,\n openCourse,\n}: PanelProductGridComponentProps) => {\n const { data: products, isLoading: isProductsLoading } = useQuery(\n rpcProvider.publicApi.userPanelGetProducts,\n {\n accessToken: accessToken,\n },\n );\n\n if (isProductsLoading) {\n return (\n <div className=\"flex items-center gap-2 bg-white p-2 dark:bg-black\">\n <p className=\"text-dark font-inter font-medium dark:text-white\">\n Ładowanie...\n </p>\n <LoadingIndicator />\n </div>\n );\n }\n\n if (products && products.result.case === \"failure\") {\n console.warn(\"error:\", `Kod błędu: ${products.result.value}`);\n clearPanelSession(projectID);\n window.location.href = loginURL;\n return null;\n }\n\n const productsList =\n products && products.result.case === \"success\"\n ? products.result.value.products\n : [];\n\n return (\n <ProductsComponent\n accessToken={accessToken}\n products={productsList}\n styles={styles}\n loginURL={loginURL}\n activeScreen={activeScreen}\n params={params}\n setParams={setParams}\n openCourse={openCourse}\n />\n );\n};\n\nexport default PanelProductGridComponent;\n\ninterface ProductsComponentProps {\n accessToken: string;\n products: UserProduct[];\n styles: CSSProperties;\n loginURL: string;\n activeScreen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: PanelSearchParamsType) => void;\n openCourse: (accessId: string) => void;\n}\n\nconst ProductsComponent = ({\n accessToken,\n products,\n styles,\n loginURL,\n activeScreen,\n params,\n setParams,\n openCourse,\n}: ProductsComponentProps) => {\n if (products.length === 0) {\n window.location.href = loginURL;\n return null;\n }\n\n const [selectedProduct, setSelectedProduct] = useState<\n UserProduct | undefined\n >(\n params.product\n ? fromJsonString(UserProductSchema, params.product)\n : undefined,\n );\n\n const reveal = (product?: UserProduct) => {\n if (product == null) {\n setSelectedProduct(undefined);\n setParams({\n product: undefined,\n state: \"products\",\n });\n } else {\n setParams({\n product: toJsonString(UserProductSchema, product),\n state: \"products\",\n });\n }\n };\n\n function getProductTypeName(type: UserProductType) {\n switch (type) {\n case UserProductType.AUDIO:\n return \"Audio\";\n case UserProductType.FILE:\n return \"Plik\";\n case UserProductType.TICKET:\n return \"Bilet\";\n case UserProductType.COURSE:\n return \"Kurs\";\n default:\n return undefined;\n }\n }\n\n function handleSelectedProduct(product: UserProduct) {\n // A course opens in its own screen, not in the product details.\n if (product.productType === UserProductType.COURSE) {\n openCourse(product.accessId);\n return;\n }\n setSelectedProduct(product);\n reveal(product);\n }\n\n if (activeScreen === \"products\" && selectedProduct != undefined) {\n return (\n <PanelProductDetails\n accessToken={accessToken}\n product={selectedProduct}\n styles={styles}\n reveal={reveal}\n onOpenCourse={openCourse}\n />\n );\n }\n\n return (\n <>\n <h3 className=\"text-2xl\">Hej 👋</h3>\n <p className=\"text-sm text-neutral-500\">\n Poniżej znajdziesz swoje produkty\n </p>\n <div className=\"mt-6 flex flex-wrap items-center justify-center gap-9 sm:justify-start\">\n {products?.map((product, index) => (\n <section\n onClick={() => handleSelectedProduct(product)}\n key={index}\n className=\"w-full max-w-xs cursor-pointer rounded drop-shadow-xl dark:border dark:border-slate-600 dark:drop-shadow-none\"\n >\n <section className=\"flex flex-col items-center space-y-2 rounded bg-slate-100 p-4 dark:bg-neutral-900\">\n {product.productType && (\n <div className=\"w-fit self-end rounded bg-red-900 px-4 py-1\">\n <span className=\"text-sm font-medium text-white dark:text-slate-100\">\n {getProductTypeName(product.productType)}\n </span>\n </div>\n )}\n <div className=\"jusitfy-center flex max-h-40 items-center\">\n <img\n src={product.productImageUrl}\n alt={`Product ${index} Photo`}\n draggable={false}\n className=\"aspect-auto max-h-40\"\n />\n </div>\n </section>\n <div className=\"space-y-4 rounded bg-white p-4 dark:bg-black\">\n <h2 className=\"text-xl font-semibold\">{product.productName}</h2>\n <p\n title={product.productDescription}\n className=\"line-clamp-3 text-sm font-normal text-neutral-600 dark:text-neutral-300\"\n >\n {renderText(product.productDescription)}\n </p>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n handleSelectedProduct(product);\n }}\n className=\"w-full text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n Zobacz\n </Button>\n </div>\n </section>\n ))}\n </div>\n </>\n );\n};\n","const URL_REGEX =\n /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)/g;\n\ntype Replacements = {\n url: string;\n startIndex: number;\n endIndex: number;\n replacementText?: string;\n};\n\nconst findURLIndices = (text: string) => {\n const matches = [...text.matchAll(URL_REGEX)];\n return matches.map(\n (match) =>\n ({\n url: match[0],\n startIndex: match.index,\n endIndex: match.index + match[0].length - 1,\n }) as Replacements,\n );\n};\n\nconst replaceTextByIndices = (\n originalText: string,\n replacements: Replacements[],\n) => {\n let result = \"\";\n let lastIndex = 0;\n\n // Sort replacements by startIndex to handle them in order\n replacements.sort((a, b) => a.startIndex - b.startIndex);\n\n for (const { startIndex, endIndex, replacementText } of replacements) {\n // Append text before the current replacement\n result += originalText.slice(lastIndex, startIndex);\n // Append the replacement text\n result += replacementText;\n // Update lastIndex to after the replaced segment\n lastIndex = endIndex + 1;\n }\n\n // Append any remaining text after the last replacement\n result += originalText.slice(lastIndex);\n\n return result;\n};\n\nexport const renderText = (txt: string) => {\n const urlIndices = findURLIndices(txt);\n\n return (\n <p\n dangerouslySetInnerHTML={{\n __html: replaceTextByIndices(\n txt,\n urlIndices.map((el) => {\n el[\"replacementText\"] =\n `<a key=${el.url} href=${el.url} style=\"text-decoration: underline;\" target=\"_blank\">\n ${el.url}\n </a>`;\n return el;\n }),\n ),\n }}\n ></p>\n );\n};\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { ChevronLeft, Download } from \"lucide-react\";\nimport { useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport {\n UserProductType,\n type UserPanelGetAudiobookDetailsDownloadURLsResponse_AudiobookDownloadDetails,\n type UserProduct,\n} from \"../../gen/proto/public/v1/public_api_pb\";\nimport { useInstrumentContext } from \"../../analytics/instrument\";\nimport { cn } from \"../../lib/utils\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport AudioPlayer, {\n type AudioPlayerMethods,\n} from \"../audio-player/AudioPlayer\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport { getPanelTexts } from \"../texts\";\n\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface PanelProductDetailsProps {\n accessToken: string;\n product: UserProduct;\n styles: CSSProperties;\n reveal: (product?: UserProduct) => void;\n /** Opens the course screen of a course product. */\n onOpenCourse: (accessId: string) => void;\n}\n\nfunction warn(message: string, ...args: unknown[]) {\n console.warn(message, ...args);\n}\n\nfunction error(message: string) {\n console.error(message);\n}\n\nconst PanelProductDetails = ({\n accessToken,\n product,\n styles,\n reveal,\n onOpenCourse,\n}: PanelProductDetailsProps) => {\n const productType: UserProductType = product.productType;\n const instrument = useInstrumentContext();\n const trackDownload = () =>\n instrument.track(\n \"panel_download\",\n {},\n { product_id: product.productId.length <= 64 ? product.productId : null },\n );\n\n const audioPlayerRef = useRef<AudioPlayerMethods>(null!);\n const [filesRefAnimation] = useAutoAnimate();\n const [filesResponse, setFilesResponse] = useState<string[] | null>(null);\n const { mutateAsync: fileDetailsAsync, isPending: isFileLoading } =\n useMutation(rpcProvider.publicApi.userPanelGetFileDetails);\n\n const audioPlayerSeekToHandler = useRef<\n ((second: number) => void) | undefined\n >(undefined);\n const [audioResponse, setAudioResponse] = useState<Record<\n string,\n unknown\n > | null>(null);\n const [audioDownloadURLs, setAudioDownloadURLs] = useState<\n | UserPanelGetAudiobookDetailsDownloadURLsResponse_AudiobookDownloadDetails[]\n | null\n >(null);\n const [\n isAvailableToDownloadInMobileApp,\n setIsAvailableToDownloadInMobileApp,\n ] = useState(false);\n const { mutateAsync: audioDetailsAsync, isPending: isAudioLoading } =\n useMutation(rpcProvider.publicApi.userPanelGetAudiobookDetails);\n const {\n mutateAsync: audioDetailsDownloadURLsAsync,\n isPending: isAudioDownloadURLsLoading,\n } = useMutation(\n rpcProvider.publicApi.userPanelGetAudiobookDetailsDownloadURLs,\n );\n\n type ChapterWithPublicUrl = {\n id: string;\n multimediaId?: string;\n name: string;\n description?: string;\n publicUrl: string;\n downloadableUrl?: string;\n duration?: number;\n };\n\n const [selectedChapter, setSelectedChapter] =\n useState<ChapterWithPublicUrl | null>(null);\n const [chapters, setChapters] = useState<ChapterWithPublicUrl[] | null>(null);\n\n async function handleFileDownload() {\n try {\n const filesResult = await fileDetailsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n });\n\n if (filesResult.result.case === \"success\") {\n setFilesResponse(filesResult.result.value.files);\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", filesResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n async function handleAudioDownload() {\n try {\n const audioResult = await audioDetailsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n });\n\n if (audioResult.result.case === \"audiobook\") {\n setAudioResponse(\n audioResult.result.value as unknown as Record<string, unknown>,\n );\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", audioResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n async function handleAudioURLsDownload() {\n try {\n const audioURLsResult = await audioDetailsDownloadURLsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n isBrowser: true,\n });\n\n if (audioURLsResult.result.case === \"success\") {\n setAudioDownloadURLs(\n audioURLsResult.result.value.audiobookDownloadDetails,\n );\n setIsAvailableToDownloadInMobileApp(\n audioURLsResult.result.value.isAvailableToDownloadInMobileApp ===\n true,\n );\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", audioURLsResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n useEffect(() => {\n if (productType === UserProductType.AUDIO) {\n handleAudioDownload().then().catch();\n handleAudioURLsDownload().then().catch();\n }\n }, []);\n\n useEffect(() => {\n if (audioResponse != null && audioDownloadURLs != null) {\n const audioChapters = (\n audioResponse as { chapters?: ChapterWithPublicUrl[] }\n ).chapters;\n if (!audioChapters) return;\n\n const mappedChapters = audioChapters\n .map((chapter) => {\n const details = audioDownloadURLs?.find(\n (el) => el.chapterId === chapter.id,\n );\n if (details == null) {\n return undefined;\n }\n return {\n ...chapter,\n publicUrl: details.publicUrl,\n downloadableUrl: details.downloadableUrl,\n duration: details.duration,\n } as ChapterWithPublicUrl;\n })\n .filter((el) => el != null);\n\n if (mappedChapters != undefined && mappedChapters.length > 0) {\n setChapters(mappedChapters);\n }\n }\n }, [audioResponse, audioDownloadURLs]);\n\n return (\n <div>\n <div className=\"mb-3 space-y-4 rounded bg-white p-4 dark:bg-black\">\n <Button onClick={() => reveal()} variant=\"ghost\" className=\"w-fit\">\n <ChevronLeft className=\"h-6 w-6\" />\n <span className=\"font-inter text-sm font-medium\">Wróć</span>\n </Button>\n </div>\n\n <main className=\"grid grid-cols-1 justify-center gap-6 sm:justify-start lg:grid-cols-2\">\n <div className=\"flex w-full max-w-xl flex-col gap-6\">\n {productType === UserProductType.FILE && (\n <div\n ref={filesRefAnimation}\n className=\"flex flex-col space-y-4 rounded bg-white p-6 drop-shadow-xl dark:border dark:border-neutral-700 dark:bg-neutral-800 dark:drop-shadow-none\"\n >\n <div className=\"flex items-center justify-between gap-x-4\">\n <h4 className=\"text-xl font-semibold\">Twoje pliki</h4>\n {(filesResponse == null || filesResponse.length == 0) && (\n <Button\n onClick={handleFileDownload}\n aria-label=\"Download Product\"\n className=\"text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n {isFileLoading ? <LoadingIndicator /> : \"Wyświetl\"}\n </Button>\n )}\n </div>\n\n {isFileLoading && (\n <div className=\"flex flex-col items-start gap-2\">\n <ProgressBar />\n <p className=\"font-bold transition hover:text-blue-600\">\n Trwa przygotowanie plików...\n </p>\n </div>\n )}\n\n {filesResponse != null && filesResponse.length > 0 && (\n <div className=\"flex flex-col items-start justify-start gap-2\">\n {filesResponse.map((el, index) => (\n <a\n key={index}\n target=\"_blank\"\n className=\"flex w-fit items-center gap-2 rounded-md bg-neutral-800 px-3 py-2 text-neutral-200 dark:bg-neutral-200 dark:text-neutral-800\"\n href={el}\n download\n onClick={trackDownload}\n >\n {`Plik numer ${index + 1}`}\n <Download width={14} height={14} />\n </a>\n ))}\n </div>\n )}\n </div>\n )}\n\n {productType === UserProductType.COURSE && (\n <div className=\"flex flex-col items-center justify-center rounded-xl bg-white p-6 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <Button\n onClick={() => onOpenCourse(product.accessId)}\n className=\"text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n {getPanelTexts().openCourse}\n </Button>\n </div>\n )}\n\n {productType === UserProductType.AUDIO && (\n <>\n <div className=\"flex flex-col space-y-6 rounded-xl bg-white p-3 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <h4 className=\"text-xl font-semibold\">\n {selectedChapter?.name ?? \"Odtwarzacz\"}\n </h4>\n {selectedChapter?.description && (\n <p className=\"text-sm\">{selectedChapter?.description}</p>\n )}\n <>\n {isAudioLoading ? (\n <div className=\"flex gap-2\">\n <LoadingIndicator />\n <p className=\"text-xl font-semibold\">\n Trwa pobierania audiobooka...\n </p>\n </div>\n ) : (\n <>\n {chapters != null ? (\n <>\n <AudioPlayer\n ref={audioPlayerRef}\n chapters={chapters}\n title={\n (audioResponse as { name?: string })?.name ??\n product.productName ??\n undefined\n }\n imageURL={\n (audioResponse as { coverImage?: string })\n ?.coverImage ??\n product.productImageUrl ??\n undefined\n }\n styles={styles}\n setCurrentTimeHandler={(handler) => {\n audioPlayerSeekToHandler.current = handler;\n }}\n uniqueProductID={product.productId}\n onChapterChange={(chapter) => {\n setSelectedChapter(chapter);\n }}\n />\n </>\n ) : (\n <p className=\"mt-2\">\n Wybierz rozdział, który cię interesuje.\n </p>\n )}\n </>\n )}\n </>\n <div className=\"rounded-xl bg-neutral-100 p-3 dark:bg-neutral-800\">\n <p className=\"mt-3 mb-3 text-xs\">\n {isAvailableToDownloadInMobileApp\n ? \"Możesz słuchać tego audiobooka w aplikacji również bez dostępu do internetu.\"\n : \"Możesz słuchać tego audiobooka w aplikacji.\"}\n </p>\n <div className=\"flex gap-3\">\n <a href=\"https://apps.apple.com/us/app/bitsnap/id6741902807\">\n <img\n width=\"100\"\n src=\"https://bitsnap.pl/appstore.svg\"\n alt=\"Pobierz aplikacje z AppStore\"\n />\n </a>\n\n <a href=\"https://docs.bitsnap.pl/guides/audiobook\">\n <img\n width=\"100\"\n src=\"https://bitsnap.pl/playstore.svg\"\n alt=\"Pobierz aplikację z GooglePlay\"\n />\n </a>\n </div>\n </div>\n </div>\n </>\n )}\n\n <div className=\"flex items-center justify-center rounded-xl bg-white p-3 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n {productType === UserProductType.AUDIO && (\n <div className=\"max-h-96 w-full overflow-y-auto\">\n {isAudioLoading ? (\n <div className=\"jusitfy-center flex flex-col items-center gap-2\">\n <LoadingIndicator />\n <p>Ładowanie rozdziałów...</p>\n </div>\n ) : (\n <div>\n <h2 className=\"mb-3 text-xl font-semibold\">Rozdziały</h2>\n {chapters == null ? (\n <p>Brak rozdziałów do wyświetlenia.</p>\n ) : (\n <ul className=\"flex w-full flex-col gap-2\">\n {chapters.map((chapter, index) => (\n <li\n key={index}\n className=\"flex items-center justify-between\"\n >\n <button\n className={cn(\n \"w-full rounded-lg p-2 text-left transition hover:bg-neutral-200 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-700\",\n selectedChapter?.id == chapter.id\n ? \"bg-neutral-200 dark:bg-neutral-700\"\n : \"bg-neutral-100 dark:bg-neutral-800 dark:text-neutral-300\",\n )}\n onClick={() => {\n audioPlayerRef.current.selectChapter(chapter);\n }}\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">\n {chapter.name}\n </p>\n {chapter.duration && (\n <span className=\"text-xs text-neutral-500\">\n {Math.floor(chapter.duration / 60)}:\n {String(\n Math.floor(chapter.duration % 60),\n ).padStart(2, \"0\")}\n </span>\n )}\n </div>\n {chapter.description && (\n <p className=\"mt-3 text-xs\">\n {chapter.description}\n </p>\n )}\n </button>\n\n {audioResponse &&\n (audioResponse as { isDownloadable?: boolean })\n .isDownloadable &&\n chapter.downloadableUrl && (\n <a\n href={chapter.downloadableUrl}\n onClick={trackDownload}\n >\n <Download width={14} height={14} />\n </a>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"w-full max-w-3xl space-y-6 rounded-xl bg-white p-6 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <h2 className=\"text-3xl font-semibold\">{product.productName}</h2>\n <p className=\"text-sm font-normal text-neutral-600 dark:text-neutral-300\">\n {product.productDescription}\n </p>\n\n <img\n src={product.productImageUrl}\n alt=\"Product Photo\"\n width={384}\n height={384}\n className=\"max-h-sm max-w-sm\"\n draggable={false}\n />\n </div>\n </main>\n </div>\n );\n};\n\nexport default PanelProductDetails;\n","import Hls from \"hls.js\";\nimport { Pause, Play } from \"lucide-react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { Button } from \"../../ui/button\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport {\n mediaSessionPause,\n mediaSessionPlay,\n mediaSessionUpdateDurationAndPosition,\n startMediaSessionCoordinator,\n stopMediaSessionCoordinator,\n} from \"./media.session.coordinator\";\n\nimport \"./audio-player.css\";\n\ntype ChapterWithPublicUrl = {\n id: string;\n multimediaId?: string;\n name: string;\n description?: string;\n publicUrl: string;\n downloadableUrl?: string;\n duration?: number;\n};\n\nexport type AudioPlayerMethods = {\n selectChapter: (chapter: ChapterWithPublicUrl) => void;\n};\n\ntype AudioPlayerProps = {\n chapters: ChapterWithPublicUrl[];\n styles: CSSProperties;\n updateCurrentTime?: (currentTime: number) => void;\n\n title?: string;\n imageURL?: string;\n\n setCurrentTimeHandler?: (seekTo: (second: number) => void) => void;\n uniqueProductID: string;\n\n onChapterChange?: (chapter: ChapterWithPublicUrl) => void;\n};\n\nconst AudioPlayer = forwardRef<AudioPlayerMethods, AudioPlayerProps>(\n (\n {\n chapters,\n styles,\n updateCurrentTime,\n setCurrentTimeHandler,\n title,\n imageURL,\n uniqueProductID,\n onChapterChange,\n },\n ref,\n ) => {\n enum PlayState {\n Playing,\n Paused,\n }\n\n const [playState, setPlayState] = useState<PlayState>(PlayState.Paused);\n\n useEffect(() => {\n switch (playState) {\n case PlayState.Playing:\n mediaSessionPlay();\n break;\n case PlayState.Paused:\n mediaSessionPause();\n break;\n }\n }, [playState]);\n\n useImperativeHandle(ref, () => {\n return {\n selectChapter: (chapter: ChapterWithPublicUrl) => {\n playChapter(chapter);\n },\n };\n });\n\n const [currentTime, setCurrentTime] = useState<number | undefined>(\n undefined,\n );\n const [duration, setDuration] = useState<number | undefined>(undefined);\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const hlsRef = useRef<Hls | undefined>(undefined);\n const timerRef = useRef<number | undefined>(undefined);\n\n const audioPlayerContainerRef = useRef<HTMLDivElement>(null!);\n\n const currentChapterRef = useRef<ChapterWithPublicUrl | null>(null);\n\n const [playWhenReady, setPlayWhenReady] = useState(true);\n const [isStarted, setIsStarted] = useState(false);\n const [isLoading, setIsLoading] = useState(!isSafari());\n\n function saveLastPlayedTime(timeInSeconds: number) {\n if (timeInSeconds < 10) {\n return;\n }\n localStorage.setItem(\n `__player__${uniqueProductID}_${currentChapterRef.current?.id}`,\n `${timeInSeconds}`,\n );\n }\n\n function getLastPlayedTime(): number | undefined {\n const time = localStorage.getItem(\n `__player__${uniqueProductID}_${currentChapterRef.current?.id}`,\n );\n\n if (time == null) {\n return undefined;\n }\n try {\n const result = parseInt(time);\n\n if (isNaN(result) || result < 0) {\n return undefined;\n }\n\n return result;\n } catch (e) {\n return undefined;\n }\n }\n\n function getLastSelectedChapterID(): string | undefined {\n const lastSelectedChapterID = localStorage.getItem(\n `__player__${uniqueProductID}_last_chapter`,\n );\n if (lastSelectedChapterID == null) {\n return undefined;\n }\n return lastSelectedChapterID;\n }\n\n function setLastSelectedChapterID(chapterID: string) {\n localStorage.setItem(\n `__player__${uniqueProductID}_last_chapter`,\n chapterID,\n );\n }\n\n function deleteMemoryChapter(chapterID: string) {\n localStorage.removeItem(`__player__${uniqueProductID}_${chapterID}`);\n }\n\n function setupObservers() {\n if (videoRef.current == null) {\n return;\n }\n videoRef.current.onloadeddata = () => {\n if (videoRef.current == null) {\n return;\n }\n if (videoRef.current.readyState < 2) {\n setIsLoading(true);\n }\n if (videoRef.current.readyState >= 2) {\n setIsLoading(false);\n }\n\n if (!isStarted) {\n const lastPlayedTime = getLastPlayedTime();\n if (lastPlayedTime != undefined) {\n seekTo(lastPlayedTime);\n }\n setIsStarted(true);\n }\n if (playWhenReady) {\n setPlayWhenReady(false);\n try {\n play();\n } catch (e) {\n console.log(\"play error\", e);\n }\n }\n };\n videoRef.current.onplay = () => {};\n\n videoRef.current.onseeked = () => {};\n videoRef.current.onseeking = () => {};\n\n videoRef.current.onpause = () => {};\n\n videoRef.current.onended = () => {\n playNextChapter();\n };\n\n startMediaSessionCoordinator({\n title: title ?? \"\",\n artwork: imageURL,\n action: (details) => {\n switch (details.action) {\n case \"play\":\n play();\n break;\n case \"pause\":\n pause();\n break;\n case \"seekbackward\":\n seekBy(-15);\n break;\n case \"seekforward\":\n seekBy(15);\n break;\n case \"seekto\":\n if (details.seekTime) {\n seekTo(details.seekTime);\n }\n break;\n case \"stop\":\n pause();\n break;\n default:\n break;\n }\n },\n });\n\n startTimer();\n }\n\n function playNextChapter() {\n if (chapters == null || chapters.length == 0) {\n return;\n }\n const currentChapterIndex = chapters.findIndex(\n (chapter) => chapter.id == currentChapterRef.current?.id,\n );\n if (currentChapterIndex == -1) {\n return;\n }\n deleteMemoryChapter(chapters[currentChapterIndex].id);\n const nextChapterIndex = currentChapterIndex + 1;\n if (nextChapterIndex >= chapters.length) {\n return;\n }\n playChapter(chapters[currentChapterIndex + 1]);\n }\n\n function startTimer() {\n updatePlayerDetails();\n if (timerRef.current != null) return;\n\n timerRef.current = setTimeout(() => {\n updatePlayerDetails();\n timerRef.current = undefined;\n startTimer();\n }, 500) as unknown as number;\n }\n\n function stopTimer() {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current as unknown as number);\n }\n\n function updatePlayerDetails() {\n if (videoRef.current == null) {\n return;\n }\n setPlayState(\n videoRef.current.paused ? PlayState.Paused : PlayState.Playing,\n );\n setDuration(videoRef.current.duration);\n setCurrentTime(videoRef.current.currentTime);\n saveLastPlayedTime(videoRef.current.currentTime);\n mediaSessionUpdateDurationAndPosition(\n videoRef.current.duration,\n videoRef.current.currentTime,\n );\n if (\n videoRef.current.networkState === videoRef.current.NETWORK_LOADING &&\n videoRef.current.readyState <= videoRef.current.HAVE_FUTURE_DATA\n ) {\n setIsLoading(true);\n } else {\n setIsLoading(false);\n }\n if (updateCurrentTime) {\n updateCurrentTime(videoRef.current.currentTime);\n }\n }\n\n function play() {\n videoRef.current?.play().then().catch();\n updatePlayerDetails();\n }\n\n function pause() {\n videoRef.current?.pause();\n updatePlayerDetails();\n }\n\n function togglePlayState() {\n if (playState === PlayState.Playing) {\n pause();\n return;\n }\n play();\n }\n\n function seekBy(seconds: number) {\n if (videoRef.current == null) {\n return;\n }\n const newTime = videoRef.current.currentTime + seconds;\n if (newTime < 0) {\n videoRef.current.currentTime = 0;\n return;\n }\n if (newTime > videoRef.current.duration) {\n videoRef.current.currentTime = videoRef.current.duration;\n return;\n }\n videoRef.current.currentTime += seconds;\n }\n\n function seekTo(toSecond: number) {\n if (videoRef.current == null) {\n return;\n }\n setCurrentTime(toSecond);\n if (toSecond < 0) {\n videoRef.current.currentTime = 0;\n return;\n }\n if (toSecond > videoRef.current.duration) {\n videoRef.current.currentTime = videoRef.current.duration;\n return;\n }\n videoRef.current.currentTime = toSecond;\n }\n\n function destroyPlayer() {\n if (videoRef.current == null) {\n return;\n }\n videoRef.current.onplay = null;\n videoRef.current.onseeked = null;\n videoRef.current.onseeking = null;\n videoRef.current.onpause = null;\n videoRef.current.onended = null;\n videoRef.current.src = \"\";\n hlsRef.current?.destroy();\n }\n\n function loadChapters(chapters: ChapterWithPublicUrl[]) {\n if (chapters.length == 0) {\n return;\n }\n\n const chapterID = getLastSelectedChapterID();\n if (chapterID == null) {\n playChapter(chapters[0]);\n return;\n }\n\n const chapter = chapters.find((chapter) => chapter.id == chapterID);\n if (chapter == null) {\n playChapter(chapters[0]);\n return;\n }\n\n playChapter(chapter);\n }\n\n function playChapter(chapter: ChapterWithPublicUrl) {\n setIsStarted(false);\n setPlayWhenReady(true);\n currentChapterRef.current = chapter;\n playURL(chapter.publicUrl);\n onChapterChange?.(chapter);\n setLastSelectedChapterID(chapter.id);\n }\n\n function playURL(src: string) {\n if (videoRef.current == null) {\n return;\n }\n if (videoRef.current.canPlayType(\"application/vnd.apple.mpegurl\")) {\n videoRef.current.src = src;\n } else if (Hls.isSupported()) {\n if (hlsRef.current == null) {\n hlsRef.current = new Hls();\n hlsRef.current?.attachMedia(videoRef.current);\n }\n hlsRef.current?.loadSource(src);\n }\n }\n\n useEffect(() => {\n if (videoRef.current == null) {\n return;\n }\n setupObservers();\n loadChapters(chapters);\n }, [videoRef.current]);\n\n useEffect(() => {\n loadChapters(chapters);\n }, [chapters]);\n\n useEffect(() => {\n if (setCurrentTimeHandler != null) {\n setCurrentTimeHandler(seekTo);\n }\n\n return () => {\n setCurrentTime(undefined);\n videoRef.current?.pause();\n destroyPlayer();\n stopMediaSessionCoordinator();\n };\n }, []);\n\n const calculateTime = (secs: number) => {\n const hours = Math.floor(secs / 3600);\n const minutes = Math.floor(secs / 60) % 60;\n const seconds = Math.floor(secs % 60);\n const returnedHours =\n hours > 0 ? (hours < 10 ? `0${hours}:` : `${hours}:`) : \"\";\n const returnedSeconds = seconds < 10 ? `0${seconds}` : `${seconds}`;\n if (isNaN(seconds) || isNaN(minutes) || isNaN(hours)) {\n return \"\";\n }\n return `${returnedHours}${minutes}:${returnedSeconds}`;\n };\n\n const showRangeProgress = (rangeInput: HTMLInputElement) => {\n const barProgress =\n (parseFloat(rangeInput.value) / parseFloat(rangeInput.max)) * 100;\n audioPlayerContainerRef.current.style.setProperty(\n \"--seek-before-width\",\n barProgress + \"%\",\n );\n\n const selectedTime = (duration! * barProgress) / 100;\n seekTo(selectedTime);\n };\n\n return (\n <div\n id=\"audio-player-container\"\n className=\"flex flex-col\"\n style={styles}\n ref={audioPlayerContainerRef}\n >\n <video\n ref={videoRef}\n className=\"hidden\"\n poster={imageURL}\n title={title}\n ></video>\n\n <input\n type=\"range\"\n min=\"0\"\n max={duration != undefined ? Math.floor(duration).toString() : 100}\n value={currentTime ?? 0}\n onChange={(e) => showRangeProgress(e.target as HTMLInputElement)}\n className=\"w-full\"\n />\n\n <section className=\"flex w-full items-center justify-between text-sm font-medium\">\n <span id=\"current-time\">{calculateTime(currentTime!)}</span>\n <span id=\"duration\">{calculateTime(duration!)}</span>\n </section>\n <div className=\"mt-6 flex items-center justify-center gap-x-12\">\n <Button\n variant=\"outline\"\n onClick={() => seekBy(-10)}\n aria-label=\"Rewind 10 Seconds\"\n >\n -10\n </Button>\n <Button\n variant=\"outline\"\n onClick={togglePlayState}\n aria-label=\"Play Or Pause\"\n >\n {playState === PlayState.Paused && <Play className=\"h-5 w-5\" />}\n {playState === PlayState.Playing && <Pause className=\"h-5 w-5\" />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => seekBy(10)}\n aria-label=\"Fast Forward 10 Seconds\"\n >\n +10\n </Button>\n </div>\n {isLoading && (\n <div className=\"mt-2 flex w-full justify-center\">\n <LoadingIndicator />\n </div>\n )}\n </div>\n );\n },\n);\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf(\"safari/\") > -1;\n}\n\nexport default AudioPlayer;\n","export function mediaSessionPlay() {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.playbackState = \"playing\";\n}\n\nexport function mediaSessionPause() {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.playbackState = \"paused\";\n}\n\nexport function mediaSessionUpdateDurationAndPosition(\n duration: number | undefined,\n currentTime: number | undefined,\n) {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n if (duration != null && isNaN(duration)) {\n return;\n }\n if (currentTime != null && isNaN(currentTime)) {\n return;\n }\n navigator.mediaSession.setPositionState({\n playbackRate: 1,\n duration: duration,\n position: currentTime,\n });\n}\n\nexport function startMediaSessionCoordinator(args: {\n title: string;\n artwork?: string;\n\n action: (details: MediaSessionActionDetails) => void;\n}) {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.metadata = new MediaMetadata({\n title: args.title,\n artwork: args.artwork\n ? [\n {\n type: \"image/png\",\n src: args.artwork,\n },\n ]\n : undefined,\n });\n\n navigator.mediaSession.setActionHandler(\"play\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"pause\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"stop\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekbackward\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekforward\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekto\", (e) => {\n args.action(e);\n });\n}\n\nexport function stopMediaSessionCoordinator() {\n navigator.mediaSession.metadata = null;\n}\n","import { getLocale } from \"../components/checkout/locale\";\nimport { pickLocaleTable, type LocaleTables } from \"../lib/texts\";\n\n/** Panel strings that are not part of the returns views. */\nexport type PanelTexts = {\n returnsNavLabel: string;\n openCourse: string;\n};\n\nconst PANEL_TEXT_TABLES: LocaleTables<keyof PanelTexts> = {\n pl: { returnsNavLabel: \"Zwroty\", openCourse: \"Otwórz kurs\" },\n en: { returnsNavLabel: \"Returns\", openCourse: \"Open the course\" },\n};\n\n/** Panel strings for the library locale (`setLocale`), Polish by default. */\nexport function getPanelTexts(locale: string = getLocale()): PanelTexts {\n return pickLocaleTable(PANEL_TEXT_TABLES, locale);\n}\n","export function ProgressBar() {\n const [progress, setProgress] = React.useState(13);\n\n React.useEffect(() => {\n const timer = setTimeout(() => setProgress(66), 500);\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <div className=\"w-[60%] h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div \n className=\"h-full bg-blue-600 transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n );\n}\n\nimport * as React from \"react\";\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { LogOut, Undo2 } from \"lucide-react\";\nimport { useState, type CSSProperties, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../ui/button\";\nimport type { GetThemeOutput } from \"../types\";\n\nimport type { PanelScreen } from \"../types\";\nimport { getPanelTexts } from \"../texts\";\n\ninterface PanelProductHeaderComponentProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n styles: CSSProperties;\n theme?: GetThemeOutput;\n logout: () => void;\n}\n\nfunction PanelProductHeaderComponent({\n activeScreen,\n setActiveScreen,\n setParams,\n styles: _styles,\n theme,\n logout,\n}: PanelProductHeaderComponentProps) {\n return (\n <header className=\"md:border-r-neutral-150 md:bg-beige-50 fixed right-0 bottom-0 left-0 z-10 flex h-12 w-full items-center bg-neutral-800 md:static md:z-0 md:min-h-screen md:w-auto md:border-r dark:md:border-r-neutral-900\">\n <MobileMenu\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <SidebarMenu\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n theme={theme}\n logout={logout}\n />\n </header>\n );\n}\n\nexport default PanelProductHeaderComponent;\n\ninterface MobileMenuProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n}\n\nfunction MobileMenu({\n activeScreen,\n setActiveScreen,\n setParams,\n}: MobileMenuProps) {\n const { returnsNavLabel } = getPanelTexts();\n\n return (\n <nav className=\"flex w-full items-center justify-evenly gap-4 md:hidden\">\n <MobileButton\n panelScreen=\"products\"\n label=\"Produkty\"\n imageURL=\"/icons/bitsnap-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"orders\"\n label=\"Faktury\"\n imageURL=\"/icons/category-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"returns\"\n label={returnsNavLabel}\n icon={<Undo2 className=\"h-5 w-5 text-white\" aria-hidden />}\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"profile\"\n label=\"Profil\"\n imageURL=\"/icons/profile-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n </nav>\n );\n}\n\ninterface MobileButtonProps {\n panelScreen: PanelScreen;\n label: string;\n imageURL?: string;\n icon?: ReactNode;\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n}\n\nfunction MobileButton({\n panelScreen,\n label,\n imageURL,\n icon,\n activeScreen,\n setActiveScreen,\n setParams,\n}: MobileButtonProps) {\n return (\n <Button\n onClick={() => {\n setActiveScreen(panelScreen);\n setParams({\n product: undefined,\n state: panelScreen,\n });\n }}\n aria-label={label}\n variant={null}\n className={cn(\n \"flex flex-col gap-0\",\n activeScreen === panelScreen ? \"opacity-100\" : \"opacity-50\",\n )}\n >\n {icon ?? <img src={imageURL} alt={label} className=\"scale-75\" />}\n <span className=\"text-xs font-normal text-white\">{label}</span>\n </Button>\n );\n}\n\ninterface SidebarButtonProps {\n panelScreen: PanelScreen;\n label: string;\n imageURL?: string;\n darkImageURL?: string;\n icon?: ReactNode;\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n isExpanded: boolean;\n}\n\nfunction SidebarButton({\n panelScreen,\n label,\n imageURL,\n darkImageURL,\n icon,\n activeScreen,\n setActiveScreen,\n setParams,\n isExpanded,\n}: SidebarButtonProps) {\n return (\n <Button\n onClick={() => {\n setActiveScreen(panelScreen);\n setParams({\n product: undefined,\n state: panelScreen,\n });\n }}\n variant={activeScreen === panelScreen ? \"secondary\" : \"ghost\"}\n className=\"justify-start\"\n >\n {icon != null ? (\n <span\n className={cn(\n \"inline-flex h-5 w-5 items-center justify-center\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n >\n {icon}\n </span>\n ) : (\n <>\n <img\n src={imageURL}\n alt={label}\n className={cn(\n \"aspect-auto h-5 w-5 dark:hidden\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n />\n <img\n src={darkImageURL}\n alt={label}\n className={cn(\n \"hidden aspect-auto h-5 w-5 dark:inline\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n />\n </>\n )}\n {isExpanded && (\n <span className=\"md:text-medium hidden md:inline\">{label}</span>\n )}\n </Button>\n );\n}\n\ninterface SidebarMenuProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n theme?: GetThemeOutput;\n logout: () => void;\n}\n\nfunction SidebarMenu({\n activeScreen,\n setActiveScreen,\n setParams,\n theme,\n logout,\n}: SidebarMenuProps) {\n const [sidebarExpandRef] = useAutoAnimate();\n const [isExpanded, setIsExpanded] = useState(true);\n const { returnsNavLabel } = getPanelTexts();\n\n return (\n <div\n ref={sidebarExpandRef}\n className={cn(\n \"hidden px-4 pt-4 pb-12 md:flex md:h-full md:flex-col dark:bg-neutral-900\",\n isExpanded ? \"md:w-52\" : \"md:w-16\",\n )}\n >\n <div className=\"flex items-center justify-between\">\n <CompanyLogo theme={theme} isExpanded={isExpanded} />\n </div>\n\n <SidebarSeparator className=\"my-6\" />\n\n <div className=\"flex flex-1 flex-col gap-2\">\n <SidebarButton\n panelScreen=\"products\"\n label=\"Produkty\"\n imageURL=\"/icons/bitsnap-dark-24x24.svg\"\n darkImageURL=\"/icons/bitsnap-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"orders\"\n label=\"Zamówienia\"\n imageURL=\"/icons/category-dark-24x24.svg\"\n darkImageURL=\"/icons/category-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"returns\"\n label={returnsNavLabel}\n icon={<Undo2 className=\"h-5 w-5\" aria-hidden />}\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"profile\"\n label=\"Profil\"\n imageURL=\"/icons/profile-dark-24x24.svg\"\n darkImageURL=\"/icons/profile-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n </div>\n\n <SidebarSeparator className=\"mb-6\" />\n\n <Button onClick={logout}>\n <LogOut className=\"mr-2\" width={16} height={16} />\n {isExpanded && (\n <p className=\"md:text-medium hidden md:inline md:text-center\">\n Wyloguj się\n </p>\n )}\n </Button>\n </div>\n );\n}\n\ninterface SidebarSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nfunction SidebarSeparator({ className }: SidebarSeparatorProps) {\n return (\n <div className={cn(\"relative h-px w-full bg-neutral-300\", className)}>\n <div className=\"absolute -top-px left-0 h-1 w-1 rounded-full bg-neutral-500\"></div>\n <div className=\"absolute -top-px right-0 h-1 w-1 rounded-full bg-neutral-500\"></div>\n </div>\n );\n}\n\ninterface CompanyLogoProps {\n theme?: GetThemeOutput;\n isExpanded: boolean;\n}\n\nfunction CompanyLogo({ theme, isExpanded: _isExpanded }: CompanyLogoProps) {\n return (\n <>\n {theme == null && (\n <p className=\"text-xl tracking-wider md:inline dark:text-neutral-200\">\n bitsnap.\n </p>\n )}\n {(theme?.logoDarkURL || theme?.logoURL) && (\n <img\n src={theme.logoDarkURL ?? theme.logoURL}\n alt=\"Company Logo\"\n className=\"hidden h-6 w-6 dark:inline\"\n draggable={false}\n />\n )}\n\n {theme?.logoURL && (\n <img\n src={theme.logoURL}\n alt=\"Company Logo\"\n className=\"h-6 w-6 dark:hidden\"\n draggable={false}\n />\n )}\n </>\n );\n}\n","import { Button } from \"../../ui/button\";\nimport { LogOut } from \"lucide-react\";\n\ninterface PanelProfileComponentProps {\n email: string | null;\n logout: () => void;\n}\n\nfunction PanelProfileComponent({ email, logout }: PanelProfileComponentProps) {\n return (\n <>\n <h3 className=\"text-2xl\">Profil</h3>\n <div className=\"mt-6 flex-1 md:flex-none\">\n <span className=\"text-sm text-neutral-500\">Email</span>\n <p className=\"mt-2 text-base\">{email ? email : \"Brak danych\"}</p>\n </div>\n <div className=\"flex w-full flex-col items-center space-y-2\">\n <Button onClick={logout} className=\"max-w-64 md:hidden\">\n <LogOut className=\"mr-2\" width={16} height={16} />\n <p className=\"text-medium inline text-center\">Wyloguj się</p>\n </Button>\n </div>\n </>\n );\n}\n\nexport default PanelProfileComponent;\n","import { lazy, Suspense } from \"react\";\nimport type { PanelCourseProps } from \"../../course\";\nimport LoadingIndicator from \"../LoadingIndicator\";\n\n// The course view (video player, sanitizer, tests) is loaded when a customer\n// opens a course, so it does not weigh on the rest of the panel.\nconst PanelCourse = lazy(() =>\n import(\"../../course\").then((module) => ({\n default: module.PanelCourse,\n })),\n);\n\n/** `PanelCourse` loaded on demand. */\nexport default function LazyPanelCourse(props: PanelCourseProps) {\n return (\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 p-2\" role=\"status\">\n <LoadingIndicator />\n </div>\n }\n >\n <PanelCourse {...props} />\n </Suspense>\n );\n}\n","import {\n AlertCircle,\n CheckCircle2,\n ChevronLeft,\n Loader2,\n Lock,\n Package,\n Truck,\n} from \"lucide-react\";\nimport { useEffect, useState, type CSSProperties } from \"react\";\nimport { useInstrument, type AnalyticsOption } from \"../../analytics/instrument\";\nimport { rpcProvider, useMutation, useQuery } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../../ui/card\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Textarea } from \"../../ui/textarea\";\n\nimport { usePanelConfig } from \"../PanelProvider\";\n\ninterface Props {\n orderID: string;\n initialEmail?: string;\n accessToken?: string;\n onBack?: () => void;\n /**\n * Usage statistics for your Bitsnap dashboard (order viewed). Inside\n * `<Panel>` or `<PanelProvider>` their setting applies unless this is given.\n */\n analytics?: AnalyticsOption;\n}\n\nfunction StatusBadge({ status }: { status: string }) {\n const statusConfig: Record<\n string,\n { color: string; icon: typeof AlertCircle | null }\n > = {\n created: { color: \"bg-neutral-100 text-neutral-700\", icon: null },\n paid: { color: \"bg-green-100 text-green-700\", icon: CheckCircle2 },\n completed: { color: \"bg-blue-100 text-blue-700\", icon: CheckCircle2 },\n canceled: { color: \"bg-red-100 text-red-700\", icon: AlertCircle },\n sent: { color: \"bg-purple-100 text-purple-700\", icon: Truck },\n processing: { color: \"bg-yellow-100 text-yellow-700\", icon: Loader2 },\n };\n\n const config = statusConfig[status] || statusConfig.created;\n const Icon = config.icon;\n\n const statusLabels: Record<string, string> = {\n created: \"Utworzone\",\n paid: \"Opłacone\",\n completed: \"Zakończone\",\n canceled: \"Anulowane\",\n sent: \"Wysłane\",\n processing: \"Przetwarzane\",\n };\n\n return (\n <span\n className={`inline-flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium ${config.color}`}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {statusLabels[status] || status}\n </span>\n );\n}\n\nfunction AddCommentForm({\n orderID,\n email,\n}: {\n orderID: string;\n email: string;\n}) {\n const [message, setMessage] = useState(\"\");\n const addCommentMutation = useMutation(\n rpcProvider.publicApi.addPublicOrderComment,\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!message.trim()) return;\n\n try {\n await addCommentMutation.mutateAsync({\n projectId: \"\",\n orderId: orderID,\n message: message.trim(),\n accessToken: email,\n });\n setMessage(\"\");\n } catch (error) {\n console.error(\"Failed to add comment:\", error);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"mt-4 space-y-2\">\n <Label htmlFor=\"comment\">Dodaj komentarz</Label>\n <Textarea\n id=\"comment\"\n value={message}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setMessage(e.target.value)\n }\n placeholder=\"Wpisz komentarz...\"\n rows={3}\n disabled={addCommentMutation.isPending}\n />\n <Button\n type=\"submit\"\n disabled={!message.trim() || addCommentMutation.isPending}\n >\n {addCommentMutation.isPending ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Wysyłanie...\n </>\n ) : (\n \"Dodaj komentarz\"\n )}\n </Button>\n </form>\n );\n}\n\nfunction formatDate(timestamp: { seconds: bigint } | undefined): string {\n if (!timestamp) return \"N/A\";\n const date = new Date(Number(timestamp.seconds) * 1000);\n return date.toLocaleDateString(\"pl-PL\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\nfunction formatCurrency(amount: number, currency: string): string {\n return new Intl.NumberFormat(\"pl-PL\", {\n style: \"currency\",\n currency: currency.toUpperCase(),\n }).format(amount / 100);\n}\n\nfunction PublicOrderPageContent({\n orderID,\n initialEmail,\n onBack,\n accessToken,\n analytics,\n}: Props) {\n const { theme, projectID } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"order\");\n\n const [verifyEmail, setVerifyEmail] = useState(initialEmail || \"\");\n const [isVerifyDialogOpen, setIsVerifyDialogOpen] = useState(false);\n\n const {\n data: orderData,\n isLoading,\n error,\n refetch,\n } = useQuery(\n rpcProvider.publicApi.getPublicOrderDetails,\n {\n projectId: projectID ?? \"\",\n orderId: orderID,\n email: verifyEmail || undefined,\n accessToken: accessToken,\n },\n { enabled: !!orderID },\n );\n\n const order =\n orderData?.result.case === \"order\" ? orderData.result.value : null;\n const isVerified = order?.isVerified ?? false;\n\n const viewedOrder = order != null;\n useEffect(() => {\n if (viewedOrder) {\n // The id in the URL may be an access token: report no order reference.\n instrument.track(\"panel_order_viewed\", {}, { order_ref: null });\n }\n }, [instrument, viewedOrder]);\n\n const handleVerifyEmail = () => {\n refetch();\n setIsVerifyDialogOpen(false);\n };\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#000000\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#ffffff\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#000000\",\n } as CSSProperties;\n\n if (isLoading) {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"text-center\">\n <Loader2 className=\"mx-auto h-8 w-8 animate-spin text-neutral-400\" />\n <p className=\"mt-2 text-neutral-600 dark:text-neutral-400\">\n Ładowanie zamówienia...\n </p>\n </div>\n </div>\n );\n }\n\n if (error || !order) {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <Card className=\"w-full max-w-md\">\n <CardContent className=\"pt-6\">\n <div className=\"text-center\">\n <AlertCircle className=\"mx-auto h-12 w-12 text-red-500\" />\n <h2 className=\"mt-4 text-xl font-semibold\">\n Zamówienie nie znalezione\n </h2>\n <p className=\"mt-2 text-neutral-600 dark:text-neutral-400\">\n Nie znaleziono zamówienia o podanym numerze.\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"w-full bg-white py-8 dark:bg-black\" style={styles}>\n <div className=\"w-full px-4\">\n {onBack && (\n <Button onClick={onBack} variant=\"ghost\" className=\"mb-4 w-fit\">\n <ChevronLeft className=\"h-4 w-4\" />\n Wróć do historii zamówień\n </Button>\n )}\n <div className=\"mb-6 flex items-center gap-4\">\n {theme?.logoURL && (\n <>\n <img\n src={theme.logoURL}\n alt=\"Project logo\"\n className={`h-12 w-auto ${theme.logoDarkURL ? \"dark:hidden\" : \"\"}`}\n />\n {theme.logoDarkURL && (\n <img\n src={theme.logoDarkURL}\n alt=\"Project logo\"\n className=\"hidden h-12 w-auto dark:block\"\n />\n )}\n </>\n )}\n <div>\n <h1 className=\"text-3xl font-bold\">Zamówienie</h1>\n <p className=\"text-neutral-600 dark:text-neutral-400\">\n Numer zamówienia: #{order.orderId}\n </p>\n </div>\n </div>\n\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <Package className=\"mr-2 h-5 w-5\" />\n Status zamówienia\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={order.status} />\n {order.processingStatus && (\n <span className=\"text-sm text-neutral-600\">\n · {order.processingStatus}\n </span>\n )}\n </div>\n <p className=\"mt-2 text-sm text-neutral-600\">\n Zamówienie złożone {formatDate(order.createdAt)}\n </p>\n </div>\n\n <div className=\"border-t pt-4\">\n <h3 className=\"mb-3 font-semibold\">Dane klienta</h3>\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Imię i nazwisko:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerName}\n </span>\n </div>\n <div>\n <span className=\"font-medium\">Email:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerEmail}\n </span>\n </div>\n {order.customerPhone && (\n <div>\n <span className=\"font-medium\">Telefon:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerPhone}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {!isVerified && (\n <div className=\"border-t pt-4\">\n <Button\n onClick={() => setIsVerifyDialogOpen(true)}\n variant=\"outline\"\n className=\"w-full\"\n >\n <Lock className=\"mr-2 h-4 w-4\" />\n Zweryfikuj swój email\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle>Produkty</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4\">\n {order.items.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n {item.imageUrl && (\n <img\n src={item.imageUrl}\n alt={item.name}\n className=\"h-16 w-16 rounded object-cover\"\n />\n )}\n <div className=\"flex-1\">\n <p className=\"font-medium\">{item.name}</p>\n <p className=\"text-sm text-neutral-600\">\n Ilość: {item.quantity}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium\">\n {formatCurrency(Number(item.price), item.currency)}\n </p>\n </div>\n </div>\n ))}\n </div>\n\n {(order.deliveryAddress || order.deliveryMethod) && (\n <div className=\"border-t pt-4\">\n <h3 className=\"mb-3 flex items-center font-semibold\">\n <Truck className=\"mr-2 h-5 w-5\" />\n Informacje o dostawie\n </h3>\n <div className=\"space-y-2\">\n {order.deliveryAddress && (\n <div>\n <span className=\"font-medium\">Adres:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.deliveryAddress}\n </span>\n </div>\n )}\n {order.deliveryMethod && (\n <div>\n <span className=\"font-medium\">Metoda:</span>{\" \"}\n {order.deliveryMethod}\n </div>\n )}\n {order.trackingNumber && isVerified && (\n <div>\n <span className=\"font-medium\">Tracking:</span>{\" \"}\n {order.trackingNumber}\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"border-t pt-4\">\n <div className=\"flex justify-between text-lg font-bold\">\n <span>Suma:</span>\n <span>\n {formatCurrency(Number(order.totalAmount), order.currency)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n Komentarze {order.commentCount > 0 && `(${order.commentCount})`}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {order.comments.length > 0 ? (\n <div className=\"space-y-4\">\n {order.comments.map((comment) => (\n <div\n key={comment.id}\n className=\"border-b pb-4 last:border-b-0\"\n >\n <div className=\"mb-1 flex items-center gap-2\">\n <span className=\"font-medium\">\n {comment.authorName || \"System\"}\n </span>\n <span className=\"text-xs text-neutral-500\">\n {formatDate(comment.createdAt)}\n </span>\n {comment.authorType === \"admin\" && (\n <span className=\"rounded bg-blue-100 px-2 py-0.5 text-xs text-blue-700\">\n Admin\n </span>\n )}\n </div>\n <p className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {comment.message}\n </p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-neutral-600\">Brak komentarzy.</p>\n )}\n\n {isVerified ? (\n <AddCommentForm orderID={order.orderId} email={verifyEmail} />\n ) : (\n <div className=\"mt-4\">\n <Button\n onClick={() => setIsVerifyDialogOpen(true)}\n variant=\"outline\"\n className=\"w-full\"\n >\n <Lock className=\"mr-2 h-4 w-4\" />\n Zweryfikuj swój email\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {isVerifyDialogOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Zweryfikuj swój email</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-neutral-700\">\n Podaj adres email użyty przy składaniu zamówienia.\n </p>\n <div className=\"space-y-2\">\n <Label htmlFor=\"verify-email\">Adres email</Label>\n <Input\n id=\"verify-email\"\n type=\"email\"\n placeholder=\"twoj@email.com\"\n value={verifyEmail}\n onChange={(e) => setVerifyEmail(e.target.value)}\n />\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsVerifyDialogOpen(false)}\n className=\"flex-1\"\n >\n Anuluj\n </Button>\n <Button onClick={handleVerifyEmail} className=\"flex-1\">\n Zweryfikuj\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction PublicOrderPage(props: Props) {\n return <PublicOrderPageContent {...props} />;\n}\nexport default PublicOrderPage;\n","import { setAllowedReturnOrigins, setPanelConfig } from \"@/src/panel\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport {\n AddressSchema,\n BillingAddressSchema,\n} from \"src/gen/proto/common/v1/address_pb\";\nimport {\n GetPreOrderDetailsRequestSchema,\n OneClickAuthorizePaymentRequest_Gateway,\n PreOrderItemSchema,\n} from \"src/gen/proto/public/v1/public_api_pb\";\nimport { PublicApiClient } from \"src/public.api.client\";\nimport zod from \"zod\";\nimport { getCartInstrument, type Instrument } from \"@/src/analytics/instrument\";\nimport { withClientParam } from \"@/src/lib/client-header\";\nimport { HOST, setCustomHost } from \"./constants\";\nimport { sendAnalyticEvent } from \"./frontent.analytics\";\nimport { mapGooglePayConfiguration } from \"./google.pay.mapper\";\nimport { buildURL } from \"./helper.methods\";\nimport { Err, isErr } from \"./lib/err\";\nimport {\n cartItemURL,\n findMissingProductIDs,\n findProductForCartItem,\n} from \"./cart-items\";\nimport { round } from \"./lib/round.number\";\nimport { LinkRequest } from \"./link.request.schema\";\nimport {\n createPaymentURL,\n getReferenceIfPossible,\n injectReferenceToRequestIfNeeded,\n} from \"./methods\";\nimport { SingleProduct } from \"./product.details.model\";\nimport { useCheckoutStore } from \"./state\";\nimport { getLocale } from \"./locale\";\nimport { useCheckoutTextsConfig } from \"./texts.context\";\nimport { getCheckoutText, type CheckoutTexts } from \"./texts\";\nimport {\n orderStatusFromResponse,\n reconcilePendingOrder,\n subtractOrderLines,\n throttleOrderStatus,\n type PendingOrderLine,\n type PendingOrderOutcome,\n} from \"./pending-order\";\n\nexport const MARKETING_AGREEMENT_ID = \"__m_a\";\n\ntype CartProduct = {\n productID: string;\n quantity: number;\n metadata?: { [key: string]: string | undefined };\n /** Product page the cart item links to (image and name). */\n url?: string;\n\n // Those fields are used to send the price and currency to the analytics\n name?: string;\n price?: number;\n currency?: string;\n priceVersion?: string;\n\n /** Where `add_to_cart` is reported; defaults to the mounted `<BitsnapCheckout>`. */\n analytics?: Instrument;\n};\n\nexport interface CartMethods {\n checkIfApplePayIsAvailable(): Promise<boolean>;\n getGooglePayConfiguration(args: { items: CartProduct[] }): Promise<\n | {\n isAvailable: true;\n config: google.payments.api.PaymentDataRequest;\n }\n | {\n isAvailable: false;\n }\n >;\n\n addProduct(args: CartProduct): Promise<Err | void>;\n\n getProducts: () => Promise<\n | Err\n | {\n id: string;\n productID: string;\n quantity: number;\n metadata?: { [key: string]: string | undefined };\n /** Product page given when the item was added. */\n url?: string;\n details?: SingleProduct;\n /** The catalog product, when `productID` is one of its variants. */\n catalogProductID?: string;\n }[]\n >;\n\n updateQuantity(args: { id: string; quantity: number }): Promise<Err | void>;\n\n removeProductFromCart: (args: { id: string }) => Promise<Err | void>;\n\n clearCart: () => Promise<Err | void>;\n\n getNumberOfElementsInCart: () => Promise<number>;\n\n setCouponCodeIfPossible: (couponCode?: string) => Promise<Err | void>;\n setDeliveryMethod: (deliveryMethod?: string) => Promise<Err | void>;\n setPostalCode: (postalCode?: string) => Promise<Err | void>;\n setEmail: (email?: string) => Promise<Err | void>;\n setCountry: (country: string) => Promise<Err | void>;\n getCountry: () => Promise<Err | string>;\n getAvailableCountries: () => Promise<Err | { name: string; code: string }[]>;\n\n redirectToNextStep: () => Promise<\n Err | { url: string; orderId?: string; projectId?: string }\n >;\n\n getApplePayPaymentRequest: (args?: {\n expectedItems?: CartProduct[];\n }) => Promise<Err | ApplePayJS.ApplePayPaymentRequest>;\n /**\n * Country, currency and total of the cart as the backend calculates them,\n * for an Apple Pay session that has to be created before any request.\n */\n getApplePayPreview: (args: { items: CartProduct[] }) => Promise<\n | Err\n | {\n countryCode: string;\n currencyCode: string;\n /** Major units, as Apple Pay wants them. */\n totalAmount: string;\n }\n >;\n completeApplePayPayment: (args: {\n token: ApplePayJS.ApplePayPaymentToken;\n shippingContact?: ApplePayJS.ApplePayPaymentContact;\n billingContact?: ApplePayJS.ApplePayPaymentContact;\n }) => Promise<\n | Err\n | {\n isSuccess: boolean;\n redirectURL?: string;\n }\n >;\n completeGooglePayPayment: (args: {\n paymentData: google.payments.api.PaymentData;\n }) => Promise<\n | Err\n | {\n isSuccess: boolean;\n redirectURL?: string;\n }\n >;\n\n justRedirectToPayment: (args: {\n email?: string;\n productID: string;\n name?: string;\n country?: string;\n marketingAgreement?: boolean;\n locale?: string;\n }) => Promise<\n | Err\n | {\n url: string;\n }\n >;\n}\n\nconst CartProviderContext = createContext<CartMethods | undefined>(undefined);\n\nexport var bitsnapProjectID: string | undefined = undefined;\nexport function setProjectID(projectID: string) {\n setPanelConfig({\n projectID,\n });\n bitsnapProjectID = projectID;\n if (typeof window !== \"undefined\") {\n setAllowedReturnOrigins([window.location.origin]);\n }\n}\n\nexport function getProjectID(): string | undefined {\n if (bitsnapProjectID != null) {\n return bitsnapProjectID;\n }\n const me = document.querySelector(\n 'script[data-id][data-name=\"internal-cart\"]',\n );\n const projectID = me?.getAttribute(\"data-id\");\n return projectID ?? undefined;\n}\n\nexport { getLocale, setLocale } from \"./locale\";\n\nfunction getNewHostIfExist(): string | undefined {\n const me = document.querySelector(\n 'script[data-id][data-name=\"internal-cart\"]',\n );\n const customHost = me?.getAttribute(\"data-custom-host\");\n return customHost ?? undefined;\n}\n\nconst CartProvider = ({\n children,\n locale,\n}: {\n children: React.ReactNode;\n locale?: string;\n}) => {\n const [queryClient] = useState(() => new QueryClient());\n const textsConfig = useCheckoutTextsConfig();\n\n useEffect(() => {\n updateNumberOfProductsInCart();\n }, []);\n\n const projectID = getProjectID();\n\n // An order that was left for the payment page clears the cart once it is paid.\n useEffect(() => {\n if (projectID == null) {\n return;\n }\n const reconcile = () => {\n void reconcileOrderOfLastPayment(projectID).then((outcome) => {\n // An open drawer refetches on focus before the order answers.\n if (outcome === \"paid\") {\n void queryClient.invalidateQueries({ queryKey: [\"cart\"] });\n }\n });\n };\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n reconcile();\n }\n };\n reconcile();\n window.addEventListener(\"pageshow\", reconcile);\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n window.removeEventListener(\"pageshow\", reconcile);\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, [projectID, queryClient]);\n\n if (projectID == null) {\n return <></>;\n }\n\n const checkoutMethods = getCheckoutMethods(\n projectID,\n locale ?? textsConfig.locale,\n textsConfig.texts,\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <CartProviderContext.Provider value={checkoutMethods}>\n {children}\n </CartProviderContext.Provider>\n </QueryClientProvider>\n );\n};\n\nlet reconciling: Promise<PendingOrderOutcome | undefined> | undefined;\n\nconst askAboutOrder = throttleOrderStatus(async (order) =>\n orderStatusFromResponse(\n await PublicApiClient.get(HOST).getOrder({\n id: order.orderId,\n projectId: order.projectId,\n }),\n ),\n);\n\n/** What the buyer picked that changes the totals (for cache keys of wallet previews). */\nexport function getCheckoutSelection() {\n const { country, couponCode, selectedDeliveryMethod, postalCode } =\n getCheckout() ?? emptyCheckout;\n return { country, couponCode, selectedDeliveryMethod, postalCode };\n}\n\n/** The lines of the cart right now, for the order that is about to be paid. */\nexport function getCartLines(): PendingOrderLine[] {\n return (getCheckout()?.products ?? []).map((el) => ({\n id: el.id,\n quantity: el.quantity,\n }));\n}\n\n/** Removes the lines of a paid order from the cart; what was added since stays. */\nfunction removeOrderLinesFromCart(lines: PendingOrderLine[]) {\n const checkout = getCheckout();\n saveCheckout({\n ...checkout,\n products: subtractOrderLines(checkout?.products ?? [], lines),\n });\n updateNumberOfProductsInCart();\n}\n\n/** Asks the backend about the order the buyer left for, once at a time. */\nexport function reconcileOrderOfLastPayment(\n projectID: string,\n): Promise<PendingOrderOutcome | undefined> {\n reconciling ??= reconcilePendingOrder({\n projectId: projectID,\n fetchStatus: askAboutOrder,\n removeLines: removeOrderLinesFromCart,\n })\n .catch((e) => {\n console.warn(\"cannot check the pending order\", e);\n return undefined;\n })\n .finally(() => {\n reconciling = undefined;\n });\n return reconciling;\n}\n\n// @ts-ignore\nconst getProducts: (\n projectID: string,\n args?: { items?: CheckoutProduct[]; locale?: string },\n) => Promise<\n | Err\n | {\n id: string;\n productID: string;\n quantity: number;\n metadata?: { [key: string]: string | undefined };\n url?: string;\n details?: SingleProduct;\n /** The catalog product, when `productID` is one of its variants. */\n catalogProductID?: string;\n }[]\n> = async (\n projectID: string,\n args?: { items?: CheckoutProduct[]; locale?: string },\n) => {\n let products: CheckoutProduct[] = [];\n\n if (args?.items != null && args.items.length > 0) {\n products = args.items;\n } else {\n products = getCheckout()?.products ?? [];\n }\n\n const productIds = Array.from(\n new Set(products.map((product) => product.productID)),\n );\n\n if (productIds.length === 0) {\n return [];\n }\n\n const params = new URLSearchParams();\n params.set(\"ids\", productIds.join(\",\"));\n params.set(\"locale\", args?.locale ?? getLocale());\n\n let payload: {\n success: boolean;\n message?: string | undefined;\n result?: SingleProduct[] | undefined;\n };\n try {\n const result = await fetch(\n withClientParam(buildURL(projectID, `/products?${params.toString()}`)),\n {\n method: \"GET\",\n },\n );\n\n // A backend failure is not an empty cart.\n if (result.status != 200) {\n return Err(\"products-load-failed\", \"internal\");\n }\n\n payload = await result.json();\n } catch (e) {\n console.warn(\"cannot load the products of the cart\", e);\n return Err(\"products-load-failed\", \"internal\");\n }\n\n // Items the backend does not know (removed product, wrong id) are dropped.\n return products.flatMap((product) => {\n const details = findProductForCartItem(product.productID, payload.result);\n if (details == null) {\n return [];\n }\n return [\n {\n ...product,\n details: resolveProductDetailsFromSingleProduct(\n product.productID,\n details,\n ),\n catalogProductID: details.id,\n },\n ];\n });\n};\n\nexport const useCartProvider = () => {\n const context = useContext(CartProviderContext);\n\n if (context === undefined) {\n throw new Error(\"useCartProvider must be used within a CartProvider\");\n }\n\n return context;\n};\n\nexport default CartProvider;\n\nconst googlePayConfigSchema = zod.object({\n isAvailable: zod.boolean(),\n merchantId: zod.string(),\n merchantName: zod.string(),\n gateway: zod.string(),\n gatewayId: zod.string(),\n});\nconst checkoutProduct = zod.object({\n id: zod.string(),\n productID: zod.string(),\n quantity: zod.number(),\n priceVersion: zod.string().optional(),\n metadata: zod.record(zod.string(), zod.string().optional()).optional(),\n url: zod.string().optional(),\n});\ntype CheckoutProduct = zod.infer<typeof checkoutProduct>;\nconst checkoutSchema = zod.object({\n country: zod.string().optional(),\n couponCode: zod.string().optional(),\n selectedDeliveryMethod: zod.string().optional(),\n postalCode: zod.string().optional(),\n email: zod.string().optional(),\n products: zod.array(checkoutProduct).optional(),\n googlePayConfig: googlePayConfigSchema.optional(),\n});\nexport type GooglePayConfig = zod.infer<typeof googlePayConfigSchema>;\nconst emptyCheckout: Checkout = {\n country: undefined,\n couponCode: undefined,\n email: undefined,\n selectedDeliveryMethod: undefined,\n postalCode: undefined,\n products: [],\n googlePayConfig: undefined,\n};\nexport type Checkout = zod.infer<typeof checkoutSchema>;\n\nconst checkoutKey = \"checkout\";\n\nfunction getCheckout(): Checkout {\n try {\n const value = localStorage.getItem(checkoutKey);\n if (value == null) {\n return emptyCheckout;\n }\n return checkoutSchema.parse(JSON.parse(value));\n } catch (e) {\n return emptyCheckout;\n }\n}\n\nasync function addProducts(projectID: string, products: CartProduct[]) {\n const latestProducts = await getProducts(projectID, {\n items: products.map((item, index) => ({ ...item, id: `price-check-${index}` })),\n });\n if (isErr(latestProducts)) return latestProducts;\n const missingIDs = findMissingProductIDs(\n products.map((el) => el.productID),\n latestProducts,\n );\n if (missingIDs.length > 0) {\n return Err(\"item-ids-not-found\", \"notFound\", missingIDs);\n }\n\n const checkout = getCheckout();\n if (checkout.products == null) {\n checkout.products = [];\n }\n checkout.products.push(\n ...products.map((el) => ({\n id: Math.random().toString(36).substring(7),\n productID: el.productID,\n quantity: el.quantity,\n priceVersion: latestProducts.find((product) => product.productID === el.productID)?.details?.pricing?.priceVersion,\n metadata: el.metadata,\n url: cartItemURL(\n el.url,\n typeof window !== \"undefined\" ? window.location.href : undefined,\n ),\n })),\n );\n trackCartAdd(products, latestProducts);\n sendAnalyticEvent({\n event: \"addToCart\",\n currency: \"PLN\",\n items: products.map((el) => ({\n id: el.productID,\n name: el.name ?? \"\",\n price: el.price ?? 0,\n quantity: el.quantity,\n currency: el.currency ?? \"PLN\",\n })),\n });\n saveCheckout(checkout);\n updateNumberOfProductsInCart();\n return undefined;\n}\n\n/** `add_to_cart` per added line, priced by the backend's answer. */\nfunction trackCartAdd(\n added: CartProduct[],\n latest: { productID: string; details?: SingleProduct; catalogProductID?: string }[],\n) {\n for (const item of added) {\n try {\n const found = latest.find((el) => el.productID === item.productID);\n const price = found?.details?.pricing?.effectivePrice ?? found?.details?.price ?? item.price;\n const currency = found?.details?.currency ?? item.currency;\n if (price == null || currency == null) continue;\n const productID = found?.catalogProductID ?? item.productID;\n (item.analytics ?? getCartInstrument()).track(\n \"add_to_cart\",\n { qty: item.quantity, value_minor: Math.round(price * item.quantity), currency },\n { product_id: productID, variant_id: productID !== item.productID ? item.productID : null },\n );\n } catch {}\n }\n}\n\nfunction removeProductFromCheckout(ids: string[]) {\n const checkout = getCheckout();\n const newCheckout = {\n ...checkout,\n products: checkout?.products?.filter(\n (product) =>\n !ids.includes(product.productID) && !ids.includes(product.id),\n ),\n };\n sendAnalyticEvent({\n event: \"removeFromCart\",\n items: ids.map((id) => ({\n id: id,\n name: \"\",\n price: 0,\n quantity: 1,\n currency: \"PLN\",\n })),\n });\n saveCheckout(newCheckout);\n updateNumberOfProductsInCart();\n}\n\nfunction saveCheckout(model: Checkout) {\n localStorage.setItem(checkoutKey, JSON.stringify(model));\n}\n\nexport const getCheckoutMethods: (\n projectID: string,\n locale?: string,\n texts?: Partial<CheckoutTexts>,\n) => CartMethods = (projectID, locale = getLocale(), texts) => {\n const newHost = getNewHostIfExist();\n if (newHost != null) {\n setCustomHost(newHost);\n }\n return {\n async checkIfApplePayIsAvailable(): Promise<boolean> {\n if (typeof window == \"undefined\" || typeof document == \"undefined\") {\n return false;\n }\n if (\"ApplePaySession\" in window === false) {\n return false;\n }\n\n try {\n const result = await PublicApiClient.get(\n HOST,\n ).isOneClickPaymentAvailable({\n projectId: projectID,\n });\n\n return result.applePay;\n } catch (e) {\n console.error(\"Error checking if Apple Pay is available\", e);\n return false;\n }\n },\n async getGooglePayConfiguration(args: { items: CartProduct[] }): Promise<\n | {\n isAvailable: true;\n config: google.payments.api.PaymentDataRequest;\n }\n | {\n isAvailable: false;\n }\n > {\n if (typeof window == \"undefined\" || typeof document == \"undefined\") {\n return {\n isAvailable: false,\n };\n }\n\n try {\n const googlePayConfig = await resolveGooglePayConfiguration(projectID);\n if (googlePayConfig?.isAvailable != true) {\n return {\n isAvailable: false,\n };\n }\n\n const checkout = getCheckout();\n if (checkout == null) {\n console.log(\"checkout is null\");\n return {\n isAvailable: false,\n };\n }\n\n const products = await getProducts(projectID, {\n locale,\n items: args.items.map((el) => {\n return {\n id: Math.random().toString(36).substring(7),\n quantity: el.quantity,\n metadata: el.metadata,\n productID: el.productID,\n };\n }),\n });\n\n if (isErr(products)) {\n return {\n isAvailable: false,\n };\n }\n const result = await PublicApiClient.get(HOST).getPreOrderDetails({\n items: products.map((el) =>\n create(PreOrderItemSchema, {\n id: el.productID,\n quantity: el.quantity,\n }),\n ),\n projectId: projectID,\n // we can detect 5 the closest inpost pickup point based on shipping address.\n postCode: checkout.postalCode,\n couponCode: checkout.couponCode,\n countryCode: checkout.country,\n selectedDeliveryMethod: checkout.selectedDeliveryMethod,\n });\n if (result.totalAmount == null) {\n return {\n isAvailable: false,\n };\n }\n const cartRequiresShipping =\n products.find((el) => el.details?.isDeliverable == true) != null;\n\n const mappedPaymentRequest = await mapGooglePayConfiguration({\n items: products,\n googlePayConfig: googlePayConfig,\n checkout: checkout,\n cartRequiresShipping: cartRequiresShipping,\n result: result,\n locale,\n texts,\n });\n if (mappedPaymentRequest == null) {\n return {\n isAvailable: false,\n };\n }\n\n return {\n isAvailable: true,\n config: mappedPaymentRequest,\n };\n } catch (e) {\n console.error(\"Error resolving Google Pay configuration\", e);\n return {\n isAvailable: false,\n };\n }\n },\n async clearCart(): Promise<Err | void> {\n const empty = structuredClone(emptyCheckout);\n empty.country = getCheckout()?.country;\n saveCheckout(empty);\n updateNumberOfProductsInCart();\n },\n\n async getAvailableCountries(): Promise<\n Err | { name: string; code: string }[]\n > {\n const result = await fetch(\n withClientParam(buildURL(projectID, \"/countries\")),\n {\n method: \"GET\",\n },\n );\n\n if (result.status != 200) {\n return [];\n }\n\n try {\n return zod\n .array(\n zod.object({\n name: zod.string(),\n code: zod.string(),\n }),\n )\n .parse(await result.json());\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return Err(e.toString(), \"internal\");\n }\n },\n\n async getCountry(): Promise<Err | string> {\n let country = getCheckout()?.country;\n if (country == null) {\n country = \"PL\";\n const checkout = getCheckout();\n checkout.country = country;\n saveCheckout(checkout);\n }\n\n return country;\n },\n\n async getNumberOfElementsInCart(): Promise<number> {\n return (\n getCheckout()?.products?.reduce(\n (acc, product) => acc + product.quantity,\n 0,\n ) ?? 0\n );\n },\n\n async getProducts(): Promise<\n | Err\n | {\n id: string;\n productID: string;\n quantity: number;\n metadata?: {\n [p: string]: string | undefined;\n };\n details?: SingleProduct;\n catalogProductID?: string;\n }[]\n > {\n return await getProducts(projectID, { locale });\n },\n\n async removeProductFromCart(args: { id: string }): Promise<Err | void> {\n return removeProductFromCheckout([args.id]);\n },\n\n async setCountry(country: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.country = country;\n saveCheckout(checkout);\n },\n\n async setCouponCodeIfPossible(couponCode?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.couponCode = couponCode;\n saveCheckout(checkout);\n },\n\n async setPostalCode(postalCode?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.postalCode = postalCode;\n saveCheckout(checkout);\n },\n\n async setDeliveryMethod(deliveryMethod?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.selectedDeliveryMethod = deliveryMethod;\n saveCheckout(checkout);\n },\n\n async setEmail(email?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.email = email;\n saveCheckout(checkout);\n },\n\n async addProduct(args: CartProduct): Promise<Err | void> {\n return await addProducts(projectID, [args]);\n },\n\n async updateQuantity(args: {\n id: string;\n quantity: number;\n }): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.products = checkout.products?.map((product) => {\n if (product.id === args.id) {\n product.quantity = args.quantity;\n }\n return product;\n });\n saveCheckout(checkout);\n updateNumberOfProductsInCart();\n },\n\n async redirectToNextStep(): Promise<\n Err | { url: string; orderId?: string; projectId?: string }\n > {\n const checkout = getCheckout();\n\n if (checkout.products == null || checkout.products.length == 0) {\n return Err(\"cart-is-empty\", \"badInput\");\n }\n const mergedMetadata = checkout.products.reduce(\n (acc, product) => {\n if (product.metadata != null) {\n Object.keys(product.metadata).forEach((key) => {\n const value = product.metadata?.[key];\n if (value != null) {\n acc[key] = value;\n }\n });\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const payload: LinkRequest = {\n items: checkout.products.map((el) => {\n return {\n id: el.productID,\n quantity: el.quantity,\n priceVersion: el.priceVersion,\n };\n }),\n askForNote: true,\n countries: checkout.country ? [checkout.country] : undefined,\n metadata: mergedMetadata,\n locale,\n };\n\n const paymentResponse = await createPaymentURL(payload);\n\n if (isErr(paymentResponse)) {\n console.warn(\"cannot create payment URL\", paymentResponse.error);\n return paymentResponse;\n }\n\n return {\n url: paymentResponse.url,\n ...(paymentResponse.orderId != null\n ? { orderId: paymentResponse.orderId }\n : {}),\n ...(paymentResponse.projectId != null\n ? { projectId: paymentResponse.projectId }\n : {}),\n };\n },\n\n async justRedirectToPayment(args: {\n email?: string;\n productID: string;\n name?: string;\n country?: string;\n marketingAgreement?: boolean;\n locale?: string;\n }): Promise<Err | { url: string }> {\n let payload: LinkRequest = {\n items: [\n {\n id: args.productID,\n quantity: 1,\n },\n ],\n askForNote: false,\n details:\n args.email || args.name\n ? {\n name: args.name,\n email: args.email,\n }\n : undefined,\n locale: args.locale ?? locale,\n };\n\n payload = injectReferenceToRequestIfNeeded(payload);\n\n if (args.country == null) {\n args.country = \"pl\";\n }\n\n if (payload.details == null) {\n payload.details = {};\n }\n if (payload.details.address == null) {\n payload.details.address = {};\n }\n payload.details.address.country = args.country;\n\n if (args.marketingAgreement === true) {\n payload.additionalAgreements = [\n {\n id: MARKETING_AGREEMENT_ID,\n name: \"\",\n required: true,\n answer: true,\n },\n ];\n }\n\n const result = await createPaymentURL(payload);\n\n if (isErr(result)) {\n return result;\n } else {\n return {\n url: result.url,\n };\n }\n },\n\n async getApplePayPreview(args: {\n items: CartProduct[];\n }): Promise<\n | Err\n | { countryCode: string; currencyCode: string; totalAmount: string }\n > {\n const checkout = getCheckout();\n try {\n const result = await PublicApiClient.get(HOST).getPreOrderDetails({\n items: args.items.map((el) =>\n create(PreOrderItemSchema, {\n id: el.productID,\n quantity: el.quantity,\n }),\n ),\n projectId: projectID,\n postCode: checkout.postalCode,\n couponCode: checkout.couponCode,\n countryCode: checkout.country,\n selectedDeliveryMethod: checkout.selectedDeliveryMethod,\n });\n if (result.totalAmount == null || result.currency.length === 0) {\n return Err(\"pre-order-unavailable\", \"internal\");\n }\n return {\n countryCode: result.country || checkout.country || \"PL\",\n currencyCode: result.currency,\n totalAmount: `${round(result.totalAmount / 100, 2)}`,\n };\n } catch (e) {\n console.warn(\"cannot load the Apple Pay preview\", e);\n return Err(\"pre-order-unavailable\", \"internal\");\n }\n },\n\n async completeApplePayPayment(args: {\n token: ApplePayJS.ApplePayPaymentToken;\n shippingContact?: ApplePayJS.ApplePayPaymentContact;\n billingContact?: ApplePayJS.ApplePayPaymentContact;\n }): Promise<\n | Err\n | {\n isSuccess: boolean;\n redirectURL?: string;\n }\n > {\n const checkout = getCheckout();\n if (checkout == null) {\n return Err(\"Checkout not found\");\n }\n\n const products = await getProducts(projectID, { locale });\n\n if (isErr(products)) {\n return products;\n }\n\n try {\n let shippingName = args.shippingContact?.givenName;\n if (args.shippingContact?.familyName != null) {\n shippingName += \" \" + args.shippingContact?.familyName;\n } else if (args.billingContact?.familyName != null) {\n shippingName += \" \" + args.billingContact?.familyName;\n }\n\n let metadata: Record<string, string> = {};\n\n const ref = getReferenceIfPossible();\n if (ref != null) {\n metadata[\"ref\"] = ref;\n }\n\n const result = await PublicApiClient.get(HOST).authorizeOneClickPayment(\n {\n gateway: OneClickAuthorizePaymentRequest_Gateway.APPLE_PAY,\n paymentData: JSON.stringify(args.token.paymentData),\n paymentMethod: JSON.stringify(args.token.paymentMethod),\n transactionIdentifier: args.token.transactionIdentifier,\n order: create(GetPreOrderDetailsRequestSchema, {\n items: products.map((el) => ({\n id: el.productID,\n quantity: el.quantity,\n })),\n couponCode: checkout.couponCode,\n email:\n args.shippingContact?.emailAddress ??\n args.billingContact?.emailAddress ??\n checkout.email ??\n undefined,\n phone:\n args.shippingContact?.phoneNumber ??\n args.billingContact?.phoneNumber ??\n undefined,\n selectedDeliveryMethod: checkout.selectedDeliveryMethod,\n postCode: checkout.postalCode,\n projectId: projectID,\n }),\n shippingAddress: create(AddressSchema, {\n line1: args.shippingContact?.addressLines?.[0] ?? \"\",\n city: args.shippingContact?.locality ?? \"\",\n country: args.shippingContact?.countryCode ?? \"\",\n zipCode: args.shippingContact?.postalCode ?? \"\",\n name: shippingName,\n }),\n billingAddress: create(BillingAddressSchema, {\n name:\n args.billingContact?.givenName ??\n \"\" + \" \" + (args.billingContact?.familyName ?? \"\"),\n line1: args.billingContact?.addressLines?.[0] ?? \"\",\n city: args.billingContact?.locality ?? \"\",\n country: args.billingContact?.countryCode ?? \"\",\n zipCode: args.billingContact?.postalCode ?? \"\",\n }),\n metadata:\n Object.keys(metadata).length > 0\n ? JSON.stringify(metadata)\n : undefined,\n },\n );\n\n return {\n isSuccess: result.isSuccess,\n redirectURL: result.redirectUrl,\n };\n } catch (error) {\n console.error(error);\n return Err(\"Failed to authorize payment\");\n }\n },\n\n async completeGooglePayPayment(args: {\n paymentData: google.payments.api.PaymentData;\n }): Promise<\n | Err\n | {\n isSuccess: boolean;\n redirectURL?: string;\n }\n > {\n const checkout = getCheckout();\n if (checkout == null) {\n return Err(\"Checkout not found\");\n }\n\n const products = await getProducts(projectID, { locale });\n\n if (isErr(products)) {\n return products;\n }\n\n try {\n let shippingName = args.paymentData.shippingAddress?.name;\n\n let metadata: Record<string, string> = {};\n\n const ref = getReferenceIfPossible();\n if (ref != null) {\n metadata[\"ref\"] = ref;\n }\n\n const result = await PublicApiClient.get(HOST).authorizeOneClickPayment(\n {\n gateway: OneClickAuthorizePaymentRequest_Gateway.GOOGLE_PAY,\n paymentData:\n args.paymentData.paymentMethodData.tokenizationData.token,\n paymentMethod: args.paymentData.paymentMethodData.type,\n transactionIdentifier: \"\",\n order: create(GetPreOrderDetailsRequestSchema, {\n items: products.map((el) => ({\n id: el.productID,\n quantity: el.quantity,\n })),\n couponCode: checkout.couponCode,\n email: args.paymentData.email ?? undefined,\n phone: args.paymentData.shippingAddress?.phoneNumber ?? undefined,\n selectedDeliveryMethod:\n args.paymentData.shippingOptionData?.id ??\n checkout.selectedDeliveryMethod,\n postCode: args.paymentData.shippingAddress?.postalCode,\n projectId: projectID,\n }),\n shippingAddress: create(AddressSchema, {\n line1: args.paymentData.shippingAddress?.address1 ?? \"\",\n city: args.paymentData.shippingAddress?.locality ?? \"\",\n country: args.paymentData.shippingAddress?.countryCode ?? \"\",\n zipCode: args.paymentData.shippingAddress?.postalCode ?? \"\",\n name: shippingName,\n }),\n billingAddress: create(BillingAddressSchema, {\n name: args.paymentData.paymentMethodData.info?.billingAddress\n ?.name,\n line1:\n args.paymentData.paymentMethodData.info?.billingAddress\n ?.address1 ?? \"\",\n city:\n args.paymentData.paymentMethodData.info?.billingAddress\n ?.locality ?? \"\",\n country:\n args.paymentData.paymentMethodData.info?.billingAddress\n ?.countryCode ?? \"\",\n zipCode:\n args.paymentData.paymentMethodData.info?.billingAddress\n ?.postalCode ?? \"\",\n }),\n metadata:\n Object.keys(metadata).length > 0\n ? JSON.stringify(metadata)\n : undefined,\n },\n );\n\n return {\n isSuccess: result.isSuccess,\n redirectURL: result.redirectUrl,\n };\n } catch (error) {\n console.error(error);\n return Err(\"Failed to authorize payment\");\n }\n\n return {\n isSuccess: true,\n };\n },\n\n async getApplePayPaymentRequest(args?: {\n expectedItems?: CartProduct[];\n }): Promise<Err | ApplePayJS.ApplePayPaymentRequest> {\n const checkout = getCheckout();\n if (checkout == null) {\n return Err(\"Checkout not found\");\n }\n if (args && args.expectedItems != null && args.expectedItems.length > 0) {\n if (checkout.products) {\n removeProductFromCheckout(\n checkout.products.map((el) => el.productID),\n );\n }\n await addProducts(projectID, args.expectedItems);\n }\n\n const products = await getProducts(projectID, { locale });\n\n if (isErr(products)) {\n return products;\n }\n\n const result = await PublicApiClient.get(HOST).getPreOrderDetails({\n items: products.map((el) =>\n create(PreOrderItemSchema, {\n id: el.productID,\n quantity: el.quantity,\n }),\n ),\n projectId: projectID,\n // we can detect 5 the closest inpost pickup point based on shipping address.\n postCode: checkout.postalCode,\n couponCode: checkout.couponCode,\n countryCode: checkout.country,\n selectedDeliveryMethod: checkout.selectedDeliveryMethod,\n });\n\n const items = products.map((el) => {\n return {\n amount: `${round(\n (el.quantity *\n (el.details?.pricing?.effectivePrice ?? el.details?.price ?? 0)) /\n 100,\n 2,\n )}`,\n label: el.details?.name + \" - \" + el.quantity,\n type: \"final\" as ApplePayJS.ApplePayLineItemType,\n };\n });\n\n if (result.selectedDeliveryMethod != null) {\n const deliveryMethod = result.methods.find(\n (el) => el.id == result.selectedDeliveryMethod,\n );\n if (deliveryMethod != null) {\n items.push({\n amount: `${round(deliveryMethod.amount / 100, 2)}`,\n label: deliveryMethod.name,\n type: \"final\" as ApplePayJS.ApplePayLineItemType,\n });\n }\n }\n\n if (result.couponCode != null && result.couponValue != null) {\n items.push({\n amount: `-${round(result.couponValue / 100, 2)}`,\n label: result.couponCode,\n type: \"final\" as ApplePayJS.ApplePayLineItemType,\n });\n }\n\n return {\n countryCode: result.country || checkout.country || \"PL\",\n merchantCapabilities: [\n \"supports3DS\",\n \"supportsCredit\",\n \"supportsDebit\",\n ],\n supportedNetworks: [\"visa\", \"masterCard\"],\n total: {\n amount: `${round((result.totalAmount ?? 0) / 100, 2)}`,\n label: getCheckoutText(\"paymentForCart\", locale, texts),\n type: \"final\",\n },\n shippingMethods: result.methods.map((el) => ({\n amount: `${round(el.amount / 100, 2)}`,\n detail: el.description ?? \"\",\n identifier: el.id,\n label: el.name,\n dateComponentsRange: {\n startDateComponents: {\n days: el.minDays ?? 1,\n hours: 0,\n months: 0,\n years: 0,\n } satisfies ApplePayJS.ApplePayDateComponents,\n endDateComponents: {\n days: el.maxDays ?? 14,\n hours: 0,\n months: 0,\n years: 0,\n } satisfies ApplePayJS.ApplePayDateComponents,\n },\n })),\n lineItems: items,\n currencyCode:\n result.currency || products[0]?.details?.currency || \"PLN\",\n };\n },\n };\n};\n\nasync function resolveGooglePayConfiguration(projectID: string) {\n const checkout = getCheckout();\n if (checkout.googlePayConfig?.isAvailable != true) {\n const result = await PublicApiClient.get(HOST).isOneClickPaymentAvailable({\n projectId: projectID,\n });\n if (result.googlePay == true && result.googlePayConfig != null) {\n checkout.googlePayConfig = {\n isAvailable: true,\n gateway: result.googlePayConfig.gateway,\n gatewayId: result.googlePayConfig.gatewayMerchantId,\n merchantName: result.googlePayConfig.merchantName,\n merchantId: result.googlePayConfig.merchantId,\n };\n } else {\n checkout.googlePayConfig = {\n isAvailable: false,\n gateway: \"\",\n gatewayId: \"\",\n merchantName: \"\",\n merchantId: \"\",\n };\n }\n }\n saveCheckout(checkout);\n return checkout.googlePayConfig;\n}\n\nfunction resolveProductDetailsFromSingleProduct(\n id: string,\n product: SingleProduct,\n) {\n if (id == product.id) {\n const variantIndex = product.variants?.findIndex((v) => v.id === id);\n if (variantIndex != null && variantIndex != -1) {\n const variant = product.variants![variantIndex];\n return {\n ...product,\n availableQuantity: variant.availableQuantity,\n isDeliverable: variant.isDeliverable,\n images: variant.images ?? product.images,\n name: product.name + \" \" + variant.name,\n baseName: product.name,\n variantName: variant.name,\n price: variant.price,\n currency: variant.currency,\n pricing: variant.pricing,\n };\n }\n return product;\n }\n\n const variant = product.variants?.find((v) => v.id === id);\n if (variant == null) {\n return product;\n }\n\n return {\n ...product,\n id: variant.id,\n name: product.name + \" \" + variant.name,\n baseName: product.name,\n variantName: variant.name,\n price: variant.price,\n currency: variant.currency,\n pricing: variant.pricing,\n metadata: product.metadata,\n availableQuantity: variant.availableQuantity,\n isDeliverable: variant.isDeliverable,\n images: variant.images ?? product.images,\n };\n}\n\ntype ApplePaySessionArgs = {\n postCode?: string;\n email?: string;\n couponCode?: string;\n};\n\nfunction updateNumberOfProductsInCart() {\n const checkout = getCheckout();\n let numberOfProductsInCart = 0;\n if (checkout == null) {\n useCheckoutStore.setState((state) => ({\n ...state,\n numberOfProductsInCart,\n }));\n return;\n }\n numberOfProductsInCart =\n checkout.products?.reduce((acc, product) => acc + product.quantity, 0) ?? 0;\n useCheckoutStore.setState((state) => ({ ...state, numberOfProductsInCart }));\n}\n","import type { Transport } from \"@connectrpc/connect\";\nimport { createClient, type Client } from \"@connectrpc/connect\";\nimport { createConnectTransport } from \"@connectrpc/connect-web\";\nimport { clientHeaderInterceptor } from \"./lib/client-header\";\nimport { PublicApiService } from \"./gen/proto/public/v1/public_api_pb\";\n\nexport namespace PublicApiClient {\n export function get(host: string): Client<typeof PublicApiService> {\n return createClient(PublicApiService, getTransport(host));\n }\n\n const transports = new Map<string, Transport>();\n function getTransport(host: string): Transport {\n let transport = transports.get(host);\n if (transport == null) {\n transport = createConnectTransport({\n useBinaryFormat: true,\n baseUrl: host + \"/api/rpc\",\n interceptors: [clientHeaderInterceptor],\n });\n transports.set(host, transport);\n }\n return transport;\n }\n}\n","import zod from \"zod\";\nimport { round } from \"./lib/round.number\";\n\nconst eventPayload = zod.object({\n event: zod.enum([\n \"purchase\",\n \"addToCart\",\n \"customizeProduct\",\n \"viewCart\",\n \"removeFromCart\",\n \"initiateCheckout\",\n \"lead\",\n ]),\n step: zod.string().optional(),\n value: zod.number().optional(),\n currency: zod.string().optional(),\n content_name: zod.string().optional(),\n items: zod\n .array(\n zod.object({\n id: zod.string(),\n name: zod.string(),\n price: zod.number().default(0),\n currency: zod.string().default(\"PLN\"),\n quantity: zod.number().default(1),\n })\n )\n .optional(),\n});\ntype EventPayload = zod.infer<typeof eventPayload>;\n\nexport function sendAnalyticEvent(payload: EventPayload) {\n if (typeof window == \"undefined\") {\n return;\n }\n\n sendGoogleAnalyticsEvent(payload);\n sendPixelAnalyticsEvent(payload);\n sendTikTokAnalyticsEvent(payload);\n}\n\nfunction sendGoogleAnalyticsEvent(payload: EventPayload) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (typeof window.dataLayer == \"undefined\") {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.dataLayer = [];\n }\n\n const ga4Event = mapToGA4EcommerceEvent(payload);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.dataLayer.push(ga4Event);\n } catch (e) {\n console.warn(\"cannot send google analytics event\", e);\n }\n}\n\nfunction mapToGA4EcommerceEvent(payload: EventPayload) {\n // Calculate total value from items if not provided\n const totalValue =\n payload.value ??\n payload.items?.reduce(\n (sum, item) => sum + (item.price || 0) * (item.quantity || 1),\n 0\n ) ??\n 0;\n\n // Map items to GA4 format\n const items = payload.items?.map((item) => ({\n item_id: item.id,\n item_name: item.name || item.id,\n price: round((item.price || 0) / 100, 2),\n quantity: item.quantity || 1,\n }));\n\n // Build base ecommerce object\n const ecommerce: Record<string, unknown> = {\n currency: payload.currency || \"PLN\",\n value: round(totalValue / 100, 2),\n };\n\n if (items && items.length > 0) {\n ecommerce.items = items;\n }\n\n // Map event names to GA4 ecommerce events\n let eventName: string;\n switch (payload.event) {\n case \"purchase\":\n eventName = \"purchase\";\n // Purchase events require transaction_id, but we'll use a timestamp-based one if not provided\n ecommerce.transaction_id = payload.step || `txn_${Date.now()}`;\n break;\n case \"addToCart\":\n eventName = \"add_to_cart\";\n break;\n case \"viewCart\":\n eventName = \"view_cart\";\n break;\n case \"removeFromCart\":\n eventName = \"remove_from_cart\";\n break;\n case \"initiateCheckout\":\n eventName = \"begin_checkout\";\n break;\n case \"customizeProduct\":\n // Customize product is not a standard GA4 ecommerce event\n // We'll send it as a custom event with ecommerce data\n eventName = \"customize_product\";\n break;\n default:\n eventName = payload.event;\n }\n\n return {\n event: eventName,\n ecommerce,\n // Include step if provided for additional context\n ...(payload.step && { step: payload.step }),\n // Include content_name if provided\n ...(payload.content_name && { content_name: payload.content_name }),\n };\n}\n\nfunction sendPixelAnalyticsEvent(payload: EventPayload) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (typeof window.fbq == \"undefined\") {\n return;\n }\n\n let eventType = \"\";\n let eventName = \"\";\n let eventPayload: unknown = {};\n\n switch (payload.event) {\n case \"purchase\":\n eventType = \"track\";\n eventName = \"Purchase\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"lead\":\n eventType = \"track\";\n eventName = \"Lead\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"addToCart\":\n eventType = \"track\";\n eventName = \"Add to Cart\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"customizeProduct\":\n eventType = \"track\";\n eventName = \"Customize Product\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"viewCart\":\n eventType = \"track\";\n eventName = \"View Cart\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"removeFromCart\":\n eventType = \"track\";\n eventName = \"Remove from Cart\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n case \"initiateCheckout\":\n eventType = \"track\";\n eventName = \"Initiate Checkout\";\n eventPayload = {\n category_name: payload.step,\n ...payload,\n };\n break;\n default:\n break;\n }\n\n if (window.location.search.includes(\"analytics\")) {\n console.log(\"Pushing FB event\", eventType, eventName, eventPayload);\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.fbq(eventType, eventName, eventPayload);\n}\n\nfunction sendTikTokAnalyticsEvent(payload: EventPayload) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (typeof window.ttq == \"undefined\") {\n return;\n }\n\n const tiktokEvent = mapToTikTokEvent(payload);\n\n if (!tiktokEvent) {\n return;\n }\n\n if (window.location.search.includes(\"analytics\")) {\n console.log(\n \"Pushing TikTok event\",\n tiktokEvent.eventName,\n tiktokEvent.eventPayload\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.ttq.track(tiktokEvent.eventName, tiktokEvent.eventPayload);\n } catch (e) {\n console.warn(\"cannot send tiktok analytics event\", e);\n }\n}\n\nfunction mapToTikTokEvent(payload: EventPayload) {\n // Calculate total value from items if not provided\n const totalValue =\n payload.value ??\n payload.items?.reduce(\n (sum, item) => sum + (item.price || 0) * (item.quantity || 1),\n 0\n ) ??\n 0;\n\n // Map items to TikTok contents format\n const contents =\n payload.items?.map((item) => ({\n content_id: item.id,\n content_type: \"product\",\n content_name: item.name || item.id,\n quantity: item.quantity || 1,\n price: round((item.price || 0) / 100, 2),\n })) || [];\n\n // If no items but we have content_name, create a single content entry\n if (contents.length === 0 && payload.content_name) {\n contents.push({\n content_id: payload.step || \"unknown\",\n content_type: \"product\",\n content_name: payload.content_name,\n quantity: 1,\n price: round(totalValue / 100, 2),\n });\n }\n\n // Build base event payload\n const eventPayload: Record<string, unknown> = {\n currency: payload.currency || \"PLN\",\n value: round(totalValue / 100, 2),\n };\n\n if (contents.length > 0) {\n eventPayload.contents = contents;\n }\n\n // Map event names to TikTok events\n let eventName: string | null = null;\n switch (payload.event) {\n case \"purchase\":\n eventName = \"Purchase\";\n break;\n case \"addToCart\":\n eventName = \"AddToCart\";\n break;\n case \"initiateCheckout\":\n eventName = \"InitiateCheckout\";\n break;\n case \"customizeProduct\":\n eventName = \"CustomizeProduct\";\n break;\n case \"viewCart\":\n return undefined;\n // // TikTok doesn't have a ViewCart event, use ViewContent as fallback\n // eventName = 'ViewContent'\n break;\n case \"removeFromCart\":\n return undefined;\n // // TikTok doesn't have a RemoveFromCart event, use ViewContent as fallback\n // eventName = 'ViewContent'\n break;\n case \"lead\":\n return undefined;\n // // TikTok doesn't have a standard Lead event, use ViewContent as fallback\n // eventName = 'ViewContent'\n break;\n default:\n return null;\n }\n\n return {\n eventName,\n eventPayload,\n };\n}\n","export function round(num: number, numberOfDecimals: number = 2): number {\n return Number(\n +(\n Math.round(Number(num + \"e+\" + numberOfDecimals)) +\n \"e-\" +\n numberOfDecimals\n )\n );\n}\n\nexport function formatCurrency(amount: number, currency: string): string {\n const language = typeof navigator === \"undefined\" ? \"pl-PL\" : navigator.language;\n const formatter = Intl.NumberFormat(language, {\n style: \"currency\",\n currency: currency,\n currencyDisplay: \"symbol\",\n });\n\n return formatter.format(amount / 100);\n}\n\nexport function formatPriceWithoutCurrency(amount: number, currency: string) {\n let language = \"pl\";\n if (typeof navigator != \"undefined\") {\n language = navigator.language;\n }\n const result = new Intl.NumberFormat(language, {\n style: \"currency\",\n currency,\n currencyDisplay: \"code\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n .formatToParts(amount / 100)\n .filter((x) => x.type !== \"currency\")\n .filter((x) => x.type !== \"literal\" || x.value.trim().length !== 0)\n .map((x) => x.value)\n .join(\"\");\n\n const regex = new RegExp(`(\\\\.00)(?=\\\\D*$)`);\n return result.replace(regex, \"\");\n}\n","import { GetPreOrderDetailsResponse } from \"src/gen/proto/public/v1/public_api_pb\";\nimport { Checkout, GooglePayConfig } from \"./CartProvider\";\nimport { formatCurrency, round } from \"./lib/round.number\";\nimport { SingleProduct } from \"./product.details.model\";\nimport { getLocale } from \"./locale\";\nimport { getCheckoutText, type CheckoutTexts } from \"./texts\";\n\nexport function mapGooglePayConfiguration(args: {\n items: {\n id: string;\n productID: string;\n quantity: number;\n metadata?: {\n [key: string]: string | undefined;\n };\n details?: SingleProduct;\n }[];\n googlePayConfig: GooglePayConfig;\n checkout: Checkout;\n result: GetPreOrderDetailsResponse;\n cartRequiresShipping: boolean;\n locale?: string;\n texts?: Partial<CheckoutTexts>;\n}): google.payments.api.PaymentDataRequest | undefined {\n const { items, googlePayConfig, checkout, result, cartRequiresShipping } =\n args;\n const locale = args.locale ?? getLocale();\n if (result.totalAmount == null) {\n return undefined;\n }\n let intents: google.payments.api.CallbackIntent[] = [];\n if (cartRequiresShipping) {\n intents.push(\"SHIPPING_ADDRESS\");\n intents.push(\"SHIPPING_OPTION\");\n }\n\n const returnValue: google.payments.api.PaymentDataRequest = {\n apiVersion: 2,\n apiVersionMinor: 0,\n callbackIntents: intents,\n allowedPaymentMethods: [\n {\n type: \"CARD\",\n parameters: {\n allowedAuthMethods: [\"PAN_ONLY\", \"CRYPTOGRAM_3DS\"],\n allowedCardNetworks: [\"MASTERCARD\", \"VISA\"],\n },\n tokenizationSpecification: {\n type: \"PAYMENT_GATEWAY\",\n parameters: {\n gateway: googlePayConfig.gateway,\n gatewayMerchantId: googlePayConfig.gatewayId,\n },\n },\n },\n ],\n emailRequired: true,\n shippingAddressParameters: {\n phoneNumberRequired: cartRequiresShipping,\n },\n shippingAddressRequired: cartRequiresShipping,\n shippingOptionRequired: cartRequiresShipping,\n shippingOptionParameters: cartRequiresShipping\n ? {\n shippingOptions: result.methods.slice(0, 5).map((method) => ({\n id: method.id,\n label:\n method.name +\n \" - \" +\n `${formatCurrency(method.amount, result.currency)}`,\n description: method.description ?? \"\",\n })),\n defaultSelectedOptionId: result.selectedDeliveryMethod,\n }\n : undefined,\n merchantInfo: {\n merchantId: googlePayConfig.merchantId + \"\",\n merchantName: googlePayConfig.merchantName,\n },\n transactionInfo: {\n totalPriceStatus: \"FINAL\",\n totalPriceLabel: getCheckoutText(\"paymentForCart\", locale, args.texts),\n totalPrice: `${round(result.totalAmount / 100, 2)}`,\n currencyCode: result.currency,\n countryCode: result.country,\n checkoutOption: \"COMPLETE_IMMEDIATE_PURCHASE\",\n displayItems: mapGooglePayDisplayItems(\n items,\n result.methods,\n result.selectedDeliveryMethod ??\n (result.methods.length > 0 ? result.methods[0].id : undefined),\n checkout.couponCode,\n result.couponValue,\n getCheckoutText(\"coupon\", locale, args.texts)\n ),\n },\n };\n return returnValue;\n}\n\nfunction mapGooglePayDisplayItems(\n items: {\n id: string;\n productID: string;\n quantity: number;\n metadata?: {\n [key: string]: string | undefined;\n };\n details?: SingleProduct;\n }[],\n methods: GetPreOrderDetailsResponse[\"methods\"],\n deliveryMethod?: string,\n couponCode?: string,\n couponValue?: number,\n couponLabel: string = \"Coupon\"\n): google.payments.api.DisplayItem[] {\n const displayItems: google.payments.api.DisplayItem[] = [];\n\n let subtotalAmount = 0;\n for (const item of items) {\n if (item.details == null) {\n continue;\n }\n const unitPrice = item.details.pricing?.effectivePrice ?? item.details.price;\n subtotalAmount += unitPrice * item.quantity;\n displayItems.push({\n label: item.details.name + \" x \" + item.quantity,\n price: `${round(unitPrice / 100, 2)}`,\n type: \"LINE_ITEM\",\n status: \"FINAL\",\n });\n }\n\n const selectedDeliveryMethod = methods.find(\n (method) => method.id === deliveryMethod\n );\n if (selectedDeliveryMethod != null) {\n displayItems.push({\n label: selectedDeliveryMethod.name,\n price: `${round(selectedDeliveryMethod.amount / 100, 2)}`,\n type: \"SHIPPING_OPTION\",\n status: \"FINAL\",\n });\n }\n\n if (couponCode != null && couponValue != null) {\n displayItems.push({\n label: `${couponLabel} ${couponCode}`,\n price: `${round(couponValue / 100, 2)}`,\n type: \"DISCOUNT\",\n status: \"FINAL\",\n });\n }\n if (subtotalAmount > 0) {\n displayItems.push({\n label: \"Subtotal\",\n price: `${round(subtotalAmount / 100, 2)}`,\n type: \"SUBTOTAL\",\n status: \"FINAL\",\n });\n }\n\n return displayItems;\n}\n","import { HOST } from \"./constants\";\n\nexport function buildURL(projectID: string, path: string): string {\n return `${HOST}/api/integrations/${projectID}/public-commerce${path}`;\n}\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport type Err = {\n ERR: true;\n error: unknown;\n type?: ErrTypes;\n data?: unknown;\n};\n\ntype ErrTypes = \"internal\" | \"badInput\" | \"notFound\";\n\nexport function isErr(x: unknown): x is Err {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return typeof x === \"object\" && x != null && \"ERR\" in x;\n}\n\nexport function Err(message: string, type?: ErrTypes, data?: unknown): Err {\n return { ERR: true, error: message, type: type, data: data };\n}\n\nexport async function tryFail<T>(\n f: (() => Promise<T>) | (() => T)\n): Promise<T | Err> {\n try {\n return await f();\n } catch (e) {\n return { ERR: true, error: e };\n }\n}\n\nexport function assertOk<T>(x: T | Err) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (isErr(x)) throw Error((x.error as any).toString());\n}\n","type MatchableProduct = {\n id: string;\n variants?: { id: string }[] | null;\n};\n\n/**\n * The product from a `/products` response that serves a cart item: the\n * product itself or the product that has it as a variant.\n */\nexport function findProductForCartItem<T extends MatchableProduct>(\n productID: string,\n products: T[] | undefined,\n): T | undefined {\n return products?.find(\n (el) =>\n el.id === productID ||\n (el.variants?.some((variant) => variant.id === productID) ?? false),\n );\n}\n\n/** Requested product IDs that the backend did not resolve. */\nexport function findMissingProductIDs(\n requested: string[],\n resolved: { productID: string }[],\n): string[] {\n const found = new Set(resolved.map((el) => el.productID));\n return Array.from(new Set(requested.filter((id) => !found.has(id))));\n}\n\n/**\n * The product page URL a cart item links to: absolute (resolved against the\n * page that adds the item) and only `http`/`https`, so a `javascript:` link\n * never reaches the cart. Anything else gives `undefined`.\n */\nexport function cartItemURL(\n url: string | undefined,\n base?: string,\n): string | undefined {\n const value = url?.trim();\n if (value == null || value.length === 0) {\n return undefined;\n }\n try {\n const resolved = new URL(value, base);\n if (resolved.protocol !== \"http:\" && resolved.protocol !== \"https:\") {\n return undefined;\n }\n return resolved.href;\n } catch {\n return undefined;\n }\n}\n","import { create } from 'zustand';\n\ninterface CheckoutStore {\n isCartVisible: boolean;\n /** A message for the buyer raised outside of the drawer; the drawer shows it as an error. */\n notice: string | undefined;\n setNotice: (notice: string | undefined) => void;\n numberOfProductsInCart: number;\n showCart: () => void;\n hideCart: () => void;\n setNumberOfProductsInCart: (numberOfProductsInCart: number) => void;\n}\n\nexport const useCheckoutStore = create<CheckoutStore>((set) => ({\n isCartVisible: false,\n notice: undefined,\n setNotice: (notice) => set((state) => ({ ...state, notice })),\n numberOfProductsInCart: 0,\n showCart: () => set((state) => ({ ...state, isCartVisible: true })),\n hideCart: () => set((state) => ({ ...state, isCartVisible: false })),\n setNumberOfProductsInCart: (numberOfProductsInCart: number) => set((state) => ({ ...state, numberOfProductsInCart: numberOfProductsInCart })),\n}))\n","import { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { getLocale } from \"./locale\";\nimport {\n getCheckoutText,\n type CheckoutTextKey,\n type CheckoutTexts,\n} from \"./texts\";\n\ntype CheckoutTextsContextValue = {\n locale?: string;\n texts?: Partial<CheckoutTexts>;\n};\n\nconst CheckoutTextsContext = createContext<CheckoutTextsContextValue>({});\n\n/**\n * Checkout scoped texts provider. Carries the `texts` overrides and the\n * `locale` prop down to the checkout tree, so nothing leaks outside of it.\n */\nexport function CheckoutTextsProvider({\n texts,\n locale,\n children,\n}: {\n texts?: Partial<CheckoutTexts>;\n locale?: string;\n children: ReactNode;\n}) {\n const value = useMemo(() => ({ texts, locale }), [texts, locale]);\n\n return (\n <CheckoutTextsContext.Provider value={value}>\n {children}\n </CheckoutTextsContext.Provider>\n );\n}\n\n/** The `texts` overrides and `locale` of the surrounding checkout, if any. */\nexport function useCheckoutTextsConfig(): CheckoutTextsContextValue {\n return useContext(CheckoutTextsContext);\n}\n\n/**\n * Returns the checkout string for `key`: the caller override when provided,\n * otherwise the default for the `locale` prop (or the active locale).\n */\nexport function useCheckoutText(key: CheckoutTextKey): string {\n const { texts, locale } = useContext(CheckoutTextsContext);\n\n return getCheckoutText(key, locale ?? getLocale(), texts);\n}\n\n/**\n * Like `useCheckoutText`, for a key picked at runtime (for example from a\n * backend error code).\n */\nexport function useCheckoutTextResolver(): (key: CheckoutTextKey) => string {\n const { texts, locale } = useContext(CheckoutTextsContext);\n const activeLocale = locale ?? getLocale();\n\n return useMemo(\n () => (key: CheckoutTextKey) => getCheckoutText(key, activeLocale, texts),\n [activeLocale, texts],\n );\n}\n","/**\n * The cart is cleared once the payment is confirmed, not when the buyer is\n * sent to the payment page: a buyer who comes back from the gateway unpaid\n * still has the cart. Before redirecting we remember which order was created;\n * `reconcilePendingOrder` later asks the backend for its status.\n */\n\nexport const PENDING_ORDER_KEY = \"bitsnap-pending-order\";\n/** A pending order older than this is forgotten without asking the backend. */\nexport const PENDING_ORDER_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\n/** A cart line as it was when the buyer left: the line id and how many were ordered. */\nexport type PendingOrderLine = { id: string; quantity: number };\n\nexport type PendingOrder = {\n orderId: string;\n /** The project id of the order, as the payment page URL / `/buy` response gives it. */\n projectId: string;\n /** The project id of the cart the order was made from (the page's project). */\n cartProjectId?: string;\n /** The cart lines the order was made of; only these are removed once it is paid. */\n lines: PendingOrderLine[];\n /** When the buyer was sent to the payment page (ms since epoch). */\n ts: number;\n};\n\n/** The cart without the lines (and quantities) of a paid order; lines added afterwards stay. */\nexport function subtractOrderLines<T extends { id: string; quantity: number }>(\n cart: T[],\n lines: PendingOrderLine[],\n): T[] {\n const ordered = new Map<string, number>();\n for (const line of lines) {\n ordered.set(line.id, (ordered.get(line.id) ?? 0) + line.quantity);\n }\n const rest: T[] = [];\n for (const item of cart) {\n const quantity = ordered.get(item.id);\n if (quantity == null) {\n rest.push(item);\n } else if (item.quantity > quantity) {\n rest.push({ ...item, quantity: item.quantity - quantity });\n }\n }\n return rest;\n}\n\n/** `unknown` is an order the backend does not know (yet) or a status we do not recognise. */\nexport type OrderStatus = \"created\" | \"paid\" | \"canceled\" | \"unknown\";\n\nexport type PendingOrderOutcome =\n /** Nothing was pending. */\n | \"none\"\n /** Paid: its cart lines were removed and the order forgotten. */\n | \"paid\"\n /** Canceled: the order was forgotten, the cart stays. */\n | \"canceled\"\n /** Older than 24 hours: the order was forgotten, the cart stays. */\n | \"expired\"\n /** Not paid yet or the backend could not be asked: kept for the next time. */\n | \"pending\";\n\nexport type PendingOrderStorage = Pick<\n Storage,\n \"getItem\" | \"setItem\" | \"removeItem\"\n>;\n\n/** The backend is asked about the same pending order at most this often. */\nexport const PENDING_ORDER_MIN_ASK_INTERVAL_MS = 60 * 1000;\n\n/**\n * Wraps `fetchStatus` so the same order is asked about at most once per\n * `minIntervalMs`; in between it rejects, which `reconcilePendingOrder` treats\n * as \"keep it for the next time\". A new order is asked about right away.\n */\nexport function throttleOrderStatus(\n fetchStatus: (order: PendingOrder) => Promise<OrderStatus>,\n now: () => number = Date.now,\n minIntervalMs: number = PENDING_ORDER_MIN_ASK_INTERVAL_MS,\n): (order: PendingOrder) => Promise<OrderStatus> {\n let last: { key: string; at: number } | undefined;\n return (order) => {\n const key = `${order.orderId}:${order.ts}`;\n const at = now();\n if (last?.key === key && at - last.at < minIntervalMs) {\n return Promise.reject(new Error(\"pending order was asked about recently\"));\n }\n last = { key, at };\n return fetchStatus(order);\n };\n}\n\n/** `/payment/common/<projectId>/<orderId>` of the payment page the /buy response points to. */\nexport function parseOrderFromPaymentUrl(\n url: string | undefined,\n): { orderId: string; projectId: string } | undefined {\n if (url == null || url.length === 0) {\n return undefined;\n }\n try {\n const path = new URL(url, \"https://bitsnap.invalid\").pathname;\n const match = /\\/payment\\/common\\/([^/]+)\\/([^/]+)\\/?$/.exec(path);\n if (match == null) {\n return undefined;\n }\n return {\n projectId: decodeURIComponent(match[1]),\n orderId: decodeURIComponent(match[2]),\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * The order to wait for after redirecting to `response.url`: the ids of the\n * /buy response, else the ones in the payment page URL. `undefined` when\n * neither tells which order it is.\n */\nexport function resolvePendingOrder(\n response: { url: string; orderId?: string; projectId?: string },\n now: number = Date.now(),\n cart: { cartProjectId?: string; lines?: PendingOrderLine[] } = {},\n): PendingOrder | undefined {\n const fromUrl = parseOrderFromPaymentUrl(response.url);\n const orderId = nonEmpty(response.orderId) ?? fromUrl?.orderId;\n const projectId = nonEmpty(response.projectId) ?? fromUrl?.projectId;\n if (orderId == null || projectId == null) {\n return undefined;\n }\n return {\n orderId,\n projectId,\n ...(cart.cartProjectId != null ? { cartProjectId: cart.cartProjectId } : {}),\n lines: cart.lines ?? [],\n ts: now,\n };\n}\n\n/**\n * Remembers the order of a payment page the buyer is about to be sent to.\n * `false` when it cannot tell which order it is (or cannot store it): the\n * caller then keeps clearing the cart on its own.\n */\nexport function rememberPendingOrder(\n response: { url: string; orderId?: string; projectId?: string },\n options: {\n storage?: PendingOrderStorage;\n cartProjectId?: string;\n lines?: PendingOrderLine[];\n now?: number;\n } = {},\n): boolean {\n const order = resolvePendingOrder(response, options.now, options);\n return order != null && savePendingOrder(order, options.storage);\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value != null && value.length > 0 ? value : undefined;\n}\n\nfunction defaultStorage(): PendingOrderStorage | undefined {\n try {\n return typeof localStorage === \"undefined\" ? undefined : localStorage;\n } catch {\n return undefined;\n }\n}\n\nexport function savePendingOrder(\n order: PendingOrder,\n storage: PendingOrderStorage | undefined = defaultStorage(),\n): boolean {\n try {\n storage?.setItem(PENDING_ORDER_KEY, JSON.stringify(order));\n return storage != null;\n } catch {\n return false;\n }\n}\n\nexport function readPendingOrder(\n storage: PendingOrderStorage | undefined = defaultStorage(),\n): PendingOrder | undefined {\n try {\n const raw = storage?.getItem(PENDING_ORDER_KEY);\n if (raw == null) {\n return undefined;\n }\n const value: unknown = JSON.parse(raw);\n if (\n typeof value === \"object\" &&\n value != null &&\n typeof (value as PendingOrder).orderId === \"string\" &&\n typeof (value as PendingOrder).projectId === \"string\" &&\n typeof (value as PendingOrder).ts === \"number\" &&\n (value as PendingOrder).orderId.length > 0\n ) {\n const { orderId, projectId, cartProjectId, ts, lines } = value as PendingOrder;\n return {\n orderId,\n projectId,\n ...(typeof cartProjectId === \"string\" ? { cartProjectId } : {}),\n lines: Array.isArray(lines)\n ? lines.filter(\n (line) =>\n typeof line?.id === \"string\" && typeof line.quantity === \"number\",\n )\n : [],\n ts,\n };\n }\n } catch {\n // a broken value is dropped below\n }\n clearPendingOrder(storage);\n return undefined;\n}\n\nexport function clearPendingOrder(\n storage: PendingOrderStorage | undefined = defaultStorage(),\n) {\n try {\n storage?.removeItem(PENDING_ORDER_KEY);\n } catch {\n // storage is not available\n }\n}\n\n/** Status text of the `getOrder` answer (`details.status`), `unknown` when missing. */\nexport function orderStatusFromResponse(response: {\n details?: { status?: string; $unknown?: unknown };\n}): OrderStatus {\n const status =\n response.details?.status ?? readUnknownStatus(response.details?.$unknown);\n return status === \"created\" || status === \"paid\" || status === \"canceled\"\n ? status\n : \"unknown\";\n}\n\n/**\n * `status` is field 3 of `OrderDetails`. A generated client that predates it\n * keeps the field as an unknown field; read the string from there.\n */\nfunction readUnknownStatus(unknown: unknown): string | undefined {\n if (!Array.isArray(unknown)) {\n return undefined;\n }\n for (const field of unknown as { no?: number; wireType?: number; data?: Uint8Array }[]) {\n if (field?.no === 3 && field.wireType === 2 && field.data instanceof Uint8Array) {\n // `data` is the length varint followed by the bytes.\n let length = 0;\n let offset = 0;\n for (let shift = 0; offset < field.data.length && shift < 35; shift += 7) {\n const byte = field.data[offset++];\n length |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) break;\n }\n if (offset + length !== field.data.length) {\n return undefined;\n }\n try {\n return new TextDecoder().decode(field.data.subarray(offset));\n } catch {\n return undefined;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Settles the order that was pending when the buyer left for the payment\n * page. Paid: removes the order's cart lines (not what was added since),\n * forgets the order. Canceled or older than 24 hours: forgets the order only.\n * Anything else (not paid yet, backend or network error) keeps it for the\n * next call. An order of another project (`projectId` is the cart's project\n * id) is left alone and not asked about.\n */\nexport async function reconcilePendingOrder(deps: {\n fetchStatus: (order: PendingOrder) => Promise<OrderStatus>;\n removeLines: (lines: PendingOrderLine[]) => Promise<unknown> | unknown;\n /** The project of the page; an order made from another project's cart is skipped. */\n projectId?: string;\n storage?: PendingOrderStorage;\n now?: () => number;\n}): Promise<PendingOrderOutcome> {\n const storage = deps.storage ?? defaultStorage();\n const order = readPendingOrder(storage);\n if (order == null) {\n return \"none\";\n }\n\n const now = (deps.now ?? Date.now)();\n if (now - order.ts > PENDING_ORDER_MAX_AGE_MS) {\n clearPendingOrder(storage);\n return \"expired\";\n }\n\n if (\n deps.projectId != null &&\n order.cartProjectId != null &&\n order.cartProjectId !== deps.projectId\n ) {\n return \"pending\";\n }\n\n let status: OrderStatus;\n try {\n status = await deps.fetchStatus(order);\n } catch {\n return \"pending\";\n }\n\n // The buyer may have started another payment while we were asking.\n const current = readPendingOrder(storage);\n if (current?.orderId !== order.orderId || current.ts !== order.ts) {\n return \"pending\";\n }\n\n if (status === \"paid\") {\n try {\n await deps.removeLines(order.lines);\n } catch {\n return \"pending\";\n }\n clearPendingOrder(storage);\n return \"paid\";\n }\n // A canceled order may still be paid again (PayU keeps it payable after a\n // declined attempt), so it is kept until it is paid or too old.\n return \"pending\";\n}\n","import { Err } from \"./lib/err\";\nimport type { CheckoutTextKey } from \"./texts\";\n\n/** Longest plain text body that is still shown to the shopper. */\nconst MAX_PLAIN_MESSAGE_LENGTH = 200;\n\n/** Code of an Err that carries the ids of unavailable products in `data`. */\nexport const ITEM_IDS_NOT_FOUND = \"item-ids-not-found\";\n\n/** Code used when the backend gave no (or an unknown) reason. */\nexport const INTERNAL_ERROR = \"internal-error\";\n\n/** What the buy endpoints failed with, after reading whatever the body was. */\nexport type ParsedBuyError = {\n /** Backend `code`, or `internal-error` when the body has none. */\n code: string;\n /** Human readable reason from the server, when there was a usable one. */\n message?: string;\n /** Ids of the products that cannot be bought. */\n itemIds?: string[];\n};\n\n/**\n * `data` of a buy Err that is not `item-ids-not-found`. `itemIds` is set when\n * the backend listed products under a code other than \"not available\".\n */\nexport type BuyErrorData = { message?: string; itemIds?: string[] };\n\n/**\n * Backend codes that have a shopper-friendly text. Any other 4xx code falls\n * back to the server message; `internal` and `invalid-request` show the\n * generic text.\n */\nconst BUY_ERROR_TEXT_KEYS: Record<string, CheckoutTextKey> = {\n \"no-payment-gateway\": \"noPaymentGateway\",\n \"gateway-not-configured\": \"gatewayNotConfigured\",\n \"shipping-not-configured\": \"shippingNotConfigured\",\n \"mixed-recurring\": \"mixedRecurring\",\n \"currency-unsupported\": \"currencyUnsupported\",\n \"price-changed\": \"priceChanged\",\n \"product-not-found\": \"unavailableProducts\",\n \"product-not-available\": \"unavailableProducts\",\n};\n\n/** Codes whose server message is not meant for the shopper. */\nconst GENERIC_TEXT_CODES = new Set([\"internal\", \"invalid-request\"]);\n\n/** Codes (besides a missing one) under which `itemIds` mean unavailable products. */\nconst ITEM_IDS_CODES = new Set([\"product-not-available\", \"product-not-found\"]);\n\nexport function buyErrorTextKey(code: unknown): CheckoutTextKey | undefined {\n return typeof code === \"string\" && Object.hasOwn(BUY_ERROR_TEXT_KEYS, code)\n ? BUY_ERROR_TEXT_KEYS[code]\n : undefined;\n}\n\nfunction looksLikeMarkup(text: string): boolean {\n return /<\\/?[a-z!?][^>]*>/i.test(text);\n}\n\n/**\n * A bare code such as `internal_error`, `INTERNAL_ERROR` or `ECONNREFUSED`, or\n * a stringified non-message: not meant to be read by a shopper.\n */\nfunction looksLikeCode(text: string): boolean {\n return (\n // A capitalised word (\"Ups\") still reads as a message.\n (/^[A-Za-z][A-Za-z0-9]*(?:[-_.:][A-Za-z0-9]+)*$/.test(text) &&\n !/^[A-Z][a-z]+$/.test(text)) ||\n /^\\[object \\w+\\]$|^(?:undefined|null)$/.test(text)\n );\n}\n\nfunction looksLikeStack(text: string): boolean {\n return /Error:/.test(text) || /\\n\\s+at /.test(text);\n}\n\nfunction plainMessage(text: string): string | undefined {\n const trimmed = text.trim();\n if (\n trimmed.length === 0 ||\n trimmed.length > MAX_PLAIN_MESSAGE_LENGTH ||\n /[\\r\\n]/.test(trimmed) ||\n looksLikeMarkup(trimmed) ||\n looksLikeCode(trimmed) ||\n looksLikeStack(trimmed)\n ) {\n return undefined;\n }\n return trimmed;\n}\n\ntype UnwrappedError = { message?: string; code?: string };\n\n/** How many levels (a JSON string or an object each) `error` is unwrapped. */\nconst MAX_UNWRAP_DEPTH = 3;\n\n/**\n * Old backends put a JSON string such as `{\"message\":\"...\"}` (or\n * `{\"error\":\"...\",\"code\":\"...\"}`) in `error`.\n */\nfunction unwrapMessage(error: unknown, depth = 0): UnwrappedError {\n if (typeof error === \"object\" && error != null) {\n if (Array.isArray(error) || depth >= MAX_UNWRAP_DEPTH) {\n return {};\n }\n const inner = error as { error?: unknown; message?: unknown; code?: unknown };\n let result = unwrapMessage(inner.error, depth + 1);\n if (result.message == null && inner.message != null) {\n const fromMessage = unwrapMessage(inner.message, depth + 1);\n result = { ...fromMessage, code: result.code ?? fromMessage.code };\n }\n if (typeof inner.code === \"string\" && inner.code.length > 0) {\n result.code = inner.code;\n }\n return result;\n }\n if (typeof error !== \"string\") {\n return {};\n }\n try {\n const inner: unknown = JSON.parse(error);\n // A JSON scalar (`\"123\"`, `\"null\"`, `\"\\\"text\\\"\"`) is not a message.\n return typeof inner === \"object\" && inner != null\n ? unwrapMessage(inner, depth + 1)\n : {};\n } catch {\n // Not JSON: the string itself is the message.\n }\n return { message: plainMessage(error) };\n}\n\n/**\n * Reads the body of a failed buy response, whatever its Content-Type was:\n * `{ success, code, error, itemIds }` JSON, the old `{ error }` shapes, plain\n * text, or nothing.\n */\nexport function parseBuyError(bodyText: string): ParsedBuyError {\n let payload: unknown;\n try {\n payload = JSON.parse(bodyText);\n } catch {\n return { code: INTERNAL_ERROR, message: plainMessage(bodyText) };\n }\n\n if (typeof payload === \"string\") {\n return { code: INTERNAL_ERROR, message: plainMessage(payload) };\n }\n if (typeof payload !== \"object\" || payload == null) {\n return { code: INTERNAL_ERROR };\n }\n\n const body = payload as { code?: unknown; error?: unknown; itemIds?: unknown };\n const { message, code: innerCode } = unwrapMessage(body.error);\n const parsed: ParsedBuyError = {\n code:\n typeof body.code === \"string\" && body.code.length > 0\n ? body.code\n : (innerCode ?? INTERNAL_ERROR),\n message,\n };\n if (Array.isArray(body.itemIds)) {\n parsed.itemIds = body.itemIds.filter(\n (id): id is string => typeof id === \"string\",\n );\n }\n return parsed;\n}\n\n/** The Err returned by the buy calls for a failed response. */\nexport function buyErrorFromResponse(status: number, bodyText: string): Err {\n const { code, message, itemIds } = parseBuyError(bodyText);\n const hasItemIds = itemIds != null && itemIds.length > 0;\n if (hasItemIds && (code === INTERNAL_ERROR || ITEM_IDS_CODES.has(code))) {\n return Err(ITEM_IDS_NOT_FOUND, \"badInput\", itemIds);\n }\n const data: BuyErrorData = { message };\n if (hasItemIds) {\n data.itemIds = itemIds;\n }\n return Err(code, status >= 500 ? \"internal\" : \"badInput\", data);\n}\n\n/**\n * The text a shopper sees for a buy Err: the text mapped to the backend\n * code; the generic one for server errors and `invalid-request`; else the\n * server message of a 4xx, else the generic one. Never the bare code.\n */\nexport function buyErrorText(\n err: { error: unknown; type?: string; data?: unknown },\n getText: (key: CheckoutTextKey) => string,\n): string {\n const key = buyErrorTextKey(err.error);\n if (key != null) {\n return getText(key);\n }\n if (\n err.type === \"internal\" ||\n (typeof err.error === \"string\" && GENERIC_TEXT_CODES.has(err.error))\n ) {\n return getText(\"checkoutFailed\");\n }\n const message = (err.data as BuyErrorData | null | undefined)?.message;\n if (typeof message === \"string\" && message.length > 0) {\n return message;\n }\n return getText(\"checkoutFailed\");\n}\n","import type { Instrument } from \"@/src/analytics/instrument\";\nimport { visitorHeaders } from \"@/src/analytics/core\";\nimport { clientHeaders } from \"@/src/lib/client-header\";\nimport { getCheckoutMethods, getLocale, getProjectID } from \"./CartProvider\";\nimport { HOST } from \"./constants\";\nimport { buyErrorFromResponse } from \"./buy-error\";\nimport { buildURL } from \"./helper.methods\";\nimport { Err } from \"./lib/err\";\nimport { LinkRequest } from \"./link.request.schema\";\nimport { useCheckoutStore } from \"./state\";\n\nexport namespace Bitsnap {\n /**\n * Adds a product or variant to the cart. Returns an `Err` instead of adding\n * anything when the backend does not know the id\n * (`item-ids-not-found`, with the unknown ids in `data`).\n *\n * `args.url` is the product page: the cart links the item's image and name\n * to it. A relative URL is resolved against the current page; only `http`\n * and `https` links are kept.\n */\n export async function addProductToCart(\n id: string,\n quantity: number = 1,\n metadata?: Record<string, string | undefined>,\n // Those fields are used to send the price and currency to the analytics\n args?: {\n /** Product page the cart item links to. */\n url?: string;\n name?: string;\n price?: number;\n currency?: string;\n /** Where `add_to_cart` is reported. Defaults to the mounted `<BitsnapCheckout>`. */\n analytics?: Instrument;\n },\n ) {\n const projectID = getProjectID();\n if (projectID == null) {\n throw new Error(\"No project ID found\");\n }\n\n const methods = getCheckoutMethods(projectID);\n\n const err = await methods.addProduct({\n productID: id,\n quantity: quantity,\n metadata: metadata,\n ...args,\n });\n if (err != null) {\n return err;\n }\n\n return undefined;\n }\n\n export function showCart() {\n useCheckoutStore.setState({ isCartVisible: true });\n }\n\n export function hideCart() {\n useCheckoutStore.setState({ isCartVisible: false });\n }\n}\n\nasync function readBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n}\n\nexport async function createPaymentURL(request: LinkRequest) {\n const projectID = getProjectID();\n if (projectID == null) {\n throw new Error(\"No project ID found\");\n }\n\n request = injectReferenceToRequestIfNeeded(request);\n request.locale ??= getLocale();\n\n const result = await fetch(buildURL(projectID, \"/buy\"), {\n method: \"POST\",\n headers: {\n ...clientHeaders,\n ...visitorHeaders(projectID),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (result.status != 200) {\n const err = buyErrorFromResponse(result.status, await readBody(result));\n console.warn(\"cannot create payment URL\", result.status, err.error);\n return err;\n }\n\n const response: {\n url: string;\n sessionID: string;\n orderId?: string;\n projectId?: string;\n } = await result.json();\n\n return {\n url: response.url,\n ...(response.orderId != null ? { orderId: response.orderId } : {}),\n ...(response.projectId != null ? { projectId: response.projectId } : {}),\n };\n}\n\n/**\n * What `createCheckout` resolves to. A failed response is an `Err` that also\n * has `status: \"error\"`, so `result.status === \"ok\"` narrows to the success.\n */\nexport type CreateCheckoutResult =\n | { status: \"ok\"; redirectURL: string }\n | (Err & { status: \"error\" });\n\nexport async function createCheckout(\n request: LinkRequest & { apiKey?: string; testMode?: boolean },\n): Promise<CreateCheckoutResult> {\n const projectID = getProjectID();\n if (projectID == null) {\n throw new Error(\"No project ID found\");\n }\n\n const headers = {\n ...clientHeaders,\n ...visitorHeaders(projectID),\n \"Content-Type\": \"application/json\",\n ...(request.apiKey != null\n ? { Authorization: `Bearer ${request.apiKey}` }\n : {}),\n };\n\n const path = request.testMode\n ? `/api/payment/link/auto/${projectID}/test`\n : `/api/payment/link/auto/${projectID}`;\n\n delete request.apiKey;\n delete request.testMode;\n request.locale ??= getLocale();\n\n const response = await fetch(HOST + path, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n // `status` keeps `result.status === \"ok\"` narrowing for existing callers.\n return {\n ...buyErrorFromResponse(response.status, await readBody(response)),\n status: \"error\" as const,\n };\n }\n\n const payload: {\n url: string;\n } = await response.json();\n\n return {\n status: \"ok\" as const,\n redirectURL: payload.url,\n };\n}\n\nexport function getReferenceIfPossible(): string | undefined {\n if (typeof localStorage == \"undefined\") {\n return undefined;\n }\n const refLink = localStorage.getItem(\"bitsnap-ref\");\n if (refLink == null) {\n return undefined;\n }\n return refLink;\n}\n\nexport function injectReferenceToRequestIfNeeded(\n request: LinkRequest,\n): LinkRequest {\n const ref = getReferenceIfPossible();\n if (ref == null) {\n return request;\n }\n\n if (request.metadata == null) {\n request.metadata = {};\n }\n request.metadata[\"ref\"] = ref;\n return request;\n}\n"],"mappings":"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","names":["useAutoAnimate","useEffect","useState","jsx","Card","className","props","cn","CardHeader","CardTitle","CardDescription","CardContent","className","props","jsx","cn","React","OTPInput","OTPInputContext","MinusIcon","jsx","jsxs","InputOTP","className","containerClassName","props","OTPInput","cn","InputOTPGroup","InputOTPSlot","index","inputOTPContext","OTPInputContext","char","hasFakeCaret","isActive","InputOTPSeparator","MinusIcon","REGEXP_ONLY_DIGITS","jsx","jsxs","LoadingIndicator","LoadingIndicator_default","RETURN_URL_PARAM","RETURN_URL_STORAGE_KEY","ACCESS_TOKEN_PARAM","getReturnURLFromSearch","search","raw","validateReturnURL","persistReturnURL","returnURL","readPersistedReturnURL","stored","isOriginAllowed","origin","allowedOrigins","allowed","allowedHost","originHost","u","getAllowedReturnOrigins","buildAccessTokenRedirect","accessToken","jsx","jsxs","knownSiblings","getAllowedReturnOrigins","setAllowedReturnOrigins","LoginUserPanel","projectID","host","reveal","email","setEmail","loginUser","isLoginLoading","errMsg","configuredProjectID","configuredHost","usePanelConfig","getPanelSession","isValidEmail","setIsValidEmail","useState","emailValidation","input","handleInputChange","e","value","goToVerifyCode","onSubmit","cn","Card","CardHeader","CardTitle","CardDescription","CardContent","Label","Input","Button","LoadingIndicator_default","VerifyCodePanel","loginUserResponse","setLoginUserResponse","setResponseStatus","instrument","useInstrumentContext","verifyCodeAsync","isVerifyLoading","useMutation","rpcProvider","code","setCode","isValidCode","setIsValidCode","isSubmitted","setIsSubmitted","retryIn","setRetryIn","codeValidation","login","codeValue","verifyCodeResult","status","message","accessToken","savePanelSession","returnURL","readPersistedReturnURL","buildAccessTokenRedirect","handleRetryInTime","intervalId","prevRetryIn","useEffect","backToLoginComponent","onCodeSubmit","InputOTP","REGEXP_ONLY_DIGITS","newValue","InputOTPGroup","InputOTPSlot","InputOTPSeparator","PanelLoginComponentWrapper","analytics","theme","allowedReturnOrigins","useInstrument","styles","activeScreen","setActiveScreen","parent","useAutoAnimate","prevScreen","responseStatus","loginUserAsync","setErrMsg","queryReturnURL","getReturnURLFromSearch","persistReturnURL","existingToken","loginUserResult","InstrumentProvider","PanelLogin","useAutoAnimate","useEffect","useState","useState","useCallback","useEffect","useUrlSearchParams","initialValue","params","setParams","urlParams","parsed","key","value","updateParams","newParams","prev","updated","newUrl","handlePopState","resolvePanelReturnsAppearance","explicit","brand","color","brandColorTokens","SwitchPrimitive","jsx","Switch","className","props","cn","useState","Fragment","jsx","jsxs","PanelNotificationsComponent","notifications","setNotifications","Switch","checked","prevState","Label","PanelNotifications_default","ChevronLeftIcon","ChevronRightIcon","MoreHorizontalIcon","jsx","jsxs","Pagination","className","props","cn","PaginationContent","PaginationItem","PaginationLink","isActive","size","buttonVariants","PaginationPrevious","ChevronLeftIcon","PaginationNext","ChevronRightIcon","PaginationEllipsis","MoreHorizontalIcon","useState","Fragment","jsx","jsxs","formatDate","ts","formatAmount","amount","currency","statusLabel","statusColor","PanelOrderHistory","openOrderDetails","projectID","accessToken","offset","setOffset","limit","data","isFetching","useQuery","rpcProvider","orders","totalCount","currentPage","totalPages","handlePageChange","newOffset","_","i","Skeleton","order","Pagination","PaginationContent","PaginationItem","PaginationPrevious","PaginationLink","PaginationEllipsis","page","PaginationNext","PanelOrderHistory_default","useState","Fragment","jsx","jsxs","formatDate","ts","statusLabel","statusColor","PanelPlansComponent","_projectID","plans","setPlans","isLoading","setIsLoading","plan","PanelPlans_default","useEffect","useState","jsx","jsxs","redirectToLogin","loginURL","dropToken","projectID","host","clearPanelSession","ReturnsScreens","screen","params","setParams","setActiveScreen","status","exchangeError","useReturnsContext","text","useReturnsText","expired","isSessionExpiredError","useEffect","view","setView","useState","draft","setDraft","createdReturnId","setCreatedReturnId","mapReturnsError","Button","SkeletonRows","openReturns","next","ReturnsMyReturnDetail","ReturnsMyReturnsList","returnId","ReturnsResult","orderId","ReturnsConfirmation","ReturnsOrderDetail","selection","ReturnsOrderList","PanelReturns","accessToken","appearance","texts","rest","ReturnsProvider","useState","jsx","URL_REGEX","findURLIndices","text","match","replaceTextByIndices","originalText","replacements","result","lastIndex","a","b","startIndex","endIndex","replacementText","renderText","txt","urlIndices","el","fromJsonString","toJsonString","useAutoAnimate","ChevronLeft","Download","useEffect","useRef","useState","Hls","Pause","Play","forwardRef","useEffect","useImperativeHandle","useRef","useState","mediaSessionPlay","mediaSessionPause","mediaSessionUpdateDurationAndPosition","duration","currentTime","startMediaSessionCoordinator","args","e","stopMediaSessionCoordinator","jsx","jsxs","AudioPlayer","forwardRef","chapters","styles","updateCurrentTime","setCurrentTimeHandler","title","imageURL","uniqueProductID","onChapterChange","ref","PlayState","playState","setPlayState","useState","useEffect","mediaSessionPlay","mediaSessionPause","useImperativeHandle","chapter","playChapter","currentTime","setCurrentTime","duration","setDuration","videoRef","useRef","hlsRef","timerRef","audioPlayerContainerRef","currentChapterRef","playWhenReady","setPlayWhenReady","isStarted","setIsStarted","isLoading","setIsLoading","isSafari","saveLastPlayedTime","timeInSeconds","getLastPlayedTime","time","result","getLastSelectedChapterID","lastSelectedChapterID","setLastSelectedChapterID","chapterID","deleteMemoryChapter","setupObservers","lastPlayedTime","seekTo","play","e","playNextChapter","startMediaSessionCoordinator","details","pause","seekBy","startTimer","currentChapterIndex","updatePlayerDetails","stopTimer","mediaSessionUpdateDurationAndPosition","togglePlayState","seconds","newTime","toSecond","destroyPlayer","loadChapters","playURL","src","Hls","stopMediaSessionCoordinator","calculateTime","secs","hours","minutes","returnedHours","returnedSeconds","showRangeProgress","rangeInput","barProgress","selectedTime","Button","Play","Pause","LoadingIndicator_default","AudioPlayer_default","PANEL_TEXT_TABLES","getPanelTexts","locale","getLocale","pickLocaleTable","React","jsx","ProgressBar","progress","setProgress","timer","Fragment","jsx","jsxs","warn","message","args","error","PanelProductDetails","accessToken","product","styles","reveal","onOpenCourse","productType","instrument","useInstrumentContext","trackDownload","audioPlayerRef","useRef","filesRefAnimation","useAutoAnimate","filesResponse","setFilesResponse","useState","fileDetailsAsync","isFileLoading","useMutation","rpcProvider","audioPlayerSeekToHandler","audioResponse","setAudioResponse","audioDownloadURLs","setAudioDownloadURLs","isAvailableToDownloadInMobileApp","setIsAvailableToDownloadInMobileApp","audioDetailsAsync","isAudioLoading","audioDetailsDownloadURLsAsync","isAudioDownloadURLsLoading","selectedChapter","setSelectedChapter","chapters","setChapters","handleFileDownload","filesResult","err","handleAudioDownload","audioResult","handleAudioURLsDownload","audioURLsResult","useEffect","audioChapters","mappedChapters","chapter","details","el","Button","ChevronLeft","LoadingIndicator_default","ProgressBar","index","Download","getPanelTexts","AudioPlayer_default","handler","cn","PanelProductDetails_default","Fragment","jsx","jsxs","PanelProductGridComponent","accessToken","projectID","loginURL","styles","activeScreen","params","setParams","openCourse","products","isProductsLoading","useQuery","rpcProvider","LoadingIndicator_default","clearPanelSession","productsList","ProductsComponent","PanelProductGrid_default","selectedProduct","setSelectedProduct","useState","fromJsonString","UserProductSchema","reveal","product","toJsonString","getProductTypeName","type","handleSelectedProduct","PanelProductDetails_default","index","renderText","Button","e","useAutoAnimate","LogOut","Undo2","useState","Fragment","jsx","jsxs","PanelProductHeaderComponent","activeScreen","setActiveScreen","setParams","_styles","theme","logout","MobileMenu","SidebarMenu","PanelProductHeader_default","returnsNavLabel","getPanelTexts","MobileButton","Undo2","panelScreen","label","imageURL","icon","Button","cn","SidebarButton","darkImageURL","isExpanded","sidebarExpandRef","useAutoAnimate","setIsExpanded","useState","CompanyLogo","SidebarSeparator","LogOut","className","_isExpanded","LogOut","Fragment","jsx","jsxs","PanelProfileComponent","email","logout","Button","PanelProfile_default","lazy","Suspense","jsx","PanelCourse","lazy","module","LazyPanelCourse","props","Suspense","LoadingIndicator_default","AlertCircle","CheckCircle2","ChevronLeft","Loader2","Lock","Package","Truck","useEffect","useState","Fragment","jsx","jsxs","StatusBadge","status","statusConfig","CheckCircle2","AlertCircle","Truck","Loader2","config","Icon","statusLabels","AddCommentForm","orderID","email","message","setMessage","useState","addCommentMutation","useMutation","rpcProvider","e","error","Label","Textarea","Button","formatDate","timestamp","formatCurrency","amount","currency","PublicOrderPageContent","initialEmail","onBack","accessToken","analytics","theme","projectID","usePanelConfig","instrument","useInstrument","verifyEmail","setVerifyEmail","isVerifyDialogOpen","setIsVerifyDialogOpen","orderData","isLoading","refetch","useQuery","order","isVerified","viewedOrder","useEffect","handleVerifyEmail","styles","Card","CardContent","ChevronLeft","CardHeader","CardTitle","Package","Lock","item","index","comment","Input","PublicOrderPage","props","PublicOrderPage_default","jsx","jsxs","PanelPage","returnsAppearance","returnsTexts","analytics","projectID","theme","loginURL","host","usePanelConfig","instrument","useInstrument","accessToken","getPanelSession","email","getPanelEmail","logoutUserAsync","useMutation","rpcProvider","logout","clearPanelSession","panelParentRef","useAutoAnimate","isScreen","value","params","setParams","useUrlSearchParams","activeScreen","setActiveScreen","useState","handleOpenOrderDetails","orderID","handleBackToOrders","navigate","next","handleOpenCourse","accessId","handleLeaveCourse","useEffect","styles","queryReturnURL","getReturnURLFromSearch","persistReturnURL","returnURL","readPersistedReturnURL","buildAccessTokenRedirect","InstrumentProvider","PanelProductHeader_default","PanelProductGrid_default","LazyPanelCourse","item","PanelNotifications_default","PanelPlans_default","PanelOrderHistory_default","PublicOrderPage_default","PanelReturns","resolvePanelReturnsAppearance","PanelProfile_default","PanelPage_default","create","QueryClient","QueryClientProvider","createContext","useContext","useEffect","useState","createClient","createConnectTransport","PublicApiClient","get","host","createClient","PublicApiService","getTransport","transports","transport","createConnectTransport","clientHeaderInterceptor","zod","zod","round","num","numberOfDecimals","formatCurrency","amount","currency","language","eventPayload","zod","sendAnalyticEvent","payload","sendGoogleAnalyticsEvent","sendPixelAnalyticsEvent","sendTikTokAnalyticsEvent","ga4Event","mapToGA4EcommerceEvent","e","totalValue","sum","item","items","round","ecommerce","eventName","eventType","tiktokEvent","mapToTikTokEvent","contents","mapGooglePayConfiguration","args","items","googlePayConfig","checkout","result","cartRequiresShipping","locale","getLocale","intents","method","formatCurrency","getCheckoutText","round","mapGooglePayDisplayItems","methods","deliveryMethod","couponCode","couponValue","couponLabel","displayItems","subtotalAmount","item","unitPrice","selectedDeliveryMethod","buildURL","projectID","path","HOST","isErr","x","Err","message","type","data","findProductForCartItem","productID","products","el","variant","findMissingProductIDs","requested","resolved","found","id","cartItemURL","url","base","value","create","useCheckoutStore","set","notice","state","numberOfProductsInCart","createContext","useContext","useMemo","jsx","CheckoutTextsContext","createContext","CheckoutTextsProvider","texts","locale","children","value","useMemo","useCheckoutTextsConfig","useContext","useCheckoutText","key","getCheckoutText","getLocale","useCheckoutTextResolver","activeLocale","PENDING_ORDER_KEY","subtractOrderLines","cart","lines","ordered","line","rest","item","quantity","PENDING_ORDER_MIN_ASK_INTERVAL_MS","throttleOrderStatus","fetchStatus","now","minIntervalMs","last","order","key","at","parseOrderFromPaymentUrl","url","path","match","resolvePendingOrder","response","fromUrl","orderId","nonEmpty","projectId","rememberPendingOrder","options","savePendingOrder","value","defaultStorage","storage","PENDING_ORDER_KEY","readPendingOrder","raw","cartProjectId","ts","clearPendingOrder","orderStatusFromResponse","status","readUnknownStatus","unknown","field","length","offset","shift","byte","reconcilePendingOrder","deps","current","Fragment","jsx","MARKETING_AGREEMENT_ID","CartProviderContext","createContext","bitsnapProjectID","setProjectID","projectID","setPanelConfig","setAllowedReturnOrigins","getProjectID","getNewHostIfExist","CartProvider","children","locale","queryClient","useState","QueryClient","textsConfig","useCheckoutTextsConfig","useEffect","updateNumberOfProductsInCart","reconcile","reconcileOrderOfLastPayment","outcome","onVisibilityChange","checkoutMethods","getCheckoutMethods","QueryClientProvider","reconciling","askAboutOrder","throttleOrderStatus","order","orderStatusFromResponse","PublicApiClient","HOST","getCheckoutSelection","country","couponCode","selectedDeliveryMethod","postalCode","getCheckout","emptyCheckout","getCartLines","el","removeOrderLinesFromCart","lines","checkout","saveCheckout","subtractOrderLines","reconcilePendingOrder","e","getProducts","args","products","productIds","product","params","getLocale","payload","result","withClientParam","buildURL","Err","details","findProductForCartItem","resolveProductDetailsFromSingleProduct","useCartProvider","context","useContext","CartProvider_default","googlePayConfigSchema","zod","checkoutProduct","checkoutSchema","checkoutKey","value","addProducts","latestProducts","item","index","isErr","missingIDs","findMissingProductIDs","cartItemURL","trackCartAdd","sendAnalyticEvent","added","latest","found","price","currency","productID","getCartInstrument","removeProductFromCheckout","ids","newCheckout","id","model","texts","newHost","setCustomHost","googlePayConfig","resolveGooglePayConfiguration","create","PreOrderItemSchema","cartRequiresShipping","mappedPaymentRequest","mapGooglePayConfiguration","empty","acc","deliveryMethod","email","mergedMetadata","key","paymentResponse","createPaymentURL","injectReferenceToRequestIfNeeded","round","shippingName","metadata","ref","getReferenceIfPossible","GetPreOrderDetailsRequestSchema","AddressSchema","BillingAddressSchema","error","items","getCheckoutText","variantIndex","v","variant","numberOfProductsInCart","useCheckoutStore","state","MAX_PLAIN_MESSAGE_LENGTH","ITEM_IDS_NOT_FOUND","INTERNAL_ERROR","BUY_ERROR_TEXT_KEYS","GENERIC_TEXT_CODES","ITEM_IDS_CODES","buyErrorTextKey","code","looksLikeMarkup","text","looksLikeCode","looksLikeStack","plainMessage","trimmed","MAX_UNWRAP_DEPTH","unwrapMessage","error","depth","inner","result","fromMessage","parseBuyError","bodyText","payload","body","message","innerCode","parsed","id","buyErrorFromResponse","status","itemIds","hasItemIds","Err","data","buyErrorText","err","getText","key","Bitsnap","addProductToCart","id","quantity","metadata","args","projectID","getProjectID","err","getCheckoutMethods","showCart","useCheckoutStore","hideCart","readBody","response","createPaymentURL","request","injectReferenceToRequestIfNeeded","getLocale","result","buildURL","clientHeaders","visitorHeaders","buyErrorFromResponse","createCheckout","headers","path","HOST","getReferenceIfPossible","refLink","ref"]}
|