@reqdesk/widget 0.4.0 → 0.4.1
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as TicketResult, i as PublicReply, l as TrackedTicketResult, o as SubmitTicketData, r as OidcAuthConfig, s as ThemeConfig, t as CustomerConfig, u as WidgetError } from "./types-i3IgBEjw.cjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/react/types.d.ts
|
|
@@ -44,7 +44,7 @@ declare function ReqdeskProvider({
|
|
|
44
44
|
customer,
|
|
45
45
|
translations,
|
|
46
46
|
children
|
|
47
|
-
}: ReqdeskProviderProps):
|
|
47
|
+
}: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
|
|
48
48
|
//# sourceMappingURL=ReqdeskProvider.d.ts.map
|
|
49
49
|
//#endregion
|
|
50
50
|
//#region src/react/TicketForm.d.ts
|
|
@@ -54,13 +54,13 @@ declare function TicketForm({
|
|
|
54
54
|
onError,
|
|
55
55
|
className,
|
|
56
56
|
style
|
|
57
|
-
}: TicketFormProps):
|
|
57
|
+
}: TicketFormProps): react_jsx_runtime0.JSX.Element;
|
|
58
58
|
//# sourceMappingURL=TicketForm.d.ts.map
|
|
59
59
|
//#endregion
|
|
60
60
|
//#region src/react/SupportPortal.d.ts
|
|
61
61
|
declare function SupportPortal({
|
|
62
62
|
className
|
|
63
|
-
}: SupportPortalProps):
|
|
63
|
+
}: SupportPortalProps): react_jsx_runtime0.JSX.Element;
|
|
64
64
|
//# sourceMappingURL=SupportPortal.d.ts.map
|
|
65
65
|
//#endregion
|
|
66
66
|
//#region src/react/FloatingWidget.d.ts
|
|
@@ -75,7 +75,7 @@ declare function FloatingWidget({
|
|
|
75
75
|
contained,
|
|
76
76
|
onTicketCreated,
|
|
77
77
|
onError
|
|
78
|
-
}: FloatingWidgetProps):
|
|
78
|
+
}: FloatingWidgetProps): react_jsx_runtime0.JSX.Element;
|
|
79
79
|
//#endregion
|
|
80
80
|
//#region src/react/useReqdesk.d.ts
|
|
81
81
|
declare function useReqdesk(): UseReqdeskReturn;
|
|
@@ -87,7 +87,7 @@ interface ShadowRootProps {
|
|
|
87
87
|
}
|
|
88
88
|
declare function ShadowRoot({
|
|
89
89
|
children
|
|
90
|
-
}: ShadowRootProps):
|
|
90
|
+
}: ShadowRootProps): react_jsx_runtime0.JSX.Element;
|
|
91
91
|
//#endregion
|
|
92
92
|
//#region src/storage.d.ts
|
|
93
93
|
interface WidgetConfigPersist {
|
|
@@ -104,4 +104,4 @@ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
|
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { type CustomerConfig, FloatingWidget, type PublicReply, ReqdeskProvider, type ReqdeskProviderProps, ShadowRoot, type SubmitTicketData, SupportPortal, type SupportPortalProps, type ThemeConfig, TicketForm, type TicketFormProps, type TicketResult, type TrackedTicketResult, type UseReqdeskReturn, type WidgetConfigPersist, type WidgetError, loadWidgetConfig as getWidgetDefaults, useReqdesk };
|
|
107
|
-
//# sourceMappingURL=react-
|
|
107
|
+
//# sourceMappingURL=react-PYPqwxcj.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-
|
|
1
|
+
{"version":3,"file":"react-PYPqwxcj.d.cts","names":[],"sources":["../src/react/types.ts","../src/react/ReqdeskProvider.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/FloatingWidget.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/storage.ts"],"mappings":";;;;;UAIiB,oBAAA;;SAER;EAFQ,KAAA,CAAA,EAGP,WAHO;EAAoB,QAAA,CAAA,EAAA,MAAA;UAE5B,CAAA,EAGI,cAHJ;cACC,CAAA,EAGO,MAHP,CAAA,MAAA,EAAA,MAAA,CAAA;UAEG,EAED,KAAA,CAAM,SAFL;;AAED,UAGK,eAAA,CAHC;EAAS,IAAA,CAAA,EAAA,UAAA,GAAA,QAAA;EAGV,QAAA,CAAA,EAAA,cAAe,GAAA,aAAA;EAAA,eAAA,CAAA,EAAA,MAAA;iBAIH,CAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,GAAA,IAAA;SACT,CAAA,EAAA,CAAA,KAAA,EAAA,WAAA,EAAA,GAAA,IAAA;WAEJ,CAAA,EAAA,MAAA;EAAa,KAAA,CAAA,EAAnB,KAAA,CAAM,aAAa;AAG7B;AAOiB,UAPA,kBAAA,CAOgB;EAAA,eAAA,CAAA,EAAA,MAAA;kBACZ,CAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAAA,IAAA;WAA2B,CAAA,EAAA,MAAA;OAAR,CAAA,EAJ9B,KAAA,CAAM,aAIwB;;AACV,UAFb,gBAAA,CAEa;cACsB,CAAA,IAAA,EAF/B,gBAE+B,CAAA,EAFZ,OAEY,CAFJ,YAEI,CAAA;aAE3C,CAAA,KAAA,EAAA,MAAA,CAAA,EAHqB,OAGrB,CAH6B,mBAG7B,CAAA;EAAW,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAFgC,OAEhC,CAAA,IAAA,CAAA;;SAAX;;;;iBCAO,eAAA;;;;;;;;GAAqF,uBAAoB,kBAAA,CAAA,GAAA,CAAA;;;;iBCxBzG,UAAA;;;;;;GAA4E,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;;iBCN3F,aAAA;;GAA6B,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;;UCYrD,mBAAA;;;6BAGmB;EJjBZ,OAAA,CAAA,EAAA,CAAA,KAAA,EIkBG,WJlBiB,EAAA,GAAA,IAAA;;AAE5B,iBIuCO,cAAA,CJvCP;EAAA,QAAA;EAAA,SAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EI4CN,mBJ5CM,CAAA,EI4Ca,kBAAA,CAAA,GAAA,CAAA,OJ5Cb;;;iBKDO,UAAA,CAAA,GAAc;;;;UCDpB,eAAA;YACE;;iBAGI,UAAA;;GAAyB,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;UCRvC,mBAAA;;;;;IPIA,IAAA,CAAA,EAAA,OAAA,GAAA,MAAoB,GAAA,MAAA;EAAA,CAAA;QAE5B,CAAA,EAAA,aAAA,GAAA,gBAAA;;AAYoB,iBO6Eb,gBAAA,CP7Ea,MAAA,EAAA,MAAA,CAAA,EO6EqB,mBP7ErB,GAAA,IAAA"}
|
package/dist/react.cjs
CHANGED
|
@@ -38,7 +38,7 @@ function onAuthStateChange(listener) {
|
|
|
38
38
|
}
|
|
39
39
|
function initWidgetAuth(config) {
|
|
40
40
|
if (!earlyInitCalled) {
|
|
41
|
-
(0, oidc_spa_entrypoint.oidcEarlyInit)();
|
|
41
|
+
(0, oidc_spa_entrypoint.oidcEarlyInit)({ BASE_URL: "/" });
|
|
42
42
|
earlyInitCalled = true;
|
|
43
43
|
}
|
|
44
44
|
initPromise = _initWidgetAuth(config);
|
package/dist/react.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './react-
|
|
1
|
+
export * from './react-PYPqwxcj.cjs';
|
package/dist/react.js
CHANGED
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","names":["apiSubmitTicket","apiTrackTicket","apiSubmitTrackingReply","translations","translations","formatFileSize","apiSubmitTicket","translations","translations","translations"],"sources":["../src/auth/widget-auth.ts","../src/react/ReqdeskProvider.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/queries.ts","../src/client-metadata.ts","../src/react/views/SubmitTicketView.tsx","../src/react/views/MyTicketsView.tsx","../src/react/views/TicketDetailView.tsx","../src/react/views/TrackTicketView.tsx","../src/react/FloatingWidget.tsx"],"sourcesContent":["import { oidcEarlyInit } from 'oidc-spa/entrypoint'\nimport { createOidc } from 'oidc-spa/core'\nimport type { OidcAuthConfig } from '../types'\nimport { setOidcTokenProvider } from '../ofetch-client'\n\nexport interface WidgetAuthState {\n isAuthenticated: boolean\n isLoading: boolean\n userEmail?: string\n userName?: string\n}\n\ntype AuthStateListener = (state: WidgetAuthState) => void\n\nlet authState: WidgetAuthState = { isAuthenticated: false, isLoading: false }\nlet listeners: AuthStateListener[] = []\nlet oidcInstance: any = null\nlet initPromise: Promise<void> | null = null\nlet earlyInitCalled = false\n\nfunction notify() {\n for (const listener of listeners) {\n try { listener(authState) } catch { /* ignore */ }\n }\n}\n\nfunction setState(update: Partial<WidgetAuthState>) {\n authState = { ...authState, ...update }\n notify()\n}\n\nexport function getAuthState(): WidgetAuthState {\n return authState\n}\n\nexport function onAuthStateChange(listener: AuthStateListener): () => void {\n listeners.push(listener)\n return () => {\n listeners = listeners.filter(l => l !== listener)\n }\n}\n\nexport function initWidgetAuth(config: OidcAuthConfig): Promise<void> {\n // oidcEarlyInit MUST be called synchronously before createOidc.\n // It handles the OIDC callback redirect and sets up internal state.\n if (!earlyInitCalled) {\n oidcEarlyInit()\n earlyInitCalled = true\n }\n\n initPromise = _initWidgetAuth(config)\n return initPromise\n}\n\nasync function _initWidgetAuth(config: OidcAuthConfig): Promise<void> {\n setState({ isLoading: true })\n\n try {\n const oidc = await createOidc({\n issuerUri: config.issuerUri,\n clientId: config.clientId,\n })\n\n oidcInstance = oidc\n\n if (oidc.isUserLoggedIn) {\n setOidcTokenProvider(() => oidc.getTokens())\n\n const tokens = await oidc.getTokens()\n const payload = decodeJwtPayload(tokens.accessToken)\n\n setState({\n isAuthenticated: true,\n isLoading: false,\n userEmail: payload?.email,\n userName: payload?.name ?? payload?.preferred_username,\n })\n\n oidc.subscribeToTokensChange(async (newTokens) => {\n const p = decodeJwtPayload(newTokens.accessToken)\n setState({\n userEmail: p?.email ?? authState.userEmail,\n userName: p?.name ?? p?.preferred_username ?? authState.userName,\n })\n })\n } else {\n setState({ isAuthenticated: false, isLoading: false })\n }\n } catch (err) {\n console.warn('[reqdesk-widget] oidc-spa initialization failed:', err)\n setState({ isAuthenticated: false, isLoading: false })\n }\n}\n\nexport async function login(): Promise<void> {\n if (!oidcInstance && initPromise) {\n await initPromise\n }\n if (!oidcInstance) {\n console.warn('[reqdesk-widget] Cannot login: OIDC not initialized. Check auth config.')\n return\n }\n await oidcInstance.login({ doesCurrentHrefRequiresAuth: false })\n}\n\nexport async function logout(): Promise<void> {\n if (!oidcInstance) return\n setOidcTokenProvider(null)\n setState({ isAuthenticated: false, userEmail: undefined, userName: undefined })\n await oidcInstance.logout({ redirectTo: 'current page' })\n}\n\nexport function isAuthConfigured(): boolean {\n return oidcInstance !== null\n}\n\nfunction decodeJwtPayload(token: string): Record<string, any> | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const payload = atob(parts[1].replace(/-/g, '+').replace(/_/g, '/'))\n return JSON.parse(payload)\n } catch {\n return null\n }\n}\n","import { createContext, useContext, useMemo, useEffect, useRef, useState } from 'react'\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\r\nimport { configureWidgetClient } from '../ofetch-client'\r\nimport { loadWidgetConfig, saveWidgetConfig } from '../storage'\r\nimport { initWidgetAuth, getAuthState, onAuthStateChange, type WidgetAuthState } from '../auth/widget-auth'\r\nimport type { ReqdeskProviderProps, ReqdeskContextValue } from './types'\r\n\r\nconst ReqdeskContext = createContext<ReqdeskContextValue | null>(null)\r\n\r\nexport function useReqdeskContext(): ReqdeskContextValue {\r\n const ctx = useContext(ReqdeskContext)\r\n if (!ctx) throw new Error('useReqdesk must be used within a <ReqdeskProvider>')\r\n return ctx\r\n}\r\n\r\n// Widget-scoped QueryClient — completely isolated from host app\r\nconst widgetQueryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 10 * 60 * 1000,\r\n retry: (failureCount, error) => {\r\n const status = (error as any)?.status ?? (error as any)?.statusCode\r\n if (status && status >= 400 && status < 500 && status !== 408) return false\r\n if (status && status >= 500) return false\r\n return failureCount < 2\r\n },\r\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\r\n refetchOnWindowFocus: false,\r\n },\r\n mutations: {\r\n retry: false,\r\n },\r\n },\r\n})\r\n\r\nexport function ReqdeskProvider({ apiKey, auth, theme, language, customer, translations, children }: ReqdeskProviderProps) {\r\n const initialized = useRef(false)\r\n const [authState, setAuthState] = useState<WidgetAuthState>(getAuthState)\r\n\r\n const saved = initialized.current ? null : loadWidgetConfig(apiKey)\r\n const resolvedLanguage = language ?? saved?.language ?? 'en'\r\n const resolvedTheme = theme ?? saved?.theme\r\n\r\n useEffect(() => {\r\n if (!initialized.current) {\r\n configureWidgetClient(window.location.origin, apiKey)\r\n initialized.current = true\r\n\r\n if (auth) {\r\n initWidgetAuth(auth)\r\n }\r\n }\r\n }, [apiKey, auth])\r\n\r\n useEffect(() => {\r\n return onAuthStateChange(setAuthState)\r\n }, [])\r\n\r\n useEffect(() => {\r\n saveWidgetConfig(apiKey, {\r\n language: resolvedLanguage,\r\n theme: resolvedTheme,\r\n })\r\n }, [apiKey, resolvedLanguage, resolvedTheme])\r\n\r\n const value = useMemo<ReqdeskContextValue>(() => ({\r\n apiKey,\r\n auth,\r\n theme: resolvedTheme,\r\n language: resolvedLanguage,\r\n customer,\r\n translations,\r\n isAuthenticated: authState.isAuthenticated,\r\n userEmail: authState.userEmail,\r\n userName: authState.userName,\r\n }), [apiKey, auth, resolvedTheme, resolvedLanguage, customer, translations, authState])\r\n\r\n return (\r\n <ReqdeskContext.Provider value={value}>\r\n <QueryClientProvider client={widgetQueryClient}>\r\n {children}\r\n </QueryClientProvider>\r\n </ReqdeskContext.Provider>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { submitTicket as apiSubmitTicket, trackTicket as apiTrackTicket, submitTrackingReply as apiSubmitTrackingReply } from '../api-client'\r\nimport type { SubmitTicketData, TicketResult, TrackedTicketResult, WidgetError, UseReqdeskReturn } from './types'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\n\r\nexport function useReqdesk(): UseReqdeskReturn {\r\n useReqdeskContext() // ensure we're inside a provider\r\n\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [error, setError] = useState<WidgetError | null>(null)\r\n\r\n const submitTicket = useCallback(async (data: SubmitTicketData): Promise<TicketResult> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n const result = await apiSubmitTicket('_current', data)\r\n return result\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n const trackTicket = useCallback(async (token: string): Promise<TrackedTicketResult> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n const result = await apiTrackTicket(token)\r\n return result\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n const submitTrackingReply = useCallback(async (token: string, body: string): Promise<void> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n await apiSubmitTrackingReply(token, body)\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n return { submitTicket, trackTicket, submitTrackingReply, isLoading, error }\r\n}\r\n","import { useRef, useEffect, useState, type ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { getWidgetStyles } from '../theme'\r\n\r\ninterface ShadowRootProps {\r\n children: ReactNode\r\n}\r\n\r\nexport function ShadowRoot({ children }: ShadowRootProps) {\r\n const hostRef = useRef<HTMLDivElement>(null)\r\n const [mountPoint, setMountPoint] = useState<HTMLElement | null>(null)\r\n\r\n useEffect(() => {\r\n const host = hostRef.current\r\n if (!host || host.shadowRoot) return\r\n\r\n const shadow = host.attachShadow({ mode: 'open' })\r\n\r\n const style = document.createElement('style')\r\n style.textContent = getWidgetStyles()\r\n shadow.appendChild(style)\r\n\r\n const mount = document.createElement('div')\r\n mount.className = 'rqd-root'\r\n shadow.appendChild(mount)\r\n\r\n setMountPoint(mount)\r\n }, [])\r\n\r\n return (\r\n <div ref={hostRef}>\r\n {mountPoint && createPortal(children, mountPoint)}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback, type FormEvent } from 'react'\r\nimport { useReqdesk } from './useReqdesk'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\nimport { en } from '../i18n/en'\r\nimport { ar } from '../i18n/ar'\r\nimport { themeToStyle } from '../theme'\r\nimport { saveTrackingToken } from '../storage'\r\nimport type { TicketFormProps, TicketResult, WidgetError, SubmitTicketData } from './types'\r\nimport { ShadowRoot } from './shadow-root'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\nexport function TicketForm({ mode = 'inline', onTicketCreated, onError, className, style }: TicketFormProps) {\r\n const ctx = useReqdeskContext()\r\n const { submitTicket, isLoading } = useReqdesk()\r\n const [success, setSuccess] = useState<TicketResult | null>(null)\r\n const [errors, setErrors] = useState<Record<string, string>>({})\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const handleSubmit = useCallback(async (e: FormEvent<HTMLFormElement>) => {\r\n e.preventDefault()\r\n const form = e.currentTarget\r\n const formData = new FormData(form)\r\n\r\n const title = (formData.get('title') as string)?.trim() ?? ''\r\n const email = (formData.get('email') as string)?.trim() ?? ''\r\n const newErrors: Record<string, string> = {}\r\n\r\n if (!title) newErrors.title = t('error.required')\r\n else if (title.length < 5) newErrors.title = t('error.titleMin')\r\n if (!email) newErrors.email = t('error.required')\r\n else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) newErrors.email = t('error.emailInvalid')\r\n\r\n if (Object.keys(newErrors).length > 0) {\r\n setErrors(newErrors)\r\n return\r\n }\r\n\r\n setErrors({})\r\n const data: SubmitTicketData = {\r\n title,\r\n description: (formData.get('description') as string)?.trim() || undefined,\r\n email,\r\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\r\n }\r\n\r\n try {\r\n const result = await submitTicket(data)\r\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\r\n setSuccess(result)\r\n onTicketCreated?.(result)\r\n } catch (err) {\r\n onError?.(err as WidgetError)\r\n }\r\n }, [submitTicket, ctx.apiKey, ctx.translations, ctx.language, onTicketCreated, onError, t])\r\n\r\n const cssVars = themeToStyle(ctx.theme)\r\n\r\n const content = success ? (\r\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\r\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\r\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\r\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\r\n {success.trackingToken && (\r\n <>\r\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\r\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n onClick={() => navigator.clipboard.writeText(success.trackingToken!)}\r\n >\r\n {t('success.copyToken')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.title')}</label>\r\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\r\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.description')}</label>\r\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.email')}</label>\r\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} required />\r\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.priority')}</label>\r\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\r\n <option value=\"low\">{t('form.priorityLow')}</option>\r\n <option value=\"medium\">{t('form.priorityMedium')}</option>\r\n <option value=\"high\">{t('form.priorityHigh')}</option>\r\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\r\n </select>\r\n </div>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={isLoading}>\r\n {isLoading ? t('form.submitting') : t('form.submit')}\r\n </button>\r\n </form>\r\n )\r\n\r\n if (mode === 'floating') {\r\n return (\r\n <ShadowRoot>\r\n <div className={className} style={{ ...style, ...cssVars } as React.CSSProperties}>\r\n <div className=\"rqd-body\">{content}</div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n }\r\n\r\n return (\r\n <ShadowRoot>\r\n <div className={`rqd-inline ${className ?? ''}`} style={cssVars as React.CSSProperties}>\r\n <div className=\"rqd-body\">{content}</div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n","import { useReqdeskContext } from './ReqdeskProvider'\r\nimport { useReqdesk } from './useReqdesk'\r\nimport { themeToStyle } from '../theme'\r\nimport { ShadowRoot } from './shadow-root'\r\nimport type { SupportPortalProps } from './types'\r\n\r\nexport function SupportPortal({ className }: SupportPortalProps) {\r\n const ctx = useReqdeskContext()\r\n const { isLoading } = useReqdesk()\r\n const cssVars = themeToStyle(ctx.theme)\r\n\r\n return (\r\n <ShadowRoot>\r\n <div className={`rqd-inline ${className ?? ''}`} style={cssVars as React.CSSProperties}>\r\n <div className=\"rqd-body\">\r\n {isLoading ? (\r\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)' }}>Loading...</p>\r\n ) : (\r\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)', padding: '24px 0' }}>\r\n Support Portal — coming in a future update.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n","import { queryOptions, keepPreviousData } from '@tanstack/react-query'\r\nimport { getTicketDetail, listMyTickets, resolveWidgetUser, trackTicket, getCategories } from '../api-client'\r\n\r\nexport const widgetTicketDetailOptions = (ticketId: string) =>\r\n queryOptions({\r\n queryKey: ['widget-ticket', ticketId],\r\n queryFn: () => getTicketDetail(ticketId),\r\n staleTime: 60_000,\r\n enabled: !!ticketId,\r\n })\r\n\r\nexport const widgetMyTicketsOptions = (projectId: string, userId: string) =>\r\n queryOptions({\r\n queryKey: ['widget-tickets', projectId, userId],\r\n queryFn: () => listMyTickets(projectId, userId),\r\n staleTime: 30_000,\r\n placeholderData: keepPreviousData,\r\n enabled: !!userId,\r\n })\r\n\r\nexport const widgetUserOptions = (projectId: string, email: string) =>\r\n queryOptions({\r\n queryKey: ['widget-user', projectId, email],\r\n queryFn: () => resolveWidgetUser(projectId, email),\r\n staleTime: 5 * 60_000,\r\n enabled: !!email,\r\n })\r\n\r\nexport const widgetTrackTicketOptions = (token: string) =>\r\n queryOptions({\r\n queryKey: ['widget-track', token],\r\n queryFn: () => trackTicket(token),\r\n staleTime: 60_000,\r\n enabled: !!token,\r\n })\r\n\r\nexport const widgetCategoriesOptions = (projectId: string, parentId?: string | null) =>\r\n queryOptions({\r\n queryKey: ['widget-categories', projectId, parentId ?? 'root'],\r\n queryFn: () => getCategories(projectId, parentId),\r\n staleTime: 5 * 60_000,\r\n })\r\n","const STORAGE_PREFIX = 'reqdesk_diag_'\n\nexport interface MetadataPreferences {\n screenResolution: boolean\n deviceType: boolean\n timezone: boolean\n referrerUrl: boolean\n language: boolean\n platform: boolean\n}\n\nconst DEFAULT_PREFS: MetadataPreferences = {\n screenResolution: false,\n deviceType: false,\n timezone: false,\n referrerUrl: false,\n language: false,\n platform: false,\n}\n\n/** Always collected — minimal, non-sensitive */\nexport function collectMinimalMetadata(): Record<string, string> {\n const meta: Record<string, string> = {}\n try {\n meta.pageUrl = window.location.href\n meta.userAgent = navigator.userAgent\n } catch { /* SSR safety */ }\n return meta\n}\n\n/** Full diagnostic set — only included for opted-in fields */\nexport function collectDiagnosticMetadata(prefs: MetadataPreferences): Record<string, string> {\n const meta: Record<string, string> = {}\n try {\n if (prefs.screenResolution) meta.screenResolution = `${screen.width}x${screen.height}`\n if (prefs.deviceType) meta.deviceType = detectDeviceType()\n if (prefs.timezone) meta.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (prefs.referrerUrl && document.referrer) meta.referrerUrl = document.referrer\n if (prefs.language) meta.language = navigator.language\n if (prefs.platform) meta.platform = navigator.platform\n } catch { /* SSR safety */ }\n return meta\n}\n\n/** Combine minimal + opted-in diagnostic metadata */\nexport function collectAllMetadata(apiKey: string): Record<string, string> {\n const prefs = getMetadataPreferences(apiKey)\n return {\n ...collectMinimalMetadata(),\n ...collectDiagnosticMetadata(prefs),\n }\n}\n\nexport function getMetadataPreferences(apiKey: string): MetadataPreferences {\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${apiKey}`)\n if (raw) return { ...DEFAULT_PREFS, ...JSON.parse(raw) }\n } catch { /* ignore */ }\n return { ...DEFAULT_PREFS }\n}\n\nexport function saveMetadataPreferences(apiKey: string, prefs: MetadataPreferences): void {\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${apiKey}`, JSON.stringify(prefs))\n } catch { /* ignore */ }\n}\n\nexport function isDiagnosticEnabled(apiKey: string): boolean {\n const prefs = getMetadataPreferences(apiKey)\n return Object.values(prefs).some(v => v)\n}\n\nfunction detectDeviceType(): string {\n const ua = navigator.userAgent.toLowerCase()\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android.*mobile|windows phone/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\nexport const DIAGNOSTIC_FIELDS = [\n { key: 'screenResolution' as const, labelKey: 'diag.screenResolution' },\n { key: 'deviceType' as const, labelKey: 'diag.deviceType' },\n { key: 'timezone' as const, labelKey: 'diag.timezone' },\n { key: 'referrerUrl' as const, labelKey: 'diag.referrerUrl' },\n { key: 'language' as const, labelKey: 'diag.language' },\n { key: 'platform' as const, labelKey: 'diag.platform' },\n] as const\n","import { useState, useRef, useCallback, type FormEvent, type DragEvent } from 'react'\r\nimport { useMutation, useQuery } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetCategoriesOptions } from '../queries'\r\nimport { submitTicket as apiSubmitTicket, uploadAttachment, type CategoryItem } from '../../api-client'\r\nimport { saveTrackingToken, saveWidgetEmail, loadWidgetEmail } from '../../storage'\r\nimport { collectAllMetadata, getMetadataPreferences, saveMetadataPreferences, collectDiagnosticMetadata, DIAGNOSTIC_FIELDS, type MetadataPreferences } from '../../client-metadata'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\nimport type { TicketResult, WidgetError, SubmitTicketData } from '../types'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\nconst ALLOWED_MIME_TYPES = new Set([\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp',\r\n 'application/pdf',\r\n 'text/plain', 'text/csv',\r\n 'application/zip', 'application/x-zip-compressed',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n])\r\n\r\nconst BLOCKED_EXTENSIONS = new Set(['.exe', '.bat', '.cmd', '.sh', '.ps1', '.msi', '.dll', '.scr'])\r\nconst MAX_FILES = 5\r\nconst MAX_SIZE_MB = 10\r\n\r\ninterface SubmitTicketViewProps {\r\n projectId: string\r\n onSuccess?: (result: TicketResult) => void\r\n onError?: (error: WidgetError) => void\r\n isAuthenticated?: boolean\r\n userEmail?: string\r\n}\r\n\r\ninterface QueuedFile {\r\n file: File\r\n id: string\r\n error?: string\r\n}\r\n\r\ninterface UploadProgress {\r\n fileId: string\r\n fileName: string\r\n percent: number\r\n}\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\r\n}\r\n\r\nexport function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, userEmail }: SubmitTicketViewProps) {\r\n const ctx = useReqdeskContext()\r\n const fileInputRef = useRef<HTMLInputElement>(null)\r\n const savedEmail = loadWidgetEmail(ctx.apiKey)\r\n\r\n const [errors, setErrors] = useState<Record<string, string>>({})\r\n const [files, setFiles] = useState<QueuedFile[]>([])\r\n const [isDragOver, setIsDragOver] = useState(false)\r\n const [uploadProgress, setUploadProgress] = useState<UploadProgress | null>(null)\r\n const [success, setSuccess] = useState<TicketResult | null>(null)\r\n const [rememberEmail, setRememberEmail] = useState(!!savedEmail)\r\n\r\n // Category selector state\r\n const [categoryPath, setCategoryPath] = useState<CategoryItem[]>([])\r\n const [selectedCategory, setSelectedCategory] = useState<CategoryItem | null>(null)\r\n const currentParentId = categoryPath.length > 0 ? categoryPath[categoryPath.length - 1].id : null\r\n const { data: categories = [] } = useQuery(widgetCategoriesOptions(projectId, currentParentId))\r\n\r\n // Diagnostic metadata state\r\n const [diagOpen, setDiagOpen] = useState(false)\r\n const [diagPrefs, setDiagPrefs] = useState<MetadataPreferences>(getMetadataPreferences(ctx.apiKey))\r\n const diagValues = collectDiagnosticMetadata({\r\n screenResolution: true, deviceType: true, timezone: true,\r\n referrerUrl: true, language: true, platform: true,\r\n })\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const submitMutation = useMutation({\r\n mutationFn: async ({ data, validFiles }: { data: SubmitTicketData; validFiles: QueuedFile[] }) => {\r\n const result = await apiSubmitTicket(projectId, data)\r\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\r\n\r\n // Upload attachments sequentially after ticket creation\r\n for (const queued of validFiles) {\r\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent: 0 })\r\n await uploadAttachment(result.id, queued.file, (percent) => {\r\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent })\r\n })\r\n }\r\n setUploadProgress(null)\r\n return result\r\n },\r\n onSuccess: (result) => {\r\n setSuccess(result)\r\n onSuccess?.(result)\r\n },\r\n onError: (err) => {\r\n setUploadProgress(null)\r\n onError?.(err as unknown as WidgetError)\r\n },\r\n })\r\n\r\n function validateFile(file: File): string | null {\r\n const ext = '.' + file.name.split('.').pop()?.toLowerCase()\r\n if (BLOCKED_EXTENSIONS.has(ext)) return t('attach.invalidType')\r\n if (!ALLOWED_MIME_TYPES.has(file.type) && !file.type.startsWith('application/vnd.openxmlformats-officedocument.')) {\r\n return t('attach.invalidType')\r\n }\r\n if (file.size > MAX_SIZE_MB * 1024 * 1024) return t('attach.tooLarge')\r\n return null\r\n }\r\n\r\n function addFiles(newFiles: FileList | File[]) {\r\n const toAdd: QueuedFile[] = []\r\n for (const file of Array.from(newFiles)) {\r\n if (files.length + toAdd.length >= MAX_FILES) break\r\n const error = validateFile(file)\r\n toAdd.push({ file, id: crypto.randomUUID(), error: error ?? undefined })\r\n }\r\n setFiles(prev => [...prev, ...toAdd])\r\n }\r\n\r\n function removeFile(id: string) {\r\n setFiles(prev => prev.filter(f => f.id !== id))\r\n }\r\n\r\n function handleDragOver(e: DragEvent) { e.preventDefault(); setIsDragOver(true) }\r\n function handleDragLeave(e: DragEvent) { e.preventDefault(); setIsDragOver(false) }\r\n function handleDrop(e: DragEvent) {\r\n e.preventDefault(); setIsDragOver(false)\r\n if (e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files)\r\n }\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n const form = e.currentTarget\r\n const formData = new FormData(form)\r\n\r\n const title = (formData.get('title') as string)?.trim() ?? ''\r\n const email = (formData.get('email') as string)?.trim() ?? userEmail ?? ''\r\n const newErrors: Record<string, string> = {}\r\n\r\n if (!title) newErrors.title = t('error.required')\r\n else if (title.length < 5) newErrors.title = t('error.titleMin')\r\n if (!isAuthenticated && email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\r\n newErrors.email = t('error.emailInvalid')\r\n }\r\n\r\n if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return }\r\n setErrors({})\r\n\r\n if (rememberEmail && email) saveWidgetEmail(ctx.apiKey, email)\r\n\r\n // Save diagnostic preferences\r\n saveMetadataPreferences(ctx.apiKey, diagPrefs)\r\n\r\n const validFiles = files.filter(f => !f.error)\r\n const data: SubmitTicketData = {\r\n title,\r\n description: (formData.get('description') as string)?.trim() || undefined,\r\n email,\r\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\r\n categoryId: selectedCategory?.id,\r\n clientMetadata: collectAllMetadata(ctx.apiKey),\r\n }\r\n\r\n submitMutation.mutate({ data, validFiles })\r\n }\r\n\r\n if (success) {\r\n return (\r\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\r\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\r\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\r\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\r\n {success.trackingToken && (\r\n <>\r\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\r\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\r\n <button className=\"rqd-btn rqd-btn-secondary\" onClick={() => navigator.clipboard.writeText(success.trackingToken!)}>\r\n {t('success.copyToken')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (submitMutation.isPending && uploadProgress) {\r\n return (\r\n <div style={{ padding: '24px 0', textAlign: 'center' }}>\r\n <p style={{ marginBottom: 12, fontWeight: 500 }}>{t('attach.uploading')}</p>\r\n <div className=\"rqd-file-item\" style={{ marginBottom: 8 }}>\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{uploadProgress.fileName}</span>\r\n </div>\r\n <span style={{ fontSize: 12, color: 'var(--rqd-text-secondary)' }}>{uploadProgress.percent}%</span>\r\n </div>\r\n <div className=\"rqd-progress\">\r\n <div className=\"rqd-progress-bar\" style={{ width: `${uploadProgress.percent}%` }} />\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.title')}</label>\r\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\r\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.description')}</label>\r\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\r\n </div>\r\n {!isAuthenticated && (\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.email')}</label>\r\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} defaultValue={userEmail ?? savedEmail ?? ''} />\r\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\r\n <label className=\"rqd-checkbox-label\" style={{ marginTop: 6 }}>\r\n <input type=\"checkbox\" checked={rememberEmail} onChange={(e) => setRememberEmail(e.target.checked)} />\r\n {t('mytickets.rememberMe')}\r\n </label>\r\n </div>\r\n )}\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.priority')}</label>\r\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\r\n <option value=\"low\">{t('form.priorityLow')}</option>\r\n <option value=\"medium\">{t('form.priorityMedium')}</option>\r\n <option value=\"high\">{t('form.priorityHigh')}</option>\r\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* Category Selector */}\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.categorySelected')}</label>\r\n {selectedCategory ? (\r\n <div className=\"rqd-category-selected\">\r\n <span>\r\n {categoryPath.map(c => c.name).join(' > ')}{categoryPath.length > 0 ? ' > ' : ''}{selectedCategory.name}\r\n </span>\r\n <button type=\"button\" onClick={() => { setSelectedCategory(null); setCategoryPath([]) }}>×</button>\r\n </div>\r\n ) : (\r\n <>\r\n {categoryPath.length > 0 && (\r\n <div className=\"rqd-category-breadcrumb\">\r\n <button type=\"button\" onClick={() => setCategoryPath([])}>{t('form.categoryPlaceholder')}</button>\r\n {categoryPath.map((c, i) => (\r\n <span key={c.id}>\r\n <span className=\"rqd-category-breadcrumb-sep\">›</span>\r\n <button type=\"button\" onClick={() => setCategoryPath(prev => prev.slice(0, i + 1))}>{c.name}</button>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n <div className=\"rqd-category-list\">\r\n {categories.map(cat => (\r\n <button\r\n key={cat.id}\r\n type=\"button\"\r\n className=\"rqd-category-item\"\r\n onClick={() => {\r\n if (cat.hasChildren) {\r\n setCategoryPath(prev => [...prev, cat])\r\n } else {\r\n setSelectedCategory(cat)\r\n }\r\n }}\r\n >\r\n {cat.name}\r\n {cat.hasChildren && <span className=\"rqd-category-item-chevron\">›</span>}\r\n </button>\r\n ))}\r\n {categories.length === 0 && categoryPath.length === 0 && (\r\n <span style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('form.categoryPlaceholder')}</span>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Diagnostic Metadata */}\r\n <div className=\"rqd-form-group\">\r\n <button\r\n type=\"button\"\r\n className=\"rqd-diag-toggle\"\r\n onClick={() => setDiagOpen(prev => !prev)}\r\n >\r\n <span>{t('diag.title')}</span>\r\n <span>{diagOpen ? '\\u25B2' : '\\u25BC'}</span>\r\n </button>\r\n {diagOpen && (\r\n <div className=\"rqd-diag-panel\">\r\n <p style={{ fontSize: 12, color: 'var(--rqd-text-secondary)', margin: '0 0 6px' }}>{t('diag.hint')}</p>\r\n {DIAGNOSTIC_FIELDS.map(field => (\r\n <label key={field.key} className=\"rqd-diag-item\">\r\n <input\r\n type=\"checkbox\"\r\n checked={diagPrefs[field.key]}\r\n onChange={(e) => setDiagPrefs(prev => ({ ...prev, [field.key]: e.target.checked }))}\r\n />\r\n <span>{t(field.labelKey)}</span>\r\n <span className=\"rqd-diag-item-value\">{diagValues[field.key] ?? '—'}</span>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.attachment')}</label>\r\n <div\r\n className={`rqd-dropzone${isDragOver ? ' rqd-dropzone-active' : ''}`}\r\n onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\r\n onClick={() => fileInputRef.current?.click()}\r\n >\r\n {isDragOver ? t('attach.dropzoneActive') : t('attach.dropzone')}\r\n <input ref={fileInputRef} type=\"file\" multiple style={{ display: 'none' }}\r\n onChange={(e) => { if (e.target.files) addFiles(e.target.files); e.target.value = '' }} />\r\n </div>\r\n {files.length > 0 && (\r\n <div className=\"rqd-file-list\">\r\n {files.map(f => (\r\n <div key={f.id} className=\"rqd-file-item\">\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{f.file.name}</span>\r\n <span className=\"rqd-file-item-size\">\r\n {formatFileSize(f.file.size)}\r\n {f.error && <span style={{ color: '#e74c3c', marginLeft: 6 }}>{f.error}</span>}\r\n </span>\r\n </div>\r\n <button className=\"rqd-file-remove\" onClick={() => removeFile(f.id)} type=\"button\">×</button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={submitMutation.isPending}>\r\n {submitMutation.isPending ? t('form.submitting') : t('form.submit')}\r\n </button>\r\n </form>\r\n )\r\n}\r\n","import { useState, useEffect, useCallback, type FormEvent } from 'react'\r\nimport { useQuery } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetMyTicketsOptions, widgetUserOptions } from '../queries'\r\nimport { trackTicket, type TicketListItem } from '../../api-client'\r\nimport { saveWidgetEmail, loadWidgetEmail, getTrackingTokens } from '../../storage'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface MyTicketsViewProps {\r\n projectId: string\r\n onSelectTicket: (ticketId: string) => void\r\n isAuthenticated?: boolean\r\n userEmail?: string\r\n}\r\n\r\nexport function MyTicketsView({ projectId, onSelectTicket, isAuthenticated, userEmail }: MyTicketsViewProps) {\r\n const ctx = useReqdeskContext()\r\n const savedEmail = loadWidgetEmail(ctx.apiKey)\r\n\r\n const [email, setEmail] = useState(userEmail ?? savedEmail ?? '')\r\n const [rememberMe, setRememberMe] = useState(!!savedEmail)\r\n const [submittedEmail, setSubmittedEmail] = useState<string | null>(\r\n isAuthenticated && userEmail ? userEmail : savedEmail,\r\n )\r\n const [tokenTickets, setTokenTickets] = useState<TicketListItem[]>([])\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n // Resolve email → userId\r\n const { data: widgetUser } = useQuery(widgetUserOptions(projectId, submittedEmail ?? ''))\r\n const userId = widgetUser?.userId ?? ''\r\n\r\n // Fetch tickets once userId is resolved\r\n const { data: emailTickets = [], isLoading } = useQuery(widgetMyTicketsOptions(projectId, userId))\r\n\r\n // Also load token-based tickets\r\n useEffect(() => {\r\n const tokens = getTrackingTokens(ctx.apiKey)\r\n if (tokens.length === 0) return\r\n\r\n Promise.allSettled(\r\n tokens.slice(0, 5).map(tk => trackTicket(tk)),\r\n ).then(results => {\r\n const tracked: TicketListItem[] = []\r\n for (const r of results) {\r\n if (r.status === 'fulfilled') {\r\n const t = r.value\r\n if (!emailTickets.some(et => et.id === t.id)) {\r\n tracked.push({\r\n id: t.id,\r\n ticketNumber: t.ticketNumber,\r\n title: t.title,\r\n status: t.status,\r\n priority: t.priority,\r\n createdAt: t.createdAt,\r\n })\r\n }\r\n }\r\n }\r\n setTokenTickets(tracked)\r\n })\r\n }, [ctx.apiKey, emailTickets])\r\n\r\n const allTickets = [...emailTickets, ...tokenTickets]\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n const trimmed = email.trim()\r\n if (!trimmed || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return\r\n\r\n if (rememberMe) saveWidgetEmail(ctx.apiKey, trimmed)\r\n setSubmittedEmail(trimmed)\r\n }\r\n\r\n function formatDate(iso: string): string {\r\n try { return new Date(iso).toLocaleDateString() } catch { return iso }\r\n }\r\n\r\n // Show email entry form if not yet submitted and not authenticated\r\n if (!submittedEmail && !isAuthenticated) {\r\n return (\r\n <div className=\"rqd-email-form\">\r\n <p>{t('mytickets.emailPrompt')}</p>\r\n <form onSubmit={handleSubmit}>\r\n <div className=\"rqd-form-group\">\r\n <input\r\n className=\"rqd-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder={t('mytickets.emailPlaceholder')}\r\n required\r\n />\r\n </div>\r\n <label className=\"rqd-checkbox-label\">\r\n <input\r\n type=\"checkbox\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n />\r\n {t('mytickets.rememberMe')}\r\n </label>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" style={{ marginTop: 12 }}>\r\n {t('mytickets.lookup')}\r\n </button>\r\n </form>\r\n </div>\r\n )\r\n }\r\n\r\n if (isLoading) {\r\n return <div className=\"rqd-loading\">{t('mytickets.lookingUp')}</div>\r\n }\r\n\r\n if (allTickets.length === 0) {\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <p>{submittedEmail && !widgetUser ? t('mytickets.noAccount') : t('mytickets.noTickets')}</p>\r\n {submittedEmail && !isAuthenticated && (\r\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={() => setSubmittedEmail(null)}>\r\n {t('tracker.back')}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"rqd-ticket-list\">\r\n {allTickets.map(ticket => (\r\n <div\r\n key={ticket.id}\r\n className=\"rqd-ticket-card\"\r\n onClick={() => onSelectTicket(ticket.id)}\r\n >\r\n <div className=\"rqd-ticket-card-top\">\r\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\r\n <span className=\"rqd-badge\">{ticket.status}</span>\r\n </div>\r\n <span className=\"rqd-ticket-card-title\">{ticket.title}</span>\r\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetTicketDetailOptions } from '../queries'\r\nimport { submitReply, closeTicket, type AttachmentMeta, type TicketDetail } from '../../api-client'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface TicketDetailViewProps {\r\n ticketId: string\r\n onBack: () => void\r\n}\r\n\r\nfunction formatDate(iso: string): string {\r\n try { return new Date(iso).toLocaleString() } catch { return iso }\r\n}\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\r\n}\r\n\r\nexport function TicketDetailView({ ticketId, onBack }: TicketDetailViewProps) {\r\n const ctx = useReqdeskContext()\r\n const queryClient = useQueryClient()\r\n const [replyBody, setReplyBody] = useState('')\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const { data: ticket, isLoading, error } = useQuery(widgetTicketDetailOptions(ticketId))\r\n\r\n const replyMutation = useMutation({\r\n mutationFn: (body: string) => submitReply(ticketId, body),\r\n onMutate: async (body) => {\r\n // Optimistic update: append reply to cache\r\n await queryClient.cancelQueries({ queryKey: ['widget-ticket', ticketId] })\r\n const previous = queryClient.getQueryData<TicketDetail>(['widget-ticket', ticketId])\r\n\r\n if (previous) {\r\n queryClient.setQueryData<TicketDetail>(['widget-ticket', ticketId], {\r\n ...previous,\r\n replies: [...previous.replies, {\r\n id: `optimistic-${Date.now()}`,\r\n body,\r\n authorName: ctx.userName ?? ctx.userEmail ?? 'You',\r\n isStaff: false,\r\n createdAt: new Date().toISOString(),\r\n }],\r\n })\r\n }\r\n return { previous }\r\n },\r\n onSuccess: () => {\r\n setReplyBody('')\r\n queryClient.invalidateQueries({ queryKey: ['widget-ticket', ticketId] })\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(['widget-ticket', ticketId], context.previous)\r\n }\r\n },\r\n })\r\n\r\n const resolveMutation = useMutation({\r\n mutationFn: () => closeTicket(ticketId),\r\n onMutate: async () => {\r\n await queryClient.cancelQueries({ queryKey: ['widget-ticket', ticketId] })\r\n const previous = queryClient.getQueryData<TicketDetail>(['widget-ticket', ticketId])\r\n if (previous) {\r\n queryClient.setQueryData<TicketDetail>(['widget-ticket', ticketId], {\r\n ...previous,\r\n status: 'resolved',\r\n })\r\n }\r\n return { previous }\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: ['widget-ticket', ticketId] })\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(['widget-ticket', ticketId], context.previous)\r\n }\r\n },\r\n })\r\n\r\n if (isLoading) {\r\n return <div className=\"rqd-loading\">{t('detail.loading')}</div>\r\n }\r\n\r\n if (error || !ticket) {\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <p>{t('error.generic')}</p>\r\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={onBack}>\r\n {t('tracker.back')}\r\n </button>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div>\r\n <div className=\"rqd-ticket-header\">\r\n <h3>{ticket.title}</h3>\r\n <div className=\"rqd-ticket-header-meta\">\r\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\r\n <span className=\"rqd-badge\">{ticket.status}</span>\r\n <span className=\"rqd-badge\" style={{ background: 'var(--rqd-bg-secondary)', color: 'var(--rqd-text-secondary)' }}>\r\n {ticket.priority}\r\n </span>\r\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\r\n </div>\r\n </div>\r\n\r\n {ticket.description && (\r\n <>\r\n <div className=\"rqd-section-title\">{t('detail.description')}</div>\r\n <div className=\"rqd-ticket-desc\">{ticket.description}</div>\r\n </>\r\n )}\r\n\r\n {ticket.attachments.length > 0 && (\r\n <>\r\n <div className=\"rqd-section-title\">{t('detail.attachments')}</div>\r\n <div className=\"rqd-attachment-list\">\r\n {ticket.attachments.map((a: AttachmentMeta) => (\r\n <div key={a.id} className=\"rqd-attachment-item\">\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{a.fileName}</span>\r\n <span className=\"rqd-file-item-size\">{formatFileSize(a.fileSize)}</span>\r\n </div>\r\n {a.downloadUrl && (\r\n <a href={a.downloadUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n {t('attach.download')}\r\n </a>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n <div className=\"rqd-section-title\">{t('detail.replies')}</div>\r\n {ticket.replies.length === 0 ? (\r\n <p style={{ color: 'var(--rqd-text-secondary)', fontSize: 13, margin: '0 0 12px' }}>\r\n {t('detail.noReplies')}\r\n </p>\r\n ) : (\r\n <div>\r\n {ticket.replies.map(reply => (\r\n <div key={reply.id} className=\"rqd-reply\">\r\n <div className=\"rqd-reply-header\">\r\n <span className={reply.isStaff ? 'rqd-reply-staff' : ''}>\r\n {reply.isStaff ? `${reply.authorName} \\u00b7 ${t('detail.staff')}` : reply.authorName}\r\n </span>\r\n <span>{formatDate(reply.createdAt)}</span>\r\n </div>\r\n <div className=\"rqd-reply-body\">{reply.body}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"rqd-reply-compose\">\r\n <textarea\r\n className=\"rqd-textarea\"\r\n value={replyBody}\r\n onChange={(e) => setReplyBody(e.target.value)}\r\n placeholder={t('detail.replyPlaceholder')}\r\n rows={3}\r\n />\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <button\r\n className=\"rqd-btn rqd-btn-primary\"\r\n style={{ flex: 1 }}\r\n onClick={() => replyMutation.mutate(replyBody.trim())}\r\n disabled={!replyBody.trim() || replyMutation.isPending}\r\n >\r\n {replyMutation.isPending ? t('detail.sending') : t('detail.sendReply')}\r\n </button>\r\n {ticket.status !== 'resolved' && ticket.status !== 'closed' && (\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n style={{ flex: 0, whiteSpace: 'nowrap', padding: '10px 16px' }}\r\n onClick={() => resolveMutation.mutate()}\r\n disabled={resolveMutation.isPending}\r\n >\r\n {resolveMutation.isPending ? t('detail.resolving') : t('detail.resolve')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback, type FormEvent } from 'react'\r\nimport { useMutation } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { trackTicket } from '../../api-client'\r\nimport { getTrackingTokens } from '../../storage'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface TrackTicketViewProps {\r\n onTrackSuccess: (ticketId: string) => void\r\n}\r\n\r\nexport function TrackTicketView({ onTrackSuccess }: TrackTicketViewProps) {\r\n const ctx = useReqdeskContext()\r\n const [token, setToken] = useState('')\r\n const savedTokens = getTrackingTokens(ctx.apiKey)\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const trackMutation = useMutation({\r\n mutationFn: (trackToken: string) => trackTicket(trackToken.trim()),\r\n onSuccess: (result) => onTrackSuccess(result.id),\r\n })\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n if (token.trim()) trackMutation.mutate(token)\r\n }\r\n\r\n return (\r\n <div>\r\n <form onSubmit={handleSubmit}>\r\n <div className=\"rqd-form-group\">\r\n <input\r\n className=\"rqd-input\"\r\n value={token}\r\n onChange={(e) => setToken(e.target.value)}\r\n placeholder={t('track.tokenPlaceholder')}\r\n required\r\n />\r\n {trackMutation.isError && <div className=\"rqd-error-text\">{t('track.invalidToken')}</div>}\r\n </div>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={trackMutation.isPending || !token.trim()}>\r\n {trackMutation.isPending ? t('track.tracking') : t('track.submit')}\r\n </button>\r\n </form>\r\n\r\n {savedTokens.length > 0 && (\r\n <div style={{ marginTop: 20 }}>\r\n <div className=\"rqd-section-title\">{t('track.recentTickets')}</div>\r\n <div className=\"rqd-ticket-list\">\r\n {savedTokens.slice(0, 5).map(tk => (\r\n <button\r\n key={tk}\r\n className=\"rqd-ticket-card\"\r\n style={{ border: 'none', textAlign: 'start', width: '100%' }}\r\n onClick={() => trackMutation.mutate(tk)}\r\n >\r\n <span className=\"rqd-ticket-card-number\" style={{ fontFamily: 'monospace', fontSize: 12 }}>\r\n {tk.slice(0, 20)}...\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\nimport { en } from '../i18n/en'\r\nimport { ar } from '../i18n/ar'\r\nimport { themeToStyle } from '../theme'\r\nimport { saveWidgetConfig, loadWidgetConfig, loadWidgetEmail, clearWidgetEmail } from '../storage'\r\nimport { login, logout, isAuthConfigured } from '../auth/widget-auth'\r\nimport { ShadowRoot } from './shadow-root'\r\nimport { SubmitTicketView } from './views/SubmitTicketView'\r\nimport { MyTicketsView } from './views/MyTicketsView'\r\nimport { TicketDetailView } from './views/TicketDetailView'\r\nimport { TrackTicketView } from './views/TrackTicketView'\r\nimport type { TicketResult, WidgetError } from './types'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ntype WidgetView = 'home' | 'new-ticket' | 'my-tickets' | 'ticket-detail' | 'track' | 'kb' | 'preferences'\r\n\r\ninterface FloatingWidgetProps {\r\n position?: 'bottom-right' | 'bottom-left'\r\n contained?: boolean\r\n onTicketCreated?: (ticket: TicketResult) => void\r\n onError?: (error: WidgetError) => void\r\n}\r\n\r\nconst ICONS = {\r\n chat: 'M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z',\r\n close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\r\n newTicket: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\r\n tickets: 'M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 15.01l1.41 1.41L11 14.84V19h2v-4.16l1.59 1.59L16 15.01 12.01 11z',\r\n track: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z',\r\n kb: 'M21 5c-1.11-.35-2.33-.5-3.5-.5-1.95 0-4.05.4-5.5 1.5-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5 1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5V6c-.6-.45-1.25-.75-2-1zm0 13.5c-1.1-.35-2.3-.5-3.5-.5-1.7 0-4.15.65-5.5 1.5V8c1.35-.85 3.8-1.5 5.5-1.5 1.2 0 2.4.15 3.5.5v11.5z',\r\n back: 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\r\n backRtl: 'M4 11h12.17l-5.59-5.59L12 4l8 8-8 8-1.41-1.41L16.17 13H4v-2z',\r\n settings: 'M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.49.49 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96a.49.49 0 00-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 1115.6 12 3.6 3.6 0 0112 15.6z',\r\n}\r\n\r\nfunction SvgIcon({ path, size = 20 }: { path: string; size?: number }) {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\" style={{ display: 'block', flexShrink: 0 }}>\r\n <path d={path} />\r\n </svg>\r\n )\r\n}\r\n\r\nexport function FloatingWidget({\r\n position = 'bottom-right',\r\n contained = false,\r\n onTicketCreated,\r\n onError,\r\n}: FloatingWidgetProps) {\r\n const ctx = useReqdeskContext()\r\n const [isOpen, setIsOpen] = useState(false)\r\n const [view, setView] = useState<WidgetView>('home')\r\n const [selectedTicketId, setSelectedTicketId] = useState<string | null>(null)\r\n const [emailCleared, setEmailCleared] = useState(false)\r\n\r\n const savedPrefs = loadWidgetConfig(ctx.apiKey)\r\n const [userLang, setUserLang] = useState<string | null>(savedPrefs?.language ?? null)\r\n const [userThemeMode, setUserThemeMode] = useState<string | null>(savedPrefs?.theme?.mode ?? null)\r\n const [userColor, setUserColor] = useState<string | null>(savedPrefs?.theme?.primaryColor ?? null)\r\n\r\n const activeLang = userLang ?? ctx.language ?? 'en'\r\n const activeThemeMode = (userThemeMode ?? ctx.theme?.mode ?? 'light') as 'light' | 'dark' | 'auto'\r\n const activeColor = userColor ?? ctx.theme?.primaryColor ?? '#42b983'\r\n const activeTheme = { ...ctx.theme, mode: activeThemeMode, primaryColor: activeColor }\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[activeLang] ?? translations.en\r\n return lang[key] ?? key\r\n }, [activeLang, ctx.translations])\r\n\r\n const isRtl = activeLang === 'ar'\r\n const cssVars = themeToStyle(activeTheme)\r\n const posClass = `rqd-${position}`\r\n const containedClass = contained ? ' rqd-contained' : ''\r\n const brandName = ctx.theme?.brandName\r\n const brandLogo = ctx.theme?.logo\r\n const hideBranding = ctx.theme?.hideBranding === true\r\n\r\n // Derive projectId from API key context (resolved server-side)\r\n const projectId = '_current'\r\n\r\n function toggleOpen() {\r\n setIsOpen(prev => !prev)\r\n if (!isOpen) {\r\n setView('home')\r\n setSelectedTicketId(null)\r\n }\r\n }\r\n\r\n function goHome() {\r\n setView('home')\r\n setSelectedTicketId(null)\r\n setEmailCleared(false)\r\n }\r\n\r\n function handleLangChange(lang: string) {\r\n setUserLang(lang)\r\n saveWidgetConfig(ctx.apiKey, { language: lang })\r\n }\r\n\r\n function handleThemeChange(mode: string) {\r\n setUserThemeMode(mode)\r\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: mode as 'light' | 'dark' | 'auto', primaryColor: activeColor } })\r\n }\r\n\r\n function handleColorChange(color: string) {\r\n setUserColor(color)\r\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: activeThemeMode, primaryColor: color } })\r\n }\r\n\r\n const COLOR_PRESETS = [\r\n { color: '#42b983', label: 'Green' },\r\n { color: '#3b82f6', label: 'Blue' },\r\n { color: '#8b5cf6', label: 'Purple' },\r\n { color: '#f59e0b', label: 'Orange' },\r\n { color: '#ef4444', label: 'Red' },\r\n ]\r\n\r\n function handleClearEmail() {\r\n clearWidgetEmail(ctx.apiKey)\r\n setEmailCleared(true)\r\n setTimeout(() => setEmailCleared(false), 2000)\r\n }\r\n\r\n function openTicketDetail(ticketId: string) {\r\n setSelectedTicketId(ticketId)\r\n setView('ticket-detail')\r\n }\r\n\r\n const menuItems = [\r\n { key: 'new-ticket' as const, icon: ICONS.newTicket, label: t('menu.newTicket'), desc: t('menu.newTicketDesc') },\r\n { key: 'my-tickets' as const, icon: ICONS.tickets, label: t('menu.myTickets'), desc: t('menu.myTicketsDesc') },\r\n { key: 'track' as const, icon: ICONS.track, label: t('menu.trackTicket'), desc: t('menu.trackTicketDesc') },\r\n { key: 'kb' as const, icon: ICONS.kb, label: t('menu.knowledgeBase'), desc: t('menu.knowledgeBaseDesc') },\r\n { key: 'preferences' as const, icon: ICONS.settings, label: t('menu.preferences'), desc: t('menu.preferencesDesc') },\r\n ]\r\n\r\n function renderViewContent() {\r\n switch (view) {\r\n case 'home':\r\n return (\r\n <div className=\"rqd-menu\">\r\n {menuItems.map(item => (\r\n <button\r\n key={item.key}\r\n className=\"rqd-menu-item\"\r\n onClick={() => setView(item.key)}\r\n >\r\n <div className=\"rqd-menu-icon\">\r\n <SvgIcon path={item.icon} size={22} />\r\n </div>\r\n <div className=\"rqd-menu-text\">\r\n <span className=\"rqd-menu-label\">{item.label}</span>\r\n <span className=\"rqd-menu-desc\">{item.desc}</span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )\r\n\r\n case 'new-ticket':\r\n return (\r\n <SubmitTicketView\r\n projectId={projectId}\r\n onSuccess={(result) => {\r\n onTicketCreated?.(result)\r\n }}\r\n onError={onError}\r\n isAuthenticated={ctx.isAuthenticated}\r\n userEmail={ctx.userEmail}\r\n />\r\n )\r\n\r\n case 'my-tickets':\r\n return (\r\n <MyTicketsView\r\n projectId={projectId}\r\n onSelectTicket={openTicketDetail}\r\n isAuthenticated={ctx.isAuthenticated}\r\n userEmail={ctx.userEmail}\r\n />\r\n )\r\n\r\n case 'ticket-detail':\r\n if (!selectedTicketId) return null\r\n return (\r\n <TicketDetailView\r\n ticketId={selectedTicketId}\r\n onBack={() => setView('my-tickets')}\r\n />\r\n )\r\n\r\n case 'track':\r\n return (\r\n <TrackTicketView\r\n onTrackSuccess={openTicketDetail}\r\n />\r\n )\r\n\r\n case 'kb':\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <SvgIcon path={ICONS.kb} size={40} />\r\n <p>{t('menu.kbPlaceholder')}</p>\r\n </div>\r\n )\r\n\r\n case 'preferences':\r\n return (\r\n <div className=\"rqd-prefs\">\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.language')}</span>\r\n <div className=\"rqd-prefs-options\">\r\n <button\r\n className={`rqd-prefs-option${activeLang === 'en' ? ' rqd-active' : ''}`}\r\n onClick={() => handleLangChange('en')}\r\n >\r\n English\r\n </button>\r\n <button\r\n className={`rqd-prefs-option${activeLang === 'ar' ? ' rqd-active' : ''}`}\r\n onClick={() => handleLangChange('ar')}\r\n >\r\n العربية\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.theme')}</span>\r\n <div className=\"rqd-prefs-options\">\r\n {(['light', 'dark', 'auto'] as const).map(mode => (\r\n <button\r\n key={mode}\r\n className={`rqd-prefs-option${activeThemeMode === mode ? ' rqd-active' : ''}`}\r\n onClick={() => handleThemeChange(mode)}\r\n >\r\n {t(`prefs.${mode}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Accent Color */}\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.accentColor')}</span>\r\n <div className=\"rqd-color-presets\">\r\n {COLOR_PRESETS.map(preset => (\r\n <button\r\n key={preset.color}\r\n className={`rqd-color-preset${activeColor === preset.color ? ' rqd-active' : ''}`}\r\n style={{ background: preset.color, color: preset.color }}\r\n onClick={() => handleColorChange(preset.color)}\r\n aria-label={preset.label}\r\n title={preset.label}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Clear saved email */}\r\n {loadWidgetEmail(ctx.apiKey) && (\r\n <div className=\"rqd-prefs-group\">\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n onClick={handleClearEmail}\r\n style={{ width: 'auto', padding: '8px 16px' }}\r\n >\r\n {emailCleared ? t('prefs.emailCleared') : t('prefs.clearEmail')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n }\r\n\r\n const viewTitle: Record<WidgetView, string> = {\r\n home: brandName ?? t('widget.title'),\r\n 'new-ticket': t('widget.newTicket'),\r\n 'my-tickets': t('menu.myTickets'),\r\n 'ticket-detail': t('menu.myTickets'),\r\n track: t('widget.trackTicket'),\r\n kb: t('menu.knowledgeBase'),\r\n preferences: t('prefs.title'),\r\n }\r\n\r\n const canGoBack = view !== 'home'\r\n const goBackTarget = view === 'ticket-detail' ? 'my-tickets' : 'home'\r\n\r\n return (\r\n <ShadowRoot>\r\n <div\r\n style={cssVars as React.CSSProperties}\r\n {...(isRtl ? { dir: 'rtl' } : {})}\r\n >\r\n <button\r\n className={`rqd-fab ${posClass}${containedClass}`}\r\n onClick={toggleOpen}\r\n aria-label={isOpen ? t('widget.close') : t('widget.title')}\r\n >\r\n <SvgIcon path={isOpen ? ICONS.close : ICONS.chat} size={24} />\r\n </button>\r\n\r\n <div className={`rqd-panel ${posClass}${containedClass}${isOpen ? '' : ' rqd-hidden'}`}>\r\n <div className=\"rqd-header\">\r\n <div className=\"rqd-header-brand\">\r\n {canGoBack && (\r\n <button\r\n className=\"rqd-header-close\"\r\n onClick={() => goBackTarget === 'home' ? goHome() : setView(goBackTarget as WidgetView)}\r\n aria-label={t('tracker.back')}\r\n >\r\n <SvgIcon path={isRtl ? ICONS.backRtl : ICONS.back} size={18} />\r\n </button>\r\n )}\r\n {view === 'home' && brandLogo && (\r\n <img src={brandLogo} alt=\"\" className=\"rqd-header-logo\" />\r\n )}\r\n <span className=\"rqd-header-title\">{viewTitle[view]}</span>\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n {(ctx.auth || isAuthConfigured()) && view === 'home' && (\r\n <button\r\n className=\"rqd-auth-btn\"\r\n onClick={() => ctx.isAuthenticated ? logout() : login()}\r\n aria-label={ctx.isAuthenticated ? t('auth.logout') : t('auth.login')}\r\n >\r\n {ctx.isAuthenticated ? ctx.userName ?? t('auth.logout') : t('auth.login')}\r\n </button>\r\n )}\r\n <button\r\n className=\"rqd-header-close\"\r\n onClick={toggleOpen}\r\n aria-label={t('widget.close')}\r\n >\r\n <SvgIcon path={ICONS.close} size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rqd-body\">\r\n {renderViewContent()}\r\n </div>\r\n\r\n {!hideBranding && (\r\n <div className=\"rqd-footer\">\r\n <span>{t('branding.poweredBy')}</span>\r\n <a href=\"https://reqdesk.com\" target=\"_blank\" rel=\"noopener noreferrer\">Reqdesk</a>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.js","names":["apiSubmitTicket","apiTrackTicket","apiSubmitTrackingReply","translations","translations","formatFileSize","apiSubmitTicket","translations","translations","translations"],"sources":["../src/auth/widget-auth.ts","../src/react/ReqdeskProvider.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/queries.ts","../src/client-metadata.ts","../src/react/views/SubmitTicketView.tsx","../src/react/views/MyTicketsView.tsx","../src/react/views/TicketDetailView.tsx","../src/react/views/TrackTicketView.tsx","../src/react/FloatingWidget.tsx"],"sourcesContent":["import { oidcEarlyInit } from 'oidc-spa/entrypoint'\nimport { createOidc } from 'oidc-spa/core'\nimport type { OidcAuthConfig } from '../types'\nimport { setOidcTokenProvider } from '../ofetch-client'\n\nexport interface WidgetAuthState {\n isAuthenticated: boolean\n isLoading: boolean\n userEmail?: string\n userName?: string\n}\n\ntype AuthStateListener = (state: WidgetAuthState) => void\n\nlet authState: WidgetAuthState = { isAuthenticated: false, isLoading: false }\nlet listeners: AuthStateListener[] = []\nlet oidcInstance: any = null\nlet initPromise: Promise<void> | null = null\nlet earlyInitCalled = false\n\nfunction notify() {\n for (const listener of listeners) {\n try { listener(authState) } catch { /* ignore */ }\n }\n}\n\nfunction setState(update: Partial<WidgetAuthState>) {\n authState = { ...authState, ...update }\n notify()\n}\n\nexport function getAuthState(): WidgetAuthState {\n return authState\n}\n\nexport function onAuthStateChange(listener: AuthStateListener): () => void {\n listeners.push(listener)\n return () => {\n listeners = listeners.filter(l => l !== listener)\n }\n}\n\nexport function initWidgetAuth(config: OidcAuthConfig): Promise<void> {\n // oidcEarlyInit MUST be called synchronously before createOidc.\n // It handles the OIDC callback redirect and sets up internal state.\n if (!earlyInitCalled) {\n oidcEarlyInit({ BASE_URL: '/' })\n earlyInitCalled = true\n }\n\n initPromise = _initWidgetAuth(config)\n return initPromise\n}\n\nasync function _initWidgetAuth(config: OidcAuthConfig): Promise<void> {\n setState({ isLoading: true })\n\n try {\n const oidc = await createOidc({\n issuerUri: config.issuerUri,\n clientId: config.clientId,\n })\n\n oidcInstance = oidc\n\n if (oidc.isUserLoggedIn) {\n setOidcTokenProvider(() => oidc.getTokens())\n\n const tokens = await oidc.getTokens()\n const payload = decodeJwtPayload(tokens.accessToken)\n\n setState({\n isAuthenticated: true,\n isLoading: false,\n userEmail: payload?.email,\n userName: payload?.name ?? payload?.preferred_username,\n })\n\n oidc.subscribeToTokensChange(async (newTokens) => {\n const p = decodeJwtPayload(newTokens.accessToken)\n setState({\n userEmail: p?.email ?? authState.userEmail,\n userName: p?.name ?? p?.preferred_username ?? authState.userName,\n })\n })\n } else {\n setState({ isAuthenticated: false, isLoading: false })\n }\n } catch (err) {\n console.warn('[reqdesk-widget] oidc-spa initialization failed:', err)\n setState({ isAuthenticated: false, isLoading: false })\n }\n}\n\nexport async function login(): Promise<void> {\n if (!oidcInstance && initPromise) {\n await initPromise\n }\n if (!oidcInstance) {\n console.warn('[reqdesk-widget] Cannot login: OIDC not initialized. Check auth config.')\n return\n }\n await oidcInstance.login({ doesCurrentHrefRequiresAuth: false })\n}\n\nexport async function logout(): Promise<void> {\n if (!oidcInstance) return\n setOidcTokenProvider(null)\n setState({ isAuthenticated: false, userEmail: undefined, userName: undefined })\n await oidcInstance.logout({ redirectTo: 'current page' })\n}\n\nexport function isAuthConfigured(): boolean {\n return oidcInstance !== null\n}\n\nfunction decodeJwtPayload(token: string): Record<string, any> | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const payload = atob(parts[1].replace(/-/g, '+').replace(/_/g, '/'))\n return JSON.parse(payload)\n } catch {\n return null\n }\n}\n","import { createContext, useContext, useMemo, useEffect, useRef, useState } from 'react'\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\r\nimport { configureWidgetClient } from '../ofetch-client'\r\nimport { loadWidgetConfig, saveWidgetConfig } from '../storage'\r\nimport { initWidgetAuth, getAuthState, onAuthStateChange, type WidgetAuthState } from '../auth/widget-auth'\r\nimport type { ReqdeskProviderProps, ReqdeskContextValue } from './types'\r\n\r\nconst ReqdeskContext = createContext<ReqdeskContextValue | null>(null)\r\n\r\nexport function useReqdeskContext(): ReqdeskContextValue {\r\n const ctx = useContext(ReqdeskContext)\r\n if (!ctx) throw new Error('useReqdesk must be used within a <ReqdeskProvider>')\r\n return ctx\r\n}\r\n\r\n// Widget-scoped QueryClient — completely isolated from host app\r\nconst widgetQueryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 10 * 60 * 1000,\r\n retry: (failureCount, error) => {\r\n const status = (error as any)?.status ?? (error as any)?.statusCode\r\n if (status && status >= 400 && status < 500 && status !== 408) return false\r\n if (status && status >= 500) return false\r\n return failureCount < 2\r\n },\r\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\r\n refetchOnWindowFocus: false,\r\n },\r\n mutations: {\r\n retry: false,\r\n },\r\n },\r\n})\r\n\r\nexport function ReqdeskProvider({ apiKey, auth, theme, language, customer, translations, children }: ReqdeskProviderProps) {\r\n const initialized = useRef(false)\r\n const [authState, setAuthState] = useState<WidgetAuthState>(getAuthState)\r\n\r\n const saved = initialized.current ? null : loadWidgetConfig(apiKey)\r\n const resolvedLanguage = language ?? saved?.language ?? 'en'\r\n const resolvedTheme = theme ?? saved?.theme\r\n\r\n useEffect(() => {\r\n if (!initialized.current) {\r\n configureWidgetClient(window.location.origin, apiKey)\r\n initialized.current = true\r\n\r\n if (auth) {\r\n initWidgetAuth(auth)\r\n }\r\n }\r\n }, [apiKey, auth])\r\n\r\n useEffect(() => {\r\n return onAuthStateChange(setAuthState)\r\n }, [])\r\n\r\n useEffect(() => {\r\n saveWidgetConfig(apiKey, {\r\n language: resolvedLanguage,\r\n theme: resolvedTheme,\r\n })\r\n }, [apiKey, resolvedLanguage, resolvedTheme])\r\n\r\n const value = useMemo<ReqdeskContextValue>(() => ({\r\n apiKey,\r\n auth,\r\n theme: resolvedTheme,\r\n language: resolvedLanguage,\r\n customer,\r\n translations,\r\n isAuthenticated: authState.isAuthenticated,\r\n userEmail: authState.userEmail,\r\n userName: authState.userName,\r\n }), [apiKey, auth, resolvedTheme, resolvedLanguage, customer, translations, authState])\r\n\r\n return (\r\n <ReqdeskContext.Provider value={value}>\r\n <QueryClientProvider client={widgetQueryClient}>\r\n {children}\r\n </QueryClientProvider>\r\n </ReqdeskContext.Provider>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { submitTicket as apiSubmitTicket, trackTicket as apiTrackTicket, submitTrackingReply as apiSubmitTrackingReply } from '../api-client'\r\nimport type { SubmitTicketData, TicketResult, TrackedTicketResult, WidgetError, UseReqdeskReturn } from './types'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\n\r\nexport function useReqdesk(): UseReqdeskReturn {\r\n useReqdeskContext() // ensure we're inside a provider\r\n\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [error, setError] = useState<WidgetError | null>(null)\r\n\r\n const submitTicket = useCallback(async (data: SubmitTicketData): Promise<TicketResult> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n const result = await apiSubmitTicket('_current', data)\r\n return result\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n const trackTicket = useCallback(async (token: string): Promise<TrackedTicketResult> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n const result = await apiTrackTicket(token)\r\n return result\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n const submitTrackingReply = useCallback(async (token: string, body: string): Promise<void> => {\r\n setIsLoading(true)\r\n setError(null)\r\n try {\r\n await apiSubmitTrackingReply(token, body)\r\n } catch (err) {\r\n const widgetError = err as WidgetError\r\n setError(widgetError)\r\n throw widgetError\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }, [])\r\n\r\n return { submitTicket, trackTicket, submitTrackingReply, isLoading, error }\r\n}\r\n","import { useRef, useEffect, useState, type ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { getWidgetStyles } from '../theme'\r\n\r\ninterface ShadowRootProps {\r\n children: ReactNode\r\n}\r\n\r\nexport function ShadowRoot({ children }: ShadowRootProps) {\r\n const hostRef = useRef<HTMLDivElement>(null)\r\n const [mountPoint, setMountPoint] = useState<HTMLElement | null>(null)\r\n\r\n useEffect(() => {\r\n const host = hostRef.current\r\n if (!host || host.shadowRoot) return\r\n\r\n const shadow = host.attachShadow({ mode: 'open' })\r\n\r\n const style = document.createElement('style')\r\n style.textContent = getWidgetStyles()\r\n shadow.appendChild(style)\r\n\r\n const mount = document.createElement('div')\r\n mount.className = 'rqd-root'\r\n shadow.appendChild(mount)\r\n\r\n setMountPoint(mount)\r\n }, [])\r\n\r\n return (\r\n <div ref={hostRef}>\r\n {mountPoint && createPortal(children, mountPoint)}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback, type FormEvent } from 'react'\r\nimport { useReqdesk } from './useReqdesk'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\nimport { en } from '../i18n/en'\r\nimport { ar } from '../i18n/ar'\r\nimport { themeToStyle } from '../theme'\r\nimport { saveTrackingToken } from '../storage'\r\nimport type { TicketFormProps, TicketResult, WidgetError, SubmitTicketData } from './types'\r\nimport { ShadowRoot } from './shadow-root'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\nexport function TicketForm({ mode = 'inline', onTicketCreated, onError, className, style }: TicketFormProps) {\r\n const ctx = useReqdeskContext()\r\n const { submitTicket, isLoading } = useReqdesk()\r\n const [success, setSuccess] = useState<TicketResult | null>(null)\r\n const [errors, setErrors] = useState<Record<string, string>>({})\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const handleSubmit = useCallback(async (e: FormEvent<HTMLFormElement>) => {\r\n e.preventDefault()\r\n const form = e.currentTarget\r\n const formData = new FormData(form)\r\n\r\n const title = (formData.get('title') as string)?.trim() ?? ''\r\n const email = (formData.get('email') as string)?.trim() ?? ''\r\n const newErrors: Record<string, string> = {}\r\n\r\n if (!title) newErrors.title = t('error.required')\r\n else if (title.length < 5) newErrors.title = t('error.titleMin')\r\n if (!email) newErrors.email = t('error.required')\r\n else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) newErrors.email = t('error.emailInvalid')\r\n\r\n if (Object.keys(newErrors).length > 0) {\r\n setErrors(newErrors)\r\n return\r\n }\r\n\r\n setErrors({})\r\n const data: SubmitTicketData = {\r\n title,\r\n description: (formData.get('description') as string)?.trim() || undefined,\r\n email,\r\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\r\n }\r\n\r\n try {\r\n const result = await submitTicket(data)\r\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\r\n setSuccess(result)\r\n onTicketCreated?.(result)\r\n } catch (err) {\r\n onError?.(err as WidgetError)\r\n }\r\n }, [submitTicket, ctx.apiKey, ctx.translations, ctx.language, onTicketCreated, onError, t])\r\n\r\n const cssVars = themeToStyle(ctx.theme)\r\n\r\n const content = success ? (\r\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\r\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\r\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\r\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\r\n {success.trackingToken && (\r\n <>\r\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\r\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n onClick={() => navigator.clipboard.writeText(success.trackingToken!)}\r\n >\r\n {t('success.copyToken')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.title')}</label>\r\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\r\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.description')}</label>\r\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.email')}</label>\r\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} required />\r\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.priority')}</label>\r\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\r\n <option value=\"low\">{t('form.priorityLow')}</option>\r\n <option value=\"medium\">{t('form.priorityMedium')}</option>\r\n <option value=\"high\">{t('form.priorityHigh')}</option>\r\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\r\n </select>\r\n </div>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={isLoading}>\r\n {isLoading ? t('form.submitting') : t('form.submit')}\r\n </button>\r\n </form>\r\n )\r\n\r\n if (mode === 'floating') {\r\n return (\r\n <ShadowRoot>\r\n <div className={className} style={{ ...style, ...cssVars } as React.CSSProperties}>\r\n <div className=\"rqd-body\">{content}</div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n }\r\n\r\n return (\r\n <ShadowRoot>\r\n <div className={`rqd-inline ${className ?? ''}`} style={cssVars as React.CSSProperties}>\r\n <div className=\"rqd-body\">{content}</div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n","import { useReqdeskContext } from './ReqdeskProvider'\r\nimport { useReqdesk } from './useReqdesk'\r\nimport { themeToStyle } from '../theme'\r\nimport { ShadowRoot } from './shadow-root'\r\nimport type { SupportPortalProps } from './types'\r\n\r\nexport function SupportPortal({ className }: SupportPortalProps) {\r\n const ctx = useReqdeskContext()\r\n const { isLoading } = useReqdesk()\r\n const cssVars = themeToStyle(ctx.theme)\r\n\r\n return (\r\n <ShadowRoot>\r\n <div className={`rqd-inline ${className ?? ''}`} style={cssVars as React.CSSProperties}>\r\n <div className=\"rqd-body\">\r\n {isLoading ? (\r\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)' }}>Loading...</p>\r\n ) : (\r\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)', padding: '24px 0' }}>\r\n Support Portal — coming in a future update.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n","import { queryOptions, keepPreviousData } from '@tanstack/react-query'\r\nimport { getTicketDetail, listMyTickets, resolveWidgetUser, trackTicket, getCategories } from '../api-client'\r\n\r\nexport const widgetTicketDetailOptions = (ticketId: string) =>\r\n queryOptions({\r\n queryKey: ['widget-ticket', ticketId],\r\n queryFn: () => getTicketDetail(ticketId),\r\n staleTime: 60_000,\r\n enabled: !!ticketId,\r\n })\r\n\r\nexport const widgetMyTicketsOptions = (projectId: string, userId: string) =>\r\n queryOptions({\r\n queryKey: ['widget-tickets', projectId, userId],\r\n queryFn: () => listMyTickets(projectId, userId),\r\n staleTime: 30_000,\r\n placeholderData: keepPreviousData,\r\n enabled: !!userId,\r\n })\r\n\r\nexport const widgetUserOptions = (projectId: string, email: string) =>\r\n queryOptions({\r\n queryKey: ['widget-user', projectId, email],\r\n queryFn: () => resolveWidgetUser(projectId, email),\r\n staleTime: 5 * 60_000,\r\n enabled: !!email,\r\n })\r\n\r\nexport const widgetTrackTicketOptions = (token: string) =>\r\n queryOptions({\r\n queryKey: ['widget-track', token],\r\n queryFn: () => trackTicket(token),\r\n staleTime: 60_000,\r\n enabled: !!token,\r\n })\r\n\r\nexport const widgetCategoriesOptions = (projectId: string, parentId?: string | null) =>\r\n queryOptions({\r\n queryKey: ['widget-categories', projectId, parentId ?? 'root'],\r\n queryFn: () => getCategories(projectId, parentId),\r\n staleTime: 5 * 60_000,\r\n })\r\n","const STORAGE_PREFIX = 'reqdesk_diag_'\n\nexport interface MetadataPreferences {\n screenResolution: boolean\n deviceType: boolean\n timezone: boolean\n referrerUrl: boolean\n language: boolean\n platform: boolean\n}\n\nconst DEFAULT_PREFS: MetadataPreferences = {\n screenResolution: false,\n deviceType: false,\n timezone: false,\n referrerUrl: false,\n language: false,\n platform: false,\n}\n\n/** Always collected — minimal, non-sensitive */\nexport function collectMinimalMetadata(): Record<string, string> {\n const meta: Record<string, string> = {}\n try {\n meta.pageUrl = window.location.href\n meta.userAgent = navigator.userAgent\n } catch { /* SSR safety */ }\n return meta\n}\n\n/** Full diagnostic set — only included for opted-in fields */\nexport function collectDiagnosticMetadata(prefs: MetadataPreferences): Record<string, string> {\n const meta: Record<string, string> = {}\n try {\n if (prefs.screenResolution) meta.screenResolution = `${screen.width}x${screen.height}`\n if (prefs.deviceType) meta.deviceType = detectDeviceType()\n if (prefs.timezone) meta.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (prefs.referrerUrl && document.referrer) meta.referrerUrl = document.referrer\n if (prefs.language) meta.language = navigator.language\n if (prefs.platform) meta.platform = navigator.platform\n } catch { /* SSR safety */ }\n return meta\n}\n\n/** Combine minimal + opted-in diagnostic metadata */\nexport function collectAllMetadata(apiKey: string): Record<string, string> {\n const prefs = getMetadataPreferences(apiKey)\n return {\n ...collectMinimalMetadata(),\n ...collectDiagnosticMetadata(prefs),\n }\n}\n\nexport function getMetadataPreferences(apiKey: string): MetadataPreferences {\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${apiKey}`)\n if (raw) return { ...DEFAULT_PREFS, ...JSON.parse(raw) }\n } catch { /* ignore */ }\n return { ...DEFAULT_PREFS }\n}\n\nexport function saveMetadataPreferences(apiKey: string, prefs: MetadataPreferences): void {\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${apiKey}`, JSON.stringify(prefs))\n } catch { /* ignore */ }\n}\n\nexport function isDiagnosticEnabled(apiKey: string): boolean {\n const prefs = getMetadataPreferences(apiKey)\n return Object.values(prefs).some(v => v)\n}\n\nfunction detectDeviceType(): string {\n const ua = navigator.userAgent.toLowerCase()\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android.*mobile|windows phone/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\nexport const DIAGNOSTIC_FIELDS = [\n { key: 'screenResolution' as const, labelKey: 'diag.screenResolution' },\n { key: 'deviceType' as const, labelKey: 'diag.deviceType' },\n { key: 'timezone' as const, labelKey: 'diag.timezone' },\n { key: 'referrerUrl' as const, labelKey: 'diag.referrerUrl' },\n { key: 'language' as const, labelKey: 'diag.language' },\n { key: 'platform' as const, labelKey: 'diag.platform' },\n] as const\n","import { useState, useRef, useCallback, type FormEvent, type DragEvent } from 'react'\r\nimport { useMutation, useQuery } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetCategoriesOptions } from '../queries'\r\nimport { submitTicket as apiSubmitTicket, uploadAttachment, type CategoryItem } from '../../api-client'\r\nimport { saveTrackingToken, saveWidgetEmail, loadWidgetEmail } from '../../storage'\r\nimport { collectAllMetadata, getMetadataPreferences, saveMetadataPreferences, collectDiagnosticMetadata, DIAGNOSTIC_FIELDS, type MetadataPreferences } from '../../client-metadata'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\nimport type { TicketResult, WidgetError, SubmitTicketData } from '../types'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\nconst ALLOWED_MIME_TYPES = new Set([\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp',\r\n 'application/pdf',\r\n 'text/plain', 'text/csv',\r\n 'application/zip', 'application/x-zip-compressed',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n])\r\n\r\nconst BLOCKED_EXTENSIONS = new Set(['.exe', '.bat', '.cmd', '.sh', '.ps1', '.msi', '.dll', '.scr'])\r\nconst MAX_FILES = 5\r\nconst MAX_SIZE_MB = 10\r\n\r\ninterface SubmitTicketViewProps {\r\n projectId: string\r\n onSuccess?: (result: TicketResult) => void\r\n onError?: (error: WidgetError) => void\r\n isAuthenticated?: boolean\r\n userEmail?: string\r\n}\r\n\r\ninterface QueuedFile {\r\n file: File\r\n id: string\r\n error?: string\r\n}\r\n\r\ninterface UploadProgress {\r\n fileId: string\r\n fileName: string\r\n percent: number\r\n}\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\r\n}\r\n\r\nexport function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, userEmail }: SubmitTicketViewProps) {\r\n const ctx = useReqdeskContext()\r\n const fileInputRef = useRef<HTMLInputElement>(null)\r\n const savedEmail = loadWidgetEmail(ctx.apiKey)\r\n\r\n const [errors, setErrors] = useState<Record<string, string>>({})\r\n const [files, setFiles] = useState<QueuedFile[]>([])\r\n const [isDragOver, setIsDragOver] = useState(false)\r\n const [uploadProgress, setUploadProgress] = useState<UploadProgress | null>(null)\r\n const [success, setSuccess] = useState<TicketResult | null>(null)\r\n const [rememberEmail, setRememberEmail] = useState(!!savedEmail)\r\n\r\n // Category selector state\r\n const [categoryPath, setCategoryPath] = useState<CategoryItem[]>([])\r\n const [selectedCategory, setSelectedCategory] = useState<CategoryItem | null>(null)\r\n const currentParentId = categoryPath.length > 0 ? categoryPath[categoryPath.length - 1].id : null\r\n const { data: categories = [] } = useQuery(widgetCategoriesOptions(projectId, currentParentId))\r\n\r\n // Diagnostic metadata state\r\n const [diagOpen, setDiagOpen] = useState(false)\r\n const [diagPrefs, setDiagPrefs] = useState<MetadataPreferences>(getMetadataPreferences(ctx.apiKey))\r\n const diagValues = collectDiagnosticMetadata({\r\n screenResolution: true, deviceType: true, timezone: true,\r\n referrerUrl: true, language: true, platform: true,\r\n })\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const submitMutation = useMutation({\r\n mutationFn: async ({ data, validFiles }: { data: SubmitTicketData; validFiles: QueuedFile[] }) => {\r\n const result = await apiSubmitTicket(projectId, data)\r\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\r\n\r\n // Upload attachments sequentially after ticket creation\r\n for (const queued of validFiles) {\r\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent: 0 })\r\n await uploadAttachment(result.id, queued.file, (percent) => {\r\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent })\r\n })\r\n }\r\n setUploadProgress(null)\r\n return result\r\n },\r\n onSuccess: (result) => {\r\n setSuccess(result)\r\n onSuccess?.(result)\r\n },\r\n onError: (err) => {\r\n setUploadProgress(null)\r\n onError?.(err as unknown as WidgetError)\r\n },\r\n })\r\n\r\n function validateFile(file: File): string | null {\r\n const ext = '.' + file.name.split('.').pop()?.toLowerCase()\r\n if (BLOCKED_EXTENSIONS.has(ext)) return t('attach.invalidType')\r\n if (!ALLOWED_MIME_TYPES.has(file.type) && !file.type.startsWith('application/vnd.openxmlformats-officedocument.')) {\r\n return t('attach.invalidType')\r\n }\r\n if (file.size > MAX_SIZE_MB * 1024 * 1024) return t('attach.tooLarge')\r\n return null\r\n }\r\n\r\n function addFiles(newFiles: FileList | File[]) {\r\n const toAdd: QueuedFile[] = []\r\n for (const file of Array.from(newFiles)) {\r\n if (files.length + toAdd.length >= MAX_FILES) break\r\n const error = validateFile(file)\r\n toAdd.push({ file, id: crypto.randomUUID(), error: error ?? undefined })\r\n }\r\n setFiles(prev => [...prev, ...toAdd])\r\n }\r\n\r\n function removeFile(id: string) {\r\n setFiles(prev => prev.filter(f => f.id !== id))\r\n }\r\n\r\n function handleDragOver(e: DragEvent) { e.preventDefault(); setIsDragOver(true) }\r\n function handleDragLeave(e: DragEvent) { e.preventDefault(); setIsDragOver(false) }\r\n function handleDrop(e: DragEvent) {\r\n e.preventDefault(); setIsDragOver(false)\r\n if (e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files)\r\n }\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n const form = e.currentTarget\r\n const formData = new FormData(form)\r\n\r\n const title = (formData.get('title') as string)?.trim() ?? ''\r\n const email = (formData.get('email') as string)?.trim() ?? userEmail ?? ''\r\n const newErrors: Record<string, string> = {}\r\n\r\n if (!title) newErrors.title = t('error.required')\r\n else if (title.length < 5) newErrors.title = t('error.titleMin')\r\n if (!isAuthenticated && email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\r\n newErrors.email = t('error.emailInvalid')\r\n }\r\n\r\n if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return }\r\n setErrors({})\r\n\r\n if (rememberEmail && email) saveWidgetEmail(ctx.apiKey, email)\r\n\r\n // Save diagnostic preferences\r\n saveMetadataPreferences(ctx.apiKey, diagPrefs)\r\n\r\n const validFiles = files.filter(f => !f.error)\r\n const data: SubmitTicketData = {\r\n title,\r\n description: (formData.get('description') as string)?.trim() || undefined,\r\n email,\r\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\r\n categoryId: selectedCategory?.id,\r\n clientMetadata: collectAllMetadata(ctx.apiKey),\r\n }\r\n\r\n submitMutation.mutate({ data, validFiles })\r\n }\r\n\r\n if (success) {\r\n return (\r\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\r\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\r\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\r\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\r\n {success.trackingToken && (\r\n <>\r\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\r\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\r\n <button className=\"rqd-btn rqd-btn-secondary\" onClick={() => navigator.clipboard.writeText(success.trackingToken!)}>\r\n {t('success.copyToken')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (submitMutation.isPending && uploadProgress) {\r\n return (\r\n <div style={{ padding: '24px 0', textAlign: 'center' }}>\r\n <p style={{ marginBottom: 12, fontWeight: 500 }}>{t('attach.uploading')}</p>\r\n <div className=\"rqd-file-item\" style={{ marginBottom: 8 }}>\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{uploadProgress.fileName}</span>\r\n </div>\r\n <span style={{ fontSize: 12, color: 'var(--rqd-text-secondary)' }}>{uploadProgress.percent}%</span>\r\n </div>\r\n <div className=\"rqd-progress\">\r\n <div className=\"rqd-progress-bar\" style={{ width: `${uploadProgress.percent}%` }} />\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.title')}</label>\r\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\r\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\r\n </div>\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.description')}</label>\r\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\r\n </div>\r\n {!isAuthenticated && (\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.email')}</label>\r\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} defaultValue={userEmail ?? savedEmail ?? ''} />\r\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\r\n <label className=\"rqd-checkbox-label\" style={{ marginTop: 6 }}>\r\n <input type=\"checkbox\" checked={rememberEmail} onChange={(e) => setRememberEmail(e.target.checked)} />\r\n {t('mytickets.rememberMe')}\r\n </label>\r\n </div>\r\n )}\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.priority')}</label>\r\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\r\n <option value=\"low\">{t('form.priorityLow')}</option>\r\n <option value=\"medium\">{t('form.priorityMedium')}</option>\r\n <option value=\"high\">{t('form.priorityHigh')}</option>\r\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* Category Selector */}\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.categorySelected')}</label>\r\n {selectedCategory ? (\r\n <div className=\"rqd-category-selected\">\r\n <span>\r\n {categoryPath.map(c => c.name).join(' > ')}{categoryPath.length > 0 ? ' > ' : ''}{selectedCategory.name}\r\n </span>\r\n <button type=\"button\" onClick={() => { setSelectedCategory(null); setCategoryPath([]) }}>×</button>\r\n </div>\r\n ) : (\r\n <>\r\n {categoryPath.length > 0 && (\r\n <div className=\"rqd-category-breadcrumb\">\r\n <button type=\"button\" onClick={() => setCategoryPath([])}>{t('form.categoryPlaceholder')}</button>\r\n {categoryPath.map((c, i) => (\r\n <span key={c.id}>\r\n <span className=\"rqd-category-breadcrumb-sep\">›</span>\r\n <button type=\"button\" onClick={() => setCategoryPath(prev => prev.slice(0, i + 1))}>{c.name}</button>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n <div className=\"rqd-category-list\">\r\n {categories.map(cat => (\r\n <button\r\n key={cat.id}\r\n type=\"button\"\r\n className=\"rqd-category-item\"\r\n onClick={() => {\r\n if (cat.hasChildren) {\r\n setCategoryPath(prev => [...prev, cat])\r\n } else {\r\n setSelectedCategory(cat)\r\n }\r\n }}\r\n >\r\n {cat.name}\r\n {cat.hasChildren && <span className=\"rqd-category-item-chevron\">›</span>}\r\n </button>\r\n ))}\r\n {categories.length === 0 && categoryPath.length === 0 && (\r\n <span style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('form.categoryPlaceholder')}</span>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Diagnostic Metadata */}\r\n <div className=\"rqd-form-group\">\r\n <button\r\n type=\"button\"\r\n className=\"rqd-diag-toggle\"\r\n onClick={() => setDiagOpen(prev => !prev)}\r\n >\r\n <span>{t('diag.title')}</span>\r\n <span>{diagOpen ? '\\u25B2' : '\\u25BC'}</span>\r\n </button>\r\n {diagOpen && (\r\n <div className=\"rqd-diag-panel\">\r\n <p style={{ fontSize: 12, color: 'var(--rqd-text-secondary)', margin: '0 0 6px' }}>{t('diag.hint')}</p>\r\n {DIAGNOSTIC_FIELDS.map(field => (\r\n <label key={field.key} className=\"rqd-diag-item\">\r\n <input\r\n type=\"checkbox\"\r\n checked={diagPrefs[field.key]}\r\n onChange={(e) => setDiagPrefs(prev => ({ ...prev, [field.key]: e.target.checked }))}\r\n />\r\n <span>{t(field.labelKey)}</span>\r\n <span className=\"rqd-diag-item-value\">{diagValues[field.key] ?? '—'}</span>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"rqd-form-group\">\r\n <label className=\"rqd-label\">{t('form.attachment')}</label>\r\n <div\r\n className={`rqd-dropzone${isDragOver ? ' rqd-dropzone-active' : ''}`}\r\n onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\r\n onClick={() => fileInputRef.current?.click()}\r\n >\r\n {isDragOver ? t('attach.dropzoneActive') : t('attach.dropzone')}\r\n <input ref={fileInputRef} type=\"file\" multiple style={{ display: 'none' }}\r\n onChange={(e) => { if (e.target.files) addFiles(e.target.files); e.target.value = '' }} />\r\n </div>\r\n {files.length > 0 && (\r\n <div className=\"rqd-file-list\">\r\n {files.map(f => (\r\n <div key={f.id} className=\"rqd-file-item\">\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{f.file.name}</span>\r\n <span className=\"rqd-file-item-size\">\r\n {formatFileSize(f.file.size)}\r\n {f.error && <span style={{ color: '#e74c3c', marginLeft: 6 }}>{f.error}</span>}\r\n </span>\r\n </div>\r\n <button className=\"rqd-file-remove\" onClick={() => removeFile(f.id)} type=\"button\">×</button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={submitMutation.isPending}>\r\n {submitMutation.isPending ? t('form.submitting') : t('form.submit')}\r\n </button>\r\n </form>\r\n )\r\n}\r\n","import { useState, useEffect, useCallback, type FormEvent } from 'react'\r\nimport { useQuery } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetMyTicketsOptions, widgetUserOptions } from '../queries'\r\nimport { trackTicket, type TicketListItem } from '../../api-client'\r\nimport { saveWidgetEmail, loadWidgetEmail, getTrackingTokens } from '../../storage'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface MyTicketsViewProps {\r\n projectId: string\r\n onSelectTicket: (ticketId: string) => void\r\n isAuthenticated?: boolean\r\n userEmail?: string\r\n}\r\n\r\nexport function MyTicketsView({ projectId, onSelectTicket, isAuthenticated, userEmail }: MyTicketsViewProps) {\r\n const ctx = useReqdeskContext()\r\n const savedEmail = loadWidgetEmail(ctx.apiKey)\r\n\r\n const [email, setEmail] = useState(userEmail ?? savedEmail ?? '')\r\n const [rememberMe, setRememberMe] = useState(!!savedEmail)\r\n const [submittedEmail, setSubmittedEmail] = useState<string | null>(\r\n isAuthenticated && userEmail ? userEmail : savedEmail,\r\n )\r\n const [tokenTickets, setTokenTickets] = useState<TicketListItem[]>([])\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n // Resolve email → userId\r\n const { data: widgetUser } = useQuery(widgetUserOptions(projectId, submittedEmail ?? ''))\r\n const userId = widgetUser?.userId ?? ''\r\n\r\n // Fetch tickets once userId is resolved\r\n const { data: emailTickets = [], isLoading } = useQuery(widgetMyTicketsOptions(projectId, userId))\r\n\r\n // Also load token-based tickets\r\n useEffect(() => {\r\n const tokens = getTrackingTokens(ctx.apiKey)\r\n if (tokens.length === 0) return\r\n\r\n Promise.allSettled(\r\n tokens.slice(0, 5).map(tk => trackTicket(tk)),\r\n ).then(results => {\r\n const tracked: TicketListItem[] = []\r\n for (const r of results) {\r\n if (r.status === 'fulfilled') {\r\n const t = r.value\r\n if (!emailTickets.some(et => et.id === t.id)) {\r\n tracked.push({\r\n id: t.id,\r\n ticketNumber: t.ticketNumber,\r\n title: t.title,\r\n status: t.status,\r\n priority: t.priority,\r\n createdAt: t.createdAt,\r\n })\r\n }\r\n }\r\n }\r\n setTokenTickets(tracked)\r\n })\r\n }, [ctx.apiKey, emailTickets])\r\n\r\n const allTickets = [...emailTickets, ...tokenTickets]\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n const trimmed = email.trim()\r\n if (!trimmed || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return\r\n\r\n if (rememberMe) saveWidgetEmail(ctx.apiKey, trimmed)\r\n setSubmittedEmail(trimmed)\r\n }\r\n\r\n function formatDate(iso: string): string {\r\n try { return new Date(iso).toLocaleDateString() } catch { return iso }\r\n }\r\n\r\n // Show email entry form if not yet submitted and not authenticated\r\n if (!submittedEmail && !isAuthenticated) {\r\n return (\r\n <div className=\"rqd-email-form\">\r\n <p>{t('mytickets.emailPrompt')}</p>\r\n <form onSubmit={handleSubmit}>\r\n <div className=\"rqd-form-group\">\r\n <input\r\n className=\"rqd-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder={t('mytickets.emailPlaceholder')}\r\n required\r\n />\r\n </div>\r\n <label className=\"rqd-checkbox-label\">\r\n <input\r\n type=\"checkbox\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n />\r\n {t('mytickets.rememberMe')}\r\n </label>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" style={{ marginTop: 12 }}>\r\n {t('mytickets.lookup')}\r\n </button>\r\n </form>\r\n </div>\r\n )\r\n }\r\n\r\n if (isLoading) {\r\n return <div className=\"rqd-loading\">{t('mytickets.lookingUp')}</div>\r\n }\r\n\r\n if (allTickets.length === 0) {\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <p>{submittedEmail && !widgetUser ? t('mytickets.noAccount') : t('mytickets.noTickets')}</p>\r\n {submittedEmail && !isAuthenticated && (\r\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={() => setSubmittedEmail(null)}>\r\n {t('tracker.back')}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"rqd-ticket-list\">\r\n {allTickets.map(ticket => (\r\n <div\r\n key={ticket.id}\r\n className=\"rqd-ticket-card\"\r\n onClick={() => onSelectTicket(ticket.id)}\r\n >\r\n <div className=\"rqd-ticket-card-top\">\r\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\r\n <span className=\"rqd-badge\">{ticket.status}</span>\r\n </div>\r\n <span className=\"rqd-ticket-card-title\">{ticket.title}</span>\r\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { widgetTicketDetailOptions } from '../queries'\r\nimport { submitReply, closeTicket, type AttachmentMeta, type TicketDetail } from '../../api-client'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface TicketDetailViewProps {\r\n ticketId: string\r\n onBack: () => void\r\n}\r\n\r\nfunction formatDate(iso: string): string {\r\n try { return new Date(iso).toLocaleString() } catch { return iso }\r\n}\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\r\n}\r\n\r\nexport function TicketDetailView({ ticketId, onBack }: TicketDetailViewProps) {\r\n const ctx = useReqdeskContext()\r\n const queryClient = useQueryClient()\r\n const [replyBody, setReplyBody] = useState('')\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const { data: ticket, isLoading, error } = useQuery(widgetTicketDetailOptions(ticketId))\r\n\r\n const replyMutation = useMutation({\r\n mutationFn: (body: string) => submitReply(ticketId, body),\r\n onMutate: async (body) => {\r\n // Optimistic update: append reply to cache\r\n await queryClient.cancelQueries({ queryKey: ['widget-ticket', ticketId] })\r\n const previous = queryClient.getQueryData<TicketDetail>(['widget-ticket', ticketId])\r\n\r\n if (previous) {\r\n queryClient.setQueryData<TicketDetail>(['widget-ticket', ticketId], {\r\n ...previous,\r\n replies: [...previous.replies, {\r\n id: `optimistic-${Date.now()}`,\r\n body,\r\n authorName: ctx.userName ?? ctx.userEmail ?? 'You',\r\n isStaff: false,\r\n createdAt: new Date().toISOString(),\r\n }],\r\n })\r\n }\r\n return { previous }\r\n },\r\n onSuccess: () => {\r\n setReplyBody('')\r\n queryClient.invalidateQueries({ queryKey: ['widget-ticket', ticketId] })\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(['widget-ticket', ticketId], context.previous)\r\n }\r\n },\r\n })\r\n\r\n const resolveMutation = useMutation({\r\n mutationFn: () => closeTicket(ticketId),\r\n onMutate: async () => {\r\n await queryClient.cancelQueries({ queryKey: ['widget-ticket', ticketId] })\r\n const previous = queryClient.getQueryData<TicketDetail>(['widget-ticket', ticketId])\r\n if (previous) {\r\n queryClient.setQueryData<TicketDetail>(['widget-ticket', ticketId], {\r\n ...previous,\r\n status: 'resolved',\r\n })\r\n }\r\n return { previous }\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: ['widget-ticket', ticketId] })\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(['widget-ticket', ticketId], context.previous)\r\n }\r\n },\r\n })\r\n\r\n if (isLoading) {\r\n return <div className=\"rqd-loading\">{t('detail.loading')}</div>\r\n }\r\n\r\n if (error || !ticket) {\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <p>{t('error.generic')}</p>\r\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={onBack}>\r\n {t('tracker.back')}\r\n </button>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div>\r\n <div className=\"rqd-ticket-header\">\r\n <h3>{ticket.title}</h3>\r\n <div className=\"rqd-ticket-header-meta\">\r\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\r\n <span className=\"rqd-badge\">{ticket.status}</span>\r\n <span className=\"rqd-badge\" style={{ background: 'var(--rqd-bg-secondary)', color: 'var(--rqd-text-secondary)' }}>\r\n {ticket.priority}\r\n </span>\r\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\r\n </div>\r\n </div>\r\n\r\n {ticket.description && (\r\n <>\r\n <div className=\"rqd-section-title\">{t('detail.description')}</div>\r\n <div className=\"rqd-ticket-desc\">{ticket.description}</div>\r\n </>\r\n )}\r\n\r\n {ticket.attachments.length > 0 && (\r\n <>\r\n <div className=\"rqd-section-title\">{t('detail.attachments')}</div>\r\n <div className=\"rqd-attachment-list\">\r\n {ticket.attachments.map((a: AttachmentMeta) => (\r\n <div key={a.id} className=\"rqd-attachment-item\">\r\n <div className=\"rqd-file-item-info\">\r\n <span className=\"rqd-file-item-name\">{a.fileName}</span>\r\n <span className=\"rqd-file-item-size\">{formatFileSize(a.fileSize)}</span>\r\n </div>\r\n {a.downloadUrl && (\r\n <a href={a.downloadUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n {t('attach.download')}\r\n </a>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n <div className=\"rqd-section-title\">{t('detail.replies')}</div>\r\n {ticket.replies.length === 0 ? (\r\n <p style={{ color: 'var(--rqd-text-secondary)', fontSize: 13, margin: '0 0 12px' }}>\r\n {t('detail.noReplies')}\r\n </p>\r\n ) : (\r\n <div>\r\n {ticket.replies.map(reply => (\r\n <div key={reply.id} className=\"rqd-reply\">\r\n <div className=\"rqd-reply-header\">\r\n <span className={reply.isStaff ? 'rqd-reply-staff' : ''}>\r\n {reply.isStaff ? `${reply.authorName} \\u00b7 ${t('detail.staff')}` : reply.authorName}\r\n </span>\r\n <span>{formatDate(reply.createdAt)}</span>\r\n </div>\r\n <div className=\"rqd-reply-body\">{reply.body}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"rqd-reply-compose\">\r\n <textarea\r\n className=\"rqd-textarea\"\r\n value={replyBody}\r\n onChange={(e) => setReplyBody(e.target.value)}\r\n placeholder={t('detail.replyPlaceholder')}\r\n rows={3}\r\n />\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <button\r\n className=\"rqd-btn rqd-btn-primary\"\r\n style={{ flex: 1 }}\r\n onClick={() => replyMutation.mutate(replyBody.trim())}\r\n disabled={!replyBody.trim() || replyMutation.isPending}\r\n >\r\n {replyMutation.isPending ? t('detail.sending') : t('detail.sendReply')}\r\n </button>\r\n {ticket.status !== 'resolved' && ticket.status !== 'closed' && (\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n style={{ flex: 0, whiteSpace: 'nowrap', padding: '10px 16px' }}\r\n onClick={() => resolveMutation.mutate()}\r\n disabled={resolveMutation.isPending}\r\n >\r\n {resolveMutation.isPending ? t('detail.resolving') : t('detail.resolve')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback, type FormEvent } from 'react'\r\nimport { useMutation } from '@tanstack/react-query'\r\nimport { useReqdeskContext } from '../ReqdeskProvider'\r\nimport { trackTicket } from '../../api-client'\r\nimport { getTrackingTokens } from '../../storage'\r\nimport { en } from '../../i18n/en'\r\nimport { ar } from '../../i18n/ar'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ninterface TrackTicketViewProps {\r\n onTrackSuccess: (ticketId: string) => void\r\n}\r\n\r\nexport function TrackTicketView({ onTrackSuccess }: TrackTicketViewProps) {\r\n const ctx = useReqdeskContext()\r\n const [token, setToken] = useState('')\r\n const savedTokens = getTrackingTokens(ctx.apiKey)\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[ctx.language] ?? translations.en\r\n return lang[key] ?? key\r\n }, [ctx.language, ctx.translations])\r\n\r\n const trackMutation = useMutation({\r\n mutationFn: (trackToken: string) => trackTicket(trackToken.trim()),\r\n onSuccess: (result) => onTrackSuccess(result.id),\r\n })\r\n\r\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n if (token.trim()) trackMutation.mutate(token)\r\n }\r\n\r\n return (\r\n <div>\r\n <form onSubmit={handleSubmit}>\r\n <div className=\"rqd-form-group\">\r\n <input\r\n className=\"rqd-input\"\r\n value={token}\r\n onChange={(e) => setToken(e.target.value)}\r\n placeholder={t('track.tokenPlaceholder')}\r\n required\r\n />\r\n {trackMutation.isError && <div className=\"rqd-error-text\">{t('track.invalidToken')}</div>}\r\n </div>\r\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={trackMutation.isPending || !token.trim()}>\r\n {trackMutation.isPending ? t('track.tracking') : t('track.submit')}\r\n </button>\r\n </form>\r\n\r\n {savedTokens.length > 0 && (\r\n <div style={{ marginTop: 20 }}>\r\n <div className=\"rqd-section-title\">{t('track.recentTickets')}</div>\r\n <div className=\"rqd-ticket-list\">\r\n {savedTokens.slice(0, 5).map(tk => (\r\n <button\r\n key={tk}\r\n className=\"rqd-ticket-card\"\r\n style={{ border: 'none', textAlign: 'start', width: '100%' }}\r\n onClick={() => trackMutation.mutate(tk)}\r\n >\r\n <span className=\"rqd-ticket-card-number\" style={{ fontFamily: 'monospace', fontSize: 12 }}>\r\n {tk.slice(0, 20)}...\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback } from 'react'\r\nimport { useReqdeskContext } from './ReqdeskProvider'\r\nimport { en } from '../i18n/en'\r\nimport { ar } from '../i18n/ar'\r\nimport { themeToStyle } from '../theme'\r\nimport { saveWidgetConfig, loadWidgetConfig, loadWidgetEmail, clearWidgetEmail } from '../storage'\r\nimport { login, logout, isAuthConfigured } from '../auth/widget-auth'\r\nimport { ShadowRoot } from './shadow-root'\r\nimport { SubmitTicketView } from './views/SubmitTicketView'\r\nimport { MyTicketsView } from './views/MyTicketsView'\r\nimport { TicketDetailView } from './views/TicketDetailView'\r\nimport { TrackTicketView } from './views/TrackTicketView'\r\nimport type { TicketResult, WidgetError } from './types'\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\n\r\ntype WidgetView = 'home' | 'new-ticket' | 'my-tickets' | 'ticket-detail' | 'track' | 'kb' | 'preferences'\r\n\r\ninterface FloatingWidgetProps {\r\n position?: 'bottom-right' | 'bottom-left'\r\n contained?: boolean\r\n onTicketCreated?: (ticket: TicketResult) => void\r\n onError?: (error: WidgetError) => void\r\n}\r\n\r\nconst ICONS = {\r\n chat: 'M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z',\r\n close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\r\n newTicket: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\r\n tickets: 'M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 15.01l1.41 1.41L11 14.84V19h2v-4.16l1.59 1.59L16 15.01 12.01 11z',\r\n track: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z',\r\n kb: 'M21 5c-1.11-.35-2.33-.5-3.5-.5-1.95 0-4.05.4-5.5 1.5-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5 1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5V6c-.6-.45-1.25-.75-2-1zm0 13.5c-1.1-.35-2.3-.5-3.5-.5-1.7 0-4.15.65-5.5 1.5V8c1.35-.85 3.8-1.5 5.5-1.5 1.2 0 2.4.15 3.5.5v11.5z',\r\n back: 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\r\n backRtl: 'M4 11h12.17l-5.59-5.59L12 4l8 8-8 8-1.41-1.41L16.17 13H4v-2z',\r\n settings: 'M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.49.49 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96a.49.49 0 00-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 1115.6 12 3.6 3.6 0 0112 15.6z',\r\n}\r\n\r\nfunction SvgIcon({ path, size = 20 }: { path: string; size?: number }) {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\" style={{ display: 'block', flexShrink: 0 }}>\r\n <path d={path} />\r\n </svg>\r\n )\r\n}\r\n\r\nexport function FloatingWidget({\r\n position = 'bottom-right',\r\n contained = false,\r\n onTicketCreated,\r\n onError,\r\n}: FloatingWidgetProps) {\r\n const ctx = useReqdeskContext()\r\n const [isOpen, setIsOpen] = useState(false)\r\n const [view, setView] = useState<WidgetView>('home')\r\n const [selectedTicketId, setSelectedTicketId] = useState<string | null>(null)\r\n const [emailCleared, setEmailCleared] = useState(false)\r\n\r\n const savedPrefs = loadWidgetConfig(ctx.apiKey)\r\n const [userLang, setUserLang] = useState<string | null>(savedPrefs?.language ?? null)\r\n const [userThemeMode, setUserThemeMode] = useState<string | null>(savedPrefs?.theme?.mode ?? null)\r\n const [userColor, setUserColor] = useState<string | null>(savedPrefs?.theme?.primaryColor ?? null)\r\n\r\n const activeLang = userLang ?? ctx.language ?? 'en'\r\n const activeThemeMode = (userThemeMode ?? ctx.theme?.mode ?? 'light') as 'light' | 'dark' | 'auto'\r\n const activeColor = userColor ?? ctx.theme?.primaryColor ?? '#42b983'\r\n const activeTheme = { ...ctx.theme, mode: activeThemeMode, primaryColor: activeColor }\r\n\r\n const t = useCallback((key: string): string => {\r\n if (ctx.translations?.[key]) return ctx.translations[key]\r\n const lang = translations[activeLang] ?? translations.en\r\n return lang[key] ?? key\r\n }, [activeLang, ctx.translations])\r\n\r\n const isRtl = activeLang === 'ar'\r\n const cssVars = themeToStyle(activeTheme)\r\n const posClass = `rqd-${position}`\r\n const containedClass = contained ? ' rqd-contained' : ''\r\n const brandName = ctx.theme?.brandName\r\n const brandLogo = ctx.theme?.logo\r\n const hideBranding = ctx.theme?.hideBranding === true\r\n\r\n // Derive projectId from API key context (resolved server-side)\r\n const projectId = '_current'\r\n\r\n function toggleOpen() {\r\n setIsOpen(prev => !prev)\r\n if (!isOpen) {\r\n setView('home')\r\n setSelectedTicketId(null)\r\n }\r\n }\r\n\r\n function goHome() {\r\n setView('home')\r\n setSelectedTicketId(null)\r\n setEmailCleared(false)\r\n }\r\n\r\n function handleLangChange(lang: string) {\r\n setUserLang(lang)\r\n saveWidgetConfig(ctx.apiKey, { language: lang })\r\n }\r\n\r\n function handleThemeChange(mode: string) {\r\n setUserThemeMode(mode)\r\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: mode as 'light' | 'dark' | 'auto', primaryColor: activeColor } })\r\n }\r\n\r\n function handleColorChange(color: string) {\r\n setUserColor(color)\r\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: activeThemeMode, primaryColor: color } })\r\n }\r\n\r\n const COLOR_PRESETS = [\r\n { color: '#42b983', label: 'Green' },\r\n { color: '#3b82f6', label: 'Blue' },\r\n { color: '#8b5cf6', label: 'Purple' },\r\n { color: '#f59e0b', label: 'Orange' },\r\n { color: '#ef4444', label: 'Red' },\r\n ]\r\n\r\n function handleClearEmail() {\r\n clearWidgetEmail(ctx.apiKey)\r\n setEmailCleared(true)\r\n setTimeout(() => setEmailCleared(false), 2000)\r\n }\r\n\r\n function openTicketDetail(ticketId: string) {\r\n setSelectedTicketId(ticketId)\r\n setView('ticket-detail')\r\n }\r\n\r\n const menuItems = [\r\n { key: 'new-ticket' as const, icon: ICONS.newTicket, label: t('menu.newTicket'), desc: t('menu.newTicketDesc') },\r\n { key: 'my-tickets' as const, icon: ICONS.tickets, label: t('menu.myTickets'), desc: t('menu.myTicketsDesc') },\r\n { key: 'track' as const, icon: ICONS.track, label: t('menu.trackTicket'), desc: t('menu.trackTicketDesc') },\r\n { key: 'kb' as const, icon: ICONS.kb, label: t('menu.knowledgeBase'), desc: t('menu.knowledgeBaseDesc') },\r\n { key: 'preferences' as const, icon: ICONS.settings, label: t('menu.preferences'), desc: t('menu.preferencesDesc') },\r\n ]\r\n\r\n function renderViewContent() {\r\n switch (view) {\r\n case 'home':\r\n return (\r\n <div className=\"rqd-menu\">\r\n {menuItems.map(item => (\r\n <button\r\n key={item.key}\r\n className=\"rqd-menu-item\"\r\n onClick={() => setView(item.key)}\r\n >\r\n <div className=\"rqd-menu-icon\">\r\n <SvgIcon path={item.icon} size={22} />\r\n </div>\r\n <div className=\"rqd-menu-text\">\r\n <span className=\"rqd-menu-label\">{item.label}</span>\r\n <span className=\"rqd-menu-desc\">{item.desc}</span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )\r\n\r\n case 'new-ticket':\r\n return (\r\n <SubmitTicketView\r\n projectId={projectId}\r\n onSuccess={(result) => {\r\n onTicketCreated?.(result)\r\n }}\r\n onError={onError}\r\n isAuthenticated={ctx.isAuthenticated}\r\n userEmail={ctx.userEmail}\r\n />\r\n )\r\n\r\n case 'my-tickets':\r\n return (\r\n <MyTicketsView\r\n projectId={projectId}\r\n onSelectTicket={openTicketDetail}\r\n isAuthenticated={ctx.isAuthenticated}\r\n userEmail={ctx.userEmail}\r\n />\r\n )\r\n\r\n case 'ticket-detail':\r\n if (!selectedTicketId) return null\r\n return (\r\n <TicketDetailView\r\n ticketId={selectedTicketId}\r\n onBack={() => setView('my-tickets')}\r\n />\r\n )\r\n\r\n case 'track':\r\n return (\r\n <TrackTicketView\r\n onTrackSuccess={openTicketDetail}\r\n />\r\n )\r\n\r\n case 'kb':\r\n return (\r\n <div className=\"rqd-placeholder\">\r\n <SvgIcon path={ICONS.kb} size={40} />\r\n <p>{t('menu.kbPlaceholder')}</p>\r\n </div>\r\n )\r\n\r\n case 'preferences':\r\n return (\r\n <div className=\"rqd-prefs\">\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.language')}</span>\r\n <div className=\"rqd-prefs-options\">\r\n <button\r\n className={`rqd-prefs-option${activeLang === 'en' ? ' rqd-active' : ''}`}\r\n onClick={() => handleLangChange('en')}\r\n >\r\n English\r\n </button>\r\n <button\r\n className={`rqd-prefs-option${activeLang === 'ar' ? ' rqd-active' : ''}`}\r\n onClick={() => handleLangChange('ar')}\r\n >\r\n العربية\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.theme')}</span>\r\n <div className=\"rqd-prefs-options\">\r\n {(['light', 'dark', 'auto'] as const).map(mode => (\r\n <button\r\n key={mode}\r\n className={`rqd-prefs-option${activeThemeMode === mode ? ' rqd-active' : ''}`}\r\n onClick={() => handleThemeChange(mode)}\r\n >\r\n {t(`prefs.${mode}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Accent Color */}\r\n <div className=\"rqd-prefs-group\">\r\n <span className=\"rqd-prefs-label\">{t('prefs.accentColor')}</span>\r\n <div className=\"rqd-color-presets\">\r\n {COLOR_PRESETS.map(preset => (\r\n <button\r\n key={preset.color}\r\n className={`rqd-color-preset${activeColor === preset.color ? ' rqd-active' : ''}`}\r\n style={{ background: preset.color, color: preset.color }}\r\n onClick={() => handleColorChange(preset.color)}\r\n aria-label={preset.label}\r\n title={preset.label}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Clear saved email */}\r\n {loadWidgetEmail(ctx.apiKey) && (\r\n <div className=\"rqd-prefs-group\">\r\n <button\r\n className=\"rqd-btn rqd-btn-secondary\"\r\n onClick={handleClearEmail}\r\n style={{ width: 'auto', padding: '8px 16px' }}\r\n >\r\n {emailCleared ? t('prefs.emailCleared') : t('prefs.clearEmail')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n }\r\n\r\n const viewTitle: Record<WidgetView, string> = {\r\n home: brandName ?? t('widget.title'),\r\n 'new-ticket': t('widget.newTicket'),\r\n 'my-tickets': t('menu.myTickets'),\r\n 'ticket-detail': t('menu.myTickets'),\r\n track: t('widget.trackTicket'),\r\n kb: t('menu.knowledgeBase'),\r\n preferences: t('prefs.title'),\r\n }\r\n\r\n const canGoBack = view !== 'home'\r\n const goBackTarget = view === 'ticket-detail' ? 'my-tickets' : 'home'\r\n\r\n return (\r\n <ShadowRoot>\r\n <div\r\n style={cssVars as React.CSSProperties}\r\n {...(isRtl ? { dir: 'rtl' } : {})}\r\n >\r\n <button\r\n className={`rqd-fab ${posClass}${containedClass}`}\r\n onClick={toggleOpen}\r\n aria-label={isOpen ? t('widget.close') : t('widget.title')}\r\n >\r\n <SvgIcon path={isOpen ? ICONS.close : ICONS.chat} size={24} />\r\n </button>\r\n\r\n <div className={`rqd-panel ${posClass}${containedClass}${isOpen ? '' : ' rqd-hidden'}`}>\r\n <div className=\"rqd-header\">\r\n <div className=\"rqd-header-brand\">\r\n {canGoBack && (\r\n <button\r\n className=\"rqd-header-close\"\r\n onClick={() => goBackTarget === 'home' ? goHome() : setView(goBackTarget as WidgetView)}\r\n aria-label={t('tracker.back')}\r\n >\r\n <SvgIcon path={isRtl ? ICONS.backRtl : ICONS.back} size={18} />\r\n </button>\r\n )}\r\n {view === 'home' && brandLogo && (\r\n <img src={brandLogo} alt=\"\" className=\"rqd-header-logo\" />\r\n )}\r\n <span className=\"rqd-header-title\">{viewTitle[view]}</span>\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n {(ctx.auth || isAuthConfigured()) && view === 'home' && (\r\n <button\r\n className=\"rqd-auth-btn\"\r\n onClick={() => ctx.isAuthenticated ? logout() : login()}\r\n aria-label={ctx.isAuthenticated ? t('auth.logout') : t('auth.login')}\r\n >\r\n {ctx.isAuthenticated ? ctx.userName ?? t('auth.logout') : t('auth.login')}\r\n </button>\r\n )}\r\n <button\r\n className=\"rqd-header-close\"\r\n onClick={toggleOpen}\r\n aria-label={t('widget.close')}\r\n >\r\n <SvgIcon path={ICONS.close} size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rqd-body\">\r\n {renderViewContent()}\r\n </div>\r\n\r\n {!hideBranding && (\r\n <div className=\"rqd-footer\">\r\n <span>{t('branding.poweredBy')}</span>\r\n <a href=\"https://reqdesk.com\" target=\"_blank\" rel=\"noopener noreferrer\">Reqdesk</a>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </ShadowRoot>\r\n )\r\n}\r\n"],"mappings":"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"}
|