@reqdesk/widget 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +334 -0
- package/dist/index-2oPxlN4_.d.cts +17 -0
- package/dist/index-2oPxlN4_.d.cts.map +1 -0
- package/dist/index-B8fhsCuv.d.ts +17 -0
- package/dist/index-B8fhsCuv.d.ts.map +1 -0
- package/dist/index.cjs +919 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.iife.js +117 -0
- package/dist/index.js +912 -0
- package/dist/index.js.map +1 -0
- package/dist/react-8GCnIHnw.d.cts +107 -0
- package/dist/react-8GCnIHnw.d.cts.map +1 -0
- package/dist/react-D69QlAm1.d.ts +107 -0
- package/dist/react-D69QlAm1.d.ts.map +1 -0
- package/dist/react.cjs +1642 -0
- package/dist/react.d.cts +1 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +1637 -0
- package/dist/react.js.map +1 -0
- package/dist/storage-CC5BCsxP.js +722 -0
- package/dist/storage-CC5BCsxP.js.map +1 -0
- package/dist/storage-Db9XjupR.cjs +845 -0
- package/dist/types-CRxzGfna.d.cts +72 -0
- package/dist/types-CRxzGfna.d.cts.map +1 -0
- package/dist/types-gPfzZQw5.d.ts +72 -0
- package/dist/types-gPfzZQw5.d.ts.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +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/views/SubmitTicketView.tsx","../src/react/queries.ts","../src/react/views/MyTicketsView.tsx","../src/react/views/TicketDetailView.tsx","../src/react/views/TrackTicketView.tsx","../src/react/FloatingWidget.tsx"],"sourcesContent":["import 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\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 async function initWidgetAuth(config: OidcAuthConfig): Promise<void> {\n setState({ isLoading: true })\n\n try {\n const { createOidc } = await import('oidc-spa/core')\n const oidc = await createOidc({\n issuerUri: config.issuerUri,\n clientId: config.clientId,\n })\n\n oidcInstance = oidc\n\n if (oidc.isUserLoggedIn) {\n // Register token provider — ofetch will call getTokens() on every request\n // oidc-spa handles refresh internally when token is expired\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 // Subscribe to token changes for UI updates (name/email display)\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) return\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'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { configureWidgetClient } from '../ofetch-client'\nimport { loadWidgetConfig, saveWidgetConfig } from '../storage'\nimport { initWidgetAuth, getAuthState, onAuthStateChange, type WidgetAuthState } from '../auth/widget-auth'\nimport type { ReqdeskProviderProps, ReqdeskContextValue } from './types'\n\nconst ReqdeskContext = createContext<ReqdeskContextValue | null>(null)\n\nexport function useReqdeskContext(): ReqdeskContextValue {\n const ctx = useContext(ReqdeskContext)\n if (!ctx) throw new Error('useReqdesk must be used within a <ReqdeskProvider>')\n return ctx\n}\n\n// Widget-scoped QueryClient — completely isolated from host app\nconst widgetQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n gcTime: 10 * 60 * 1000,\n retry: (failureCount, error) => {\n const status = (error as any)?.status ?? (error as any)?.statusCode\n if (status && status >= 400 && status < 500 && status !== 408) return false\n if (status && status >= 500) return false\n return failureCount < 2\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: false,\n },\n },\n})\n\nexport function ReqdeskProvider({ apiKey, auth, theme, language, customer, translations, children }: ReqdeskProviderProps) {\n const initialized = useRef(false)\n const [authState, setAuthState] = useState<WidgetAuthState>(getAuthState)\n\n const saved = initialized.current ? null : loadWidgetConfig(apiKey)\n const resolvedLanguage = language ?? saved?.language ?? 'en'\n const resolvedTheme = theme ?? saved?.theme\n\n useEffect(() => {\n if (!initialized.current) {\n configureWidgetClient(window.location.origin, apiKey)\n initialized.current = true\n\n if (auth) {\n initWidgetAuth(auth)\n }\n }\n }, [apiKey, auth])\n\n useEffect(() => {\n return onAuthStateChange(setAuthState)\n }, [])\n\n useEffect(() => {\n saveWidgetConfig(apiKey, {\n language: resolvedLanguage,\n theme: resolvedTheme,\n })\n }, [apiKey, resolvedLanguage, resolvedTheme])\n\n const value = useMemo<ReqdeskContextValue>(() => ({\n apiKey,\n auth,\n theme: resolvedTheme,\n language: resolvedLanguage,\n customer,\n translations,\n isAuthenticated: authState.isAuthenticated,\n userEmail: authState.userEmail,\n userName: authState.userName,\n }), [apiKey, auth, resolvedTheme, resolvedLanguage, customer, translations, authState])\n\n return (\n <ReqdeskContext.Provider value={value}>\n <QueryClientProvider client={widgetQueryClient}>\n {children}\n </QueryClientProvider>\n </ReqdeskContext.Provider>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { submitTicket as apiSubmitTicket, trackTicket as apiTrackTicket, submitTrackingReply as apiSubmitTrackingReply } from '../api-client'\nimport type { SubmitTicketData, TicketResult, TrackedTicketResult, WidgetError, UseReqdeskReturn } from './types'\nimport { useReqdeskContext } from './ReqdeskProvider'\n\nexport function useReqdesk(): UseReqdeskReturn {\n useReqdeskContext() // ensure we're inside a provider\n\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<WidgetError | null>(null)\n\n const submitTicket = useCallback(async (data: SubmitTicketData): Promise<TicketResult> => {\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiSubmitTicket('_current', data)\n return result\n } catch (err) {\n const widgetError = err as WidgetError\n setError(widgetError)\n throw widgetError\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n const trackTicket = useCallback(async (token: string): Promise<TrackedTicketResult> => {\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiTrackTicket(token)\n return result\n } catch (err) {\n const widgetError = err as WidgetError\n setError(widgetError)\n throw widgetError\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n const submitTrackingReply = useCallback(async (token: string, body: string): Promise<void> => {\n setIsLoading(true)\n setError(null)\n try {\n await apiSubmitTrackingReply(token, body)\n } catch (err) {\n const widgetError = err as WidgetError\n setError(widgetError)\n throw widgetError\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n return { submitTicket, trackTicket, submitTrackingReply, isLoading, error }\n}\n","import { useRef, useEffect, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getWidgetStyles } from '../theme'\n\ninterface ShadowRootProps {\n children: ReactNode\n}\n\nexport function ShadowRoot({ children }: ShadowRootProps) {\n const hostRef = useRef<HTMLDivElement>(null)\n const [mountPoint, setMountPoint] = useState<HTMLElement | null>(null)\n\n useEffect(() => {\n const host = hostRef.current\n if (!host || host.shadowRoot) return\n\n const shadow = host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = getWidgetStyles()\n shadow.appendChild(style)\n\n const mount = document.createElement('div')\n mount.className = 'rqd-root'\n shadow.appendChild(mount)\n\n setMountPoint(mount)\n }, [])\n\n return (\n <div ref={hostRef}>\n {mountPoint && createPortal(children, mountPoint)}\n </div>\n )\n}\n","import { useState, useCallback, type FormEvent } from 'react'\nimport { useReqdesk } from './useReqdesk'\nimport { useReqdeskContext } from './ReqdeskProvider'\nimport { en } from '../i18n/en'\nimport { ar } from '../i18n/ar'\nimport { themeToVars } from '../theme'\nimport { saveTrackingToken } from '../storage'\nimport type { TicketFormProps, TicketResult, WidgetError, SubmitTicketData } from './types'\nimport { ShadowRoot } from './shadow-root'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\nexport function TicketForm({ mode = 'inline', onTicketCreated, onError, className, style }: TicketFormProps) {\n const ctx = useReqdeskContext()\n const { submitTicket, isLoading } = useReqdesk()\n const [success, setSuccess] = useState<TicketResult | null>(null)\n const [errors, setErrors] = useState<Record<string, string>>({})\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[ctx.language] ?? translations.en\n return lang[key] ?? key\n }, [ctx.language, ctx.translations])\n\n const handleSubmit = useCallback(async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const form = e.currentTarget\n const formData = new FormData(form)\n\n const title = (formData.get('title') as string)?.trim() ?? ''\n const email = (formData.get('email') as string)?.trim() ?? ''\n const newErrors: Record<string, string> = {}\n\n if (!title) newErrors.title = t('error.required')\n else if (title.length < 5) newErrors.title = t('error.titleMin')\n if (!email) newErrors.email = t('error.required')\n else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) newErrors.email = t('error.emailInvalid')\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors)\n return\n }\n\n setErrors({})\n const data: SubmitTicketData = {\n title,\n description: (formData.get('description') as string)?.trim() || undefined,\n email,\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\n }\n\n try {\n const result = await submitTicket(data)\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\n setSuccess(result)\n onTicketCreated?.(result)\n } catch (err) {\n onError?.(err as WidgetError)\n }\n }, [submitTicket, ctx.apiKey, ctx.translations, ctx.language, onTicketCreated, onError, t])\n\n const cssVars = themeToVars(ctx.theme)\n\n const content = success ? (\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\n {success.trackingToken && (\n <>\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\n <button\n className=\"rqd-btn rqd-btn-secondary\"\n onClick={() => navigator.clipboard.writeText(success.trackingToken!)}\n >\n {t('success.copyToken')}\n </button>\n </>\n )}\n </div>\n ) : (\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.title')}</label>\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\n </div>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.description')}</label>\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\n </div>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.email')}</label>\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} required />\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\n </div>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.priority')}</label>\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\n <option value=\"low\">{t('form.priorityLow')}</option>\n <option value=\"medium\">{t('form.priorityMedium')}</option>\n <option value=\"high\">{t('form.priorityHigh')}</option>\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\n </select>\n </div>\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={isLoading}>\n {isLoading ? t('form.submitting') : t('form.submit')}\n </button>\n </form>\n )\n\n if (mode === 'floating') {\n return (\n <ShadowRoot>\n <div className={className} style={{ ...style, cssText: cssVars } as React.CSSProperties}>\n <div className=\"rqd-body\">{content}</div>\n </div>\n </ShadowRoot>\n )\n }\n\n return (\n <ShadowRoot>\n <div className={`rqd-inline ${className ?? ''}`} style={{ cssText: cssVars } as React.CSSProperties}>\n <div className=\"rqd-body\">{content}</div>\n </div>\n </ShadowRoot>\n )\n}\n","import { useReqdeskContext } from './ReqdeskProvider'\nimport { useReqdesk } from './useReqdesk'\nimport { themeToVars } from '../theme'\nimport { ShadowRoot } from './shadow-root'\nimport type { SupportPortalProps } from './types'\n\nexport function SupportPortal({ className }: SupportPortalProps) {\n const ctx = useReqdeskContext()\n const { isLoading } = useReqdesk()\n const cssVars = themeToVars(ctx.theme)\n\n return (\n <ShadowRoot>\n <div className={`rqd-inline ${className ?? ''}`} style={{ cssText: cssVars } as React.CSSProperties}>\n <div className=\"rqd-body\">\n {isLoading ? (\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)' }}>Loading...</p>\n ) : (\n <p style={{ textAlign: 'center', color: 'var(--rqd-text-secondary)', padding: '24px 0' }}>\n Support Portal — coming in a future update.\n </p>\n )}\n </div>\n </div>\n </ShadowRoot>\n )\n}\n","import { useState, useRef, useCallback, type FormEvent, type DragEvent } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { useReqdeskContext } from '../ReqdeskProvider'\nimport { submitTicket as apiSubmitTicket, uploadAttachment } from '../../api-client'\nimport { saveTrackingToken, saveWidgetEmail, loadWidgetEmail } from '../../storage'\nimport { en } from '../../i18n/en'\nimport { ar } from '../../i18n/ar'\nimport type { TicketResult, WidgetError, SubmitTicketData } from '../types'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\nconst ALLOWED_MIME_TYPES = new Set([\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp',\n 'application/pdf',\n 'text/plain', 'text/csv',\n 'application/zip', 'application/x-zip-compressed',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n])\n\nconst BLOCKED_EXTENSIONS = new Set(['.exe', '.bat', '.cmd', '.sh', '.ps1', '.msi', '.dll', '.scr'])\nconst MAX_FILES = 5\nconst MAX_SIZE_MB = 10\n\ninterface SubmitTicketViewProps {\n projectId: string\n onSuccess?: (result: TicketResult) => void\n onError?: (error: WidgetError) => void\n isAuthenticated?: boolean\n userEmail?: string\n}\n\ninterface QueuedFile {\n file: File\n id: string\n error?: string\n}\n\ninterface UploadProgress {\n fileId: string\n fileName: string\n percent: number\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, userEmail }: SubmitTicketViewProps) {\n const ctx = useReqdeskContext()\n const fileInputRef = useRef<HTMLInputElement>(null)\n const savedEmail = loadWidgetEmail(ctx.apiKey)\n\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [files, setFiles] = useState<QueuedFile[]>([])\n const [isDragOver, setIsDragOver] = useState(false)\n const [uploadProgress, setUploadProgress] = useState<UploadProgress | null>(null)\n const [success, setSuccess] = useState<TicketResult | null>(null)\n const [rememberEmail, setRememberEmail] = useState(!!savedEmail)\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[ctx.language] ?? translations.en\n return lang[key] ?? key\n }, [ctx.language, ctx.translations])\n\n const submitMutation = useMutation({\n mutationFn: async ({ data, validFiles }: { data: SubmitTicketData; validFiles: QueuedFile[] }) => {\n const result = await apiSubmitTicket(projectId, data)\n if (result.trackingToken) saveTrackingToken(ctx.apiKey, result.trackingToken)\n\n // Upload attachments sequentially after ticket creation\n for (const queued of validFiles) {\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent: 0 })\n await uploadAttachment(result.id, queued.file, (percent) => {\n setUploadProgress({ fileId: queued.id, fileName: queued.file.name, percent })\n })\n }\n setUploadProgress(null)\n return result\n },\n onSuccess: (result) => {\n setSuccess(result)\n onSuccess?.(result)\n },\n onError: (err) => {\n setUploadProgress(null)\n onError?.(err as unknown as WidgetError)\n },\n })\n\n function validateFile(file: File): string | null {\n const ext = '.' + file.name.split('.').pop()?.toLowerCase()\n if (BLOCKED_EXTENSIONS.has(ext)) return t('attach.invalidType')\n if (!ALLOWED_MIME_TYPES.has(file.type) && !file.type.startsWith('application/vnd.openxmlformats-officedocument.')) {\n return t('attach.invalidType')\n }\n if (file.size > MAX_SIZE_MB * 1024 * 1024) return t('attach.tooLarge')\n return null\n }\n\n function addFiles(newFiles: FileList | File[]) {\n const toAdd: QueuedFile[] = []\n for (const file of Array.from(newFiles)) {\n if (files.length + toAdd.length >= MAX_FILES) break\n const error = validateFile(file)\n toAdd.push({ file, id: crypto.randomUUID(), error: error ?? undefined })\n }\n setFiles(prev => [...prev, ...toAdd])\n }\n\n function removeFile(id: string) {\n setFiles(prev => prev.filter(f => f.id !== id))\n }\n\n function handleDragOver(e: DragEvent) { e.preventDefault(); setIsDragOver(true) }\n function handleDragLeave(e: DragEvent) { e.preventDefault(); setIsDragOver(false) }\n function handleDrop(e: DragEvent) {\n e.preventDefault(); setIsDragOver(false)\n if (e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files)\n }\n\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault()\n const form = e.currentTarget\n const formData = new FormData(form)\n\n const title = (formData.get('title') as string)?.trim() ?? ''\n const email = (formData.get('email') as string)?.trim() ?? userEmail ?? ''\n const newErrors: Record<string, string> = {}\n\n if (!title) newErrors.title = t('error.required')\n else if (title.length < 5) newErrors.title = t('error.titleMin')\n if (!isAuthenticated && email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n newErrors.email = t('error.emailInvalid')\n }\n\n if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return }\n setErrors({})\n\n if (rememberEmail && email) saveWidgetEmail(ctx.apiKey, email)\n\n const validFiles = files.filter(f => !f.error)\n const data: SubmitTicketData = {\n title,\n description: (formData.get('description') as string)?.trim() || undefined,\n email,\n priority: (formData.get('priority') as SubmitTicketData['priority']) ?? 'medium',\n }\n\n submitMutation.mutate({ data, validFiles })\n }\n\n if (success) {\n return (\n <div className=\"rqd-success\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div style={{ fontSize: 48, marginBottom: 12 }}>{'\\u2705'}</div>\n <h3 style={{ margin: '0 0 8px', fontSize: 18 }}>{t('success.title')}</h3>\n <p>{t('success.ticketNumber')}{success.ticketNumber}</p>\n {success.trackingToken && (\n <>\n <p style={{ fontSize: 13, color: 'var(--rqd-text-secondary)' }}>{t('success.trackingHint')}</p>\n <div className=\"rqd-token-box\">{success.trackingToken}</div>\n <button className=\"rqd-btn rqd-btn-secondary\" onClick={() => navigator.clipboard.writeText(success.trackingToken!)}>\n {t('success.copyToken')}\n </button>\n </>\n )}\n </div>\n )\n }\n\n if (submitMutation.isPending && uploadProgress) {\n return (\n <div style={{ padding: '24px 0', textAlign: 'center' }}>\n <p style={{ marginBottom: 12, fontWeight: 500 }}>{t('attach.uploading')}</p>\n <div className=\"rqd-file-item\" style={{ marginBottom: 8 }}>\n <div className=\"rqd-file-item-info\">\n <span className=\"rqd-file-item-name\">{uploadProgress.fileName}</span>\n </div>\n <span style={{ fontSize: 12, color: 'var(--rqd-text-secondary)' }}>{uploadProgress.percent}%</span>\n </div>\n <div className=\"rqd-progress\">\n <div className=\"rqd-progress-bar\" style={{ width: `${uploadProgress.percent}%` }} />\n </div>\n </div>\n )\n }\n\n return (\n <form className=\"rqd-form\" onSubmit={handleSubmit} noValidate>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.title')}</label>\n <input className=\"rqd-input\" name=\"title\" placeholder={t('form.titlePlaceholder')} required />\n {errors.title && <div className=\"rqd-error-text\">{errors.title}</div>}\n </div>\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.description')}</label>\n <textarea className=\"rqd-textarea\" name=\"description\" placeholder={t('form.descriptionPlaceholder')} />\n </div>\n {!isAuthenticated && (\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.email')}</label>\n <input className=\"rqd-input\" name=\"email\" type=\"email\" placeholder={t('form.emailPlaceholder')} defaultValue={userEmail ?? savedEmail ?? ''} />\n {errors.email && <div className=\"rqd-error-text\">{errors.email}</div>}\n <label className=\"rqd-checkbox-label\" style={{ marginTop: 6 }}>\n <input type=\"checkbox\" checked={rememberEmail} onChange={(e) => setRememberEmail(e.target.checked)} />\n {t('mytickets.rememberMe')}\n </label>\n </div>\n )}\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.priority')}</label>\n <select className=\"rqd-select\" name=\"priority\" defaultValue=\"medium\">\n <option value=\"low\">{t('form.priorityLow')}</option>\n <option value=\"medium\">{t('form.priorityMedium')}</option>\n <option value=\"high\">{t('form.priorityHigh')}</option>\n <option value=\"urgent\">{t('form.priorityUrgent')}</option>\n </select>\n </div>\n\n <div className=\"rqd-form-group\">\n <label className=\"rqd-label\">{t('form.attachment')}</label>\n <div\n className={`rqd-dropzone${isDragOver ? ' rqd-dropzone-active' : ''}`}\n onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n {isDragOver ? t('attach.dropzoneActive') : t('attach.dropzone')}\n <input ref={fileInputRef} type=\"file\" multiple style={{ display: 'none' }}\n onChange={(e) => { if (e.target.files) addFiles(e.target.files); e.target.value = '' }} />\n </div>\n {files.length > 0 && (\n <div className=\"rqd-file-list\">\n {files.map(f => (\n <div key={f.id} className=\"rqd-file-item\">\n <div className=\"rqd-file-item-info\">\n <span className=\"rqd-file-item-name\">{f.file.name}</span>\n <span className=\"rqd-file-item-size\">\n {formatFileSize(f.file.size)}\n {f.error && <span style={{ color: '#e74c3c', marginLeft: 6 }}>{f.error}</span>}\n </span>\n </div>\n <button className=\"rqd-file-remove\" onClick={() => removeFile(f.id)} type=\"button\">×</button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={submitMutation.isPending}>\n {submitMutation.isPending ? t('form.submitting') : t('form.submit')}\n </button>\n </form>\n )\n}\n","import { queryOptions, keepPreviousData } from '@tanstack/react-query'\nimport { getTicketDetail, listMyTickets, resolveWidgetUser, trackTicket } from '../api-client'\n\nexport const widgetTicketDetailOptions = (ticketId: string) =>\n queryOptions({\n queryKey: ['widget-ticket', ticketId],\n queryFn: () => getTicketDetail(ticketId),\n staleTime: 60_000,\n enabled: !!ticketId,\n })\n\nexport const widgetMyTicketsOptions = (projectId: string, userId: string) =>\n queryOptions({\n queryKey: ['widget-tickets', projectId, userId],\n queryFn: () => listMyTickets(projectId, userId),\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n enabled: !!userId,\n })\n\nexport const widgetUserOptions = (projectId: string, email: string) =>\n queryOptions({\n queryKey: ['widget-user', projectId, email],\n queryFn: () => resolveWidgetUser(projectId, email),\n staleTime: 5 * 60_000,\n enabled: !!email,\n })\n\nexport const widgetTrackTicketOptions = (token: string) =>\n queryOptions({\n queryKey: ['widget-track', token],\n queryFn: () => trackTicket(token),\n staleTime: 60_000,\n enabled: !!token,\n })\n","import { useState, useEffect, useCallback, type FormEvent } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useReqdeskContext } from '../ReqdeskProvider'\nimport { widgetMyTicketsOptions, widgetUserOptions } from '../queries'\nimport { trackTicket, type TicketListItem } from '../../api-client'\nimport { saveWidgetEmail, loadWidgetEmail, getTrackingTokens } from '../../storage'\nimport { en } from '../../i18n/en'\nimport { ar } from '../../i18n/ar'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\ninterface MyTicketsViewProps {\n projectId: string\n onSelectTicket: (ticketId: string) => void\n isAuthenticated?: boolean\n userEmail?: string\n}\n\nexport function MyTicketsView({ projectId, onSelectTicket, isAuthenticated, userEmail }: MyTicketsViewProps) {\n const ctx = useReqdeskContext()\n const savedEmail = loadWidgetEmail(ctx.apiKey)\n\n const [email, setEmail] = useState(userEmail ?? savedEmail ?? '')\n const [rememberMe, setRememberMe] = useState(!!savedEmail)\n const [submittedEmail, setSubmittedEmail] = useState<string | null>(\n isAuthenticated && userEmail ? userEmail : savedEmail,\n )\n const [tokenTickets, setTokenTickets] = useState<TicketListItem[]>([])\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[ctx.language] ?? translations.en\n return lang[key] ?? key\n }, [ctx.language, ctx.translations])\n\n // Resolve email → userId\n const { data: widgetUser } = useQuery(widgetUserOptions(projectId, submittedEmail ?? ''))\n const userId = widgetUser?.userId ?? ''\n\n // Fetch tickets once userId is resolved\n const { data: emailTickets = [], isLoading } = useQuery(widgetMyTicketsOptions(projectId, userId))\n\n // Also load token-based tickets\n useEffect(() => {\n const tokens = getTrackingTokens(ctx.apiKey)\n if (tokens.length === 0) return\n\n Promise.allSettled(\n tokens.slice(0, 5).map(tk => trackTicket(tk)),\n ).then(results => {\n const tracked: TicketListItem[] = []\n for (const r of results) {\n if (r.status === 'fulfilled') {\n const t = r.value\n if (!emailTickets.some(et => et.id === t.id)) {\n tracked.push({\n id: t.id,\n ticketNumber: t.ticketNumber,\n title: t.title,\n status: t.status,\n priority: t.priority,\n createdAt: t.createdAt,\n })\n }\n }\n }\n setTokenTickets(tracked)\n })\n }, [ctx.apiKey, emailTickets])\n\n const allTickets = [...emailTickets, ...tokenTickets]\n\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault()\n const trimmed = email.trim()\n if (!trimmed || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return\n\n if (rememberMe) saveWidgetEmail(ctx.apiKey, trimmed)\n setSubmittedEmail(trimmed)\n }\n\n function formatDate(iso: string): string {\n try { return new Date(iso).toLocaleDateString() } catch { return iso }\n }\n\n // Show email entry form if not yet submitted and not authenticated\n if (!submittedEmail && !isAuthenticated) {\n return (\n <div className=\"rqd-email-form\">\n <p>{t('mytickets.emailPrompt')}</p>\n <form onSubmit={handleSubmit}>\n <div className=\"rqd-form-group\">\n <input\n className=\"rqd-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={t('mytickets.emailPlaceholder')}\n required\n />\n </div>\n <label className=\"rqd-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={rememberMe}\n onChange={(e) => setRememberMe(e.target.checked)}\n />\n {t('mytickets.rememberMe')}\n </label>\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" style={{ marginTop: 12 }}>\n {t('mytickets.lookup')}\n </button>\n </form>\n </div>\n )\n }\n\n if (isLoading) {\n return <div className=\"rqd-loading\">{t('mytickets.lookingUp')}</div>\n }\n\n if (allTickets.length === 0) {\n return (\n <div className=\"rqd-placeholder\">\n <p>{submittedEmail && !widgetUser ? t('mytickets.noAccount') : t('mytickets.noTickets')}</p>\n {submittedEmail && !isAuthenticated && (\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={() => setSubmittedEmail(null)}>\n {t('tracker.back')}\n </button>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"rqd-ticket-list\">\n {allTickets.map(ticket => (\n <div\n key={ticket.id}\n className=\"rqd-ticket-card\"\n onClick={() => onSelectTicket(ticket.id)}\n >\n <div className=\"rqd-ticket-card-top\">\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\n <span className=\"rqd-badge\">{ticket.status}</span>\n </div>\n <span className=\"rqd-ticket-card-title\">{ticket.title}</span>\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\n </div>\n ))}\n </div>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useReqdeskContext } from '../ReqdeskProvider'\nimport { widgetTicketDetailOptions } from '../queries'\nimport { submitReply, type AttachmentMeta, type TicketDetail } from '../../api-client'\nimport { en } from '../../i18n/en'\nimport { ar } from '../../i18n/ar'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\ninterface TicketDetailViewProps {\n ticketId: string\n onBack: () => void\n}\n\nfunction formatDate(iso: string): string {\n try { return new Date(iso).toLocaleString() } catch { return iso }\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport function TicketDetailView({ ticketId, onBack }: TicketDetailViewProps) {\n const ctx = useReqdeskContext()\n const queryClient = useQueryClient()\n const [replyBody, setReplyBody] = useState('')\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[ctx.language] ?? translations.en\n return lang[key] ?? key\n }, [ctx.language, ctx.translations])\n\n const { data: ticket, isLoading, error } = useQuery(widgetTicketDetailOptions(ticketId))\n\n const replyMutation = useMutation({\n mutationFn: (body: string) => submitReply(ticketId, body),\n onMutate: async (body) => {\n // Optimistic update: append reply to cache\n await queryClient.cancelQueries({ queryKey: ['widget-ticket', ticketId] })\n const previous = queryClient.getQueryData<TicketDetail>(['widget-ticket', ticketId])\n\n if (previous) {\n queryClient.setQueryData<TicketDetail>(['widget-ticket', ticketId], {\n ...previous,\n replies: [...previous.replies, {\n id: `optimistic-${Date.now()}`,\n body,\n authorName: ctx.userName ?? ctx.userEmail ?? 'You',\n isStaff: false,\n createdAt: new Date().toISOString(),\n }],\n })\n }\n return { previous }\n },\n onSuccess: () => {\n setReplyBody('')\n queryClient.invalidateQueries({ queryKey: ['widget-ticket', ticketId] })\n },\n onError: (_err, _vars, context) => {\n if (context?.previous) {\n queryClient.setQueryData(['widget-ticket', ticketId], context.previous)\n }\n },\n })\n\n if (isLoading) {\n return <div className=\"rqd-loading\">{t('detail.loading')}</div>\n }\n\n if (error || !ticket) {\n return (\n <div className=\"rqd-placeholder\">\n <p>{t('error.generic')}</p>\n <button className=\"rqd-btn rqd-btn-secondary\" style={{ width: 'auto', padding: '8px 20px' }} onClick={onBack}>\n {t('tracker.back')}\n </button>\n </div>\n )\n }\n\n return (\n <div>\n <div className=\"rqd-ticket-header\">\n <h3>{ticket.title}</h3>\n <div className=\"rqd-ticket-header-meta\">\n <span className=\"rqd-ticket-card-number\">{ticket.ticketNumber}</span>\n <span className=\"rqd-badge\">{ticket.status}</span>\n <span className=\"rqd-badge\" style={{ background: 'var(--rqd-bg-secondary)', color: 'var(--rqd-text-secondary)' }}>\n {ticket.priority}\n </span>\n <span className=\"rqd-ticket-card-date\">{formatDate(ticket.createdAt)}</span>\n </div>\n </div>\n\n {ticket.description && (\n <>\n <div className=\"rqd-section-title\">{t('detail.description')}</div>\n <div className=\"rqd-ticket-desc\">{ticket.description}</div>\n </>\n )}\n\n {ticket.attachments.length > 0 && (\n <>\n <div className=\"rqd-section-title\">{t('detail.attachments')}</div>\n <div className=\"rqd-attachment-list\">\n {ticket.attachments.map((a: AttachmentMeta) => (\n <div key={a.id} className=\"rqd-attachment-item\">\n <div className=\"rqd-file-item-info\">\n <span className=\"rqd-file-item-name\">{a.fileName}</span>\n <span className=\"rqd-file-item-size\">{formatFileSize(a.fileSize)}</span>\n </div>\n {a.downloadUrl && (\n <a href={a.downloadUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('attach.download')}\n </a>\n )}\n </div>\n ))}\n </div>\n </>\n )}\n\n <div className=\"rqd-section-title\">{t('detail.replies')}</div>\n {ticket.replies.length === 0 ? (\n <p style={{ color: 'var(--rqd-text-secondary)', fontSize: 13, margin: '0 0 12px' }}>\n {t('detail.noReplies')}\n </p>\n ) : (\n <div>\n {ticket.replies.map(reply => (\n <div key={reply.id} className=\"rqd-reply\">\n <div className=\"rqd-reply-header\">\n <span className={reply.isStaff ? 'rqd-reply-staff' : ''}>\n {reply.isStaff ? `${reply.authorName} \\u00b7 ${t('detail.staff')}` : reply.authorName}\n </span>\n <span>{formatDate(reply.createdAt)}</span>\n </div>\n <div className=\"rqd-reply-body\">{reply.body}</div>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"rqd-reply-compose\">\n <textarea\n className=\"rqd-textarea\"\n value={replyBody}\n onChange={(e) => setReplyBody(e.target.value)}\n placeholder={t('detail.replyPlaceholder')}\n rows={3}\n />\n <button\n className=\"rqd-btn rqd-btn-primary\"\n onClick={() => replyMutation.mutate(replyBody.trim())}\n disabled={!replyBody.trim() || replyMutation.isPending}\n >\n {replyMutation.isPending ? t('detail.sending') : t('detail.sendReply')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState, useCallback, type FormEvent } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { useReqdeskContext } from '../ReqdeskProvider'\nimport { trackTicket } from '../../api-client'\nimport { getTrackingTokens } from '../../storage'\nimport { en } from '../../i18n/en'\nimport { ar } from '../../i18n/ar'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\ninterface TrackTicketViewProps {\n onTrackSuccess: (ticketId: string) => void\n}\n\nexport function TrackTicketView({ onTrackSuccess }: TrackTicketViewProps) {\n const ctx = useReqdeskContext()\n const [token, setToken] = useState('')\n const savedTokens = getTrackingTokens(ctx.apiKey)\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[ctx.language] ?? translations.en\n return lang[key] ?? key\n }, [ctx.language, ctx.translations])\n\n const trackMutation = useMutation({\n mutationFn: (trackToken: string) => trackTicket(trackToken.trim()),\n onSuccess: (result) => onTrackSuccess(result.id),\n })\n\n function handleSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault()\n if (token.trim()) trackMutation.mutate(token)\n }\n\n return (\n <div>\n <form onSubmit={handleSubmit}>\n <div className=\"rqd-form-group\">\n <input\n className=\"rqd-input\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder={t('track.tokenPlaceholder')}\n required\n />\n {trackMutation.isError && <div className=\"rqd-error-text\">{t('track.invalidToken')}</div>}\n </div>\n <button className=\"rqd-btn rqd-btn-primary\" type=\"submit\" disabled={trackMutation.isPending || !token.trim()}>\n {trackMutation.isPending ? t('track.tracking') : t('track.submit')}\n </button>\n </form>\n\n {savedTokens.length > 0 && (\n <div style={{ marginTop: 20 }}>\n <div className=\"rqd-section-title\">{t('track.recentTickets')}</div>\n <div className=\"rqd-ticket-list\">\n {savedTokens.slice(0, 5).map(tk => (\n <button\n key={tk}\n className=\"rqd-ticket-card\"\n style={{ border: 'none', textAlign: 'start', width: '100%' }}\n onClick={() => trackMutation.mutate(tk)}\n >\n <span className=\"rqd-ticket-card-number\" style={{ fontFamily: 'monospace', fontSize: 12 }}>\n {tk.slice(0, 20)}...\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useReqdeskContext } from './ReqdeskProvider'\nimport { en } from '../i18n/en'\nimport { ar } from '../i18n/ar'\nimport { themeToVars } from '../theme'\nimport { saveWidgetConfig, loadWidgetConfig, loadWidgetEmail, clearWidgetEmail } from '../storage'\nimport { login, logout, isAuthConfigured } from '../auth/widget-auth'\nimport { ShadowRoot } from './shadow-root'\nimport { SubmitTicketView } from './views/SubmitTicketView'\nimport { MyTicketsView } from './views/MyTicketsView'\nimport { TicketDetailView } from './views/TicketDetailView'\nimport { TrackTicketView } from './views/TrackTicketView'\nimport type { TicketResult, WidgetError } from './types'\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\n\ntype WidgetView = 'home' | 'new-ticket' | 'my-tickets' | 'ticket-detail' | 'track' | 'kb' | 'preferences'\n\ninterface FloatingWidgetProps {\n position?: 'bottom-right' | 'bottom-left'\n contained?: boolean\n onTicketCreated?: (ticket: TicketResult) => void\n onError?: (error: WidgetError) => void\n}\n\nconst ICONS = {\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',\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',\n newTicket: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\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',\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',\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',\n back: 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\n backRtl: 'M4 11h12.17l-5.59-5.59L12 4l8 8-8 8-1.41-1.41L16.17 13H4v-2z',\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',\n}\n\nfunction SvgIcon({ path, size = 20 }: { path: string; size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\" style={{ display: 'block', flexShrink: 0 }}>\n <path d={path} />\n </svg>\n )\n}\n\nexport function FloatingWidget({\n position = 'bottom-right',\n contained = false,\n onTicketCreated,\n onError,\n}: FloatingWidgetProps) {\n const ctx = useReqdeskContext()\n const [isOpen, setIsOpen] = useState(false)\n const [view, setView] = useState<WidgetView>('home')\n const [selectedTicketId, setSelectedTicketId] = useState<string | null>(null)\n const [emailCleared, setEmailCleared] = useState(false)\n\n const savedPrefs = loadWidgetConfig(ctx.apiKey)\n const [userLang, setUserLang] = useState<string | null>(savedPrefs?.language ?? null)\n const [userThemeMode, setUserThemeMode] = useState<string | null>(savedPrefs?.theme?.mode ?? null)\n const [userColor, setUserColor] = useState<string | null>(savedPrefs?.theme?.primaryColor ?? null)\n\n const activeLang = userLang ?? ctx.language ?? 'en'\n const activeThemeMode = (userThemeMode ?? ctx.theme?.mode ?? 'light') as 'light' | 'dark' | 'auto'\n const activeColor = userColor ?? ctx.theme?.primaryColor ?? '#42b983'\n const activeTheme = { ...ctx.theme, mode: activeThemeMode, primaryColor: activeColor }\n\n const t = useCallback((key: string): string => {\n if (ctx.translations?.[key]) return ctx.translations[key]\n const lang = translations[activeLang] ?? translations.en\n return lang[key] ?? key\n }, [activeLang, ctx.translations])\n\n const isRtl = activeLang === 'ar'\n const cssVars = themeToVars(activeTheme)\n const posClass = `rqd-${position}`\n const containedClass = contained ? ' rqd-contained' : ''\n const brandName = ctx.theme?.brandName\n const brandLogo = ctx.theme?.logo\n const hideBranding = ctx.theme?.hideBranding === true\n\n // Derive projectId from API key context (resolved server-side)\n const projectId = '_current'\n\n function toggleOpen() {\n setIsOpen(prev => !prev)\n if (!isOpen) {\n setView('home')\n setSelectedTicketId(null)\n }\n }\n\n function goHome() {\n setView('home')\n setSelectedTicketId(null)\n setEmailCleared(false)\n }\n\n function handleLangChange(lang: string) {\n setUserLang(lang)\n saveWidgetConfig(ctx.apiKey, { language: lang })\n }\n\n function handleThemeChange(mode: string) {\n setUserThemeMode(mode)\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: mode as 'light' | 'dark' | 'auto', primaryColor: activeColor } })\n }\n\n function handleColorChange(color: string) {\n setUserColor(color)\n saveWidgetConfig(ctx.apiKey, { theme: { ...ctx.theme, mode: activeThemeMode, primaryColor: color } })\n }\n\n const COLOR_PRESETS = [\n { color: '#42b983', label: 'Green' },\n { color: '#3b82f6', label: 'Blue' },\n { color: '#8b5cf6', label: 'Purple' },\n { color: '#f59e0b', label: 'Orange' },\n { color: '#ef4444', label: 'Red' },\n ]\n\n function handleClearEmail() {\n clearWidgetEmail(ctx.apiKey)\n setEmailCleared(true)\n setTimeout(() => setEmailCleared(false), 2000)\n }\n\n function openTicketDetail(ticketId: string) {\n setSelectedTicketId(ticketId)\n setView('ticket-detail')\n }\n\n const menuItems = [\n { key: 'new-ticket' as const, icon: ICONS.newTicket, label: t('menu.newTicket'), desc: t('menu.newTicketDesc') },\n { key: 'my-tickets' as const, icon: ICONS.tickets, label: t('menu.myTickets'), desc: t('menu.myTicketsDesc') },\n { key: 'track' as const, icon: ICONS.track, label: t('menu.trackTicket'), desc: t('menu.trackTicketDesc') },\n { key: 'kb' as const, icon: ICONS.kb, label: t('menu.knowledgeBase'), desc: t('menu.knowledgeBaseDesc') },\n { key: 'preferences' as const, icon: ICONS.settings, label: t('menu.preferences'), desc: t('menu.preferencesDesc') },\n ]\n\n function renderViewContent() {\n switch (view) {\n case 'home':\n return (\n <div className=\"rqd-menu\">\n {menuItems.map(item => (\n <button\n key={item.key}\n className=\"rqd-menu-item\"\n onClick={() => setView(item.key)}\n >\n <div className=\"rqd-menu-icon\">\n <SvgIcon path={item.icon} size={22} />\n </div>\n <div className=\"rqd-menu-text\">\n <span className=\"rqd-menu-label\">{item.label}</span>\n <span className=\"rqd-menu-desc\">{item.desc}</span>\n </div>\n </button>\n ))}\n </div>\n )\n\n case 'new-ticket':\n return (\n <SubmitTicketView\n projectId={projectId}\n onSuccess={(result) => {\n onTicketCreated?.(result)\n }}\n onError={onError}\n isAuthenticated={ctx.isAuthenticated}\n userEmail={ctx.userEmail}\n />\n )\n\n case 'my-tickets':\n return (\n <MyTicketsView\n projectId={projectId}\n onSelectTicket={openTicketDetail}\n isAuthenticated={ctx.isAuthenticated}\n userEmail={ctx.userEmail}\n />\n )\n\n case 'ticket-detail':\n if (!selectedTicketId) return null\n return (\n <TicketDetailView\n ticketId={selectedTicketId}\n onBack={() => setView('my-tickets')}\n />\n )\n\n case 'track':\n return (\n <TrackTicketView\n onTrackSuccess={openTicketDetail}\n />\n )\n\n case 'kb':\n return (\n <div className=\"rqd-placeholder\">\n <SvgIcon path={ICONS.kb} size={40} />\n <p>{t('menu.kbPlaceholder')}</p>\n </div>\n )\n\n case 'preferences':\n return (\n <div className=\"rqd-prefs\">\n <div className=\"rqd-prefs-group\">\n <span className=\"rqd-prefs-label\">{t('prefs.language')}</span>\n <div className=\"rqd-prefs-options\">\n <button\n className={`rqd-prefs-option${activeLang === 'en' ? ' rqd-active' : ''}`}\n onClick={() => handleLangChange('en')}\n >\n English\n </button>\n <button\n className={`rqd-prefs-option${activeLang === 'ar' ? ' rqd-active' : ''}`}\n onClick={() => handleLangChange('ar')}\n >\n العربية\n </button>\n </div>\n </div>\n\n <div className=\"rqd-prefs-group\">\n <span className=\"rqd-prefs-label\">{t('prefs.theme')}</span>\n <div className=\"rqd-prefs-options\">\n {(['light', 'dark', 'auto'] as const).map(mode => (\n <button\n key={mode}\n className={`rqd-prefs-option${activeThemeMode === mode ? ' rqd-active' : ''}`}\n onClick={() => handleThemeChange(mode)}\n >\n {t(`prefs.${mode}`)}\n </button>\n ))}\n </div>\n </div>\n\n {/* Accent Color */}\n <div className=\"rqd-prefs-group\">\n <span className=\"rqd-prefs-label\">{t('prefs.accentColor')}</span>\n <div className=\"rqd-color-presets\">\n {COLOR_PRESETS.map(preset => (\n <button\n key={preset.color}\n className={`rqd-color-preset${activeColor === preset.color ? ' rqd-active' : ''}`}\n style={{ background: preset.color, color: preset.color }}\n onClick={() => handleColorChange(preset.color)}\n aria-label={preset.label}\n title={preset.label}\n />\n ))}\n </div>\n </div>\n\n {/* Clear saved email */}\n {loadWidgetEmail(ctx.apiKey) && (\n <div className=\"rqd-prefs-group\">\n <button\n className=\"rqd-btn rqd-btn-secondary\"\n onClick={handleClearEmail}\n style={{ width: 'auto', padding: '8px 16px' }}\n >\n {emailCleared ? t('prefs.emailCleared') : t('prefs.clearEmail')}\n </button>\n </div>\n )}\n </div>\n )\n }\n }\n\n const viewTitle: Record<WidgetView, string> = {\n home: brandName ?? t('widget.title'),\n 'new-ticket': t('widget.newTicket'),\n 'my-tickets': t('menu.myTickets'),\n 'ticket-detail': t('menu.myTickets'),\n track: t('widget.trackTicket'),\n kb: t('menu.knowledgeBase'),\n preferences: t('prefs.title'),\n }\n\n const canGoBack = view !== 'home'\n const goBackTarget = view === 'ticket-detail' ? 'my-tickets' : 'home'\n\n return (\n <ShadowRoot>\n <div\n style={{ cssText: cssVars } as React.CSSProperties}\n {...(isRtl ? { dir: 'rtl' } : {})}\n >\n <button\n className={`rqd-fab ${posClass}${containedClass}`}\n onClick={toggleOpen}\n aria-label={isOpen ? t('widget.close') : t('widget.title')}\n >\n <SvgIcon path={isOpen ? ICONS.close : ICONS.chat} size={24} />\n </button>\n\n <div className={`rqd-panel ${posClass}${containedClass}${isOpen ? '' : ' rqd-hidden'}`}>\n <div className=\"rqd-header\">\n <div className=\"rqd-header-brand\">\n {canGoBack && (\n <button\n className=\"rqd-header-close\"\n onClick={() => goBackTarget === 'home' ? goHome() : setView(goBackTarget as WidgetView)}\n aria-label={t('tracker.back')}\n >\n <SvgIcon path={isRtl ? ICONS.backRtl : ICONS.back} size={18} />\n </button>\n )}\n {view === 'home' && brandLogo && (\n <img src={brandLogo} alt=\"\" className=\"rqd-header-logo\" />\n )}\n <span className=\"rqd-header-title\">{viewTitle[view]}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {(ctx.auth || isAuthConfigured()) && view === 'home' && (\n <button\n className=\"rqd-auth-btn\"\n onClick={() => ctx.isAuthenticated ? logout() : login()}\n aria-label={ctx.isAuthenticated ? t('auth.logout') : t('auth.login')}\n >\n {ctx.isAuthenticated ? ctx.userName ?? t('auth.logout') : t('auth.login')}\n </button>\n )}\n <button\n className=\"rqd-header-close\"\n onClick={toggleOpen}\n aria-label={t('widget.close')}\n >\n <SvgIcon path={ICONS.close} size={18} />\n </button>\n </div>\n </div>\n\n <div className=\"rqd-body\">\n {renderViewContent()}\n </div>\n\n {!hideBranding && (\n <div className=\"rqd-footer\">\n <span>{t('branding.poweredBy')}</span>\n <a href=\"https://reqdesk.com\" target=\"_blank\" rel=\"noopener noreferrer\">Reqdesk</a>\n </div>\n )}\n </div>\n </div>\n </ShadowRoot>\n )\n}\n"],"mappings":"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"}
|