@reqdesk/widget 0.2.0 → 0.3.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/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_storage = require("./storage-DqhhTxeh.cjs");
2
+ const require_storage = require("./storage-Cx5p1yP-.cjs");
3
3
  //#region src/shadow-dom.ts
4
4
  let shadowRoot = null;
5
5
  let hostEl = null;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { S as configureWidgetClient, a as saveTrackingToken, b as trackTicket, c as getWidgetStyles, d as en, l as themeToVars, n as getTrackingTokens, o as saveWidgetConfig, r as loadWidgetConfig, u as ar, v as submitTicket, y as submitTrackingReply } from "./storage-PjDHb5v7.js";
1
+ import { C as configureWidgetClient, a as saveTrackingToken, b as submitTrackingReply, c as getWidgetStyles, d as ar, f as en, n as getTrackingTokens, o as saveWidgetConfig, r as loadWidgetConfig, u as themeToVars, x as trackTicket, y as submitTicket } from "./storage-BG7rsgWE.js";
2
2
  //#region src/shadow-dom.ts
3
3
  let shadowRoot = null;
4
4
  let hostEl = null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/shadow-dom.ts","../src/ui/fab.ts","../src/ui/ticket-form.ts","../src/ui/tracker.ts","../src/ui/portal.ts","../src/index.ts"],"sourcesContent":["import { getWidgetStyles } from './theme'\n\nlet shadowRoot: ShadowRoot | null = null\nlet hostEl: HTMLElement | null = null\n\nexport function mountWidget(config: { zIndex?: number }): { shadow: ShadowRoot; host: HTMLElement; mount: HTMLElement } {\n if (shadowRoot && hostEl) {\n const mount = shadowRoot.querySelector('.rqd-root') as HTMLElement\n return { shadow: shadowRoot, host: hostEl, mount }\n }\n\n hostEl = document.createElement('div')\n hostEl.id = 'reqdesk-widget'\n hostEl.style.position = 'fixed'\n hostEl.style.zIndex = String(config.zIndex ?? 9999)\n hostEl.style.inset = '0'\n hostEl.style.pointerEvents = 'none'\n document.body.appendChild(hostEl)\n\n shadowRoot = hostEl.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = getWidgetStyles()\n shadowRoot.appendChild(style)\n\n const mount = document.createElement('div')\n mount.className = 'rqd-root'\n shadowRoot.appendChild(mount)\n\n return { shadow: shadowRoot, host: hostEl, mount }\n}\n\nexport function unmountWidget(): void {\n if (hostEl) {\n hostEl.remove()\n hostEl = null\n shadowRoot = null\n }\n}\n\nexport function getShadowRoot(): ShadowRoot | null {\n return shadowRoot\n}\n","function createSvg(path: string): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n const p = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n p.setAttribute('d', path)\n svg.appendChild(p)\n return svg\n}\n\nconst CHAT_PATH = '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'\nconst CLOSE_PATH = '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\nexport function createFab(\n position: 'bottom-right' | 'bottom-left',\n onClick: () => void,\n): HTMLButtonElement {\n const btn = document.createElement('button')\n btn.className = `rqd-fab rqd-${position}`\n btn.appendChild(createSvg(CHAT_PATH))\n btn.setAttribute('aria-label', 'Open support widget')\n btn.addEventListener('click', onClick)\n return btn\n}\n\nexport function setFabOpen(fab: HTMLButtonElement, isOpen: boolean): void {\n while (fab.firstChild) fab.removeChild(fab.firstChild)\n fab.appendChild(createSvg(isOpen ? CLOSE_PATH : CHAT_PATH))\n fab.setAttribute('aria-label', isOpen ? 'Close support widget' : 'Open support widget')\n}\n","import { submitTicket } from '../api-client'\nimport { saveTrackingToken } from '../storage'\nimport type { EventCallback, SubmitTicketData, TicketResult } from '../types'\n\ntype T = (key: string) => string\n\nexport function createTicketForm(\n projectId: string,\n t: T,\n onSuccess: (result: TicketResult) => void,\n onError: EventCallback,\n): HTMLElement {\n const form = document.createElement('form')\n form.className = 'rqd-form'\n form.setAttribute('novalidate', '')\n\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\n const errors: Record<string, HTMLElement> = {}\n\n function addField(name: string, type: 'input' | 'textarea' | 'select', label: string, opts?: { placeholder?: string; required?: boolean; options?: Array<{ value: string; label: string }> }) {\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n\n const lbl = document.createElement('label')\n lbl.className = 'rqd-label'\n lbl.textContent = label\n group.appendChild(lbl)\n\n let el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n if (type === 'textarea') {\n el = document.createElement('textarea')\n el.className = 'rqd-textarea'\n } else if (type === 'select') {\n el = document.createElement('select')\n el.className = 'rqd-select'\n if (opts?.options) {\n for (const opt of opts.options) {\n const option = document.createElement('option')\n option.value = opt.value\n option.textContent = opt.label\n el.appendChild(option)\n }\n }\n } else {\n el = document.createElement('input')\n el.className = 'rqd-input'\n el.type = name === 'email' ? 'email' : 'text'\n }\n\n if (opts?.placeholder && 'placeholder' in el) el.placeholder = opts.placeholder\n if (opts?.required) el.required = true\n el.name = name\n group.appendChild(el)\n\n const err = document.createElement('div')\n err.className = 'rqd-error-text'\n err.style.display = 'none'\n group.appendChild(err)\n\n fields[name] = el\n errors[name] = err\n form.appendChild(group)\n }\n\n // Unsaved data warning\n let hasContent = false\n function onBeforeUnload(e: BeforeUnloadEvent) {\n if (hasContent) {\n e.preventDefault()\n }\n }\n window.addEventListener('beforeunload', onBeforeUnload)\n form.addEventListener('input', () => {\n hasContent = Object.values(fields).some((f) => f.value.trim().length > 0)\n })\n\n addField('title', 'input', t('form.title'), { placeholder: t('form.titlePlaceholder'), required: true })\n addField('description', 'textarea', t('form.description'), { placeholder: t('form.descriptionPlaceholder') })\n addField('email', 'input', t('form.email'), { placeholder: t('form.emailPlaceholder'), required: true })\n addField('priority', 'select', t('form.priority'), {\n options: [\n { value: 'medium', label: t('form.priorityMedium') },\n { value: 'low', label: t('form.priorityLow') },\n { value: 'high', label: t('form.priorityHigh') },\n { value: 'urgent', label: t('form.priorityUrgent') },\n ],\n })\n\n const submitBtn = document.createElement('button')\n submitBtn.type = 'submit'\n submitBtn.className = 'rqd-btn rqd-btn-primary'\n submitBtn.textContent = t('form.submit')\n form.appendChild(submitBtn)\n\n function validate(): boolean {\n let valid = true\n const title = (fields.title as HTMLInputElement).value.trim()\n const email = (fields.email as HTMLInputElement).value.trim()\n\n // Clear errors\n for (const err of Object.values(errors)) {\n err.style.display = 'none'\n err.textContent = ''\n }\n\n if (!title) {\n errors.title.textContent = t('error.required')\n errors.title.style.display = 'block'\n valid = false\n } else if (title.length < 5) {\n errors.title.textContent = t('error.titleMin')\n errors.title.style.display = 'block'\n valid = false\n }\n\n if (!email) {\n errors.email.textContent = t('error.required')\n errors.email.style.display = 'block'\n valid = false\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n errors.email.textContent = t('error.emailInvalid')\n errors.email.style.display = 'block'\n valid = false\n }\n\n return valid\n }\n\n form.addEventListener('submit', async (e) => {\n e.preventDefault()\n if (!validate()) return\n\n submitBtn.disabled = true\n submitBtn.textContent = t('form.submitting')\n\n const data: SubmitTicketData = {\n title: (fields.title as HTMLInputElement).value.trim(),\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\n email: (fields.email as HTMLInputElement).value.trim(),\n priority: (fields.priority as HTMLSelectElement).value as SubmitTicketData['priority'],\n }\n\n try {\n const result = await submitTicket(projectId, data)\n if (result.trackingToken) {\n saveTrackingToken(projectId, result.trackingToken)\n }\n hasContent = false\n window.removeEventListener('beforeunload', onBeforeUnload)\n onSuccess(result)\n } catch (err) {\n onError(err)\n submitBtn.disabled = false\n submitBtn.textContent = t('form.submit')\n }\n })\n\n return form\n}\n\nexport function createSuccessView(\n result: TicketResult,\n t: T,\n onClose: () => void,\n onTrack?: () => void,\n): HTMLElement {\n const div = document.createElement('div')\n div.className = 'rqd-success'\n\n const icon = document.createElement('div')\n icon.className = 'rqd-success-icon'\n icon.textContent = '\\u2705'\n div.appendChild(icon)\n\n const heading = document.createElement('h3')\n heading.textContent = t('success.title')\n div.appendChild(heading)\n\n const num = document.createElement('p')\n num.textContent = t('success.ticketNumber') + result.ticketNumber\n div.appendChild(num)\n\n if (result.trackingToken) {\n const hint = document.createElement('p')\n hint.textContent = t('success.trackingHint')\n hint.style.fontSize = '13px'\n hint.style.color = 'var(--rqd-text-secondary)'\n div.appendChild(hint)\n\n const tokenBox = document.createElement('div')\n tokenBox.className = 'rqd-token-box'\n tokenBox.textContent = result.trackingToken\n div.appendChild(tokenBox)\n\n const copyBtn = document.createElement('button')\n copyBtn.className = 'rqd-btn rqd-btn-secondary'\n copyBtn.textContent = t('success.copyToken')\n copyBtn.style.marginBottom = '8px'\n copyBtn.addEventListener('click', () => {\n navigator.clipboard.writeText(result.trackingToken!).then(() => {\n copyBtn.textContent = t('success.copied')\n setTimeout(() => { copyBtn.textContent = t('success.copyToken') }, 2000)\n })\n })\n div.appendChild(copyBtn)\n\n if (onTrack) {\n const trackBtn = document.createElement('button')\n trackBtn.className = 'rqd-btn rqd-btn-primary'\n trackBtn.textContent = t('success.trackNow')\n trackBtn.style.marginTop = '4px'\n trackBtn.addEventListener('click', onTrack)\n div.appendChild(trackBtn)\n }\n }\n\n const closeBtn = document.createElement('button')\n closeBtn.className = 'rqd-btn rqd-btn-secondary'\n closeBtn.textContent = t('success.close')\n closeBtn.style.marginTop = '8px'\n closeBtn.addEventListener('click', onClose)\n div.appendChild(closeBtn)\n\n return div\n}\n","import { trackTicket, submitTrackingReply } from '../api-client'\nimport type { EventCallback, TrackedTicketResult } from '../types'\n\ntype T = (key: string) => string\n\nexport function createTrackerView(\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n prefillToken?: string,\n): HTMLElement {\n const container = document.createElement('div')\n container.className = 'rqd-tracker'\n\n if (prefillToken) {\n renderLoading(container, t)\n doTrack(prefillToken, container, t, onTracked, onReplySent, onError, onBack)\n } else {\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\n }\n\n return container\n}\n\nfunction renderTokenInput(\n container: HTMLElement,\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n\n const label = document.createElement('label')\n label.className = 'rqd-label'\n label.textContent = t('tracker.title')\n group.appendChild(label)\n\n const input = document.createElement('input')\n input.className = 'rqd-input'\n input.placeholder = t('tracker.tokenPlaceholder')\n input.type = 'text'\n group.appendChild(input)\n\n const err = document.createElement('div')\n err.className = 'rqd-error-text'\n err.style.display = 'none'\n group.appendChild(err)\n\n container.appendChild(group)\n\n const btn = document.createElement('button')\n btn.className = 'rqd-btn rqd-btn-primary'\n btn.textContent = t('tracker.submit')\n btn.addEventListener('click', () => {\n const token = input.value.trim()\n if (!token) {\n err.textContent = t('error.required')\n err.style.display = 'block'\n return\n }\n err.style.display = 'none'\n btn.disabled = true\n btn.textContent = t('tracker.tracking')\n doTrack(token, container, t, onTracked, onReplySent, onError, onBack)\n })\n container.appendChild(btn)\n}\n\nfunction renderLoading(container: HTMLElement, t: T) {\n while (container.firstChild) container.removeChild(container.firstChild)\n const p = document.createElement('p')\n p.textContent = t('tracker.tracking')\n p.style.textAlign = 'center'\n p.style.color = 'var(--rqd-text-secondary)'\n container.appendChild(p)\n}\n\nasync function doTrack(\n token: string,\n container: HTMLElement,\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n try {\n const result = await trackTicket(token)\n onTracked(result)\n renderTicketDetail(container, token, result, t, onReplySent, onError, onBack)\n } catch (err) {\n onError(err)\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\n }\n}\n\nfunction renderTicketDetail(\n container: HTMLElement,\n token: string,\n ticket: TrackedTicketResult,\n t: T,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n if (onBack) {\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', onBack)\n container.appendChild(backBtn)\n }\n\n // Ticket info\n const info = document.createElement('div')\n info.className = 'rqd-ticket-info'\n\n const titleRow = document.createElement('div')\n titleRow.style.fontWeight = '600'\n titleRow.style.marginBottom = '8px'\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\n info.appendChild(titleRow)\n\n for (const [label, value] of [\n [t('tracker.status'), ticket.status],\n [t('tracker.priority'), ticket.priority],\n [t('tracker.created'), new Date(ticket.createdAt).toLocaleDateString()],\n ]) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-row'\n const lbl = document.createElement('span')\n lbl.className = 'rqd-ticket-label'\n lbl.textContent = label\n row.appendChild(lbl)\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = value\n row.appendChild(badge)\n info.appendChild(row)\n }\n container.appendChild(info)\n\n // Replies\n const repliesLabel = document.createElement('div')\n repliesLabel.className = 'rqd-label'\n repliesLabel.textContent = t('tracker.replies')\n repliesLabel.style.marginBottom = '8px'\n container.appendChild(repliesLabel)\n\n if (ticket.replies.length === 0) {\n const noReplies = document.createElement('p')\n noReplies.textContent = t('tracker.noReplies')\n noReplies.style.color = 'var(--rqd-text-secondary)'\n noReplies.style.fontSize = '13px'\n container.appendChild(noReplies)\n } else {\n for (const reply of ticket.replies) {\n const replyEl = document.createElement('div')\n replyEl.className = 'rqd-reply'\n\n const header = document.createElement('div')\n header.className = 'rqd-reply-header'\n const authorSpan = document.createElement('span')\n authorSpan.textContent = reply.authorName\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\n header.appendChild(authorSpan)\n const dateSpan = document.createElement('span')\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\n header.appendChild(dateSpan)\n replyEl.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-reply-body'\n body.textContent = reply.body\n replyEl.appendChild(body)\n\n container.appendChild(replyEl)\n }\n }\n\n // Reply form\n const replyGroup = document.createElement('div')\n replyGroup.className = 'rqd-form-group'\n replyGroup.style.marginTop = '12px'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'rqd-textarea'\n textarea.placeholder = t('tracker.replyPlaceholder')\n textarea.rows = 3\n replyGroup.appendChild(textarea)\n container.appendChild(replyGroup)\n\n const sendBtn = document.createElement('button')\n sendBtn.className = 'rqd-btn rqd-btn-primary'\n sendBtn.textContent = t('tracker.sendReply')\n sendBtn.addEventListener('click', async () => {\n const body = textarea.value.trim()\n if (!body) return\n\n sendBtn.disabled = true\n sendBtn.textContent = t('tracker.sending')\n\n try {\n await submitTrackingReply(token, body)\n onReplySent({ token, body })\n // Refresh ticket detail\n const updated = await trackTicket(token)\n renderTicketDetail(container, token, updated, t, onReplySent, onError, onBack)\n } catch (err) {\n onError(err)\n sendBtn.disabled = false\n sendBtn.textContent = t('tracker.sendReply')\n }\n })\n container.appendChild(sendBtn)\n}\n","import { submitTicket } from '../api-client'\nimport type { EventCallback, SubmitTicketData } from '../types'\n\ntype T = (key: string) => string\n\ninterface PortalTicket {\n id: string\n ticketNumber: string\n title: string\n status: string\n priority: string\n createdAt: string\n}\n\ninterface PortalTicketDetail extends PortalTicket {\n replies: Array<{\n id: string\n body: string\n authorName: string\n isStaff: boolean\n createdAt: string\n }>\n}\n\nexport function createPortalView(\n t: T,\n fetchTickets: () => Promise<PortalTicket[]>,\n fetchTicketDetail: (id: string) => Promise<PortalTicketDetail>,\n submitReply: (ticketId: string, body: string) => Promise<void>,\n projectId: string,\n onTicketCreated: EventCallback,\n onError: EventCallback,\n pollingInterval?: number,\n): HTMLElement {\n const container = document.createElement('div')\n container.className = 'rqd-portal'\n\n let currentView: 'list' | 'detail' | 'new' = 'list'\n let pollTimer: ReturnType<typeof setInterval> | undefined\n\n function renderList() {\n currentView = 'list'\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const header = document.createElement('div')\n header.style.display = 'flex'\n header.style.justifyContent = 'space-between'\n header.style.alignItems = 'center'\n header.style.marginBottom = '12px'\n\n const title = document.createElement('span')\n title.style.fontWeight = '600'\n title.textContent = t('portal.myTickets')\n header.appendChild(title)\n\n const newBtn = document.createElement('button')\n newBtn.className = 'rqd-btn rqd-btn-primary'\n newBtn.style.width = 'auto'\n newBtn.style.padding = '6px 14px'\n newBtn.style.fontSize = '13px'\n newBtn.textContent = t('portal.newTicket')\n newBtn.addEventListener('click', renderNewTicketForm)\n header.appendChild(newBtn)\n\n container.appendChild(header)\n\n const loading = document.createElement('p')\n loading.textContent = '...'\n loading.style.textAlign = 'center'\n loading.style.color = 'var(--rqd-text-secondary)'\n container.appendChild(loading)\n\n fetchTickets()\n .then((tickets) => {\n loading.remove()\n if (tickets.length === 0) {\n const empty = document.createElement('p')\n empty.textContent = t('portal.noTickets')\n empty.style.textAlign = 'center'\n empty.style.color = 'var(--rqd-text-secondary)'\n empty.style.padding = '24px 0'\n container.appendChild(empty)\n return\n }\n\n for (const ticket of tickets) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-info'\n row.style.cursor = 'pointer'\n row.style.marginBottom = '8px'\n\n const top = document.createElement('div')\n top.style.display = 'flex'\n top.style.justifyContent = 'space-between'\n top.style.marginBottom = '4px'\n\n const num = document.createElement('span')\n num.style.fontWeight = '600'\n num.style.fontSize = '13px'\n num.textContent = ticket.ticketNumber\n top.appendChild(num)\n\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = ticket.status\n top.appendChild(badge)\n\n row.appendChild(top)\n\n const titleEl = document.createElement('div')\n titleEl.style.fontSize = '14px'\n titleEl.textContent = ticket.title\n row.appendChild(titleEl)\n\n const date = document.createElement('div')\n date.style.fontSize = '12px'\n date.style.color = 'var(--rqd-text-secondary)'\n date.style.marginTop = '4px'\n date.textContent = new Date(ticket.createdAt).toLocaleDateString()\n row.appendChild(date)\n\n row.addEventListener('click', () => renderDetail(ticket.id))\n container.appendChild(row)\n }\n })\n .catch((err) => {\n loading.remove()\n onError(err)\n })\n\n // Start polling\n if (pollingInterval && pollingInterval > 0) {\n stopPolling()\n pollTimer = setInterval(() => {\n if (currentView === 'list') renderList()\n }, pollingInterval)\n }\n }\n\n function renderDetail(ticketId: string) {\n currentView = 'detail'\n stopPolling()\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', renderList)\n container.appendChild(backBtn)\n\n const loading = document.createElement('p')\n loading.textContent = '...'\n loading.style.textAlign = 'center'\n container.appendChild(loading)\n\n fetchTicketDetail(ticketId)\n .then((ticket) => {\n loading.remove()\n\n const info = document.createElement('div')\n info.className = 'rqd-ticket-info'\n\n const titleRow = document.createElement('div')\n titleRow.style.fontWeight = '600'\n titleRow.style.marginBottom = '8px'\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\n info.appendChild(titleRow)\n\n for (const [label, value] of [\n [t('tracker.status'), ticket.status],\n [t('tracker.priority'), ticket.priority],\n ]) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-row'\n const lbl = document.createElement('span')\n lbl.className = 'rqd-ticket-label'\n lbl.textContent = label\n row.appendChild(lbl)\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = value\n row.appendChild(badge)\n info.appendChild(row)\n }\n container.appendChild(info)\n\n // Replies\n const repliesLabel = document.createElement('div')\n repliesLabel.className = 'rqd-label'\n repliesLabel.textContent = t('tracker.replies')\n repliesLabel.style.marginBottom = '8px'\n container.appendChild(repliesLabel)\n\n if (ticket.replies.length === 0) {\n const noReplies = document.createElement('p')\n noReplies.textContent = t('tracker.noReplies')\n noReplies.style.color = 'var(--rqd-text-secondary)'\n noReplies.style.fontSize = '13px'\n container.appendChild(noReplies)\n } else {\n for (const reply of ticket.replies) {\n const replyEl = document.createElement('div')\n replyEl.className = 'rqd-reply'\n\n const header = document.createElement('div')\n header.className = 'rqd-reply-header'\n const authorSpan = document.createElement('span')\n authorSpan.textContent = reply.authorName\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\n header.appendChild(authorSpan)\n const dateSpan = document.createElement('span')\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\n header.appendChild(dateSpan)\n replyEl.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-reply-body'\n body.textContent = reply.body\n replyEl.appendChild(body)\n\n container.appendChild(replyEl)\n }\n }\n\n // Reply form\n const replyGroup = document.createElement('div')\n replyGroup.className = 'rqd-form-group'\n replyGroup.style.marginTop = '12px'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'rqd-textarea'\n textarea.placeholder = t('tracker.replyPlaceholder')\n textarea.rows = 3\n replyGroup.appendChild(textarea)\n container.appendChild(replyGroup)\n\n const sendBtn = document.createElement('button')\n sendBtn.className = 'rqd-btn rqd-btn-primary'\n sendBtn.textContent = t('tracker.sendReply')\n sendBtn.addEventListener('click', async () => {\n const body = textarea.value.trim()\n if (!body) return\n sendBtn.disabled = true\n sendBtn.textContent = t('tracker.sending')\n try {\n await submitReply(ticketId, body)\n renderDetail(ticketId)\n } catch (err) {\n onError(err)\n sendBtn.disabled = false\n sendBtn.textContent = t('tracker.sendReply')\n }\n })\n container.appendChild(sendBtn)\n })\n .catch((err) => {\n loading.remove()\n onError(err)\n })\n }\n\n function renderNewTicketForm() {\n currentView = 'new'\n stopPolling()\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', renderList)\n container.appendChild(backBtn)\n\n // Minimal inline form\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\n\n function addField(name: string, type: 'input' | 'textarea', label: string, placeholder: string) {\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n const lbl = document.createElement('label')\n lbl.className = 'rqd-label'\n lbl.textContent = label\n group.appendChild(lbl)\n const el = type === 'textarea' ? document.createElement('textarea') : document.createElement('input')\n el.className = type === 'textarea' ? 'rqd-textarea' : 'rqd-input'\n el.placeholder = placeholder\n el.name = name\n group.appendChild(el)\n fields[name] = el\n container.appendChild(group)\n }\n\n addField('title', 'input', t('form.title'), t('form.titlePlaceholder'))\n addField('description', 'textarea', t('form.description'), t('form.descriptionPlaceholder'))\n\n const submitBtn = document.createElement('button')\n submitBtn.className = 'rqd-btn rqd-btn-primary'\n submitBtn.textContent = t('form.submit')\n submitBtn.addEventListener('click', async () => {\n const title = (fields.title as HTMLInputElement).value.trim()\n if (!title || title.length < 5) return\n\n submitBtn.disabled = true\n submitBtn.textContent = t('form.submitting')\n\n const data: SubmitTicketData = {\n title,\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\n email: '', // Portal users are identified, email comes from customer config\n priority: 'medium',\n }\n\n try {\n const result = await submitTicket(projectId, data)\n onTicketCreated(result)\n renderList()\n } catch (err) {\n onError(err)\n submitBtn.disabled = false\n submitBtn.textContent = t('form.submit')\n }\n })\n container.appendChild(submitBtn)\n }\n\n function stopPolling() {\n if (pollTimer) {\n clearInterval(pollTimer)\n pollTimer = undefined\n }\n }\n\n // Initial render\n renderList()\n\n return container\n}\n","import { configureClient } from './api-client'\nimport { en } from './i18n/en'\nimport { ar } from './i18n/ar'\nimport { mountWidget, unmountWidget, getShadowRoot } from './shadow-dom'\nimport { themeToVars } from './theme'\nimport { createFab, setFabOpen } from './ui/fab'\nimport { createTicketForm, createSuccessView } from './ui/ticket-form'\nimport { createTrackerView } from './ui/tracker'\nimport { createPortalView } from './ui/portal'\nimport { getTrackingTokens, loadWidgetConfig, saveWidgetConfig } from './storage'\nimport type {\n ReqdeskWidgetConfig,\n ThemeConfig,\n CustomerConfig,\n WidgetEvent,\n EventCallback,\n TicketResult,\n} from './types'\n\nexport type {\n ReqdeskWidgetConfig,\n ThemeConfig,\n CustomerConfig,\n WidgetEvent,\n EventCallback,\n TicketResult,\n}\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\nconst listeners: Record<string, EventCallback[]> = {}\n\nlet config: ReqdeskWidgetConfig | null = null\nlet isOpen = false\nlet currentLang = 'en'\nlet fab: HTMLButtonElement | null = null\nlet panel: HTMLElement | null = null\nlet mount: HTMLElement | null = null\nlet currentTab: 'form' | 'tracker' = 'form'\nlet pendingTrackToken: string | undefined\n\nfunction t(key: string): string {\n const overrides = config?.translations\n if (overrides?.[key]) return overrides[key]\n const lang = translations[currentLang] ?? translations.en\n return lang[key] ?? key\n}\n\nfunction emit(event: WidgetEvent, data?: unknown) {\n for (const cb of listeners[event] ?? []) {\n try { cb(data) } catch { /* ignore listener errors */ }\n }\n}\n\nfunction deriveApiUrl(): string {\n return window.location.origin\n}\n\nfunction extractProjectId(): string {\n // The project ID is resolved server-side via the API key's entity_id claim\n return '_current'\n}\n\nfunction renderPanel() {\n if (!mount || !config) return\n\n while (mount.firstChild) mount.removeChild(mount.firstChild)\n\n const position = config.position ?? 'bottom-right'\n\n if (!config.inline) {\n panel = document.createElement('div')\n panel.className = `rqd-panel rqd-${position}`\n panel.style.cssText = themeToVars(config.theme)\n\n // Header\n const header = document.createElement('div')\n header.className = 'rqd-header'\n const title = document.createElement('span')\n title.className = 'rqd-header-title'\n title.textContent = t('widget.title')\n header.appendChild(title)\n\n const closeBtn = document.createElement('button')\n closeBtn.className = 'rqd-header-close'\n closeBtn.textContent = '\\u2715'\n closeBtn.addEventListener('click', close)\n header.appendChild(closeBtn)\n panel.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-body'\n\n const isPortal = config.widget === 'support-portal' && config.customer?.email\n\n if (isPortal) {\n // Support portal mode — full ticket list + detail\n renderPortal(body)\n } else {\n // Ticket form + tracker tabs\n const tabs = document.createElement('div')\n tabs.className = 'rqd-tabs'\n\n const formTab = document.createElement('button')\n formTab.className = `rqd-tab${currentTab === 'form' ? ' rqd-active' : ''}`\n formTab.textContent = t('widget.newTicket')\n formTab.addEventListener('click', () => switchTab('form', body, tabs))\n\n const trackerTab = document.createElement('button')\n trackerTab.className = `rqd-tab${currentTab === 'tracker' ? ' rqd-active' : ''}`\n trackerTab.textContent = t('widget.trackTicket')\n trackerTab.addEventListener('click', () => switchTab('tracker', body, tabs))\n\n tabs.appendChild(formTab)\n tabs.appendChild(trackerTab)\n panel.appendChild(tabs)\n\n if (currentTab === 'form') renderForm(body)\n else renderTracker(body)\n }\n\n panel.appendChild(body)\n\n mount.appendChild(panel)\n } else {\n // Inline mode\n const container = typeof config.container === 'string'\n ? document.querySelector(config.container)\n : config.container\n\n if (container) {\n const inline = document.createElement('div')\n inline.className = 'rqd-inline'\n inline.style.cssText = themeToVars(config.theme)\n\n const body = document.createElement('div')\n body.className = 'rqd-body'\n renderForm(body)\n inline.appendChild(body)\n\n // For inline, mount in the host page, not shadow DOM\n container.appendChild(inline)\n return\n }\n }\n}\n\nfunction renderPortal(container: HTMLElement) {\n if (!config) return\n\n const projectId = extractProjectId()\n\n // Portal uses the API client's ticket endpoints (via API key auth)\n // These return the customer's own tickets when customer.email is set\n const portalView = createPortalView(\n t,\n async () => {\n // Placeholder: in a real implementation, getTickets would filter by customer email\n // For now, return empty array — the backend filters by API key's project\n return []\n },\n async (id: string) => {\n return {\n id,\n ticketNumber: '',\n title: '',\n status: '',\n priority: '',\n createdAt: '',\n replies: [],\n }\n },\n async (_ticketId: string, _body: string) => {\n // Will call submitReply via API client\n },\n projectId,\n (data) => emit('ticket:created', data),\n (err) => emit('error', err),\n 30000,\n )\n container.appendChild(portalView)\n}\n\nfunction switchTab(tab: 'form' | 'tracker', body: HTMLElement, tabs: HTMLElement) {\n currentTab = tab\n pendingTrackToken = undefined\n\n // Update tab active state\n const tabBtns = tabs.querySelectorAll('.rqd-tab')\n tabBtns.forEach((btn, i) => {\n btn.classList.toggle('rqd-active', (i === 0 && tab === 'form') || (i === 1 && tab === 'tracker'))\n })\n\n while (body.firstChild) body.removeChild(body.firstChild)\n if (tab === 'form') renderForm(body)\n else renderTracker(body)\n}\n\nfunction renderForm(container: HTMLElement) {\n if (!config) return\n\n const projectId = extractProjectId()\n const form = createTicketForm(\n projectId,\n t,\n (result: TicketResult) => {\n emit('ticket:created', result)\n renderSuccess(container, result)\n },\n (err) => {\n emit('error', err)\n },\n )\n container.appendChild(form)\n}\n\nfunction renderTracker(container: HTMLElement) {\n const view = createTrackerView(\n t,\n (data) => emit('ticket:tracked', data),\n (data) => emit('reply:sent', data),\n (err) => emit('error', err),\n undefined,\n pendingTrackToken,\n )\n container.appendChild(view)\n}\n\nfunction renderSuccess(container: HTMLElement, result: TicketResult) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const view = createSuccessView(\n result,\n t,\n () => close(),\n result.trackingToken\n ? () => {\n pendingTrackToken = result.trackingToken\n // Switch to tracker tab\n if (panel) {\n const body = panel.querySelector('.rqd-body') as HTMLElement\n const tabs = panel.querySelector('.rqd-tabs') as HTMLElement\n if (body && tabs) switchTab('tracker', body, tabs)\n }\n }\n : undefined,\n )\n container.appendChild(view)\n}\n\nexport function init(cfg: ReqdeskWidgetConfig): void {\n if (config) return // singleton guard\n\n // Merge saved config as defaults — explicit init values take priority\n const saved = loadWidgetConfig(cfg.apiKey)\n config = {\n ...cfg,\n position: cfg.position ?? saved?.position ?? 'bottom-right',\n language: cfg.language ?? saved?.language ?? 'en',\n widget: cfg.widget ?? saved?.widget ?? 'ticket-form',\n theme: { ...saved?.theme, ...cfg.theme },\n }\n currentLang = config.language ?? 'en'\n\n // Persist resolved config for next init\n saveWidgetConfig(cfg.apiKey, {\n position: config.position,\n language: config.language,\n widget: config.widget,\n theme: config.theme,\n })\n\n const apiUrl = deriveApiUrl()\n configureClient(apiUrl, cfg.apiKey)\n\n if (cfg.inline) {\n renderPanel()\n return\n }\n\n const { mount: m } = mountWidget({ zIndex: cfg.theme?.zIndex })\n mount = m\n\n // Apply theme vars to the root\n const shadow = getShadowRoot()\n if (shadow) {\n const root = shadow.querySelector('.rqd-root') as HTMLElement\n if (root) root.style.cssText = themeToVars(cfg.theme)\n }\n\n // Set RTL\n const host = document.getElementById('reqdesk-widget')\n if (host && (currentLang === 'ar')) {\n host.setAttribute('dir', 'rtl')\n }\n\n // Auto-show tracker tab if user has saved tracking tokens\n const tokens = getTrackingTokens(cfg.apiKey)\n if (tokens.length > 0) currentTab = 'tracker'\n\n const position = cfg.position ?? 'bottom-right'\n fab = createFab(position, toggle)\n mount.appendChild(fab)\n}\n\nexport function open(): void {\n if (!config || isOpen) return\n isOpen = true\n if (fab) setFabOpen(fab, true)\n renderPanel()\n emit('open')\n}\n\nexport function close(): void {\n if (!isOpen) return\n isOpen = false\n if (fab) setFabOpen(fab, false)\n if (panel) {\n panel.remove()\n panel = null\n }\n emit('close')\n}\n\nexport function toggle(): void {\n if (isOpen) close()\n else open()\n}\n\nexport function setLanguage(lang: string): void {\n currentLang = lang\n if (config) {\n config.language = lang\n saveWidgetConfig(config.apiKey, { language: lang })\n }\n const host = document.getElementById('reqdesk-widget')\n if (host) {\n host.setAttribute('dir', lang === 'ar' ? 'rtl' : 'ltr')\n }\n // Re-render if open\n if (isOpen && panel && mount) {\n panel.remove()\n panel = null\n renderPanel()\n }\n}\n\nexport function setTheme(theme: Partial<ThemeConfig>): void {\n if (!config) return\n config.theme = { ...config.theme, ...theme }\n saveWidgetConfig(config.apiKey, { theme: config.theme })\n if (panel) {\n panel.style.cssText = themeToVars(config.theme)\n }\n}\n\nexport function on(event: WidgetEvent, callback: EventCallback): void {\n if (!listeners[event]) listeners[event] = []\n listeners[event].push(callback)\n}\n\nexport function identify(customer: CustomerConfig): void {\n if (config) config.customer = customer\n}\n\nexport function destroy(): void {\n close()\n unmountWidget()\n config = null\n fab = null\n panel = null\n mount = null\n isOpen = false\n for (const key of Object.keys(listeners)) {\n delete listeners[key]\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/shadow-dom.ts","../src/ui/fab.ts","../src/ui/ticket-form.ts","../src/ui/tracker.ts","../src/ui/portal.ts","../src/index.ts"],"sourcesContent":["import { getWidgetStyles } from './theme'\r\n\r\nlet shadowRoot: ShadowRoot | null = null\r\nlet hostEl: HTMLElement | null = null\r\n\r\nexport function mountWidget(config: { zIndex?: number }): { shadow: ShadowRoot; host: HTMLElement; mount: HTMLElement } {\r\n if (shadowRoot && hostEl) {\r\n const mount = shadowRoot.querySelector('.rqd-root') as HTMLElement\r\n return { shadow: shadowRoot, host: hostEl, mount }\r\n }\r\n\r\n hostEl = document.createElement('div')\r\n hostEl.id = 'reqdesk-widget'\r\n hostEl.style.position = 'fixed'\r\n hostEl.style.zIndex = String(config.zIndex ?? 9999)\r\n hostEl.style.inset = '0'\r\n hostEl.style.pointerEvents = 'none'\r\n document.body.appendChild(hostEl)\r\n\r\n shadowRoot = hostEl.attachShadow({ mode: 'open' })\r\n\r\n const style = document.createElement('style')\r\n style.textContent = getWidgetStyles()\r\n shadowRoot.appendChild(style)\r\n\r\n const mount = document.createElement('div')\r\n mount.className = 'rqd-root'\r\n shadowRoot.appendChild(mount)\r\n\r\n return { shadow: shadowRoot, host: hostEl, mount }\r\n}\r\n\r\nexport function unmountWidget(): void {\r\n if (hostEl) {\r\n hostEl.remove()\r\n hostEl = null\r\n shadowRoot = null\r\n }\r\n}\r\n\r\nexport function getShadowRoot(): ShadowRoot | null {\r\n return shadowRoot\r\n}\r\n","function createSvg(path: string): SVGSVGElement {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n svg.setAttribute('viewBox', '0 0 24 24')\r\n const p = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n p.setAttribute('d', path)\r\n svg.appendChild(p)\r\n return svg\r\n}\r\n\r\nconst CHAT_PATH = '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\nconst CLOSE_PATH = '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\r\nexport function createFab(\r\n position: 'bottom-right' | 'bottom-left',\r\n onClick: () => void,\r\n): HTMLButtonElement {\r\n const btn = document.createElement('button')\r\n btn.className = `rqd-fab rqd-${position}`\r\n btn.appendChild(createSvg(CHAT_PATH))\r\n btn.setAttribute('aria-label', 'Open support widget')\r\n btn.addEventListener('click', onClick)\r\n return btn\r\n}\r\n\r\nexport function setFabOpen(fab: HTMLButtonElement, isOpen: boolean): void {\r\n while (fab.firstChild) fab.removeChild(fab.firstChild)\r\n fab.appendChild(createSvg(isOpen ? CLOSE_PATH : CHAT_PATH))\r\n fab.setAttribute('aria-label', isOpen ? 'Close support widget' : 'Open support widget')\r\n}\r\n","import { submitTicket } from '../api-client'\r\nimport { saveTrackingToken } from '../storage'\r\nimport type { EventCallback, SubmitTicketData, TicketResult } from '../types'\r\n\r\ntype T = (key: string) => string\r\n\r\nexport function createTicketForm(\r\n projectId: string,\r\n t: T,\r\n onSuccess: (result: TicketResult) => void,\r\n onError: EventCallback,\r\n): HTMLElement {\r\n const form = document.createElement('form')\r\n form.className = 'rqd-form'\r\n form.setAttribute('novalidate', '')\r\n\r\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\r\n const errors: Record<string, HTMLElement> = {}\r\n\r\n function addField(name: string, type: 'input' | 'textarea' | 'select', label: string, opts?: { placeholder?: string; required?: boolean; options?: Array<{ value: string; label: string }> }) {\r\n const group = document.createElement('div')\r\n group.className = 'rqd-form-group'\r\n\r\n const lbl = document.createElement('label')\r\n lbl.className = 'rqd-label'\r\n lbl.textContent = label\r\n group.appendChild(lbl)\r\n\r\n let el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\r\n if (type === 'textarea') {\r\n el = document.createElement('textarea')\r\n el.className = 'rqd-textarea'\r\n } else if (type === 'select') {\r\n el = document.createElement('select')\r\n el.className = 'rqd-select'\r\n if (opts?.options) {\r\n for (const opt of opts.options) {\r\n const option = document.createElement('option')\r\n option.value = opt.value\r\n option.textContent = opt.label\r\n el.appendChild(option)\r\n }\r\n }\r\n } else {\r\n el = document.createElement('input')\r\n el.className = 'rqd-input'\r\n el.type = name === 'email' ? 'email' : 'text'\r\n }\r\n\r\n if (opts?.placeholder && 'placeholder' in el) el.placeholder = opts.placeholder\r\n if (opts?.required) el.required = true\r\n el.name = name\r\n group.appendChild(el)\r\n\r\n const err = document.createElement('div')\r\n err.className = 'rqd-error-text'\r\n err.style.display = 'none'\r\n group.appendChild(err)\r\n\r\n fields[name] = el\r\n errors[name] = err\r\n form.appendChild(group)\r\n }\r\n\r\n // Unsaved data warning\r\n let hasContent = false\r\n function onBeforeUnload(e: BeforeUnloadEvent) {\r\n if (hasContent) {\r\n e.preventDefault()\r\n }\r\n }\r\n window.addEventListener('beforeunload', onBeforeUnload)\r\n form.addEventListener('input', () => {\r\n hasContent = Object.values(fields).some((f) => f.value.trim().length > 0)\r\n })\r\n\r\n addField('title', 'input', t('form.title'), { placeholder: t('form.titlePlaceholder'), required: true })\r\n addField('description', 'textarea', t('form.description'), { placeholder: t('form.descriptionPlaceholder') })\r\n addField('email', 'input', t('form.email'), { placeholder: t('form.emailPlaceholder'), required: true })\r\n addField('priority', 'select', t('form.priority'), {\r\n options: [\r\n { value: 'medium', label: t('form.priorityMedium') },\r\n { value: 'low', label: t('form.priorityLow') },\r\n { value: 'high', label: t('form.priorityHigh') },\r\n { value: 'urgent', label: t('form.priorityUrgent') },\r\n ],\r\n })\r\n\r\n const submitBtn = document.createElement('button')\r\n submitBtn.type = 'submit'\r\n submitBtn.className = 'rqd-btn rqd-btn-primary'\r\n submitBtn.textContent = t('form.submit')\r\n form.appendChild(submitBtn)\r\n\r\n function validate(): boolean {\r\n let valid = true\r\n const title = (fields.title as HTMLInputElement).value.trim()\r\n const email = (fields.email as HTMLInputElement).value.trim()\r\n\r\n // Clear errors\r\n for (const err of Object.values(errors)) {\r\n err.style.display = 'none'\r\n err.textContent = ''\r\n }\r\n\r\n if (!title) {\r\n errors.title.textContent = t('error.required')\r\n errors.title.style.display = 'block'\r\n valid = false\r\n } else if (title.length < 5) {\r\n errors.title.textContent = t('error.titleMin')\r\n errors.title.style.display = 'block'\r\n valid = false\r\n }\r\n\r\n if (!email) {\r\n errors.email.textContent = t('error.required')\r\n errors.email.style.display = 'block'\r\n valid = false\r\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\r\n errors.email.textContent = t('error.emailInvalid')\r\n errors.email.style.display = 'block'\r\n valid = false\r\n }\r\n\r\n return valid\r\n }\r\n\r\n form.addEventListener('submit', async (e) => {\r\n e.preventDefault()\r\n if (!validate()) return\r\n\r\n submitBtn.disabled = true\r\n submitBtn.textContent = t('form.submitting')\r\n\r\n const data: SubmitTicketData = {\r\n title: (fields.title as HTMLInputElement).value.trim(),\r\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\r\n email: (fields.email as HTMLInputElement).value.trim(),\r\n priority: (fields.priority as HTMLSelectElement).value as SubmitTicketData['priority'],\r\n }\r\n\r\n try {\r\n const result = await submitTicket(projectId, data)\r\n if (result.trackingToken) {\r\n saveTrackingToken(projectId, result.trackingToken)\r\n }\r\n hasContent = false\r\n window.removeEventListener('beforeunload', onBeforeUnload)\r\n onSuccess(result)\r\n } catch (err) {\r\n onError(err)\r\n submitBtn.disabled = false\r\n submitBtn.textContent = t('form.submit')\r\n }\r\n })\r\n\r\n return form\r\n}\r\n\r\nexport function createSuccessView(\r\n result: TicketResult,\r\n t: T,\r\n onClose: () => void,\r\n onTrack?: () => void,\r\n): HTMLElement {\r\n const div = document.createElement('div')\r\n div.className = 'rqd-success'\r\n\r\n const icon = document.createElement('div')\r\n icon.className = 'rqd-success-icon'\r\n icon.textContent = '\\u2705'\r\n div.appendChild(icon)\r\n\r\n const heading = document.createElement('h3')\r\n heading.textContent = t('success.title')\r\n div.appendChild(heading)\r\n\r\n const num = document.createElement('p')\r\n num.textContent = t('success.ticketNumber') + result.ticketNumber\r\n div.appendChild(num)\r\n\r\n if (result.trackingToken) {\r\n const hint = document.createElement('p')\r\n hint.textContent = t('success.trackingHint')\r\n hint.style.fontSize = '13px'\r\n hint.style.color = 'var(--rqd-text-secondary)'\r\n div.appendChild(hint)\r\n\r\n const tokenBox = document.createElement('div')\r\n tokenBox.className = 'rqd-token-box'\r\n tokenBox.textContent = result.trackingToken\r\n div.appendChild(tokenBox)\r\n\r\n const copyBtn = document.createElement('button')\r\n copyBtn.className = 'rqd-btn rqd-btn-secondary'\r\n copyBtn.textContent = t('success.copyToken')\r\n copyBtn.style.marginBottom = '8px'\r\n copyBtn.addEventListener('click', () => {\r\n navigator.clipboard.writeText(result.trackingToken!).then(() => {\r\n copyBtn.textContent = t('success.copied')\r\n setTimeout(() => { copyBtn.textContent = t('success.copyToken') }, 2000)\r\n })\r\n })\r\n div.appendChild(copyBtn)\r\n\r\n if (onTrack) {\r\n const trackBtn = document.createElement('button')\r\n trackBtn.className = 'rqd-btn rqd-btn-primary'\r\n trackBtn.textContent = t('success.trackNow')\r\n trackBtn.style.marginTop = '4px'\r\n trackBtn.addEventListener('click', onTrack)\r\n div.appendChild(trackBtn)\r\n }\r\n }\r\n\r\n const closeBtn = document.createElement('button')\r\n closeBtn.className = 'rqd-btn rqd-btn-secondary'\r\n closeBtn.textContent = t('success.close')\r\n closeBtn.style.marginTop = '8px'\r\n closeBtn.addEventListener('click', onClose)\r\n div.appendChild(closeBtn)\r\n\r\n return div\r\n}\r\n","import { trackTicket, submitTrackingReply } from '../api-client'\r\nimport type { EventCallback, TrackedTicketResult } from '../types'\r\n\r\ntype T = (key: string) => string\r\n\r\nexport function createTrackerView(\r\n t: T,\r\n onTracked: EventCallback,\r\n onReplySent: EventCallback,\r\n onError: EventCallback,\r\n onBack?: () => void,\r\n prefillToken?: string,\r\n): HTMLElement {\r\n const container = document.createElement('div')\r\n container.className = 'rqd-tracker'\r\n\r\n if (prefillToken) {\r\n renderLoading(container, t)\r\n doTrack(prefillToken, container, t, onTracked, onReplySent, onError, onBack)\r\n } else {\r\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\r\n }\r\n\r\n return container\r\n}\r\n\r\nfunction renderTokenInput(\r\n container: HTMLElement,\r\n t: T,\r\n onTracked: EventCallback,\r\n onReplySent: EventCallback,\r\n onError: EventCallback,\r\n onBack?: () => void,\r\n) {\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n const group = document.createElement('div')\r\n group.className = 'rqd-form-group'\r\n\r\n const label = document.createElement('label')\r\n label.className = 'rqd-label'\r\n label.textContent = t('tracker.title')\r\n group.appendChild(label)\r\n\r\n const input = document.createElement('input')\r\n input.className = 'rqd-input'\r\n input.placeholder = t('tracker.tokenPlaceholder')\r\n input.type = 'text'\r\n group.appendChild(input)\r\n\r\n const err = document.createElement('div')\r\n err.className = 'rqd-error-text'\r\n err.style.display = 'none'\r\n group.appendChild(err)\r\n\r\n container.appendChild(group)\r\n\r\n const btn = document.createElement('button')\r\n btn.className = 'rqd-btn rqd-btn-primary'\r\n btn.textContent = t('tracker.submit')\r\n btn.addEventListener('click', () => {\r\n const token = input.value.trim()\r\n if (!token) {\r\n err.textContent = t('error.required')\r\n err.style.display = 'block'\r\n return\r\n }\r\n err.style.display = 'none'\r\n btn.disabled = true\r\n btn.textContent = t('tracker.tracking')\r\n doTrack(token, container, t, onTracked, onReplySent, onError, onBack)\r\n })\r\n container.appendChild(btn)\r\n}\r\n\r\nfunction renderLoading(container: HTMLElement, t: T) {\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n const p = document.createElement('p')\r\n p.textContent = t('tracker.tracking')\r\n p.style.textAlign = 'center'\r\n p.style.color = 'var(--rqd-text-secondary)'\r\n container.appendChild(p)\r\n}\r\n\r\nasync function doTrack(\r\n token: string,\r\n container: HTMLElement,\r\n t: T,\r\n onTracked: EventCallback,\r\n onReplySent: EventCallback,\r\n onError: EventCallback,\r\n onBack?: () => void,\r\n) {\r\n try {\r\n const result = await trackTicket(token)\r\n onTracked(result)\r\n renderTicketDetail(container, token, result, t, onReplySent, onError, onBack)\r\n } catch (err) {\r\n onError(err)\r\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\r\n }\r\n}\r\n\r\nfunction renderTicketDetail(\r\n container: HTMLElement,\r\n token: string,\r\n ticket: TrackedTicketResult,\r\n t: T,\r\n onReplySent: EventCallback,\r\n onError: EventCallback,\r\n onBack?: () => void,\r\n) {\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n if (onBack) {\r\n const backBtn = document.createElement('button')\r\n backBtn.className = 'rqd-btn rqd-btn-secondary'\r\n backBtn.textContent = t('tracker.back')\r\n backBtn.style.marginBottom = '12px'\r\n backBtn.addEventListener('click', onBack)\r\n container.appendChild(backBtn)\r\n }\r\n\r\n // Ticket info\r\n const info = document.createElement('div')\r\n info.className = 'rqd-ticket-info'\r\n\r\n const titleRow = document.createElement('div')\r\n titleRow.style.fontWeight = '600'\r\n titleRow.style.marginBottom = '8px'\r\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\r\n info.appendChild(titleRow)\r\n\r\n for (const [label, value] of [\r\n [t('tracker.status'), ticket.status],\r\n [t('tracker.priority'), ticket.priority],\r\n [t('tracker.created'), new Date(ticket.createdAt).toLocaleDateString()],\r\n ]) {\r\n const row = document.createElement('div')\r\n row.className = 'rqd-ticket-row'\r\n const lbl = document.createElement('span')\r\n lbl.className = 'rqd-ticket-label'\r\n lbl.textContent = label\r\n row.appendChild(lbl)\r\n const badge = document.createElement('span')\r\n badge.className = 'rqd-badge'\r\n badge.textContent = value\r\n row.appendChild(badge)\r\n info.appendChild(row)\r\n }\r\n container.appendChild(info)\r\n\r\n // Replies\r\n const repliesLabel = document.createElement('div')\r\n repliesLabel.className = 'rqd-label'\r\n repliesLabel.textContent = t('tracker.replies')\r\n repliesLabel.style.marginBottom = '8px'\r\n container.appendChild(repliesLabel)\r\n\r\n if (ticket.replies.length === 0) {\r\n const noReplies = document.createElement('p')\r\n noReplies.textContent = t('tracker.noReplies')\r\n noReplies.style.color = 'var(--rqd-text-secondary)'\r\n noReplies.style.fontSize = '13px'\r\n container.appendChild(noReplies)\r\n } else {\r\n for (const reply of ticket.replies) {\r\n const replyEl = document.createElement('div')\r\n replyEl.className = 'rqd-reply'\r\n\r\n const header = document.createElement('div')\r\n header.className = 'rqd-reply-header'\r\n const authorSpan = document.createElement('span')\r\n authorSpan.textContent = reply.authorName\r\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\r\n header.appendChild(authorSpan)\r\n const dateSpan = document.createElement('span')\r\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\r\n header.appendChild(dateSpan)\r\n replyEl.appendChild(header)\r\n\r\n const body = document.createElement('div')\r\n body.className = 'rqd-reply-body'\r\n body.textContent = reply.body\r\n replyEl.appendChild(body)\r\n\r\n container.appendChild(replyEl)\r\n }\r\n }\r\n\r\n // Reply form\r\n const replyGroup = document.createElement('div')\r\n replyGroup.className = 'rqd-form-group'\r\n replyGroup.style.marginTop = '12px'\r\n\r\n const textarea = document.createElement('textarea')\r\n textarea.className = 'rqd-textarea'\r\n textarea.placeholder = t('tracker.replyPlaceholder')\r\n textarea.rows = 3\r\n replyGroup.appendChild(textarea)\r\n container.appendChild(replyGroup)\r\n\r\n const sendBtn = document.createElement('button')\r\n sendBtn.className = 'rqd-btn rqd-btn-primary'\r\n sendBtn.textContent = t('tracker.sendReply')\r\n sendBtn.addEventListener('click', async () => {\r\n const body = textarea.value.trim()\r\n if (!body) return\r\n\r\n sendBtn.disabled = true\r\n sendBtn.textContent = t('tracker.sending')\r\n\r\n try {\r\n await submitTrackingReply(token, body)\r\n onReplySent({ token, body })\r\n // Refresh ticket detail\r\n const updated = await trackTicket(token)\r\n renderTicketDetail(container, token, updated, t, onReplySent, onError, onBack)\r\n } catch (err) {\r\n onError(err)\r\n sendBtn.disabled = false\r\n sendBtn.textContent = t('tracker.sendReply')\r\n }\r\n })\r\n container.appendChild(sendBtn)\r\n}\r\n","import { submitTicket } from '../api-client'\r\nimport type { EventCallback, SubmitTicketData } from '../types'\r\n\r\ntype T = (key: string) => string\r\n\r\ninterface PortalTicket {\r\n id: string\r\n ticketNumber: string\r\n title: string\r\n status: string\r\n priority: string\r\n createdAt: string\r\n}\r\n\r\ninterface PortalTicketDetail extends PortalTicket {\r\n replies: Array<{\r\n id: string\r\n body: string\r\n authorName: string\r\n isStaff: boolean\r\n createdAt: string\r\n }>\r\n}\r\n\r\nexport function createPortalView(\r\n t: T,\r\n fetchTickets: () => Promise<PortalTicket[]>,\r\n fetchTicketDetail: (id: string) => Promise<PortalTicketDetail>,\r\n submitReply: (ticketId: string, body: string) => Promise<void>,\r\n projectId: string,\r\n onTicketCreated: EventCallback,\r\n onError: EventCallback,\r\n pollingInterval?: number,\r\n): HTMLElement {\r\n const container = document.createElement('div')\r\n container.className = 'rqd-portal'\r\n\r\n let currentView: 'list' | 'detail' | 'new' = 'list'\r\n let pollTimer: ReturnType<typeof setInterval> | undefined\r\n\r\n function renderList() {\r\n currentView = 'list'\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n const header = document.createElement('div')\r\n header.style.display = 'flex'\r\n header.style.justifyContent = 'space-between'\r\n header.style.alignItems = 'center'\r\n header.style.marginBottom = '12px'\r\n\r\n const title = document.createElement('span')\r\n title.style.fontWeight = '600'\r\n title.textContent = t('portal.myTickets')\r\n header.appendChild(title)\r\n\r\n const newBtn = document.createElement('button')\r\n newBtn.className = 'rqd-btn rqd-btn-primary'\r\n newBtn.style.width = 'auto'\r\n newBtn.style.padding = '6px 14px'\r\n newBtn.style.fontSize = '13px'\r\n newBtn.textContent = t('portal.newTicket')\r\n newBtn.addEventListener('click', renderNewTicketForm)\r\n header.appendChild(newBtn)\r\n\r\n container.appendChild(header)\r\n\r\n const loading = document.createElement('p')\r\n loading.textContent = '...'\r\n loading.style.textAlign = 'center'\r\n loading.style.color = 'var(--rqd-text-secondary)'\r\n container.appendChild(loading)\r\n\r\n fetchTickets()\r\n .then((tickets) => {\r\n loading.remove()\r\n if (tickets.length === 0) {\r\n const empty = document.createElement('p')\r\n empty.textContent = t('portal.noTickets')\r\n empty.style.textAlign = 'center'\r\n empty.style.color = 'var(--rqd-text-secondary)'\r\n empty.style.padding = '24px 0'\r\n container.appendChild(empty)\r\n return\r\n }\r\n\r\n for (const ticket of tickets) {\r\n const row = document.createElement('div')\r\n row.className = 'rqd-ticket-info'\r\n row.style.cursor = 'pointer'\r\n row.style.marginBottom = '8px'\r\n\r\n const top = document.createElement('div')\r\n top.style.display = 'flex'\r\n top.style.justifyContent = 'space-between'\r\n top.style.marginBottom = '4px'\r\n\r\n const num = document.createElement('span')\r\n num.style.fontWeight = '600'\r\n num.style.fontSize = '13px'\r\n num.textContent = ticket.ticketNumber\r\n top.appendChild(num)\r\n\r\n const badge = document.createElement('span')\r\n badge.className = 'rqd-badge'\r\n badge.textContent = ticket.status\r\n top.appendChild(badge)\r\n\r\n row.appendChild(top)\r\n\r\n const titleEl = document.createElement('div')\r\n titleEl.style.fontSize = '14px'\r\n titleEl.textContent = ticket.title\r\n row.appendChild(titleEl)\r\n\r\n const date = document.createElement('div')\r\n date.style.fontSize = '12px'\r\n date.style.color = 'var(--rqd-text-secondary)'\r\n date.style.marginTop = '4px'\r\n date.textContent = new Date(ticket.createdAt).toLocaleDateString()\r\n row.appendChild(date)\r\n\r\n row.addEventListener('click', () => renderDetail(ticket.id))\r\n container.appendChild(row)\r\n }\r\n })\r\n .catch((err) => {\r\n loading.remove()\r\n onError(err)\r\n })\r\n\r\n // Start polling\r\n if (pollingInterval && pollingInterval > 0) {\r\n stopPolling()\r\n pollTimer = setInterval(() => {\r\n if (currentView === 'list') renderList()\r\n }, pollingInterval)\r\n }\r\n }\r\n\r\n function renderDetail(ticketId: string) {\r\n currentView = 'detail'\r\n stopPolling()\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n const backBtn = document.createElement('button')\r\n backBtn.className = 'rqd-btn rqd-btn-secondary'\r\n backBtn.textContent = t('tracker.back')\r\n backBtn.style.marginBottom = '12px'\r\n backBtn.addEventListener('click', renderList)\r\n container.appendChild(backBtn)\r\n\r\n const loading = document.createElement('p')\r\n loading.textContent = '...'\r\n loading.style.textAlign = 'center'\r\n container.appendChild(loading)\r\n\r\n fetchTicketDetail(ticketId)\r\n .then((ticket) => {\r\n loading.remove()\r\n\r\n const info = document.createElement('div')\r\n info.className = 'rqd-ticket-info'\r\n\r\n const titleRow = document.createElement('div')\r\n titleRow.style.fontWeight = '600'\r\n titleRow.style.marginBottom = '8px'\r\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\r\n info.appendChild(titleRow)\r\n\r\n for (const [label, value] of [\r\n [t('tracker.status'), ticket.status],\r\n [t('tracker.priority'), ticket.priority],\r\n ]) {\r\n const row = document.createElement('div')\r\n row.className = 'rqd-ticket-row'\r\n const lbl = document.createElement('span')\r\n lbl.className = 'rqd-ticket-label'\r\n lbl.textContent = label\r\n row.appendChild(lbl)\r\n const badge = document.createElement('span')\r\n badge.className = 'rqd-badge'\r\n badge.textContent = value\r\n row.appendChild(badge)\r\n info.appendChild(row)\r\n }\r\n container.appendChild(info)\r\n\r\n // Replies\r\n const repliesLabel = document.createElement('div')\r\n repliesLabel.className = 'rqd-label'\r\n repliesLabel.textContent = t('tracker.replies')\r\n repliesLabel.style.marginBottom = '8px'\r\n container.appendChild(repliesLabel)\r\n\r\n if (ticket.replies.length === 0) {\r\n const noReplies = document.createElement('p')\r\n noReplies.textContent = t('tracker.noReplies')\r\n noReplies.style.color = 'var(--rqd-text-secondary)'\r\n noReplies.style.fontSize = '13px'\r\n container.appendChild(noReplies)\r\n } else {\r\n for (const reply of ticket.replies) {\r\n const replyEl = document.createElement('div')\r\n replyEl.className = 'rqd-reply'\r\n\r\n const header = document.createElement('div')\r\n header.className = 'rqd-reply-header'\r\n const authorSpan = document.createElement('span')\r\n authorSpan.textContent = reply.authorName\r\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\r\n header.appendChild(authorSpan)\r\n const dateSpan = document.createElement('span')\r\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\r\n header.appendChild(dateSpan)\r\n replyEl.appendChild(header)\r\n\r\n const body = document.createElement('div')\r\n body.className = 'rqd-reply-body'\r\n body.textContent = reply.body\r\n replyEl.appendChild(body)\r\n\r\n container.appendChild(replyEl)\r\n }\r\n }\r\n\r\n // Reply form\r\n const replyGroup = document.createElement('div')\r\n replyGroup.className = 'rqd-form-group'\r\n replyGroup.style.marginTop = '12px'\r\n\r\n const textarea = document.createElement('textarea')\r\n textarea.className = 'rqd-textarea'\r\n textarea.placeholder = t('tracker.replyPlaceholder')\r\n textarea.rows = 3\r\n replyGroup.appendChild(textarea)\r\n container.appendChild(replyGroup)\r\n\r\n const sendBtn = document.createElement('button')\r\n sendBtn.className = 'rqd-btn rqd-btn-primary'\r\n sendBtn.textContent = t('tracker.sendReply')\r\n sendBtn.addEventListener('click', async () => {\r\n const body = textarea.value.trim()\r\n if (!body) return\r\n sendBtn.disabled = true\r\n sendBtn.textContent = t('tracker.sending')\r\n try {\r\n await submitReply(ticketId, body)\r\n renderDetail(ticketId)\r\n } catch (err) {\r\n onError(err)\r\n sendBtn.disabled = false\r\n sendBtn.textContent = t('tracker.sendReply')\r\n }\r\n })\r\n container.appendChild(sendBtn)\r\n })\r\n .catch((err) => {\r\n loading.remove()\r\n onError(err)\r\n })\r\n }\r\n\r\n function renderNewTicketForm() {\r\n currentView = 'new'\r\n stopPolling()\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n const backBtn = document.createElement('button')\r\n backBtn.className = 'rqd-btn rqd-btn-secondary'\r\n backBtn.textContent = t('tracker.back')\r\n backBtn.style.marginBottom = '12px'\r\n backBtn.addEventListener('click', renderList)\r\n container.appendChild(backBtn)\r\n\r\n // Minimal inline form\r\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\r\n\r\n function addField(name: string, type: 'input' | 'textarea', label: string, placeholder: string) {\r\n const group = document.createElement('div')\r\n group.className = 'rqd-form-group'\r\n const lbl = document.createElement('label')\r\n lbl.className = 'rqd-label'\r\n lbl.textContent = label\r\n group.appendChild(lbl)\r\n const el = type === 'textarea' ? document.createElement('textarea') : document.createElement('input')\r\n el.className = type === 'textarea' ? 'rqd-textarea' : 'rqd-input'\r\n el.placeholder = placeholder\r\n el.name = name\r\n group.appendChild(el)\r\n fields[name] = el\r\n container.appendChild(group)\r\n }\r\n\r\n addField('title', 'input', t('form.title'), t('form.titlePlaceholder'))\r\n addField('description', 'textarea', t('form.description'), t('form.descriptionPlaceholder'))\r\n\r\n const submitBtn = document.createElement('button')\r\n submitBtn.className = 'rqd-btn rqd-btn-primary'\r\n submitBtn.textContent = t('form.submit')\r\n submitBtn.addEventListener('click', async () => {\r\n const title = (fields.title as HTMLInputElement).value.trim()\r\n if (!title || title.length < 5) return\r\n\r\n submitBtn.disabled = true\r\n submitBtn.textContent = t('form.submitting')\r\n\r\n const data: SubmitTicketData = {\r\n title,\r\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\r\n email: '', // Portal users are identified, email comes from customer config\r\n priority: 'medium',\r\n }\r\n\r\n try {\r\n const result = await submitTicket(projectId, data)\r\n onTicketCreated(result)\r\n renderList()\r\n } catch (err) {\r\n onError(err)\r\n submitBtn.disabled = false\r\n submitBtn.textContent = t('form.submit')\r\n }\r\n })\r\n container.appendChild(submitBtn)\r\n }\r\n\r\n function stopPolling() {\r\n if (pollTimer) {\r\n clearInterval(pollTimer)\r\n pollTimer = undefined\r\n }\r\n }\r\n\r\n // Initial render\r\n renderList()\r\n\r\n return container\r\n}\r\n","import { configureClient } from './api-client'\r\nimport { en } from './i18n/en'\r\nimport { ar } from './i18n/ar'\r\nimport { mountWidget, unmountWidget, getShadowRoot } from './shadow-dom'\r\nimport { themeToVars } from './theme'\r\nimport { createFab, setFabOpen } from './ui/fab'\r\nimport { createTicketForm, createSuccessView } from './ui/ticket-form'\r\nimport { createTrackerView } from './ui/tracker'\r\nimport { createPortalView } from './ui/portal'\r\nimport { getTrackingTokens, loadWidgetConfig, saveWidgetConfig } from './storage'\r\nimport type {\r\n ReqdeskWidgetConfig,\r\n ThemeConfig,\r\n CustomerConfig,\r\n WidgetEvent,\r\n EventCallback,\r\n TicketResult,\r\n} from './types'\r\n\r\nexport type {\r\n ReqdeskWidgetConfig,\r\n ThemeConfig,\r\n CustomerConfig,\r\n WidgetEvent,\r\n EventCallback,\r\n TicketResult,\r\n}\r\n\r\nconst translations: Record<string, Record<string, string>> = { en, ar }\r\nconst listeners: Record<string, EventCallback[]> = {}\r\n\r\nlet config: ReqdeskWidgetConfig | null = null\r\nlet isOpen = false\r\nlet currentLang = 'en'\r\nlet fab: HTMLButtonElement | null = null\r\nlet panel: HTMLElement | null = null\r\nlet mount: HTMLElement | null = null\r\nlet currentTab: 'form' | 'tracker' = 'form'\r\nlet pendingTrackToken: string | undefined\r\n\r\nfunction t(key: string): string {\r\n const overrides = config?.translations\r\n if (overrides?.[key]) return overrides[key]\r\n const lang = translations[currentLang] ?? translations.en\r\n return lang[key] ?? key\r\n}\r\n\r\nfunction emit(event: WidgetEvent, data?: unknown) {\r\n for (const cb of listeners[event] ?? []) {\r\n try { cb(data) } catch { /* ignore listener errors */ }\r\n }\r\n}\r\n\r\nfunction deriveApiUrl(): string {\r\n return window.location.origin\r\n}\r\n\r\nfunction extractProjectId(): string {\r\n // The project ID is resolved server-side via the API key's entity_id claim\r\n return '_current'\r\n}\r\n\r\nfunction renderPanel() {\r\n if (!mount || !config) return\r\n\r\n while (mount.firstChild) mount.removeChild(mount.firstChild)\r\n\r\n const position = config.position ?? 'bottom-right'\r\n\r\n if (!config.inline) {\r\n panel = document.createElement('div')\r\n panel.className = `rqd-panel rqd-${position}`\r\n panel.style.cssText = themeToVars(config.theme)\r\n\r\n // Header\r\n const header = document.createElement('div')\r\n header.className = 'rqd-header'\r\n const title = document.createElement('span')\r\n title.className = 'rqd-header-title'\r\n title.textContent = t('widget.title')\r\n header.appendChild(title)\r\n\r\n const closeBtn = document.createElement('button')\r\n closeBtn.className = 'rqd-header-close'\r\n closeBtn.textContent = '\\u2715'\r\n closeBtn.addEventListener('click', close)\r\n header.appendChild(closeBtn)\r\n panel.appendChild(header)\r\n\r\n const body = document.createElement('div')\r\n body.className = 'rqd-body'\r\n\r\n const isPortal = config.widget === 'support-portal' && config.customer?.email\r\n\r\n if (isPortal) {\r\n // Support portal mode — full ticket list + detail\r\n renderPortal(body)\r\n } else {\r\n // Ticket form + tracker tabs\r\n const tabs = document.createElement('div')\r\n tabs.className = 'rqd-tabs'\r\n\r\n const formTab = document.createElement('button')\r\n formTab.className = `rqd-tab${currentTab === 'form' ? ' rqd-active' : ''}`\r\n formTab.textContent = t('widget.newTicket')\r\n formTab.addEventListener('click', () => switchTab('form', body, tabs))\r\n\r\n const trackerTab = document.createElement('button')\r\n trackerTab.className = `rqd-tab${currentTab === 'tracker' ? ' rqd-active' : ''}`\r\n trackerTab.textContent = t('widget.trackTicket')\r\n trackerTab.addEventListener('click', () => switchTab('tracker', body, tabs))\r\n\r\n tabs.appendChild(formTab)\r\n tabs.appendChild(trackerTab)\r\n panel.appendChild(tabs)\r\n\r\n if (currentTab === 'form') renderForm(body)\r\n else renderTracker(body)\r\n }\r\n\r\n panel.appendChild(body)\r\n\r\n mount.appendChild(panel)\r\n } else {\r\n // Inline mode\r\n const container = typeof config.container === 'string'\r\n ? document.querySelector(config.container)\r\n : config.container\r\n\r\n if (container) {\r\n const inline = document.createElement('div')\r\n inline.className = 'rqd-inline'\r\n inline.style.cssText = themeToVars(config.theme)\r\n\r\n const body = document.createElement('div')\r\n body.className = 'rqd-body'\r\n renderForm(body)\r\n inline.appendChild(body)\r\n\r\n // For inline, mount in the host page, not shadow DOM\r\n container.appendChild(inline)\r\n return\r\n }\r\n }\r\n}\r\n\r\nfunction renderPortal(container: HTMLElement) {\r\n if (!config) return\r\n\r\n const projectId = extractProjectId()\r\n\r\n // Portal uses the API client's ticket endpoints (via API key auth)\r\n // These return the customer's own tickets when customer.email is set\r\n const portalView = createPortalView(\r\n t,\r\n async () => {\r\n // Placeholder: in a real implementation, getTickets would filter by customer email\r\n // For now, return empty array — the backend filters by API key's project\r\n return []\r\n },\r\n async (id: string) => {\r\n return {\r\n id,\r\n ticketNumber: '',\r\n title: '',\r\n status: '',\r\n priority: '',\r\n createdAt: '',\r\n replies: [],\r\n }\r\n },\r\n async (_ticketId: string, _body: string) => {\r\n // Will call submitReply via API client\r\n },\r\n projectId,\r\n (data) => emit('ticket:created', data),\r\n (err) => emit('error', err),\r\n 30000,\r\n )\r\n container.appendChild(portalView)\r\n}\r\n\r\nfunction switchTab(tab: 'form' | 'tracker', body: HTMLElement, tabs: HTMLElement) {\r\n currentTab = tab\r\n pendingTrackToken = undefined\r\n\r\n // Update tab active state\r\n const tabBtns = tabs.querySelectorAll('.rqd-tab')\r\n tabBtns.forEach((btn, i) => {\r\n btn.classList.toggle('rqd-active', (i === 0 && tab === 'form') || (i === 1 && tab === 'tracker'))\r\n })\r\n\r\n while (body.firstChild) body.removeChild(body.firstChild)\r\n if (tab === 'form') renderForm(body)\r\n else renderTracker(body)\r\n}\r\n\r\nfunction renderForm(container: HTMLElement) {\r\n if (!config) return\r\n\r\n const projectId = extractProjectId()\r\n const form = createTicketForm(\r\n projectId,\r\n t,\r\n (result: TicketResult) => {\r\n emit('ticket:created', result)\r\n renderSuccess(container, result)\r\n },\r\n (err) => {\r\n emit('error', err)\r\n },\r\n )\r\n container.appendChild(form)\r\n}\r\n\r\nfunction renderTracker(container: HTMLElement) {\r\n const view = createTrackerView(\r\n t,\r\n (data) => emit('ticket:tracked', data),\r\n (data) => emit('reply:sent', data),\r\n (err) => emit('error', err),\r\n undefined,\r\n pendingTrackToken,\r\n )\r\n container.appendChild(view)\r\n}\r\n\r\nfunction renderSuccess(container: HTMLElement, result: TicketResult) {\r\n while (container.firstChild) container.removeChild(container.firstChild)\r\n\r\n const view = createSuccessView(\r\n result,\r\n t,\r\n () => close(),\r\n result.trackingToken\r\n ? () => {\r\n pendingTrackToken = result.trackingToken\r\n // Switch to tracker tab\r\n if (panel) {\r\n const body = panel.querySelector('.rqd-body') as HTMLElement\r\n const tabs = panel.querySelector('.rqd-tabs') as HTMLElement\r\n if (body && tabs) switchTab('tracker', body, tabs)\r\n }\r\n }\r\n : undefined,\r\n )\r\n container.appendChild(view)\r\n}\r\n\r\nexport function init(cfg: ReqdeskWidgetConfig): void {\r\n if (config) return // singleton guard\r\n\r\n // Merge saved config as defaults — explicit init values take priority\r\n const saved = loadWidgetConfig(cfg.apiKey)\r\n config = {\r\n ...cfg,\r\n position: cfg.position ?? saved?.position ?? 'bottom-right',\r\n language: cfg.language ?? saved?.language ?? 'en',\r\n widget: cfg.widget ?? saved?.widget ?? 'ticket-form',\r\n theme: { ...saved?.theme, ...cfg.theme },\r\n }\r\n currentLang = config.language ?? 'en'\r\n\r\n // Persist resolved config for next init\r\n saveWidgetConfig(cfg.apiKey, {\r\n position: config.position,\r\n language: config.language,\r\n widget: config.widget,\r\n theme: config.theme,\r\n })\r\n\r\n const apiUrl = deriveApiUrl()\r\n configureClient(apiUrl, cfg.apiKey)\r\n\r\n if (cfg.inline) {\r\n renderPanel()\r\n return\r\n }\r\n\r\n const { mount: m } = mountWidget({ zIndex: cfg.theme?.zIndex })\r\n mount = m\r\n\r\n // Apply theme vars to the root\r\n const shadow = getShadowRoot()\r\n if (shadow) {\r\n const root = shadow.querySelector('.rqd-root') as HTMLElement\r\n if (root) root.style.cssText = themeToVars(cfg.theme)\r\n }\r\n\r\n // Set RTL\r\n const host = document.getElementById('reqdesk-widget')\r\n if (host && (currentLang === 'ar')) {\r\n host.setAttribute('dir', 'rtl')\r\n }\r\n\r\n // Auto-show tracker tab if user has saved tracking tokens\r\n const tokens = getTrackingTokens(cfg.apiKey)\r\n if (tokens.length > 0) currentTab = 'tracker'\r\n\r\n const position = cfg.position ?? 'bottom-right'\r\n fab = createFab(position, toggle)\r\n mount.appendChild(fab)\r\n}\r\n\r\nexport function open(): void {\r\n if (!config || isOpen) return\r\n isOpen = true\r\n if (fab) setFabOpen(fab, true)\r\n renderPanel()\r\n emit('open')\r\n}\r\n\r\nexport function close(): void {\r\n if (!isOpen) return\r\n isOpen = false\r\n if (fab) setFabOpen(fab, false)\r\n if (panel) {\r\n panel.remove()\r\n panel = null\r\n }\r\n emit('close')\r\n}\r\n\r\nexport function toggle(): void {\r\n if (isOpen) close()\r\n else open()\r\n}\r\n\r\nexport function setLanguage(lang: string): void {\r\n currentLang = lang\r\n if (config) {\r\n config.language = lang\r\n saveWidgetConfig(config.apiKey, { language: lang })\r\n }\r\n const host = document.getElementById('reqdesk-widget')\r\n if (host) {\r\n host.setAttribute('dir', lang === 'ar' ? 'rtl' : 'ltr')\r\n }\r\n // Re-render if open\r\n if (isOpen && panel && mount) {\r\n panel.remove()\r\n panel = null\r\n renderPanel()\r\n }\r\n}\r\n\r\nexport function setTheme(theme: Partial<ThemeConfig>): void {\r\n if (!config) return\r\n config.theme = { ...config.theme, ...theme }\r\n saveWidgetConfig(config.apiKey, { theme: config.theme })\r\n if (panel) {\r\n panel.style.cssText = themeToVars(config.theme)\r\n }\r\n}\r\n\r\nexport function on(event: WidgetEvent, callback: EventCallback): void {\r\n if (!listeners[event]) listeners[event] = []\r\n listeners[event].push(callback)\r\n}\r\n\r\nexport function identify(customer: CustomerConfig): void {\r\n if (config) config.customer = customer\r\n}\r\n\r\nexport function destroy(): void {\r\n close()\r\n unmountWidget()\r\n config = null\r\n fab = null\r\n panel = null\r\n mount = null\r\n isOpen = false\r\n for (const key of Object.keys(listeners)) {\r\n delete listeners[key]\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
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-rPiXlS0A.js";
2
2
  import { ReactNode } from "react";
