bitsnap-react 1.15.0 → 1.17.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.
Files changed (161) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +132 -2
  3. package/dist/CartProvider-DGRZDTYC.mjs +2 -0
  4. package/dist/CartProvider-YVOHSMPE.js +2 -0
  5. package/dist/CartProvider-YVOHSMPE.js.map +1 -0
  6. package/dist/PanelModelFiles-NYCOFPLY.js +2 -0
  7. package/dist/PanelModelFiles-NYCOFPLY.js.map +1 -0
  8. package/dist/PanelModelFiles-RV7OHUUZ.mjs +2 -0
  9. package/dist/PanelModelFiles-RV7OHUUZ.mjs.map +1 -0
  10. package/dist/Viewer3D-2IDEH6W3.mjs +2 -0
  11. package/dist/Viewer3D-2IDEH6W3.mjs.map +1 -0
  12. package/dist/analytics.d.mts +2 -2
  13. package/dist/analytics.d.ts +2 -2
  14. package/dist/analytics.js +1 -1
  15. package/dist/analytics.js.map +1 -1
  16. package/dist/analytics.mjs +1 -1
  17. package/dist/catalog.d.mts +6 -2
  18. package/dist/catalog.d.ts +6 -2
  19. package/dist/catalog.js +1 -1
  20. package/dist/catalog.js.map +1 -1
  21. package/dist/catalog.mjs +1 -1
  22. package/dist/chunk-2NL5FCXC.mjs +4 -0
  23. package/dist/chunk-2NL5FCXC.mjs.map +1 -0
  24. package/dist/{chunk-PEVB3VL4.mjs → chunk-2UDAB2C5.mjs} +2 -2
  25. package/dist/{chunk-PEVB3VL4.mjs.map → chunk-2UDAB2C5.mjs.map} +1 -1
  26. package/dist/{chunk-7DG4UPWE.js → chunk-4BL7TLK3.js} +2 -2
  27. package/dist/chunk-4BL7TLK3.js.map +1 -0
  28. package/dist/chunk-4ETIDGYZ.mjs +2 -0
  29. package/dist/chunk-4ETIDGYZ.mjs.map +1 -0
  30. package/dist/chunk-555KFWGY.js +4 -0
  31. package/dist/chunk-555KFWGY.js.map +1 -0
  32. package/dist/chunk-5ED7FWNY.mjs +2 -0
  33. package/dist/chunk-5ED7FWNY.mjs.map +1 -0
  34. package/dist/chunk-5FZAROP6.js +2 -0
  35. package/dist/chunk-5FZAROP6.js.map +1 -0
  36. package/dist/chunk-5R6AGO3Z.mjs +2 -0
  37. package/dist/chunk-5R6AGO3Z.mjs.map +1 -0
  38. package/dist/chunk-6GCCNBEU.js +2 -0
  39. package/dist/chunk-6GCCNBEU.js.map +1 -0
  40. package/dist/chunk-6Q3VGPSF.js +2 -0
  41. package/dist/chunk-6Q3VGPSF.js.map +1 -0
  42. package/dist/chunk-6YIRRDCL.mjs +2 -0
  43. package/dist/chunk-6YIRRDCL.mjs.map +1 -0
  44. package/dist/chunk-7RXW6XFY.js +2 -0
  45. package/dist/chunk-7RXW6XFY.js.map +1 -0
  46. package/dist/chunk-A6VCP3A4.mjs +2 -0
  47. package/dist/chunk-A6VCP3A4.mjs.map +1 -0
  48. package/dist/chunk-BZXV77PT.mjs +2 -0
  49. package/dist/chunk-BZXV77PT.mjs.map +1 -0
  50. package/dist/{chunk-MG6VV5J2.js → chunk-C3BBJOVV.js} +2 -2
  51. package/dist/chunk-C3BBJOVV.js.map +1 -0
  52. package/dist/chunk-CUPG4B5W.mjs +2 -0
  53. package/dist/chunk-CUPG4B5W.mjs.map +1 -0
  54. package/dist/chunk-ESF5ZVVF.js +2 -0
  55. package/dist/chunk-ESF5ZVVF.js.map +1 -0
  56. package/dist/chunk-HKNWW37T.mjs +2 -0
  57. package/dist/chunk-HKNWW37T.mjs.map +1 -0
  58. package/dist/chunk-JSDGZ4NY.js.map +1 -1
  59. package/dist/chunk-KOYBZORL.js.map +1 -1
  60. package/dist/chunk-L7Q7OKM5.mjs +2 -0
  61. package/dist/chunk-L7Q7OKM5.mjs.map +1 -0
  62. package/dist/chunk-M2G74N43.mjs +2 -0
  63. package/dist/chunk-M2G74N43.mjs.map +1 -0
  64. package/dist/chunk-MIMQTH2G.js +2 -0
  65. package/dist/chunk-MIMQTH2G.js.map +1 -0
  66. package/dist/chunk-SYN5KU3O.js +2 -0
  67. package/dist/chunk-SYN5KU3O.js.map +1 -0
  68. package/dist/chunk-VNYHJT6V.mjs +2 -0
  69. package/dist/chunk-VNYHJT6V.mjs.map +1 -0
  70. package/dist/chunk-W3RGQYPD.js.map +1 -1
  71. package/dist/chunk-X3LVYIJR.mjs +2 -0
  72. package/dist/chunk-X3LVYIJR.mjs.map +1 -0
  73. package/dist/consent.js.map +1 -1
  74. package/dist/course.d.mts +3 -3
  75. package/dist/course.d.ts +3 -3
  76. package/dist/course.js +1 -1
  77. package/dist/course.js.map +1 -1
  78. package/dist/course.mjs +1 -1
  79. package/dist/course.mjs.map +1 -1
  80. package/dist/embed/analytics.js +1 -1
  81. package/dist/errors.js.map +1 -1
  82. package/dist/index.css +1 -1
  83. package/dist/index.css.map +1 -1
  84. package/dist/index.d.mts +41 -12
  85. package/dist/index.d.ts +41 -12
  86. package/dist/index.js +1 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/index.mjs +1 -1
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/{instrument-BE8ktMUv.d.mts → instrument-eXaC8hc2.d.mts} +1 -1
  91. package/dist/{instrument-BE8ktMUv.d.ts → instrument-eXaC8hc2.d.ts} +1 -1
  92. package/dist/internal.js.map +1 -1
  93. package/dist/methods-3W34GRYL.js +2 -0
  94. package/dist/methods-3W34GRYL.js.map +1 -0
  95. package/dist/methods-LUJSKSQ4.mjs +2 -0
  96. package/dist/model-files-client-HHDXJDTS.mjs +2 -0
  97. package/dist/model-files-client-HHDXJDTS.mjs.map +1 -0
  98. package/dist/model-files-client-P4PORZJ6.js +2 -0
  99. package/dist/model-files-client-P4PORZJ6.js.map +1 -0
  100. package/dist/models.d.mts +2 -0
  101. package/dist/models.d.ts +2 -0
  102. package/dist/models.js +1 -1
  103. package/dist/models.js.map +1 -1
  104. package/dist/models.mjs +1 -1
  105. package/dist/models.mjs.map +1 -1
  106. package/dist/returns.d.mts +19 -10
  107. package/dist/returns.d.ts +19 -10
  108. package/dist/returns.js +1 -1
  109. package/dist/returns.js.map +1 -1
  110. package/dist/returns.mjs +1 -1
  111. package/dist/{texts-tQtAGJCT.d.mts → texts-LGhuQfA9.d.mts} +28 -3
  112. package/dist/{texts-CIEFbJTN.d.ts → texts-m6XQGZ6w.d.ts} +28 -3
  113. package/dist/types-ClFCVzk_.d.ts +121 -0
  114. package/dist/types-D6LsoycW.d.mts +121 -0
  115. package/dist/viewer3d.css +2 -0
  116. package/dist/viewer3d.css.map +1 -0
  117. package/dist/viewer3d.d.mts +318 -0
  118. package/dist/viewer3d.d.ts +318 -0
  119. package/dist/viewer3d.js +2 -0
  120. package/dist/viewer3d.js.map +1 -0
  121. package/dist/viewer3d.mjs +63 -0
  122. package/dist/viewer3d.mjs.map +1 -0
  123. package/package.json +43 -16
  124. package/dist/CartProvider-64QEJ7A7.js +0 -2
  125. package/dist/CartProvider-64QEJ7A7.js.map +0 -1
  126. package/dist/CartProvider-XKK7A3C2.mjs +0 -2
  127. package/dist/chunk-2TLWMYXW.mjs +0 -2
  128. package/dist/chunk-2TLWMYXW.mjs.map +0 -1
  129. package/dist/chunk-7DG4UPWE.js.map +0 -1
  130. package/dist/chunk-7TLJKYZD.mjs +0 -2
  131. package/dist/chunk-7TLJKYZD.mjs.map +0 -1
  132. package/dist/chunk-AZQOW73L.mjs +0 -4
  133. package/dist/chunk-AZQOW73L.mjs.map +0 -1
  134. package/dist/chunk-DY2S42Q6.js +0 -2
  135. package/dist/chunk-DY2S42Q6.js.map +0 -1
  136. package/dist/chunk-FGB5FJCI.js +0 -2
  137. package/dist/chunk-FGB5FJCI.js.map +0 -1
  138. package/dist/chunk-GLAJPUMA.js +0 -2
  139. package/dist/chunk-GLAJPUMA.js.map +0 -1
  140. package/dist/chunk-H4WAQQVO.js +0 -2
  141. package/dist/chunk-H4WAQQVO.js.map +0 -1
  142. package/dist/chunk-MG6VV5J2.js.map +0 -1
  143. package/dist/chunk-Q3DSK66F.mjs +0 -2
  144. package/dist/chunk-Q3DSK66F.mjs.map +0 -1
  145. package/dist/chunk-RWEP6IUC.mjs +0 -2
  146. package/dist/chunk-RWEP6IUC.mjs.map +0 -1
  147. package/dist/chunk-S4Z4O46O.mjs +0 -2
  148. package/dist/chunk-S4Z4O46O.mjs.map +0 -1
  149. package/dist/chunk-VY6CZVVA.js +0 -4
  150. package/dist/chunk-VY6CZVVA.js.map +0 -1
  151. package/dist/chunk-XZYCQ655.js +0 -2
  152. package/dist/chunk-XZYCQ655.js.map +0 -1
  153. package/dist/chunk-ZIWQ57GY.mjs +0 -2
  154. package/dist/chunk-ZIWQ57GY.mjs.map +0 -1
  155. package/dist/methods-NUMVR53L.js +0 -2
  156. package/dist/methods-NUMVR53L.js.map +0 -1
  157. package/dist/methods-YKZZ6OVT.mjs +0 -2
  158. package/dist/types-DP1vxo5E.d.mts +0 -53
  159. package/dist/types-u8VwmC3j.d.ts +0 -53
  160. /package/dist/{CartProvider-XKK7A3C2.mjs.map → CartProvider-DGRZDTYC.mjs.map} +0 -0
  161. /package/dist/{methods-YKZZ6OVT.mjs.map → methods-LUJSKSQ4.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/panel/components/PanelLogin.tsx","../src/ui/card.tsx","../src/ui/email-code-login/EmailCodeLoginForm.tsx","../src/panel/login-adapter.ts","../src/panel/login-texts.ts","../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/panel/LoadingIndicator.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/model-files-load.ts","../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/payment-method.ts","../src/components/checkout/methods.ts"],"sourcesContent":["import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { useEffect, useMemo, type CSSProperties } from \"react\";\nimport {\n InstrumentProvider,\n useInstrument,\n useInstrumentContext,\n type AnalyticsOption,\n} from \"../../analytics/instrument\";\nimport { getLocale } from \"../../components/checkout/locale\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../ui/card\";\nimport { kindFromRpcError } from \"../../ui/email-code-login/errors\";\nimport {\n LoginBrandLogo,\n type LoginLogoOptions,\n} from \"../../ui/email-code-login/LoginBrandLogo\";\nimport { EmailCodeLoginForm } from \"../../ui/email-code-login/EmailCodeLoginForm\";\nimport { pendingLoginKey } from \"../../ui/email-code-login/pending\";\nimport {\n useEmailCodeLogin,\n type EmailCodeAdapter,\n} from \"../../ui/email-code-login/useEmailCodeLogin\";\nimport {\n getAllowedReturnOrigins,\n setAllowedReturnOrigins,\n} from \"../config\";\nimport { panelFailureKind } from \"../login-adapter\";\nimport { resolvePanelLoginTexts, type PanelLoginTexts } from \"../login-texts\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport type { PanelLoginProps } from \"../types\";\nimport {\n buildAccessTokenRedirect,\n getReturnURLFromSearch,\n persistReturnURL,\n readPersistedReturnURL,\n} from \"../return-url\";\nimport { getPanelSession, savePanelSession } from \"../session-storage\";\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\n\n/** Props of {@link PanelLogin}; `PanelLoginProps` of the package is a superset. */\nexport type PanelLoginComponentProps = Pick<\n PanelLoginProps,\n \"analytics\" | \"texts\" | \"locale\" | \"showLogo\" | \"logoUrl\" | \"logoDarkUrl\"\n>;\n\ntype PanelLoginResult = { accessToken: string };\n\nconst PanelLoginForm = ({\n texts,\n projectID,\n host,\n locale,\n logo,\n}: {\n texts: PanelLoginTexts;\n projectID?: string;\n host?: string;\n locale?: string;\n logo: LoginLogoOptions;\n}) => {\n const instrument = useInstrumentContext();\n const { mutateAsync: loginUserAsync } = useMutation(\n rpcProvider.publicApi.userPanelLogin,\n );\n const { mutateAsync: verifyCodeAsync } = useMutation(\n rpcProvider.publicApi.userPanelLoginWithCode,\n );\n\n const adapter = useMemo<EmailCodeAdapter<PanelLoginResult>>(\n () => ({\n async send(email) {\n try {\n const response = await loginUserAsync({ email });\n if (response.result.case === \"success\") {\n return {\n ok: true,\n retryIn: response.result.value.retryIn || undefined,\n challengeId: response.result.value.challengeId || undefined,\n };\n }\n return {\n ok: false,\n kind: panelFailureKind(\n response.result.case === \"failure\" ? response.result.value : 0,\n ),\n };\n } catch (cause) {\n return { ok: false, kind: kindFromRpcError(cause), cause };\n }\n },\n async verify({ email, code, challengeId }) {\n try {\n const response = await verifyCodeAsync({\n code: parseInt(code, 10),\n email,\n challengeId,\n });\n if (response.result.case === \"accessToken\" && response.result.value) {\n return { ok: true, value: { accessToken: response.result.value } };\n }\n return {\n ok: false,\n kind: panelFailureKind(\n response.result.case === \"failure\" ? response.result.value : 0,\n ),\n };\n } catch (cause) {\n return { ok: false, kind: kindFromRpcError(cause), cause };\n }\n },\n }),\n [loginUserAsync, verifyCodeAsync],\n );\n\n const login = useEmailCodeLogin<PanelLoginResult>({\n adapter,\n texts,\n storageKey: pendingLoginKey(\"panel\", projectID, host),\n onVerified: ({ accessToken }, email) => {\n instrument.track(\"panel_login\", {});\n savePanelSession(projectID, accessToken, email, host);\n const returnURL =\n typeof window !== \"undefined\" ? readPersistedReturnURL() : null;\n setTimeout(() => {\n if (returnURL) {\n window.location.href = buildAccessTokenRedirect(returnURL, accessToken);\n return;\n }\n window.location.reload();\n }, 100);\n },\n });\n\n const onCodeStep = login.step === \"code\";\n const title = onCodeStep && !login.needsEmail ? texts.codeTitle : texts.title;\n const description =\n onCodeStep && !login.needsEmail ? texts.codeDescription : texts.description;\n\n return (\n // Top-aligned: a vertically centred card moved when the step changed height.\n <main className=\"mx-auto flex w-full max-w-sm flex-1 flex-col justify-start pt-4 sm:pt-[12vh]\">\n <Card>\n <LoginBrandLogo\n projectId={projectID}\n locale={locale}\n className=\"px-4 sm:px-6\"\n {...logo}\n />\n <CardHeader className=\"px-4 sm:px-6\">\n <CardTitle role=\"heading\" aria-level={1} className=\"text-2xl\">\n {title}\n </CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardContent className=\"px-4 sm:px-6\">\n <EmailCodeLoginForm\n login={login}\n texts={texts}\n emailInputId=\"email\"\n codeInputId=\"verify-code\"\n />\n </CardContent>\n </Card>\n </main>\n );\n};\n\nconst PanelLoginComponentWrapper = ({\n analytics,\n texts: textOverrides,\n locale,\n showLogo,\n logoUrl,\n logoDarkUrl,\n}: PanelLoginComponentProps) => {\n const { theme, allowedReturnOrigins, projectID, host } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"panel\");\n const texts = useMemo(\n () => resolvePanelLoginTexts(locale ?? getLocale(), textOverrides),\n [locale, textOverrides],\n );\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 const [parent] = useAutoAnimate({\n duration: 300,\n easing: \"ease-in-out\",\n disrespectUserMotionPreference: false,\n });\n\n // Already signed in: leave the login page. Declared before the return URL\n // effect below, so that one (a token redirect) wins when both apply.\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (getPanelSession(projectID, host) != null) {\n window.location.href = window.location.href.replaceAll(\"login\", \"\");\n }\n }, [projectID, host]);\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 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 min-h-screen w-full flex-col p-4\"\n style={styles}\n ref={parent}\n >\n <PanelLoginForm\n texts={texts}\n projectID={projectID}\n host={host}\n locale={locale}\n logo={{\n showLogo,\n logoUrl: logoUrl ?? theme?.logoURL,\n logoDarkUrl: logoDarkUrl ?? theme?.logoDarkURL,\n }}\n />\n </div>\n </div>\n </InstrumentProvider>\n );\n};\n\nexport const PanelLogin = (props: PanelLoginComponentProps = {}) => {\n return <PanelLoginComponentWrapper {...props} />;\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 { CircleCheck } from \"lucide-react\";\nimport { useId, type FormEvent, type ReactNode } from \"react\";\nimport { cn } from \"@/src/lib/utils\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Label } from \"../label\";\nimport { Spinner } from \"../spinner\";\nimport { OtpCodeField } from \"./OtpCodeField\";\nimport { fillText, type EmailCodeTexts } from \"./texts\";\nimport { type EmailCodeLogin } from \"./useEmailCodeLogin\";\n\nexport type EmailCodeLoginFormProps = {\n login: EmailCodeLogin;\n texts: EmailCodeTexts;\n /** Offers \"I already have a code\" under the e-mail step. */\n allowHaveCode?: boolean;\n /** Overrides the e-mail input placeholder. */\n emailPlaceholder?: string;\n /** `id` of the e-mail input; unique per instance by default. */\n emailInputId?: string;\n /** `id` of the code input; unique per instance by default. */\n codeInputId?: string;\n className?: string;\n /** Classes of the two primary buttons (brand colors). */\n buttonClassName?: string;\n /** Shown above the fields of the code step, after the \"sent to\" line. */\n children?: ReactNode;\n};\n\nconst MUTED = \"text-muted-foreground text-xs leading-5\";\n/** Borders of the dark theme: the `input` token is nearly the card colour. */\nconst DARK_FIELD =\n \"dark:border-foreground/30 dark:focus-visible:border-foreground/70 dark:focus-visible:ring-foreground/25 dark:aria-invalid:border-destructive-foreground dark:aria-invalid:ring-destructive-foreground/30\";\n/** Failures about the address itself; a throttled or failed send is not. */\nconst EMAIL_FAILURES = new Set([\"invalidEmail\", \"emailNotFound\", \"deliveryUnavailable\"]);\nconst LINK =\n \"inline-flex min-h-11 items-center px-1 text-sm underline underline-offset-4 hover:no-underline focus-visible:ring-[3px] focus-visible:ring-ring/50 rounded-sm outline-none disabled:opacity-50 disabled:no-underline\";\n\n/**\n * The two steps of the shared e-mail-code login. Markup only: all state comes\n * from {@link useEmailCodeLogin}. The surface wraps it in its own card or\n * dialog and renders the titles.\n */\nexport function EmailCodeLoginForm({\n login,\n texts,\n allowHaveCode = true,\n emailPlaceholder,\n emailInputId,\n codeInputId,\n className,\n buttonClassName,\n children,\n}: EmailCodeLoginFormProps) {\n const uid = useId();\n const emailId = emailInputId ?? `${uid}-email`;\n const codeId = codeInputId ?? `${uid}-code`;\n const noticeId = `${uid}-notice`;\n const hintId = `${uid}-hint`;\n\n const { notice } = login;\n const isError = notice?.kind === \"error\";\n const sending = login.busy === \"send\";\n const verifying = login.busy === \"verify\";\n const resending = login.busy === \"resend\";\n const buttonBase = cn(\"h-11 w-full\", buttonClassName);\n\n // Both live regions stay mounted (empty) so that a screen reader has\n // registered them before a message is put in; only their text changes.\n // The area reserves two lines, so a longer message does not push the buttons.\n const success = notice?.kind === \"success\";\n const noticeArea = (\n <div id={noticeId} className=\"min-h-10 text-sm leading-5\">\n <p\n role=\"alert\"\n className=\"font-medium text-red-700 dark:text-red-400\"\n >\n {isError ? notice.text : null}\n </p>\n <p\n role=\"status\"\n className={cn(\n \"flex items-start gap-1.5\",\n success\n ? \"font-medium text-emerald-700 dark:text-emerald-400\"\n : \"text-foreground\",\n )}\n >\n {success && <CircleCheck aria-hidden className=\"mt-0.5 size-4 shrink-0\" />}\n <span>{notice != null && !isError ? notice.text : null}</span>\n </p>\n </div>\n );\n const emailInvalid =\n isError &&\n login.step === \"email\" &&\n (notice.failure == null || EMAIL_FAILURES.has(notice.failure));\n\n const announcer = (\n <p className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {login.announcement}\n </p>\n );\n\n const emailField = (\n <div className=\"grid gap-2\">\n <Label htmlFor={emailId}>{texts.emailLabel}</Label>\n <Input\n id={emailId}\n ref={login.emailRef}\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n inputMode=\"email\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n autoFocus\n required\n className={cn(\n \"h-11 text-base disabled:opacity-100 disabled:text-foreground/70\",\n DARK_FIELD,\n )}\n placeholder={emailPlaceholder ?? texts.emailPlaceholder}\n value={login.email}\n disabled={login.isBusy}\n aria-invalid={emailInvalid ? true : undefined}\n aria-describedby={noticeId}\n onChange={(event) => login.setEmail(event.target.value)}\n />\n </div>\n );\n\n if (login.step === \"email\") {\n return (\n <form\n noValidate\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event: FormEvent) => {\n event.preventDefault();\n void login.sendCode();\n }}\n >\n {announcer}\n {emailField}\n {noticeArea}\n <Button\n type=\"submit\"\n disabled={login.isBusy}\n aria-busy={sending}\n className={buttonBase}\n >\n {sending && <Spinner aria-hidden />}\n {sending ? texts.sending : texts.sendCode}\n </Button>\n {allowHaveCode && (\n <p className=\"flex flex-wrap items-center justify-center text-center text-sm\">\n {texts.haveCodePrompt !== \"\" && <span>{texts.haveCodePrompt}</span>}\n <button\n type=\"button\"\n className={LINK}\n disabled={login.isBusy}\n onClick={login.haveCode}\n >\n {texts.haveCode}\n </button>\n </p>\n )}\n </form>\n );\n }\n\n const [before, after] = texts.codeSentTo.split(\"{email}\");\n const dead = login.dead != null;\n const resendLabel = dead\n ? texts.resendNew\n : login.secondsLeft > 0\n ? fillText(texts.resendIn, { seconds: login.secondsLeft })\n : texts.resend;\n\n return (\n <form\n noValidate\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event: FormEvent) => {\n event.preventDefault();\n void login.submitCode();\n }}\n >\n {announcer}\n {login.needsEmail ? (\n emailField\n ) : (\n <div className=\"flex flex-wrap items-center justify-between gap-x-2\">\n {/* The address moves to its own line before it is cut; the word\n joiner keeps the full stop with it. */}\n <p className=\"min-w-0 flex-[1_1_14rem] text-sm leading-5 break-words\">\n {before}\n <strong className=\"font-semibold\">{login.email}</strong>\n {\"\\u2060\"}\n {after}\n </p>\n <button\n type=\"button\"\n className={cn(LINK, \"-ml-1 shrink-0\")}\n disabled={login.isBusy}\n onClick={login.changeEmail}\n >\n {texts.changeEmail}\n </button>\n </div>\n )}\n {children}\n <div className=\"grid gap-2\">\n <Label htmlFor={codeId}>{texts.codeLabel}</Label>\n <OtpCodeField\n id={codeId}\n name=\"code\"\n inputRef={login.codeRef}\n value={login.code}\n onChange={login.setCode}\n onComplete={(value) => void login.submitCode(value)}\n disabled={login.isBusy || dead}\n invalid={isError && !login.needsEmail}\n aria-describedby={`${noticeId} ${hintId}`}\n />\n <p id={hintId} className={MUTED}>\n {texts.validity} {texts.spamHint}\n </p>\n </div>\n {noticeArea}\n <Button\n type=\"submit\"\n disabled={login.isBusy || dead}\n aria-busy={verifying}\n className={buttonBase}\n >\n {verifying && <Spinner aria-hidden />}\n {verifying ? texts.verifying : texts.verify}\n </Button>\n {login.needsEmail ? (\n <div className=\"flex justify-center\">\n <button\n type=\"button\"\n className={LINK}\n disabled={login.isBusy}\n onClick={login.changeEmail}\n >\n {texts.noCode}\n </button>\n </div>\n ) : (\n <Button\n type=\"button\"\n variant={dead ? \"default\" : \"outline\"}\n disabled={login.isBusy || (!dead && login.secondsLeft > 0)}\n aria-busy={resending}\n className={dead ? buttonBase : \"h-11 w-full\"}\n onClick={() => void login.resend()}\n >\n {resending && <Spinner aria-hidden />}\n {resendLabel}\n </Button>\n )}\n </form>\n );\n}\n","import { FailureMessage } from \"../gen/proto/public/v1/public_api_pb\";\nimport type { FailureKind } from \"../ui/email-code-login/useEmailCodeLogin\";\n\n/**\n * Kind of failure for each `FailureMessage` the login RPCs return. Every\n * value has an answer, so the customer never sees \"Nieprawidłowy adres email\"\n * for a mistyped code or a throttled request.\n */\nexport function panelFailureKind(failure: FailureMessage): FailureKind {\n switch (failure) {\n case FailureMessage.EMAIL_NOT_FOUND:\n return \"emailNotFound\";\n case FailureMessage.INCORRECT_EMAIL:\n return \"invalidEmail\";\n case FailureMessage.INCORRECT_CODE:\n return \"wrongCode\";\n case FailureMessage.CODE_EXPIRED:\n return \"expired\";\n case FailureMessage.TOO_MANY_ATTEMPTS:\n return \"tooManyAttempts\";\n case FailureMessage.RATE_LIMITED:\n return \"rateLimited\";\n case FailureMessage.DELIVERY_FAILED:\n return \"deliveryFailed\";\n case FailureMessage.DELIVERY_METHOD_UNAVAILABLE:\n return \"deliveryUnavailable\";\n default:\n return \"unknown\";\n }\n}\n","import { pickLocaleTable, type LocaleTables } from \"../lib/texts\";\nimport { getLocale } from \"../components/checkout/locale\";\nimport {\n resolveEmailCodeTexts,\n type EmailCodeTexts,\n} from \"../ui/email-code-login/texts\";\n\n/** Strings of `PanelLogin`: the shared login texts plus the two titles. */\nexport type PanelLoginTexts = EmailCodeTexts & {\n title: string;\n description: string;\n codeTitle: string;\n codeDescription: string;\n};\n\ntype TitleKey = \"title\" | \"description\" | \"codeTitle\" | \"codeDescription\";\n\nconst TITLES: LocaleTables<TitleKey> = {\n pl: {\n title: \"Zaloguj się\",\n description: \"Wyślemy do Ciebie kod na maila, dzięki któremu się zalogujesz.\",\n codeTitle: \"Wpisz kod z maila\",\n codeDescription: \"Kod ma 6 cyfr.\",\n },\n en: {\n title: \"Sign in\",\n description: \"We will email you a code that signs you in.\",\n codeTitle: \"Enter the code from the email\",\n codeDescription: \"The code has 6 digits.\",\n },\n};\n\n/** Panel login texts: Polish unless the locale starts with `en`, then overrides. */\nexport function resolvePanelLoginTexts(\n locale: string = getLocale(),\n overrides?: Partial<PanelLoginTexts>,\n): PanelLoginTexts {\n return {\n ...resolveEmailCodeTexts(locale, overrides),\n ...pickLocaleTable(TITLES, locale),\n ...definedOnly(overrides, [\"title\", \"description\", \"codeTitle\", \"codeDescription\"]),\n };\n}\n\nfunction definedOnly<K extends TitleKey>(\n overrides: Partial<PanelLoginTexts> | undefined,\n keys: K[],\n): Partial<Record<K, string>> {\n const result: Partial<Record<K, string>> = {};\n for (const key of keys) {\n const value = overrides?.[key];\n if (value != null) result[key] = value;\n }\n return result;\n}\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 {\n lazy,\n Suspense,\n useEffect,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n FailureMessage,\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\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport { getLocale } from \"../../components/checkout/locale\";\nimport { useModelFiles, type ModelFilesLoad } from \"./model-files-load\";\n\n// The 3D files list (UI + download RPC) loads only for buyers who have some.\nconst PanelModelFiles = lazy(() => import(\"./PanelModelFiles\"));\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 { host } = usePanelConfig();\n const {\n data: products,\n isLoading: isProductsLoading,\n error: productsError,\n refetch,\n } = useQuery(rpcProvider.publicApi.userPanelGetProducts, {\n accessToken: accessToken,\n });\n const modelFiles = useModelFiles(accessToken, projectID);\n const decision = decidePanelProducts({\n products: isProductsLoading\n ? { status: \"loading\" }\n : productsError != null\n ? { status: \"error\" }\n : products?.result.case === \"success\"\n ? { status: \"ok\", count: products.result.value.products.length }\n : products?.result.case === \"failure\"\n ? {\n status: \"failure\",\n unauthorized:\n products.result.value === FailureMessage.UNAUTHORIZED,\n }\n : { status: \"error\" },\n modelFiles,\n });\n\n // Only an expired session signs the buyer out; an empty list or another\n // failure keeps them in (a buyer of 3D files only has no access products).\n useEffect(() => {\n if (decision.kind !== \"signed-out\") return;\n clearPanelSession(projectID, host);\n window.location.href = loginURL;\n }, [decision.kind, projectID, host, loginURL]);\n\n if (decision.kind === \"loading\" || decision.kind === \"signed-out\") {\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 {getLocale().toLowerCase().startsWith(\"en\") ? \"Loading...\" : \"Ładowanie...\"}\n </p>\n <LoadingIndicator />\n </div>\n );\n }\n\n const productsList =\n products && products.result.case === \"success\"\n ? products.result.value.products\n : [];\n const models = modelFiles.status === \"ready\" ? modelFiles.models : [];\n const filesSection =\n models.length > 0 ? (\n <Suspense fallback={null}>\n <PanelModelFiles\n accessToken={accessToken}\n models={models}\n buttonStyle={styles}\n />\n </Suspense>\n ) : null;\n\n if (decision.kind === \"error\") {\n return (\n <>\n <PanelProductsError onRetry={() => void refetch()} />\n {filesSection}\n </>\n );\n }\n\n if (decision.kind === \"empty\") {\n return <PanelProductsEmpty />;\n }\n\n return (\n <ProductsComponent\n accessToken={accessToken}\n products={productsList}\n styles={styles}\n activeScreen={activeScreen}\n params={params}\n setParams={setParams}\n openCourse={openCourse}\n filesSection={filesSection}\n />\n );\n};\n\n/** Inputs of `decidePanelProducts`, in the shape the RPC answers. */\nexport type PanelProductsInput = {\n products:\n | { status: \"loading\" }\n | { status: \"ok\"; count: number }\n | { status: \"failure\"; unauthorized: boolean }\n | { status: \"error\" };\n modelFiles: ModelFilesLoad;\n};\n\nexport type PanelProductsDecision =\n | { kind: \"loading\" }\n /** The session expired: clear it and go to the login page. */\n | { kind: \"signed-out\" }\n /** Products and/or 3D files to show. */\n | { kind: \"list\" }\n /** Nothing bought in this shop yet. */\n | { kind: \"empty\" }\n /** The products could not be loaded (3D files, if any, still show). */\n | { kind: \"error\" };\n\n/**\n * What the products screen shows. Pure, so the sign-out rule is tested\n * without a browser: only an expired session (`UNAUTHORIZED` from either\n * call) signs the buyer out. Older panels also signed out on an empty list\n * or any failure, which locked out buyers of 3D files only.\n */\nexport function decidePanelProducts({\n products,\n modelFiles,\n}: PanelProductsInput): PanelProductsDecision {\n if (products.status === \"failure\" && products.unauthorized) {\n return { kind: \"signed-out\" };\n }\n if (products.status === \"loading\") return { kind: \"loading\" };\n // Access products show at once; the 3D files join the list when they arrive.\n if (products.status === \"ok\" && products.count > 0) return { kind: \"list\" };\n if (modelFiles.status === \"loading\") return { kind: \"loading\" };\n if (products.status === \"failure\" || products.status === \"error\") {\n return modelFiles.status === \"unauthorized\"\n ? { kind: \"signed-out\" }\n : { kind: \"error\" };\n }\n const models = modelFiles.status === \"ready\" ? modelFiles.models.length : 0;\n if (products.count === 0 && models === 0) return { kind: \"empty\" };\n return { kind: \"list\" };\n}\n\nfunction PanelProductsEmpty() {\n const en = getLocale().toLowerCase().startsWith(\"en\");\n return (\n <div className=\"flex flex-col items-start gap-1\" data-testid=\"panel-empty\">\n <h3 className=\"text-2xl\">{en ? \"Hi 👋\" : \"Hej 👋\"}</h3>\n <p className=\"text-sm text-neutral-500\">\n {en\n ? \"You have no products in this shop yet. Your purchases will show up here.\"\n : \"Nie masz jeszcze produktów w tym sklepie. Twoje zakupy pojawią się tutaj.\"}\n </p>\n </div>\n );\n}\n\nfunction PanelProductsError({ onRetry }: { onRetry: () => void }) {\n const en = getLocale().toLowerCase().startsWith(\"en\");\n return (\n <div className=\"flex flex-col items-start gap-3\" role=\"alert\" data-testid=\"panel-error\">\n <p className=\"text-sm text-neutral-600 dark:text-neutral-300\">\n {en ? \"Your products could not be loaded.\" : \"Nie udało się wczytać Twoich produktów.\"}\n </p>\n <Button type=\"button\" onClick={onRetry} className=\"text-sm\">\n {en ? \"Try again\" : \"Spróbuj ponownie\"}\n </Button>\n </div>\n );\n}\n\nexport default PanelProductGridComponent;\n\ninterface ProductsComponentProps {\n accessToken: string;\n products: UserProduct[];\n styles: CSSProperties;\n filesSection?: ReactNode;\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 filesSection,\n activeScreen,\n params,\n setParams,\n openCourse,\n}: ProductsComponentProps) => {\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 {products.length > 0 && (\n <p className=\"text-sm text-neutral-500\">\n Poniżej znajdziesz swoje produkty\n </p>\n )}\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 {filesSection}\n </>\n );\n};\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","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 { useTransport } from \"@connectrpc/connect-query\";\nimport { useEffect, useState } from \"react\";\n\nimport type { PurchasedModel } from \"../../gen/proto/public/v1/model_delivery_pb\";\n\n/** What the 3D files call ended with; `hidden` = no 3D delivery on the server (or it failed). */\nexport type ModelFilesLoad =\n | { status: \"loading\" }\n | { status: \"hidden\" }\n | { status: \"unauthorized\" }\n | { status: \"ready\"; models: PurchasedModel[] };\n\n/**\n * The buyer's 3D files, once per token. The RPC client is loaded with\n * `import()`, so pages that never mount the panel products screen do not\n * carry it.\n */\nexport function useModelFiles(\n accessToken: string,\n projectID: string,\n): ModelFilesLoad {\n const transport = useTransport();\n const [load, setLoad] = useState<ModelFilesLoad>({ status: \"loading\" });\n\n useEffect(() => {\n if (!accessToken) {\n setLoad({ status: \"hidden\" });\n return;\n }\n let cancelled = false;\n setLoad({ status: \"loading\" });\n import(\"./model-files-client\")\n .then(({ listModelFiles }) => listModelFiles(transport, accessToken, projectID))\n .catch((): ModelFilesLoad => ({ status: \"hidden\" }))\n .then((next) => {\n if (!cancelled) setLoad(next);\n });\n return () => {\n cancelled = true;\n };\n }, [transport, accessToken, projectID]);\n\n return load;\n}\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 getPaymentMethodChoice,\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\";\nimport type { PaymentMethod, PaymentMethodChoice } from \"./payment-method\";\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 /**\n * Whether the buyer may choose between paying online, paying the seller by\n * hand and paying on delivery for the current cart. `null` (also on any failure) means nothing\n * to choose.\n */\n getPaymentMethodChoice: () => Promise<PaymentMethodChoice | null>;\n\n /**\n * Creates the order of the cart (`/buy`). `paymentMethod` is sent only when\n * given, that is when the buyer was offered the choice.\n */\n redirectToNextStep: (args?: { paymentMethod?: PaymentMethod }) => 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\n/** The `/buy` body of the cart (also sent to `payment-methods`); `undefined` when it is empty. */\nfunction cartLinkRequest(\n checkout: Checkout,\n locale: string,\n): LinkRequest | undefined {\n if (checkout.products == null || checkout.products.length == 0) {\n return undefined;\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 return {\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\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 getPaymentMethodChoice(): Promise<PaymentMethodChoice | null> {\n const payload = cartLinkRequest(getCheckout(), locale);\n return payload == null ? null : getPaymentMethodChoice(payload);\n },\n\n async redirectToNextStep(args?: {\n paymentMethod?: PaymentMethod;\n }): Promise<Err | { url: string; orderId?: string; projectId?: string }> {\n const payload = cartLinkRequest(getCheckout(), locale);\n if (payload == null) {\n return Err(\"cart-is-empty\", \"badInput\");\n }\n if (args?.paymentMethod != null) {\n payload.paymentMethod = args.paymentMethod;\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/**\n * `placed` is a cash on delivery order the buyer accepted: it is paid to the\n * courier later, so for the cart it is as finished as a paid one. `unknown` is\n * an order the backend does not know (yet) or a status we do not recognise.\n */\nexport type OrderStatus = \"created\" | \"placed\" | \"paid\" | \"canceled\" | \"unknown\";\n\nexport type PendingOrderOutcome =\n /** Nothing was pending. */\n | \"none\"\n /** Paid or placed: 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 * `/payment/manualPayment/<projectId>/<orderId>`: the page with the transfer /\n * BLIK details of an order the buyer chose to pay by hand. The order is placed\n * there and paid outside of Bitsnap, often days later.\n */\nexport function isManualPaymentUrl(url: string | undefined): boolean {\n if (url == null || url.length === 0) {\n return false;\n }\n try {\n const path = new URL(url, \"https://bitsnap.invalid\").pathname;\n return /\\/payment\\/manualPayment\\/[^/]+\\/[^/]+\\/?$/.test(path);\n } catch {\n return false;\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, and for a manual payment page: that order\n * is already placed (the buyer only transfers the money), so the cart is\n * cleared right away instead of being kept for a day and offered again.\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 if (isManualPaymentUrl(response.url)) {\n return undefined;\n }\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\" ||\n status === \"placed\" ||\n status === \"paid\" ||\n 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, or placed (cash on delivery): removes the order's cart lines\n * (not what was added since), 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\" || status === \"placed\") {\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","/**\n * The buyer's choice between paying online, paying the seller by hand (bank\n * transfer or \"BLIK przelew na telefon\") and paying the courier on delivery,\n * offered when the seller turned on \"show at checkout\" for the manual payment\n * gateway or offers cash on delivery.\n *\n * `POST /public-commerce/payment-methods` takes the body of `/buy` and answers\n * `{ success: true, choice: null }` (nothing to choose) or\n * `{ success: true, choice: { methods, manualAccountTypes } }`. The pick goes\n * to `/buy` as `paymentMethod`. Anything else (an old backend, an error, a\n * timeout) counts as \"nothing to choose\", so the cart buys as before.\n */\n\nimport type { CheckoutTextKey } from \"./texts\";\n\n/** `cod` is cash on delivery: the buyer pays the courier (Poland only, shipped carts). */\nexport type PaymentMethod = \"online\" | \"manual\" | \"cod\";\nexport type ManualAccountType = \"bankTransfer\" | \"blik\";\n\nexport type PaymentMethodChoice = {\n /** In the seller's order (cash on delivery last); the first one is selected by default. */\n methods: PaymentMethod[];\n /** How the manual option is paid; decides its label. */\n manualAccountTypes: ManualAccountType[];\n};\n\n/** A slow answer must not hold up the \"Next step\" button for long. */\nexport const PAYMENT_METHODS_TIMEOUT_MS = 5000;\n\nconst METHODS: readonly PaymentMethod[] = [\"online\", \"manual\", \"cod\"];\nconst ACCOUNT_TYPES: readonly ManualAccountType[] = [\"bankTransfer\", \"blik\"];\n\nfunction uniqueKnown<T extends string>(value: unknown, known: readonly T[]): T[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const result: T[] = [];\n for (const item of value) {\n if (known.includes(item as T) && !result.includes(item as T)) {\n result.push(item as T);\n }\n }\n return result;\n}\n\n/**\n * The choice in a `payment-methods` answer, or `null` when there is nothing\n * to choose: `choice: null`, a malformed answer, or fewer than two known\n * methods. Methods this version does not know are left out.\n */\nexport function parsePaymentMethodChoice(body: unknown): PaymentMethodChoice | null {\n if (typeof body !== \"object\" || body == null) {\n return null;\n }\n const choice = (body as { choice?: unknown }).choice;\n if (typeof choice !== \"object\" || choice == null) {\n return null;\n }\n const methods = uniqueKnown((choice as { methods?: unknown }).methods, METHODS);\n if (methods.length < 2) {\n return null;\n }\n return {\n methods,\n manualAccountTypes: uniqueKnown(\n (choice as { manualAccountTypes?: unknown }).manualAccountTypes,\n ACCOUNT_TYPES,\n ),\n };\n}\n\n/**\n * The choice without cash on delivery, `null` when fewer than two methods are\n * left: shown while the choice for a new country is asked for.\n */\nexport function withoutCod(choice: PaymentMethodChoice | null): PaymentMethodChoice | null {\n if (choice == null) {\n return null;\n }\n const methods = choice.methods.filter((method) => method !== \"cod\");\n return methods.length < 2 ? null : { ...choice, methods };\n}\n\n/** The method the buyer picked, or the seller's first one when the pick is not offered. */\nexport function effectivePaymentMethod(\n choice: PaymentMethodChoice,\n selected: PaymentMethod | undefined,\n): PaymentMethod {\n return selected != null && choice.methods.includes(selected)\n ? selected\n : choice.methods[0];\n}\n\n/** Label of the manual option for the account types the seller has. */\nexport function manualPaymentTitleKey(types: ManualAccountType[]): CheckoutTextKey {\n const hasBank = types.includes(\"bankTransfer\");\n const hasBlik = types.includes(\"blik\");\n if (hasBlik && !hasBank) {\n return \"paymentMethodManualBlik\";\n }\n if (hasBank && !hasBlik) {\n return \"paymentMethodManualTransfer\";\n }\n return \"paymentMethodManualBoth\";\n}\n\n/**\n * Asks the backend whether the cart offers a choice. Never throws: any\n * failure is `null`, which keeps today's plain `/buy`.\n */\nexport async function fetchPaymentMethodChoice(\n url: string,\n init: { headers: Record<string, string>; body: string },\n timeoutMs: number = PAYMENT_METHODS_TIMEOUT_MS,\n): Promise<PaymentMethodChoice | null> {\n const controller = typeof AbortController === \"undefined\" ? undefined : new AbortController();\n const timer = setTimeout(() => controller?.abort(), timeoutMs);\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: init.headers,\n body: init.body,\n signal: controller?.signal,\n });\n if (!response.ok) {\n return null;\n }\n return parsePaymentMethodChoice(await response.json());\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\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 {\n fetchPaymentMethodChoice,\n type PaymentMethodChoice,\n} from \"./payment-method\";\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\n/** Headers and body of a cart request, as `/buy` and `/payment-methods` send them. */\nfunction cartRequestInit(projectID: string, request: LinkRequest) {\n request = injectReferenceToRequestIfNeeded(request);\n request.locale ??= getLocale();\n return {\n headers: {\n ...clientHeaders,\n ...visitorHeaders(projectID),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n };\n}\n\n/**\n * Whether the buyer may choose between paying online, paying the seller by\n * transfer / BLIK to a phone number and paying on delivery, for the cart\n * `/buy` would get. `null`\n * means nothing to choose, also when the request fails.\n */\nexport async function getPaymentMethodChoice(\n request: LinkRequest,\n): Promise<PaymentMethodChoice | null> {\n const projectID = getProjectID();\n if (projectID == null) {\n return null;\n }\n return fetchPaymentMethodChoice(\n buildURL(projectID, \"/payment-methods\"),\n cartRequestInit(projectID, request),\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 const result = await fetch(buildURL(projectID, \"/buy\"), {\n method: \"POST\",\n ...cartRequestInit(projectID, 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\n/**\n * Creates a checkout link.\n *\n * @warning SERVER-SIDE ONLY. When `apiKey` is set, this sends it as an\n * `Authorization: Bearer` header to the Bitsnap API. Calling it from a client\n * component, browser bundle, island or any code shipped to the browser exposes\n * the project API key to every visitor and to anyone reading the bundle or its\n * source maps. Use it only in a server route, server action or backend module\n * that reads the key from a server-only environment variable.\n *\n * The safe default is to omit `apiKey` entirely: a normal checkout for a public\n * product needs no key and can be created from the browser. For a keyed server\n * test checkout use `Bitsnap.createCheckout(projectID, request)` from\n * `bitsnap-js` instead. See AGENTS.md.\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","useMemo","jsx","Card","className","props","cn","CardHeader","CardTitle","CardDescription","CardContent","className","props","jsx","cn","CircleCheck","useId","jsx","jsxs","MUTED","DARK_FIELD","EMAIL_FAILURES","LINK","EmailCodeLoginForm","login","texts","allowHaveCode","emailPlaceholder","emailInputId","codeInputId","className","buttonClassName","children","uid","useId","emailId","codeId","noticeId","hintId","notice","isError","sending","verifying","resending","buttonBase","cn","success","noticeArea","CircleCheck","emailInvalid","announcer","emailField","Label","Input","event","Button","Spinner","before","after","dead","resendLabel","fillText","OtpCodeField","value","panelFailureKind","failure","TITLES","resolvePanelLoginTexts","locale","getLocale","overrides","resolveEmailCodeTexts","pickLocaleTable","definedOnly","keys","result","key","value","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","PanelLoginForm","texts","projectID","host","locale","logo","instrument","useInstrumentContext","loginUserAsync","useMutation","rpcProvider","verifyCodeAsync","adapter","useMemo","email","response","panelFailureKind","cause","kindFromRpcError","code","challengeId","login","useEmailCodeLogin","pendingLoginKey","accessToken","savePanelSession","returnURL","readPersistedReturnURL","buildAccessTokenRedirect","onCodeStep","title","description","Card","LoginBrandLogo","CardHeader","CardTitle","CardDescription","CardContent","EmailCodeLoginForm","PanelLoginComponentWrapper","analytics","textOverrides","showLogo","logoUrl","logoDarkUrl","theme","allowedReturnOrigins","usePanelConfig","useInstrument","resolvePanelLoginTexts","getLocale","styles","parent","useAutoAnimate","useEffect","getPanelSession","queryReturnURL","getReturnURLFromSearch","persistReturnURL","existingToken","InstrumentProvider","PanelLogin","props","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","lazy","Suspense","useEffect","useState","jsx","jsxs","LoadingIndicator","LoadingIndicator_default","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","useTransport","useEffect","useState","useModelFiles","accessToken","projectID","transport","load","setLoad","cancelled","listModelFiles","next","Fragment","jsx","jsxs","PanelModelFiles","lazy","PanelProductGridComponent","accessToken","projectID","loginURL","styles","activeScreen","params","setParams","openCourse","host","usePanelConfig","products","isProductsLoading","productsError","refetch","useQuery","rpcProvider","modelFiles","useModelFiles","decision","decidePanelProducts","useEffect","clearPanelSession","getLocale","LoadingIndicator_default","productsList","models","filesSection","Suspense","PanelProductsError","PanelProductsEmpty","ProductsComponent","en","onRetry","Button","PanelProductGrid_default","selectedProduct","setSelectedProduct","useState","fromJsonString","UserProductSchema","reveal","product","toJsonString","getProductTypeName","type","handleSelectedProduct","PanelProductDetails_default","index","renderText","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","isManualPaymentUrl","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","cartLinkRequest","mergedMetadata","acc","key","texts","newHost","setCustomHost","googlePayConfig","resolveGooglePayConfiguration","create","PreOrderItemSchema","cartRequiresShipping","mappedPaymentRequest","mapGooglePayConfiguration","empty","deliveryMethod","email","getPaymentMethodChoice","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","METHODS","ACCOUNT_TYPES","uniqueKnown","value","known","result","item","parsePaymentMethodChoice","body","choice","methods","withoutCod","method","effectivePaymentMethod","selected","manualPaymentTitleKey","types","hasBank","hasBlik","fetchPaymentMethodChoice","url","init","timeoutMs","controller","timer","response","Bitsnap","addProductToCart","id","quantity","metadata","args","projectID","getProjectID","err","getCheckoutMethods","showCart","useCheckoutStore","hideCart","readBody","response","cartRequestInit","request","injectReferenceToRequestIfNeeded","getLocale","clientHeaders","visitorHeaders","getPaymentMethodChoice","fetchPaymentMethodChoice","buildURL","createPaymentURL","result","buyErrorFromResponse","createCheckout","headers","path","HOST","getReferenceIfPossible","refLink","ref"]}