bitsnap-react 1.9.0 → 1.11.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 (116) hide show
  1. package/README.md +95 -7
  2. package/dist/CartProvider-ONIOELW5.mjs +2 -0
  3. package/dist/CartProvider-Q3CIVK5K.js +2 -0
  4. package/dist/CartProvider-Q3CIVK5K.js.map +1 -0
  5. package/dist/analytics.d.mts +22 -5
  6. package/dist/analytics.d.ts +22 -5
  7. package/dist/analytics.js +1 -1
  8. package/dist/analytics.js.map +1 -1
  9. package/dist/analytics.mjs +1 -1
  10. package/dist/catalog.d.mts +1 -1
  11. package/dist/catalog.d.ts +1 -1
  12. package/dist/catalog.js +1 -1
  13. package/dist/catalog.js.map +1 -1
  14. package/dist/catalog.mjs +1 -1
  15. package/dist/chunk-7RGH57QG.js +2 -0
  16. package/dist/chunk-7RGH57QG.js.map +1 -0
  17. package/dist/chunk-ADYVTMGH.mjs +2 -0
  18. package/dist/chunk-ADYVTMGH.mjs.map +1 -0
  19. package/dist/{chunk-FHDFLSPW.js → chunk-ASNUY3EU.js} +2 -2
  20. package/dist/chunk-ASNUY3EU.js.map +1 -0
  21. package/dist/{chunk-HKVMSMDF.mjs → chunk-C5Q7DGCD.mjs} +2 -2
  22. package/dist/{chunk-LJWS6ZRJ.mjs → chunk-C5RMHUOG.mjs} +2 -2
  23. package/dist/{chunk-KG6RU37U.js → chunk-CUQ2PNCJ.js} +3 -3
  24. package/dist/chunk-CUQ2PNCJ.js.map +1 -0
  25. package/dist/{chunk-VXB7LA4E.js → chunk-ELGNOAH4.js} +2 -2
  26. package/dist/chunk-ELGNOAH4.js.map +1 -0
  27. package/dist/chunk-EZWH6BB2.mjs +2 -0
  28. package/dist/chunk-EZWH6BB2.mjs.map +1 -0
  29. package/dist/{chunk-SLLBTQTW.mjs → chunk-GPNALARZ.mjs} +2 -2
  30. package/dist/chunk-GT3OH55Y.js +2 -0
  31. package/dist/chunk-GT3OH55Y.js.map +1 -0
  32. package/dist/{chunk-SZ256RCC.mjs → chunk-H3YP2QPV.mjs} +2 -2
  33. package/dist/chunk-HG4YOJWE.mjs +4 -0
  34. package/dist/chunk-HG4YOJWE.mjs.map +1 -0
  35. package/dist/chunk-JSDGZ4NY.js.map +1 -1
  36. package/dist/chunk-KOYBZORL.js.map +1 -1
  37. package/dist/{chunk-VM6JEJFZ.js → chunk-PUYK4YHE.js} +2 -2
  38. package/dist/chunk-PUYK4YHE.js.map +1 -0
  39. package/dist/chunk-T57337WD.mjs +2 -0
  40. package/dist/chunk-T57337WD.mjs.map +1 -0
  41. package/dist/{chunk-3IMJALBX.js → chunk-VQQBBSK2.js} +2 -2
  42. package/dist/chunk-VQQBBSK2.js.map +1 -0
  43. package/dist/chunk-XIHGWNTS.js +2 -0
  44. package/dist/chunk-XIHGWNTS.js.map +1 -0
  45. package/dist/{chunk-GN63ITLA.mjs → chunk-XQ43IC4M.mjs} +2 -2
  46. package/dist/{chunk-V4U2PTKN.js → chunk-YFETPEI6.js} +2 -2
  47. package/dist/chunk-YFETPEI6.js.map +1 -0
  48. package/dist/consent.d.mts +7 -0
  49. package/dist/consent.d.ts +7 -0
  50. package/dist/consent.js +29 -15
  51. package/dist/consent.js.map +1 -1
  52. package/dist/consent.mjs +29 -15
  53. package/dist/consent.mjs.map +1 -1
  54. package/dist/course.d.mts +2 -2
  55. package/dist/course.d.ts +2 -2
  56. package/dist/course.js +1 -1
  57. package/dist/course.js.map +1 -1
  58. package/dist/course.mjs +1 -1
  59. package/dist/course.mjs.map +1 -1
  60. package/dist/embed/analytics.js +1 -1
  61. package/dist/embed/consent.js +27 -13
  62. package/dist/errors.js.map +1 -1
  63. package/dist/index.d.mts +40 -8
  64. package/dist/index.d.ts +40 -8
  65. package/dist/index.js +1 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/index.mjs +1 -1
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/{instrument-C_abZLHk.d.ts → instrument-CmxK7S4T.d.mts} +22 -5
  70. package/dist/{instrument-C_abZLHk.d.mts → instrument-CmxK7S4T.d.ts} +22 -5
  71. package/dist/internal.js.map +1 -1
  72. package/dist/methods-C5HWYPPN.mjs +2 -0
  73. package/dist/methods-CHNMFVFV.js +2 -0
  74. package/dist/methods-CHNMFVFV.js.map +1 -0
  75. package/dist/models.js.map +1 -1
  76. package/dist/returns.d.mts +1 -1
  77. package/dist/returns.d.ts +1 -1
  78. package/dist/returns.js +1 -1
  79. package/dist/returns.js.map +1 -1
  80. package/dist/returns.mjs +1 -1
  81. package/dist/{types-D_WnqwR_.d.mts → types-BnVWLcoB.d.mts} +1 -1
  82. package/dist/{types-BaqLJYuq.d.ts → types-i-IuN4Im.d.ts} +1 -1
  83. package/package.json +2 -2
  84. package/dist/CartProvider-XWTLBIZ5.js +0 -2
  85. package/dist/CartProvider-XWTLBIZ5.js.map +0 -1
  86. package/dist/CartProvider-ZURLJNBW.mjs +0 -2
  87. package/dist/chunk-3IMJALBX.js.map +0 -1
  88. package/dist/chunk-3UHPJ6NK.js +0 -2
  89. package/dist/chunk-3UHPJ6NK.js.map +0 -1
  90. package/dist/chunk-CO2P4FR5.js +0 -2
  91. package/dist/chunk-CO2P4FR5.js.map +0 -1
  92. package/dist/chunk-E6QVQEGZ.mjs +0 -2
  93. package/dist/chunk-E6QVQEGZ.mjs.map +0 -1
  94. package/dist/chunk-FHDFLSPW.js.map +0 -1
  95. package/dist/chunk-KG6RU37U.js.map +0 -1
  96. package/dist/chunk-LZE2E4TE.mjs +0 -4
  97. package/dist/chunk-LZE2E4TE.mjs.map +0 -1
  98. package/dist/chunk-QZJGNLCZ.js +0 -2
  99. package/dist/chunk-QZJGNLCZ.js.map +0 -1
  100. package/dist/chunk-RA452LXZ.mjs +0 -2
  101. package/dist/chunk-RA452LXZ.mjs.map +0 -1
  102. package/dist/chunk-V4U2PTKN.js.map +0 -1
  103. package/dist/chunk-VM6JEJFZ.js.map +0 -1
  104. package/dist/chunk-VXB7LA4E.js.map +0 -1
  105. package/dist/chunk-XVQKEGPO.mjs +0 -2
  106. package/dist/chunk-XVQKEGPO.mjs.map +0 -1
  107. package/dist/methods-CYARZTYL.mjs +0 -2
  108. package/dist/methods-DAPEWVI6.js +0 -2
  109. package/dist/methods-DAPEWVI6.js.map +0 -1
  110. /package/dist/{CartProvider-ZURLJNBW.mjs.map → CartProvider-ONIOELW5.mjs.map} +0 -0
  111. /package/dist/{chunk-HKVMSMDF.mjs.map → chunk-C5Q7DGCD.mjs.map} +0 -0
  112. /package/dist/{chunk-LJWS6ZRJ.mjs.map → chunk-C5RMHUOG.mjs.map} +0 -0
  113. /package/dist/{chunk-SLLBTQTW.mjs.map → chunk-GPNALARZ.mjs.map} +0 -0
  114. /package/dist/{chunk-SZ256RCC.mjs.map → chunk-H3YP2QPV.mjs.map} +0 -0
  115. /package/dist/{chunk-GN63ITLA.mjs.map → chunk-XQ43IC4M.mjs.map} +0 -0
  116. /package/dist/{methods-CYARZTYL.mjs.map → methods-C5HWYPPN.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/panel/components/PanelLogin.tsx","../src/ui/card.tsx","../src/ui/input-otp.tsx","../src/panel/LoadingIndicator.tsx","../src/panel/return-url.ts","../src/panel/components/PanelPage.tsx","../src/panel/hooks/useUrlSearchParams.ts","../src/panel/returns-appearance.ts","../src/ui/switch.tsx","../src/panel/components/PanelNotifications.tsx","../src/ui/pagination.tsx","../src/panel/components/PanelOrderHistory.tsx","../src/panel/components/PanelPlans.tsx","../src/panel/components/PanelReturns.tsx","../src/panel/components/PanelProductGrid.tsx","../src/lib/render.text.tsx","../src/panel/components/PanelProductDetails.tsx","../src/panel/audio-player/AudioPlayer.tsx","../src/panel/audio-player/media.session.coordinator.ts","../src/panel/texts.ts","../src/panel/components/ProgressBar.tsx","../src/panel/components/PanelProductHeader.tsx","../src/panel/components/PanelProfile.tsx","../src/panel/components/LazyPanelCourse.tsx","../src/panel/components/PublicOrderPage.tsx","../src/components/checkout/CartProvider.tsx","../src/public.api.client.ts","../src/components/checkout/frontent.analytics.ts","../src/components/checkout/lib/round.number.ts","../src/components/checkout/google.pay.mapper.ts","../src/components/checkout/helper.methods.ts","../src/components/checkout/lib/err.ts","../src/components/checkout/cart-items.ts","../src/components/checkout/state.ts","../src/components/checkout/methods.ts"],"sourcesContent":["import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport {\n useEffect,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n} from \"react\";\nimport {\n InstrumentProvider,\n useInstrument,\n useInstrumentContext,\n type AnalyticsOption,\n} from \"../../analytics/instrument\";\nimport { cn } from \"../../lib/utils\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../ui/card\";\nimport { Input } from \"../../ui/input\";\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSeparator,\n InputOTPSlot,\n} from \"../../ui/input-otp\";\nimport { REGEXP_ONLY_DIGITS } from \"input-otp\";\nimport { Label } from \"../../ui/label\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport {\n getAllowedReturnOrigins,\n setAllowedReturnOrigins,\n} from \"../config\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport {\n buildAccessTokenRedirect,\n getReturnURLFromSearch,\n persistReturnURL,\n readPersistedReturnURL,\n} from \"../return-url\";\nimport { getPanelSession, savePanelSession } from \"../session-storage\";\n\ntype LoginResponseStatus = \"success\" | \"error\" | \"default\";\n\nif (typeof window !== \"undefined\") {\n const currentOrigin = window.location.origin;\n const knownSiblings = [\n currentOrigin,\n \"https://bitsnap.pl\",\n \"https://kursy.bitsnap.pl\",\n ];\n if (getAllowedReturnOrigins().length === 0) {\n setAllowedReturnOrigins(Array.from(new Set(knownSiblings)));\n }\n}\n\ninterface LoginUserPanelProps {\n projectID?: string;\n host?: string;\n reveal: () => void;\n email: string;\n setEmail: (input: string) => void;\n loginUser: () => void;\n isLoginLoading: boolean;\n errMsg: string;\n}\n\ninterface VerifyCodePanelProps {\n projectID?: string;\n host?: string;\n email: string;\n reveal: () => void;\n setEmail: (input: string) => void;\n loginUser: () => void;\n isLoginLoading: boolean;\n loginUserResponse: {\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null;\n setLoginUserResponse: (\n response: {\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null,\n ) => void;\n responseStatus: LoginResponseStatus;\n setResponseStatus: (status: LoginResponseStatus) => void;\n errMsg: string;\n}\n\nconst LoginUserPanel = ({\n projectID,\n host,\n reveal,\n email,\n setEmail,\n loginUser,\n isLoginLoading,\n errMsg,\n}: LoginUserPanelProps) => {\n const { projectID: configuredProjectID, host: configuredHost } = usePanelConfig();\n if (\n typeof window !== \"undefined\" &&\n getPanelSession(projectID ?? configuredProjectID, host ?? configuredHost) != null\n ) {\n // @ts-ignore\n window.location.href = window.location.href.replaceAll(\"login\", \"\");\n return null;\n }\n\n const [isValidEmail, setIsValidEmail] = useState<boolean>(false);\n\n const emailValidation = (input: string) => {\n const emailPattern =\n /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n if (emailPattern.test(input.trim())) {\n return setIsValidEmail(true);\n }\n\n return setIsValidEmail(false);\n };\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const { value } = e.target;\n emailValidation(value);\n setEmail(value);\n };\n\n function goToVerifyCode() {\n reveal();\n }\n\n function onSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault();\n void loginUser();\n }\n\n return (\n <main className=\"mx-auto flex max-w-sm flex-1 flex-col justify-center space-y-12\">\n <div className={cn(\"flex min-w-sm flex-col gap-6\")}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-2xl\">Zaloguj się</CardTitle>\n <CardDescription>\n Wyślemy do Ciebie kod na maila, dzięki któremu się zalogujesz.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-6\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n onChange={handleInputChange}\n type=\"email\"\n placeholder=\"m@example.com\"\n required\n />\n <span\n className={cn(\n !isValidEmail && email.length > 0\n ? \"font-bold text-red-500\"\n : \"text-neutral-700 dark:text-neutral-400\",\n \"text-xs\",\n )}\n >\n {!isValidEmail && email.length > 0\n ? \"Nieprawidłowy adres email\"\n : \"Wpisz swój adres email\"}\n </span>\n </div>\n\n <div>\n <Button\n type=\"submit\"\n disabled={isLoginLoading}\n className=\"relative w-full\"\n onClick={loginUser}\n >\n {isLoginLoading && (\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n <LoadingIndicator />\n </div>\n )}\n Zaloguj się\n </Button>\n {errMsg.length > 0 && (\n <p className=\"text-xs font-medium text-red-500\">{errMsg}</p>\n )}\n </div>\n </div>\n <div className=\"mt-4 text-center text-sm\">\n Masz już kod?{\" \"}\n <button\n type=\"button\"\n onClick={goToVerifyCode}\n className=\"underline underline-offset-4\"\n >\n Mam już kod\n </button>\n </div>\n </form>\n </CardContent>\n </Card>\n </div>\n </main>\n );\n};\n\nconst VerifyCodePanel = ({\n projectID,\n host,\n email,\n reveal,\n setEmail,\n isLoginLoading,\n loginUserResponse,\n setLoginUserResponse,\n setResponseStatus,\n errMsg,\n}: VerifyCodePanelProps) => {\n const instrument = useInstrumentContext();\n const { mutateAsync: verifyCodeAsync, isPending: isVerifyLoading } =\n useMutation(rpcProvider.publicApi.userPanelLoginWithCode);\n\n const [code, setCode] = useState<string>(\"\");\n const [isValidCode, setIsValidCode] = useState<boolean>(false);\n const [isSubmitted, setIsSubmitted] = useState<boolean>(false);\n const [retryIn, setRetryIn] = useState(0);\n\n const codeValidation = (input: string) => {\n const codePattern = /^\\d+$/;\n\n if (codePattern.test(input.trim())) {\n return setIsValidCode(true);\n }\n\n return setIsValidCode(false);\n };\n\n const handleInputChange = (value: string) => {\n codeValidation(value);\n setCode(value);\n };\n\n async function login() {\n setIsSubmitted(true);\n if (code.length == 0) {\n setIsValidCode(false);\n return;\n }\n const codeValue = parseInt(code);\n\n const verifyCodeResult = await verifyCodeAsync({\n code: codeValue,\n });\n\n let status, message, accessToken;\n\n if (verifyCodeResult.result.case === \"accessToken\") {\n setIsValidCode(true);\n status = \"ok\";\n message = undefined;\n accessToken = verifyCodeResult.result.value;\n } else {\n setIsValidCode(false);\n status = \"error\";\n message = verifyCodeResult.result.value;\n accessToken = undefined;\n }\n\n if (status === \"error\") {\n setIsValidCode(false);\n console.warn(\"error:\", `Kod błędu: ${message}`);\n console.warn(\"Nieprawidłowy kod, spróbuj ponownie.\");\n }\n\n if (status === \"ok\") {\n instrument.track(\"panel_login\", {});\n if (accessToken) {\n savePanelSession(projectID, accessToken, email, host);\n }\n const returnURL = typeof window !== \"undefined\"\n ? readPersistedReturnURL()\n : null;\n setTimeout(() => {\n if (accessToken && returnURL) {\n window.location.href = buildAccessTokenRedirect(returnURL, accessToken);\n return;\n }\n window.location.reload();\n }, 100);\n }\n }\n\n function handleRetryInTime() {\n const intervalId = setInterval(() => {\n setRetryIn((prevRetryIn) => {\n if (prevRetryIn > 0) {\n return prevRetryIn - 1;\n } else {\n clearInterval(intervalId);\n return 0;\n }\n });\n }, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n\n useEffect(() => {\n if (loginUserResponse?.status === \"ok\" && loginUserResponse?.retryIn > 0) {\n setRetryIn(loginUserResponse.retryIn);\n handleRetryInTime();\n }\n }, [loginUserResponse]);\n\n function backToLoginComponent() {\n setEmail(\"\");\n setLoginUserResponse(null);\n setResponseStatus(\"default\");\n reveal();\n }\n\n function onCodeSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault();\n void login();\n }\n\n return (\n <main className=\"mx-auto flex max-w-md flex-1 flex-col justify-center space-y-8\">\n <div className={cn(\"flex min-w-sm flex-col gap-6\")}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-2xl\">Wpisz kod z maila</CardTitle>\n <CardDescription>\n Sprawdź czy przypadkiem nie wylądował w spamie.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={onCodeSubmit} className=\"flex flex-col gap-6\">\n <div className=\"grid gap-2\">\n <div className=\"my-5 flex w-full items-center justify-center\">\n <div className=\"flex flex-col gap-2\">\n <InputOTP\n id=\"verify-code\"\n maxLength={6}\n pattern={REGEXP_ONLY_DIGITS}\n onChange={(newValue) => {\n handleInputChange(newValue);\n }}\n >\n <InputOTPGroup>\n <InputOTPSlot index={0} />\n <InputOTPSlot index={1} />\n <InputOTPSlot index={2} />\n </InputOTPGroup>\n <InputOTPSeparator />\n <InputOTPGroup>\n <InputOTPSlot index={3} />\n <InputOTPSlot index={4} />\n <InputOTPSlot index={5} />\n </InputOTPGroup>\n </InputOTP>\n <span\n className={cn(\n !isValidCode && isSubmitted\n ? \"text-red-500\"\n : \"text-neutral-700 dark:text-neutral-400\",\n \"text-xs\",\n )}\n >\n {!isValidCode && isSubmitted\n ? code.length == 0\n ? \"Kod nie może być pusty\"\n : \"Kod musi składać się z cyfr\"\n : \"Wpisz kod z maila\"}\n </span>\n </div>\n </div>\n </div>\n\n <div>\n <Button\n type=\"submit\"\n disabled={isLoginLoading || isVerifyLoading}\n className=\"relative w-full\"\n >\n {(isLoginLoading || isVerifyLoading) && (\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n <LoadingIndicator />\n </div>\n )}\n Zaloguj się\n </Button>\n {errMsg.length > 0 && (\n <p className=\"text-xs font-medium text-red-500\">{errMsg}</p>\n )}\n </div>\n </form>\n <div className=\"mt-4 text-center text-sm\">\n Nie masz kodu?{\" \"}\n <button\n type=\"button\"\n onClick={backToLoginComponent}\n className=\"underline underline-offset-4\"\n >\n Wróć\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n </main>\n );\n};\n\nconst PanelLoginComponentWrapper = ({\n analytics,\n}: {\n analytics?: AnalyticsOption;\n}) => {\n const { theme, allowedReturnOrigins, projectID, host } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"panel\");\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#FFFFFF\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#FFFFFF\",\n } as CSSProperties;\n\n type Screen = \"login\" | \"verifyCode\";\n\n const [activeScreen, setActiveScreen] = useState<Screen>(\"login\");\n const [parent] = useAutoAnimate({\n duration: 300,\n easing: \"ease-in-out\",\n disrespectUserMotionPreference: false,\n });\n\n const reveal = () =>\n setActiveScreen((prevScreen) =>\n prevScreen === \"login\" ? \"verifyCode\" : \"login\",\n );\n\n const [email, setEmail] = useState<string>(\"\");\n const [responseStatus, setResponseStatus] =\n useState<LoginResponseStatus>(\"default\");\n const [loginUserResponse, setLoginUserResponse] = useState<{\n status: \"error\" | \"ok\";\n retryIn: number;\n message?: string | undefined;\n } | null>(null);\n const { mutateAsync: loginUserAsync, isPending: isLoginLoading } =\n useMutation(rpcProvider.publicApi.userPanelLogin);\n\n const [errMsg, setErrMsg] = useState(\"\");\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (window.parent !== window) return;\n\n const queryReturnURL = getReturnURLFromSearch(window.location.search);\n if (queryReturnURL) {\n persistReturnURL(queryReturnURL);\n }\n\n const returnURL = queryReturnURL ?? readPersistedReturnURL();\n if (!returnURL) return;\n\n const existingToken = getPanelSession(projectID, host);\n if (!existingToken) return;\n\n window.location.href = buildAccessTokenRedirect(returnURL, existingToken);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [allowedReturnOrigins, projectID, host]);\n\n async function loginUser() {\n setErrMsg(\"\");\n setResponseStatus(\"default\");\n const loginUserResult = await loginUserAsync({\n email: email,\n });\n\n const status = loginUserResult.result.case === \"success\" ? \"ok\" : \"error\";\n let retryIn = 0;\n let message = undefined;\n\n if (loginUserResult.result.case === \"success\") {\n retryIn = loginUserResult.result.value.retryIn;\n }\n\n if (status === \"error\") {\n message = \"Nieprawidłowy adres email, spróbuj ponownie.\";\n }\n\n setLoginUserResponse({\n status: status,\n retryIn: retryIn,\n message: message,\n });\n\n if (status === \"ok\" && activeScreen === \"login\") {\n reveal();\n } else if (status === \"ok\" && activeScreen === \"verifyCode\") {\n setResponseStatus(\"success\");\n } else if (status === \"error\") {\n setErrMsg(message ?? \"Nieprawidłowy adres email, spróbuj ponownie.\");\n }\n }\n\n return (\n <InstrumentProvider value={instrument}>\n <div className=\"bg-white text-black dark:bg-black dark:text-white\">\n <div\n className=\"font-inter flex h-screen w-screen flex-col p-4\"\n style={styles}\n ref={parent}\n >\n <header>\n {theme?.logoDarkURL && (\n <img\n src={theme?.logoDarkURL}\n className=\"hidden dark:inline\"\n alt=\"Company Logo\"\n draggable={false}\n />\n )}\n {theme?.logoURL && (\n <img\n src={theme?.logoURL}\n className=\"dark:hidden\"\n alt=\"Company Logo\"\n draggable={false}\n />\n )}\n </header>\n {activeScreen === \"login\" && (\n <LoginUserPanel\n projectID={projectID}\n host={host}\n reveal={reveal}\n email={email}\n setEmail={setEmail}\n loginUser={loginUser}\n isLoginLoading={isLoginLoading}\n errMsg={errMsg}\n />\n )}\n {activeScreen === \"verifyCode\" && (\n <VerifyCodePanel\n projectID={projectID}\n host={host}\n email={email}\n reveal={reveal}\n setEmail={setEmail}\n loginUser={loginUser}\n isLoginLoading={isLoginLoading}\n loginUserResponse={loginUserResponse}\n setLoginUserResponse={setLoginUserResponse}\n responseStatus={responseStatus}\n setResponseStatus={setResponseStatus}\n errMsg={errMsg}\n />\n )}\n </div>\n </div>\n </InstrumentProvider>\n );\n};\n\nexport const PanelLogin = ({\n analytics,\n}: { analytics?: AnalyticsOption } = {}) => {\n return <PanelLoginComponentWrapper analytics={analytics} />;\n};\n","import * as React from \"react\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","export function LoadingIndicator() {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current [animation-delay:-0.3s]\" />\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current [animation-delay:-0.15s]\" />\n <div className=\"h-3 w-3 animate-bounce rounded-full bg-current\" />\n </div>\n );\n}\n\nexport default LoadingIndicator;\n","import { getAllowedReturnOrigins } from \"./config\";\n\nconst RETURN_URL_PARAM = \"return_url\";\nconst RETURN_URL_STORAGE_KEY = \"__return_url\";\nconst ACCESS_TOKEN_PARAM = \"accessToken\";\n\nexport function getReturnURLFromSearch(search: string): string | null {\n const raw = new URLSearchParams(search).get(RETURN_URL_PARAM);\n if (!raw) return null;\n return validateReturnURL(raw);\n}\n\nexport function persistReturnURL(returnURL: string | null): void {\n if (typeof window === \"undefined\") return;\n if (returnURL) {\n window.sessionStorage.setItem(RETURN_URL_STORAGE_KEY, returnURL);\n } else {\n window.sessionStorage.removeItem(RETURN_URL_STORAGE_KEY);\n }\n}\n\nexport function readPersistedReturnURL(): string | null {\n if (typeof window === \"undefined\") return null;\n const stored = window.sessionStorage.getItem(RETURN_URL_STORAGE_KEY);\n if (!stored) return null;\n return validateReturnURL(stored);\n}\n\nfunction isOriginAllowed(origin: string, allowedOrigins: string[]): boolean {\n return allowedOrigins.some((allowed) => {\n if (origin === allowed) return true;\n const allowedHost = new URL(allowed).hostname;\n const originHost = new URL(origin).hostname;\n return originHost.endsWith(`.${allowedHost}`) || originHost === allowedHost;\n });\n}\n\nfunction validateReturnURL(raw: string): string | null {\n try {\n const u = new URL(raw);\n if (u.protocol !== \"https:\" && u.protocol !== \"http:\") return null;\n if (!isOriginAllowed(u.origin, getAllowedReturnOrigins())) return null;\n return u.toString();\n } catch {\n return null;\n }\n}\n\nexport function buildAccessTokenRedirect(\n returnURL: string,\n accessToken: string,\n): string {\n const u = new URL(returnURL);\n u.searchParams.set(ACCESS_TOKEN_PARAM, accessToken);\n return u.toString();\n}\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { useEffect, useState, type CSSProperties } from \"react\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { useUrlSearchParams } from \"../hooks/useUrlSearchParams\";\nimport { InstrumentProvider, useInstrument } from \"../../analytics/instrument\";\nimport { usePanelConfig } from \"../PanelProvider\";\nimport { resolvePanelReturnsAppearance } from \"../returns-appearance\";\nimport type { PanelProps } from \"../types\";\nimport {\n buildAccessTokenRedirect,\n getReturnURLFromSearch,\n persistReturnURL,\n readPersistedReturnURL,\n} from \"../return-url\";\n\nimport PanelNotificationsComponent from \"./PanelNotifications\";\nimport PanelOrderHistoryComponent from \"./PanelOrderHistory\";\nimport PanelPlansComponent from \"./PanelPlans\";\nimport PanelReturnsComponent from \"./PanelReturns\";\nimport PanelProductGridComponent from \"./PanelProductGrid\";\nimport PanelProductHeaderComponent from \"./PanelProductHeader\";\nimport PanelProfileComponent from \"./PanelProfile\";\nimport LazyPanelCourse from \"./LazyPanelCourse\";\nimport PublicOrderPage from \"./PublicOrderPage\";\nimport { clearPanelSession, getPanelEmail, getPanelSession } from \"../session-storage\";\n\nexport type PanelScreen =\n | \"products\"\n | \"notifications\"\n | \"profile\"\n | \"plans\"\n | \"orders\"\n | \"order-details\"\n | \"returns\"\n | \"return-details\"\n | \"course\";\n\nexport type PanelSearchParamsType = {\n product?: string;\n state: PanelScreen;\n orderId?: string;\n returnId?: string;\n /** `state: \"course\"`: `UserProduct.accessId` of the open course. */\n course?: string;\n /** `state: \"course\"`: id of the open lesson or test. */\n item?: string;\n};\n\nconst PanelPage = ({\n returnsAppearance,\n returnsTexts,\n analytics,\n}: Pick<PanelProps, \"returnsAppearance\" | \"returnsTexts\" | \"analytics\"> = {}) => {\n const { projectID, theme, loginURL, host } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"panel\");\n\n const accessToken = getPanelSession(projectID, host);\n const email = getPanelEmail(projectID, host);\n\n const { mutateAsync: logoutUserAsync } = useMutation(\n rpcProvider.publicApi.userPanelLogout,\n );\n\n async function logout() {\n if (accessToken) {\n await logoutUserAsync({\n accessToken: accessToken as string,\n });\n }\n if (typeof window !== \"undefined\") {\n clearPanelSession(projectID, host);\n window.location.reload();\n }\n }\n\n const [panelParentRef] = useAutoAnimate();\n const isScreen = (value: unknown): value is PanelScreen =>\n [\n \"products\",\n \"notifications\",\n \"profile\",\n \"plans\",\n \"orders\",\n \"order-details\",\n \"returns\",\n \"return-details\",\n \"course\",\n ].includes(value as string);\n\n const [params, setParams] = useUrlSearchParams<PanelSearchParamsType>({\n product: undefined,\n state: \"products\",\n orderId: undefined,\n returnId: undefined,\n course: undefined,\n item: undefined,\n });\n\n const [activeScreen, setActiveScreen] = useState<PanelScreen>(\n isScreen(params.state) ? params.state : \"products\",\n );\n\n const handleOpenOrderDetails = (orderID: string) => {\n setParams({\n state: \"order-details\",\n orderId: orderID,\n });\n setActiveScreen(\"order-details\");\n };\n\n const handleBackToOrders = () => {\n setParams({\n state: \"orders\",\n orderId: undefined,\n });\n setActiveScreen(\"orders\");\n };\n\n // Navigation starts a screen from scratch, so ids of the previous screen\n // must not leak into it.\n const navigate = (next: { product?: string; state: PanelScreen }) =>\n setParams({\n orderId: undefined,\n returnId: undefined,\n course: undefined,\n item: undefined,\n ...next,\n });\n\n const handleOpenCourse = (accessId: string) => {\n setParams({\n state: \"course\",\n course: accessId,\n item: undefined,\n product: undefined,\n });\n setActiveScreen(\"course\");\n };\n\n const handleLeaveCourse = () => {\n setParams({\n state: \"products\",\n course: undefined,\n item: undefined,\n product: undefined,\n });\n setActiveScreen(\"products\");\n };\n\n // The browser's back and forward buttons move between the lessons of a\n // course and in and out of it.\n useEffect(() => {\n if (!isScreen(params.state)) return;\n if (params.state === \"course\" || activeScreen === \"course\") {\n setActiveScreen(params.state);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [params.state]);\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#000000\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#ffffff\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#000000\",\n } as CSSProperties;\n\n useEffect(() => {\n if (accessToken == null || accessToken.length === 0) {\n window.location.href = loginURL ?? \"/panel/login\";\n return;\n }\n }, []);\n\n useEffect(() => {\n if (accessToken == null || accessToken.length === 0) {\n window.location.href = loginURL ?? \"/panel/login\";\n return;\n }\n }, [activeScreen]);\n\nuseEffect(() => {\n if (typeof window === \"undefined\") return;\n if (window.parent !== window) return;\n if (!accessToken) return;\n\n const queryReturnURL = getReturnURLFromSearch(window.location.search);\n if (queryReturnURL) {\n persistReturnURL(queryReturnURL);\n }\n\n const returnURL = queryReturnURL ?? readPersistedReturnURL();\n if (!returnURL) return;\n\n window.location.href = buildAccessTokenRedirect(returnURL, accessToken);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accessToken]);\n\n return (\n <InstrumentProvider value={instrument}>\n <div\n ref={panelParentRef}\n className=\"font-inter relative min-h-screen w-screen bg-beige-100 text-black dark:bg-black dark:text-white md:flex\"\n >\n <PanelProductHeaderComponent\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={navigate}\n styles={styles}\n theme={theme}\n logout={logout}\n />\n\n <main className=\"flex h-[calc(100vh-80px)] flex-col overflow-y-auto w-full p-5 md:h-screen\">\n {activeScreen === \"products\" && (\n <PanelProductGridComponent\n projectID={projectID ?? \"\"}\n accessToken={accessToken!}\n loginURL={loginURL ?? \"/panel/login\"}\n styles={styles}\n activeScreen={activeScreen}\n params={params as PanelSearchParamsType}\n setParams={setParams}\n openCourse={handleOpenCourse}\n />\n )}\n\n {activeScreen === \"course\" && params.course && accessToken && (\n <LazyPanelCourse\n accessId={params.course}\n accessToken={accessToken}\n theme={theme}\n itemId={params.item}\n onItemChange={(item) => setParams({ item })}\n onBack={handleLeaveCourse}\n />\n )}\n\n {activeScreen === \"notifications\" && <PanelNotificationsComponent />}\n\n {activeScreen === \"plans\" && (\n <PanelPlansComponent projectID={projectID ?? \"\"} />\n )}\n\n {activeScreen === \"orders\" && (\n <PanelOrderHistoryComponent\n projectID={projectID ?? \"\"}\n accessToken={accessToken ?? \"\"}\n openOrderDetails={handleOpenOrderDetails}\n />\n )}\n\n {activeScreen === \"order-details\" && params.orderId && (\n <PublicOrderPage\n orderID={params.orderId}\n onBack={handleBackToOrders}\n />\n )}\n\n {(activeScreen === \"returns\" || activeScreen === \"return-details\") &&\n accessToken && (\n <PanelReturnsComponent\n projectID={projectID ?? \"\"}\n host={host}\n accessToken={accessToken}\n loginURL={loginURL ?? \"/panel/login\"}\n appearance={resolvePanelReturnsAppearance(\n returnsAppearance,\n theme?.colors?.brand,\n )}\n texts={returnsTexts}\n screen={activeScreen}\n params={params as PanelSearchParamsType}\n setParams={setParams}\n setActiveScreen={setActiveScreen}\n />\n )}\n\n {activeScreen === \"profile\" && (\n <PanelProfileComponent email={email} logout={logout} />\n )}\n </main>\n </div>\n </InstrumentProvider>\n );\n};\n\nexport default PanelPage;\n","import { useState, useCallback, useEffect } from \"react\";\n\nexport function useUrlSearchParams<T extends Record<string, unknown>>(\n initialValue: T,\n): [T, (params: Partial<T>) => void] {\n const [params, setParams] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n const urlParams = new URLSearchParams(window.location.search);\n const parsed: Partial<T> = {};\n \n (Object.keys(initialValue) as Array<keyof T>).forEach((key) => {\n const value = urlParams.get(key as string);\n if (value !== null) {\n try {\n (parsed as Record<string, unknown>)[key as string] = JSON.parse(value);\n } catch {\n (parsed as Record<string, unknown>)[key as string] = value as T[keyof T];\n }\n }\n });\n \n return { ...initialValue, ...parsed };\n });\n\n const updateParams = useCallback((newParams: Partial<T>) => {\n setParams((prev) => {\n const updated = { ...prev, ...newParams };\n \n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams();\n (Object.keys(updated) as Array<keyof T>).forEach((key) => {\n const value = updated[key];\n if (value !== undefined && value !== null) {\n urlParams.set(key as string, JSON.stringify(value));\n }\n });\n \n const newUrl = `${window.location.pathname}?${urlParams.toString()}`;\n window.history.pushState({}, \"\", newUrl);\n }\n \n return updated;\n });\n }, []);\n\n useEffect(() => {\n const handlePopState = () => {\n const urlParams = new URLSearchParams(window.location.search);\n const parsed: Partial<T> = {};\n \n (Object.keys(initialValue) as Array<keyof T>).forEach((key) => {\n const value = urlParams.get(key as string);\n if (value !== null) {\n try {\n (parsed as Record<string, unknown>)[key as string] = JSON.parse(value);\n } catch {\n (parsed as Record<string, unknown>)[key as string] = value as T[keyof T];\n }\n }\n });\n \n setParams({ ...initialValue, ...parsed });\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n return () => window.removeEventListener(\"popstate\", handlePopState);\n }, [initialValue]);\n\n return [params, updateParams];\n}\n","import type { ReturnsAppearance } from \"../components/returns/appearance\";\nimport { brandColorTokens, readableForeground } from \"../components/returns/color\";\n\nexport { readableForeground };\n\n/**\n * Returns appearance of the panel Returns screen derived from the panel brand\n * color. An explicit appearance wins; without a brand color the library\n * defaults apply (`undefined`).\n */\nexport function resolvePanelReturnsAppearance(\n explicit: ReturnsAppearance | undefined,\n brand: string | undefined,\n): ReturnsAppearance | undefined {\n if (explicit != null) {\n return explicit;\n }\n const color = brand?.trim();\n if (color == null || color === \"\") {\n return undefined;\n }\n return { tokens: brandColorTokens(color) };\n}\n","import * as React from \"react\"\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/src/lib/utils\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","import { Label } from \"../../ui/label\";\nimport { Switch } from \"../../ui/switch\";\nimport { useState } from \"react\";\n\ninterface PanelNotificationsComponentProps {}\n\nfunction PanelNotificationsComponent({}: PanelNotificationsComponentProps) {\n const [notifications, setNotifications] = useState<Record<string, boolean>>({\n disableAll: false,\n });\n\n return (\n <>\n <h3 className=\"text-2xl\">Powiadomienia</h3>\n <p className=\"text-sm text-neutral-500\">\n Zarządzaj swoimi powiadomieniami\n </p>\n <div className=\"mt-6\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"disable-all-notifications\"\n checked={notifications.disableAll}\n onCheckedChange={(checked) =>\n setNotifications((prevState) => ({\n ...prevState,\n disableAll: checked,\n }))\n }\n />\n <Label\n htmlFor=\"disable-all-notifications\"\n className=\"flex flex-col gap-1 text-base\"\n >\n Wszystkie powiadomienia\n <span className=\"text-xs font-normal text-neutral-500 md:text-sm\">\n Ten przycisk może wyłączyć wszystkie powiadomienia\n </span>\n </Label>\n </div>\n </div>\n </>\n );\n}\n\nexport default PanelNotificationsComponent;\n","import * as React from \"react\"\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"@/src/lib/utils\"\nimport { buttonVariants, type Button } from \"@/src/ui/button\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import { rpcProvider, useQuery } from \"../../rpc-provider\";\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"../../ui/pagination\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { useState } from \"react\";\n\ninterface PanelOrderHistoryComponentProps {\n projectID: string;\n accessToken: string;\n openOrderDetails: (orderId: string) => void;\n}\n\nconst formatDate = (ts: number): string =>\n new Date(ts * 1000).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n\nconst formatAmount = (amount: number, currency: string): string =>\n new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currency.toUpperCase(),\n }).format(amount / 100);\n\nconst statusLabel: Record<string, string> = {\n draft: \"Szkic\",\n unpaid: \"Nieopłacona\",\n paid: \"Opłacona\",\n overdue: \"Zaległa\",\n cancelled: \"Anulowana\",\n completed: \"Zakończone\",\n processing: \"Przetwarzane\",\n refunded: \"Zwrócone\",\n};\n\nconst statusColor: Record<string, string> = {\n draft: \"text-neutral-400\",\n unpaid: \"text-yellow-500\",\n paid: \"text-green-600\",\n overdue: \"text-red-500\",\n cancelled: \"text-neutral-400 line-through\",\n completed: \"text-green-600\",\n processing: \"text-blue-500\",\n refunded: \"text-purple-500\",\n};\n\nfunction PanelOrderHistory({\n openOrderDetails,\n projectID,\n accessToken,\n}: PanelOrderHistoryComponentProps) {\n const [offset, setOffset] = useState(0);\n const limit = 20;\n\n const { data, isFetching } = useQuery(rpcProvider.publicApi.getOrders, {\n projectId: projectID,\n accessToken,\n offset,\n limit,\n });\n\n const orders = data?.orders ?? [];\n const totalCount = data?.totalCount ?? 0;\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(totalCount / limit);\n\n const handlePageChange = (newOffset: number) => {\n setOffset(newOffset);\n };\n\n return (\n <>\n <h3 className=\"text-2xl\">Historia zamówień</h3>\n <p className=\"text-sm text-neutral-500 dark:text-neutral-400\">\n Twoje zamówienia\n </p>\n\n {isFetching ? (\n <div className=\"mt-6 flex w-full flex-col gap-3\">\n {[...Array(5)].map((_, i) => (\n <div\n key={i}\n className=\"rounded-xl bg-white p-4 shadow-sm dark:bg-neutral-800\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n <div className=\"space-y-2 text-right\">\n <Skeleton className=\"ml-auto h-4 w-16\" />\n <Skeleton className=\"ml-auto h-3 w-12\" />\n </div>\n </div>\n <div className=\"mt-3\">\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : orders.length === 0 ? (\n <div className=\"mt-6 text-sm text-neutral-400\">Brak zamówień.</div>\n ) : (\n <div>\n <div className=\"mt-6 flex w-full flex-col gap-3\">\n {orders.map((order) => (\n <button\n key={order.id}\n onClick={() => openOrderDetails(order.id)}\n className=\"block rounded-xl bg-white p-4 text-left shadow-sm transition-colors hover:bg-neutral-50 dark:bg-neutral-800 dark:hover:bg-neutral-700\"\n >\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Zamówienie #{order.id}</p>\n <p className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {order.customerName || \"Klient\"}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n {formatAmount(order.totalAmount, order.currency)}\n </p>\n <p\n className={`text-xs font-medium ${statusColor[order.status] ?? \"text-neutral-400\"}`}\n >\n {statusLabel[order.status] ?? order.status}\n </p>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between text-xs text-neutral-500 dark:text-neutral-400\">\n <span>\n Data:{\" \"}\n {order.createdAt\n ? formatDate(Number(order.createdAt.seconds))\n : \"-\"}\n </span>\n </div>\n </button>\n ))}\n </div>\n\n {totalPages > 1 && !isFetching && (\n <div className=\"mt-4 flex justify-center\">\n <Pagination>\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious\n onClick={() => handlePageChange(offset - limit)}\n />\n </PaginationItem>\n )}\n\n {currentPage > 2 && (\n <PaginationItem>\n <PaginationLink onClick={() => handlePageChange(0)}>\n 1\n </PaginationLink>\n </PaginationItem>\n )}\n\n {currentPage > 3 && (\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n )}\n\n {[currentPage - 1, currentPage, currentPage + 1]\n .filter((page) => page > 0 && page <= totalPages)\n .map((page) => (\n <PaginationItem key={page}>\n <PaginationLink\n onClick={() => handlePageChange((page - 1) * limit)}\n isActive={currentPage === page}\n >\n {page}\n </PaginationLink>\n </PaginationItem>\n ))}\n\n {currentPage < totalPages - 2 && (\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n )}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationLink\n onClick={() =>\n handlePageChange((totalPages - 1) * limit)\n }\n >\n {totalPages}\n </PaginationLink>\n </PaginationItem>\n )}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext\n onClick={() => handlePageChange(offset + limit)}\n />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\nexport default PanelOrderHistory;\n","import { useState } from \"react\";\n\ninterface Plan {\n id: number;\n tierKey: string;\n tierName: string;\n configName: string;\n status: string;\n billingDay: number;\n startDate: number;\n endDate: number | null;\n}\n\ninterface PanelPlansComponentProps {\n projectID: string;\n}\n\nconst formatDate = (ts: number): string =>\n new Date(ts * 1000).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n\nconst statusLabel: Record<string, string> = {\n active: \"Aktywny\",\n cancelled: \"Anulowany\",\n paused: \"Wstrzymany\",\n};\n\nconst statusColor: Record<string, string> = {\n active: \"text-green-600\",\n cancelled: \"text-red-500\",\n paused: \"text-yellow-500\",\n};\n\nfunction PanelPlansComponent({ projectID: _projectID }: PanelPlansComponentProps) {\n const [plans, setPlans] = useState<Plan[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n return (\n <>\n <h3 className=\"text-2xl\">Plany</h3>\n <p className=\"text-sm text-neutral-500\">Twoje aktywne subskrypcje</p>\n\n {isLoading ? (\n <div className=\"mt-6 text-sm text-neutral-400\">Ładowanie...</div>\n ) : plans.length === 0 ? (\n <div className=\"mt-6 text-sm text-neutral-400\">\n Brak aktywnych planów.\n </div>\n ) : (\n <div className=\"mt-6 flex flex-col gap-4\">\n {plans.map((plan) => (\n <div\n key={plan.id}\n className=\"rounded-xl bg-white p-5 shadow-sm dark:bg-neutral-800\"\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-semibold\">{plan.tierName}</p>\n {plan.configName && (\n <p className=\"text-sm text-neutral-500\">{plan.configName}</p>\n )}\n </div>\n <span\n className={`text-sm font-medium ${statusColor[plan.status] ?? \"text-neutral-500\"}`}\n >\n {statusLabel[plan.status] ?? plan.status}\n </span>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-sm text-neutral-600 dark:text-neutral-400\">\n <div>\n <span className=\"font-medium\">Dzień rozliczenia:</span>{\" \"}\n {plan.billingDay}\n </div>\n <div>\n <span className=\"font-medium\">Data startu:</span>{\" \"}\n {formatDate(plan.startDate)}\n </div>\n {plan.endDate && (\n <div>\n <span className=\"font-medium\">Data zakończenia:</span>{\" \"}\n {formatDate(plan.endDate)}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </>\n );\n}\n\nexport default PanelPlansComponent;\n","import { useEffect, useState } from \"react\";\nimport {\n ReturnsConfirmation,\n ReturnsOrderDetail,\n ReturnsOrderList,\n ReturnsResult,\n} from \"../../components/returns/OrderSteps\";\nimport {\n ReturnsMyReturnDetail,\n ReturnsMyReturnsList,\n} from \"../../components/returns/MyReturns\";\nimport {\n ReturnsProvider,\n useReturnsContext,\n} from \"../../components/returns/ReturnsProvider\";\nimport { SkeletonRows } from \"../../components/returns/internal\";\nimport { isSessionExpiredError, mapReturnsError } from \"../../components/returns/errors\";\nimport { useReturnsText } from \"../../components/returns/texts.context\";\nimport type { SelectedReturnLine } from \"../../components/returns/state-machine\";\nimport type { ReturnsAppearance } from \"../../components/returns/appearance\";\nimport type { ReturnsTexts } from \"../../components/returns/texts\";\nimport { Button } from \"../../ui/button\";\nimport { clearPanelSession } from \"../session-storage\";\nimport type { PanelScreen, PanelSearchParamsType } from \"../types\";\n\ntype Props = {\n projectID: string;\n host?: string;\n accessToken: string;\n loginURL: string;\n appearance?: ReturnsAppearance;\n texts?: Partial<ReturnsTexts>;\n screen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: Partial<PanelSearchParamsType>) => void;\n setActiveScreen: (screen: PanelScreen) => void;\n};\n\ntype Draft = { items: SelectedReturnLine[]; note: string };\n\nfunction redirectToLogin(\n loginURL: string,\n dropToken: boolean,\n projectID: string,\n host?: string,\n) {\n if (typeof window === \"undefined\") return;\n if (dropToken) {\n clearPanelSession(projectID, host);\n }\n window.location.href = loginURL;\n}\n\nfunction ReturnsScreens({\n projectID,\n host,\n loginURL,\n screen,\n params,\n setParams,\n setActiveScreen,\n}: Pick<\n Props,\n \"projectID\" | \"host\" | \"loginURL\" | \"screen\" | \"params\" | \"setParams\" | \"setActiveScreen\"\n>) {\n const { status, exchangeError } = useReturnsContext(\"PanelReturns\");\n const text = useReturnsText();\n\n // The panel token is the login, so there is no email or code step. A failed\n // exchange or a dropped session means the panel session is no longer valid.\n const expired =\n status === \"anonymous\" &&\n (exchangeError == null || isSessionExpiredError(exchangeError));\n useEffect(() => {\n if (expired) {\n redirectToLogin(loginURL, exchangeError != null, projectID, host);\n }\n }, [expired, loginURL, exchangeError, projectID, host]);\n\n const [view, setView] = useState<\"orders\" | \"myReturns\" | \"confirmation\" | \"result\">(\n \"orders\",\n );\n const [draft, setDraft] = useState<Draft>({ items: [], note: \"\" });\n const [createdReturnId, setCreatedReturnId] = useState<string>();\n\n if (status === \"anonymous\" && !expired) {\n return (\n <div role=\"alert\" className=\"flex flex-col items-start gap-3\">\n <p className=\"text-sm\">{text(mapReturnsError(exchangeError))}</p>\n <Button type=\"button\" onClick={() => window.location.reload()}>\n {text(\"errorRetry\")}\n </Button>\n </div>\n );\n }\n\n if (status !== \"authenticated\") {\n return <SkeletonRows />;\n }\n\n const openReturns = (next: \"orders\" | \"myReturns\") => {\n setView(next);\n setParams({ state: \"returns\", orderId: undefined, returnId: undefined });\n setActiveScreen(\"returns\");\n };\n\n if (screen === \"return-details\" && params.returnId) {\n return (\n <ReturnsMyReturnDetail\n returnId={params.returnId}\n onBack={() => openReturns(\"myReturns\")}\n />\n );\n }\n\n if (view === \"myReturns\") {\n return (\n <ReturnsMyReturnsList\n onBack={() => openReturns(\"orders\")}\n onSelectReturn={(returnId) => {\n setParams({ state: \"return-details\", returnId, orderId: undefined });\n setActiveScreen(\"return-details\");\n }}\n />\n );\n }\n\n if (view === \"result\" && createdReturnId != null) {\n return (\n <ReturnsResult\n returnId={createdReturnId}\n onContinue={() => openReturns(\"orders\")}\n onOpenMyReturns={() => openReturns(\"myReturns\")}\n />\n );\n }\n\n if (params.orderId) {\n const orderId = params.orderId;\n\n if (view === \"confirmation\") {\n return (\n <ReturnsConfirmation\n orderId={orderId}\n items={draft.items}\n note={draft.note}\n onBack={() => setView(\"orders\")}\n onSubmitted={(returnId) => {\n setCreatedReturnId(returnId);\n setDraft({ items: [], note: \"\" });\n setView(\"result\");\n setParams({ orderId: undefined });\n }}\n />\n );\n }\n\n return (\n <ReturnsOrderDetail\n orderId={orderId}\n initialItems={draft.items.length > 0 ? draft.items : undefined}\n initialNote={draft.note}\n onBack={() => {\n setDraft({ items: [], note: \"\" });\n setParams({ orderId: undefined });\n }}\n onContinue={(selection) => {\n setDraft(selection);\n setView(\"confirmation\");\n }}\n />\n );\n }\n\n return (\n <ReturnsOrderList\n showLogout={false}\n onSelectOrder={(orderId) => {\n setDraft({ items: [], note: \"\" });\n setView(\"orders\");\n setParams({ orderId });\n }}\n onOpenMyReturns={() => openReturns(\"myReturns\")}\n />\n );\n}\n\n/**\n * Panel Returns screen: the exported returns step components under a\n * `ReturnsProvider` that exchanges the panel access token for a returns\n * session.\n */\nexport default function PanelReturns({\n accessToken,\n appearance,\n texts,\n ...rest\n}: Props) {\n return (\n <ReturnsProvider\n projectID={rest.projectID}\n host={rest.host}\n appearance={appearance}\n texts={texts}\n panelAccessToken={accessToken}\n >\n <ReturnsScreens {...rest} />\n </ReturnsProvider>\n );\n}\n","import { useState, type CSSProperties } from \"react\";\nimport {\n UserProductSchema,\n UserProductType,\n type UserProduct,\n} from \"../../gen/proto/public/v1/public_api_pb\";\nimport { rpcProvider, useQuery } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport LoadingIndicator from \"../LoadingIndicator\";\n\nimport { renderText } from \"@/src/lib/render.text\";\nimport { fromJsonString, toJsonString } from \"@bufbuild/protobuf\";\nimport type { PanelScreen, PanelSearchParamsType } from \"../types\";\nimport PanelProductDetails from \"./PanelProductDetails\";\nimport { clearPanelSession } from \"../session-storage\";\n\ninterface PanelProductGridComponentProps {\n projectID: string;\n accessToken: string;\n loginURL: string;\n styles: CSSProperties;\n activeScreen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: PanelSearchParamsType) => void;\n openCourse: (accessId: string) => void;\n}\n\nconst PanelProductGridComponent = ({\n accessToken,\n projectID,\n loginURL,\n styles,\n activeScreen,\n params,\n setParams,\n openCourse,\n}: PanelProductGridComponentProps) => {\n const { data: products, isLoading: isProductsLoading } = useQuery(\n rpcProvider.publicApi.userPanelGetProducts,\n {\n accessToken: accessToken,\n },\n );\n\n if (isProductsLoading) {\n return (\n <div className=\"flex items-center gap-2 bg-white p-2 dark:bg-black\">\n <p className=\"text-dark font-inter font-medium dark:text-white\">\n Ładowanie...\n </p>\n <LoadingIndicator />\n </div>\n );\n }\n\n if (products && products.result.case === \"failure\") {\n console.warn(\"error:\", `Kod błędu: ${products.result.value}`);\n clearPanelSession(projectID);\n window.location.href = loginURL;\n return null;\n }\n\n const productsList =\n products && products.result.case === \"success\"\n ? products.result.value.products\n : [];\n\n return (\n <ProductsComponent\n accessToken={accessToken}\n products={productsList}\n styles={styles}\n loginURL={loginURL}\n activeScreen={activeScreen}\n params={params}\n setParams={setParams}\n openCourse={openCourse}\n />\n );\n};\n\nexport default PanelProductGridComponent;\n\ninterface ProductsComponentProps {\n accessToken: string;\n products: UserProduct[];\n styles: CSSProperties;\n loginURL: string;\n activeScreen: PanelScreen;\n params: PanelSearchParamsType;\n setParams: (params: PanelSearchParamsType) => void;\n openCourse: (accessId: string) => void;\n}\n\nconst ProductsComponent = ({\n accessToken,\n products,\n styles,\n loginURL,\n activeScreen,\n params,\n setParams,\n openCourse,\n}: ProductsComponentProps) => {\n if (products.length === 0) {\n window.location.href = loginURL;\n return null;\n }\n\n const [selectedProduct, setSelectedProduct] = useState<\n UserProduct | undefined\n >(\n params.product\n ? fromJsonString(UserProductSchema, params.product)\n : undefined,\n );\n\n const reveal = (product?: UserProduct) => {\n if (product == null) {\n setSelectedProduct(undefined);\n setParams({\n product: undefined,\n state: \"products\",\n });\n } else {\n setParams({\n product: toJsonString(UserProductSchema, product),\n state: \"products\",\n });\n }\n };\n\n function getProductTypeName(type: UserProductType) {\n switch (type) {\n case UserProductType.AUDIO:\n return \"Audio\";\n case UserProductType.FILE:\n return \"Plik\";\n case UserProductType.TICKET:\n return \"Bilet\";\n case UserProductType.COURSE:\n return \"Kurs\";\n default:\n return undefined;\n }\n }\n\n function handleSelectedProduct(product: UserProduct) {\n // A course opens in its own screen, not in the product details.\n if (product.productType === UserProductType.COURSE) {\n openCourse(product.accessId);\n return;\n }\n setSelectedProduct(product);\n reveal(product);\n }\n\n if (activeScreen === \"products\" && selectedProduct != undefined) {\n return (\n <PanelProductDetails\n accessToken={accessToken}\n product={selectedProduct}\n styles={styles}\n reveal={reveal}\n onOpenCourse={openCourse}\n />\n );\n }\n\n return (\n <>\n <h3 className=\"text-2xl\">Hej 👋</h3>\n <p className=\"text-sm text-neutral-500\">\n Poniżej znajdziesz swoje produkty\n </p>\n <div className=\"mt-6 flex flex-wrap items-center justify-center gap-9 sm:justify-start\">\n {products?.map((product, index) => (\n <section\n onClick={() => handleSelectedProduct(product)}\n key={index}\n className=\"w-full max-w-xs cursor-pointer rounded drop-shadow-xl dark:border dark:border-slate-600 dark:drop-shadow-none\"\n >\n <section className=\"flex flex-col items-center space-y-2 rounded bg-slate-100 p-4 dark:bg-neutral-900\">\n {product.productType && (\n <div className=\"w-fit self-end rounded bg-red-900 px-4 py-1\">\n <span className=\"text-sm font-medium text-white dark:text-slate-100\">\n {getProductTypeName(product.productType)}\n </span>\n </div>\n )}\n <div className=\"jusitfy-center flex max-h-40 items-center\">\n <img\n src={product.productImageUrl}\n alt={`Product ${index} Photo`}\n draggable={false}\n className=\"aspect-auto max-h-40\"\n />\n </div>\n </section>\n <div className=\"space-y-4 rounded bg-white p-4 dark:bg-black\">\n <h2 className=\"text-xl font-semibold\">{product.productName}</h2>\n <p\n title={product.productDescription}\n className=\"line-clamp-3 text-sm font-normal text-neutral-600 dark:text-neutral-300\"\n >\n {renderText(product.productDescription)}\n </p>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n handleSelectedProduct(product);\n }}\n className=\"w-full text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n Zobacz\n </Button>\n </div>\n </section>\n ))}\n </div>\n </>\n );\n};\n","const URL_REGEX =\n /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)/g;\n\ntype Replacements = {\n url: string;\n startIndex: number;\n endIndex: number;\n replacementText?: string;\n};\n\nconst findURLIndices = (text: string) => {\n const matches = [...text.matchAll(URL_REGEX)];\n return matches.map(\n (match) =>\n ({\n url: match[0],\n startIndex: match.index,\n endIndex: match.index + match[0].length - 1,\n }) as Replacements,\n );\n};\n\nconst replaceTextByIndices = (\n originalText: string,\n replacements: Replacements[],\n) => {\n let result = \"\";\n let lastIndex = 0;\n\n // Sort replacements by startIndex to handle them in order\n replacements.sort((a, b) => a.startIndex - b.startIndex);\n\n for (const { startIndex, endIndex, replacementText } of replacements) {\n // Append text before the current replacement\n result += originalText.slice(lastIndex, startIndex);\n // Append the replacement text\n result += replacementText;\n // Update lastIndex to after the replaced segment\n lastIndex = endIndex + 1;\n }\n\n // Append any remaining text after the last replacement\n result += originalText.slice(lastIndex);\n\n return result;\n};\n\nexport const renderText = (txt: string) => {\n const urlIndices = findURLIndices(txt);\n\n return (\n <p\n dangerouslySetInnerHTML={{\n __html: replaceTextByIndices(\n txt,\n urlIndices.map((el) => {\n el[\"replacementText\"] =\n `<a key=${el.url} href=${el.url} style=\"text-decoration: underline;\" target=\"_blank\">\n ${el.url}\n </a>`;\n return el;\n }),\n ),\n }}\n ></p>\n );\n};\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { ChevronLeft, Download } from \"lucide-react\";\nimport { useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport {\n UserProductType,\n type UserPanelGetAudiobookDetailsDownloadURLsResponse_AudiobookDownloadDetails,\n type UserProduct,\n} from \"../../gen/proto/public/v1/public_api_pb\";\nimport { useInstrumentContext } from \"../../analytics/instrument\";\nimport { cn } from \"../../lib/utils\";\nimport { rpcProvider, useMutation } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport AudioPlayer, {\n type AudioPlayerMethods,\n} from \"../audio-player/AudioPlayer\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport { getPanelTexts } from \"../texts\";\n\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface PanelProductDetailsProps {\n accessToken: string;\n product: UserProduct;\n styles: CSSProperties;\n reveal: (product?: UserProduct) => void;\n /** Opens the course screen of a course product. */\n onOpenCourse: (accessId: string) => void;\n}\n\nfunction warn(message: string, ...args: unknown[]) {\n console.warn(message, ...args);\n}\n\nfunction error(message: string) {\n console.error(message);\n}\n\nconst PanelProductDetails = ({\n accessToken,\n product,\n styles,\n reveal,\n onOpenCourse,\n}: PanelProductDetailsProps) => {\n const productType: UserProductType = product.productType;\n const instrument = useInstrumentContext();\n const trackDownload = () =>\n instrument.track(\n \"panel_download\",\n {},\n { product_id: product.productId.length <= 64 ? product.productId : null },\n );\n\n const audioPlayerRef = useRef<AudioPlayerMethods>(null!);\n const [filesRefAnimation] = useAutoAnimate();\n const [filesResponse, setFilesResponse] = useState<string[] | null>(null);\n const { mutateAsync: fileDetailsAsync, isPending: isFileLoading } =\n useMutation(rpcProvider.publicApi.userPanelGetFileDetails);\n\n const audioPlayerSeekToHandler = useRef<\n ((second: number) => void) | undefined\n >(undefined);\n const [audioResponse, setAudioResponse] = useState<Record<\n string,\n unknown\n > | null>(null);\n const [audioDownloadURLs, setAudioDownloadURLs] = useState<\n | UserPanelGetAudiobookDetailsDownloadURLsResponse_AudiobookDownloadDetails[]\n | null\n >(null);\n const [\n isAvailableToDownloadInMobileApp,\n setIsAvailableToDownloadInMobileApp,\n ] = useState(false);\n const { mutateAsync: audioDetailsAsync, isPending: isAudioLoading } =\n useMutation(rpcProvider.publicApi.userPanelGetAudiobookDetails);\n const {\n mutateAsync: audioDetailsDownloadURLsAsync,\n isPending: isAudioDownloadURLsLoading,\n } = useMutation(\n rpcProvider.publicApi.userPanelGetAudiobookDetailsDownloadURLs,\n );\n\n type ChapterWithPublicUrl = {\n id: string;\n multimediaId?: string;\n name: string;\n description?: string;\n publicUrl: string;\n downloadableUrl?: string;\n duration?: number;\n };\n\n const [selectedChapter, setSelectedChapter] =\n useState<ChapterWithPublicUrl | null>(null);\n const [chapters, setChapters] = useState<ChapterWithPublicUrl[] | null>(null);\n\n async function handleFileDownload() {\n try {\n const filesResult = await fileDetailsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n });\n\n if (filesResult.result.case === \"success\") {\n setFilesResponse(filesResult.result.value.files);\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", filesResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n async function handleAudioDownload() {\n try {\n const audioResult = await audioDetailsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n });\n\n if (audioResult.result.case === \"audiobook\") {\n setAudioResponse(\n audioResult.result.value as unknown as Record<string, unknown>,\n );\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", audioResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n async function handleAudioURLsDownload() {\n try {\n const audioURLsResult = await audioDetailsDownloadURLsAsync({\n accessId: product.accessId,\n accessToken: accessToken as string,\n isBrowser: true,\n });\n\n if (audioURLsResult.result.case === \"success\") {\n setAudioDownloadURLs(\n audioURLsResult.result.value.audiobookDownloadDetails,\n );\n setIsAvailableToDownloadInMobileApp(\n audioURLsResult.result.value.isAvailableToDownloadInMobileApp ===\n true,\n );\n return;\n } else {\n warn(\"Pobranie plików nie powiodło się. Zalecamy kontakt.\");\n warn(\"Kod błędu: \", audioURLsResult.result.value);\n }\n } catch (err) {\n warn(\"Nieoczekiwany błąd. Spróbuj ponownie za chwilę.\");\n error(\"Błąd podczas pobierania danych:\" + err);\n }\n }\n\n useEffect(() => {\n if (productType === UserProductType.AUDIO) {\n handleAudioDownload().then().catch();\n handleAudioURLsDownload().then().catch();\n }\n }, []);\n\n useEffect(() => {\n if (audioResponse != null && audioDownloadURLs != null) {\n const audioChapters = (\n audioResponse as { chapters?: ChapterWithPublicUrl[] }\n ).chapters;\n if (!audioChapters) return;\n\n const mappedChapters = audioChapters\n .map((chapter) => {\n const details = audioDownloadURLs?.find(\n (el) => el.chapterId === chapter.id,\n );\n if (details == null) {\n return undefined;\n }\n return {\n ...chapter,\n publicUrl: details.publicUrl,\n downloadableUrl: details.downloadableUrl,\n duration: details.duration,\n } as ChapterWithPublicUrl;\n })\n .filter((el) => el != null);\n\n if (mappedChapters != undefined && mappedChapters.length > 0) {\n setChapters(mappedChapters);\n }\n }\n }, [audioResponse, audioDownloadURLs]);\n\n return (\n <div>\n <div className=\"mb-3 space-y-4 rounded bg-white p-4 dark:bg-black\">\n <Button onClick={() => reveal()} variant=\"ghost\" className=\"w-fit\">\n <ChevronLeft className=\"h-6 w-6\" />\n <span className=\"font-inter text-sm font-medium\">Wróć</span>\n </Button>\n </div>\n\n <main className=\"grid grid-cols-1 justify-center gap-6 sm:justify-start lg:grid-cols-2\">\n <div className=\"flex w-full max-w-xl flex-col gap-6\">\n {productType === UserProductType.FILE && (\n <div\n ref={filesRefAnimation}\n className=\"flex flex-col space-y-4 rounded bg-white p-6 drop-shadow-xl dark:border dark:border-neutral-700 dark:bg-neutral-800 dark:drop-shadow-none\"\n >\n <div className=\"flex items-center justify-between gap-x-4\">\n <h4 className=\"text-xl font-semibold\">Twoje pliki</h4>\n {(filesResponse == null || filesResponse.length == 0) && (\n <Button\n onClick={handleFileDownload}\n aria-label=\"Download Product\"\n className=\"text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n {isFileLoading ? <LoadingIndicator /> : \"Wyświetl\"}\n </Button>\n )}\n </div>\n\n {isFileLoading && (\n <div className=\"flex flex-col items-start gap-2\">\n <ProgressBar />\n <p className=\"font-bold transition hover:text-blue-600\">\n Trwa przygotowanie plików...\n </p>\n </div>\n )}\n\n {filesResponse != null && filesResponse.length > 0 && (\n <div className=\"flex flex-col items-start justify-start gap-2\">\n {filesResponse.map((el, index) => (\n <a\n key={index}\n target=\"_blank\"\n className=\"flex w-fit items-center gap-2 rounded-md bg-neutral-800 px-3 py-2 text-neutral-200 dark:bg-neutral-200 dark:text-neutral-800\"\n href={el}\n download\n onClick={trackDownload}\n >\n {`Plik numer ${index + 1}`}\n <Download width={14} height={14} />\n </a>\n ))}\n </div>\n )}\n </div>\n )}\n\n {productType === UserProductType.COURSE && (\n <div className=\"flex flex-col items-center justify-center rounded-xl bg-white p-6 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <Button\n onClick={() => onOpenCourse(product.accessId)}\n className=\"text-sm font-medium transition-opacity duration-300 ease-in-out hover:opacity-80 active:opacity-80\"\n style={styles}\n >\n {getPanelTexts().openCourse}\n </Button>\n </div>\n )}\n\n {productType === UserProductType.AUDIO && (\n <>\n <div className=\"flex flex-col space-y-6 rounded-xl bg-white p-3 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <h4 className=\"text-xl font-semibold\">\n {selectedChapter?.name ?? \"Odtwarzacz\"}\n </h4>\n {selectedChapter?.description && (\n <p className=\"text-sm\">{selectedChapter?.description}</p>\n )}\n <>\n {isAudioLoading ? (\n <div className=\"flex gap-2\">\n <LoadingIndicator />\n <p className=\"text-xl font-semibold\">\n Trwa pobierania audiobooka...\n </p>\n </div>\n ) : (\n <>\n {chapters != null ? (\n <>\n <AudioPlayer\n ref={audioPlayerRef}\n chapters={chapters}\n title={\n (audioResponse as { name?: string })?.name ??\n product.productName ??\n undefined\n }\n imageURL={\n (audioResponse as { coverImage?: string })\n ?.coverImage ??\n product.productImageUrl ??\n undefined\n }\n styles={styles}\n setCurrentTimeHandler={(handler) => {\n audioPlayerSeekToHandler.current = handler;\n }}\n uniqueProductID={product.productId}\n onChapterChange={(chapter) => {\n setSelectedChapter(chapter);\n }}\n />\n </>\n ) : (\n <p className=\"mt-2\">\n Wybierz rozdział, który cię interesuje.\n </p>\n )}\n </>\n )}\n </>\n <div className=\"rounded-xl bg-neutral-100 p-3 dark:bg-neutral-800\">\n <p className=\"mt-3 mb-3 text-xs\">\n {isAvailableToDownloadInMobileApp\n ? \"Możesz słuchać tego audiobooka w aplikacji również bez dostępu do internetu.\"\n : \"Możesz słuchać tego audiobooka w aplikacji.\"}\n </p>\n <div className=\"flex gap-3\">\n <a href=\"https://apps.apple.com/us/app/bitsnap/id6741902807\">\n <img\n width=\"100\"\n src=\"https://bitsnap.pl/appstore.svg\"\n alt=\"Pobierz aplikacje z AppStore\"\n />\n </a>\n\n <a href=\"https://docs.bitsnap.pl/guides/audiobook\">\n <img\n width=\"100\"\n src=\"https://bitsnap.pl/playstore.svg\"\n alt=\"Pobierz aplikację z GooglePlay\"\n />\n </a>\n </div>\n </div>\n </div>\n </>\n )}\n\n <div className=\"flex items-center justify-center rounded-xl bg-white p-3 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n {productType === UserProductType.AUDIO && (\n <div className=\"max-h-96 w-full overflow-y-auto\">\n {isAudioLoading ? (\n <div className=\"jusitfy-center flex flex-col items-center gap-2\">\n <LoadingIndicator />\n <p>Ładowanie rozdziałów...</p>\n </div>\n ) : (\n <div>\n <h2 className=\"mb-3 text-xl font-semibold\">Rozdziały</h2>\n {chapters == null ? (\n <p>Brak rozdziałów do wyświetlenia.</p>\n ) : (\n <ul className=\"flex w-full flex-col gap-2\">\n {chapters.map((chapter, index) => (\n <li\n key={index}\n className=\"flex items-center justify-between\"\n >\n <button\n className={cn(\n \"w-full rounded-lg p-2 text-left transition hover:bg-neutral-200 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-700\",\n selectedChapter?.id == chapter.id\n ? \"bg-neutral-200 dark:bg-neutral-700\"\n : \"bg-neutral-100 dark:bg-neutral-800 dark:text-neutral-300\",\n )}\n onClick={() => {\n audioPlayerRef.current.selectChapter(chapter);\n }}\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">\n {chapter.name}\n </p>\n {chapter.duration && (\n <span className=\"text-xs text-neutral-500\">\n {Math.floor(chapter.duration / 60)}:\n {String(\n Math.floor(chapter.duration % 60),\n ).padStart(2, \"0\")}\n </span>\n )}\n </div>\n {chapter.description && (\n <p className=\"mt-3 text-xs\">\n {chapter.description}\n </p>\n )}\n </button>\n\n {audioResponse &&\n (audioResponse as { isDownloadable?: boolean })\n .isDownloadable &&\n chapter.downloadableUrl && (\n <a\n href={chapter.downloadableUrl}\n onClick={trackDownload}\n >\n <Download width={14} height={14} />\n </a>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"w-full max-w-3xl space-y-6 rounded-xl bg-white p-6 drop-shadow-xl dark:bg-neutral-900 dark:drop-shadow-none\">\n <h2 className=\"text-3xl font-semibold\">{product.productName}</h2>\n <p className=\"text-sm font-normal text-neutral-600 dark:text-neutral-300\">\n {product.productDescription}\n </p>\n\n <img\n src={product.productImageUrl}\n alt=\"Product Photo\"\n width={384}\n height={384}\n className=\"max-h-sm max-w-sm\"\n draggable={false}\n />\n </div>\n </main>\n </div>\n );\n};\n\nexport default PanelProductDetails;\n","import Hls from \"hls.js\";\nimport { Pause, Play } from \"lucide-react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { Button } from \"../../ui/button\";\nimport LoadingIndicator from \"../LoadingIndicator\";\nimport {\n mediaSessionPause,\n mediaSessionPlay,\n mediaSessionUpdateDurationAndPosition,\n startMediaSessionCoordinator,\n stopMediaSessionCoordinator,\n} from \"./media.session.coordinator\";\n\nimport \"./audio-player.css\";\n\ntype ChapterWithPublicUrl = {\n id: string;\n multimediaId?: string;\n name: string;\n description?: string;\n publicUrl: string;\n downloadableUrl?: string;\n duration?: number;\n};\n\nexport type AudioPlayerMethods = {\n selectChapter: (chapter: ChapterWithPublicUrl) => void;\n};\n\ntype AudioPlayerProps = {\n chapters: ChapterWithPublicUrl[];\n styles: CSSProperties;\n updateCurrentTime?: (currentTime: number) => void;\n\n title?: string;\n imageURL?: string;\n\n setCurrentTimeHandler?: (seekTo: (second: number) => void) => void;\n uniqueProductID: string;\n\n onChapterChange?: (chapter: ChapterWithPublicUrl) => void;\n};\n\nconst AudioPlayer = forwardRef<AudioPlayerMethods, AudioPlayerProps>(\n (\n {\n chapters,\n styles,\n updateCurrentTime,\n setCurrentTimeHandler,\n title,\n imageURL,\n uniqueProductID,\n onChapterChange,\n },\n ref,\n ) => {\n enum PlayState {\n Playing,\n Paused,\n }\n\n const [playState, setPlayState] = useState<PlayState>(PlayState.Paused);\n\n useEffect(() => {\n switch (playState) {\n case PlayState.Playing:\n mediaSessionPlay();\n break;\n case PlayState.Paused:\n mediaSessionPause();\n break;\n }\n }, [playState]);\n\n useImperativeHandle(ref, () => {\n return {\n selectChapter: (chapter: ChapterWithPublicUrl) => {\n playChapter(chapter);\n },\n };\n });\n\n const [currentTime, setCurrentTime] = useState<number | undefined>(\n undefined,\n );\n const [duration, setDuration] = useState<number | undefined>(undefined);\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const hlsRef = useRef<Hls | undefined>(undefined);\n const timerRef = useRef<number | undefined>(undefined);\n\n const audioPlayerContainerRef = useRef<HTMLDivElement>(null!);\n\n const currentChapterRef = useRef<ChapterWithPublicUrl | null>(null);\n\n const [playWhenReady, setPlayWhenReady] = useState(true);\n const [isStarted, setIsStarted] = useState(false);\n const [isLoading, setIsLoading] = useState(!isSafari());\n\n function saveLastPlayedTime(timeInSeconds: number) {\n if (timeInSeconds < 10) {\n return;\n }\n localStorage.setItem(\n `__player__${uniqueProductID}_${currentChapterRef.current?.id}`,\n `${timeInSeconds}`,\n );\n }\n\n function getLastPlayedTime(): number | undefined {\n const time = localStorage.getItem(\n `__player__${uniqueProductID}_${currentChapterRef.current?.id}`,\n );\n\n if (time == null) {\n return undefined;\n }\n try {\n const result = parseInt(time);\n\n if (isNaN(result) || result < 0) {\n return undefined;\n }\n\n return result;\n } catch (e) {\n return undefined;\n }\n }\n\n function getLastSelectedChapterID(): string | undefined {\n const lastSelectedChapterID = localStorage.getItem(\n `__player__${uniqueProductID}_last_chapter`,\n );\n if (lastSelectedChapterID == null) {\n return undefined;\n }\n return lastSelectedChapterID;\n }\n\n function setLastSelectedChapterID(chapterID: string) {\n localStorage.setItem(\n `__player__${uniqueProductID}_last_chapter`,\n chapterID,\n );\n }\n\n function deleteMemoryChapter(chapterID: string) {\n localStorage.removeItem(`__player__${uniqueProductID}_${chapterID}`);\n }\n\n function setupObservers() {\n if (videoRef.current == null) {\n return;\n }\n videoRef.current.onloadeddata = () => {\n if (videoRef.current == null) {\n return;\n }\n if (videoRef.current.readyState < 2) {\n setIsLoading(true);\n }\n if (videoRef.current.readyState >= 2) {\n setIsLoading(false);\n }\n\n if (!isStarted) {\n const lastPlayedTime = getLastPlayedTime();\n if (lastPlayedTime != undefined) {\n seekTo(lastPlayedTime);\n }\n setIsStarted(true);\n }\n if (playWhenReady) {\n setPlayWhenReady(false);\n try {\n play();\n } catch (e) {\n console.log(\"play error\", e);\n }\n }\n };\n videoRef.current.onplay = () => {};\n\n videoRef.current.onseeked = () => {};\n videoRef.current.onseeking = () => {};\n\n videoRef.current.onpause = () => {};\n\n videoRef.current.onended = () => {\n playNextChapter();\n };\n\n startMediaSessionCoordinator({\n title: title ?? \"\",\n artwork: imageURL,\n action: (details) => {\n switch (details.action) {\n case \"play\":\n play();\n break;\n case \"pause\":\n pause();\n break;\n case \"seekbackward\":\n seekBy(-15);\n break;\n case \"seekforward\":\n seekBy(15);\n break;\n case \"seekto\":\n if (details.seekTime) {\n seekTo(details.seekTime);\n }\n break;\n case \"stop\":\n pause();\n break;\n default:\n break;\n }\n },\n });\n\n startTimer();\n }\n\n function playNextChapter() {\n if (chapters == null || chapters.length == 0) {\n return;\n }\n const currentChapterIndex = chapters.findIndex(\n (chapter) => chapter.id == currentChapterRef.current?.id,\n );\n if (currentChapterIndex == -1) {\n return;\n }\n deleteMemoryChapter(chapters[currentChapterIndex].id);\n const nextChapterIndex = currentChapterIndex + 1;\n if (nextChapterIndex >= chapters.length) {\n return;\n }\n playChapter(chapters[currentChapterIndex + 1]);\n }\n\n function startTimer() {\n updatePlayerDetails();\n if (timerRef.current != null) return;\n\n timerRef.current = setTimeout(() => {\n updatePlayerDetails();\n timerRef.current = undefined;\n startTimer();\n }, 500) as unknown as number;\n }\n\n function stopTimer() {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current as unknown as number);\n }\n\n function updatePlayerDetails() {\n if (videoRef.current == null) {\n return;\n }\n setPlayState(\n videoRef.current.paused ? PlayState.Paused : PlayState.Playing,\n );\n setDuration(videoRef.current.duration);\n setCurrentTime(videoRef.current.currentTime);\n saveLastPlayedTime(videoRef.current.currentTime);\n mediaSessionUpdateDurationAndPosition(\n videoRef.current.duration,\n videoRef.current.currentTime,\n );\n if (\n videoRef.current.networkState === videoRef.current.NETWORK_LOADING &&\n videoRef.current.readyState <= videoRef.current.HAVE_FUTURE_DATA\n ) {\n setIsLoading(true);\n } else {\n setIsLoading(false);\n }\n if (updateCurrentTime) {\n updateCurrentTime(videoRef.current.currentTime);\n }\n }\n\n function play() {\n videoRef.current?.play().then().catch();\n updatePlayerDetails();\n }\n\n function pause() {\n videoRef.current?.pause();\n updatePlayerDetails();\n }\n\n function togglePlayState() {\n if (playState === PlayState.Playing) {\n pause();\n return;\n }\n play();\n }\n\n function seekBy(seconds: number) {\n if (videoRef.current == null) {\n return;\n }\n const newTime = videoRef.current.currentTime + seconds;\n if (newTime < 0) {\n videoRef.current.currentTime = 0;\n return;\n }\n if (newTime > videoRef.current.duration) {\n videoRef.current.currentTime = videoRef.current.duration;\n return;\n }\n videoRef.current.currentTime += seconds;\n }\n\n function seekTo(toSecond: number) {\n if (videoRef.current == null) {\n return;\n }\n setCurrentTime(toSecond);\n if (toSecond < 0) {\n videoRef.current.currentTime = 0;\n return;\n }\n if (toSecond > videoRef.current.duration) {\n videoRef.current.currentTime = videoRef.current.duration;\n return;\n }\n videoRef.current.currentTime = toSecond;\n }\n\n function destroyPlayer() {\n if (videoRef.current == null) {\n return;\n }\n videoRef.current.onplay = null;\n videoRef.current.onseeked = null;\n videoRef.current.onseeking = null;\n videoRef.current.onpause = null;\n videoRef.current.onended = null;\n videoRef.current.src = \"\";\n hlsRef.current?.destroy();\n }\n\n function loadChapters(chapters: ChapterWithPublicUrl[]) {\n if (chapters.length == 0) {\n return;\n }\n\n const chapterID = getLastSelectedChapterID();\n if (chapterID == null) {\n playChapter(chapters[0]);\n return;\n }\n\n const chapter = chapters.find((chapter) => chapter.id == chapterID);\n if (chapter == null) {\n playChapter(chapters[0]);\n return;\n }\n\n playChapter(chapter);\n }\n\n function playChapter(chapter: ChapterWithPublicUrl) {\n setIsStarted(false);\n setPlayWhenReady(true);\n currentChapterRef.current = chapter;\n playURL(chapter.publicUrl);\n onChapterChange?.(chapter);\n setLastSelectedChapterID(chapter.id);\n }\n\n function playURL(src: string) {\n if (videoRef.current == null) {\n return;\n }\n if (videoRef.current.canPlayType(\"application/vnd.apple.mpegurl\")) {\n videoRef.current.src = src;\n } else if (Hls.isSupported()) {\n if (hlsRef.current == null) {\n hlsRef.current = new Hls();\n hlsRef.current?.attachMedia(videoRef.current);\n }\n hlsRef.current?.loadSource(src);\n }\n }\n\n useEffect(() => {\n if (videoRef.current == null) {\n return;\n }\n setupObservers();\n loadChapters(chapters);\n }, [videoRef.current]);\n\n useEffect(() => {\n loadChapters(chapters);\n }, [chapters]);\n\n useEffect(() => {\n if (setCurrentTimeHandler != null) {\n setCurrentTimeHandler(seekTo);\n }\n\n return () => {\n setCurrentTime(undefined);\n videoRef.current?.pause();\n destroyPlayer();\n stopMediaSessionCoordinator();\n };\n }, []);\n\n const calculateTime = (secs: number) => {\n const hours = Math.floor(secs / 3600);\n const minutes = Math.floor(secs / 60) % 60;\n const seconds = Math.floor(secs % 60);\n const returnedHours =\n hours > 0 ? (hours < 10 ? `0${hours}:` : `${hours}:`) : \"\";\n const returnedSeconds = seconds < 10 ? `0${seconds}` : `${seconds}`;\n if (isNaN(seconds) || isNaN(minutes) || isNaN(hours)) {\n return \"\";\n }\n return `${returnedHours}${minutes}:${returnedSeconds}`;\n };\n\n const showRangeProgress = (rangeInput: HTMLInputElement) => {\n const barProgress =\n (parseFloat(rangeInput.value) / parseFloat(rangeInput.max)) * 100;\n audioPlayerContainerRef.current.style.setProperty(\n \"--seek-before-width\",\n barProgress + \"%\",\n );\n\n const selectedTime = (duration! * barProgress) / 100;\n seekTo(selectedTime);\n };\n\n return (\n <div\n id=\"audio-player-container\"\n className=\"flex flex-col\"\n style={styles}\n ref={audioPlayerContainerRef}\n >\n <video\n ref={videoRef}\n className=\"hidden\"\n poster={imageURL}\n title={title}\n ></video>\n\n <input\n type=\"range\"\n min=\"0\"\n max={duration != undefined ? Math.floor(duration).toString() : 100}\n value={currentTime ?? 0}\n onChange={(e) => showRangeProgress(e.target as HTMLInputElement)}\n className=\"w-full\"\n />\n\n <section className=\"flex w-full items-center justify-between text-sm font-medium\">\n <span id=\"current-time\">{calculateTime(currentTime!)}</span>\n <span id=\"duration\">{calculateTime(duration!)}</span>\n </section>\n <div className=\"mt-6 flex items-center justify-center gap-x-12\">\n <Button\n variant=\"outline\"\n onClick={() => seekBy(-10)}\n aria-label=\"Rewind 10 Seconds\"\n >\n -10\n </Button>\n <Button\n variant=\"outline\"\n onClick={togglePlayState}\n aria-label=\"Play Or Pause\"\n >\n {playState === PlayState.Paused && <Play className=\"h-5 w-5\" />}\n {playState === PlayState.Playing && <Pause className=\"h-5 w-5\" />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => seekBy(10)}\n aria-label=\"Fast Forward 10 Seconds\"\n >\n +10\n </Button>\n </div>\n {isLoading && (\n <div className=\"mt-2 flex w-full justify-center\">\n <LoadingIndicator />\n </div>\n )}\n </div>\n );\n },\n);\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf(\"safari/\") > -1;\n}\n\nexport default AudioPlayer;\n","export function mediaSessionPlay() {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.playbackState = \"playing\";\n}\n\nexport function mediaSessionPause() {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.playbackState = \"paused\";\n}\n\nexport function mediaSessionUpdateDurationAndPosition(\n duration: number | undefined,\n currentTime: number | undefined,\n) {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n if (duration != null && isNaN(duration)) {\n return;\n }\n if (currentTime != null && isNaN(currentTime)) {\n return;\n }\n navigator.mediaSession.setPositionState({\n playbackRate: 1,\n duration: duration,\n position: currentTime,\n });\n}\n\nexport function startMediaSessionCoordinator(args: {\n title: string;\n artwork?: string;\n\n action: (details: MediaSessionActionDetails) => void;\n}) {\n if (\n typeof navigator == \"undefined\" ||\n typeof navigator.mediaSession == \"undefined\"\n )\n return;\n navigator.mediaSession.metadata = new MediaMetadata({\n title: args.title,\n artwork: args.artwork\n ? [\n {\n type: \"image/png\",\n src: args.artwork,\n },\n ]\n : undefined,\n });\n\n navigator.mediaSession.setActionHandler(\"play\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"pause\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"stop\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekbackward\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekforward\", (e) => {\n args.action(e);\n });\n navigator.mediaSession.setActionHandler(\"seekto\", (e) => {\n args.action(e);\n });\n}\n\nexport function stopMediaSessionCoordinator() {\n navigator.mediaSession.metadata = null;\n}\n","import { getLocale } from \"../components/checkout/locale\";\nimport { pickLocaleTable, type LocaleTables } from \"../lib/texts\";\n\n/** Panel strings that are not part of the returns views. */\nexport type PanelTexts = {\n returnsNavLabel: string;\n openCourse: string;\n};\n\nconst PANEL_TEXT_TABLES: LocaleTables<keyof PanelTexts> = {\n pl: { returnsNavLabel: \"Zwroty\", openCourse: \"Otwórz kurs\" },\n en: { returnsNavLabel: \"Returns\", openCourse: \"Open the course\" },\n};\n\n/** Panel strings for the library locale (`setLocale`), Polish by default. */\nexport function getPanelTexts(locale: string = getLocale()): PanelTexts {\n return pickLocaleTable(PANEL_TEXT_TABLES, locale);\n}\n","export function ProgressBar() {\n const [progress, setProgress] = React.useState(13);\n\n React.useEffect(() => {\n const timer = setTimeout(() => setProgress(66), 500);\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <div className=\"w-[60%] h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div \n className=\"h-full bg-blue-600 transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n );\n}\n\nimport * as React from \"react\";\n","import { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { LogOut, Undo2 } from \"lucide-react\";\nimport { useState, type CSSProperties, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../ui/button\";\nimport type { GetThemeOutput } from \"../types\";\n\nimport type { PanelScreen } from \"../types\";\nimport { getPanelTexts } from \"../texts\";\n\ninterface PanelProductHeaderComponentProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n styles: CSSProperties;\n theme?: GetThemeOutput;\n logout: () => void;\n}\n\nfunction PanelProductHeaderComponent({\n activeScreen,\n setActiveScreen,\n setParams,\n styles: _styles,\n theme,\n logout,\n}: PanelProductHeaderComponentProps) {\n return (\n <header className=\"md:border-r-neutral-150 md:bg-beige-50 fixed right-0 bottom-0 left-0 z-10 flex h-12 w-full items-center bg-neutral-800 md:static md:z-0 md:min-h-screen md:w-auto md:border-r dark:md:border-r-neutral-900\">\n <MobileMenu\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <SidebarMenu\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n theme={theme}\n logout={logout}\n />\n </header>\n );\n}\n\nexport default PanelProductHeaderComponent;\n\ninterface MobileMenuProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n}\n\nfunction MobileMenu({\n activeScreen,\n setActiveScreen,\n setParams,\n}: MobileMenuProps) {\n const { returnsNavLabel } = getPanelTexts();\n\n return (\n <nav className=\"flex w-full items-center justify-evenly gap-4 md:hidden\">\n <MobileButton\n panelScreen=\"products\"\n label=\"Produkty\"\n imageURL=\"/icons/bitsnap-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"orders\"\n label=\"Faktury\"\n imageURL=\"/icons/category-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"returns\"\n label={returnsNavLabel}\n icon={<Undo2 className=\"h-5 w-5 text-white\" aria-hidden />}\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n\n <MobileButton\n panelScreen=\"profile\"\n label=\"Profil\"\n imageURL=\"/icons/profile-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n />\n </nav>\n );\n}\n\ninterface MobileButtonProps {\n panelScreen: PanelScreen;\n label: string;\n imageURL?: string;\n icon?: ReactNode;\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n}\n\nfunction MobileButton({\n panelScreen,\n label,\n imageURL,\n icon,\n activeScreen,\n setActiveScreen,\n setParams,\n}: MobileButtonProps) {\n return (\n <Button\n onClick={() => {\n setActiveScreen(panelScreen);\n setParams({\n product: undefined,\n state: panelScreen,\n });\n }}\n aria-label={label}\n variant={null}\n className={cn(\n \"flex flex-col gap-0\",\n activeScreen === panelScreen ? \"opacity-100\" : \"opacity-50\",\n )}\n >\n {icon ?? <img src={imageURL} alt={label} className=\"scale-75\" />}\n <span className=\"text-xs font-normal text-white\">{label}</span>\n </Button>\n );\n}\n\ninterface SidebarButtonProps {\n panelScreen: PanelScreen;\n label: string;\n imageURL?: string;\n darkImageURL?: string;\n icon?: ReactNode;\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n isExpanded: boolean;\n}\n\nfunction SidebarButton({\n panelScreen,\n label,\n imageURL,\n darkImageURL,\n icon,\n activeScreen,\n setActiveScreen,\n setParams,\n isExpanded,\n}: SidebarButtonProps) {\n return (\n <Button\n onClick={() => {\n setActiveScreen(panelScreen);\n setParams({\n product: undefined,\n state: panelScreen,\n });\n }}\n variant={activeScreen === panelScreen ? \"secondary\" : \"ghost\"}\n className=\"justify-start\"\n >\n {icon != null ? (\n <span\n className={cn(\n \"inline-flex h-5 w-5 items-center justify-center\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n >\n {icon}\n </span>\n ) : (\n <>\n <img\n src={imageURL}\n alt={label}\n className={cn(\n \"aspect-auto h-5 w-5 dark:hidden\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n />\n <img\n src={darkImageURL}\n alt={label}\n className={cn(\n \"hidden aspect-auto h-5 w-5 dark:inline\",\n isExpanded ? \"mr-4\" : \"mr-2\",\n )}\n />\n </>\n )}\n {isExpanded && (\n <span className=\"md:text-medium hidden md:inline\">{label}</span>\n )}\n </Button>\n );\n}\n\ninterface SidebarMenuProps {\n activeScreen: PanelScreen;\n setActiveScreen: (screen: PanelScreen) => void;\n setParams: (params: { product?: string; state: PanelScreen }) => void;\n theme?: GetThemeOutput;\n logout: () => void;\n}\n\nfunction SidebarMenu({\n activeScreen,\n setActiveScreen,\n setParams,\n theme,\n logout,\n}: SidebarMenuProps) {\n const [sidebarExpandRef] = useAutoAnimate();\n const [isExpanded, setIsExpanded] = useState(true);\n const { returnsNavLabel } = getPanelTexts();\n\n return (\n <div\n ref={sidebarExpandRef}\n className={cn(\n \"hidden px-4 pt-4 pb-12 md:flex md:h-full md:flex-col dark:bg-neutral-900\",\n isExpanded ? \"md:w-52\" : \"md:w-16\",\n )}\n >\n <div className=\"flex items-center justify-between\">\n <CompanyLogo theme={theme} isExpanded={isExpanded} />\n </div>\n\n <SidebarSeparator className=\"my-6\" />\n\n <div className=\"flex flex-1 flex-col gap-2\">\n <SidebarButton\n panelScreen=\"products\"\n label=\"Produkty\"\n imageURL=\"/icons/bitsnap-dark-24x24.svg\"\n darkImageURL=\"/icons/bitsnap-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"orders\"\n label=\"Zamówienia\"\n imageURL=\"/icons/category-dark-24x24.svg\"\n darkImageURL=\"/icons/category-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"returns\"\n label={returnsNavLabel}\n icon={<Undo2 className=\"h-5 w-5\" aria-hidden />}\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n\n <SidebarButton\n panelScreen=\"profile\"\n label=\"Profil\"\n imageURL=\"/icons/profile-dark-24x24.svg\"\n darkImageURL=\"/icons/profile-24x24.svg\"\n activeScreen={activeScreen}\n setActiveScreen={setActiveScreen}\n setParams={setParams}\n isExpanded={isExpanded}\n />\n </div>\n\n <SidebarSeparator className=\"mb-6\" />\n\n <Button onClick={logout}>\n <LogOut className=\"mr-2\" width={16} height={16} />\n {isExpanded && (\n <p className=\"md:text-medium hidden md:inline md:text-center\">\n Wyloguj się\n </p>\n )}\n </Button>\n </div>\n );\n}\n\ninterface SidebarSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nfunction SidebarSeparator({ className }: SidebarSeparatorProps) {\n return (\n <div className={cn(\"relative h-px w-full bg-neutral-300\", className)}>\n <div className=\"absolute -top-px left-0 h-1 w-1 rounded-full bg-neutral-500\"></div>\n <div className=\"absolute -top-px right-0 h-1 w-1 rounded-full bg-neutral-500\"></div>\n </div>\n );\n}\n\ninterface CompanyLogoProps {\n theme?: GetThemeOutput;\n isExpanded: boolean;\n}\n\nfunction CompanyLogo({ theme, isExpanded: _isExpanded }: CompanyLogoProps) {\n return (\n <>\n {theme == null && (\n <p className=\"text-xl tracking-wider md:inline dark:text-neutral-200\">\n bitsnap.\n </p>\n )}\n {(theme?.logoDarkURL || theme?.logoURL) && (\n <img\n src={theme.logoDarkURL ?? theme.logoURL}\n alt=\"Company Logo\"\n className=\"hidden h-6 w-6 dark:inline\"\n draggable={false}\n />\n )}\n\n {theme?.logoURL && (\n <img\n src={theme.logoURL}\n alt=\"Company Logo\"\n className=\"h-6 w-6 dark:hidden\"\n draggable={false}\n />\n )}\n </>\n );\n}\n","import { Button } from \"../../ui/button\";\nimport { LogOut } from \"lucide-react\";\n\ninterface PanelProfileComponentProps {\n email: string | null;\n logout: () => void;\n}\n\nfunction PanelProfileComponent({ email, logout }: PanelProfileComponentProps) {\n return (\n <>\n <h3 className=\"text-2xl\">Profil</h3>\n <div className=\"mt-6 flex-1 md:flex-none\">\n <span className=\"text-sm text-neutral-500\">Email</span>\n <p className=\"mt-2 text-base\">{email ? email : \"Brak danych\"}</p>\n </div>\n <div className=\"flex w-full flex-col items-center space-y-2\">\n <Button onClick={logout} className=\"max-w-64 md:hidden\">\n <LogOut className=\"mr-2\" width={16} height={16} />\n <p className=\"text-medium inline text-center\">Wyloguj się</p>\n </Button>\n </div>\n </>\n );\n}\n\nexport default PanelProfileComponent;\n","import { lazy, Suspense } from \"react\";\nimport type { PanelCourseProps } from \"../../course\";\nimport LoadingIndicator from \"../LoadingIndicator\";\n\n// The course view (video player, sanitizer, tests) is loaded when a customer\n// opens a course, so it does not weigh on the rest of the panel.\nconst PanelCourse = lazy(() =>\n import(\"../../course\").then((module) => ({\n default: module.PanelCourse,\n })),\n);\n\n/** `PanelCourse` loaded on demand. */\nexport default function LazyPanelCourse(props: PanelCourseProps) {\n return (\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 p-2\" role=\"status\">\n <LoadingIndicator />\n </div>\n }\n >\n <PanelCourse {...props} />\n </Suspense>\n );\n}\n","import {\n AlertCircle,\n CheckCircle2,\n ChevronLeft,\n Loader2,\n Lock,\n Package,\n Truck,\n} from \"lucide-react\";\nimport { useEffect, useState, type CSSProperties } from \"react\";\nimport { useInstrument, type AnalyticsOption } from \"../../analytics/instrument\";\nimport { rpcProvider, useMutation, useQuery } from \"../../rpc-provider\";\nimport { Button } from \"../../ui/button\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../../ui/card\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Textarea } from \"../../ui/textarea\";\n\nimport { usePanelConfig } from \"../PanelProvider\";\n\ninterface Props {\n orderID: string;\n initialEmail?: string;\n accessToken?: string;\n onBack?: () => void;\n /**\n * Usage statistics for your Bitsnap dashboard (order viewed). Inside\n * `<Panel>` or `<PanelProvider>` their setting applies unless this is given.\n */\n analytics?: AnalyticsOption;\n}\n\nfunction StatusBadge({ status }: { status: string }) {\n const statusConfig: Record<\n string,\n { color: string; icon: typeof AlertCircle | null }\n > = {\n created: { color: \"bg-neutral-100 text-neutral-700\", icon: null },\n paid: { color: \"bg-green-100 text-green-700\", icon: CheckCircle2 },\n completed: { color: \"bg-blue-100 text-blue-700\", icon: CheckCircle2 },\n canceled: { color: \"bg-red-100 text-red-700\", icon: AlertCircle },\n sent: { color: \"bg-purple-100 text-purple-700\", icon: Truck },\n processing: { color: \"bg-yellow-100 text-yellow-700\", icon: Loader2 },\n };\n\n const config = statusConfig[status] || statusConfig.created;\n const Icon = config.icon;\n\n const statusLabels: Record<string, string> = {\n created: \"Utworzone\",\n paid: \"Opłacone\",\n completed: \"Zakończone\",\n canceled: \"Anulowane\",\n sent: \"Wysłane\",\n processing: \"Przetwarzane\",\n };\n\n return (\n <span\n className={`inline-flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium ${config.color}`}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {statusLabels[status] || status}\n </span>\n );\n}\n\nfunction AddCommentForm({\n orderID,\n email,\n}: {\n orderID: string;\n email: string;\n}) {\n const [message, setMessage] = useState(\"\");\n const addCommentMutation = useMutation(\n rpcProvider.publicApi.addPublicOrderComment,\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!message.trim()) return;\n\n try {\n await addCommentMutation.mutateAsync({\n projectId: \"\",\n orderId: orderID,\n message: message.trim(),\n accessToken: email,\n });\n setMessage(\"\");\n } catch (error) {\n console.error(\"Failed to add comment:\", error);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"mt-4 space-y-2\">\n <Label htmlFor=\"comment\">Dodaj komentarz</Label>\n <Textarea\n id=\"comment\"\n value={message}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setMessage(e.target.value)\n }\n placeholder=\"Wpisz komentarz...\"\n rows={3}\n disabled={addCommentMutation.isPending}\n />\n <Button\n type=\"submit\"\n disabled={!message.trim() || addCommentMutation.isPending}\n >\n {addCommentMutation.isPending ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Wysyłanie...\n </>\n ) : (\n \"Dodaj komentarz\"\n )}\n </Button>\n </form>\n );\n}\n\nfunction formatDate(timestamp: { seconds: bigint } | undefined): string {\n if (!timestamp) return \"N/A\";\n const date = new Date(Number(timestamp.seconds) * 1000);\n return date.toLocaleDateString(\"pl-PL\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\nfunction formatCurrency(amount: number, currency: string): string {\n return new Intl.NumberFormat(\"pl-PL\", {\n style: \"currency\",\n currency: currency.toUpperCase(),\n }).format(amount / 100);\n}\n\nfunction PublicOrderPageContent({\n orderID,\n initialEmail,\n onBack,\n accessToken,\n analytics,\n}: Props) {\n const { theme, projectID } = usePanelConfig();\n const instrument = useInstrument(projectID, analytics, \"order\");\n\n const [verifyEmail, setVerifyEmail] = useState(initialEmail || \"\");\n const [isVerifyDialogOpen, setIsVerifyDialogOpen] = useState(false);\n\n const {\n data: orderData,\n isLoading,\n error,\n refetch,\n } = useQuery(\n rpcProvider.publicApi.getPublicOrderDetails,\n {\n projectId: projectID ?? \"\",\n orderId: orderID,\n email: verifyEmail || undefined,\n accessToken: accessToken,\n },\n { enabled: !!orderID },\n );\n\n const order =\n orderData?.result.case === \"order\" ? orderData.result.value : null;\n const isVerified = order?.isVerified ?? false;\n\n const viewedOrder = order != null;\n useEffect(() => {\n if (viewedOrder) {\n // The id in the URL may be an access token: report no order reference.\n instrument.track(\"panel_order_viewed\", {}, { order_ref: null });\n }\n }, [instrument, viewedOrder]);\n\n const handleVerifyEmail = () => {\n refetch();\n setIsVerifyDialogOpen(false);\n };\n\n const styles = {\n \"--button-background-color\": theme?.colors?.brand ?? \"#000000\",\n \"--button-background-color-dark\": theme?.colors?.brandDark ?? \"#ffffff\",\n \"--button-text-color\": theme?.colors?.brandDark ?? \"#000000\",\n \"--button-text-color-dark\": theme?.colors?.brand ?? \"#000000\",\n } as CSSProperties;\n\n if (isLoading) {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"text-center\">\n <Loader2 className=\"mx-auto h-8 w-8 animate-spin text-neutral-400\" />\n <p className=\"mt-2 text-neutral-600 dark:text-neutral-400\">\n Ładowanie zamówienia...\n </p>\n </div>\n </div>\n );\n }\n\n if (error || !order) {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <Card className=\"w-full max-w-md\">\n <CardContent className=\"pt-6\">\n <div className=\"text-center\">\n <AlertCircle className=\"mx-auto h-12 w-12 text-red-500\" />\n <h2 className=\"mt-4 text-xl font-semibold\">\n Zamówienie nie znalezione\n </h2>\n <p className=\"mt-2 text-neutral-600 dark:text-neutral-400\">\n Nie znaleziono zamówienia o podanym numerze.\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"w-full bg-white py-8 dark:bg-black\" style={styles}>\n <div className=\"w-full px-4\">\n {onBack && (\n <Button onClick={onBack} variant=\"ghost\" className=\"mb-4 w-fit\">\n <ChevronLeft className=\"h-4 w-4\" />\n Wróć do historii zamówień\n </Button>\n )}\n <div className=\"mb-6 flex items-center gap-4\">\n {theme?.logoURL && (\n <>\n <img\n src={theme.logoURL}\n alt=\"Project logo\"\n className={`h-12 w-auto ${theme.logoDarkURL ? \"dark:hidden\" : \"\"}`}\n />\n {theme.logoDarkURL && (\n <img\n src={theme.logoDarkURL}\n alt=\"Project logo\"\n className=\"hidden h-12 w-auto dark:block\"\n />\n )}\n </>\n )}\n <div>\n <h1 className=\"text-3xl font-bold\">Zamówienie</h1>\n <p className=\"text-neutral-600 dark:text-neutral-400\">\n Numer zamówienia: #{order.orderId}\n </p>\n </div>\n </div>\n\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <Package className=\"mr-2 h-5 w-5\" />\n Status zamówienia\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={order.status} />\n {order.processingStatus && (\n <span className=\"text-sm text-neutral-600\">\n · {order.processingStatus}\n </span>\n )}\n </div>\n <p className=\"mt-2 text-sm text-neutral-600\">\n Zamówienie złożone {formatDate(order.createdAt)}\n </p>\n </div>\n\n <div className=\"border-t pt-4\">\n <h3 className=\"mb-3 font-semibold\">Dane klienta</h3>\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Imię i nazwisko:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerName}\n </span>\n </div>\n <div>\n <span className=\"font-medium\">Email:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerEmail}\n </span>\n </div>\n {order.customerPhone && (\n <div>\n <span className=\"font-medium\">Telefon:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.customerPhone}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {!isVerified && (\n <div className=\"border-t pt-4\">\n <Button\n onClick={() => setIsVerifyDialogOpen(true)}\n variant=\"outline\"\n className=\"w-full\"\n >\n <Lock className=\"mr-2 h-4 w-4\" />\n Zweryfikuj swój email\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle>Produkty</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4\">\n {order.items.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n {item.imageUrl && (\n <img\n src={item.imageUrl}\n alt={item.name}\n className=\"h-16 w-16 rounded object-cover\"\n />\n )}\n <div className=\"flex-1\">\n <p className=\"font-medium\">{item.name}</p>\n <p className=\"text-sm text-neutral-600\">\n Ilość: {item.quantity}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium\">\n {formatCurrency(Number(item.price), item.currency)}\n </p>\n </div>\n </div>\n ))}\n </div>\n\n {(order.deliveryAddress || order.deliveryMethod) && (\n <div className=\"border-t pt-4\">\n <h3 className=\"mb-3 flex items-center font-semibold\">\n <Truck className=\"mr-2 h-5 w-5\" />\n Informacje o dostawie\n </h3>\n <div className=\"space-y-2\">\n {order.deliveryAddress && (\n <div>\n <span className=\"font-medium\">Adres:</span>{\" \"}\n <span className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {order.deliveryAddress}\n </span>\n </div>\n )}\n {order.deliveryMethod && (\n <div>\n <span className=\"font-medium\">Metoda:</span>{\" \"}\n {order.deliveryMethod}\n </div>\n )}\n {order.trackingNumber && isVerified && (\n <div>\n <span className=\"font-medium\">Tracking:</span>{\" \"}\n {order.trackingNumber}\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"border-t pt-4\">\n <div className=\"flex justify-between text-lg font-bold\">\n <span>Suma:</span>\n <span>\n {formatCurrency(Number(order.totalAmount), order.currency)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n Komentarze {order.commentCount > 0 && `(${order.commentCount})`}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {order.comments.length > 0 ? (\n <div className=\"space-y-4\">\n {order.comments.map((comment) => (\n <div\n key={comment.id}\n className=\"border-b pb-4 last:border-b-0\"\n >\n <div className=\"mb-1 flex items-center gap-2\">\n <span className=\"font-medium\">\n {comment.authorName || \"System\"}\n </span>\n <span className=\"text-xs text-neutral-500\">\n {formatDate(comment.createdAt)}\n </span>\n {comment.authorType === \"admin\" && (\n <span className=\"rounded bg-blue-100 px-2 py-0.5 text-xs text-blue-700\">\n Admin\n </span>\n )}\n </div>\n <p className={!isVerified ? \"text-neutral-500\" : \"\"}>\n {comment.message}\n </p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-neutral-600\">Brak komentarzy.</p>\n )}\n\n {isVerified ? (\n <AddCommentForm orderID={order.orderId} email={verifyEmail} />\n ) : (\n <div className=\"mt-4\">\n <Button\n onClick={() => setIsVerifyDialogOpen(true)}\n variant=\"outline\"\n className=\"w-full\"\n >\n <Lock className=\"mr-2 h-4 w-4\" />\n Zweryfikuj swój email\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {isVerifyDialogOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Zweryfikuj swój email</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-neutral-700\">\n Podaj adres email użyty przy składaniu zamówienia.\n </p>\n <div className=\"space-y-2\">\n <Label htmlFor=\"verify-email\">Adres email</Label>\n <Input\n id=\"verify-email\"\n type=\"email\"\n placeholder=\"twoj@email.com\"\n value={verifyEmail}\n onChange={(e) => setVerifyEmail(e.target.value)}\n />\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsVerifyDialogOpen(false)}\n className=\"flex-1\"\n >\n Anuluj\n </Button>\n <Button onClick={handleVerifyEmail} className=\"flex-1\">\n Zweryfikuj\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction PublicOrderPage(props: Props) {\n return <PublicOrderPageContent {...props} />;\n}\nexport default PublicOrderPage;\n","import { setAllowedReturnOrigins, setPanelConfig } from \"@/src/panel\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createContext, useContext, useEffect } 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 { findMissingProductIDs, findProductForCartItem } from \"./cart-items\";\nimport { round } from \"./lib/round.number\";\nimport { LinkRequest } from \"./link.request.schema\";\nimport {\n createPaymentURL,\n getReferenceIfPossible,\n injectReferenceToRequestIfNeeded,\n} from \"./methods\";\nimport { SingleProduct } from \"./product.details.model\";\nimport { useCheckoutStore } from \"./state\";\nimport { getLocale } from \"./locale\";\n\nexport const MARKETING_AGREEMENT_ID = \"__m_a\";\n\ntype CartProduct = {\n productID: string;\n quantity: number;\n metadata?: { [key: string]: string | undefined };\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 details?: SingleProduct;\n /** The catalog product, when `productID` is one of its variants. */\n catalogProductID?: string;\n }[]\n >;\n\n updateQuantity(args: { id: string; quantity: number }): Promise<Err | void>;\n\n removeProductFromCart: (args: { id: string }) => Promise<Err | void>;\n\n clearCart: () => Promise<Err | void>;\n\n getNumberOfElementsInCart: () => Promise<number>;\n\n setCouponCodeIfPossible: (couponCode?: string) => Promise<Err | void>;\n setDeliveryMethod: (deliveryMethod?: string) => Promise<Err | void>;\n setPostalCode: (postalCode?: string) => Promise<Err | void>;\n setEmail: (email?: string) => Promise<Err | void>;\n setCountry: (country: string) => Promise<Err | void>;\n getCountry: () => Promise<Err | string>;\n getAvailableCountries: () => Promise<Err | { name: string; code: string }[]>;\n\n redirectToNextStep: () => Promise<Err | { url: string }>;\n\n getApplePayPaymentRequest: (args?: {\n expectedItems?: CartProduct[];\n }) => Promise<Err | ApplePayJS.ApplePayPaymentRequest>;\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 = new QueryClient();\n\n useEffect(() => {\n updateNumberOfProductsInCart();\n }, []);\n\n const projectID = getProjectID();\n if (projectID == null) {\n return <></>;\n }\n\n const checkoutMethods = getCheckoutMethods(projectID, locale);\n\n return (\n <QueryClientProvider client={queryClient}>\n <CartProviderContext.Provider value={checkoutMethods}>\n {children}\n </CartProviderContext.Provider>\n </QueryClientProvider>\n );\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 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 const params = new URLSearchParams();\n params.set(\"ids\", productIds.join(\",\"));\n params.set(\"locale\", args?.locale ?? getLocale());\n\n const result = await fetch(\n withClientParam(buildURL(projectID, `/products?${params.toString()}`)),\n {\n method: \"GET\",\n },\n );\n\n if (result.status != 200) {\n return [];\n }\n\n const payload: {\n success: boolean;\n message?: string | undefined;\n result?: SingleProduct[] | undefined;\n } = await result.json();\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});\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 })),\n );\n trackCartAdd(products, latestProducts);\n sendAnalyticEvent({\n event: \"addToCart\",\n currency: \"PLN\",\n items: products.map((el) => ({\n id: el.productID,\n name: el.name ?? \"\",\n price: el.price ?? 0,\n quantity: el.quantity,\n currency: el.currency ?? \"PLN\",\n })),\n });\n saveCheckout(checkout);\n updateNumberOfProductsInCart();\n return undefined;\n}\n\n/** `add_to_cart` per added line, priced by the backend's answer. */\nfunction trackCartAdd(\n added: CartProduct[],\n latest: { productID: string; details?: SingleProduct; catalogProductID?: string }[],\n) {\n for (const item of added) {\n try {\n const found = latest.find((el) => el.productID === item.productID);\n const price = found?.details?.pricing?.effectivePrice ?? found?.details?.price ?? item.price;\n const currency = found?.details?.currency ?? item.currency;\n if (price == null || currency == null) continue;\n const productID = found?.catalogProductID ?? item.productID;\n (item.analytics ?? getCartInstrument()).track(\n \"add_to_cart\",\n { qty: item.quantity, value_minor: Math.round(price * item.quantity), currency },\n { product_id: productID, variant_id: productID !== item.productID ? item.productID : null },\n );\n } catch {}\n }\n}\n\nfunction removeProductFromCheckout(ids: string[]) {\n const checkout = getCheckout();\n const newCheckout = {\n ...checkout,\n products: checkout?.products?.filter(\n (product) =>\n !ids.includes(product.productID) && !ids.includes(product.id),\n ),\n };\n sendAnalyticEvent({\n event: \"removeFromCart\",\n items: ids.map((id) => ({\n id: id,\n name: \"\",\n price: 0,\n quantity: 1,\n currency: \"PLN\",\n })),\n });\n saveCheckout(newCheckout);\n updateNumberOfProductsInCart();\n}\n\nfunction saveCheckout(model: Checkout) {\n localStorage.setItem(checkoutKey, JSON.stringify(model));\n}\n\nexport const getCheckoutMethods: (\n projectID: string,\n locale?: string,\n) => CartMethods = (projectID, locale = getLocale()) => {\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 });\n if (mappedPaymentRequest == null) {\n return {\n isAvailable: false,\n };\n }\n\n return {\n isAvailable: true,\n config: mappedPaymentRequest,\n };\n } catch (e) {\n console.error(\"Error resolving Google Pay configuration\", e);\n return {\n isAvailable: false,\n };\n }\n },\n async clearCart(): Promise<Err | void> {\n const empty = structuredClone(emptyCheckout);\n empty.country = getCheckout()?.country;\n saveCheckout(empty);\n updateNumberOfProductsInCart();\n },\n\n async getAvailableCountries(): Promise<\n Err | { name: string; code: string }[]\n > {\n const result = await fetch(\n withClientParam(buildURL(projectID, \"/countries\")),\n {\n method: \"GET\",\n },\n );\n\n if (result.status != 200) {\n return [];\n }\n\n try {\n return zod\n .array(\n zod.object({\n name: zod.string(),\n code: zod.string(),\n }),\n )\n .parse(await result.json());\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return Err(e.toString(), \"internal\");\n }\n },\n\n async getCountry(): Promise<Err | string> {\n let country = getCheckout()?.country;\n if (country == null) {\n country = \"PL\";\n const checkout = getCheckout();\n checkout.country = country;\n saveCheckout(checkout);\n }\n\n return country;\n },\n\n async getNumberOfElementsInCart(): Promise<number> {\n return (\n getCheckout()?.products?.reduce(\n (acc, product) => acc + product.quantity,\n 0,\n ) ?? 0\n );\n },\n\n async getProducts(): Promise<\n | Err\n | {\n id: string;\n productID: string;\n quantity: number;\n metadata?: {\n [p: string]: string | undefined;\n };\n details?: SingleProduct;\n catalogProductID?: string;\n }[]\n > {\n return await getProducts(projectID, { locale });\n },\n\n async removeProductFromCart(args: { id: string }): Promise<Err | void> {\n return removeProductFromCheckout([args.id]);\n },\n\n async setCountry(country: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.country = country;\n saveCheckout(checkout);\n },\n\n async setCouponCodeIfPossible(couponCode?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.couponCode = couponCode;\n saveCheckout(checkout);\n },\n\n async setPostalCode(postalCode?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.postalCode = postalCode;\n saveCheckout(checkout);\n },\n\n async setDeliveryMethod(deliveryMethod?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.selectedDeliveryMethod = deliveryMethod;\n saveCheckout(checkout);\n },\n\n async setEmail(email?: string): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.email = email;\n saveCheckout(checkout);\n },\n\n async addProduct(args: CartProduct): Promise<Err | void> {\n return await addProducts(projectID, [args]);\n },\n\n async updateQuantity(args: {\n id: string;\n quantity: number;\n }): Promise<Err | void> {\n const checkout = getCheckout();\n checkout.products = checkout.products?.map((product) => {\n if (product.id === args.id) {\n product.quantity = args.quantity;\n }\n return product;\n });\n saveCheckout(checkout);\n updateNumberOfProductsInCart();\n },\n\n async redirectToNextStep(): Promise<Err | { url: string }> {\n const checkout = getCheckout();\n\n if (checkout.products == null || checkout.products.length == 0) {\n return Err(\"cart-is-empty\", \"badInput\");\n }\n const mergedMetadata = checkout.products.reduce(\n (acc, product) => {\n if (product.metadata != null) {\n Object.keys(product.metadata).forEach((key) => {\n const value = product.metadata?.[key];\n if (value != null) {\n acc[key] = value;\n }\n });\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const payload: LinkRequest = {\n items: checkout.products.map((el) => {\n return {\n id: el.productID,\n quantity: el.quantity,\n priceVersion: el.priceVersion,\n };\n }),\n askForNote: true,\n countries: checkout.country ? [checkout.country] : undefined,\n metadata: mergedMetadata,\n locale,\n };\n\n const paymentResponse = await createPaymentURL(payload);\n\n if (isErr(paymentResponse)) {\n console.warn(\"cannot create payment URL\", paymentResponse.error);\n return paymentResponse;\n }\n\n return {\n url: paymentResponse.url,\n };\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 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((el.quantity * (el.details?.price ?? 0)) / 100, 2)}`,\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: 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: \"Płatność za koszyk\",\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: \"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 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 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\";\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}): google.payments.api.PaymentDataRequest | undefined {\n const { items, googlePayConfig, checkout, result, cartRequiresShipping } =\n args;\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: \"Płatność za koszyk\",\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 ),\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): 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 subtotalAmount += item.details.price * item.quantity;\n displayItems.push({\n label: item.details.name + \" x \" + item.quantity,\n price: `${round(item.details.price / 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: `Kupon ${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","import { create } from 'zustand';\n\ninterface CheckoutStore {\n isCartVisible: boolean;\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 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 type { Instrument } from \"@/src/analytics/instrument\";\nimport { clientHeaders } from \"@/src/lib/client-header\";\nimport { getCheckoutMethods, getLocale, getProjectID } from \"./CartProvider\";\nimport { HOST } from \"./constants\";\nimport { buildURL } from \"./helper.methods\";\nimport { Err } from \"./lib/err\";\nimport { LinkRequest } from \"./link.request.schema\";\nimport { useCheckoutStore } from \"./state\";\n\nexport namespace Bitsnap {\n /**\n * Adds a product or variant to the cart. Returns an `Err` instead of adding\n * anything when the backend does not know the id\n * (`item-ids-not-found`, with the unknown ids in `data`).\n */\n 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 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\nexport async function createPaymentURL(request: LinkRequest) {\n const projectID = getProjectID();\n if (projectID == null) {\n throw new Error(\"No project ID found\");\n }\n\n request = injectReferenceToRequestIfNeeded(request);\n request.locale ??= getLocale();\n\n const result = await fetch(buildURL(projectID, \"/buy\"), {\n method: \"POST\",\n headers: {\n ...clientHeaders,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (result.status != 200) {\n if (result.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n try {\n const payload = await result.json();\n if (\"itemIds\" in payload && Array.isArray(payload.itemIds)) {\n const itemIds: string[] = payload.itemIds;\n return Err(\"item-ids-not-found\", \"badInput\", itemIds);\n }\n } catch (error) {}\n return Err(\"internal-error\", \"internal\");\n } else {\n console.warn(\n \"result\",\n await result.text(),\n result.status,\n result.statusText,\n );\n }\n return Err(\"internal-error\", \"internal\");\n }\n\n const response: { url: string; sessionID: string } = await result.json();\n\n return {\n url: response.url,\n };\n}\n\nexport async function createCheckout(\n request: LinkRequest & { apiKey?: string; testMode?: boolean },\n) {\n const projectID = getProjectID();\n if (projectID == null) {\n throw new Error(\"No project ID found\");\n }\n\n const headers = {\n ...clientHeaders,\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 const payload: {\n url: string;\n } = await response.json();\n\n return {\n status: \"ok\",\n redirectURL: payload.url,\n };\n}\n\nexport function getReferenceIfPossible(): string | undefined {\n if (typeof localStorage == \"undefined\") {\n return undefined;\n }\n const refLink = localStorage.getItem(\"bitsnap-ref\");\n if (refLink == null) {\n return undefined;\n }\n return refLink;\n}\n\nexport function injectReferenceToRequestIfNeeded(\n request: LinkRequest,\n): LinkRequest {\n const ref = getReferenceIfPossible();\n if (ref == null) {\n return request;\n }\n\n if (request.metadata == null) {\n request.metadata = {};\n }\n request.metadata[\"ref\"] = ref;\n return request;\n}\n"],"mappings":"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","names":["useAutoAnimate","useEffect","useState","jsx","Card","className","props","cn","CardHeader","CardTitle","CardDescription","CardContent","className","props","jsx","cn","React","OTPInput","OTPInputContext","MinusIcon","jsx","jsxs","InputOTP","className","containerClassName","props","OTPInput","cn","InputOTPGroup","InputOTPSlot","index","inputOTPContext","OTPInputContext","char","hasFakeCaret","isActive","InputOTPSeparator","MinusIcon","REGEXP_ONLY_DIGITS","jsx","jsxs","LoadingIndicator","LoadingIndicator_default","RETURN_URL_PARAM","RETURN_URL_STORAGE_KEY","ACCESS_TOKEN_PARAM","getReturnURLFromSearch","search","raw","validateReturnURL","persistReturnURL","returnURL","readPersistedReturnURL","stored","isOriginAllowed","origin","allowedOrigins","allowed","allowedHost","originHost","u","getAllowedReturnOrigins","buildAccessTokenRedirect","accessToken","jsx","jsxs","knownSiblings","getAllowedReturnOrigins","setAllowedReturnOrigins","LoginUserPanel","projectID","host","reveal","email","setEmail","loginUser","isLoginLoading","errMsg","configuredProjectID","configuredHost","usePanelConfig","getPanelSession","isValidEmail","setIsValidEmail","useState","emailValidation","input","handleInputChange","e","value","goToVerifyCode","onSubmit","cn","Card","CardHeader","CardTitle","CardDescription","CardContent","Label","Input","Button","LoadingIndicator_default","VerifyCodePanel","loginUserResponse","setLoginUserResponse","setResponseStatus","instrument","useInstrumentContext","verifyCodeAsync","isVerifyLoading","useMutation","rpcProvider","code","setCode","isValidCode","setIsValidCode","isSubmitted","setIsSubmitted","retryIn","setRetryIn","codeValidation","login","codeValue","verifyCodeResult","status","message","accessToken","savePanelSession","returnURL","readPersistedReturnURL","buildAccessTokenRedirect","handleRetryInTime","intervalId","prevRetryIn","useEffect","backToLoginComponent","onCodeSubmit","InputOTP","REGEXP_ONLY_DIGITS","newValue","InputOTPGroup","InputOTPSlot","InputOTPSeparator","PanelLoginComponentWrapper","analytics","theme","allowedReturnOrigins","useInstrument","styles","activeScreen","setActiveScreen","parent","useAutoAnimate","prevScreen","responseStatus","loginUserAsync","setErrMsg","queryReturnURL","getReturnURLFromSearch","persistReturnURL","existingToken","loginUserResult","InstrumentProvider","PanelLogin","useAutoAnimate","useEffect","useState","useState","useCallback","useEffect","useUrlSearchParams","initialValue","params","setParams","urlParams","parsed","key","value","updateParams","newParams","prev","updated","newUrl","handlePopState","resolvePanelReturnsAppearance","explicit","brand","color","brandColorTokens","SwitchPrimitive","jsx","Switch","className","props","cn","useState","Fragment","jsx","jsxs","PanelNotificationsComponent","notifications","setNotifications","Switch","checked","prevState","Label","PanelNotifications_default","ChevronLeftIcon","ChevronRightIcon","MoreHorizontalIcon","jsx","jsxs","Pagination","className","props","cn","PaginationContent","PaginationItem","PaginationLink","isActive","size","buttonVariants","PaginationPrevious","ChevronLeftIcon","PaginationNext","ChevronRightIcon","PaginationEllipsis","MoreHorizontalIcon","useState","Fragment","jsx","jsxs","formatDate","ts","formatAmount","amount","currency","statusLabel","statusColor","PanelOrderHistory","openOrderDetails","projectID","accessToken","offset","setOffset","limit","data","isFetching","useQuery","rpcProvider","orders","totalCount","currentPage","totalPages","handlePageChange","newOffset","_","i","Skeleton","order","Pagination","PaginationContent","PaginationItem","PaginationPrevious","PaginationLink","PaginationEllipsis","page","PaginationNext","PanelOrderHistory_default","useState","Fragment","jsx","jsxs","formatDate","ts","statusLabel","statusColor","PanelPlansComponent","_projectID","plans","setPlans","isLoading","setIsLoading","plan","PanelPlans_default","useEffect","useState","jsx","jsxs","redirectToLogin","loginURL","dropToken","projectID","host","clearPanelSession","ReturnsScreens","screen","params","setParams","setActiveScreen","status","exchangeError","useReturnsContext","text","useReturnsText","expired","isSessionExpiredError","useEffect","view","setView","useState","draft","setDraft","createdReturnId","setCreatedReturnId","mapReturnsError","Button","SkeletonRows","openReturns","next","ReturnsMyReturnDetail","ReturnsMyReturnsList","returnId","ReturnsResult","orderId","ReturnsConfirmation","ReturnsOrderDetail","selection","ReturnsOrderList","PanelReturns","accessToken","appearance","texts","rest","ReturnsProvider","useState","jsx","URL_REGEX","findURLIndices","text","match","replaceTextByIndices","originalText","replacements","result","lastIndex","b","startIndex","endIndex","replacementText","renderText","txt","urlIndices","el","fromJsonString","toJsonString","useAutoAnimate","ChevronLeft","Download","useEffect","useRef","useState","Hls","Pause","Play","forwardRef","useEffect","useImperativeHandle","useRef","useState","mediaSessionPlay","mediaSessionPause","mediaSessionUpdateDurationAndPosition","duration","currentTime","startMediaSessionCoordinator","args","e","stopMediaSessionCoordinator","jsx","jsxs","AudioPlayer","forwardRef","chapters","styles","updateCurrentTime","setCurrentTimeHandler","title","imageURL","uniqueProductID","onChapterChange","ref","PlayState","playState","setPlayState","useState","useEffect","mediaSessionPlay","mediaSessionPause","useImperativeHandle","chapter","playChapter","currentTime","setCurrentTime","duration","setDuration","videoRef","useRef","hlsRef","timerRef","audioPlayerContainerRef","currentChapterRef","playWhenReady","setPlayWhenReady","isStarted","setIsStarted","isLoading","setIsLoading","isSafari","saveLastPlayedTime","timeInSeconds","getLastPlayedTime","time","result","getLastSelectedChapterID","lastSelectedChapterID","setLastSelectedChapterID","chapterID","deleteMemoryChapter","setupObservers","lastPlayedTime","seekTo","play","e","playNextChapter","startMediaSessionCoordinator","details","pause","seekBy","startTimer","currentChapterIndex","updatePlayerDetails","stopTimer","mediaSessionUpdateDurationAndPosition","togglePlayState","seconds","newTime","toSecond","destroyPlayer","loadChapters","playURL","src","Hls","stopMediaSessionCoordinator","calculateTime","secs","hours","minutes","returnedHours","returnedSeconds","showRangeProgress","rangeInput","barProgress","selectedTime","Button","Play","Pause","LoadingIndicator_default","AudioPlayer_default","PANEL_TEXT_TABLES","getPanelTexts","locale","getLocale","pickLocaleTable","React","jsx","ProgressBar","progress","setProgress","timer","Fragment","jsx","jsxs","warn","message","args","error","PanelProductDetails","accessToken","product","styles","reveal","onOpenCourse","productType","instrument","useInstrumentContext","trackDownload","audioPlayerRef","useRef","filesRefAnimation","useAutoAnimate","filesResponse","setFilesResponse","useState","fileDetailsAsync","isFileLoading","useMutation","rpcProvider","audioPlayerSeekToHandler","audioResponse","setAudioResponse","audioDownloadURLs","setAudioDownloadURLs","isAvailableToDownloadInMobileApp","setIsAvailableToDownloadInMobileApp","audioDetailsAsync","isAudioLoading","audioDetailsDownloadURLsAsync","isAudioDownloadURLsLoading","selectedChapter","setSelectedChapter","chapters","setChapters","handleFileDownload","filesResult","err","handleAudioDownload","audioResult","handleAudioURLsDownload","audioURLsResult","useEffect","audioChapters","mappedChapters","chapter","details","el","Button","ChevronLeft","LoadingIndicator_default","ProgressBar","index","Download","getPanelTexts","AudioPlayer_default","handler","cn","PanelProductDetails_default","Fragment","jsx","jsxs","PanelProductGridComponent","accessToken","projectID","loginURL","styles","activeScreen","params","setParams","openCourse","products","isProductsLoading","useQuery","rpcProvider","LoadingIndicator_default","clearPanelSession","productsList","ProductsComponent","PanelProductGrid_default","selectedProduct","setSelectedProduct","useState","fromJsonString","UserProductSchema","reveal","product","toJsonString","getProductTypeName","type","handleSelectedProduct","PanelProductDetails_default","index","renderText","Button","e","useAutoAnimate","LogOut","Undo2","useState","Fragment","jsx","jsxs","PanelProductHeaderComponent","activeScreen","setActiveScreen","setParams","_styles","theme","logout","MobileMenu","SidebarMenu","PanelProductHeader_default","returnsNavLabel","getPanelTexts","MobileButton","Undo2","panelScreen","label","imageURL","icon","Button","cn","SidebarButton","darkImageURL","isExpanded","sidebarExpandRef","useAutoAnimate","setIsExpanded","useState","CompanyLogo","SidebarSeparator","LogOut","className","_isExpanded","LogOut","Fragment","jsx","jsxs","PanelProfileComponent","email","logout","Button","PanelProfile_default","lazy","Suspense","jsx","PanelCourse","lazy","module","LazyPanelCourse","props","Suspense","LoadingIndicator_default","AlertCircle","CheckCircle2","ChevronLeft","Loader2","Lock","Package","Truck","useEffect","useState","Fragment","jsx","jsxs","StatusBadge","status","statusConfig","CheckCircle2","AlertCircle","Truck","Loader2","config","Icon","statusLabels","AddCommentForm","orderID","email","message","setMessage","useState","addCommentMutation","useMutation","rpcProvider","e","error","Label","Textarea","Button","formatDate","timestamp","formatCurrency","amount","currency","PublicOrderPageContent","initialEmail","onBack","accessToken","analytics","theme","projectID","usePanelConfig","instrument","useInstrument","verifyEmail","setVerifyEmail","isVerifyDialogOpen","setIsVerifyDialogOpen","orderData","isLoading","refetch","useQuery","order","isVerified","viewedOrder","useEffect","handleVerifyEmail","styles","Card","CardContent","ChevronLeft","CardHeader","CardTitle","Package","Lock","item","index","comment","Input","PublicOrderPage","props","PublicOrderPage_default","jsx","jsxs","PanelPage","returnsAppearance","returnsTexts","analytics","projectID","theme","loginURL","host","usePanelConfig","instrument","useInstrument","accessToken","getPanelSession","email","getPanelEmail","logoutUserAsync","useMutation","rpcProvider","logout","clearPanelSession","panelParentRef","useAutoAnimate","isScreen","value","params","setParams","useUrlSearchParams","activeScreen","setActiveScreen","useState","handleOpenOrderDetails","orderID","handleBackToOrders","navigate","next","handleOpenCourse","accessId","handleLeaveCourse","useEffect","styles","queryReturnURL","getReturnURLFromSearch","persistReturnURL","returnURL","readPersistedReturnURL","buildAccessTokenRedirect","InstrumentProvider","PanelProductHeader_default","PanelProductGrid_default","LazyPanelCourse","item","PanelNotifications_default","PanelPlans_default","PanelOrderHistory_default","PublicOrderPage_default","PanelReturns","resolvePanelReturnsAppearance","PanelProfile_default","PanelPage_default","create","QueryClient","QueryClientProvider","createContext","useContext","useEffect","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","intents","method","formatCurrency","round","mapGooglePayDisplayItems","methods","deliveryMethod","couponCode","couponValue","displayItems","subtotalAmount","item","selectedDeliveryMethod","buildURL","projectID","path","HOST","isErr","x","Err","message","type","data","findProductForCartItem","productID","products","el","variant","findMissingProductIDs","requested","resolved","found","id","create","useCheckoutStore","set","state","numberOfProductsInCart","Fragment","jsx","MARKETING_AGREEMENT_ID","CartProviderContext","createContext","bitsnapProjectID","setProjectID","projectID","setPanelConfig","setAllowedReturnOrigins","getProjectID","getNewHostIfExist","CartProvider","children","locale","queryClient","QueryClient","useEffect","updateNumberOfProductsInCart","checkoutMethods","getCheckoutMethods","QueryClientProvider","getProducts","args","products","getCheckout","productIds","product","params","getLocale","result","withClientParam","buildURL","payload","details","findProductForCartItem","resolveProductDetailsFromSingleProduct","useCartProvider","context","useContext","CartProvider_default","googlePayConfigSchema","zod","checkoutProduct","checkoutSchema","emptyCheckout","checkoutKey","value","addProducts","latestProducts","item","index","isErr","missingIDs","findMissingProductIDs","el","Err","checkout","trackCartAdd","sendAnalyticEvent","saveCheckout","added","latest","found","price","currency","productID","getCartInstrument","removeProductFromCheckout","ids","newCheckout","id","model","newHost","setCustomHost","PublicApiClient","HOST","e","googlePayConfig","resolveGooglePayConfiguration","create","PreOrderItemSchema","cartRequiresShipping","mappedPaymentRequest","mapGooglePayConfiguration","empty","country","acc","couponCode","postalCode","deliveryMethod","email","mergedMetadata","key","paymentResponse","createPaymentURL","injectReferenceToRequestIfNeeded","shippingName","metadata","ref","getReferenceIfPossible","GetPreOrderDetailsRequestSchema","AddressSchema","BillingAddressSchema","error","items","round","variantIndex","v","variant","numberOfProductsInCart","useCheckoutStore","state","Bitsnap","addProductToCart","id","quantity","metadata","args","projectID","getProjectID","err","getCheckoutMethods","showCart","useCheckoutStore","hideCart","createPaymentURL","request","injectReferenceToRequestIfNeeded","getLocale","result","buildURL","clientHeaders","payload","itemIds","Err","createCheckout","headers","path","HOST","getReferenceIfPossible","refLink","ref"]}