3
- import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
4
4
 
5
5
  //#region src/react/types.d.ts
6
6
  interface ReqdeskProviderProps {
@@ -44,7 +44,7 @@ declare function ReqdeskProvider({
44
44
  customer,
45
45
  translations,
46
46
  children
47
- }: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
47
+ }: ReqdeskProviderProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
57
+ }: TicketFormProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
63
+ }: SupportPortalProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
78
+ }: FloatingWidgetProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
90
+ }: ShadowRootProps): react_jsx_runtime1.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-DYAKyC3I.d.ts.map
107
+ //# sourceMappingURL=react-BLAoKiUb.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-DYAKyC3I.d.ts","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"}
1
+ {"version":3,"file":"react-BLAoKiUb.d.ts","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"}
@@ -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 react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime1 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): react_jsx_runtime0.JSX.Element;
47
+ }: ReqdeskProviderProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
57
+ }: TicketFormProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
63
+ }: SupportPortalProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
78
+ }: FloatingWidgetProps): react_jsx_runtime1.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): react_jsx_runtime0.JSX.Element;
90
+ }: ShadowRootProps): react_jsx_runtime1.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-PYPqwxcj.d.cts.map
107
+ //# sourceMappingURL=react-SJ0r-FEh.d.cts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"react-SJ0r-FEh.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
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_storage = require("./storage-DqhhTxeh.cjs");
2
+ const require_storage = require("./storage-Cx5p1yP-.cjs");
3
3
  let react = require("react");
