@reqdesk/widget 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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_runtime2 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_runtime2.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_runtime2.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_runtime2.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_runtime2.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_runtime2.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-Bmwfo1Qg.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-Bmwfo1Qg.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_runtime3 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_runtime3.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_runtime3.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_runtime3.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_runtime3.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_runtime3.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-cnsZAJCx.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-cnsZAJCx.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,10 +32,15 @@ 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
- const { createOidc } = await import("oidc-spa/core");
42
+ const { createOidc, oidcEarlyInit } = await import("oidc-spa/core");
43
+ oidcEarlyInit();
39
44
  const oidc = await createOidc({
40
45
  issuerUri: config.issuerUri,
41
46
  clientId: config.clientId
@@ -69,8 +74,13 @@ async function initWidgetAuth(config) {
69
74
  });
70
75
  }
71
76
  }
77
+ let initPromise = null;
72
78
  async function login() {
73
- if (!oidcInstance) return;
79
+ if (!oidcInstance && initPromise) await initPromise;
80
+ if (!oidcInstance) {
81
+ console.warn("[reqdesk-widget] Cannot login: OIDC not initialized. Check auth config.");
82
+ return;
83
+ }
74
84
  await oidcInstance.login({ doesCurrentHrefRequiresAuth: false });
75
85
  }
76
86
  async function logout() {
@@ -298,7 +308,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
298
308
  onError,
299
309
  t
300
310
  ]);
301
- const cssVars = require_storage.themeToVars(ctx.theme);
311
+ const cssVars = require_storage.themeToStyle(ctx.theme);
302
312
  const content = success ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
303
313
  className: "rqd-success",
304
314
  style: {
@@ -436,7 +446,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
436
446
  className,
437
447
  style: {
438
448
  ...style,
439
- cssText: cssVars
449
+ ...cssVars
440
450
  },
441
451
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
442
452
  className: "rqd-body",
@@ -445,7 +455,7 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
445
455
  }) });
446
456
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
447
457
  className: `rqd-inline ${className ?? ""}`,
448
- style: { cssText: cssVars },
458
+ style: cssVars,
449
459
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
450
460
  className: "rqd-body",
451
461
  children: content
@@ -457,10 +467,10 @@ function TicketForm({ mode = "inline", onTicketCreated, onError, className, styl
457
467
  function SupportPortal({ className }) {
458
468
  const ctx = useReqdeskContext();
459
469
  const { isLoading } = useReqdesk();
460
- const cssVars = require_storage.themeToVars(ctx.theme);
470
+ const cssVars = require_storage.themeToStyle(ctx.theme);
461
471
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
462
472
  className: `rqd-inline ${className ?? ""}`,
463
- style: { cssText: cssVars },
473
+ style: cssVars,
464
474
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
465
475
  className: "rqd-body",
466
476
  children: isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
@@ -1553,7 +1563,7 @@ function FloatingWidget({ position = "bottom-right", contained = false, onTicket
1553
1563
  return (translations[activeLang] ?? translations.en)[key] ?? key;
1554
1564
  }, [activeLang, ctx.translations]);
1555
1565
  const isRtl = activeLang === "ar";
1556
- const cssVars = require_storage.themeToVars(activeTheme);
1566
+ const cssVars = require_storage.themeToStyle(activeTheme);
1557
1567
  const posClass = `rqd-${position}`;
1558
1568
  const containedClass = contained ? " rqd-contained" : "";
1559
1569
  const brandName = ctx.theme?.brandName;
@@ -1795,7 +1805,7 @@ function FloatingWidget({ position = "bottom-right", contained = false, onTicket
1795
1805
  const canGoBack = view !== "home";
1796
1806
  const goBackTarget = view === "ticket-detail" ? "my-tickets" : "home";
1797
1807
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShadowRoot, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1798
- style: { cssText: cssVars },
1808
+ style: cssVars,
1799
1809
  ...isRtl ? { dir: "rtl" } : {},
1800
1810
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1801
1811
  className: `rqd-fab ${posClass}${containedClass}`,
package/dist/react.d.cts CHANGED
@@ -1 +1 @@
1
- export * from './react-PYPqwxcj.cjs';
1
+ export * from './react-cnsZAJCx.cjs';
package/dist/react.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './react-DYAKyC3I.js';
1
+ export * from './react-Bmwfo1Qg.js';