@reqdesk/widget 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +334 -0
- package/dist/index-2oPxlN4_.d.cts +17 -0
- package/dist/index-2oPxlN4_.d.cts.map +1 -0
- package/dist/index-B8fhsCuv.d.ts +17 -0
- package/dist/index-B8fhsCuv.d.ts.map +1 -0
- package/dist/index.cjs +919 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.iife.js +117 -0
- package/dist/index.js +912 -0
- package/dist/index.js.map +1 -0
- package/dist/react-8GCnIHnw.d.cts +107 -0
- package/dist/react-8GCnIHnw.d.cts.map +1 -0
- package/dist/react-D69QlAm1.d.ts +107 -0
- package/dist/react-D69QlAm1.d.ts.map +1 -0
- package/dist/react.cjs +1642 -0
- package/dist/react.d.cts +1 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +1637 -0
- package/dist/react.js.map +1 -0
- package/dist/storage-CC5BCsxP.js +722 -0
- package/dist/storage-CC5BCsxP.js.map +1 -0
- package/dist/storage-Db9XjupR.cjs +845 -0
- package/dist/types-CRxzGfna.d.cts +72 -0
- package/dist/types-CRxzGfna.d.cts.map +1 -0
- package/dist/types-gPfzZQw5.d.ts +72 -0
- package/dist/types-gPfzZQw5.d.ts.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"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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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
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-CRxzGfna.cjs";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/react/types.d.ts
|
|
6
|
+
interface ReqdeskProviderProps {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
auth?: OidcAuthConfig;
|
|
9
|
+
theme?: ThemeConfig;
|
|
10
|
+
language?: string;
|
|
11
|
+
customer?: CustomerConfig;
|
|
12
|
+
translations?: Record<string, string>;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
interface TicketFormProps {
|
|
16
|
+
mode?: 'floating' | 'inline';
|
|
17
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
18
|
+
defaultCategory?: string;
|
|
19
|
+
onTicketCreated?: (ticket: TicketResult) => void;
|
|
20
|
+
onError?: (error: WidgetError) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
style?: React.CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
interface SupportPortalProps {
|
|
25
|
+
pollingInterval?: number;
|
|
26
|
+
onTicketSelected?: (ticketId: string) => void;
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
interface UseReqdeskReturn {
|
|
31
|
+
submitTicket(data: SubmitTicketData): Promise<TicketResult>;
|
|
32
|
+
trackTicket(token: string): Promise<TrackedTicketResult>;
|
|
33
|
+
submitTrackingReply(token: string, body: string): Promise<void>;
|
|
34
|
+
isLoading: boolean;
|
|
35
|
+
error: WidgetError | null;
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/react/ReqdeskProvider.d.ts
|
|
39
|
+
declare function ReqdeskProvider({
|
|
40
|
+
apiKey,
|
|
41
|
+
auth,
|
|
42
|
+
theme,
|
|
43
|
+
language,
|
|
44
|
+
customer,
|
|
45
|
+
translations,
|
|
46
|
+
children
|
|
47
|
+
}: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
|
|
48
|
+
//# sourceMappingURL=ReqdeskProvider.d.ts.map
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/react/TicketForm.d.ts
|
|
51
|
+
declare function TicketForm({
|
|
52
|
+
mode,
|
|
53
|
+
onTicketCreated,
|
|
54
|
+
onError,
|
|
55
|
+
className,
|
|
56
|
+
style
|
|
57
|
+
}: TicketFormProps): react_jsx_runtime0.JSX.Element;
|
|
58
|
+
//# sourceMappingURL=TicketForm.d.ts.map
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/react/SupportPortal.d.ts
|
|
61
|
+
declare function SupportPortal({
|
|
62
|
+
className
|
|
63
|
+
}: SupportPortalProps): react_jsx_runtime0.JSX.Element;
|
|
64
|
+
//# sourceMappingURL=SupportPortal.d.ts.map
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/react/FloatingWidget.d.ts
|
|
67
|
+
interface FloatingWidgetProps {
|
|
68
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
69
|
+
contained?: boolean;
|
|
70
|
+
onTicketCreated?: (ticket: TicketResult) => void;
|
|
71
|
+
onError?: (error: WidgetError) => void;
|
|
72
|
+
}
|
|
73
|
+
declare function FloatingWidget({
|
|
74
|
+
position,
|
|
75
|
+
contained,
|
|
76
|
+
onTicketCreated,
|
|
77
|
+
onError
|
|
78
|
+
}: FloatingWidgetProps): react_jsx_runtime0.JSX.Element;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/react/useReqdesk.d.ts
|
|
81
|
+
declare function useReqdesk(): UseReqdeskReturn;
|
|
82
|
+
//# sourceMappingURL=useReqdesk.d.ts.map
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/react/shadow-root.d.ts
|
|
85
|
+
interface ShadowRootProps {
|
|
86
|
+
children: ReactNode;
|
|
87
|
+
}
|
|
88
|
+
declare function ShadowRoot({
|
|
89
|
+
children
|
|
90
|
+
}: ShadowRootProps): react_jsx_runtime0.JSX.Element;
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/storage.d.ts
|
|
93
|
+
interface WidgetConfigPersist {
|
|
94
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
95
|
+
language?: string;
|
|
96
|
+
theme?: {
|
|
97
|
+
primaryColor?: string;
|
|
98
|
+
mode?: 'light' | 'dark' | 'auto';
|
|
99
|
+
};
|
|
100
|
+
widget?: 'ticket-form' | 'support-portal';
|
|
101
|
+
}
|
|
102
|
+
declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
|
|
103
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
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-8GCnIHnw.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-8GCnIHnw.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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
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-gPfzZQw5.js";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/react/types.d.ts
|
|
6
|
+
interface ReqdeskProviderProps {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
auth?: OidcAuthConfig;
|
|
9
|
+
theme?: ThemeConfig;
|
|
10
|
+
language?: string;
|
|
11
|
+
customer?: CustomerConfig;
|
|
12
|
+
translations?: Record<string, string>;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
interface TicketFormProps {
|
|
16
|
+
mode?: 'floating' | 'inline';
|
|
17
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
18
|
+
defaultCategory?: string;
|
|
19
|
+
onTicketCreated?: (ticket: TicketResult) => void;
|
|
20
|
+
onError?: (error: WidgetError) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
style?: React.CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
interface SupportPortalProps {
|
|
25
|
+
pollingInterval?: number;
|
|
26
|
+
onTicketSelected?: (ticketId: string) => void;
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
interface UseReqdeskReturn {
|
|
31
|
+
submitTicket(data: SubmitTicketData): Promise<TicketResult>;
|
|
32
|
+
trackTicket(token: string): Promise<TrackedTicketResult>;
|
|
33
|
+
submitTrackingReply(token: string, body: string): Promise<void>;
|
|
34
|
+
isLoading: boolean;
|
|
35
|
+
error: WidgetError | null;
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/react/ReqdeskProvider.d.ts
|
|
39
|
+
declare function ReqdeskProvider({
|
|
40
|
+
apiKey,
|
|
41
|
+
auth,
|
|
42
|
+
theme,
|
|
43
|
+
language,
|
|
44
|
+
customer,
|
|
45
|
+
translations,
|
|
46
|
+
children
|
|
47
|
+
}: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
|
|
48
|
+
//# sourceMappingURL=ReqdeskProvider.d.ts.map
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/react/TicketForm.d.ts
|
|
51
|
+
declare function TicketForm({
|
|
52
|
+
mode,
|
|
53
|
+
onTicketCreated,
|
|
54
|
+
onError,
|
|
55
|
+
className,
|
|
56
|
+
style
|
|
57
|
+
}: TicketFormProps): react_jsx_runtime0.JSX.Element;
|
|
58
|
+
//# sourceMappingURL=TicketForm.d.ts.map
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/react/SupportPortal.d.ts
|
|
61
|
+
declare function SupportPortal({
|
|
62
|
+
className
|
|
63
|
+
}: SupportPortalProps): react_jsx_runtime0.JSX.Element;
|
|
64
|
+
//# sourceMappingURL=SupportPortal.d.ts.map
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/react/FloatingWidget.d.ts
|
|
67
|
+
interface FloatingWidgetProps {
|
|
68
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
69
|
+
contained?: boolean;
|
|
70
|
+
onTicketCreated?: (ticket: TicketResult) => void;
|
|
71
|
+
onError?: (error: WidgetError) => void;
|
|
72
|
+
}
|
|
73
|
+
declare function FloatingWidget({
|
|
74
|
+
position,
|
|
75
|
+
contained,
|
|
76
|
+
onTicketCreated,
|
|
77
|
+
onError
|
|
78
|
+
}: FloatingWidgetProps): react_jsx_runtime0.JSX.Element;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/react/useReqdesk.d.ts
|
|
81
|
+
declare function useReqdesk(): UseReqdeskReturn;
|
|
82
|
+
//# sourceMappingURL=useReqdesk.d.ts.map
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/react/shadow-root.d.ts
|
|
85
|
+
interface ShadowRootProps {
|
|
86
|
+
children: ReactNode;
|
|
87
|
+
}
|
|
88
|
+
declare function ShadowRoot({
|
|
89
|
+
children
|
|
90
|
+
}: ShadowRootProps): react_jsx_runtime0.JSX.Element;
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/storage.d.ts
|
|
93
|
+
interface WidgetConfigPersist {
|
|
94
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
95
|
+
language?: string;
|
|
96
|
+
theme?: {
|
|
97
|
+
primaryColor?: string;
|
|
98
|
+
mode?: 'light' | 'dark' | 'auto';
|
|
99
|
+
};
|
|
100
|
+
widget?: 'ticket-form' | 'support-portal';
|
|
101
|
+
}
|
|
102
|
+
declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
|
|
103
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
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-D69QlAm1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-D69QlAm1.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"}
|