4
4
  let _tanstack_react_query = require("@tanstack/react-query");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -32,7 +32,11 @@ function onAuthStateChange(listener) {
32
32
  listeners = listeners.filter((l) => l !== listener);
33
33
  };
34
34
  }
35
- async function initWidgetAuth(config) {
35
+ function initWidgetAuth(config) {
36
+ initPromise = _initWidgetAuth(config);
37
+ return initPromise;
38
+ }
39
+ async function _initWidgetAuth(config) {
36
40
  setState({ isLoading: true });
37
41
  try {
38
42
  const { createOidc } = await import("oidc-spa/core");
@@ -69,8 +73,13 @@ async function initWidgetAuth(config) {
69
73
  });
70
74
  }
71
75
  }
76
+ let initPromise = null;
72
77
  async function login() {
73
- if (!oidcInstance) return;
78
+ if (!oidcInstance && initPromise) await initPromise;
79
+ if (!oidcInstance) {
80
+ console.warn("[reqdesk-widget] Cannot login: OIDC not initialized. Check auth config.");
81
+ return;
82
+ }
74
83
  await oidcInstance.login({ doesCurrentHrefRequiresAuth: false });
75
84
  }
76
85
  async function logout() {
@@ -298,7 +307,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
298
307
  onError,
299
308
  t
300
309
  ]);
