tmex-cli 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime/{cpufeatures-jxwx4v5j.node → cpufeatures-9rk1k79p.node} +0 -0
- package/dist/runtime/server.js +1813 -1298
- package/dist/runtime/{sshcrypto-sx6755rw.node → sshcrypto-z1hq11fy.node} +0 -0
- package/package.json +1 -1
- package/resources/fe-dist/assets/DevicePage-BE5Hlzny.js +26 -0
- package/resources/fe-dist/assets/DevicePage-BE5Hlzny.js.map +1 -0
- package/resources/fe-dist/assets/DevicesPage-BTB6mlBW.js +17 -0
- package/resources/fe-dist/assets/{DevicesPage-BrvmKNIQ.js.map → DevicesPage-BTB6mlBW.js.map} +1 -1
- package/resources/fe-dist/assets/SettingsPage-BDVq_Akt.js +17 -0
- package/resources/fe-dist/assets/{SettingsPage-XFRzVSzI.js.map → SettingsPage-BDVq_Akt.js.map} +1 -1
- package/resources/fe-dist/assets/ghostty-vt-BKQMf-5X.wasm +0 -0
- package/resources/fe-dist/assets/index-Chps0Pui.js +448 -0
- package/resources/fe-dist/assets/index-Chps0Pui.js.map +1 -0
- package/resources/fe-dist/assets/index-CyKyNcdz.css +1 -0
- package/resources/fe-dist/assets/select-7tfuDWw3.js +17 -0
- package/resources/fe-dist/assets/{select-CRYPgkuV.js.map → select-7tfuDWw3.js.map} +1 -1
- package/resources/fe-dist/assets/switch-CNHRGb7-.js +12 -0
- package/resources/fe-dist/assets/{switch-D216fzW5.js.map → switch-CNHRGb7-.js.map} +1 -1
- package/resources/fe-dist/assets/useValueChanged-Bi_NzPTr.js +7 -0
- package/resources/fe-dist/assets/{useValueChanged-CJav2OS1.js.map → useValueChanged-Bi_NzPTr.js.map} +1 -1
- package/resources/fe-dist/index.html +2 -2
- package/resources/fe-dist/assets/DevicePage-6GBZ9nXN.css +0 -32
- package/resources/fe-dist/assets/DevicePage-BOtxQsop.js +0 -267
- package/resources/fe-dist/assets/DevicePage-BOtxQsop.js.map +0 -1
- package/resources/fe-dist/assets/DevicesPage-BrvmKNIQ.js +0 -17
- package/resources/fe-dist/assets/SettingsPage-XFRzVSzI.js +0 -17
- package/resources/fe-dist/assets/index-CxzyWqMn.css +0 -1
- package/resources/fe-dist/assets/index-Vweko0vT.js +0 -200
- package/resources/fe-dist/assets/index-Vweko0vT.js.map +0 -1
- package/resources/fe-dist/assets/select-CRYPgkuV.js +0 -17
- package/resources/fe-dist/assets/switch-D216fzW5.js +0 -12
- package/resources/fe-dist/assets/useValueChanged-CJav2OS1.js +0 -7
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{c as G,u as U,a as he,b as pe,r as i,d as me,e as M,j as e,B as c,I as ce,t as Ne,f as o,i as Se}from"./index-Chps0Pui.js";import{u as f,C as B,a as R,b as q,c as A,I as h,S as Ee,d as Pe,e as je,f as De,g as we}from"./select-7tfuDWw3.js";import{T as fe,A as Le,a as Ue,b as Ve,c as ye,d as Te,e as Fe,f as Be,g as Re}from"./useValueChanged-Bi_NzPTr.js";import{S as L,L as ue,a as qe}from"./switch-CNHRGb7-.js";/**
|
|
2
|
+
* @license lucide-react v0.564.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Ae=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Me=G("rotate-ccw",Ae);/**
|
|
7
|
+
* @license lucide-react v0.564.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const $e=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],$=G("save",$e);/**
|
|
12
|
+
* @license lucide-react v0.564.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const Ie=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],de=G("shield",Ie);async function d(s,u){try{return(await s.json()).error??u}catch{return u}}function He(){var ie,oe,le,ne;const{t:s}=U(),u=he(),{refreshSettings:g}=pe(),[r,l]=i.useState("site"),p=me(t=>t.theme),k=me(t=>t.setTheme),b=p==="dark",[x,E]=i.useState("tmex"),[P,j]=i.useState(window.location.origin),[N,C]=i.useState("en_US"),[v,V]=i.useState(6),[y,T]=i.useState(!0),[D,F]=i.useState(!0),[w,a]=i.useState(2),[n,S]=i.useState(10),[xe,be]=i.useState(!1),[I,X]=i.useState(""),[z,Y]=i.useState(""),[ve,ke]=i.useState(null),[Q,Z]=i.useState(""),[K,ee]=i.useState(""),Ce=t=>{const m=t?"dark":"light";k(m),document.documentElement.classList.toggle("dark",m==="dark")},O=M({queryKey:["site-settings"],queryFn:async()=>{const t=await fetch("/api/settings/site");if(!t.ok)throw new Error(await d(t,s("settings.loadFailed")));return await t.json()}}),_=M({queryKey:["telegram-bots"],queryFn:async()=>{const t=await fetch("/api/settings/telegram/bots");if(!t.ok)throw new Error(await d(t,s("telegram.loadBotsFailed")));return await t.json()}});i.useEffect(()=>{var m;const t=(m=O.data)==null?void 0:m.settings;t&&(E(t.siteName),j(t.siteUrl),C(t.language??"en_US"),V(t.bellThrottleSeconds),T(t.enableBrowserBellToast??!0),F(t.enableTelegramBellPush??!0),a(t.sshReconnectMaxRetries),S(t.sshReconnectDelaySeconds))},[(ie=O.data)==null?void 0:ie.settings]);const se=f({mutationFn:async()=>{const m=await fetch("/api/settings/site",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({siteName:x,siteUrl:P,language:N,bellThrottleSeconds:v,enableBrowserBellToast:y,enableTelegramBellPush:D,sshReconnectMaxRetries:w,sshReconnectDelaySeconds:n})});if(!m.ok)throw new Error(await d(m,s("settings.saveFailed")))},onSuccess:async()=>{var t,m;await Promise.all([u.invalidateQueries({queryKey:["site-settings"]}),g()]),o.success(s("settings.settingsSaved")),((m=(t=O.data)==null?void 0:t.settings)==null?void 0:m.language)!==N&&(Se.changeLanguage(N),be(!0))},onError:t=>{o.error(t instanceof Error?t.message:s("common.error"))}}),H=f({mutationFn:async()=>{const t=await fetch("/api/settings/telegram/bots",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:I,token:z,enabled:!0,allowAuthRequests:!0})});if(!t.ok)throw new Error(await d(t,s("telegram.createFailed")))},onSuccess:async()=>{X(""),Y(""),await u.invalidateQueries({queryKey:["telegram-bots"]}),o.success(s("common.success"))},onError:t=>{o.error(t instanceof Error?t.message:s("common.error"))}}),te=((oe=_.data)==null?void 0:oe.bots)??[],W=M({queryKey:["webhooks"],queryFn:async()=>{const t=await fetch("/api/webhooks");if(!t.ok)throw new Error(await d(t,s("webhook.loadFailed")));return await t.json()}}),J=f({mutationFn:async()=>{const t=await fetch("/api/webhooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:Q,secret:K})});if(!t.ok)throw new Error(await d(t,s("webhook.createFailed")))},onSuccess:async()=>{Z(""),ee(""),await u.invalidateQueries({queryKey:["webhooks"]}),o.success(s("common.success"))},onError:t=>{o.error(t instanceof Error?t.message:s("common.error"))}}),ae=f({mutationFn:async t=>{const m=await fetch(`/api/webhooks/${t}`,{method:"DELETE"});if(!m.ok)throw new Error(await d(m,s("webhook.deleteFailed")))},onSuccess:async()=>{await u.invalidateQueries({queryKey:["webhooks"]}),o.success(s("common.success"))},onError:t=>{o.error(t instanceof Error?t.message:s("common.error"))}}),re=((le=W.data)==null?void 0:le.webhooks)??[];return e.jsxDEV("div",{className:"mx-auto flex w-full max-w-6xl flex-col gap-4 p-3 pb-[calc(2rem+env(safe-area-inset-bottom))] sm:gap-6 sm:p-5","data-testid":"settings-page",children:[e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:[e.jsxDEV(c,{type:"button",size:"sm",variant:r==="site"?"default":"outline","data-testid":"settings-tab-site",onClick:()=>l("site"),children:s("settings.siteSettings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:281,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="notifications"?"default":"outline","data-testid":"settings-tab-notifications",onClick:()=>l("notifications"),children:s("settings.notificationsTab")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:290,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="telegram"?"default":"outline","data-testid":"settings-tab-telegram",onClick:()=>l("telegram"),children:s("telegram.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:299,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="webhooks"?"default":"outline","data-testid":"settings-tab-webhooks",onClick:()=>l("webhooks"),children:s("webhook.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:308,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:280,columnNumber:7},this),r==="site"&&e.jsxDEV(B,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:s("settings.siteSettings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:322,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:321,columnNumber:11},this),e.jsxDEV(A,{className:"space-y-6",children:[e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"site-name-input",children:s("settings.siteName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:326,columnNumber:15},this),e.jsxDEV(h,{id:"site-name-input",value:x,onChange:t=>E(t.target.value),placeholder:s("settings.siteNamePlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:329,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:325,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"site-url-input",children:s("settings.siteUrl")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:339,columnNumber:15},this),e.jsxDEV(h,{id:"site-url-input",value:P,onChange:t=>j(t.target.value),placeholder:s("settings.siteUrlPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:342,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:338,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"language-select",children:s("settings.language")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:352,columnNumber:15},this),e.jsxDEV(Ee,{value:N,onValueChange:t=>{t&&C(t)},children:[e.jsxDEV(Pe,{id:"language-select","data-testid":"settings-language-select",className:"w-full min-h-10",children:e.jsxDEV(je,{placeholder:s("settings.language"),children:((ne=ce.locales.find(t=>t.code===N))==null?void 0:ne.nativeName)??N},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:367,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:362,columnNumber:17},this),e.jsxDEV(De,{className:"max-h-[var(--tmex-viewport-height)]",children:ce.locales.map(t=>e.jsxDEV(we,{value:t.code,children:t.nativeName},t.code,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:373,columnNumber:21},this))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:371,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:355,columnNumber:15},this),xe&&e.jsxDEV("p",{className:"mt-1 text-xs text-primary","data-testid":"settings-refresh-notice",children:s("settings.refreshToApply")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:380,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:351,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-3",children:e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5",children:[e.jsxDEV("div",{className:"min-w-0 pr-2",children:e.jsxDEV("div",{className:"text-sm font-medium",children:s("settings.theme")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:389,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:388,columnNumber:17},this),e.jsxDEV(L,{checked:b,onCheckedChange:t=>Ce(!!t),"data-testid":"settings-theme-toggle"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:391,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:387,columnNumber:15},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:386,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:324,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:320,columnNumber:9},this),r==="notifications"&&e.jsxDEV(B,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:s("settings.notificationsTab")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:405,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:404,columnNumber:11},this),e.jsxDEV(A,{className:"space-y-6",children:[e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5",children:[e.jsxDEV("div",{className:"min-w-0 pr-2",children:e.jsxDEV("div",{className:"text-sm font-medium",children:s("settings.enableBrowserBellToast")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:411,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:410,columnNumber:17},this),e.jsxDEV(L,{checked:y,onCheckedChange:t=>T(!!t),"data-testid":"settings-enable-browser-bell-toast"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:413,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:409,columnNumber:15},this),e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5",children:[e.jsxDEV("div",{className:"min-w-0 pr-2",children:e.jsxDEV("div",{className:"text-sm font-medium",children:s("settings.enableTelegramBellPush")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:422,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:421,columnNumber:17},this),e.jsxDEV(L,{checked:D,onCheckedChange:t=>F(!!t),"data-testid":"settings-enable-telegram-bell-push"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:424,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:420,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:408,columnNumber:13},this),e.jsxDEV("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"bell-throttle-input",children:s("settings.bellThrottle")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:434,columnNumber:17},this),e.jsxDEV(h,{id:"bell-throttle-input",type:"number",value:v,min:0,max:300,onChange:t=>V(Number(t.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:437,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:433,columnNumber:15},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"ssh-reconnect-retries-input",children:s("settings.sshReconnectMaxRetries")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:449,columnNumber:17},this),e.jsxDEV(h,{id:"ssh-reconnect-retries-input",type:"number",value:w,min:0,max:20,onChange:t=>a(Number(t.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:452,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:448,columnNumber:15},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"ssh-reconnect-delay-input",children:s("settings.sshReconnectDelay")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:464,columnNumber:17},this),e.jsxDEV(h,{id:"ssh-reconnect-delay-input",type:"number",value:n,min:1,max:300,onChange:t=>S(Number(t.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:467,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:463,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:432,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:407,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:403,columnNumber:9},this),r==="telegram"&&e.jsxDEV(B,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:s("telegram.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:485,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:484,columnNumber:11},this),e.jsxDEV(A,{className:"space-y-6",children:[e.jsxDEV("div",{className:"space-y-4",children:e.jsxDEV("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end",children:[e.jsxDEV("div",{className:"md:col-span-4 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"new-bot-name",children:s("telegram.botName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:491,columnNumber:19},this),e.jsxDEV(h,{id:"new-bot-name",value:I,onChange:t=>X(t.target.value),placeholder:s("telegram.botNamePlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:494,columnNumber:19},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:490,columnNumber:17},this),e.jsxDEV("div",{className:"md:col-span-6 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"new-bot-token",children:s("telegram.botToken")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:504,columnNumber:19},this),e.jsxDEV(h,{id:"new-bot-token",type:"password",value:z,onChange:t=>Y(t.target.value),placeholder:s("telegram.botTokenPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:507,columnNumber:19},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:503,columnNumber:17},this),e.jsxDEV("div",{className:"md:col-span-2",children:e.jsxDEV(c,{variant:"default",className:"w-full md:w-auto","data-testid":"telegram-add-bot",onClick:()=>H.mutate(),disabled:H.isPending||!I.trim()||!z.trim(),children:[H.isPending?e.jsxDEV(ue,{className:"h-4 w-4 animate-spin"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:528,columnNumber:23},this):e.jsxDEV($,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:530,columnNumber:23},this),s("telegram.addBot")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:518,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:517,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:489,columnNumber:15},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:488,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-3",children:[_.isLoading&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:s("common.loading")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:540,columnNumber:17},this),!_.isLoading&&te.length===0&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:s("telegram.addBot")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:544,columnNumber:17},this),te.map(t=>e.jsxDEV(ze,{bot:t,expanded:ve===t.id,onToggleExpand:()=>{ke(m=>m===t.id?null:t.id)}},t.id,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:548,columnNumber:17},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:538,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:487,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:483,columnNumber:9},this),r==="webhooks"&&e.jsxDEV(B,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:s("webhook.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:565,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:564,columnNumber:11},this),e.jsxDEV(A,{className:"space-y-6",children:[e.jsxDEV("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end",children:[e.jsxDEV("div",{className:"md:col-span-6 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"webhook-url-input",children:s("webhook.url")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:570,columnNumber:17},this),e.jsxDEV(h,{id:"webhook-url-input","data-testid":"webhook-url-input",value:Q,onChange:t=>Z(t.target.value),placeholder:"https://example.com/webhook",className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:573,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:569,columnNumber:15},this),e.jsxDEV("div",{className:"md:col-span-4 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"webhook-secret-input",children:s("webhook.secret")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:584,columnNumber:17},this),e.jsxDEV(h,{id:"webhook-secret-input","data-testid":"webhook-secret-input",value:K,onChange:t=>ee(t.target.value),placeholder:s("webhook.secretPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:587,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:583,columnNumber:15},this),e.jsxDEV("div",{className:"md:col-span-2",children:e.jsxDEV(c,{variant:"default",className:"w-full md:w-auto","data-testid":"webhook-add",onClick:()=>J.mutate(),disabled:J.isPending||!Q.trim()||!K.trim(),children:[J.isPending?e.jsxDEV(ue,{className:"h-4 w-4 animate-spin"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:610,columnNumber:21},this):e.jsxDEV($,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:612,columnNumber:21},this),s("webhook.add")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:598,columnNumber:17},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:597,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:568,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-2",children:[W.isLoading&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:s("common.loading")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:621,columnNumber:17},this),!W.isLoading&&re.length===0&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:s("webhook.empty")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:625,columnNumber:17},this),re.map(t=>e.jsxDEV("div",{"data-testid":"webhook-item","data-webhook-url":t.url,className:"flex items-center justify-between gap-3 rounded-lg border border-border bg-card px-4 py-2.5",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("div",{className:"truncate text-sm font-medium",children:t.url},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:636,columnNumber:21},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:new Date(t.createdAt).toLocaleString(Ne(N))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:637,columnNumber:21},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:635,columnNumber:19},this),e.jsxDEV(c,{variant:"ghost",size:"icon-sm","data-testid":"webhook-delete",onClick:()=>ae.mutate(t.id),disabled:ae.isPending,"aria-label":s("common.delete"),title:s("common.delete"),children:e.jsxDEV(fe,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:650,columnNumber:21},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:641,columnNumber:19},this)]},t.id,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:629,columnNumber:17},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:619,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:567,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:563,columnNumber:9},this),(r==="site"||r==="notifications")&&e.jsxDEV("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end",children:e.jsxDEV(c,{variant:"default","data-testid":"settings-save",onClick:()=>se.mutate(),disabled:se.isPending,className:"w-full sm:w-auto",children:[e.jsxDEV($,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:668,columnNumber:13},this),s("common.save")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:661,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:660,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:276,columnNumber:5},this)}function ze({bot:s,expanded:u,onToggleExpand:g}){var w;const{t:r}=U(),l=he(),[p,k]=i.useState(s.name),[b,x]=i.useState(""),[E,P]=i.useState(s.enabled),[j,N]=i.useState(s.allowAuthRequests);i.useEffect(()=>{k(s.name),P(s.enabled),N(s.allowAuthRequests)},[s.allowAuthRequests,s.enabled,s.name]);const C=M({queryKey:["telegram-bot-chats",s.id],enabled:u,queryFn:async()=>{const a=await fetch(`/api/settings/telegram/bots/${s.id}/chats`);if(!a.ok)throw new Error(await d(a,r("telegram.loadChatsFailed")));return await a.json()}}),v=i.useMemo(()=>{var n;const a=((n=C.data)==null?void 0:n.chats)??[];return{pending:a.filter(S=>S.status==="pending"),authorized:a.filter(S=>S.status==="authorized")}},[(w=C.data)==null?void 0:w.chats]),V=f({mutationFn:async()=>{const a={name:p,enabled:E,allowAuthRequests:j};b.trim()&&(a.token=b.trim());const n=await fetch(`/api/settings/telegram/bots/${s.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!n.ok)throw new Error(await d(n,r("telegram.updateFailed")))},onSuccess:async()=>{x(""),await l.invalidateQueries({queryKey:["telegram-bots"]}),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),y=f({mutationFn:async()=>{const a=await fetch(`/api/settings/telegram/bots/${s.id}`,{method:"DELETE"});if(!a.ok)throw new Error(await d(a,r("telegram.deleteFailed")))},onSuccess:async()=>{await l.invalidateQueries({queryKey:["telegram-bots"]}),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),T=f({mutationFn:async a=>{const n=await fetch(`/api/settings/telegram/bots/${s.id}/chats/${encodeURIComponent(a)}/approve`,{method:"POST"});if(!n.ok)throw new Error(await d(n,r("telegram.approveFailed")))},onSuccess:async()=>{await Promise.all([l.invalidateQueries({queryKey:["telegram-bots"]}),l.invalidateQueries({queryKey:["telegram-bot-chats",s.id]})]),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),D=f({mutationFn:async a=>{const n=await fetch(`/api/settings/telegram/bots/${s.id}/chats/${encodeURIComponent(a)}`,{method:"DELETE"});if(!n.ok)throw new Error(await d(n,r("telegram.removeFailed")))},onSuccess:async()=>{await Promise.all([l.invalidateQueries({queryKey:["telegram-bots"]}),l.invalidateQueries({queryKey:["telegram-bot-chats",s.id]})]),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),F=f({mutationFn:async a=>{const n=await fetch(`/api/settings/telegram/bots/${s.id}/chats/${encodeURIComponent(a)}/test`,{method:"POST"});if(!n.ok)throw new Error(await d(n,r("telegram.testMessageFailed")))},onSuccess:()=>{o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}});return e.jsxDEV("div",{className:"space-y-4 rounded-md border-0 bg-card p-4","data-testid":`telegram-bot-card-${s.id}`,"data-bot-name":s.name,children:[e.jsxDEV("div",{className:"flex items-center justify-between gap-3",children:[e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"font-medium",children:s.name},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:846,columnNumber:11},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:[s.authorizedCount," / ",s.pendingCount]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:847,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:845,columnNumber:9},this),e.jsxDEV(c,{variant:"ghost","data-testid":`telegram-bot-toggle-${s.id}`,onClick:g,children:r(u?"common.collapse":"common.expand")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:851,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:844,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end",children:[e.jsxDEV("div",{className:"md:col-span-3 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:`bot-name-${s.id}`,children:r("telegram.botName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:862,columnNumber:11},this),e.jsxDEV(h,{id:`bot-name-${s.id}`,value:p,onChange:a=>k(a.target.value),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:865,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:861,columnNumber:9},this),e.jsxDEV("div",{className:"md:col-span-4 space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:`bot-token-${s.id}`,children:r("telegram.botToken")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:873,columnNumber:11},this),e.jsxDEV(h,{id:`bot-token-${s.id}`,type:"password",value:b,onChange:a=>x(a.target.value),placeholder:r("telegram.tokenPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:876,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:872,columnNumber:9},this),e.jsxDEV("div",{className:"md:col-span-2",children:e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5",children:[e.jsxDEV("span",{className:"text-sm font-medium",children:r("common.enabled")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:887,columnNumber:13},this),e.jsxDEV(L,{checked:E,onCheckedChange:a=>P(!!a)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:888,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:886,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:885,columnNumber:9},this),e.jsxDEV("div",{className:"md:col-span-3",children:e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5",children:[e.jsxDEV("span",{className:"text-sm font-medium",children:r("telegram.allowAuthRequests")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:893,columnNumber:13},this),e.jsxDEV(L,{checked:j,onCheckedChange:a=>N(!!a)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:894,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:892,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:891,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:860,columnNumber:7},this),e.jsxDEV("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end",children:[e.jsxDEV(c,{variant:"destructive","data-testid":`telegram-bot-delete-${s.id}`,onClick:()=>y.mutate(),className:"w-full sm:w-auto",children:[e.jsxDEV(fe,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:909,columnNumber:11},this),r("telegram.deleteBot")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:903,columnNumber:9},this),e.jsxDEV(c,{variant:"default","data-testid":`telegram-bot-save-${s.id}`,onClick:()=>V.mutate(),className:"w-full sm:w-auto",children:[e.jsxDEV($,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:918,columnNumber:11},this),r("common.save")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:912,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:902,columnNumber:7},this),u&&e.jsxDEV("div",{className:"grid grid-cols-1 gap-4 border-t border-border pt-4 lg:grid-cols-2",children:[e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("h3",{className:"text-sm font-semibold flex items-center gap-1",children:[e.jsxDEV(de,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:927,columnNumber:15},this),r("telegram.pendingChats")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:926,columnNumber:13},this),v.pending.length===0&&e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:"-"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:930,columnNumber:51},this),v.pending.map(a=>e.jsxDEV(ge,{chat:a,pending:!0,onApprove:()=>T.mutate(a.chatId),onDelete:()=>D.mutate(a.chatId)},`${a.botId}-${a.chatId}`,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:932,columnNumber:15},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:925,columnNumber:11},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("h3",{className:"text-sm font-semibold flex items-center gap-1",children:[e.jsxDEV(de,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:944,columnNumber:15},this),r("telegram.chats")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:943,columnNumber:13},this),v.authorized.length===0&&e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:"-"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:947,columnNumber:54},this),v.authorized.map(a=>e.jsxDEV(ge,{chat:a,pending:!1,onTest:()=>F.mutate(a.chatId),onDelete:()=>D.mutate(a.chatId)},`${a.botId}-${a.chatId}`,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:949,columnNumber:15},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:942,columnNumber:11},this),C.isLoading&&e.jsxDEV("div",{className:"lg:col-span-2 text-xs text-muted-foreground",children:r("common.loading")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:960,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:924,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:839,columnNumber:5},this)}function ge({chat:s,pending:u,onApprove:g,onDelete:r,onTest:l}){const{t:p}=U(),k=pe(b=>{var x;return((x=b.settings)==null?void 0:x.language)??"en_US"});return e.jsxDEV("div",{className:"space-y-2 rounded border-0 bg-background p-3",children:[e.jsxDEV("div",{className:"text-sm font-medium truncate",title:s.displayName,children:s.displayName},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:983,columnNumber:7},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:[p("telegram.chatId"),":",s.chatId]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:986,columnNumber:7},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:new Date(s.appliedAt).toLocaleString(Ne(k))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:989,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center justify-end gap-2 pt-1",children:u?e.jsxDEV(e.Fragment,{children:[e.jsxDEV(c,{variant:"outline",size:"sm",onClick:r,children:p("telegram.reject")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:996,columnNumber:13},this),e.jsxDEV(c,{variant:"default",size:"sm",onClick:g,children:p("telegram.authorize")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:999,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:995,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(c,{variant:"secondary",size:"sm",onClick:l,children:[e.jsxDEV(qe,{className:"h-3.5 w-3.5"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1006,columnNumber:15},this),p("telegram.sendTestMessage")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1005,columnNumber:13},this),e.jsxDEV(c,{variant:"destructive",size:"sm",onClick:r,children:p("common.delete")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1009,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1004,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:993,columnNumber:7},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:982,columnNumber:5},this)}function We(){const{t:s}=U();return e.jsxDEV(e.Fragment,{children:s("sidebar.settings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1022,columnNumber:10},this)}function Je(){const{t:s}=U(),[u,g]=i.useState(!1),r=f({mutationFn:async()=>{const l=await fetch("/api/settings/restart",{method:"POST"});if(!l.ok)throw new Error(await d(l,s("settings.restartFailed")))},onSuccess:()=>{o.success(s("settings.restartScheduled"))},onError:l=>{o.error(l instanceof Error?l.message:s("common.error"))}});return e.jsxDEV(e.Fragment,{children:[e.jsxDEV(c,{variant:"ghost",size:"icon-sm",onClick:()=>g(!0),disabled:r.isPending,"aria-label":s("settings.restartGateway"),title:s("settings.restartGateway"),className:"text-destructive hover:text-destructive hover:bg-destructive/10",children:e.jsxDEV(Me,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1056,columnNumber:9},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1047,columnNumber:7},this),e.jsxDEV(Le,{open:u,onOpenChange:g,children:e.jsxDEV(Ue,{children:[e.jsxDEV(Ve,{children:[e.jsxDEV(ye,{children:s("settings.restartGateway")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1062,columnNumber:13},this),e.jsxDEV(Te,{children:s("settings.restartConfirm")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1063,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1061,columnNumber:11},this),e.jsxDEV(Fe,{children:[e.jsxDEV(Be,{onClick:()=>g(!1),children:s("common.cancel")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1066,columnNumber:13},this),e.jsxDEV(Re,{variant:"destructive",onClick:()=>{r.mutate(),g(!1)},children:s("common.confirm")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1069,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1065,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1060,columnNumber:9},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1059,columnNumber:7},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1046,columnNumber:5},this)}export{Je as PageActions,We as PageTitle,He as default};
|
|
17
|
+
//# sourceMappingURL=SettingsPage-BDVq_Akt.js.map
|
package/resources/fe-dist/assets/{SettingsPage-XFRzVSzI.js.map → SettingsPage-BDVq_Akt.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage-XFRzVSzI.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/save.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/shield.js","../../src/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n];\nconst RotateCcw = createLucideIcon(\"rotate-ccw\", __iconNode);\n\nexport { __iconNode, RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport type {\n LocaleCode,\n SiteSettings,\n TelegramBotChat,\n TelegramBotWithStats,\n UpdateSiteSettingsRequest,\n WebhookEndpoint,\n} from '@tmex/shared';\nimport { I18N_MANIFEST, toBCP47 as toBCP47Locale } from '@tmex/shared';\nimport { Loader2, RotateCcw, Save, Send, Shield, Trash2 } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport i18n from '../i18n';\nimport { toast } from 'sonner';\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Input } from '@/components/ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Switch } from '@/components/ui/switch';\nimport { useSiteStore } from '../stores/site';\nimport { useUIStore } from '../stores/ui';\n\ninterface TelegramBotsResponse {\n bots: TelegramBotWithStats[];\n}\n\ninterface TelegramChatsResponse {\n chats: TelegramBotChat[];\n}\n\ninterface SiteSettingsResponse {\n settings: SiteSettings;\n}\n\ninterface WebhooksResponse {\n webhooks: WebhookEndpoint[];\n}\n\nasync function parseApiError(res: Response, fallback: string): Promise<string> {\n try {\n const payload = (await res.json()) as { error?: string };\n return payload.error ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nexport default function SettingsPage() {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { refreshSettings } = useSiteStore();\n\n const [activeTab, setActiveTab] = useState<'site' | 'notifications' | 'telegram' | 'webhooks'>(\n 'site'\n );\n\n const theme = useUIStore((state) => state.theme);\n const setTheme = useUIStore((state) => state.setTheme);\n const isDark = theme === 'dark';\n\n // Site settings state\n const [siteName, setSiteName] = useState('tmex');\n const [siteUrl, setSiteUrl] = useState(window.location.origin);\n const [language, setLanguage] = useState<LocaleCode>('en_US');\n\n // Notifications state\n const [bellThrottleSeconds, setBellThrottleSeconds] = useState(6);\n const [enableBrowserBellToast, setEnableBrowserBellToast] = useState(true);\n const [enableTelegramBellPush, setEnableTelegramBellPush] = useState(true);\n const [sshReconnectMaxRetries, setSshReconnectMaxRetries] = useState(2);\n const [sshReconnectDelaySeconds, setSshReconnectDelaySeconds] = useState(10);\n const [showRefreshNotice, setShowRefreshNotice] = useState(false);\n\n // Telegram state\n const [newBotName, setNewBotName] = useState('');\n const [newBotToken, setNewBotToken] = useState('');\n const [expandedBotId, setExpandedBotId] = useState<string | null>(null);\n\n // Webhook state\n const [newWebhookUrl, setNewWebhookUrl] = useState('');\n const [newWebhookSecret, setNewWebhookSecret] = useState('');\n\n const handleThemeChange = (checked: boolean) => {\n const nextTheme = checked ? 'dark' : 'light';\n setTheme(nextTheme);\n document.documentElement.classList.toggle('dark', nextTheme === 'dark');\n };\n\n const settingsQuery = useQuery({\n queryKey: ['site-settings'],\n queryFn: async () => {\n const res = await fetch('/api/settings/site');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.loadFailed')));\n }\n return (await res.json()) as SiteSettingsResponse;\n },\n });\n\n const botsQuery = useQuery({\n queryKey: ['telegram-bots'],\n queryFn: async () => {\n const res = await fetch('/api/settings/telegram/bots');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.loadBotsFailed')));\n }\n return (await res.json()) as TelegramBotsResponse;\n },\n });\n\n useEffect(() => {\n const settings = settingsQuery.data?.settings;\n if (!settings) {\n return;\n }\n\n setSiteName(settings.siteName);\n setSiteUrl(settings.siteUrl);\n setLanguage(settings.language ?? 'en_US');\n setBellThrottleSeconds(settings.bellThrottleSeconds);\n setEnableBrowserBellToast(settings.enableBrowserBellToast ?? true);\n setEnableTelegramBellPush(settings.enableTelegramBellPush ?? true);\n setSshReconnectMaxRetries(settings.sshReconnectMaxRetries);\n setSshReconnectDelaySeconds(settings.sshReconnectDelaySeconds);\n }, [settingsQuery.data?.settings]);\n\n const saveSiteMutation = useMutation({\n mutationFn: async () => {\n const payload: UpdateSiteSettingsRequest = {\n siteName,\n siteUrl,\n language,\n bellThrottleSeconds,\n enableBrowserBellToast,\n enableTelegramBellPush,\n sshReconnectMaxRetries,\n sshReconnectDelaySeconds,\n };\n\n const res = await fetch('/api/settings/site', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.saveFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['site-settings'] }),\n refreshSettings(),\n ]);\n toast.success(t('settings.settingsSaved'));\n if (settingsQuery.data?.settings?.language !== language) {\n void i18n.changeLanguage(language);\n setShowRefreshNotice(true);\n }\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const createBotMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/settings/telegram/bots', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: newBotName,\n token: newBotToken,\n enabled: true,\n allowAuthRequests: true,\n }),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.createFailed')));\n }\n },\n onSuccess: async () => {\n setNewBotName('');\n setNewBotToken('');\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const bots = botsQuery.data?.bots ?? [];\n\n const webhooksQuery = useQuery({\n queryKey: ['webhooks'],\n queryFn: async () => {\n const res = await fetch('/api/webhooks');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.loadFailed')));\n }\n return (await res.json()) as WebhooksResponse;\n },\n });\n\n const createWebhookMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/webhooks', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: newWebhookUrl,\n secret: newWebhookSecret,\n }),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.createFailed')));\n }\n },\n onSuccess: async () => {\n setNewWebhookUrl('');\n setNewWebhookSecret('');\n await queryClient.invalidateQueries({ queryKey: ['webhooks'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const deleteWebhookMutation = useMutation({\n mutationFn: async (id: string) => {\n const res = await fetch(`/api/webhooks/${id}`, { method: 'DELETE' });\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.deleteFailed')));\n }\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['webhooks'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const webhooks = webhooksQuery.data?.webhooks ?? [];\n\n return (\n <div\n className=\"mx-auto flex w-full max-w-6xl flex-col gap-4 p-3 pb-[calc(2rem+env(safe-area-inset-bottom))] sm:gap-6 sm:p-5\"\n data-testid=\"settings-page\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'site' ? 'default' : 'outline'}\n data-testid=\"settings-tab-site\"\n onClick={() => setActiveTab('site')}\n >\n {t('settings.siteSettings')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'notifications' ? 'default' : 'outline'}\n data-testid=\"settings-tab-notifications\"\n onClick={() => setActiveTab('notifications')}\n >\n {t('settings.notificationsTab')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'telegram' ? 'default' : 'outline'}\n data-testid=\"settings-tab-telegram\"\n onClick={() => setActiveTab('telegram')}\n >\n {t('telegram.title')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'webhooks' ? 'default' : 'outline'}\n data-testid=\"settings-tab-webhooks\"\n onClick={() => setActiveTab('webhooks')}\n >\n {t('webhook.title')}\n </Button>\n </div>\n\n {activeTab === 'site' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('settings.siteSettings')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"site-name-input\">\n {t('settings.siteName')}\n </label>\n <Input\n id=\"site-name-input\"\n value={siteName}\n onChange={(event) => setSiteName(event.target.value)}\n placeholder={t('settings.siteNamePlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"site-url-input\">\n {t('settings.siteUrl')}\n </label>\n <Input\n id=\"site-url-input\"\n value={siteUrl}\n onChange={(event) => setSiteUrl(event.target.value)}\n placeholder={t('settings.siteUrlPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"language-select\">\n {t('settings.language')}\n </label>\n <Select\n value={language}\n onValueChange={(nextValue) => {\n if (!nextValue) return;\n setLanguage(nextValue as LocaleCode);\n }}\n >\n <SelectTrigger\n id=\"language-select\"\n data-testid=\"settings-language-select\"\n className=\"w-full min-h-10\"\n >\n <SelectValue placeholder={t('settings.language')}>\n {I18N_MANIFEST.locales.find((l) => l.code === language)?.nativeName ?? language}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-[var(--tmex-viewport-height)]\">\n {I18N_MANIFEST.locales.map((locale) => (\n <SelectItem key={locale.code} value={locale.code}>\n {locale.nativeName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {showRefreshNotice && (\n <p className=\"mt-1 text-xs text-primary\" data-testid=\"settings-refresh-notice\">\n {t('settings.refreshToApply')}\n </p>\n )}\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.theme')}</div>\n </div>\n <Switch\n checked={isDark}\n onCheckedChange={(checked) => handleThemeChange(Boolean(checked))}\n data-testid=\"settings-theme-toggle\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'notifications' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('settings.notificationsTab')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.enableBrowserBellToast')}</div>\n </div>\n <Switch\n checked={enableBrowserBellToast}\n onCheckedChange={(checked) => setEnableBrowserBellToast(Boolean(checked))}\n data-testid=\"settings-enable-browser-bell-toast\"\n />\n </div>\n\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.enableTelegramBellPush')}</div>\n </div>\n <Switch\n checked={enableTelegramBellPush}\n onCheckedChange={(checked) => setEnableTelegramBellPush(Boolean(checked))}\n data-testid=\"settings-enable-telegram-bell-push\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"bell-throttle-input\">\n {t('settings.bellThrottle')}\n </label>\n <Input\n id=\"bell-throttle-input\"\n type=\"number\"\n value={bellThrottleSeconds}\n min={0}\n max={300}\n onChange={(event) => setBellThrottleSeconds(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"ssh-reconnect-retries-input\">\n {t('settings.sshReconnectMaxRetries')}\n </label>\n <Input\n id=\"ssh-reconnect-retries-input\"\n type=\"number\"\n value={sshReconnectMaxRetries}\n min={0}\n max={20}\n onChange={(event) => setSshReconnectMaxRetries(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"ssh-reconnect-delay-input\">\n {t('settings.sshReconnectDelay')}\n </label>\n <Input\n id=\"ssh-reconnect-delay-input\"\n type=\"number\"\n value={sshReconnectDelaySeconds}\n min={1}\n max={300}\n onChange={(event) => setSshReconnectDelaySeconds(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'telegram' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('telegram.title')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"new-bot-name\">\n {t('telegram.botName')}\n </label>\n <Input\n id=\"new-bot-name\"\n value={newBotName}\n onChange={(event) => setNewBotName(event.target.value)}\n placeholder={t('telegram.botNamePlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-6 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"new-bot-token\">\n {t('telegram.botToken')}\n </label>\n <Input\n id=\"new-bot-token\"\n type=\"password\"\n value={newBotToken}\n onChange={(event) => setNewBotToken(event.target.value)}\n placeholder={t('telegram.botTokenPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-2\">\n <Button\n variant=\"default\"\n className=\"w-full md:w-auto\"\n data-testid=\"telegram-add-bot\"\n onClick={() => createBotMutation.mutate()}\n disabled={\n createBotMutation.isPending || !newBotName.trim() || !newBotToken.trim()\n }\n >\n {createBotMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n {t('telegram.addBot')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {botsQuery.isLoading && (\n <div className=\"text-sm text-muted-foreground\">{t('common.loading')}</div>\n )}\n\n {!botsQuery.isLoading && bots.length === 0 && (\n <div className=\"text-sm text-muted-foreground\">{t('telegram.addBot')}</div>\n )}\n\n {bots.map((bot) => (\n <BotCard\n key={bot.id}\n bot={bot}\n expanded={expandedBotId === bot.id}\n onToggleExpand={() => {\n setExpandedBotId((prev) => (prev === bot.id ? null : bot.id));\n }}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'webhooks' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('webhook.title')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-6 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"webhook-url-input\">\n {t('webhook.url')}\n </label>\n <Input\n id=\"webhook-url-input\"\n data-testid=\"webhook-url-input\"\n value={newWebhookUrl}\n onChange={(event) => setNewWebhookUrl(event.target.value)}\n placeholder=\"https://example.com/webhook\"\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"webhook-secret-input\">\n {t('webhook.secret')}\n </label>\n <Input\n id=\"webhook-secret-input\"\n data-testid=\"webhook-secret-input\"\n value={newWebhookSecret}\n onChange={(event) => setNewWebhookSecret(event.target.value)}\n placeholder={t('webhook.secretPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-2\">\n <Button\n variant=\"default\"\n className=\"w-full md:w-auto\"\n data-testid=\"webhook-add\"\n onClick={() => createWebhookMutation.mutate()}\n disabled={\n createWebhookMutation.isPending ||\n !newWebhookUrl.trim() ||\n !newWebhookSecret.trim()\n }\n >\n {createWebhookMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n {t('webhook.add')}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n {webhooksQuery.isLoading && (\n <div className=\"text-sm text-muted-foreground\">{t('common.loading')}</div>\n )}\n\n {!webhooksQuery.isLoading && webhooks.length === 0 && (\n <div className=\"text-sm text-muted-foreground\">{t('webhook.empty')}</div>\n )}\n\n {webhooks.map((webhook) => (\n <div\n key={webhook.id}\n data-testid=\"webhook-item\"\n data-webhook-url={webhook.url}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border bg-card px-4 py-2.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{webhook.url}</div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(webhook.createdAt).toLocaleString(toBCP47Locale(language))}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n data-testid=\"webhook-delete\"\n onClick={() => deleteWebhookMutation.mutate(webhook.id)}\n disabled={deleteWebhookMutation.isPending}\n aria-label={t('common.delete')}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {(activeTab === 'site' || activeTab === 'notifications') && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end\">\n <Button\n variant=\"default\"\n data-testid=\"settings-save\"\n onClick={() => saveSiteMutation.mutate()}\n disabled={saveSiteMutation.isPending}\n className=\"w-full sm:w-auto\"\n >\n <Save className=\"h-4 w-4\" />\n {t('common.save')}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\ninterface BotCardProps {\n bot: TelegramBotWithStats;\n expanded: boolean;\n onToggleExpand: () => void;\n}\n\nfunction BotCard({ bot, expanded, onToggleExpand }: BotCardProps) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n\n const [name, setName] = useState(bot.name);\n const [token, setToken] = useState('');\n const [enabled, setEnabled] = useState(bot.enabled);\n const [allowAuthRequests, setAllowAuthRequests] = useState(bot.allowAuthRequests);\n\n useEffect(() => {\n setName(bot.name);\n setEnabled(bot.enabled);\n setAllowAuthRequests(bot.allowAuthRequests);\n }, [bot.allowAuthRequests, bot.enabled, bot.name]);\n\n const chatsQuery = useQuery({\n queryKey: ['telegram-bot-chats', bot.id],\n enabled: expanded,\n queryFn: async () => {\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}/chats`);\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.loadChatsFailed')));\n }\n return (await res.json()) as TelegramChatsResponse;\n },\n });\n\n const groupedChats = useMemo(() => {\n const chats = chatsQuery.data?.chats ?? [];\n return {\n pending: chats.filter((chat) => chat.status === 'pending'),\n authorized: chats.filter((chat) => chat.status === 'authorized'),\n };\n }, [chatsQuery.data?.chats]);\n\n const patchBotMutation = useMutation({\n mutationFn: async () => {\n const payload: Record<string, unknown> = {\n name,\n enabled,\n allowAuthRequests,\n };\n if (token.trim()) {\n payload.token = token.trim();\n }\n\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.updateFailed')));\n }\n },\n onSuccess: async () => {\n setToken('');\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const deleteBotMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}`, {\n method: 'DELETE',\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.deleteFailed')));\n }\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const approveMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}/approve`,\n {\n method: 'POST',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.approveFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['telegram-bots'] }),\n queryClient.invalidateQueries({ queryKey: ['telegram-bot-chats', bot.id] }),\n ]);\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const removeChatMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}`,\n {\n method: 'DELETE',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.removeFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['telegram-bots'] }),\n queryClient.invalidateQueries({ queryKey: ['telegram-bot-chats', bot.id] }),\n ]);\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const testChatMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}/test`,\n {\n method: 'POST',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.testMessageFailed')));\n }\n },\n onSuccess: () => {\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n return (\n <div\n className=\"space-y-4 rounded-md border-0 bg-card p-4\"\n data-testid={`telegram-bot-card-${bot.id}`}\n data-bot-name={bot.name}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"font-medium\">{bot.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {bot.authorizedCount} / {bot.pendingCount}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n data-testid={`telegram-bot-toggle-${bot.id}`}\n onClick={onToggleExpand}\n >\n {expanded ? t('common.collapse') : t('common.expand')}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-3 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor={`bot-name-${bot.id}`}>\n {t('telegram.botName')}\n </label>\n <Input\n id={`bot-name-${bot.id}`}\n value={name}\n onChange={(event) => setName(event.target.value)}\n className=\"min-h-10\"\n />\n </div>\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor={`bot-token-${bot.id}`}>\n {t('telegram.botToken')}\n </label>\n <Input\n id={`bot-token-${bot.id}`}\n type=\"password\"\n value={token}\n onChange={(event) => setToken(event.target.value)}\n placeholder={t('telegram.tokenPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <div className=\"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5\">\n <span className=\"text-sm font-medium\">{t('common.enabled')}</span>\n <Switch checked={enabled} onCheckedChange={(checked) => setEnabled(Boolean(checked))} />\n </div>\n </div>\n <div className=\"md:col-span-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5\">\n <span className=\"text-sm font-medium\">{t('telegram.allowAuthRequests')}</span>\n <Switch\n checked={allowAuthRequests}\n onCheckedChange={(checked) => setAllowAuthRequests(Boolean(checked))}\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end\">\n <Button\n variant=\"destructive\"\n data-testid={`telegram-bot-delete-${bot.id}`}\n onClick={() => deleteBotMutation.mutate()}\n className=\"w-full sm:w-auto\"\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('telegram.deleteBot')}\n </Button>\n <Button\n variant=\"default\"\n data-testid={`telegram-bot-save-${bot.id}`}\n onClick={() => patchBotMutation.mutate()}\n className=\"w-full sm:w-auto\"\n >\n <Save className=\"h-4 w-4\" />\n {t('common.save')}\n </Button>\n </div>\n\n {expanded && (\n <div className=\"grid grid-cols-1 gap-4 border-t border-border pt-4 lg:grid-cols-2\">\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold flex items-center gap-1\">\n <Shield className=\"h-4 w-4\" />\n {t('telegram.pendingChats')}\n </h3>\n {groupedChats.pending.length === 0 && <div className=\"text-xs text-muted-foreground\">-</div>}\n {groupedChats.pending.map((chat) => (\n <ChatRow\n key={`${chat.botId}-${chat.chatId}`}\n chat={chat}\n pending\n onApprove={() => approveMutation.mutate(chat.chatId)}\n onDelete={() => removeChatMutation.mutate(chat.chatId)}\n />\n ))}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold flex items-center gap-1\">\n <Shield className=\"h-4 w-4\" />\n {t('telegram.chats')}\n </h3>\n {groupedChats.authorized.length === 0 && <div className=\"text-xs text-muted-foreground\">-</div>}\n {groupedChats.authorized.map((chat) => (\n <ChatRow\n key={`${chat.botId}-${chat.chatId}`}\n chat={chat}\n pending={false}\n onTest={() => testChatMutation.mutate(chat.chatId)}\n onDelete={() => removeChatMutation.mutate(chat.chatId)}\n />\n ))}\n </div>\n\n {chatsQuery.isLoading && (\n <div className=\"lg:col-span-2 text-xs text-muted-foreground\">\n {t('common.loading')}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\ninterface ChatRowProps {\n chat: TelegramBotChat;\n pending: boolean;\n onApprove?: () => void;\n onDelete: () => void;\n onTest?: () => void;\n}\n\nfunction ChatRow({ chat, pending, onApprove, onDelete, onTest }: ChatRowProps) {\n const { t } = useTranslation();\n const language = useSiteStore((state) => state.settings?.language ?? 'en_US');\n return (\n <div className=\"space-y-2 rounded border-0 bg-background p-3\">\n <div className=\"text-sm font-medium truncate\" title={chat.displayName}>\n {chat.displayName}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {t('telegram.chatId')}:{chat.chatId}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(chat.appliedAt).toLocaleString(toBCP47Locale(language))}\n </div>\n\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n {pending ? (\n <>\n <Button variant=\"outline\" size=\"sm\" onClick={onDelete}>\n {t('telegram.reject')}\n </Button>\n <Button variant=\"default\" size=\"sm\" onClick={onApprove}>\n {t('telegram.authorize')}\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={onTest}>\n <Send className=\"h-3.5 w-3.5\" />\n {t('telegram.sendTestMessage')}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onDelete}>\n {t('common.delete')}\n </Button>\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Page title component\nexport function PageTitle() {\n const { t } = useTranslation();\n return <>{t('sidebar.settings')}</>;\n}\n\n// Page actions component\nexport function PageActions() {\n const { t } = useTranslation();\n const [showRestartConfirm, setShowRestartConfirm] = useState(false);\n\n const restartMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/settings/restart', { method: 'POST' });\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.restartFailed')));\n }\n },\n onSuccess: () => {\n toast.success(t('settings.restartScheduled'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setShowRestartConfirm(true)}\n disabled={restartMutation.isPending}\n aria-label={t('settings.restartGateway')}\n title={t('settings.restartGateway')}\n className=\"text-destructive hover:text-destructive hover:bg-destructive/10\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRestartConfirm} onOpenChange={setShowRestartConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('settings.restartGateway')}</AlertDialogTitle>\n <AlertDialogDescription>{t('settings.restartConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRestartConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n restartMutation.mutate();\n setShowRestartConfirm(false);\n }}\n >\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","RotateCcw","createLucideIcon","Save","Shield","parseApiError","res","fallback","SettingsPage","t","useTranslation","queryClient","useQueryClient","refreshSettings","useSiteStore","activeTab","setActiveTab","useState","theme","useUIStore","state","setTheme","isDark","siteName","setSiteName","siteUrl","setSiteUrl","language","setLanguage","bellThrottleSeconds","setBellThrottleSeconds","enableBrowserBellToast","setEnableBrowserBellToast","enableTelegramBellPush","setEnableTelegramBellPush","sshReconnectMaxRetries","setSshReconnectMaxRetries","sshReconnectDelaySeconds","setSshReconnectDelaySeconds","showRefreshNotice","setShowRefreshNotice","newBotName","setNewBotName","newBotToken","setNewBotToken","expandedBotId","setExpandedBotId","newWebhookUrl","setNewWebhookUrl","newWebhookSecret","setNewWebhookSecret","handleThemeChange","checked","nextTheme","settingsQuery","useQuery","botsQuery","useEffect","settings","_a","saveSiteMutation","useMutation","toast","_b","i18n","err","createBotMutation","bots","webhooksQuery","createWebhookMutation","deleteWebhookMutation","id","webhooks","_c","jsxs","jsx","Button","Card","CardHeader","CardTitle","CardContent","Input","event","Select","nextValue","SelectTrigger","SelectValue","_d","I18N_MANIFEST","l","SelectContent","locale","SelectItem","Switch","Loader2","bot","BotCard","prev","webhook","toBCP47Locale","Trash2","expanded","onToggleExpand","name","setName","token","setToken","enabled","setEnabled","allowAuthRequests","setAllowAuthRequests","chatsQuery","groupedChats","useMemo","chats","chat","patchBotMutation","payload","deleteBotMutation","approveMutation","chatId","removeChatMutation","testChatMutation","ChatRow","pending","onApprove","onDelete","onTest","Fragment","Send","PageTitle","PageActions","showRestartConfirm","setShowRestartConfirm","restartMutation","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"SettingsPage-BDVq_Akt.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/save.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/shield.js","../../src/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n];\nconst RotateCcw = createLucideIcon(\"rotate-ccw\", __iconNode);\n\nexport { __iconNode, RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport type {\n LocaleCode,\n SiteSettings,\n TelegramBotChat,\n TelegramBotWithStats,\n UpdateSiteSettingsRequest,\n WebhookEndpoint,\n} from '@tmex/shared';\nimport { I18N_MANIFEST, toBCP47 as toBCP47Locale } from '@tmex/shared';\nimport { Loader2, RotateCcw, Save, Send, Shield, Trash2 } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport i18n from '../i18n';\nimport { toast } from 'sonner';\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Input } from '@/components/ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Switch } from '@/components/ui/switch';\nimport { useSiteStore } from '../stores/site';\nimport { useUIStore } from '../stores/ui';\n\ninterface TelegramBotsResponse {\n bots: TelegramBotWithStats[];\n}\n\ninterface TelegramChatsResponse {\n chats: TelegramBotChat[];\n}\n\ninterface SiteSettingsResponse {\n settings: SiteSettings;\n}\n\ninterface WebhooksResponse {\n webhooks: WebhookEndpoint[];\n}\n\nasync function parseApiError(res: Response, fallback: string): Promise<string> {\n try {\n const payload = (await res.json()) as { error?: string };\n return payload.error ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nexport default function SettingsPage() {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { refreshSettings } = useSiteStore();\n\n const [activeTab, setActiveTab] = useState<'site' | 'notifications' | 'telegram' | 'webhooks'>(\n 'site'\n );\n\n const theme = useUIStore((state) => state.theme);\n const setTheme = useUIStore((state) => state.setTheme);\n const isDark = theme === 'dark';\n\n // Site settings state\n const [siteName, setSiteName] = useState('tmex');\n const [siteUrl, setSiteUrl] = useState(window.location.origin);\n const [language, setLanguage] = useState<LocaleCode>('en_US');\n\n // Notifications state\n const [bellThrottleSeconds, setBellThrottleSeconds] = useState(6);\n const [enableBrowserBellToast, setEnableBrowserBellToast] = useState(true);\n const [enableTelegramBellPush, setEnableTelegramBellPush] = useState(true);\n const [sshReconnectMaxRetries, setSshReconnectMaxRetries] = useState(2);\n const [sshReconnectDelaySeconds, setSshReconnectDelaySeconds] = useState(10);\n const [showRefreshNotice, setShowRefreshNotice] = useState(false);\n\n // Telegram state\n const [newBotName, setNewBotName] = useState('');\n const [newBotToken, setNewBotToken] = useState('');\n const [expandedBotId, setExpandedBotId] = useState<string | null>(null);\n\n // Webhook state\n const [newWebhookUrl, setNewWebhookUrl] = useState('');\n const [newWebhookSecret, setNewWebhookSecret] = useState('');\n\n const handleThemeChange = (checked: boolean) => {\n const nextTheme = checked ? 'dark' : 'light';\n setTheme(nextTheme);\n document.documentElement.classList.toggle('dark', nextTheme === 'dark');\n };\n\n const settingsQuery = useQuery({\n queryKey: ['site-settings'],\n queryFn: async () => {\n const res = await fetch('/api/settings/site');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.loadFailed')));\n }\n return (await res.json()) as SiteSettingsResponse;\n },\n });\n\n const botsQuery = useQuery({\n queryKey: ['telegram-bots'],\n queryFn: async () => {\n const res = await fetch('/api/settings/telegram/bots');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.loadBotsFailed')));\n }\n return (await res.json()) as TelegramBotsResponse;\n },\n });\n\n useEffect(() => {\n const settings = settingsQuery.data?.settings;\n if (!settings) {\n return;\n }\n\n setSiteName(settings.siteName);\n setSiteUrl(settings.siteUrl);\n setLanguage(settings.language ?? 'en_US');\n setBellThrottleSeconds(settings.bellThrottleSeconds);\n setEnableBrowserBellToast(settings.enableBrowserBellToast ?? true);\n setEnableTelegramBellPush(settings.enableTelegramBellPush ?? true);\n setSshReconnectMaxRetries(settings.sshReconnectMaxRetries);\n setSshReconnectDelaySeconds(settings.sshReconnectDelaySeconds);\n }, [settingsQuery.data?.settings]);\n\n const saveSiteMutation = useMutation({\n mutationFn: async () => {\n const payload: UpdateSiteSettingsRequest = {\n siteName,\n siteUrl,\n language,\n bellThrottleSeconds,\n enableBrowserBellToast,\n enableTelegramBellPush,\n sshReconnectMaxRetries,\n sshReconnectDelaySeconds,\n };\n\n const res = await fetch('/api/settings/site', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.saveFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['site-settings'] }),\n refreshSettings(),\n ]);\n toast.success(t('settings.settingsSaved'));\n if (settingsQuery.data?.settings?.language !== language) {\n void i18n.changeLanguage(language);\n setShowRefreshNotice(true);\n }\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const createBotMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/settings/telegram/bots', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: newBotName,\n token: newBotToken,\n enabled: true,\n allowAuthRequests: true,\n }),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.createFailed')));\n }\n },\n onSuccess: async () => {\n setNewBotName('');\n setNewBotToken('');\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const bots = botsQuery.data?.bots ?? [];\n\n const webhooksQuery = useQuery({\n queryKey: ['webhooks'],\n queryFn: async () => {\n const res = await fetch('/api/webhooks');\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.loadFailed')));\n }\n return (await res.json()) as WebhooksResponse;\n },\n });\n\n const createWebhookMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/webhooks', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: newWebhookUrl,\n secret: newWebhookSecret,\n }),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.createFailed')));\n }\n },\n onSuccess: async () => {\n setNewWebhookUrl('');\n setNewWebhookSecret('');\n await queryClient.invalidateQueries({ queryKey: ['webhooks'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const deleteWebhookMutation = useMutation({\n mutationFn: async (id: string) => {\n const res = await fetch(`/api/webhooks/${id}`, { method: 'DELETE' });\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('webhook.deleteFailed')));\n }\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['webhooks'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const webhooks = webhooksQuery.data?.webhooks ?? [];\n\n return (\n <div\n className=\"mx-auto flex w-full max-w-6xl flex-col gap-4 p-3 pb-[calc(2rem+env(safe-area-inset-bottom))] sm:gap-6 sm:p-5\"\n data-testid=\"settings-page\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'site' ? 'default' : 'outline'}\n data-testid=\"settings-tab-site\"\n onClick={() => setActiveTab('site')}\n >\n {t('settings.siteSettings')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'notifications' ? 'default' : 'outline'}\n data-testid=\"settings-tab-notifications\"\n onClick={() => setActiveTab('notifications')}\n >\n {t('settings.notificationsTab')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'telegram' ? 'default' : 'outline'}\n data-testid=\"settings-tab-telegram\"\n onClick={() => setActiveTab('telegram')}\n >\n {t('telegram.title')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={activeTab === 'webhooks' ? 'default' : 'outline'}\n data-testid=\"settings-tab-webhooks\"\n onClick={() => setActiveTab('webhooks')}\n >\n {t('webhook.title')}\n </Button>\n </div>\n\n {activeTab === 'site' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('settings.siteSettings')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"site-name-input\">\n {t('settings.siteName')}\n </label>\n <Input\n id=\"site-name-input\"\n value={siteName}\n onChange={(event) => setSiteName(event.target.value)}\n placeholder={t('settings.siteNamePlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"site-url-input\">\n {t('settings.siteUrl')}\n </label>\n <Input\n id=\"site-url-input\"\n value={siteUrl}\n onChange={(event) => setSiteUrl(event.target.value)}\n placeholder={t('settings.siteUrlPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"language-select\">\n {t('settings.language')}\n </label>\n <Select\n value={language}\n onValueChange={(nextValue) => {\n if (!nextValue) return;\n setLanguage(nextValue as LocaleCode);\n }}\n >\n <SelectTrigger\n id=\"language-select\"\n data-testid=\"settings-language-select\"\n className=\"w-full min-h-10\"\n >\n <SelectValue placeholder={t('settings.language')}>\n {I18N_MANIFEST.locales.find((l) => l.code === language)?.nativeName ?? language}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-[var(--tmex-viewport-height)]\">\n {I18N_MANIFEST.locales.map((locale) => (\n <SelectItem key={locale.code} value={locale.code}>\n {locale.nativeName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {showRefreshNotice && (\n <p className=\"mt-1 text-xs text-primary\" data-testid=\"settings-refresh-notice\">\n {t('settings.refreshToApply')}\n </p>\n )}\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.theme')}</div>\n </div>\n <Switch\n checked={isDark}\n onCheckedChange={(checked) => handleThemeChange(Boolean(checked))}\n data-testid=\"settings-theme-toggle\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'notifications' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('settings.notificationsTab')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.enableBrowserBellToast')}</div>\n </div>\n <Switch\n checked={enableBrowserBellToast}\n onCheckedChange={(checked) => setEnableBrowserBellToast(Boolean(checked))}\n data-testid=\"settings-enable-browser-bell-toast\"\n />\n </div>\n\n <div className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-2.5\">\n <div className=\"min-w-0 pr-2\">\n <div className=\"text-sm font-medium\">{t('settings.enableTelegramBellPush')}</div>\n </div>\n <Switch\n checked={enableTelegramBellPush}\n onCheckedChange={(checked) => setEnableTelegramBellPush(Boolean(checked))}\n data-testid=\"settings-enable-telegram-bell-push\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"bell-throttle-input\">\n {t('settings.bellThrottle')}\n </label>\n <Input\n id=\"bell-throttle-input\"\n type=\"number\"\n value={bellThrottleSeconds}\n min={0}\n max={300}\n onChange={(event) => setBellThrottleSeconds(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"ssh-reconnect-retries-input\">\n {t('settings.sshReconnectMaxRetries')}\n </label>\n <Input\n id=\"ssh-reconnect-retries-input\"\n type=\"number\"\n value={sshReconnectMaxRetries}\n min={0}\n max={20}\n onChange={(event) => setSshReconnectMaxRetries(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"ssh-reconnect-delay-input\">\n {t('settings.sshReconnectDelay')}\n </label>\n <Input\n id=\"ssh-reconnect-delay-input\"\n type=\"number\"\n value={sshReconnectDelaySeconds}\n min={1}\n max={300}\n onChange={(event) => setSshReconnectDelaySeconds(Number(event.target.value))}\n className=\"min-h-10\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'telegram' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('telegram.title')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"new-bot-name\">\n {t('telegram.botName')}\n </label>\n <Input\n id=\"new-bot-name\"\n value={newBotName}\n onChange={(event) => setNewBotName(event.target.value)}\n placeholder={t('telegram.botNamePlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-6 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"new-bot-token\">\n {t('telegram.botToken')}\n </label>\n <Input\n id=\"new-bot-token\"\n type=\"password\"\n value={newBotToken}\n onChange={(event) => setNewBotToken(event.target.value)}\n placeholder={t('telegram.botTokenPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-2\">\n <Button\n variant=\"default\"\n className=\"w-full md:w-auto\"\n data-testid=\"telegram-add-bot\"\n onClick={() => createBotMutation.mutate()}\n disabled={\n createBotMutation.isPending || !newBotName.trim() || !newBotToken.trim()\n }\n >\n {createBotMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n {t('telegram.addBot')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {botsQuery.isLoading && (\n <div className=\"text-sm text-muted-foreground\">{t('common.loading')}</div>\n )}\n\n {!botsQuery.isLoading && bots.length === 0 && (\n <div className=\"text-sm text-muted-foreground\">{t('telegram.addBot')}</div>\n )}\n\n {bots.map((bot) => (\n <BotCard\n key={bot.id}\n bot={bot}\n expanded={expandedBotId === bot.id}\n onToggleExpand={() => {\n setExpandedBotId((prev) => (prev === bot.id ? null : bot.id));\n }}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'webhooks' && (\n <Card className=\"border-0 ring-0\">\n <CardHeader>\n <CardTitle>{t('webhook.title')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-6 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"webhook-url-input\">\n {t('webhook.url')}\n </label>\n <Input\n id=\"webhook-url-input\"\n data-testid=\"webhook-url-input\"\n value={newWebhookUrl}\n onChange={(event) => setNewWebhookUrl(event.target.value)}\n placeholder=\"https://example.com/webhook\"\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor=\"webhook-secret-input\">\n {t('webhook.secret')}\n </label>\n <Input\n id=\"webhook-secret-input\"\n data-testid=\"webhook-secret-input\"\n value={newWebhookSecret}\n onChange={(event) => setNewWebhookSecret(event.target.value)}\n placeholder={t('webhook.secretPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n\n <div className=\"md:col-span-2\">\n <Button\n variant=\"default\"\n className=\"w-full md:w-auto\"\n data-testid=\"webhook-add\"\n onClick={() => createWebhookMutation.mutate()}\n disabled={\n createWebhookMutation.isPending ||\n !newWebhookUrl.trim() ||\n !newWebhookSecret.trim()\n }\n >\n {createWebhookMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n {t('webhook.add')}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n {webhooksQuery.isLoading && (\n <div className=\"text-sm text-muted-foreground\">{t('common.loading')}</div>\n )}\n\n {!webhooksQuery.isLoading && webhooks.length === 0 && (\n <div className=\"text-sm text-muted-foreground\">{t('webhook.empty')}</div>\n )}\n\n {webhooks.map((webhook) => (\n <div\n key={webhook.id}\n data-testid=\"webhook-item\"\n data-webhook-url={webhook.url}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border bg-card px-4 py-2.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{webhook.url}</div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(webhook.createdAt).toLocaleString(toBCP47Locale(language))}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n data-testid=\"webhook-delete\"\n onClick={() => deleteWebhookMutation.mutate(webhook.id)}\n disabled={deleteWebhookMutation.isPending}\n aria-label={t('common.delete')}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {(activeTab === 'site' || activeTab === 'notifications') && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end\">\n <Button\n variant=\"default\"\n data-testid=\"settings-save\"\n onClick={() => saveSiteMutation.mutate()}\n disabled={saveSiteMutation.isPending}\n className=\"w-full sm:w-auto\"\n >\n <Save className=\"h-4 w-4\" />\n {t('common.save')}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\ninterface BotCardProps {\n bot: TelegramBotWithStats;\n expanded: boolean;\n onToggleExpand: () => void;\n}\n\nfunction BotCard({ bot, expanded, onToggleExpand }: BotCardProps) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n\n const [name, setName] = useState(bot.name);\n const [token, setToken] = useState('');\n const [enabled, setEnabled] = useState(bot.enabled);\n const [allowAuthRequests, setAllowAuthRequests] = useState(bot.allowAuthRequests);\n\n useEffect(() => {\n setName(bot.name);\n setEnabled(bot.enabled);\n setAllowAuthRequests(bot.allowAuthRequests);\n }, [bot.allowAuthRequests, bot.enabled, bot.name]);\n\n const chatsQuery = useQuery({\n queryKey: ['telegram-bot-chats', bot.id],\n enabled: expanded,\n queryFn: async () => {\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}/chats`);\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.loadChatsFailed')));\n }\n return (await res.json()) as TelegramChatsResponse;\n },\n });\n\n const groupedChats = useMemo(() => {\n const chats = chatsQuery.data?.chats ?? [];\n return {\n pending: chats.filter((chat) => chat.status === 'pending'),\n authorized: chats.filter((chat) => chat.status === 'authorized'),\n };\n }, [chatsQuery.data?.chats]);\n\n const patchBotMutation = useMutation({\n mutationFn: async () => {\n const payload: Record<string, unknown> = {\n name,\n enabled,\n allowAuthRequests,\n };\n if (token.trim()) {\n payload.token = token.trim();\n }\n\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.updateFailed')));\n }\n },\n onSuccess: async () => {\n setToken('');\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const deleteBotMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch(`/api/settings/telegram/bots/${bot.id}`, {\n method: 'DELETE',\n });\n\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.deleteFailed')));\n }\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['telegram-bots'] });\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const approveMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}/approve`,\n {\n method: 'POST',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.approveFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['telegram-bots'] }),\n queryClient.invalidateQueries({ queryKey: ['telegram-bot-chats', bot.id] }),\n ]);\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const removeChatMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}`,\n {\n method: 'DELETE',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.removeFailed')));\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: ['telegram-bots'] }),\n queryClient.invalidateQueries({ queryKey: ['telegram-bot-chats', bot.id] }),\n ]);\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n const testChatMutation = useMutation({\n mutationFn: async (chatId: string) => {\n const res = await fetch(\n `/api/settings/telegram/bots/${bot.id}/chats/${encodeURIComponent(chatId)}/test`,\n {\n method: 'POST',\n }\n );\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('telegram.testMessageFailed')));\n }\n },\n onSuccess: () => {\n toast.success(t('common.success'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n return (\n <div\n className=\"space-y-4 rounded-md border-0 bg-card p-4\"\n data-testid={`telegram-bot-card-${bot.id}`}\n data-bot-name={bot.name}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"font-medium\">{bot.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {bot.authorizedCount} / {bot.pendingCount}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n data-testid={`telegram-bot-toggle-${bot.id}`}\n onClick={onToggleExpand}\n >\n {expanded ? t('common.collapse') : t('common.expand')}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-12 md:items-end\">\n <div className=\"md:col-span-3 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor={`bot-name-${bot.id}`}>\n {t('telegram.botName')}\n </label>\n <Input\n id={`bot-name-${bot.id}`}\n value={name}\n onChange={(event) => setName(event.target.value)}\n className=\"min-h-10\"\n />\n </div>\n <div className=\"md:col-span-4 space-y-2\">\n <label className=\"block text-sm font-medium\" htmlFor={`bot-token-${bot.id}`}>\n {t('telegram.botToken')}\n </label>\n <Input\n id={`bot-token-${bot.id}`}\n type=\"password\"\n value={token}\n onChange={(event) => setToken(event.target.value)}\n placeholder={t('telegram.tokenPlaceholder')}\n className=\"min-h-10\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <div className=\"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5\">\n <span className=\"text-sm font-medium\">{t('common.enabled')}</span>\n <Switch checked={enabled} onCheckedChange={(checked) => setEnabled(Boolean(checked))} />\n </div>\n </div>\n <div className=\"md:col-span-3\">\n <div className=\"flex min-h-10 items-center justify-between gap-3 rounded-lg border border-border bg-background px-3 py-2.5\">\n <span className=\"text-sm font-medium\">{t('telegram.allowAuthRequests')}</span>\n <Switch\n checked={allowAuthRequests}\n onCheckedChange={(checked) => setAllowAuthRequests(Boolean(checked))}\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end\">\n <Button\n variant=\"destructive\"\n data-testid={`telegram-bot-delete-${bot.id}`}\n onClick={() => deleteBotMutation.mutate()}\n className=\"w-full sm:w-auto\"\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('telegram.deleteBot')}\n </Button>\n <Button\n variant=\"default\"\n data-testid={`telegram-bot-save-${bot.id}`}\n onClick={() => patchBotMutation.mutate()}\n className=\"w-full sm:w-auto\"\n >\n <Save className=\"h-4 w-4\" />\n {t('common.save')}\n </Button>\n </div>\n\n {expanded && (\n <div className=\"grid grid-cols-1 gap-4 border-t border-border pt-4 lg:grid-cols-2\">\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold flex items-center gap-1\">\n <Shield className=\"h-4 w-4\" />\n {t('telegram.pendingChats')}\n </h3>\n {groupedChats.pending.length === 0 && <div className=\"text-xs text-muted-foreground\">-</div>}\n {groupedChats.pending.map((chat) => (\n <ChatRow\n key={`${chat.botId}-${chat.chatId}`}\n chat={chat}\n pending\n onApprove={() => approveMutation.mutate(chat.chatId)}\n onDelete={() => removeChatMutation.mutate(chat.chatId)}\n />\n ))}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold flex items-center gap-1\">\n <Shield className=\"h-4 w-4\" />\n {t('telegram.chats')}\n </h3>\n {groupedChats.authorized.length === 0 && <div className=\"text-xs text-muted-foreground\">-</div>}\n {groupedChats.authorized.map((chat) => (\n <ChatRow\n key={`${chat.botId}-${chat.chatId}`}\n chat={chat}\n pending={false}\n onTest={() => testChatMutation.mutate(chat.chatId)}\n onDelete={() => removeChatMutation.mutate(chat.chatId)}\n />\n ))}\n </div>\n\n {chatsQuery.isLoading && (\n <div className=\"lg:col-span-2 text-xs text-muted-foreground\">\n {t('common.loading')}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\ninterface ChatRowProps {\n chat: TelegramBotChat;\n pending: boolean;\n onApprove?: () => void;\n onDelete: () => void;\n onTest?: () => void;\n}\n\nfunction ChatRow({ chat, pending, onApprove, onDelete, onTest }: ChatRowProps) {\n const { t } = useTranslation();\n const language = useSiteStore((state) => state.settings?.language ?? 'en_US');\n return (\n <div className=\"space-y-2 rounded border-0 bg-background p-3\">\n <div className=\"text-sm font-medium truncate\" title={chat.displayName}>\n {chat.displayName}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {t('telegram.chatId')}:{chat.chatId}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(chat.appliedAt).toLocaleString(toBCP47Locale(language))}\n </div>\n\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n {pending ? (\n <>\n <Button variant=\"outline\" size=\"sm\" onClick={onDelete}>\n {t('telegram.reject')}\n </Button>\n <Button variant=\"default\" size=\"sm\" onClick={onApprove}>\n {t('telegram.authorize')}\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={onTest}>\n <Send className=\"h-3.5 w-3.5\" />\n {t('telegram.sendTestMessage')}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onDelete}>\n {t('common.delete')}\n </Button>\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Page title component\nexport function PageTitle() {\n const { t } = useTranslation();\n return <>{t('sidebar.settings')}</>;\n}\n\n// Page actions component\nexport function PageActions() {\n const { t } = useTranslation();\n const [showRestartConfirm, setShowRestartConfirm] = useState(false);\n\n const restartMutation = useMutation({\n mutationFn: async () => {\n const res = await fetch('/api/settings/restart', { method: 'POST' });\n if (!res.ok) {\n throw new Error(await parseApiError(res, t('settings.restartFailed')));\n }\n },\n onSuccess: () => {\n toast.success(t('settings.restartScheduled'));\n },\n onError: (err) => {\n toast.error(err instanceof Error ? err.message : t('common.error'));\n },\n });\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setShowRestartConfirm(true)}\n disabled={restartMutation.isPending}\n aria-label={t('settings.restartGateway')}\n title={t('settings.restartGateway')}\n className=\"text-destructive hover:text-destructive hover:bg-destructive/10\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRestartConfirm} onOpenChange={setShowRestartConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('settings.restartGateway')}</AlertDialogTitle>\n <AlertDialogDescription>{t('settings.restartConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRestartConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n restartMutation.mutate();\n setShowRestartConfirm(false);\n }}\n >\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","RotateCcw","createLucideIcon","Save","Shield","parseApiError","res","fallback","SettingsPage","t","useTranslation","queryClient","useQueryClient","refreshSettings","useSiteStore","activeTab","setActiveTab","useState","theme","useUIStore","state","setTheme","isDark","siteName","setSiteName","siteUrl","setSiteUrl","language","setLanguage","bellThrottleSeconds","setBellThrottleSeconds","enableBrowserBellToast","setEnableBrowserBellToast","enableTelegramBellPush","setEnableTelegramBellPush","sshReconnectMaxRetries","setSshReconnectMaxRetries","sshReconnectDelaySeconds","setSshReconnectDelaySeconds","showRefreshNotice","setShowRefreshNotice","newBotName","setNewBotName","newBotToken","setNewBotToken","expandedBotId","setExpandedBotId","newWebhookUrl","setNewWebhookUrl","newWebhookSecret","setNewWebhookSecret","handleThemeChange","checked","nextTheme","settingsQuery","useQuery","botsQuery","useEffect","settings","_a","saveSiteMutation","useMutation","toast","_b","i18n","err","createBotMutation","bots","webhooksQuery","createWebhookMutation","deleteWebhookMutation","id","webhooks","_c","jsxDEV","Button","Card","CardHeader","CardTitle","CardContent","Input","event","Select","nextValue","SelectTrigger","SelectValue","_d","I18N_MANIFEST","l","SelectContent","locale","SelectItem","Switch","Loader2","bot","BotCard","prev","webhook","toBCP47Locale","Trash2","expanded","onToggleExpand","name","setName","token","setToken","enabled","setEnabled","allowAuthRequests","setAllowAuthRequests","chatsQuery","groupedChats","useMemo","chats","chat","patchBotMutation","payload","deleteBotMutation","approveMutation","chatId","removeChatMutation","testChatMutation","ChatRow","pending","onApprove","onDelete","onTest","Fragment","Send","PageTitle","PageActions","showRestartConfirm","setShowRestartConfirm","restartMutation","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
Binary file
|