tmex-cli 0.4.1 → 0.4.2
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/server.js +18 -0
- package/package.json +1 -1
- package/resources/fe-dist/assets/{DevicePage-n4JoyDed.js → DevicePage-CKaPUo7L.js} +2 -2
- package/resources/fe-dist/assets/{DevicePage-n4JoyDed.js.map → DevicePage-CKaPUo7L.js.map} +1 -1
- package/resources/fe-dist/assets/DevicesPage-FqU-Dxhu.js +17 -0
- package/resources/fe-dist/assets/{DevicesPage-BwLKaiUR.js.map → DevicesPage-FqU-Dxhu.js.map} +1 -1
- package/resources/fe-dist/assets/{SettingsPage-hS99lHcp.js → SettingsPage-BfkOW0fc.js} +2 -2
- package/resources/fe-dist/assets/{SettingsPage-hS99lHcp.js.map → SettingsPage-BfkOW0fc.js.map} +1 -1
- package/resources/fe-dist/assets/{index-CJyFlAt8.js → index-EgHfq93I.js} +6 -6
- package/resources/fe-dist/assets/index-EgHfq93I.js.map +1 -0
- package/resources/fe-dist/assets/index-Ytlj3p_q.css +1 -0
- package/resources/fe-dist/assets/{select-DGBwxGiK.js → select-CNlE6MiW.js} +3 -3
- package/resources/fe-dist/assets/{select-DGBwxGiK.js.map → select-CNlE6MiW.js.map} +1 -1
- package/resources/fe-dist/assets/{switch-CWUBjs7N.js → switch-CxkzOIL6.js} +2 -2
- package/resources/fe-dist/assets/{switch-CWUBjs7N.js.map → switch-CxkzOIL6.js.map} +1 -1
- package/resources/fe-dist/assets/{useValueChanged-DwJ_SDCu.js → useValueChanged-CO2U5MoL.js} +2 -2
- package/resources/fe-dist/assets/{useValueChanged-DwJ_SDCu.js.map → useValueChanged-CO2U5MoL.js.map} +1 -1
- package/resources/fe-dist/index.html +2 -2
- package/resources/fe-dist/assets/DevicesPage-BwLKaiUR.js +0 -17
- package/resources/fe-dist/assets/index-CJaX5rlK.css +0 -1
- package/resources/fe-dist/assets/index-CJyFlAt8.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as Z,u as U,a as Ee,b as Pe,r as i,d as be,e as $,j as e,B as c,I as ve,t as je,f as o,i as Be}from"./index-
|
|
1
|
+
import{c as Z,u as U,a as Ee,b as Pe,r as i,d as be,e as $,j as e,B as c,I as ve,t as je,f as o,i as Be}from"./index-EgHfq93I.js";import{u as f,C as M,a as R,b as q,c as A,I as g,S as Me,d as Re,e as qe,f as Ae,g as $e}from"./select-CNlE6MiW.js";import{T as De,A as Ie,a as _e,b as ze,c as Qe,d as Ke,e as Oe,f as We,g as He}from"./useValueChanged-CO2U5MoL.js";import{S as b,L as ke,a as Je}from"./switch-CxkzOIL6.js";/**
|
|
2
2
|
* @license lucide-react v0.564.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -14,4 +14,4 @@ import{c as Z,u as U,a as Ee,b as Pe,r as i,d as be,e as $,j as e,B as c,I as ve
|
|
|
14
14
|
* This source code is licensed under the ISC license.
|
|
15
15
|
* See the LICENSE file in the root directory of this source tree.
|
|
16
16
|
*/const Ze=[["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"}]],Se=Z("shield",Ze),Y=["terminal_bell","terminal_notification","tmux_window_close","tmux_pane_close","device_tmux_missing","device_disconnect","session_created","session_closed"];async function d(t,u){try{return(await t.json()).error??u}catch{return u}}function is(){var pe,Ne,fe,xe;const{t}=U(),u=Ee(),{refreshSettings:h}=Pe(),[r,l]=i.useState("site"),p=be(s=>s.theme),S=be(s=>s.setTheme),v=p==="dark",[x,P]=i.useState("tmex"),[j,D]=i.useState(window.location.origin),[N,C]=i.useState("en_US"),[k,V]=i.useState(6),[y,T]=i.useState(3),[w,F]=i.useState(!0),[L,a]=i.useState(!0),[m,E]=i.useState(!0),[ee,se]=i.useState(!0),[te,ae]=i.useState(2),[re,ie]=i.useState(10),[we,Le]=i.useState(!1),[_,oe]=i.useState(""),[z,le]=i.useState(""),[Ue,Ve]=i.useState(null),[Q,ne]=i.useState(""),[K,me]=i.useState(""),[O,ce]=i.useState(Y),ye=s=>{const n=s?"dark":"light";S(n),document.documentElement.classList.toggle("dark",n==="dark")},W=$({queryKey:["site-settings"],queryFn:async()=>{const s=await fetch("/api/settings/site");if(!s.ok)throw new Error(await d(s,t("settings.loadFailed")));return await s.json()}}),H=$({queryKey:["telegram-bots"],queryFn:async()=>{const s=await fetch("/api/settings/telegram/bots");if(!s.ok)throw new Error(await d(s,t("telegram.loadBotsFailed")));return await s.json()}});i.useEffect(()=>{var n;const s=(n=W.data)==null?void 0:n.settings;s&&(P(s.siteName),D(s.siteUrl),C(s.language??"en_US"),V(s.bellThrottleSeconds),T(s.notificationThrottleSeconds??3),F(s.enableBrowserBellToast??!0),a(s.enableBrowserNotificationToast??!0),E(s.enableTelegramBellPush??!0),se(s.enableTelegramNotificationPush??!0),ae(s.sshReconnectMaxRetries),ie(s.sshReconnectDelaySeconds))},[(pe=W.data)==null?void 0:pe.settings]);const ue=f({mutationFn:async()=>{const n=await fetch("/api/settings/site",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({siteName:x,siteUrl:j,language:N,bellThrottleSeconds:k,notificationThrottleSeconds:y,enableBrowserBellToast:w,enableBrowserNotificationToast:L,enableTelegramBellPush:m,enableTelegramNotificationPush:ee,sshReconnectMaxRetries:te,sshReconnectDelaySeconds:re})});if(!n.ok)throw new Error(await d(n,t("settings.saveFailed")))},onSuccess:async()=>{var s,n;await Promise.all([u.invalidateQueries({queryKey:["site-settings"]}),h()]),o.success(t("settings.settingsSaved")),((n=(s=W.data)==null?void 0:s.settings)==null?void 0:n.language)!==N&&(Be.changeLanguage(N),Le(!0))},onError:s=>{o.error(s instanceof Error?s.message:t("common.error"))}}),J=f({mutationFn:async()=>{const s=await fetch("/api/settings/telegram/bots",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:_,token:z,enabled:!0,allowAuthRequests:!0})});if(!s.ok)throw new Error(await d(s,t("telegram.createFailed")))},onSuccess:async()=>{oe(""),le(""),await u.invalidateQueries({queryKey:["telegram-bots"]}),o.success(t("common.success"))},onError:s=>{o.error(s instanceof Error?s.message:t("common.error"))}}),de=((Ne=H.data)==null?void 0:Ne.bots)??[],G=$({queryKey:["webhooks"],queryFn:async()=>{const s=await fetch("/api/webhooks");if(!s.ok)throw new Error(await d(s,t("webhook.loadFailed")));return await s.json()}}),X=f({mutationFn:async()=>{const s=await fetch("/api/webhooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:Q,secret:K,eventMask:O})});if(!s.ok)throw new Error(await d(s,t("webhook.createFailed")))},onSuccess:async()=>{ne(""),me(""),ce(Y),await u.invalidateQueries({queryKey:["webhooks"]}),o.success(t("common.success"))},onError:s=>{o.error(s instanceof Error?s.message:t("common.error"))}}),ge=f({mutationFn:async s=>{const n=await fetch(`/api/webhooks/${s}`,{method:"DELETE"});if(!n.ok)throw new Error(await d(n,t("webhook.deleteFailed")))},onSuccess:async()=>{await u.invalidateQueries({queryKey:["webhooks"]}),o.success(t("common.success"))},onError:s=>{o.error(s instanceof Error?s.message:t("common.error"))}}),he=((fe=G.data)==null?void 0:fe.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:t("settings.siteSettings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:305,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="notifications"?"default":"outline","data-testid":"settings-tab-notifications",onClick:()=>l("notifications"),children:t("settings.notificationsTab")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:314,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="telegram"?"default":"outline","data-testid":"settings-tab-telegram",onClick:()=>l("telegram"),children:t("telegram.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:323,columnNumber:9},this),e.jsxDEV(c,{type:"button",size:"sm",variant:r==="webhooks"?"default":"outline","data-testid":"settings-tab-webhooks",onClick:()=>l("webhooks"),children:t("webhook.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:332,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:304,columnNumber:7},this),r==="site"&&e.jsxDEV(M,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:t("settings.siteSettings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:346,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:345,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:t("settings.siteName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:350,columnNumber:15},this),e.jsxDEV(g,{id:"site-name-input",value:x,onChange:s=>P(s.target.value),placeholder:t("settings.siteNamePlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:353,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:349,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:t("settings.siteUrl")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:363,columnNumber:15},this),e.jsxDEV(g,{id:"site-url-input",value:j,onChange:s=>D(s.target.value),placeholder:t("settings.siteUrlPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:366,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:362,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"language-select",children:t("settings.language")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:376,columnNumber:15},this),e.jsxDEV(Me,{value:N,onValueChange:s=>{s&&C(s)},children:[e.jsxDEV(Re,{id:"language-select","data-testid":"settings-language-select",className:"w-full min-h-10",children:e.jsxDEV(qe,{placeholder:t("settings.language"),children:((xe=ve.locales.find(s=>s.code===N))==null?void 0:xe.nativeName)??N},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:391,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:386,columnNumber:17},this),e.jsxDEV(Ae,{className:"max-h-[var(--tmex-viewport-height)]",children:ve.locales.map(s=>e.jsxDEV($e,{value:s.code,children:s.nativeName},s.code,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:397,columnNumber:21},this))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:395,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:379,columnNumber:15},this),we&&e.jsxDEV("p",{className:"mt-1 text-xs text-primary","data-testid":"settings-refresh-notice",children:t("settings.refreshToApply")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:404,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:375,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:t("settings.theme")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:413,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:412,columnNumber:17},this),e.jsxDEV(b,{checked:v,onCheckedChange:s=>ye(!!s),"data-testid":"settings-theme-toggle"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:415,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:411,columnNumber:15},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:410,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:348,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:344,columnNumber:9},this),r==="notifications"&&e.jsxDEV(M,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:t("settings.notificationsTab")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:429,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:428,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:t("settings.enableBrowserBellToast")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:435,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:434,columnNumber:17},this),e.jsxDEV(b,{checked:w,onCheckedChange:s=>F(!!s),"data-testid":"settings-enable-browser-bell-toast"},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:"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:t("settings.enableTelegramBellPush")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:446,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:445,columnNumber:17},this),e.jsxDEV(b,{checked:m,onCheckedChange:s=>E(!!s),"data-testid":"settings-enable-telegram-bell-push"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:448,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:444,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:t("settings.enableBrowserNotificationToast")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:457,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:456,columnNumber:17},this),e.jsxDEV(b,{checked:L,onCheckedChange:s=>a(!!s),"data-testid":"settings-enable-browser-notification-toast"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:461,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:455,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:t("settings.enableTelegramNotificationPush")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:470,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:469,columnNumber:17},this),e.jsxDEV(b,{checked:ee,onCheckedChange:s=>se(!!s),"data-testid":"settings-enable-telegram-notification-push"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:474,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:468,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:432,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:t("settings.bellThrottle")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:484,columnNumber:17},this),e.jsxDEV(g,{id:"bell-throttle-input",type:"number",value:k,min:0,max:300,onChange:s=>V(Number(s.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:487,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:483,columnNumber:15},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("label",{className:"block text-sm font-medium",htmlFor:"notification-throttle-input",children:t("settings.notificationThrottle")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:499,columnNumber:17},this),e.jsxDEV(g,{id:"notification-throttle-input",type:"number",value:y,min:0,max:300,onChange:s=>T(Number(s.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:502,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:498,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:t("settings.sshReconnectMaxRetries")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:514,columnNumber:17},this),e.jsxDEV(g,{id:"ssh-reconnect-retries-input",type:"number",value:te,min:0,max:20,onChange:s=>ae(Number(s.target.value)),className:"min-h-10"},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:513,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:t("settings.sshReconnectDelay")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:529,columnNumber:17},this),e.jsxDEV(g,{id:"ssh-reconnect-delay-input",type:"number",value:re,min:1,max:300,onChange:s=>ie(Number(s.target.value)),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:532,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:528,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:482,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:431,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:427,columnNumber:9},this),r==="telegram"&&e.jsxDEV(M,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:t("telegram.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:550,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:549,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:t("telegram.botName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:556,columnNumber:19},this),e.jsxDEV(g,{id:"new-bot-name",value:_,onChange:s=>oe(s.target.value),placeholder:t("telegram.botNamePlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:559,columnNumber:19},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:555,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:t("telegram.botToken")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:569,columnNumber:19},this),e.jsxDEV(g,{id:"new-bot-token",type:"password",value:z,onChange:s=>le(s.target.value),placeholder:t("telegram.botTokenPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:572,columnNumber:19},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:568,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:()=>J.mutate(),disabled:J.isPending||!_.trim()||!z.trim(),children:[J.isPending?e.jsxDEV(ke,{className:"h-4 w-4 animate-spin"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:593,columnNumber:23},this):e.jsxDEV(I,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:595,columnNumber:23},this),t("telegram.addBot")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:583,columnNumber:19},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:582,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:554,columnNumber:15},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:553,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-3",children:[H.isLoading&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:t("common.loading")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:605,columnNumber:17},this),!H.isLoading&&de.length===0&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:t("telegram.addBot")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:609,columnNumber:17},this),de.map(s=>e.jsxDEV(es,{bot:s,expanded:Ue===s.id,onToggleExpand:()=>{Ve(n=>n===s.id?null:s.id)}},s.id,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:613,columnNumber:17},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:603,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:552,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:548,columnNumber:9},this),r==="webhooks"&&e.jsxDEV(M,{className:"border-0 ring-0",children:[e.jsxDEV(R,{children:e.jsxDEV(q,{children:t("webhook.title")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:630,columnNumber:13},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:629,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:t("webhook.url")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:635,columnNumber:17},this),e.jsxDEV(g,{id:"webhook-url-input","data-testid":"webhook-url-input",value:Q,onChange:s=>ne(s.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:638,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:634,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:t("webhook.secret")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:649,columnNumber:17},this),e.jsxDEV(g,{id:"webhook-secret-input","data-testid":"webhook-secret-input",value:K,onChange:s=>me(s.target.value),placeholder:t("webhook.secretPlaceholder"),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:652,columnNumber:17},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:648,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:()=>X.mutate(),disabled:X.isPending||!Q.trim()||!K.trim()||O.length===0,children:[X.isPending?e.jsxDEV(ke,{className:"h-4 w-4 animate-spin"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:676,columnNumber:21},this):e.jsxDEV(I,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:678,columnNumber:21},this),t("webhook.add")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:663,columnNumber:17},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:662,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:633,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-3 rounded-lg border border-border bg-card px-4 py-3",children:[e.jsxDEV("div",{className:"text-sm font-medium",children:t("webhook.eventMask")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:686,columnNumber:15},this),e.jsxDEV("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:Y.map(s=>{const n=O.includes(s);return e.jsxDEV("div",{className:"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-background px-3 py-2",children:[e.jsxDEV("div",{className:"min-w-0 pr-2 text-sm font-medium",children:t(`notification.eventType.${s}`)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:695,columnNumber:23},this),e.jsxDEV(b,{checked:n,"data-testid":`webhook-event-${s}`,onCheckedChange:Te=>{ce(B=>Te?B.includes(s)?B:[...B,s]:B.filter(Fe=>Fe!==s))}},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:698,columnNumber:23},this)]},s,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:691,columnNumber:21},this)})},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:687,columnNumber:15},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:685,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-2",children:[G.isLoading&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:t("common.loading")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:718,columnNumber:17},this),!G.isLoading&&he.length===0&&e.jsxDEV("div",{className:"text-sm text-muted-foreground",children:t("webhook.empty")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:722,columnNumber:17},this),he.map(s=>e.jsxDEV("div",{"data-testid":"webhook-item","data-webhook-url":s.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:s.url},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:733,columnNumber:21},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:new Date(s.createdAt).toLocaleString(je(N))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:734,columnNumber:21},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:732,columnNumber:19},this),e.jsxDEV(c,{variant:"ghost",size:"icon-sm","data-testid":"webhook-delete",onClick:()=>ge.mutate(s.id),disabled:ge.isPending,"aria-label":t("common.delete"),title:t("common.delete"),children:e.jsxDEV(De,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:747,columnNumber:21},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:738,columnNumber:19},this)]},s.id,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:726,columnNumber:17},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:716,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:632,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:628,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:()=>ue.mutate(),disabled:ue.isPending,className:"w-full sm:w-auto",children:[e.jsxDEV(I,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:765,columnNumber:13},this),t("common.save")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:758,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:757,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:300,columnNumber:5},this)}function es({bot:t,expanded:u,onToggleExpand:h}){var L;const{t:r}=U(),l=Ee(),[p,S]=i.useState(t.name),[v,x]=i.useState(""),[P,j]=i.useState(t.enabled),[D,N]=i.useState(t.allowAuthRequests);i.useEffect(()=>{S(t.name),j(t.enabled),N(t.allowAuthRequests)},[t.allowAuthRequests,t.enabled,t.name]);const C=$({queryKey:["telegram-bot-chats",t.id],enabled:u,queryFn:async()=>{const a=await fetch(`/api/settings/telegram/bots/${t.id}/chats`);if(!a.ok)throw new Error(await d(a,r("telegram.loadChatsFailed")));return await a.json()}}),k=i.useMemo(()=>{var m;const a=((m=C.data)==null?void 0:m.chats)??[];return{pending:a.filter(E=>E.status==="pending"),authorized:a.filter(E=>E.status==="authorized")}},[(L=C.data)==null?void 0:L.chats]),V=f({mutationFn:async()=>{const a={name:p,enabled:P,allowAuthRequests:D};v.trim()&&(a.token=v.trim());const m=await fetch(`/api/settings/telegram/bots/${t.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!m.ok)throw new Error(await d(m,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/${t.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 m=await fetch(`/api/settings/telegram/bots/${t.id}/chats/${encodeURIComponent(a)}/approve`,{method:"POST"});if(!m.ok)throw new Error(await d(m,r("telegram.approveFailed")))},onSuccess:async()=>{await Promise.all([l.invalidateQueries({queryKey:["telegram-bots"]}),l.invalidateQueries({queryKey:["telegram-bot-chats",t.id]})]),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),w=f({mutationFn:async a=>{const m=await fetch(`/api/settings/telegram/bots/${t.id}/chats/${encodeURIComponent(a)}`,{method:"DELETE"});if(!m.ok)throw new Error(await d(m,r("telegram.removeFailed")))},onSuccess:async()=>{await Promise.all([l.invalidateQueries({queryKey:["telegram-bots"]}),l.invalidateQueries({queryKey:["telegram-bot-chats",t.id]})]),o.success(r("common.success"))},onError:a=>{o.error(a instanceof Error?a.message:r("common.error"))}}),F=f({mutationFn:async a=>{const m=await fetch(`/api/settings/telegram/bots/${t.id}/chats/${encodeURIComponent(a)}/test`,{method:"POST"});if(!m.ok)throw new Error(await d(m,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-${t.id}`,"data-bot-name":t.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:t.name},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:943,columnNumber:11},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:[t.authorizedCount," / ",t.pendingCount]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:944,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:942,columnNumber:9},this),e.jsxDEV(c,{variant:"ghost","data-testid":`telegram-bot-toggle-${t.id}`,onClick:h,children:r(u?"common.collapse":"common.expand")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:948,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:941,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-${t.id}`,children:r("telegram.botName")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:959,columnNumber:11},this),e.jsxDEV(g,{id:`bot-name-${t.id}`,value:p,onChange:a=>S(a.target.value),className:"min-h-10"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:962,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:958,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-${t.id}`,children:r("telegram.botToken")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:970,columnNumber:11},this),e.jsxDEV(g,{id:`bot-token-${t.id}`,type:"password",value:v,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:973,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:969,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:984,columnNumber:13},this),e.jsxDEV(b,{checked:P,onCheckedChange:a=>j(!!a)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:985,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:983,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:982,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:990,columnNumber:13},this),e.jsxDEV(b,{checked:D,onCheckedChange:a=>N(!!a)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:991,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:989,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:988,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:957,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-${t.id}`,onClick:()=>y.mutate(),className:"w-full sm:w-auto",children:[e.jsxDEV(De,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1006,columnNumber:11},this),r("telegram.deleteBot")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1e3,columnNumber:9},this),e.jsxDEV(c,{variant:"default","data-testid":`telegram-bot-save-${t.id}`,onClick:()=>V.mutate(),className:"w-full sm:w-auto",children:[e.jsxDEV(I,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1015,columnNumber:11},this),r("common.save")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1009,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:999,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(Se,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1024,columnNumber:15},this),r("telegram.pendingChats")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1023,columnNumber:13},this),k.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:1027,columnNumber:51},this),k.pending.map(a=>e.jsxDEV(Ce,{chat:a,pending:!0,onApprove:()=>T.mutate(a.chatId),onDelete:()=>w.mutate(a.chatId)},`${a.botId}-${a.chatId}`,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1029,columnNumber:15},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1022,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(Se,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1041,columnNumber:15},this),r("telegram.chats")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1040,columnNumber:13},this),k.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:1044,columnNumber:54},this),k.authorized.map(a=>e.jsxDEV(Ce,{chat:a,pending:!1,onTest:()=>F.mutate(a.chatId),onDelete:()=>w.mutate(a.chatId)},`${a.botId}-${a.chatId}`,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1046,columnNumber:15},this))]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1039,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:1057,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1021,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:936,columnNumber:5},this)}function Ce({chat:t,pending:u,onApprove:h,onDelete:r,onTest:l}){const{t:p}=U(),S=Pe(v=>{var x;return((x=v.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:t.displayName,children:t.displayName},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1080,columnNumber:7},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:[p("telegram.chatId"),":",t.chatId]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1083,columnNumber:7},this),e.jsxDEV("div",{className:"text-xs text-muted-foreground",children:new Date(t.appliedAt).toLocaleString(je(S))},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1086,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:1093,columnNumber:13},this),e.jsxDEV(c,{variant:"default",size:"sm",onClick:h,children:p("telegram.authorize")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1096,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1092,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(c,{variant:"secondary",size:"sm",onClick:l,children:[e.jsxDEV(Je,{className:"h-3.5 w-3.5"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1103,columnNumber:15},this),p("telegram.sendTestMessage")]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1102,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:1106,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1101,columnNumber:11},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1090,columnNumber:7},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1079,columnNumber:5},this)}function os(){const{t}=U();return e.jsxDEV(e.Fragment,{children:t("sidebar.settings")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1119,columnNumber:10},this)}function ls(){const{t}=U(),[u,h]=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,t("settings.restartFailed")))},onSuccess:()=>{o.success(t("settings.restartScheduled"))},onError:l=>{o.error(l instanceof Error?l.message:t("common.error"))}});return e.jsxDEV(e.Fragment,{children:[e.jsxDEV(c,{variant:"ghost",size:"icon-sm",onClick:()=>h(!0),disabled:r.isPending,"aria-label":t("settings.restartGateway"),title:t("settings.restartGateway"),className:"text-destructive hover:text-destructive hover:bg-destructive/10",children:e.jsxDEV(Xe,{className:"h-4 w-4"},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1153,columnNumber:9},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1144,columnNumber:7},this),e.jsxDEV(Ie,{open:u,onOpenChange:h,children:e.jsxDEV(_e,{children:[e.jsxDEV(ze,{children:[e.jsxDEV(Qe,{children:t("settings.restartGateway")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1159,columnNumber:13},this),e.jsxDEV(Ke,{children:t("settings.restartConfirm")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1160,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1158,columnNumber:11},this),e.jsxDEV(Oe,{children:[e.jsxDEV(We,{onClick:()=>h(!1),children:t("common.cancel")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1163,columnNumber:13},this),e.jsxDEV(He,{variant:"destructive",onClick:()=>{r.mutate(),h(!1)},children:t("common.confirm")},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1166,columnNumber:13},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1162,columnNumber:11},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1157,columnNumber:9},this)},void 0,!1,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1156,columnNumber:7},this)]},void 0,!0,{fileName:"/Users/krhougs/LocalCodes/tmex/apps/fe/src/pages/SettingsPage.tsx",lineNumber:1143,columnNumber:5},this)}export{ls as PageActions,os as PageTitle,is as default};
|
|
17
|
-
//# sourceMappingURL=SettingsPage-
|
|
17
|
+
//# sourceMappingURL=SettingsPage-BfkOW0fc.js.map
|
package/resources/fe-dist/assets/{SettingsPage-hS99lHcp.js.map → SettingsPage-BfkOW0fc.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage-hS99lHcp.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 EventType,\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\nconst WEBHOOK_EVENT_OPTIONS: EventType[] = [\n 'terminal_bell',\n 'terminal_notification',\n 'tmux_window_close',\n 'tmux_pane_close',\n 'device_tmux_missing',\n 'device_disconnect',\n 'session_created',\n 'session_closed',\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 [notificationThrottleSeconds, setNotificationThrottleSeconds] = useState(3);\n const [enableBrowserBellToast, setEnableBrowserBellToast] = useState(true);\n const [enableBrowserNotificationToast, setEnableBrowserNotificationToast] = useState(true);\n const [enableTelegramBellPush, setEnableTelegramBellPush] = useState(true);\n const [enableTelegramNotificationPush, setEnableTelegramNotificationPush] = 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 const [newWebhookEventMask, setNewWebhookEventMask] = useState<EventType[]>(WEBHOOK_EVENT_OPTIONS);\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 setNotificationThrottleSeconds(settings.notificationThrottleSeconds ?? 3);\n setEnableBrowserBellToast(settings.enableBrowserBellToast ?? true);\n setEnableBrowserNotificationToast(settings.enableBrowserNotificationToast ?? true);\n setEnableTelegramBellPush(settings.enableTelegramBellPush ?? true);\n setEnableTelegramNotificationPush(settings.enableTelegramNotificationPush ?? 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 notificationThrottleSeconds,\n enableBrowserBellToast,\n enableBrowserNotificationToast,\n enableTelegramBellPush,\n enableTelegramNotificationPush,\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 eventMask: newWebhookEventMask,\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 setNewWebhookEventMask(WEBHOOK_EVENT_OPTIONS);\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\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\">\n {t('settings.enableBrowserNotificationToast')}\n </div>\n </div>\n <Switch\n checked={enableBrowserNotificationToast}\n onCheckedChange={(checked) => setEnableBrowserNotificationToast(Boolean(checked))}\n data-testid=\"settings-enable-browser-notification-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\">\n {t('settings.enableTelegramNotificationPush')}\n </div>\n </div>\n <Switch\n checked={enableTelegramNotificationPush}\n onCheckedChange={(checked) => setEnableTelegramNotificationPush(Boolean(checked))}\n data-testid=\"settings-enable-telegram-notification-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=\"notification-throttle-input\">\n {t('settings.notificationThrottle')}\n </label>\n <Input\n id=\"notification-throttle-input\"\n type=\"number\"\n value={notificationThrottleSeconds}\n min={0}\n max={300}\n onChange={(event) => setNotificationThrottleSeconds(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 newWebhookEventMask.length === 0\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-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"text-sm font-medium\">{t('webhook.eventMask')}</div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {WEBHOOK_EVENT_OPTIONS.map((eventType) => {\n const checked = newWebhookEventMask.includes(eventType);\n return (\n <div\n key={eventType}\n className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-background px-3 py-2\"\n >\n <div className=\"min-w-0 pr-2 text-sm font-medium\">\n {t(`notification.eventType.${eventType}` as const)}\n </div>\n <Switch\n checked={checked}\n data-testid={`webhook-event-${eventType}`}\n onCheckedChange={(nextChecked) => {\n setNewWebhookEventMask((prev) => {\n if (nextChecked) {\n return prev.includes(eventType) ? prev : [...prev, eventType];\n }\n return prev.filter((item) => item !== eventType);\n });\n }}\n />\n </div>\n );\n })}\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","WEBHOOK_EVENT_OPTIONS","parseApiError","res","fallback","SettingsPage","useTranslation","queryClient","useQueryClient","refreshSettings","useSiteStore","activeTab","setActiveTab","useState","theme","useUIStore","state","setTheme","isDark","siteName","setSiteName","siteUrl","setSiteUrl","language","setLanguage","bellThrottleSeconds","setBellThrottleSeconds","notificationThrottleSeconds","setNotificationThrottleSeconds","enableBrowserBellToast","setEnableBrowserBellToast","enableBrowserNotificationToast","setEnableBrowserNotificationToast","enableTelegramBellPush","setEnableTelegramBellPush","enableTelegramNotificationPush","setEnableTelegramNotificationPush","sshReconnectMaxRetries","setSshReconnectMaxRetries","sshReconnectDelaySeconds","setSshReconnectDelaySeconds","showRefreshNotice","setShowRefreshNotice","newBotName","setNewBotName","newBotToken","setNewBotToken","expandedBotId","setExpandedBotId","newWebhookUrl","setNewWebhookUrl","newWebhookSecret","setNewWebhookSecret","newWebhookEventMask","setNewWebhookEventMask","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","eventType","nextChecked","item","webhook","toBCP47Locale","Trash2","expanded","onToggleExpand","t","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-BfkOW0fc.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 EventType,\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\nconst WEBHOOK_EVENT_OPTIONS: EventType[] = [\n 'terminal_bell',\n 'terminal_notification',\n 'tmux_window_close',\n 'tmux_pane_close',\n 'device_tmux_missing',\n 'device_disconnect',\n 'session_created',\n 'session_closed',\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 [notificationThrottleSeconds, setNotificationThrottleSeconds] = useState(3);\n const [enableBrowserBellToast, setEnableBrowserBellToast] = useState(true);\n const [enableBrowserNotificationToast, setEnableBrowserNotificationToast] = useState(true);\n const [enableTelegramBellPush, setEnableTelegramBellPush] = useState(true);\n const [enableTelegramNotificationPush, setEnableTelegramNotificationPush] = 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 const [newWebhookEventMask, setNewWebhookEventMask] = useState<EventType[]>(WEBHOOK_EVENT_OPTIONS);\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 setNotificationThrottleSeconds(settings.notificationThrottleSeconds ?? 3);\n setEnableBrowserBellToast(settings.enableBrowserBellToast ?? true);\n setEnableBrowserNotificationToast(settings.enableBrowserNotificationToast ?? true);\n setEnableTelegramBellPush(settings.enableTelegramBellPush ?? true);\n setEnableTelegramNotificationPush(settings.enableTelegramNotificationPush ?? 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 notificationThrottleSeconds,\n enableBrowserBellToast,\n enableBrowserNotificationToast,\n enableTelegramBellPush,\n enableTelegramNotificationPush,\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 eventMask: newWebhookEventMask,\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 setNewWebhookEventMask(WEBHOOK_EVENT_OPTIONS);\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\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\">\n {t('settings.enableBrowserNotificationToast')}\n </div>\n </div>\n <Switch\n checked={enableBrowserNotificationToast}\n onCheckedChange={(checked) => setEnableBrowserNotificationToast(Boolean(checked))}\n data-testid=\"settings-enable-browser-notification-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\">\n {t('settings.enableTelegramNotificationPush')}\n </div>\n </div>\n <Switch\n checked={enableTelegramNotificationPush}\n onCheckedChange={(checked) => setEnableTelegramNotificationPush(Boolean(checked))}\n data-testid=\"settings-enable-telegram-notification-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=\"notification-throttle-input\">\n {t('settings.notificationThrottle')}\n </label>\n <Input\n id=\"notification-throttle-input\"\n type=\"number\"\n value={notificationThrottleSeconds}\n min={0}\n max={300}\n onChange={(event) => setNotificationThrottleSeconds(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 newWebhookEventMask.length === 0\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-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"text-sm font-medium\">{t('webhook.eventMask')}</div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {WEBHOOK_EVENT_OPTIONS.map((eventType) => {\n const checked = newWebhookEventMask.includes(eventType);\n return (\n <div\n key={eventType}\n className=\"flex min-h-10 items-center justify-between gap-4 rounded-lg border border-border bg-background px-3 py-2\"\n >\n <div className=\"min-w-0 pr-2 text-sm font-medium\">\n {t(`notification.eventType.${eventType}` as const)}\n </div>\n <Switch\n checked={checked}\n data-testid={`webhook-event-${eventType}`}\n onCheckedChange={(nextChecked) => {\n setNewWebhookEventMask((prev) => {\n if (nextChecked) {\n return prev.includes(eventType) ? prev : [...prev, eventType];\n }\n return prev.filter((item) => item !== eventType);\n });\n }}\n />\n </div>\n );\n })}\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","WEBHOOK_EVENT_OPTIONS","parseApiError","res","fallback","SettingsPage","useTranslation","queryClient","useQueryClient","refreshSettings","useSiteStore","activeTab","setActiveTab","useState","theme","useUIStore","state","setTheme","isDark","siteName","setSiteName","siteUrl","setSiteUrl","language","setLanguage","bellThrottleSeconds","setBellThrottleSeconds","notificationThrottleSeconds","setNotificationThrottleSeconds","enableBrowserBellToast","setEnableBrowserBellToast","enableBrowserNotificationToast","setEnableBrowserNotificationToast","enableTelegramBellPush","setEnableTelegramBellPush","enableTelegramNotificationPush","setEnableTelegramNotificationPush","sshReconnectMaxRetries","setSshReconnectMaxRetries","sshReconnectDelaySeconds","setSshReconnectDelaySeconds","showRefreshNotice","setShowRefreshNotice","newBotName","setNewBotName","newBotToken","setNewBotToken","expandedBotId","setExpandedBotId","newWebhookUrl","setNewWebhookUrl","newWebhookSecret","setNewWebhookSecret","newWebhookEventMask","setNewWebhookEventMask","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","eventType","nextChecked","item","webhook","toBCP47Locale","Trash2","expanded","onToggleExpand","t","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]}
|