301
- const cssVars = require_storage.themeToVars(ctx.theme);
310
+ const cssVars = require_storage.themeToStyle(ctx.theme);
302
311
  const content = success ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
303
312
  className: "rqd-success",
304
313
  style: {
@@ -436,7 +445,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
436
445
  className,
437
446
  style: {
438
447
  ...style,
439
- cssText: cssVars
448
+ ...cssVars
440
449
  },
441
450
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
442
451
  className: "rqd-body",
@@ -445,7 +454,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
445
454
  }) });
446
455
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
447
456
  className: `rqd-inline ${className ?? ""}`,
448
- style: { cssText: cssVars },
457
+ style: cssVars,
449
458
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
450
459
  className: "rqd-body",
451
460
  children: content
@@ -457,10 +466,10 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
457
466
  function SupportPortal({ className }) {
458
467
  const ctx = useReqdeskContext();
459
468
  const { isLoading } = useReqdesk();
460
- const cssVars = require_storage.themeToVars(ctx.theme);
469
+ const cssVars = require_storage.themeToStyle(ctx.theme);
461
470
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
462
471
  className: `rqd-inline ${className ?? ""}`,
463
- style: { cssText: cssVars },
472
+ style: cssVars,
464
473
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
465
474
  className: "rqd-body",
466
475
  children: isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
@@ -1553,7 +1562,7 @@ function FloatingWidget({ position = "bottom-right", contained = false, onTicket
1553
1562
  return (translations[activeLang] ?? translations.en)[key] ?? key;
1554
1563
  }, [activeLang, ctx.translations]);
1555
1564
  const isRtl = activeLang === "ar";
1556
- const cssVars = require_storage.themeToVars(activeTheme);
1565
+ const cssVars = require_storage.themeToStyle(activeTheme);
1557
1566
  const posClass = `rqd-${position}`;
1558
1567
  const containedClass = contained ? " rqd-contained" : "";
1559
1568
  const brandName = ctx.theme?.brandName;
@@ -1795,7 +1804,7 @@ function FloatingWidget({ position = "bottom-right", contained = false, onTicket
1795
1804
  const canGoBack = view !== "home";
1796
1805
  const goBackTarget = view === "ticket-detail" ? "my-tickets" : "home";
1797
1806
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1798
- style: { cssText: cssVars },
1807
+ style: cssVars,
1799
1808
  ...isRtl ? { dir: "rtl" } : {},
1800
1809
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1801
1810
  className: `rqd-fab ${posClass}${containedClass}`,
package/dist/react.d.cts CHANGED
@@ -1 +1 @@
1
- export * from './react-PYPqwxcj.cjs';
1
+ export * from './react-SJ0r-FEh.cjs';
package/dist/react.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './react-DYAKyC3I.js';
1
+ export * from './react-BLAoKiUb.js';