@infuro/cms-core 1.0.34 → 1.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
- package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
- package/dist/admin.cjs +34329 -20923
- package/dist/admin.d.cts +186 -9
- package/dist/admin.d.ts +186 -9
- package/dist/admin.js +34140 -20829
- package/dist/api.cjs +120 -17515
- package/dist/api.d.cts +633 -3
- package/dist/api.d.ts +633 -3
- package/dist/api.js +14 -17528
- package/dist/auth.cjs +192 -1034
- package/dist/auth.d.cts +194 -51
- package/dist/auth.d.ts +194 -51
- package/dist/auth.js +4 -966
- package/dist/chunk-2XE4X74C.js +29602 -0
- package/dist/chunk-3DZRIZOD.cjs +52 -0
- package/dist/chunk-3KPNTQBV.cjs +620 -0
- package/dist/chunk-46GKADYE.cjs +84 -0
- package/dist/chunk-4TRPKBKO.js +589 -0
- package/dist/chunk-5ELSW2UP.js +150 -0
- package/dist/chunk-6KPQWRFW.js +171 -0
- package/dist/chunk-7NMT3GBR.cjs +29 -0
- package/dist/chunk-7YIBMQDR.cjs +86 -0
- package/dist/chunk-BGJAV67S.cjs +29710 -0
- package/dist/chunk-CNTSLED2.cjs +559 -0
- package/dist/chunk-CRFV5WJK.js +16 -0
- package/dist/chunk-D5FBNKQM.cjs +104 -0
- package/dist/chunk-EF2JBPDM.js +114 -0
- package/dist/chunk-EQPITOP6.js +543 -0
- package/dist/chunk-GO7PPYNU.js +76 -0
- package/dist/chunk-HF3L2GIT.cjs +194 -0
- package/dist/chunk-J7XHLOLO.js +830 -0
- package/dist/chunk-JBRR5UYL.js +87 -0
- package/dist/chunk-JC6DLWTE.js +21 -0
- package/dist/chunk-JHF4YYRC.cjs +188 -0
- package/dist/chunk-JXF23MPG.js +25 -0
- package/dist/chunk-MQBT33IV.js +48 -0
- package/dist/chunk-N44BJZ4C.cjs +123 -0
- package/dist/chunk-OOTLNH63.cjs +18 -0
- package/dist/chunk-PAMVINEX.cjs +577 -0
- package/dist/chunk-PNOKNSG2.cjs +222 -0
- package/dist/chunk-QM733NUK.js +186 -0
- package/dist/chunk-R73BKDRO.cjs +90 -0
- package/dist/chunk-SHUYVCID.js +4 -0
- package/dist/chunk-SYBOCAWB.js +97 -0
- package/dist/chunk-TDV6EJHV.js +192 -0
- package/dist/chunk-TFUOHI37.cjs +839 -0
- package/dist/chunk-TIAEXJLI.cjs +182 -0
- package/dist/chunk-UPLVMVRX.cjs +23 -0
- package/dist/chunk-USNT2KNT.cjs +6 -0
- package/dist/chunk-WEMDMVHQ.js +216 -0
- package/dist/chunk-XDSNZUW7.js +564 -0
- package/dist/chunk-XQ3QUHWR.cjs +83 -0
- package/dist/chunk-XW5ATPRW.cjs +155 -0
- package/dist/chunk-ZQ4X6OAU.js +82 -0
- package/dist/chunk-ZSVCP6N3.js +83 -0
- package/dist/cli.cjs +103 -84
- package/dist/cli.js +62 -27
- package/dist/email-FKR4FXFI.js +5 -0
- package/dist/email-KVKVPNCL.cjs +58 -0
- package/dist/email-queue-CGZBVVAS.js +2 -0
- package/dist/email-queue-TPZWLTIV.cjs +23 -0
- package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
- package/dist/erp-config-enabled-T37X7T34.js +2 -0
- package/dist/erp-order-invoice-3YISSOWW.js +3 -0
- package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
- package/dist/event-order-defaults-6E543227.js +2 -0
- package/dist/event-order-defaults-DUGDVGJI.cjs +39 -0
- package/dist/event-order-notifications-5GSAOYVS.cjs +27 -0
- package/dist/event-order-notifications-IIIF23D5.js +10 -0
- package/dist/hooks.cjs +259 -132
- package/dist/hooks.d.cts +42 -1
- package/dist/hooks.d.ts +42 -1
- package/dist/hooks.js +234 -91
- package/dist/index.cjs +3884 -22307
- package/dist/index.d.cts +2203 -772
- package/dist/index.d.ts +2203 -772
- package/dist/index.js +2871 -22064
- package/dist/interpolate-WAKPN56R.cjs +11 -0
- package/dist/interpolate-WDUWDF3I.js +2 -0
- package/dist/layout-36UFTHC5.cjs +11 -0
- package/dist/layout-AOBN26XG.js +2 -0
- package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
- package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
- package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
- package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
- package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
- package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
- package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
- package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
- package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
- package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
- package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
- package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
- package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
- package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
- package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
- package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
- package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
- package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
- package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
- package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
- package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
- package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
- package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
- package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
- package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
- package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
- package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
- package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
- package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
- package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
- package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
- package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
- package/dist/paid-order-erp-3USEG6WL.js +3 -0
- package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
- package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
- package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
- package/dist/razorpay-KLO2KNCB.js +49 -0
- package/dist/razorpay-U23LGY72.cjs +56 -0
- package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
- package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
- package/dist/sms-defaults-2NL24H57.js +2 -0
- package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
- package/dist/stripe-4FD27QVJ.js +51 -0
- package/dist/stripe-VU6OEG2D.cjs +57 -0
- package/dist/theme.cjs +31 -59
- package/dist/theme.d.cts +78 -3
- package/dist/theme.d.ts +78 -3
- package/dist/theme.js +23 -20
- package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
- package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
- package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
- package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
- package/package.json +147 -142
- package/dist/admin.cjs.map +0 -1
- package/dist/admin.js.map +0 -1
- package/dist/api.cjs.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/auth.cjs.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config-DJ5CmQvS.d.cts +0 -8
- package/dist/config-DJ5CmQvS.d.ts +0 -8
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/index-Bf5GO8fu.d.cts +0 -583
- package/dist/index-DOiJuMQA.d.ts +0 -583
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/theme.cjs.map +0 -1
- package/dist/theme.js.map +0 -1
- package/dist/types-DCVaXlPV.d.cts +0 -78
- package/dist/types-DCVaXlPV.d.ts +0 -78
- package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
- package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
package/dist/hooks.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/index.ts","../src/hooks/use-mobile.ts","../src/hooks/use-analytics.ts","../src/hooks/use-plugin.ts","../src/components/CaptchaProvider.tsx"],"sourcesContent":["export { useIsMobile } from './use-mobile';\r\nexport { useAnalytics } from './use-analytics';\r\nexport { usePlugin, PluginProvider } from './use-plugin';\r\nexport { CaptchaProvider, useCaptchaPayload } from '../components/CaptchaProvider';\r\n","import { useState, useEffect } from 'react';\r\n\r\nconst MOBILE_BREAKPOINT = 768;\r\n\r\nexport function useIsMobile(): boolean {\r\n const [isMobile, setIsMobile] = useState<boolean | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\r\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\r\n mql.addEventListener('change', onChange);\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\r\n return () => mql.removeEventListener('change', onChange);\r\n }, []);\r\n\r\n return !!isMobile;\r\n}\r\n","import { useEffect } from 'react';\r\n\r\n/**\r\n * Call from app with pathname from usePathname() (next/navigation).\r\n * Disables tracking on admin routes when pathname starts with /admin.\r\n */\r\nexport function useAnalytics(pathname: string | null): { isAdminRoute: boolean; shouldTrack: boolean } {\r\n const isAdminRoute = pathname != null && pathname.startsWith('/admin');\r\n\r\n useEffect(() => {\r\n if (isAdminRoute && typeof window !== 'undefined') {\r\n if (typeof (window as unknown as { gtag?: () => void }).gtag === 'function') {\r\n (window as unknown as { gtag: () => void }).gtag = () => {};\r\n }\r\n if (Array.isArray((window as unknown as { dataLayer?: unknown[] }).dataLayer)) {\r\n (window as unknown as { dataLayer: unknown[] }).dataLayer = [];\r\n }\r\n }\r\n }, [isAdminRoute]);\r\n\r\n return { isAdminRoute, shouldTrack: !isAdminRoute };\r\n}\r\n","import React, { createContext, useContext, type ReactNode } from 'react';\r\n\r\nconst PluginContext = createContext<{ getPlugin: <T>(name: string) => T | undefined } | null>(null);\r\n\r\nexport function PluginProvider({\r\n getPlugin,\r\n children,\r\n}: {\r\n getPlugin: <T>(name: string) => T | undefined;\r\n children: ReactNode;\r\n}) {\r\n return React.createElement(PluginContext.Provider, { value: { getPlugin } }, children);\r\n}\r\n\r\nexport function usePlugin<T = unknown>(name: string): T | undefined {\r\n const ctx = useContext(PluginContext);\r\n if (!ctx) return undefined;\r\n return ctx.getPlugin<T>(name);\r\n}\r\n","'use client';\r\n\r\nimport React, {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport type { CaptchaPublicConfig, CaptchaProviderId } from '../plugins/captcha';\r\n\r\ndeclare global {\r\n interface Window {\r\n turnstile?: {\r\n render: (el: HTMLElement | string, opts: Record<string, unknown>) => string;\r\n execute: (id: string) => void;\r\n reset: (id: string) => void;\r\n remove: (id: string) => void;\r\n };\r\n grecaptcha?: {\r\n ready: (fn: () => void) => void;\r\n execute: (siteKey: string, opts: { action: string }) => Promise<string>;\r\n };\r\n }\r\n}\r\n\r\ntype CaptchaCtx = {\r\n config: CaptchaPublicConfig | null;\r\n ready: boolean;\r\n selectedProvider: CaptchaProviderId | null;\r\n setSelectedProvider: (p: CaptchaProviderId) => void;\r\n getCaptchaPayload: () => Promise<Record<string, string>>;\r\n};\r\n\r\nconst CaptchaReactContext = createContext<CaptchaCtx | null>(null);\r\n\r\nfunction loadScript(src: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const base = src.split('?')[0] ?? src;\r\n const existing = Array.from(document.querySelectorAll('script[src]')).some((el) =>\r\n (el as HTMLScriptElement).src.startsWith(base)\r\n );\r\n if (existing) {\r\n resolve();\r\n return;\r\n }\r\n const s = document.createElement('script');\r\n s.src = src;\r\n s.async = true;\r\n s.onload = () => resolve();\r\n s.onerror = () => reject(new Error('Failed to load script'));\r\n document.head.appendChild(s);\r\n });\r\n}\r\n\r\nexport function CaptchaProvider({ children }: { children: React.ReactNode }) {\r\n const [config, setConfig] = useState<CaptchaPublicConfig | null>(null);\r\n const [selectedProvider, setSelectedProvider] = useState<CaptchaProviderId | null>(null);\r\n const [ready, setReady] = useState(false);\r\n const turnstileWidgetIdRef = useRef<string | null>(null);\r\n const turnstileContainerRef = useRef<HTMLDivElement | null>(null);\r\n const turnstileTokenRef = useRef<{\r\n resolve: (t: string) => void;\r\n reject: (e: Error) => void;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n fetch('/api/public/captcha-config')\r\n .then((r) => (r.ok ? r.json() : null))\r\n .then((c: CaptchaPublicConfig | null) => {\r\n if (cancelled || !c) return;\r\n setConfig(c);\r\n if (c.enabled && c.activeProvider) setSelectedProvider(c.activeProvider);\r\n })\r\n .catch(() => {})\r\n .finally(() => {\r\n if (!cancelled) setReady(true);\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!config?.enabled || !selectedProvider) return;\r\n const siteKeyFor = config.availableProviders.find((p) => p.id === selectedProvider)?.siteKey;\r\n if (!siteKeyFor) return;\r\n\r\n let cancelled = false;\r\n (async () => {\r\n try {\r\n if (selectedProvider === 'recaptcha_v3') {\r\n await loadScript(\r\n `https://www.google.com/recaptcha/api.js?render=${encodeURIComponent(siteKeyFor)}`\r\n );\r\n } else {\r\n await loadScript('https://challenges.cloudflare.com/turnstile/v0/api.js');\r\n if (cancelled || !turnstileContainerRef.current || !window.turnstile) return;\r\n if (turnstileWidgetIdRef.current) {\r\n try {\r\n window.turnstile.remove(turnstileWidgetIdRef.current);\r\n } catch {\r\n /* ignore */\r\n }\r\n turnstileWidgetIdRef.current = null;\r\n }\r\n const wid = window.turnstile.render(turnstileContainerRef.current, {\r\n sitekey: siteKeyFor,\r\n execution: 'execute',\r\n callback: (token: string) => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.resolve(token);\r\n },\r\n 'error-callback': () => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.reject(new Error('Turnstile error'));\r\n },\r\n 'expired-callback': () => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.reject(new Error('Turnstile expired'));\r\n },\r\n });\r\n turnstileWidgetIdRef.current = wid;\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n })();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [config, selectedProvider]);\r\n\r\n const getCaptchaPayload = useCallback(async (): Promise<Record<string, string>> => {\r\n if (!config?.enabled || !selectedProvider) return {};\r\n const siteKeyFor = config.availableProviders.find((p) => p.id === selectedProvider)?.siteKey;\r\n if (!siteKeyFor) return {};\r\n\r\n if (selectedProvider === 'recaptcha_v3') {\r\n if (!window.grecaptcha) return {};\r\n const token = await new Promise<string>((resolve, reject) => {\r\n window.grecaptcha!.ready(() => {\r\n window.grecaptcha!.execute(siteKeyFor, { action: 'submit' }).then(resolve).catch(reject);\r\n });\r\n });\r\n return { captchaToken: token, captchaProvider: 'recaptcha_v3' };\r\n }\r\n\r\n const wid = turnstileWidgetIdRef.current;\r\n if (!wid || !window.turnstile) return {};\r\n const token = await new Promise<string>((resolve, reject) => {\r\n turnstileTokenRef.current = { resolve, reject };\r\n try {\r\n window.turnstile!.reset(wid);\r\n window.turnstile!.execute(wid);\r\n } catch (e) {\r\n turnstileTokenRef.current = null;\r\n reject(e instanceof Error ? e : new Error('Turnstile execute failed'));\r\n }\r\n });\r\n return { captchaToken: token, captchaProvider: 'turnstile' };\r\n }, [config, selectedProvider]);\r\n\r\n const ctx = useMemo<CaptchaCtx>(\r\n () => ({\r\n config,\r\n ready,\r\n selectedProvider,\r\n setSelectedProvider,\r\n getCaptchaPayload,\r\n }),\r\n [config, ready, selectedProvider, getCaptchaPayload]\r\n );\r\n\r\n return (\r\n <CaptchaReactContext.Provider value={ctx}>\r\n {config?.enabled && config.multipleProviders ? (\r\n <div className=\"mb-2 text-sm text-muted-foreground max-w-md\">\r\n <label className=\"mr-2\" htmlFor=\"captcha-provider-select\">\r\n Verification\r\n </label>\r\n <select\r\n id=\"captcha-provider-select\"\r\n className=\"border rounded px-2 py-1 bg-background\"\r\n value={selectedProvider ?? ''}\r\n onChange={(e) => setSelectedProvider(e.target.value as CaptchaProviderId)}\r\n >\r\n {config.availableProviders.map((p) => (\r\n <option key={p.id} value={p.id}>\r\n {p.id === 'turnstile' ? 'Cloudflare Turnstile' : 'Google reCAPTCHA v3'}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n ) : null}\r\n <div ref={turnstileContainerRef} className=\"hidden\" aria-hidden />\r\n {children}\r\n </CaptchaReactContext.Provider>\r\n );\r\n}\r\n\r\n/** Returns a function that resolves to captcha fields for JSON bodies, or {} if disabled / not ready. */\r\nexport function useCaptchaPayload(): () => Promise<Record<string, string>> {\r\n const ctx = useContext(CaptchaReactContext);\r\n return useCallback(async () => {\r\n if (!ctx?.config?.enabled || !ctx.ready) return {};\r\n return ctx.getCaptchaPayload();\r\n }, [ctx]);\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","React","import_react","token"]}
|
package/dist/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-mobile.ts","../src/hooks/use-analytics.ts","../src/hooks/use-plugin.ts","../src/components/CaptchaProvider.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\n\r\nconst MOBILE_BREAKPOINT = 768;\r\n\r\nexport function useIsMobile(): boolean {\r\n const [isMobile, setIsMobile] = useState<boolean | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\r\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\r\n mql.addEventListener('change', onChange);\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\r\n return () => mql.removeEventListener('change', onChange);\r\n }, []);\r\n\r\n return !!isMobile;\r\n}\r\n","import { useEffect } from 'react';\r\n\r\n/**\r\n * Call from app with pathname from usePathname() (next/navigation).\r\n * Disables tracking on admin routes when pathname starts with /admin.\r\n */\r\nexport function useAnalytics(pathname: string | null): { isAdminRoute: boolean; shouldTrack: boolean } {\r\n const isAdminRoute = pathname != null && pathname.startsWith('/admin');\r\n\r\n useEffect(() => {\r\n if (isAdminRoute && typeof window !== 'undefined') {\r\n if (typeof (window as unknown as { gtag?: () => void }).gtag === 'function') {\r\n (window as unknown as { gtag: () => void }).gtag = () => {};\r\n }\r\n if (Array.isArray((window as unknown as { dataLayer?: unknown[] }).dataLayer)) {\r\n (window as unknown as { dataLayer: unknown[] }).dataLayer = [];\r\n }\r\n }\r\n }, [isAdminRoute]);\r\n\r\n return { isAdminRoute, shouldTrack: !isAdminRoute };\r\n}\r\n","import React, { createContext, useContext, type ReactNode } from 'react';\r\n\r\nconst PluginContext = createContext<{ getPlugin: <T>(name: string) => T | undefined } | null>(null);\r\n\r\nexport function PluginProvider({\r\n getPlugin,\r\n children,\r\n}: {\r\n getPlugin: <T>(name: string) => T | undefined;\r\n children: ReactNode;\r\n}) {\r\n return React.createElement(PluginContext.Provider, { value: { getPlugin } }, children);\r\n}\r\n\r\nexport function usePlugin<T = unknown>(name: string): T | undefined {\r\n const ctx = useContext(PluginContext);\r\n if (!ctx) return undefined;\r\n return ctx.getPlugin<T>(name);\r\n}\r\n","'use client';\r\n\r\nimport React, {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport type { CaptchaPublicConfig, CaptchaProviderId } from '../plugins/captcha';\r\n\r\ndeclare global {\r\n interface Window {\r\n turnstile?: {\r\n render: (el: HTMLElement | string, opts: Record<string, unknown>) => string;\r\n execute: (id: string) => void;\r\n reset: (id: string) => void;\r\n remove: (id: string) => void;\r\n };\r\n grecaptcha?: {\r\n ready: (fn: () => void) => void;\r\n execute: (siteKey: string, opts: { action: string }) => Promise<string>;\r\n };\r\n }\r\n}\r\n\r\ntype CaptchaCtx = {\r\n config: CaptchaPublicConfig | null;\r\n ready: boolean;\r\n selectedProvider: CaptchaProviderId | null;\r\n setSelectedProvider: (p: CaptchaProviderId) => void;\r\n getCaptchaPayload: () => Promise<Record<string, string>>;\r\n};\r\n\r\nconst CaptchaReactContext = createContext<CaptchaCtx | null>(null);\r\n\r\nfunction loadScript(src: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const base = src.split('?')[0] ?? src;\r\n const existing = Array.from(document.querySelectorAll('script[src]')).some((el) =>\r\n (el as HTMLScriptElement).src.startsWith(base)\r\n );\r\n if (existing) {\r\n resolve();\r\n return;\r\n }\r\n const s = document.createElement('script');\r\n s.src = src;\r\n s.async = true;\r\n s.onload = () => resolve();\r\n s.onerror = () => reject(new Error('Failed to load script'));\r\n document.head.appendChild(s);\r\n });\r\n}\r\n\r\nexport function CaptchaProvider({ children }: { children: React.ReactNode }) {\r\n const [config, setConfig] = useState<CaptchaPublicConfig | null>(null);\r\n const [selectedProvider, setSelectedProvider] = useState<CaptchaProviderId | null>(null);\r\n const [ready, setReady] = useState(false);\r\n const turnstileWidgetIdRef = useRef<string | null>(null);\r\n const turnstileContainerRef = useRef<HTMLDivElement | null>(null);\r\n const turnstileTokenRef = useRef<{\r\n resolve: (t: string) => void;\r\n reject: (e: Error) => void;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n fetch('/api/public/captcha-config')\r\n .then((r) => (r.ok ? r.json() : null))\r\n .then((c: CaptchaPublicConfig | null) => {\r\n if (cancelled || !c) return;\r\n setConfig(c);\r\n if (c.enabled && c.activeProvider) setSelectedProvider(c.activeProvider);\r\n })\r\n .catch(() => {})\r\n .finally(() => {\r\n if (!cancelled) setReady(true);\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!config?.enabled || !selectedProvider) return;\r\n const siteKeyFor = config.availableProviders.find((p) => p.id === selectedProvider)?.siteKey;\r\n if (!siteKeyFor) return;\r\n\r\n let cancelled = false;\r\n (async () => {\r\n try {\r\n if (selectedProvider === 'recaptcha_v3') {\r\n await loadScript(\r\n `https://www.google.com/recaptcha/api.js?render=${encodeURIComponent(siteKeyFor)}`\r\n );\r\n } else {\r\n await loadScript('https://challenges.cloudflare.com/turnstile/v0/api.js');\r\n if (cancelled || !turnstileContainerRef.current || !window.turnstile) return;\r\n if (turnstileWidgetIdRef.current) {\r\n try {\r\n window.turnstile.remove(turnstileWidgetIdRef.current);\r\n } catch {\r\n /* ignore */\r\n }\r\n turnstileWidgetIdRef.current = null;\r\n }\r\n const wid = window.turnstile.render(turnstileContainerRef.current, {\r\n sitekey: siteKeyFor,\r\n execution: 'execute',\r\n callback: (token: string) => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.resolve(token);\r\n },\r\n 'error-callback': () => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.reject(new Error('Turnstile error'));\r\n },\r\n 'expired-callback': () => {\r\n const p = turnstileTokenRef.current;\r\n turnstileTokenRef.current = null;\r\n p?.reject(new Error('Turnstile expired'));\r\n },\r\n });\r\n turnstileWidgetIdRef.current = wid;\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n })();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [config, selectedProvider]);\r\n\r\n const getCaptchaPayload = useCallback(async (): Promise<Record<string, string>> => {\r\n if (!config?.enabled || !selectedProvider) return {};\r\n const siteKeyFor = config.availableProviders.find((p) => p.id === selectedProvider)?.siteKey;\r\n if (!siteKeyFor) return {};\r\n\r\n if (selectedProvider === 'recaptcha_v3') {\r\n if (!window.grecaptcha) return {};\r\n const token = await new Promise<string>((resolve, reject) => {\r\n window.grecaptcha!.ready(() => {\r\n window.grecaptcha!.execute(siteKeyFor, { action: 'submit' }).then(resolve).catch(reject);\r\n });\r\n });\r\n return { captchaToken: token, captchaProvider: 'recaptcha_v3' };\r\n }\r\n\r\n const wid = turnstileWidgetIdRef.current;\r\n if (!wid || !window.turnstile) return {};\r\n const token = await new Promise<string>((resolve, reject) => {\r\n turnstileTokenRef.current = { resolve, reject };\r\n try {\r\n window.turnstile!.reset(wid);\r\n window.turnstile!.execute(wid);\r\n } catch (e) {\r\n turnstileTokenRef.current = null;\r\n reject(e instanceof Error ? e : new Error('Turnstile execute failed'));\r\n }\r\n });\r\n return { captchaToken: token, captchaProvider: 'turnstile' };\r\n }, [config, selectedProvider]);\r\n\r\n const ctx = useMemo<CaptchaCtx>(\r\n () => ({\r\n config,\r\n ready,\r\n selectedProvider,\r\n setSelectedProvider,\r\n getCaptchaPayload,\r\n }),\r\n [config, ready, selectedProvider, getCaptchaPayload]\r\n );\r\n\r\n return (\r\n <CaptchaReactContext.Provider value={ctx}>\r\n {config?.enabled && config.multipleProviders ? (\r\n <div className=\"mb-2 text-sm text-muted-foreground max-w-md\">\r\n <label className=\"mr-2\" htmlFor=\"captcha-provider-select\">\r\n Verification\r\n </label>\r\n <select\r\n id=\"captcha-provider-select\"\r\n className=\"border rounded px-2 py-1 bg-background\"\r\n value={selectedProvider ?? ''}\r\n onChange={(e) => setSelectedProvider(e.target.value as CaptchaProviderId)}\r\n >\r\n {config.availableProviders.map((p) => (\r\n <option key={p.id} value={p.id}>\r\n {p.id === 'turnstile' ? 'Cloudflare Turnstile' : 'Google reCAPTCHA v3'}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n ) : null}\r\n <div ref={turnstileContainerRef} className=\"hidden\" aria-hidden />\r\n {children}\r\n </CaptchaReactContext.Provider>\r\n );\r\n}\r\n\r\n/** Returns a function that resolves to captcha fields for JSON bodies, or {} if disabled / not ready. */\r\nexport function useCaptchaPayload(): () => Promise<Record<string, string>> {\r\n const ctx = useContext(CaptchaReactContext);\r\n return useCallback(async () => {\r\n if (!ctx?.config?.enabled || !ctx.ready) return {};\r\n return ctx.getCaptchaPayload();\r\n }, [ctx]);\r\n}\r\n"],"mappings":"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","names":["useEffect","createContext","useContext","useEffect","useState","token"]}
|