@reqdesk/widget 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +334 -334
- package/dist/{index-2oPxlN4_.d.cts → index-C4jNMODn.d.cts} +2 -2
- package/dist/{index-2oPxlN4_.d.cts.map → index-C4jNMODn.d.cts.map} +1 -1
- package/dist/{index-B8fhsCuv.d.ts → index-CgLsyyP9.d.ts} +2 -2
- package/dist/{index-B8fhsCuv.d.ts.map → index-CgLsyyP9.d.ts.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.iife.js +17 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{react-D69QlAm1.d.ts → react-BLAoKiUb.d.ts} +8 -8
- package/dist/{react-D69QlAm1.d.ts.map → react-BLAoKiUb.d.ts.map} +1 -1
- package/dist/{react-8GCnIHnw.d.cts → react-SJ0r-FEh.d.cts} +8 -8
- package/dist/{react-8GCnIHnw.d.cts.map → react-SJ0r-FEh.d.cts.map} +1 -1
- package/dist/react.cjs +293 -45
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +293 -45
- package/dist/react.js.map +1 -1
- package/dist/{storage-CC5BCsxP.js → storage-BG7rsgWE.js} +102 -5
- package/dist/storage-BG7rsgWE.js.map +1 -0
- package/dist/{storage-Db9XjupR.cjs → storage-Cx5p1yP-.cjs} +118 -3
- package/dist/{types-gPfzZQw5.d.ts → types-i3IgBEjw.d.cts} +2 -1
- package/dist/{types-CRxzGfna.d.cts.map → types-i3IgBEjw.d.cts.map} +1 -1
- package/dist/{types-CRxzGfna.d.cts → types-rPiXlS0A.d.ts} +2 -1
- package/dist/{types-gPfzZQw5.d.ts.map → types-rPiXlS0A.d.ts.map} +1 -1
- package/package.json +81 -81
- package/dist/storage-CC5BCsxP.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-
|
|
1
|
+
import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-i3IgBEjw.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/index.d.ts
|
|
4
4
|
declare function init(cfg: ReqdeskWidgetConfig): void;
|
|
@@ -14,4 +14,4 @@ declare function destroy(): void;
|
|
|
14
14
|
|
|
15
15
|
//#endregion
|
|
16
16
|
export { type CustomerConfig, type EventCallback, type ReqdeskWidgetConfig, type ThemeConfig, type TicketResult, type WidgetEvent, close, destroy, identify, init, on, open, setLanguage, setTheme, toggle };
|
|
17
|
-
//# sourceMappingURL=index-
|
|
17
|
+
//# sourceMappingURL=index-C4jNMODn.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-C4jNMODn.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-
|
|
1
|
+
import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-rPiXlS0A.js";
|
|
2
2
|
|
|
3
3
|
//#region src/index.d.ts
|
|
4
4
|
declare function init(cfg: ReqdeskWidgetConfig): void;
|
|
@@ -14,4 +14,4 @@ declare function destroy(): void;
|
|
|
14
14
|
|
|
15
15
|
//#endregion
|
|
16
16
|
export { type CustomerConfig, type EventCallback, type ReqdeskWidgetConfig, type ThemeConfig, type TicketResult, type WidgetEvent, close, destroy, identify, init, on, open, setLanguage, setTheme, toggle };
|
|
17
|
-
//# sourceMappingURL=index-
|
|
17
|
+
//# sourceMappingURL=index-CgLsyyP9.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CgLsyyP9.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_storage = require("./storage-
|
|
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.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './index-
|
|
1
|
+
export * from './index-C4jNMODn.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './index-
|
|
1
|
+
export * from './index-CgLsyyP9.js';
|
package/dist/index.iife.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let n=``,r=``;function i(e,t){r=e.replace(/\/$/,``),n=t}let a=t.ofetch.create({timeout:15e3,retry:2,retryStatusCodes:[408,429,500,502,503,504],async onRequest({options:e}){e.baseURL=`${r}/api/v1`;let t=new Headers(e.headers);t.set(`X-API-Key`,n),e.headers=t},onResponseError({response:e}){let t=e._data;throw{code:t?.responseCode??`HTTP_${e.status}`,message:t?.responseMessage??e.statusText}}});function o(){return crypto.randomUUID()}async function s(e,t){let n=await a(`/projects/${e}/tickets`,{method:`POST`,body:{title:t.title,description:t.description,priority:t.priority,categoryId:t.categoryId,email:t.email},headers:{"Idempotency-Key":o()}});return{id:n.data.id,ticketNumber:n.data.attributes.ticketNumber,trackingToken:n.meta?.trackingToken,status:n.data.attributes.status}}async function c(e){let t=await a(`/tickets/track?token=${encodeURIComponent(e)}`),n=t.included??[];return{id:t.data.id,ticketNumber:t.data.attributes.ticketNumber,title:t.data.attributes.title,status:t.data.attributes.status,priority:t.data.attributes.priority,createdAt:t.data.attributes.createdAt,replies:n.filter(e=>e.type===`public-reply`).map(e=>({id:e.id,body:e.attributes.body,authorName:e.attributes.authorName,isStaff:e.attributes.isStaff,createdAt:e.attributes.createdAt}))}}async function l(e,t){await a(`/tickets/track/reply`,{method:`POST`,body:{trackingToken:e,body:t}})}let u={"widget.title":`Support`,"widget.newTicket":`New Ticket`,"widget.trackTicket":`Track Ticket`,"form.title":`Title`,"form.titlePlaceholder":`Brief summary of your issue`,"form.description":`Description`,"form.descriptionPlaceholder":`Describe your issue in detail...`,"form.email":`Email`,"form.emailPlaceholder":`your@email.com`,"form.priority":`Priority`,"form.priorityLow":`Low`,"form.priorityMedium":`Medium`,"form.priorityHigh":`High`,"form.priorityUrgent":`Urgent`,"form.category":`Category`,"form.categoryNone":`Select a category`,"form.submit":`Submit Ticket`,"form.submitting":`Submitting...`,"form.cancel":`Cancel`,"form.attachment":`Attach files`,"success.title":`Ticket Submitted!`,"success.ticketNumber":`Ticket #`,"success.trackingToken":`Your tracking token:`,"success.trackingHint":`Save this token to track your ticket status.`,"success.copyToken":`Copy Token`,"success.copied":`Copied!`,"success.close":`Close`,"success.trackNow":`Track Ticket`,"tracker.title":`Track Your Ticket`,"tracker.tokenPlaceholder":`Enter your tracking token (trk_...)`,"tracker.submit":`Track`,"tracker.tracking":`Tracking...`,"tracker.status":`Status`,"tracker.priority":`Priority`,"tracker.created":`Created`,"tracker.replies":`Replies`,"tracker.noReplies":`No replies yet.`,"tracker.replyPlaceholder":`Write a reply...`,"tracker.sendReply":`Send Reply`,"tracker.sending":`Sending...`,"tracker.back":`Back`,"tracker.staff":`Staff`,"error.generic":`Something went wrong. Please try again.`,"error.network":`Network error. Check your connection.`,"error.tokenInvalid":`Invalid or expired tracking token.`,"error.required":`This field is required.`,"error.emailInvalid":`Please enter a valid email address.`,"error.titleMin":`Title must be at least 5 characters.`,"portal.title":`Support Portal`,"portal.myTickets":`My Tickets`,"portal.noTickets":`No tickets yet.`,"portal.newTicket":`New Ticket`,"widget.close":`Close`,"menu.newTicket":`Submit a Ticket`,"menu.newTicketDesc":`Create a new support request`,"menu.myTickets":`My Tickets`,"menu.myTicketsDesc":`View and manage your tickets`,"menu.trackTicket":`Track a Ticket`,"menu.trackTicketDesc":`Check status with your tracking token`,"menu.knowledgeBase":`Knowledge Base`,"menu.knowledgeBaseDesc":`Browse help articles and guides`,"menu.myTicketsPlaceholder":`Sign in to view your tickets.`,"menu.trackPlaceholder":`Ticket tracking is coming soon.`,"menu.kbPlaceholder":`Knowledge base is coming soon.`,"menu.preferences":`Preferences`,"menu.preferencesDesc":`Language and appearance settings`,"prefs.title":`Preferences`,"prefs.language":`Language`,"prefs.theme":`Theme`,"prefs.light":`Light`,"prefs.dark":`Dark`,"prefs.auto":`System`,"branding.poweredBy":`Powered by`,"attach.dropzone":`Drop files here or click to browse`,"attach.dropzoneActive":`Drop files here`,"attach.maxFiles":`Maximum {max} files`,"attach.remove":`Remove`,"attach.uploading":`Uploading files...`,"attach.uploadProgress":`Uploading {name}... {percent}%`,"attach.invalidType":`File type not allowed`,"attach.tooLarge":`File exceeds maximum size`,"attach.tooMany":`Maximum number of files reached`,"attach.download":`Download`,"mytickets.title":`My Tickets`,"mytickets.emailPrompt":`Enter your email to view your tickets`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`Remember me`,"mytickets.lookup":`Find My Tickets`,"mytickets.lookingUp":`Looking up...`,"mytickets.noTickets":`No tickets yet.`,"mytickets.submitFirst":`Submit your first ticket`,"mytickets.noAccount":`No tickets found for this email.`,"detail.description":`Description`,"detail.attachments":`Attachments`,"detail.noAttachments":`No attachments`,"detail.replies":`Conversation`,"detail.noReplies":`No replies yet.`,"detail.replyPlaceholder":`Write a reply...`,"detail.sendReply":`Send`,"detail.sending":`Sending...`,"detail.staff":`Staff`,"detail.you":`You`,"detail.loading":`Loading ticket...`,"track.title":`Track a Ticket`,"track.tokenPlaceholder":`Enter tracking token (trk_...)`,"track.submit":`Track`,"track.tracking":`Tracking...`,"track.recentTickets":`Recent Tickets`,"track.invalidToken":`Invalid or expired tracking token.`,"prefs.clearEmail":`Clear saved email`,"prefs.emailCleared":`Email cleared`,"auth.login":`Login`,"auth.logout":`Logout`,"auth.sessionExpired":`Session expired. Please log in again.`,"prefs.accentColor":`Accent Color`},d={"widget.title":`الدعم`,"widget.newTicket":`تذكرة جديدة`,"widget.trackTicket":`تتبع التذكرة`,"form.title":`العنوان`,"form.titlePlaceholder":`ملخص موجز لمشكلتك`,"form.description":`الوصف`,"form.descriptionPlaceholder":`صف مشكلتك بالتفصيل...`,"form.email":`البريد الإلكتروني`,"form.emailPlaceholder":`your@email.com`,"form.priority":`الأولوية`,"form.priorityLow":`منخفضة`,"form.priorityMedium":`متوسطة`,"form.priorityHigh":`عالية`,"form.priorityUrgent":`عاجلة`,"form.category":`الفئة`,"form.categoryNone":`اختر فئة`,"form.submit":`إرسال التذكرة`,"form.submitting":`جارِ الإرسال...`,"form.cancel":`إلغاء`,"form.attachment":`إرفاق ملفات`,"success.title":`تم إرسال التذكرة!`,"success.ticketNumber":`تذكرة #`,"success.trackingToken":`رمز التتبع الخاص بك:`,"success.trackingHint":`احفظ هذا الرمز لتتبع حالة تذكرتك.`,"success.copyToken":`نسخ الرمز`,"success.copied":`تم النسخ!`,"success.close":`إغلاق`,"success.trackNow":`تتبع التذكرة`,"tracker.title":`تتبع تذكرتك`,"tracker.tokenPlaceholder":`أدخل رمز التتبع الخاص بك (trk_...)`,"tracker.submit":`تتبع`,"tracker.tracking":`جارِ التتبع...`,"tracker.status":`الحالة`,"tracker.priority":`الأولوية`,"tracker.created":`تاريخ الإنشاء`,"tracker.replies":`الردود`,"tracker.noReplies":`لا توجد ردود بعد.`,"tracker.replyPlaceholder":`اكتب رداً...`,"tracker.sendReply":`إرسال الرد`,"tracker.sending":`جارِ الإرسال...`,"tracker.back":`رجوع`,"tracker.staff":`فريق الدعم`,"error.generic":`حدث خطأ ما. يرجى المحاولة مرة أخرى.`,"error.network":`خطأ في الشبكة. تحقق من اتصالك.`,"error.tokenInvalid":`رمز التتبع غير صالح أو منتهي الصلاحية.`,"error.required":`هذا الحقل مطلوب.`,"error.emailInvalid":`يرجى إدخال بريد إلكتروني صالح.`,"error.titleMin":`يجب أن يكون العنوان 5 أحرف على الأقل.`,"portal.title":`بوابة الدعم`,"portal.myTickets":`تذاكري`,"portal.noTickets":`لا توجد تذاكر بعد.`,"portal.newTicket":`تذكرة جديدة`,"widget.close":`إغلاق`,"menu.newTicket":`إرسال تذكرة`,"menu.newTicketDesc":`إنشاء طلب ��عم جديد`,"menu.myTickets":`تذاكري`,"menu.myTicketsDesc":`عرض وإدارة تذاكرك`,"menu.trackTicket":`تتبع تذكرة`,"menu.trackTicketDesc":`تحقق من الحالة باستخدام رمز التتبع`,"menu.knowledgeBase":`قاعدة المعرفة`,"menu.knowledgeBaseDesc":`تصفح مقالات المساعدة والأدلة`,"menu.myTicketsPlaceholder":`سجّل الدخول ��عرض تذاكرك.`,"menu.trackPlaceholder":`تتبع التذاكر قريبًا.`,"menu.kbPlaceholder":`قاعدة المعرفة قريبًا.`,"menu.preferences":`التفضيلات`,"menu.preferencesDesc":`إعدادات اللغة والمظهر`,"prefs.title":`التفضيلات`,"prefs.language":`اللغة`,"prefs.theme":`المظهر`,"prefs.light":`فاتح`,"prefs.dark":`داكن`,"prefs.auto":`النظام`,"branding.poweredBy":`مدعوم من`,"attach.dropzone":`اسحب الملفات هنا أو انقر للتصفح`,"attach.dropzoneActive":`أفلت الملفات هنا`,"attach.maxFiles":`بحد أقصى {max} ملفات`,"attach.remove":`إزالة`,"attach.uploading":`جارِ رفع الملفات...`,"attach.uploadProgress":`جارِ رفع {name}... {percent}%`,"attach.invalidType":`نوع الملف غير مسموح`,"attach.tooLarge":`حجم الملف يتجاوز الحد الأقصى`,"attach.tooMany":`تم الوصول للحد الأقصى لعدد الملفات`,"attach.download":`تحميل`,"mytickets.title":`تذاكري`,"mytickets.emailPrompt":`أدخل بريدك الإلكتروني لعرض تذاكرك`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`تذكرني`,"mytickets.lookup":`البحث عن تذاكري`,"mytickets.lookingUp":`جارِ البحث...`,"mytickets.noTickets":`لا توجد تذاكر بعد.`,"mytickets.submitFirst":`أرسل تذكرتك الأولى`,"mytickets.noAccount":`لم يتم العثور على تذاكر لهذا البريد.`,"detail.description":`الوصف`,"detail.attachments":`المرفقات`,"detail.noAttachments":`لا توجد مرفقات`,"detail.replies":`المحادثة`,"detail.noReplies":`لا توجد ردود بعد.`,"detail.replyPlaceholder":`اكتب رداً...`,"detail.sendReply":`إرسال`,"detail.sending":`جارِ الإرسال...`,"detail.staff":`فريق الدعم`,"detail.you":`أنت`,"detail.loading":`جارِ تحميل التذكرة...`,"track.title":`تتبع تذكرة`,"track.tokenPlaceholder":`أدخل رمز التتبع (trk_...)`,"track.submit":`تتبع`,"track.tracking":`جارِ التتبع...`,"track.recentTickets":`التذاكر الأخيرة`,"track.invalidToken":`رمز التتبع غير صالح أو منتهي.`,"prefs.clearEmail":`مسح البريد المحفوظ`,"prefs.emailCleared":`تم مسح البريد`,"auth.login":`تسجيل الدخول`,"auth.logout":`تسجيل الخروج`,"auth.sessionExpired":`انتهت الجلسة. يرجى تسجيل الدخول مرة أخرى.`,"prefs.accentColor":`لون التمييز`},f={primaryColor:`#42b983`,mode:`light`,borderRadius:`8px`,fontFamily:`inherit`,zIndex:9999};function p(e){return e===`auto`?typeof window<`u`&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e??`light`}function m(e={}){let t={...f,...e,mode:p(e.mode??f.mode)},n=h(t.primaryColor),r=Math.min(n.l+30,95),i=Math.max(n.l-15,10);return[`--rqd-primary: ${t.primaryColor}`,`--rqd-primary-h: ${n.h}`,`--rqd-primary-s: ${n.s}%`,`--rqd-primary-l: ${n.l}%`,`--rqd-primary-light: hsl(${n.h}, ${n.s}%, ${r}%)`,`--rqd-primary-dark: hsl(${n.h}, ${n.s}%, ${i}%)`,`--rqd-radius: ${t.borderRadius}`,`--rqd-font: ${t.fontFamily}`,`--rqd-z: ${t.zIndex}`,`--rqd-bg: ${t.mode===`dark`?`#1a1a2e`:`#ffffff`}`,`--rqd-bg-secondary: ${t.mode===`dark`?`#16213e`:`#f8f9fa`}`,`--rqd-text: ${t.mode===`dark`?`#e0e0e0`:`#1a1a2e`}`,`--rqd-text-secondary: ${t.mode===`dark`?`#a0a0b0`:`#6c757d`}`,`--rqd-border: ${t.mode===`dark`?`#2a2a4a`:`#e0e0e0`}`,`--rqd-input-bg: ${t.mode===`dark`?`#0f3460`:`#ffffff`}`,`--rqd-shadow: ${t.mode===`dark`?`0 8px 32px rgba(0,0,0,0.4)`:`0 8px 32px rgba(0,0,0,0.12)`}`].join(`; `)}function h(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return{h:160,s:51,l:49};let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;c=l>.5?e/(2-a-o):e/(a+o),s=a===n?((r-i)/e+(r<i?6:0))/6:a===r?((i-n)/e+2)/6:((n-r)/e+4)/6}return{h:Math.round(s*360),s:Math.round(c*100),l:Math.round(l*100)}}function ee(){return te}let te=`:host { all: initial; }
|
|
1
|
+
var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let n=``,r=``;function i(e,t){r=e.replace(/\/$/,``),n=t}let a=t.ofetch.create({timeout:15e3,retry:2,retryStatusCodes:[408,429,500,502,503,504],async onRequest({options:e}){e.baseURL=`${r}/api/v1`;let t=new Headers(e.headers);t.set(`X-API-Key`,n),e.headers=t},onResponseError({response:e}){let t=e._data;throw{code:t?.responseCode??`HTTP_${e.status}`,message:t?.responseMessage??e.statusText}}});function o(){return crypto.randomUUID()}async function s(e,t){let n=await a(`/projects/${e}/tickets`,{method:`POST`,body:{title:t.title,description:t.description,priority:t.priority,categoryId:t.categoryId,email:t.email,clientMetadata:t.clientMetadata},headers:{"Idempotency-Key":o()}});return{id:n.data.id,ticketNumber:n.data.attributes.ticketNumber,trackingToken:n.meta?.trackingToken,status:n.data.attributes.status}}async function c(e){let t=await a(`/tickets/track?token=${encodeURIComponent(e)}`),n=t.included??[];return{id:t.data.id,ticketNumber:t.data.attributes.ticketNumber,title:t.data.attributes.title,status:t.data.attributes.status,priority:t.data.attributes.priority,createdAt:t.data.attributes.createdAt,replies:n.filter(e=>e.type===`public-reply`).map(e=>({id:e.id,body:e.attributes.body,authorName:e.attributes.authorName,isStaff:e.attributes.isStaff,createdAt:e.attributes.createdAt}))}}async function l(e,t){await a(`/tickets/track/reply`,{method:`POST`,body:{trackingToken:e,body:t}})}let u={"widget.title":`Support`,"widget.newTicket":`New Ticket`,"widget.trackTicket":`Track Ticket`,"form.title":`Title`,"form.titlePlaceholder":`Brief summary of your issue`,"form.description":`Description`,"form.descriptionPlaceholder":`Describe your issue in detail...`,"form.email":`Email`,"form.emailPlaceholder":`your@email.com`,"form.priority":`Priority`,"form.priorityLow":`Low`,"form.priorityMedium":`Medium`,"form.priorityHigh":`High`,"form.priorityUrgent":`Urgent`,"form.category":`Category`,"form.categoryNone":`Select a category`,"form.submit":`Submit Ticket`,"form.submitting":`Submitting...`,"form.cancel":`Cancel`,"form.attachment":`Attach files`,"success.title":`Ticket Submitted!`,"success.ticketNumber":`Ticket #`,"success.trackingToken":`Your tracking token:`,"success.trackingHint":`Save this token to track your ticket status.`,"success.copyToken":`Copy Token`,"success.copied":`Copied!`,"success.close":`Close`,"success.trackNow":`Track Ticket`,"tracker.title":`Track Your Ticket`,"tracker.tokenPlaceholder":`Enter your tracking token (trk_...)`,"tracker.submit":`Track`,"tracker.tracking":`Tracking...`,"tracker.status":`Status`,"tracker.priority":`Priority`,"tracker.created":`Created`,"tracker.replies":`Replies`,"tracker.noReplies":`No replies yet.`,"tracker.replyPlaceholder":`Write a reply...`,"tracker.sendReply":`Send Reply`,"tracker.sending":`Sending...`,"tracker.back":`Back`,"tracker.staff":`Staff`,"error.generic":`Something went wrong. Please try again.`,"error.network":`Network error. Check your connection.`,"error.tokenInvalid":`Invalid or expired tracking token.`,"error.required":`This field is required.`,"error.emailInvalid":`Please enter a valid email address.`,"error.titleMin":`Title must be at least 5 characters.`,"portal.title":`Support Portal`,"portal.myTickets":`My Tickets`,"portal.noTickets":`No tickets yet.`,"portal.newTicket":`New Ticket`,"widget.close":`Close`,"menu.newTicket":`Submit a Ticket`,"menu.newTicketDesc":`Create a new support request`,"menu.myTickets":`My Tickets`,"menu.myTicketsDesc":`View and manage your tickets`,"menu.trackTicket":`Track a Ticket`,"menu.trackTicketDesc":`Check status with your tracking token`,"menu.knowledgeBase":`Knowledge Base`,"menu.knowledgeBaseDesc":`Browse help articles and guides`,"menu.myTicketsPlaceholder":`Sign in to view your tickets.`,"menu.trackPlaceholder":`Ticket tracking is coming soon.`,"menu.kbPlaceholder":`Knowledge base is coming soon.`,"menu.preferences":`Preferences`,"menu.preferencesDesc":`Language and appearance settings`,"prefs.title":`Preferences`,"prefs.language":`Language`,"prefs.theme":`Theme`,"prefs.light":`Light`,"prefs.dark":`Dark`,"prefs.auto":`System`,"branding.poweredBy":`Powered by`,"attach.dropzone":`Drop files here or click to browse`,"attach.dropzoneActive":`Drop files here`,"attach.maxFiles":`Maximum {max} files`,"attach.remove":`Remove`,"attach.uploading":`Uploading files...`,"attach.uploadProgress":`Uploading {name}... {percent}%`,"attach.invalidType":`File type not allowed`,"attach.tooLarge":`File exceeds maximum size`,"attach.tooMany":`Maximum number of files reached`,"attach.download":`Download`,"mytickets.title":`My Tickets`,"mytickets.emailPrompt":`Enter your email to view your tickets`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`Remember me`,"mytickets.lookup":`Find My Tickets`,"mytickets.lookingUp":`Looking up...`,"mytickets.noTickets":`No tickets yet.`,"mytickets.submitFirst":`Submit your first ticket`,"mytickets.noAccount":`No tickets found for this email.`,"detail.description":`Description`,"detail.attachments":`Attachments`,"detail.noAttachments":`No attachments`,"detail.replies":`Conversation`,"detail.noReplies":`No replies yet.`,"detail.replyPlaceholder":`Write a reply...`,"detail.sendReply":`Send`,"detail.sending":`Sending...`,"detail.staff":`Staff`,"detail.you":`You`,"detail.loading":`Loading ticket...`,"track.title":`Track a Ticket`,"track.tokenPlaceholder":`Enter tracking token (trk_...)`,"track.submit":`Track`,"track.tracking":`Tracking...`,"track.recentTickets":`Recent Tickets`,"track.invalidToken":`Invalid or expired tracking token.`,"prefs.clearEmail":`Clear saved email`,"prefs.emailCleared":`Email cleared`,"auth.login":`Login`,"auth.logout":`Logout`,"auth.sessionExpired":`Session expired. Please log in again.`,"prefs.accentColor":`Accent Color`,"form.categoryPlaceholder":`Select a category`,"form.categoryBack":`Back`,"form.categorySelected":`Category`,"diag.title":`Share diagnostic info`,"diag.hint":`Help us resolve your issue faster`,"diag.screenResolution":`Screen resolution`,"diag.deviceType":`Device type`,"diag.timezone":`Timezone`,"diag.referrerUrl":`Referrer URL`,"diag.language":`Browser language`,"diag.platform":`Platform`,"detail.resolve":`Mark as Resolved`,"detail.resolving":`Resolving...`,"detail.resolved":`Resolved`,"detail.sla":`SLA`},d={"widget.title":`الدعم`,"widget.newTicket":`تذكرة جديدة`,"widget.trackTicket":`تتبع التذكرة`,"form.title":`العنوان`,"form.titlePlaceholder":`ملخص موجز لمشكلتك`,"form.description":`الوصف`,"form.descriptionPlaceholder":`صف مشكلتك بالتفصيل...`,"form.email":`البريد الإلكتروني`,"form.emailPlaceholder":`your@email.com`,"form.priority":`الأولوية`,"form.priorityLow":`منخفضة`,"form.priorityMedium":`متوسطة`,"form.priorityHigh":`عالية`,"form.priorityUrgent":`عاجلة`,"form.category":`الفئة`,"form.categoryNone":`اختر فئة`,"form.submit":`إرسال التذكرة`,"form.submitting":`جارِ الإرسال...`,"form.cancel":`إلغاء`,"form.attachment":`إرفاق ملفات`,"success.title":`تم إرسال التذكرة!`,"success.ticketNumber":`تذكرة #`,"success.trackingToken":`رمز التتبع الخاص بك:`,"success.trackingHint":`احفظ هذا الرمز لتتبع حالة تذكرتك.`,"success.copyToken":`نسخ الرمز`,"success.copied":`تم النسخ!`,"success.close":`إغلاق`,"success.trackNow":`تتبع التذكرة`,"tracker.title":`تتبع تذكرتك`,"tracker.tokenPlaceholder":`أدخل رمز التتبع الخاص بك (trk_...)`,"tracker.submit":`تتبع`,"tracker.tracking":`جارِ التتبع...`,"tracker.status":`الحالة`,"tracker.priority":`الأولوية`,"tracker.created":`تاريخ الإنشاء`,"tracker.replies":`الردود`,"tracker.noReplies":`لا توجد ردود بعد.`,"tracker.replyPlaceholder":`اكتب رداً...`,"tracker.sendReply":`إرسال الرد`,"tracker.sending":`جارِ الإرسال...`,"tracker.back":`رجوع`,"tracker.staff":`فريق الدعم`,"error.generic":`حدث خطأ ما. يرجى المحاولة مرة أخرى.`,"error.network":`خطأ في الشبكة. تحقق من اتصالك.`,"error.tokenInvalid":`رمز التتبع غير صالح أو منتهي الصلاحية.`,"error.required":`هذا الحقل مطلوب.`,"error.emailInvalid":`يرجى إدخال بريد إلكتروني صالح.`,"error.titleMin":`يجب أن يكون العنوان 5 أحرف على الأقل.`,"portal.title":`بوابة الدعم`,"portal.myTickets":`تذاكري`,"portal.noTickets":`لا توجد تذاكر بعد.`,"portal.newTicket":`تذكرة جديدة`,"widget.close":`إغلاق`,"menu.newTicket":`إرسال تذكرة`,"menu.newTicketDesc":`إنشاء طلب ��عم جديد`,"menu.myTickets":`تذاكري`,"menu.myTicketsDesc":`عرض وإدارة تذاكرك`,"menu.trackTicket":`تتبع تذكرة`,"menu.trackTicketDesc":`تحقق من الحالة باستخدام رمز التتبع`,"menu.knowledgeBase":`قاعدة المعرفة`,"menu.knowledgeBaseDesc":`تصفح مقالات المساعدة والأدلة`,"menu.myTicketsPlaceholder":`سجّل الدخول ��عرض تذاكرك.`,"menu.trackPlaceholder":`تتبع التذاكر قريبًا.`,"menu.kbPlaceholder":`قاعدة المعرفة قريبًا.`,"menu.preferences":`التفضيلات`,"menu.preferencesDesc":`إعدادات اللغة والمظهر`,"prefs.title":`التفضيلات`,"prefs.language":`اللغة`,"prefs.theme":`المظهر`,"prefs.light":`فاتح`,"prefs.dark":`داكن`,"prefs.auto":`النظام`,"branding.poweredBy":`مدعوم من`,"attach.dropzone":`اسحب الملفات هنا أو انقر للتصفح`,"attach.dropzoneActive":`أفلت الملفات هنا`,"attach.maxFiles":`بحد أقصى {max} ملفات`,"attach.remove":`إزالة`,"attach.uploading":`جارِ رفع الملفات...`,"attach.uploadProgress":`جارِ رفع {name}... {percent}%`,"attach.invalidType":`نوع الملف غير مسموح`,"attach.tooLarge":`حجم الملف يتجاوز الحد الأقصى`,"attach.tooMany":`تم الوصول للحد الأقصى لعدد الملفات`,"attach.download":`تحميل`,"mytickets.title":`تذاكري`,"mytickets.emailPrompt":`أدخل بريدك الإلكتروني لعرض تذاكرك`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`تذكرني`,"mytickets.lookup":`البحث عن تذاكري`,"mytickets.lookingUp":`جارِ البحث...`,"mytickets.noTickets":`لا توجد تذاكر بعد.`,"mytickets.submitFirst":`أرسل تذكرتك الأولى`,"mytickets.noAccount":`لم يتم العثور على تذاكر لهذا البريد.`,"detail.description":`الوصف`,"detail.attachments":`المرفقات`,"detail.noAttachments":`لا توجد مرفقات`,"detail.replies":`المحادثة`,"detail.noReplies":`لا توجد ردود بعد.`,"detail.replyPlaceholder":`اكتب رداً...`,"detail.sendReply":`إرسال`,"detail.sending":`جارِ الإرسال...`,"detail.staff":`فريق الدعم`,"detail.you":`أنت`,"detail.loading":`جارِ تحميل التذكرة...`,"track.title":`تتبع تذكرة`,"track.tokenPlaceholder":`أدخل رمز التتبع (trk_...)`,"track.submit":`تتبع`,"track.tracking":`جارِ التتبع...`,"track.recentTickets":`التذاكر الأخيرة`,"track.invalidToken":`رمز التتبع غير صالح أو منتهي.`,"prefs.clearEmail":`مسح البريد المحفوظ`,"prefs.emailCleared":`تم مسح البريد`,"auth.login":`تسجيل الدخول`,"auth.logout":`تسجيل الخروج`,"auth.sessionExpired":`انتهت الجلسة. يرجى تسجيل الدخول مرة أخرى.`,"prefs.accentColor":`لون التمييز`,"form.categoryPlaceholder":`اختر فئة`,"form.categoryBack":`رجوع`,"form.categorySelected":`الفئة`,"diag.title":`مشاركة معلومات التشخيص`,"diag.hint":`ساعدنا في حل مشكلتك بشكل أسرع`,"diag.screenResolution":`دقة الشاشة`,"diag.deviceType":`نوع الجهاز`,"diag.timezone":`المنطقة الزمنية`,"diag.referrerUrl":`رابط المصدر`,"diag.language":`لغة المتصفح`,"diag.platform":`المنصة`,"detail.resolve":`تحديد كمحلول`,"detail.resolving":`جارِ الحل...`,"detail.resolved":`محلول`,"detail.sla":`اتفاقية الخدمة`},f={primaryColor:`#42b983`,mode:`light`,borderRadius:`8px`,fontFamily:`inherit`,zIndex:9999};function p(e){return e===`auto`?typeof window<`u`&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e??`light`}function m(e={}){let t={...f,...e,mode:p(e.mode??f.mode)},n=h(t.primaryColor),r=Math.min(n.l+30,95),i=Math.max(n.l-15,10);return[`--rqd-primary: ${t.primaryColor}`,`--rqd-primary-h: ${n.h}`,`--rqd-primary-s: ${n.s}%`,`--rqd-primary-l: ${n.l}%`,`--rqd-primary-light: hsl(${n.h}, ${n.s}%, ${r}%)`,`--rqd-primary-dark: hsl(${n.h}, ${n.s}%, ${i}%)`,`--rqd-radius: ${t.borderRadius}`,`--rqd-font: ${t.fontFamily}`,`--rqd-z: ${t.zIndex}`,`--rqd-bg: ${t.mode===`dark`?`#1a1a2e`:`#ffffff`}`,`--rqd-bg-secondary: ${t.mode===`dark`?`#16213e`:`#f8f9fa`}`,`--rqd-text: ${t.mode===`dark`?`#e0e0e0`:`#1a1a2e`}`,`--rqd-text-secondary: ${t.mode===`dark`?`#a0a0b0`:`#6c757d`}`,`--rqd-border: ${t.mode===`dark`?`#2a2a4a`:`#e0e0e0`}`,`--rqd-input-bg: ${t.mode===`dark`?`#0f3460`:`#ffffff`}`,`--rqd-shadow: ${t.mode===`dark`?`0 8px 32px rgba(0,0,0,0.4)`:`0 8px 32px rgba(0,0,0,0.12)`}`].join(`; `)}function h(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return{h:160,s:51,l:49};let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;c=l>.5?e/(2-a-o):e/(a+o),s=a===n?((r-i)/e+(r<i?6:0))/6:a===r?((i-n)/e+2)/6:((n-r)/e+4)/6}return{h:Math.round(s*360),s:Math.round(c*100),l:Math.round(l*100)}}function ee(){return te}let te=`:host { all: initial; }
|
|
2
2
|
.rqd-root { font-family: var(--rqd-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif); font-size: 14px; line-height: 1.5; color: var(--rqd-text); -webkit-font-smoothing: antialiased; }
|
|
3
3
|
.rqd-fab { position: fixed; bottom: 20px; width: 56px; height: 56px; border-radius: 50%; background: var(--rqd-primary); color: #fff; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 16px rgba(0,0,0,0.2); transition: transform 0.2s, box-shadow 0.2s; pointer-events: auto; z-index: var(--rqd-z, 9999); }
|
|
4
4
|
.rqd-fab:hover { transform: scale(1.08); box-shadow: 0 6px 20px rgba(0,0,0,0.25); }
|
|
@@ -105,6 +105,22 @@ var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{val
|
|
|
105
105
|
.rqd-ticket-list { display: flex; flex-direction: column; gap: 6px; }
|
|
106
106
|
.rqd-loading { text-align: center; padding: 24px 0; color: var(--rqd-text-secondary); font-size: 14px; }
|
|
107
107
|
.rqd-reply-compose { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; }
|
|
108
|
+
.rqd-category-list { display: flex; flex-direction: column; gap: 4px; margin-bottom: 14px; }
|
|
109
|
+
.rqd-category-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--rqd-bg-secondary); border: 1px solid transparent; border-radius: calc(var(--rqd-radius, 8px) / 2); cursor: pointer; font-size: 14px; font-family: inherit; color: var(--rqd-text); transition: border-color 0.15s, background 0.15s; text-align: start; width: 100%; }
|
|
110
|
+
.rqd-category-item:hover { border-color: var(--rqd-primary); }
|
|
111
|
+
.rqd-category-item-chevron { color: var(--rqd-text-secondary); font-size: 16px; }
|
|
112
|
+
.rqd-category-breadcrumb { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin-bottom: 8px; font-size: 12px; color: var(--rqd-text-secondary); }
|
|
113
|
+
.rqd-category-breadcrumb button { background: none; border: none; color: var(--rqd-primary); cursor: pointer; font-size: 12px; font-family: inherit; padding: 0; }
|
|
114
|
+
.rqd-category-breadcrumb button:hover { text-decoration: underline; }
|
|
115
|
+
.rqd-category-breadcrumb-sep { color: var(--rqd-text-secondary); }
|
|
116
|
+
.rqd-category-selected { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--rqd-primary-light); border-radius: calc(var(--rqd-radius, 8px) / 2); font-size: 13px; color: var(--rqd-primary-dark); margin-bottom: 14px; }
|
|
117
|
+
.rqd-category-selected button { background: none; border: none; color: var(--rqd-primary-dark); cursor: pointer; font-size: 14px; margin-left: auto; padding: 0; }
|
|
118
|
+
.rqd-diag-toggle { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--rqd-bg-secondary); border-radius: calc(var(--rqd-radius, 8px) / 2); cursor: pointer; font-size: 13px; color: var(--rqd-text-secondary); border: none; width: 100%; font-family: inherit; text-align: start; margin-bottom: 8px; }
|
|
119
|
+
.rqd-diag-toggle:hover { color: var(--rqd-text); }
|
|
120
|
+
.rqd-diag-panel { display: flex; flex-direction: column; gap: 6px; padding: 8px 0; }
|
|
121
|
+
.rqd-diag-item { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--rqd-text-secondary); }
|
|
122
|
+
.rqd-diag-item input[type="checkbox"] { accent-color: var(--rqd-primary); width: 14px; height: 14px; }
|
|
123
|
+
.rqd-diag-item-value { color: var(--rqd-text); font-family: monospace; font-size: 11px; margin-left: auto; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
108
124
|
.rqd-auth-btn { background: rgba(255,255,255,0.2); border: 1px solid rgba(255,255,255,0.4); color: #fff; cursor: pointer; padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 500; font-family: inherit; transition: background 0.15s; white-space: nowrap; }
|
|
109
125
|
.rqd-auth-btn:hover { background: rgba(255,255,255,0.3); }
|
|
110
126
|
.rqd-color-presets { display: flex; gap: 8px; flex-wrap: wrap; }
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
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-
|
|
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
|
|
3
|
+
import * as react_jsx_runtime1 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/react/types.d.ts
|
|
6
6
|
interface ReqdeskProviderProps {
|
|
@@ -44,7 +44,7 @@ declare function ReqdeskProvider({
|
|
|
44
44
|
customer,
|
|
45
45
|
translations,
|
|
46
46
|
children
|
|
47
|
-
}: ReqdeskProviderProps):
|
|
47
|
+
}: ReqdeskProviderProps): react_jsx_runtime1.JSX.Element;
|
|
48
48
|
//# sourceMappingURL=ReqdeskProvider.d.ts.map
|
|
49
49
|
//#endregion
|
|
50
50
|
//#region src/react/TicketForm.d.ts
|
|
@@ -54,13 +54,13 @@ declare function TicketForm({
|
|
|
54
54
|
onError,
|
|
55
55
|
className,
|
|
56
56
|
style
|
|
57
|
-
}: TicketFormProps):
|
|
57
|
+
}: TicketFormProps): react_jsx_runtime1.JSX.Element;
|
|
58
58
|
//# sourceMappingURL=TicketForm.d.ts.map
|
|
59
59
|
//#endregion
|
|
60
60
|
//#region src/react/SupportPortal.d.ts
|
|
61
61
|
declare function SupportPortal({
|
|
62
62
|
className
|
|
63
|
-
}: SupportPortalProps):
|
|
63
|
+
}: SupportPortalProps): react_jsx_runtime1.JSX.Element;
|
|
64
64
|
//# sourceMappingURL=SupportPortal.d.ts.map
|
|
65
65
|
//#endregion
|
|
66
66
|
//#region src/react/FloatingWidget.d.ts
|
|
@@ -75,7 +75,7 @@ declare function FloatingWidget({
|
|
|
75
75
|
contained,
|
|
76
76
|
onTicketCreated,
|
|
77
77
|
onError
|
|
78
|
-
}: FloatingWidgetProps):
|
|
78
|
+
}: FloatingWidgetProps): react_jsx_runtime1.JSX.Element;
|
|
79
79
|
//#endregion
|
|
80
80
|
//#region src/react/useReqdesk.d.ts
|
|
81
81
|
declare function useReqdesk(): UseReqdeskReturn;
|
|
@@ -87,7 +87,7 @@ interface ShadowRootProps {
|
|
|
87
87
|
}
|
|
88
88
|
declare function ShadowRoot({
|
|
89
89
|
children
|
|
90
|
-
}: ShadowRootProps):
|
|
90
|
+
}: ShadowRootProps): react_jsx_runtime1.JSX.Element;
|
|
91
91
|
//#endregion
|
|
92
92
|
//#region src/storage.d.ts
|
|
93
93
|
interface WidgetConfigPersist {
|
|
@@ -104,4 +104,4 @@ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
|
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { type CustomerConfig, FloatingWidget, type PublicReply, ReqdeskProvider, type ReqdeskProviderProps, ShadowRoot, type SubmitTicketData, SupportPortal, type SupportPortalProps, type ThemeConfig, TicketForm, type TicketFormProps, type TicketResult, type TrackedTicketResult, type UseReqdeskReturn, type WidgetConfigPersist, type WidgetError, loadWidgetConfig as getWidgetDefaults, useReqdesk };
|
|
107
|
-
//# sourceMappingURL=react-
|
|
107
|
+
//# sourceMappingURL=react-BLAoKiUb.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-
|
|
1
|
+
{"version":3,"file":"react-BLAoKiUb.d.ts","names":[],"sources":["../src/react/types.ts","../src/react/ReqdeskProvider.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/FloatingWidget.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/storage.ts"],"mappings":";;;;;UAIiB,oBAAA;;SAER;EAFQ,KAAA,CAAA,EAGP,WAHO;EAAoB,QAAA,CAAA,EAAA,MAAA;UAE5B,CAAA,EAGI,cAHJ;cACC,CAAA,EAGO,MAHP,CAAA,MAAA,EAAA,MAAA,CAAA;UAEG,EAED,KAAA,CAAM,SAFL;;AAED,UAGK,eAAA,CAHC;EAAS,IAAA,CAAA,EAAA,UAAA,GAAA,QAAA;EAGV,QAAA,CAAA,EAAA,cAAe,GAAA,aAAA;EAAA,eAAA,CAAA,EAAA,MAAA;iBAIH,CAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,GAAA,IAAA;SACT,CAAA,EAAA,CAAA,KAAA,EAAA,WAAA,EAAA,GAAA,IAAA;WAEJ,CAAA,EAAA,MAAA;EAAa,KAAA,CAAA,EAAnB,KAAA,CAAM,aAAa;AAG7B;AAOiB,UAPA,kBAAA,CAOgB;EAAA,eAAA,CAAA,EAAA,MAAA;kBACZ,CAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAAA,IAAA;WAA2B,CAAA,EAAA,MAAA;OAAR,CAAA,EAJ9B,KAAA,CAAM,aAIwB;;AACV,UAFb,gBAAA,CAEa;cACsB,CAAA,IAAA,EAF/B,gBAE+B,CAAA,EAFZ,OAEY,CAFJ,YAEI,CAAA;aAE3C,CAAA,KAAA,EAAA,MAAA,CAAA,EAHqB,OAGrB,CAH6B,mBAG7B,CAAA;EAAW,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAFgC,OAEhC,CAAA,IAAA,CAAA;;SAAX;;;;iBCAO,eAAA;;;;;;;;GAAqF,uBAAoB,kBAAA,CAAA,GAAA,CAAA;;;;iBCxBzG,UAAA;;;;;;GAA4E,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;;iBCN3F,aAAA;;GAA6B,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;;UCYrD,mBAAA;;;6BAGmB;EJjBZ,OAAA,CAAA,EAAA,CAAA,KAAA,EIkBG,WJlBiB,EAAA,GAAA,IAAA;;AAE5B,iBIuCO,cAAA,CJvCP;EAAA,QAAA;EAAA,SAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EI4CN,mBJ5CM,CAAA,EI4Ca,kBAAA,CAAA,GAAA,CAAA,OJ5Cb;;;iBKDO,UAAA,CAAA,GAAc;;;;UCDpB,eAAA;YACE;;iBAGI,UAAA;;GAAyB,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;UCRvC,mBAAA;;;;;IPIA,IAAA,CAAA,EAAA,OAAA,GAAA,MAAoB,GAAA,MAAA;EAAA,CAAA;QAE5B,CAAA,EAAA,aAAA,GAAA,gBAAA;;AAYoB,iBO6Eb,gBAAA,CP7Ea,MAAA,EAAA,MAAA,CAAA,EO6EqB,mBP7ErB,GAAA,IAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
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-
|
|
2
|
-
import * as
|
|
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_runtime1 from "react/jsx-runtime";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/react/types.d.ts
|
|
@@ -44,7 +44,7 @@ declare function ReqdeskProvider({
|
|
|
44
44
|
customer,
|
|
45
45
|
translations,
|
|
46
46
|
children
|
|
47
|
-
}: ReqdeskProviderProps):
|
|
47
|
+
}: ReqdeskProviderProps): react_jsx_runtime1.JSX.Element;
|
|
48
48
|
//# sourceMappingURL=ReqdeskProvider.d.ts.map
|
|
49
49
|
//#endregion
|
|
50
50
|
//#region src/react/TicketForm.d.ts
|
|
@@ -54,13 +54,13 @@ declare function TicketForm({
|
|
|
54
54
|
onError,
|
|
55
55
|
className,
|
|
56
56
|
style
|
|
57
|
-
}: TicketFormProps):
|
|
57
|
+
}: TicketFormProps): react_jsx_runtime1.JSX.Element;
|
|
58
58
|
//# sourceMappingURL=TicketForm.d.ts.map
|
|
59
59
|
//#endregion
|
|
60
60
|
//#region src/react/SupportPortal.d.ts
|
|
61
61
|
declare function SupportPortal({
|
|
62
62
|
className
|
|
63
|
-
}: SupportPortalProps):
|
|
63
|
+
}: SupportPortalProps): react_jsx_runtime1.JSX.Element;
|
|
64
64
|
//# sourceMappingURL=SupportPortal.d.ts.map
|
|
65
65
|
//#endregion
|
|
66
66
|
//#region src/react/FloatingWidget.d.ts
|
|
@@ -75,7 +75,7 @@ declare function FloatingWidget({
|
|
|
75
75
|
contained,
|
|
76
76
|
onTicketCreated,
|
|
77
77
|
onError
|
|
78
|
-
}: FloatingWidgetProps):
|
|
78
|
+
}: FloatingWidgetProps): react_jsx_runtime1.JSX.Element;
|
|
79
79
|
//#endregion
|
|
80
80
|
//#region src/react/useReqdesk.d.ts
|
|
81
81
|
declare function useReqdesk(): UseReqdeskReturn;
|
|
@@ -87,7 +87,7 @@ interface ShadowRootProps {
|
|
|
87
87
|
}
|
|
88
88
|
declare function ShadowRoot({
|
|
89
89
|
children
|
|
90
|
-
}: ShadowRootProps):
|
|
90
|
+
}: ShadowRootProps): react_jsx_runtime1.JSX.Element;
|
|
91
91
|
//#endregion
|
|
92
92
|
//#region src/storage.d.ts
|
|
93
93
|
interface WidgetConfigPersist {
|
|
@@ -104,4 +104,4 @@ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
|
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { type CustomerConfig, FloatingWidget, type PublicReply, ReqdeskProvider, type ReqdeskProviderProps, ShadowRoot, type SubmitTicketData, SupportPortal, type SupportPortalProps, type ThemeConfig, TicketForm, type TicketFormProps, type TicketResult, type TrackedTicketResult, type UseReqdeskReturn, type WidgetConfigPersist, type WidgetError, loadWidgetConfig as getWidgetDefaults, useReqdesk };
|
|
107
|
-
//# sourceMappingURL=react-
|
|
107
|
+
//# sourceMappingURL=react-SJ0r-FEh.d.cts.map
|