@youidian/sdk 3.3.7 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.cjs +400 -36
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +41 -5
- package/dist/client.d.ts +41 -5
- package/dist/client.js +399 -36
- package/dist/client.js.map +1 -1
- package/dist/feedback.cjs +682 -0
- package/dist/feedback.cjs.map +1 -0
- package/dist/feedback.d.cts +38 -0
- package/dist/feedback.d.ts +38 -0
- package/dist/feedback.js +656 -0
- package/dist/feedback.js.map +1 -0
- package/dist/index.cjs +1164 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1161 -36
- package/dist/index.js.map +1 -1
- package/dist/{login-DerOcXcH.d.cts → login-Dqemys65.d.cts} +8 -4
- package/dist/{login-DerOcXcH.d.ts → login-Dqemys65.d.ts} +8 -4
- package/dist/login.cjs +320 -30
- package/dist/login.cjs.map +1 -1
- package/dist/login.d.cts +1 -1
- package/dist/login.d.ts +1 -1
- package/dist/login.js +320 -30
- package/dist/login.js.map +1 -1
- package/dist/server.cjs +108 -0
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +137 -1
- package/dist/server.d.ts +137 -1
- package/dist/server.js +108 -0
- package/dist/server.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feedback.ts"],"sourcesContent":["export type FeedbackIdentityKind =\n\t| \"ANONYMOUS\"\n\t| \"HOSTED_LOGIN\"\n\t| \"MERCHANT_USER\"\n\t| \"UNKNOWN\"\n\nexport type FeedbackActor = {\n\tidentityKind?: FeedbackIdentityKind | Lowercase<FeedbackIdentityKind>\n\tanonymousUserId?: string | null\n\tloginExternalUserId?: string | null\n\tmerchantUserId?: string | null\n\tcontactEmail?: string | null\n\tcontactPhone?: string | null\n\tdisplayName?: string | null\n}\n\nexport type FeedbackCategoryOption = {\n\tvalue: string\n\tlabel: string\n}\n\nexport type FeedbackWidgetOptions = {\n\tappId: string\n\tapiBaseUrl?: string\n\tactor?: FeedbackActor\n\tmetadata?: Record<string, unknown>\n\tcategories?: FeedbackCategoryOption[]\n\tlauncherText?: string\n\tpanelTitle?: string\n\tpanelSubtitle?: string\n\tplaceholder?: string\n\tcontactPlaceholder?: string\n\tonThreadCreated?: (threadId: string) => void\n\tonMessageSent?: (messageId: string) => void\n\tonError?: (error: Error) => void\n}\n\nexport type FeedbackWidgetController = {\n\topen: () => void\n\tclose: () => void\n\tdestroy: () => void\n}\n\ntype FeedbackMessage = {\n\tid: string\n\tsenderType: string\n\tcontent: string\n\ttranslatedContent?: string | null\n\tcreatedAt: string\n}\n\ntype ThreadState = {\n\tthreadId: string\n\tclientToken: string\n\tlastMessageId?: string\n\tstatus: string\n\tcategory?: string\n\tcontentPreview?: string\n\tcreatedAt?: string\n}\n\nconst DEFAULT_CATEGORIES: FeedbackCategoryOption[] = [\n\t{ value: \"BUG\", label: \"问题反馈\" },\n\t{ value: \"PAYMENT\", label: \"支付问题\" },\n\t{ value: \"LOGIN\", label: \"登录问题\" },\n\t{ value: \"SUGGESTION\", label: \"功能建议\" },\n\t{ value: \"OTHER\", label: \"其他\" },\n]\n\nconst STYLE_ID = \"youidian-feedback-widget-style\"\nconst MAX_IMAGES_PER_MESSAGE = 4\nconst DEFAULT_PANEL_TITLE = \"反馈\"\nconst DEFAULT_PANEL_SUBTITLE = \"提交问题、建议或使用反馈。\"\nconst DEFAULT_ATTACHMENTS_LABEL = \"支持粘贴、拖入或上传截图,最多 4 张\"\nconst FEEDBACK_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.6 8.6 0 0 1-7.7 4.7 8.5 8.5 0 0 1-3.8-.9L3 21l1.9-5.2a8.5 8.5 0 0 1-1-4.1 8.6 8.6 0 0 1 8.6-8.6 8.5 8.5 0 0 1 8.5 8.4Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.4 10.2h7.2M8.4 13.5h4.7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\"/></svg>`\nconst BUG_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 8.5a4 4 0 0 1 8 0v6a4 4 0 0 1-8 0v-6Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"/><path d=\"M5 9h3m8 0h3M5.5 15H8m8 0h2.5M7 5.5 5.5 4M17 5.5 18.5 4M12 4.5V2.8M12 20.5v-12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>`\nconst NOTE_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 3.5h7l3.5 3.5v13.5H7A2.5 2.5 0 0 1 4.5 18V6A2.5 2.5 0 0 1 7 3.5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"/><path d=\"M14 3.8V7h3.2M8 11h8M8 15h6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>`\nconst MAIL_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4.5 6.5h15v11h-15v-11Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/><path d=\"m5 7 7 6 7-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\nconst IMAGE_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 5h14v14H5V5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/><path d=\"m7.5 16 3.2-3.2 2.4 2.4 1.7-1.7L18 16.8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15.8 8.2h.01\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"/></svg>`\nconst CHEVRON_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m7 10 5 5 5-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n\nfunction ensureStyle() {\n\tif (typeof document === \"undefined\") return\n\tif (document.getElementById(STYLE_ID)) return\n\tconst style = document.createElement(\"style\")\n\tstyle.id = STYLE_ID\n\tstyle.textContent = `\n.yd-feedback-root,.yd-feedback-root *{box-sizing:border-box}\n.yd-feedback-root{--yd-feedback-bg:hsl(var(--background,0 0% 100%));--yd-feedback-fg:hsl(var(--foreground,240 10% 3.9%));--yd-feedback-card:hsl(var(--card,0 0% 100%));--yd-feedback-card-fg:hsl(var(--card-foreground,240 10% 3.9%));--yd-feedback-muted:hsl(var(--muted,240 4.8% 95.9%));--yd-feedback-muted-fg:hsl(var(--muted-foreground,240 3.8% 46.1%));--yd-feedback-border:hsl(var(--border,240 5.9% 90%));--yd-feedback-primary:hsl(var(--primary,142 76% 36%));--yd-feedback-primary-fg:hsl(var(--primary-foreground,0 0% 100%));--yd-feedback-ring:hsl(var(--ring,142 76% 36%));font:14px/1.5 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:var(--yd-feedback-fg)}\n.yd-feedback-root button,.yd-feedback-root input,.yd-feedback-root textarea{font:inherit}\n.yd-feedback-launcher{position:fixed;right:22px;bottom:22px;z-index:2147483000;width:54px;height:54px;display:grid;place-items:center;border:1px solid color-mix(in srgb,var(--yd-feedback-primary) 24%,var(--yd-feedback-border));border-radius:999px;background:var(--yd-feedback-primary);color:var(--yd-feedback-primary-fg);box-shadow:0 18px 45px color-mix(in srgb,var(--yd-feedback-primary) 22%,transparent);cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,background .18s ease}\n.yd-feedback-launcher:hover{transform:translateY(-2px);box-shadow:0 22px 56px color-mix(in srgb,var(--yd-feedback-primary) 30%,transparent)}\n.yd-feedback-launcher:focus-visible{outline:3px solid color-mix(in srgb,var(--yd-feedback-ring) 32%,transparent);outline-offset:3px}\n.yd-feedback-launcher svg{width:27px;height:27px}\n.yd-feedback-panel{position:fixed;inset:auto 22px 86px auto;z-index:2147483000;width:min(760px,calc(100vw - 44px));height:min(560px,calc(100vh - 108px));display:none;grid-template-rows:auto minmax(0,1fr);overflow:hidden;border:1px solid var(--yd-feedback-border);border-radius:18px;background:var(--yd-feedback-card);color:var(--yd-feedback-card-fg);box-shadow:0 24px 70px rgba(15,23,42,.18)}\n.yd-feedback-panel[data-open=\"true\"]{display:grid}\n.yd-feedback-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px 16px;border-bottom:1px solid var(--yd-feedback-border);background:var(--yd-feedback-card)}\n.yd-feedback-title{margin:0;font-size:22px;line-height:1.15;font-weight:760;letter-spacing:0;color:var(--yd-feedback-fg)}\n.yd-feedback-subtitle{margin:8px 0 0;color:var(--yd-feedback-muted-fg);font-size:13px;line-height:1.45}\n.yd-feedback-close{display:grid;place-items:center;width:34px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--yd-feedback-muted-fg);cursor:pointer;transition:background .16s ease,color .16s ease}\n.yd-feedback-close:hover{background:var(--yd-feedback-muted);color:var(--yd-feedback-fg)}\n.yd-feedback-close svg{width:24px;height:24px}\n.yd-feedback-shell{display:grid;min-height:0;grid-template-columns:230px minmax(0,1fr)}\n.yd-feedback-sidebar{min-width:0;border-right:1px solid var(--yd-feedback-border);background:var(--yd-feedback-muted)}\n.yd-feedback-sidebar-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 14px;border-bottom:1px solid var(--yd-feedback-border)}\n.yd-feedback-sidebar-title{display:flex;align-items:center;gap:9px;color:var(--yd-feedback-fg);font-size:15px;font-weight:720}\n.yd-feedback-sidebar-title svg{width:20px;height:20px;color:var(--yd-feedback-primary)}\n.yd-feedback-icon-button{display:grid;place-items:center;width:34px;height:34px;border:1px solid var(--yd-feedback-border);border-radius:999px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);cursor:pointer;transition:background .16s ease,border-color .16s ease}\n.yd-feedback-icon-button:hover{background:color-mix(in srgb,var(--yd-feedback-primary) 8%,var(--yd-feedback-card));border-color:color-mix(in srgb,var(--yd-feedback-primary) 38%,var(--yd-feedback-border))}\n.yd-feedback-icon-button svg{width:18px;height:18px}\n.yd-feedback-thread-list{padding:12px}\n.yd-feedback-thread-card{display:none;border:1px solid var(--yd-feedback-border);border-radius:14px;background:var(--yd-feedback-card);padding:12px}\n.yd-feedback-thread-card[data-visible=\"true\"]{display:block}\n.yd-feedback-thread-badges{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:10px}\n.yd-feedback-badge{display:inline-flex;align-items:center;border:1px solid var(--yd-feedback-border);border-radius:999px;background:var(--yd-feedback-muted);color:var(--yd-feedback-fg);padding:4px 9px;font-size:11px;font-weight:700;line-height:1}\n.yd-feedback-badge[data-status=\"true\"]{border-color:color-mix(in srgb,var(--yd-feedback-primary) 45%,var(--yd-feedback-border));background:color-mix(in srgb,var(--yd-feedback-primary) 12%,var(--yd-feedback-card));color:var(--yd-feedback-primary)}\n.yd-feedback-thread-preview{margin:0;color:var(--yd-feedback-fg);font-size:13px;line-height:1.45;word-break:break-word}\n.yd-feedback-thread-meta{display:flex;justify-content:space-between;gap:10px;margin-top:10px;color:var(--yd-feedback-muted-fg);font-size:11px}\n.yd-feedback-empty-thread{border:1px dashed var(--yd-feedback-border);border-radius:14px;padding:14px;color:var(--yd-feedback-muted-fg);font-size:12px}\n.yd-feedback-main{min-width:0;min-height:0;background:var(--yd-feedback-card);overflow:hidden}\n.yd-feedback-form{height:100%;display:grid;grid-template-rows:auto auto auto minmax(0,1fr) auto auto;gap:14px;padding:16px 18px 0}\n.yd-feedback-row{display:grid;gap:14px;grid-template-columns:180px minmax(0,1fr)}\n.yd-feedback-field{display:flex;min-width:0;flex-direction:column;gap:8px}\n.yd-feedback-label{display:flex;align-items:center;gap:8px;color:var(--yd-feedback-fg);font-size:13px;font-weight:720}\n.yd-feedback-label svg{width:17px;height:17px;color:var(--yd-feedback-fg)}\n.yd-feedback-input,.yd-feedback-textarea{width:100%;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);outline:none;transition:border-color .16s ease,box-shadow .16s ease,background .16s ease}\n.yd-feedback-input{height:40px;padding:0 13px;font-size:14px}\n.yd-feedback-textarea{min-height:118px;padding:13px 14px;font-size:14px;resize:none}\n.yd-feedback-input::placeholder,.yd-feedback-textarea::placeholder{color:var(--yd-feedback-muted-fg)}\n.yd-feedback-input:focus,.yd-feedback-textarea:focus{border-color:var(--yd-feedback-ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--yd-feedback-ring) 18%,transparent);background:var(--yd-feedback-card)}\n.yd-feedback-compose-box{overflow:hidden;border:1px solid var(--yd-feedback-border);border-radius:15px;background:var(--yd-feedback-card)}\n.yd-feedback-compose-box .yd-feedback-textarea{border:0;border-radius:0;box-shadow:none;background:transparent}\n.yd-feedback-attachment-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--yd-feedback-border);padding:9px 12px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-file-trigger{display:inline-flex;align-items:center;gap:8px;border:0;background:transparent;color:var(--yd-feedback-fg);cursor:pointer;padding:7px 8px;border-radius:10px}\n.yd-feedback-file-trigger:hover{background:var(--yd-feedback-muted)}\n.yd-feedback-file-trigger svg{width:18px;height:18px}\n.yd-feedback-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.yd-feedback-files{min-width:0;text-align:right;color:var(--yd-feedback-muted-fg);font-size:12px}\n.yd-feedback-select{position:relative;width:142px}\n.yd-feedback-select-button{width:100%;height:40px;display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);padding:0 12px;cursor:pointer}\n.yd-feedback-select-value{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700}\n.yd-feedback-select-value svg{width:18px;height:18px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-chevron{width:17px;height:17px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-menu{position:absolute;left:0;top:calc(100% + 7px);z-index:2;display:none;min-width:176px;max-height:220px;overflow:auto;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);box-shadow:0 18px 45px rgba(15,23,42,.16);padding:5px}\n.yd-feedback-select[data-open=\"true\"] .yd-feedback-select-menu{display:block}\n.yd-feedback-select-option{width:100%;min-height:38px;display:flex;align-items:center;gap:8px;border:0;border-radius:10px;background:transparent;color:var(--yd-feedback-fg);text-align:left;padding:9px 10px;cursor:pointer}\n.yd-feedback-select-option svg{width:18px;height:18px;flex:0 0 18px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-option span{line-height:1.2;white-space:nowrap}\n.yd-feedback-select-option:hover,.yd-feedback-select-option[data-selected=\"true\"]{background:color-mix(in srgb,var(--yd-feedback-primary) 10%,var(--yd-feedback-card));color:var(--yd-feedback-fg)}\n.yd-feedback-messages{display:flex;min-height:0;flex-direction:column;gap:8px;overflow:auto}\n.yd-feedback-message{border:1px solid var(--yd-feedback-border);border-radius:12px;padding:9px 10px;background:var(--yd-feedback-muted)}\n.yd-feedback-message[data-admin=\"true\"]{background:color-mix(in srgb,var(--yd-feedback-primary) 10%,var(--yd-feedback-card));border-color:color-mix(in srgb,var(--yd-feedback-primary) 24%,var(--yd-feedback-border))}\n.yd-feedback-message-meta{margin-bottom:4px;color:var(--yd-feedback-muted-fg);font-size:11px}\n.yd-feedback-message-content{color:var(--yd-feedback-fg);font-size:12px;line-height:1.45;word-break:break-word}\n.yd-feedback-actions{position:sticky;bottom:0;display:flex;align-items:center;justify-content:flex-end;gap:12px;margin:0 -18px;padding:12px 18px 16px;border-top:1px solid var(--yd-feedback-border);background:var(--yd-feedback-card)}\n.yd-feedback-submit{min-width:104px;height:44px;border:0;border-radius:13px;background:var(--yd-feedback-primary);color:var(--yd-feedback-primary-fg);padding:0 18px;font-size:14px;font-weight:800;cursor:pointer;box-shadow:0 12px 24px color-mix(in srgb,var(--yd-feedback-primary) 18%,transparent);transition:background .16s ease,transform .16s ease}\n.yd-feedback-submit:hover{transform:translateY(-1px)}\n.yd-feedback-submit:disabled{opacity:.55;cursor:not-allowed;transform:none}\n.yd-feedback-secondary{height:38px;border:0;border-radius:12px;background:transparent;color:var(--yd-feedback-fg);padding:0 12px;font-size:14px;font-weight:760;cursor:pointer}\n.yd-feedback-secondary:hover{background:var(--yd-feedback-muted)}\n.yd-feedback-error{min-height:18px;color:#fb7185;font-size:13px}\n@media (max-width:760px){\n\t.yd-feedback-panel{inset:auto 14px 78px 14px;width:auto;height:min(560px,calc(100vh - 96px));border-radius:16px}\n\t.yd-feedback-header{padding:16px 16px 14px}\n\t.yd-feedback-title{font-size:20px}\n\t.yd-feedback-shell{grid-template-columns:1fr}\n\t.yd-feedback-sidebar{display:none}\n\t.yd-feedback-form{padding:14px 14px 0;gap:12px}\n\t.yd-feedback-row{grid-template-columns:1fr}\n\t.yd-feedback-actions{justify-content:space-between}\n}\n`\n\tdocument.head.appendChild(style)\n}\n\nfunction getBaseUrl(options: FeedbackWidgetOptions) {\n\treturn (options.apiBaseUrl || \"https://pay.imgto.link\").replace(/\\/$/, \"\")\n}\n\nfunction safeJson(value: unknown) {\n\ttry {\n\t\treturn JSON.stringify(value)\n\t} catch {\n\t\treturn \"{}\"\n\t}\n}\n\nfunction escapeHtml(value: string) {\n\treturn value\n\t\t.replace(/&/g, \"&\")\n\t\t.replace(/</g, \"<\")\n\t\t.replace(/>/g, \">\")\n\t\t.replace(/\"/g, \""\")\n\t\t.replace(/'/g, \"'\")\n}\n\nfunction getInitialContact(actor?: FeedbackActor) {\n\treturn actor?.contactEmail || actor?.contactPhone || \"\"\n}\n\nfunction formatCategoryLabel(\n\tvalue?: string,\n\tcategories: FeedbackCategoryOption[] = DEFAULT_CATEGORIES,\n) {\n\tconst matched = categories.find((item) => item.value === value)\n\treturn matched?.label || value || DEFAULT_CATEGORIES[0]?.label || \"反馈\"\n}\n\nfunction formatThreadStatus(value?: string) {\n\tconst statusMap: Record<string, string> = {\n\t\tOPEN: \"已提交\",\n\t\tWAITING_ADMIN: \"等待回复\",\n\t\tWAITING_USER: \"待补充\",\n\t\tRESOLVED: \"已处理\",\n\t\tCLOSED: \"已关闭\",\n\t}\n\treturn statusMap[value || \"\"] || value || \"已提交\"\n}\n\nfunction formatSenderType(value: string) {\n\tif (value === \"END_USER\") return \"用户\"\n\tif (value === \"ADMIN\") return \"管理员\"\n\treturn \"系统\"\n}\n\nfunction formatThreadTime(value?: string) {\n\tif (!value) return \"\"\n\treturn new Date(value).toLocaleString()\n}\n\nasync function requestJson<T>(url: string, init?: RequestInit): Promise<T> {\n\tconst response = await fetch(url, {\n\t\t...init,\n\t\theaders: {\n\t\t\tAccept: \"application/json\",\n\t\t\t...(init?.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t...(init?.headers || {}),\n\t\t},\n\t})\n\tconst payload = await response.json().catch(() => null)\n\tif (!response.ok || payload?.code !== 200) {\n\t\tthrow new Error(payload?.message || response.statusText || \"Request failed\")\n\t}\n\treturn payload.data as T\n}\n\nfunction collectMetadata(options: FeedbackWidgetOptions) {\n\tconst page =\n\t\ttypeof window === \"undefined\"\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tpageUrl: window.location.href,\n\t\t\t\t\tpageTitle: document.title,\n\t\t\t\t\tuserAgent: navigator.userAgent,\n\t\t\t\t}\n\treturn { ...page, ...(options.metadata || {}) }\n}\n\nasync function compressImage(file: File): Promise<File> {\n\tif (typeof document === \"undefined\" || !file.type.startsWith(\"image/\")) {\n\t\treturn file\n\t}\n\tconst bitmap = await createImageBitmap(file)\n\tconst maxSize = 1600\n\tconst scale = Math.min(1, maxSize / Math.max(bitmap.width, bitmap.height))\n\tconst canvas = document.createElement(\"canvas\")\n\tcanvas.width = Math.max(1, Math.round(bitmap.width * scale))\n\tcanvas.height = Math.max(1, Math.round(bitmap.height * scale))\n\tconst ctx = canvas.getContext(\"2d\")\n\tif (!ctx) return file\n\tctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height)\n\tconst blob = await new Promise<Blob | null>((resolve) => {\n\t\tcanvas.toBlob(resolve, \"image/webp\", 0.82)\n\t})\n\tif (!blob) return file\n\treturn new File([blob], file.name.replace(/\\.[^.]+$/, \".webp\"), {\n\t\ttype: \"image/webp\",\n\t\tlastModified: Date.now(),\n\t})\n}\n\nexport function createFeedbackWidget(\n\tcontainer: HTMLElement,\n\toptions: FeedbackWidgetOptions,\n): FeedbackWidgetController {\n\tif (typeof document === \"undefined\") {\n\t\treturn { open() {}, close() {}, destroy() {} }\n\t}\n\tif (!options.appId) throw new Error(\"appId is required\")\n\tensureStyle()\n\n\tlet threadState: ThreadState | null = null\n\tlet pollTimer: number | null = null\n\tlet panelReady = false\n\tlet pendingFiles: File[] = []\n\tlet renderedMessages: FeedbackMessage[] = []\n\tlet removeLoadListener: (() => void) | null = null\n\tconst root = document.createElement(\"div\")\n\troot.className = \"yd-feedback-root\"\n\tconst launcher = document.createElement(\"button\")\n\tlauncher.type = \"button\"\n\tlauncher.className = \"yd-feedback-launcher\"\n\tlauncher.setAttribute(\"aria-label\", options.launcherText || \"反馈\")\n\tlauncher.innerHTML = FEEDBACK_ICON\n\troot.appendChild(launcher)\n\tcontainer.appendChild(root)\n\n\tconst panel = document.createElement(\"section\")\n\tpanel.className = \"yd-feedback-panel\"\n\tpanel.setAttribute(\"aria-label\", options.panelTitle || DEFAULT_PANEL_TITLE)\n\tpanel.innerHTML = `\n<div class=\"yd-feedback-header\">\n\t<div>\n\t\t<h2 class=\"yd-feedback-title\">${escapeHtml(options.panelTitle || DEFAULT_PANEL_TITLE)}</h2>\n\t\t<p class=\"yd-feedback-subtitle\">${escapeHtml(options.panelSubtitle || DEFAULT_PANEL_SUBTITLE)}</p>\n\t</div>\n\t<button type=\"button\" class=\"yd-feedback-close\" aria-label=\"关闭\">\n\t\t<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\"/></svg>\n\t</button>\n</div>\n<div class=\"yd-feedback-shell\">\n\t<aside class=\"yd-feedback-sidebar\">\n\t\t<div class=\"yd-feedback-sidebar-toolbar\">\n\t\t\t<div class=\"yd-feedback-sidebar-title\">${FEEDBACK_ICON}<span>反馈记录</span></div>\n\t\t\t<button type=\"button\" class=\"yd-feedback-icon-button\" data-role=\"clear\" aria-label=\"新建反馈\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\"/></svg>\n\t\t\t</button>\n\t\t</div>\n\t\t<div class=\"yd-feedback-thread-list\">\n\t\t\t<div class=\"yd-feedback-thread-card\" data-role=\"thread-card\">\n\t\t\t\t<div class=\"yd-feedback-thread-badges\">\n\t\t\t\t\t<span class=\"yd-feedback-badge\" data-role=\"thread-category\">问题反馈</span>\n\t\t\t\t\t<span class=\"yd-feedback-badge\" data-status=\"true\" data-role=\"thread-status\">已提交</span>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"yd-feedback-thread-preview\" data-role=\"thread-preview\"></p>\n\t\t\t\t<div class=\"yd-feedback-thread-meta\">\n\t\t\t\t\t<span data-role=\"thread-time\"></span>\n\t\t\t\t\t<span>我的反馈</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-empty-thread\" data-role=\"thread-empty\">提交反馈后,记录会显示在这里。</div>\n\t\t</div>\n\t</aside>\n\t<div class=\"yd-feedback-main\">\n\t\t<div class=\"yd-feedback-form\">\n\t\t\t<div class=\"yd-feedback-row\">\n\t\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t\t<label class=\"yd-feedback-label\">反馈类型</label>\n\t\t\t\t\t<div class=\"yd-feedback-select\" data-role=\"category-select\">\n\t\t\t\t\t\t<button type=\"button\" class=\"yd-feedback-select-button\" data-role=\"category-trigger\">\n\t\t\t\t\t\t\t<span class=\"yd-feedback-select-value\">${BUG_ICON}<span data-role=\"category-value\">问题反馈</span></span>\n\t\t\t\t\t\t\t<span class=\"yd-feedback-select-chevron\">${CHEVRON_ICON}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"yd-feedback-select-menu\" data-role=\"category-menu\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t<label class=\"yd-feedback-label\">${NOTE_ICON}<span>反馈内容</span></label>\n\t\t\t\t<div class=\"yd-feedback-compose-box\">\n\t\t\t\t\t<textarea class=\"yd-feedback-textarea\" data-role=\"content\" placeholder=\"${escapeHtml(options.placeholder || \"请描述问题现象、操作步骤或建议内容。\")}\"></textarea>\n\t\t\t\t\t<div class=\"yd-feedback-attachment-row\">\n\t\t\t\t\t\t<button type=\"button\" class=\"yd-feedback-file-trigger\" data-role=\"files-trigger\">${IMAGE_ICON}<span>上传图片</span></button>\n\t\t\t\t\t\t<input class=\"yd-feedback-file-input\" type=\"file\" accept=\"image/png,image/jpeg,image/webp\" multiple data-role=\"files\" />\n\t\t\t\t\t\t<div class=\"yd-feedback-files\" data-role=\"files-label\">${DEFAULT_ATTACHMENTS_LABEL}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t<label class=\"yd-feedback-label\">${MAIL_ICON}<span>联系方式(选填)</span></label>\n\t\t\t\t<input class=\"yd-feedback-input\" data-role=\"contact\" value=\"${escapeHtml(getInitialContact(options.actor))}\" placeholder=\"${escapeHtml(options.contactPlaceholder || \"邮箱或电话号码,仅用于反馈跟进\")}\" />\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-messages\" data-role=\"messages\"></div>\n\t\t\t<div class=\"yd-feedback-error\" data-role=\"error\"></div>\n\t\t\t<div class=\"yd-feedback-actions\">\n\t\t\t\t<button type=\"button\" class=\"yd-feedback-secondary\" data-role=\"clear-secondary\">关闭</button>\n\t\t\t\t<button type=\"button\" class=\"yd-feedback-submit\" data-role=\"submit\">提交反馈</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n`\n\n\tfunction initPanel() {\n\t\tif (panelReady) return\n\t\tpanelReady = true\n\t\troot.appendChild(panel)\n\t\tconst categorySelect = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-select\"]',\n\t\t)\n\t\tconst categoryMenu = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-menu\"]',\n\t\t)\n\t\tconst categoryValue = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-value\"]',\n\t\t)\n\t\tif (categoryMenu && categoryValue) {\n\t\t\tconst categories = options.categories || DEFAULT_CATEGORIES\n\t\t\tcategoryValue.textContent =\n\t\t\t\tcategories[0]?.label || DEFAULT_CATEGORIES[0]?.label || \"反馈\"\n\t\t\tfor (const item of categories) {\n\t\t\t\tconst option = document.createElement(\"button\")\n\t\t\t\toption.type = \"button\"\n\t\t\t\toption.className = \"yd-feedback-select-option\"\n\t\t\t\toption.dataset.value = item.value\n\t\t\t\toption.dataset.selected = String(item.value === categories[0]?.value)\n\t\t\t\toption.innerHTML = `${BUG_ICON}<span>${escapeHtml(item.label)}</span>`\n\t\t\t\toption.addEventListener(\"click\", () => {\n\t\t\t\t\tfor (const node of categoryMenu.querySelectorAll<HTMLElement>(\n\t\t\t\t\t\t\".yd-feedback-select-option\",\n\t\t\t\t\t)) {\n\t\t\t\t\t\tnode.dataset.selected = String(node === option)\n\t\t\t\t\t}\n\t\t\t\t\tcategoryValue.textContent = item.label\n\t\t\t\t\tif (categorySelect) {\n\t\t\t\t\t\tcategorySelect.dataset.value = item.value\n\t\t\t\t\t\tcategorySelect.dataset.open = \"false\"\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tcategoryMenu.appendChild(option)\n\t\t\t}\n\t\t\tcategorySelect?.setAttribute(\"data-value\", categories[0]?.value || \"BUG\")\n\t\t}\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"category-trigger\"]')\n\t\t\t?.addEventListener(\"click\", () => {\n\t\t\t\tif (!categorySelect) return\n\t\t\t\tcategorySelect.dataset.open =\n\t\t\t\t\tcategorySelect.dataset.open === \"true\" ? \"false\" : \"true\"\n\t\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>(\".yd-feedback-close\")\n\t\t\t?.addEventListener(\"click\", close)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"clear\"]')\n\t\t\t?.addEventListener(\"click\", resetThread)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"clear-secondary\"]')\n\t\t\t?.addEventListener(\"click\", close)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"files-trigger\"]')\n\t\t\t?.addEventListener(\"click\", () => {\n\t\t\t\tpanel.querySelector<HTMLInputElement>('[data-role=\"files\"]')?.click()\n\t\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLInputElement>('[data-role=\"files\"]')\n\t\t\t?.addEventListener(\"change\", (event) => {\n\t\t\t\tsetPendingFiles((event.target as HTMLInputElement).files)\n\t\t\t})\n\t\tconst composeBox = panel.querySelector<HTMLElement>(\n\t\t\t\".yd-feedback-compose-box\",\n\t\t)\n\t\tcomposeBox?.addEventListener(\"dragover\", (event) => {\n\t\t\tevent.preventDefault()\n\t\t})\n\t\tcomposeBox?.addEventListener(\"drop\", (event) => {\n\t\t\tevent.preventDefault()\n\t\t\tsetPendingFiles(event.dataTransfer?.files || null)\n\t\t})\n\t\tcomposeBox?.addEventListener(\"paste\", (event) => {\n\t\t\tconst files = Array.from(event.clipboardData?.files || []).filter(\n\t\t\t\t(file) => file.type.startsWith(\"image/\"),\n\t\t\t)\n\t\t\tif (files.length > 0) {\n\t\t\t\tsetPendingFiles(files)\n\t\t\t}\n\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"submit\"]')\n\t\t\t?.addEventListener(\"click\", () => void submit())\n\t}\n\n\tfunction setPendingFiles(files: FileList | File[] | null) {\n\t\tpendingFiles = Array.from(files || [])\n\t\t\t.filter((file) => file.type.startsWith(\"image/\"))\n\t\t\t.slice(0, MAX_IMAGES_PER_MESSAGE)\n\t\tconst label = panel.querySelector<HTMLElement>('[data-role=\"files-label\"]')\n\t\tif (label) {\n\t\t\tlabel.textContent =\n\t\t\t\tpendingFiles.length > 0\n\t\t\t\t\t? `已选择 ${pendingFiles.length} 张图片`\n\t\t\t\t\t: DEFAULT_ATTACHMENTS_LABEL\n\t\t}\n\t}\n\n\tfunction resetThread() {\n\t\tthreadState = null\n\t\tpendingFiles = []\n\t\trenderedMessages = []\n\t\trenderMessages([])\n\t\tupdateThreadCard()\n\t\tsetError(\"\")\n\t\tconst textarea = panel.querySelector<HTMLTextAreaElement>(\n\t\t\t'[data-role=\"content\"]',\n\t\t)\n\t\tif (textarea) textarea.value = \"\"\n\t\tconst fileInput = panel.querySelector<HTMLInputElement>(\n\t\t\t'[data-role=\"files\"]',\n\t\t)\n\t\tif (fileInput) fileInput.value = \"\"\n\t\tconst filesLabel = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"files-label\"]',\n\t\t)\n\t\tif (filesLabel) filesLabel.textContent = DEFAULT_ATTACHMENTS_LABEL\n\t}\n\n\tfunction updateThreadCard() {\n\t\tconst card = panel.querySelector<HTMLElement>('[data-role=\"thread-card\"]')\n\t\tconst empty = panel.querySelector<HTMLElement>('[data-role=\"thread-empty\"]')\n\t\tif (!card || !empty) return\n\t\tif (!threadState) {\n\t\t\tcard.dataset.visible = \"false\"\n\t\t\tempty.style.display = \"block\"\n\t\t\treturn\n\t\t}\n\t\tcard.dataset.visible = \"true\"\n\t\tempty.style.display = \"none\"\n\t\tconst category = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-category\"]',\n\t\t)\n\t\tconst status = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-status\"]',\n\t\t)\n\t\tconst preview = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-preview\"]',\n\t\t)\n\t\tconst time = card.querySelector<HTMLElement>('[data-role=\"thread-time\"]')\n\t\tif (category) {\n\t\t\tcategory.textContent = formatCategoryLabel(\n\t\t\t\tthreadState.category || DEFAULT_CATEGORIES[0]?.value,\n\t\t\t\toptions.categories || DEFAULT_CATEGORIES,\n\t\t\t)\n\t\t}\n\t\tif (status) status.textContent = formatThreadStatus(threadState.status)\n\t\tif (preview) preview.textContent = threadState.contentPreview || \"\"\n\t\tif (time) time.textContent = formatThreadTime(threadState.createdAt)\n\t}\n\n\tfunction setError(message: string) {\n\t\tconst node = panel.querySelector<HTMLElement>('[data-role=\"error\"]')\n\t\tif (node) node.textContent = message\n\t\tif (message) options.onError?.(new Error(message))\n\t}\n\n\tfunction setSubmitting(value: boolean) {\n\t\tconst button = panel.querySelector<HTMLButtonElement>(\n\t\t\t'[data-role=\"submit\"]',\n\t\t)\n\t\tif (button) button.disabled = value\n\t}\n\n\tfunction renderMessages(messages: FeedbackMessage[]) {\n\t\tconst node = panel.querySelector<HTMLElement>('[data-role=\"messages\"]')\n\t\tif (!node) return\n\t\trenderedMessages = messages\n\t\tnode.innerHTML = \"\"\n\t\tfor (const message of messages) {\n\t\t\tconst item = document.createElement(\"div\")\n\t\t\titem.className = \"yd-feedback-message\"\n\t\t\titem.dataset.admin = String(message.senderType !== \"END_USER\")\n\t\t\titem.innerHTML = `<div class=\"yd-feedback-message-meta\">${formatSenderType(message.senderType)} · ${new Date(message.createdAt).toLocaleString()}</div><div class=\"yd-feedback-message-content\"></div>`\n\t\t\tconst content = item.querySelector(\".yd-feedback-message-content\")\n\t\t\tif (content) {\n\t\t\t\tcontent.textContent =\n\t\t\t\t\tmessage.senderType === \"END_USER\"\n\t\t\t\t\t\t? message.content\n\t\t\t\t\t\t: message.translatedContent || message.content\n\t\t\t}\n\t\t\tnode.appendChild(item)\n\t\t}\n\t}\n\n\tfunction appendMessages(messages: FeedbackMessage[]) {\n\t\tconst byId = new Map<string, FeedbackMessage>()\n\t\tfor (const message of renderedMessages) byId.set(message.id, message)\n\t\tfor (const message of messages) byId.set(message.id, message)\n\t\trenderMessages(Array.from(byId.values()))\n\t}\n\n\tasync function uploadImages(files: File[]) {\n\t\tconst selected = files.slice(0, MAX_IMAGES_PER_MESSAGE)\n\t\tconst ids: string[] = []\n\t\tfor (const file of selected) {\n\t\t\tconst compressed = await compressImage(file)\n\t\t\tconst body = new FormData()\n\t\t\tbody.append(\"file\", compressed)\n\t\t\tif (threadState) body.append(\"threadId\", threadState.threadId)\n\t\t\tconst headers: Record<string, string> = {}\n\t\t\tif (threadState) headers[\"x-feedback-token\"] = threadState.clientToken\n\t\t\tconst response = await fetch(\n\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/resources/images`,\n\t\t\t\t{ method: \"POST\", body, headers },\n\t\t\t)\n\t\t\tconst payload = await response.json()\n\t\t\tif (!response.ok || payload?.code !== 200) {\n\t\t\t\tthrow new Error(payload?.message || \"Image upload failed\")\n\t\t\t}\n\t\t\tids.push(payload.data.resource.id)\n\t\t}\n\t\treturn ids\n\t}\n\n\tasync function submit() {\n\t\tconst content = panel\n\t\t\t.querySelector<HTMLTextAreaElement>('[data-role=\"content\"]')\n\t\t\t?.value.trim()\n\t\tif (!content) {\n\t\t\tsetError(\"请输入反馈内容。\")\n\t\t\treturn\n\t\t}\n\t\tsetSubmitting(true)\n\t\tsetError(\"\")\n\t\ttry {\n\t\t\tconst category =\n\t\t\t\tpanel.querySelector<HTMLElement>('[data-role=\"category-select\"]')\n\t\t\t\t\t?.dataset.value || \"OTHER\"\n\t\t\tconst contact =\n\t\t\t\tpanel.querySelector<HTMLInputElement>('[data-role=\"contact\"]')?.value ||\n\t\t\t\t\"\"\n\t\t\tconst fileInput = panel.querySelector<HTMLInputElement>(\n\t\t\t\t'[data-role=\"files\"]',\n\t\t\t)\n\t\t\tconst attachments = await uploadImages(pendingFiles)\n\t\t\tif (!threadState) {\n\t\t\t\tconst result = await requestJson<{\n\t\t\t\t\tthread: { id: string; status: string }\n\t\t\t\t\tmessage: { id: string }\n\t\t\t\t\tclientToken: string\n\t\t\t\t}>(\n\t\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: safeJson({\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tattachments,\n\t\t\t\t\t\t\tactor: {\n\t\t\t\t\t\t\t\t...(options.actor || {}),\n\t\t\t\t\t\t\t\tcontactEmail: contact.includes(\"@\")\n\t\t\t\t\t\t\t\t\t? contact\n\t\t\t\t\t\t\t\t\t: options.actor?.contactEmail,\n\t\t\t\t\t\t\t\tcontactPhone:\n\t\t\t\t\t\t\t\t\tcontact && !contact.includes(\"@\")\n\t\t\t\t\t\t\t\t\t\t? contact\n\t\t\t\t\t\t\t\t\t\t: options.actor?.contactPhone,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmetadata: collectMetadata(options),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tthreadState = {\n\t\t\t\t\tthreadId: result.thread.id,\n\t\t\t\t\tclientToken: result.clientToken,\n\t\t\t\t\tlastMessageId: result.message?.id,\n\t\t\t\t\tstatus: result.thread.status,\n\t\t\t\t\tcategory,\n\t\t\t\t\tcontentPreview: content,\n\t\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t\t}\n\t\t\t\tupdateThreadCard()\n\t\t\t\toptions.onThreadCreated?.(result.thread.id)\n\t\t\t\toptions.onMessageSent?.(result.message.id)\n\t\t\t} else {\n\t\t\t\tconst result = await requestJson<{ message: { id: string } }>(\n\t\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads/${encodeURIComponent(threadState.threadId)}/messages`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: { \"x-feedback-token\": threadState.clientToken },\n\t\t\t\t\t\tbody: safeJson({\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tattachments,\n\t\t\t\t\t\t\tmetadata: collectMetadata(options),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tthreadState.lastMessageId = result.message.id\n\t\t\t\tthreadState.contentPreview = content\n\t\t\t\toptions.onMessageSent?.(result.message.id)\n\t\t\t}\n\t\t\tconst textarea = panel.querySelector<HTMLTextAreaElement>(\n\t\t\t\t'[data-role=\"content\"]',\n\t\t\t)\n\t\t\tif (textarea) textarea.value = \"\"\n\t\t\tif (fileInput) fileInput.value = \"\"\n\t\t\tpendingFiles = []\n\t\t\tconst filesLabel = panel.querySelector<HTMLElement>(\n\t\t\t\t'[data-role=\"files-label\"]',\n\t\t\t)\n\t\t\tif (filesLabel) filesLabel.textContent = DEFAULT_ATTACHMENTS_LABEL\n\t\t\tawait pollOnce()\n\t\t\tstartPolling()\n\t\t} catch (error) {\n\t\t\tsetError(error instanceof Error ? error.message : \"提交失败\")\n\t\t} finally {\n\t\t\tsetSubmitting(false)\n\t\t}\n\t}\n\n\tasync function pollOnce() {\n\t\tif (!threadState) return\n\t\tconst currentThread = threadState\n\t\tconst params = new URLSearchParams()\n\t\tif (currentThread.lastMessageId) {\n\t\t\tparams.set(\"afterMessageId\", currentThread.lastMessageId)\n\t\t}\n\t\tparams.set(\"feedbackToken\", currentThread.clientToken)\n\t\tconst result = await requestJson<{\n\t\t\tthreadStatus: string\n\t\t\tmessages: FeedbackMessage[]\n\t\t\tnextPollAfterMs: number\n\t\t}>(\n\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads/${encodeURIComponent(currentThread.threadId)}/messages?${params.toString()}`,\n\t\t)\n\t\tcurrentThread.status = result.threadStatus\n\t\tupdateThreadCard()\n\t\tif (result.messages.length > 0) {\n\t\t\tconst latestMessage = result.messages.at(-1)\n\t\t\tif (latestMessage) currentThread.lastMessageId = latestMessage.id\n\t\t\tappendMessages(result.messages)\n\t\t}\n\t\tif (result.threadStatus !== \"WAITING_ADMIN\") stopPolling()\n\t\telse schedulePoll(result.nextPollAfterMs)\n\t}\n\n\tfunction schedulePoll(delay: number) {\n\t\tstopPolling()\n\t\tif (!delay || delay < 1 || document.hidden || !threadState) return\n\t\tpollTimer = window.setTimeout(() => void pollOnce(), delay)\n\t}\n\n\tfunction startPolling() {\n\t\tif (!threadState || threadState.status !== \"WAITING_ADMIN\") return\n\t\tschedulePoll(10_000)\n\t}\n\n\tfunction stopPolling() {\n\t\tif (pollTimer) window.clearTimeout(pollTimer)\n\t\tpollTimer = null\n\t}\n\n\tfunction open() {\n\t\tinitPanel()\n\t\tpanel.dataset.open = \"true\"\n\t\twindow.setTimeout(() => {\n\t\t\tpanel.querySelector<HTMLTextAreaElement>('[data-role=\"content\"]')?.focus()\n\t\t}, 0)\n\t}\n\n\tfunction close() {\n\t\tpanel.dataset.open = \"false\"\n\t\tstopPolling()\n\t}\n\n\tlauncher.addEventListener(\"click\", open)\n\tconst handleVisibilityChange = () => {\n\t\tif (document.hidden) stopPolling()\n\t\telse startPolling()\n\t}\n\tconst handleDocumentClick = (event: MouseEvent) => {\n\t\tconst categorySelect = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-select\"]',\n\t\t)\n\t\tif (\n\t\t\tcategorySelect &&\n\t\t\tevent.target instanceof Node &&\n\t\t\t!categorySelect.contains(event.target)\n\t\t) {\n\t\t\tcategorySelect.dataset.open = \"false\"\n\t\t}\n\t}\n\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange)\n\tdocument.addEventListener(\"click\", handleDocumentClick)\n\n\tif (typeof window !== \"undefined\") {\n\t\tconst preload = () => {\n\t\t\tif (\"requestIdleCallback\" in window) {\n\t\t\t\t;(window as any).requestIdleCallback(() => initPanel())\n\t\t\t} else {\n\t\t\t\tglobalThis.setTimeout(() => initPanel(), 1200)\n\t\t\t}\n\t\t}\n\t\tif (document.readyState === \"complete\") preload()\n\t\telse {\n\t\t\twindow.addEventListener(\"load\", preload, { once: true })\n\t\t\tremoveLoadListener = () => window.removeEventListener(\"load\", preload)\n\t\t}\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\tdestroy() {\n\t\t\tstopPolling()\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange)\n\t\t\tdocument.removeEventListener(\"click\", handleDocumentClick)\n\t\t\tremoveLoadListener?.()\n\t\t\troot.remove()\n\t\t},\n\t}\n}\n\nexport function mountFeedbackWidget(\n\tcontainer: HTMLElement,\n\toptions: FeedbackWidgetOptions,\n) {\n\treturn createFeedbackWidget(container, options)\n}\n"],"mappings":"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","names":[]}
|