From c59742a4f38cd7a3c4ac72988600e41a8988f03a Mon Sep 17 00:00:00 2001 From: "web@ppanel" Date: Mon, 13 Jan 2025 21:07:27 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Update=20Auth=20Control?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 33 +- .../app/dashboard/auth-control/email/page.tsx | 179 +++++++ .../general/page.tsx} | 4 +- .../app/dashboard/auth-control/layout.tsx | 29 ++ .../admin/app/dashboard/auth-control/page.tsx | 5 + .../app/dashboard/auth-control/phone/page.tsx | 389 ++++++++++++++ apps/admin/app/dashboard/system/email.tsx | 150 ------ apps/admin/app/dashboard/system/page.tsx | 10 - apps/admin/components/sidebar-left.tsx | 6 +- apps/admin/config/navs.ts | 67 ++- apps/admin/locales/cs-CZ/auth-control.json | 20 + apps/admin/locales/cs-CZ/email.json | 29 ++ apps/admin/locales/cs-CZ/menu.json | 10 + apps/admin/locales/cs-CZ/phone.json | 57 +++ apps/admin/locales/cs-CZ/system.json | 46 -- apps/admin/locales/de-DE/auth-control.json | 20 + apps/admin/locales/de-DE/email.json | 29 ++ apps/admin/locales/de-DE/menu.json | 10 + apps/admin/locales/de-DE/phone.json | 57 +++ apps/admin/locales/de-DE/system.json | 46 -- apps/admin/locales/en-US/auth-control.json | 20 + apps/admin/locales/en-US/email.json | 29 ++ apps/admin/locales/en-US/menu.json | 10 + apps/admin/locales/en-US/phone.json | 57 +++ apps/admin/locales/en-US/system.json | 46 -- apps/admin/locales/es-ES/auth-control.json | 20 + apps/admin/locales/es-ES/email.json | 29 ++ apps/admin/locales/es-ES/menu.json | 10 + apps/admin/locales/es-ES/phone.json | 57 +++ apps/admin/locales/es-ES/system.json | 46 -- apps/admin/locales/es-MX/auth-control.json | 20 + apps/admin/locales/es-MX/email.json | 29 ++ apps/admin/locales/es-MX/menu.json | 10 + apps/admin/locales/es-MX/phone.json | 57 +++ apps/admin/locales/es-MX/system.json | 46 -- apps/admin/locales/fa-IR/auth-control.json | 20 + apps/admin/locales/fa-IR/email.json | 29 ++ apps/admin/locales/fa-IR/menu.json | 10 + apps/admin/locales/fa-IR/phone.json | 57 +++ apps/admin/locales/fa-IR/system.json | 46 -- apps/admin/locales/fi-FI/auth-control.json | 20 + apps/admin/locales/fi-FI/email.json | 29 ++ apps/admin/locales/fi-FI/menu.json | 10 + apps/admin/locales/fi-FI/phone.json | 57 +++ apps/admin/locales/fi-FI/system.json | 46 -- apps/admin/locales/fr-FR/auth-control.json | 20 + apps/admin/locales/fr-FR/email.json | 29 ++ apps/admin/locales/fr-FR/menu.json | 10 + apps/admin/locales/fr-FR/phone.json | 57 +++ apps/admin/locales/fr-FR/system.json | 46 -- apps/admin/locales/hi-IN/auth-control.json | 20 + apps/admin/locales/hi-IN/email.json | 29 ++ apps/admin/locales/hi-IN/menu.json | 10 + apps/admin/locales/hi-IN/phone.json | 57 +++ apps/admin/locales/hi-IN/system.json | 46 -- apps/admin/locales/hu-HU/auth-control.json | 20 + apps/admin/locales/hu-HU/email.json | 29 ++ apps/admin/locales/hu-HU/menu.json | 10 + apps/admin/locales/hu-HU/phone.json | 57 +++ apps/admin/locales/hu-HU/system.json | 46 -- apps/admin/locales/ja-JP/auth-control.json | 20 + apps/admin/locales/ja-JP/email.json | 29 ++ apps/admin/locales/ja-JP/menu.json | 10 + apps/admin/locales/ja-JP/phone.json | 57 +++ apps/admin/locales/ja-JP/system.json | 46 -- apps/admin/locales/ko-KR/auth-control.json | 20 + apps/admin/locales/ko-KR/email.json | 29 ++ apps/admin/locales/ko-KR/menu.json | 10 + apps/admin/locales/ko-KR/phone.json | 57 +++ apps/admin/locales/ko-KR/system.json | 46 -- apps/admin/locales/no-NO/auth-control.json | 20 + apps/admin/locales/no-NO/email.json | 29 ++ apps/admin/locales/no-NO/menu.json | 10 + apps/admin/locales/no-NO/phone.json | 57 +++ apps/admin/locales/no-NO/system.json | 46 -- apps/admin/locales/pl-PL/auth-control.json | 20 + apps/admin/locales/pl-PL/email.json | 29 ++ apps/admin/locales/pl-PL/menu.json | 10 + apps/admin/locales/pl-PL/phone.json | 57 +++ apps/admin/locales/pl-PL/system.json | 46 -- apps/admin/locales/pt-BR/auth-control.json | 20 + apps/admin/locales/pt-BR/email.json | 29 ++ apps/admin/locales/pt-BR/menu.json | 10 + apps/admin/locales/pt-BR/phone.json | 57 +++ apps/admin/locales/pt-BR/system.json | 46 -- apps/admin/locales/request.ts | 35 +- apps/admin/locales/ro-RO/auth-control.json | 20 + apps/admin/locales/ro-RO/email.json | 29 ++ apps/admin/locales/ro-RO/menu.json | 10 + apps/admin/locales/ro-RO/phone.json | 57 +++ apps/admin/locales/ro-RO/system.json | 46 -- apps/admin/locales/ru-RU/auth-control.json | 20 + apps/admin/locales/ru-RU/email.json | 29 ++ apps/admin/locales/ru-RU/menu.json | 10 + apps/admin/locales/ru-RU/phone.json | 57 +++ apps/admin/locales/ru-RU/system.json | 46 -- apps/admin/locales/th-TH/auth-control.json | 20 + apps/admin/locales/th-TH/email.json | 29 ++ apps/admin/locales/th-TH/menu.json | 10 + apps/admin/locales/th-TH/phone.json | 57 +++ apps/admin/locales/th-TH/system.json | 46 -- apps/admin/locales/tr-TR/auth-control.json | 20 + apps/admin/locales/tr-TR/email.json | 29 ++ apps/admin/locales/tr-TR/menu.json | 10 + apps/admin/locales/tr-TR/phone.json | 57 +++ apps/admin/locales/tr-TR/system.json | 46 -- apps/admin/locales/uk-UA/auth-control.json | 20 + apps/admin/locales/uk-UA/email.json | 29 ++ apps/admin/locales/uk-UA/menu.json | 10 + apps/admin/locales/uk-UA/phone.json | 57 +++ apps/admin/locales/uk-UA/system.json | 46 -- apps/admin/locales/vi-VN/auth-control.json | 20 + apps/admin/locales/vi-VN/email.json | 29 ++ apps/admin/locales/vi-VN/menu.json | 10 + apps/admin/locales/vi-VN/phone.json | 57 +++ apps/admin/locales/vi-VN/system.json | 46 -- apps/admin/locales/zh-CN/auth-control.json | 20 + apps/admin/locales/zh-CN/email.json | 29 ++ apps/admin/locales/zh-CN/menu.json | 10 + apps/admin/locales/zh-CN/phone.json | 57 +++ apps/admin/locales/zh-CN/system.json | 46 -- apps/admin/locales/zh-HK/auth-control.json | 20 + apps/admin/locales/zh-HK/email.json | 29 ++ apps/admin/locales/zh-HK/menu.json | 10 + apps/admin/locales/zh-HK/phone.json | 57 +++ apps/admin/locales/zh-HK/system.json | 46 -- apps/admin/services/admin/index.ts | 2 + apps/admin/services/admin/sms.ts | 18 + apps/admin/services/admin/system.ts | 43 ++ apps/admin/services/admin/typings.d.ts | 88 +++- apps/admin/services/common/auth.ts | 78 +++ apps/admin/services/common/common.ts | 12 + apps/admin/services/common/typings.d.ts | 64 +++ apps/user/services/common/auth.ts | 78 +++ apps/user/services/common/common.ts | 12 + apps/user/services/common/typings.d.ts | 64 +++ apps/user/services/user/typings.d.ts | 40 ++ apps/user/services/user/user.ts | 18 + bun.lockb | Bin 607312 -> 606640 bytes .../custom-components/area-code-select.tsx | 63 +++ .../ui/src/custom-components/combobox.tsx | 2 +- packages/ui/src/utils/countries.ts | 484 +++++++++--------- scripts/prepare.sh | 8 +- 143 files changed, 4195 insertions(+), 1512 deletions(-) create mode 100644 apps/admin/app/dashboard/auth-control/email/page.tsx rename apps/admin/app/dashboard/{system/register.tsx => auth-control/general/page.tsx} (98%) create mode 100644 apps/admin/app/dashboard/auth-control/layout.tsx create mode 100644 apps/admin/app/dashboard/auth-control/page.tsx create mode 100644 apps/admin/app/dashboard/auth-control/phone/page.tsx delete mode 100644 apps/admin/app/dashboard/system/email.tsx create mode 100644 apps/admin/locales/cs-CZ/auth-control.json create mode 100644 apps/admin/locales/cs-CZ/email.json create mode 100644 apps/admin/locales/cs-CZ/phone.json create mode 100644 apps/admin/locales/de-DE/auth-control.json create mode 100644 apps/admin/locales/de-DE/email.json create mode 100644 apps/admin/locales/de-DE/phone.json create mode 100644 apps/admin/locales/en-US/auth-control.json create mode 100644 apps/admin/locales/en-US/email.json create mode 100644 apps/admin/locales/en-US/phone.json create mode 100644 apps/admin/locales/es-ES/auth-control.json create mode 100644 apps/admin/locales/es-ES/email.json create mode 100644 apps/admin/locales/es-ES/phone.json create mode 100644 apps/admin/locales/es-MX/auth-control.json create mode 100644 apps/admin/locales/es-MX/email.json create mode 100644 apps/admin/locales/es-MX/phone.json create mode 100644 apps/admin/locales/fa-IR/auth-control.json create mode 100644 apps/admin/locales/fa-IR/email.json create mode 100644 apps/admin/locales/fa-IR/phone.json create mode 100644 apps/admin/locales/fi-FI/auth-control.json create mode 100644 apps/admin/locales/fi-FI/email.json create mode 100644 apps/admin/locales/fi-FI/phone.json create mode 100644 apps/admin/locales/fr-FR/auth-control.json create mode 100644 apps/admin/locales/fr-FR/email.json create mode 100644 apps/admin/locales/fr-FR/phone.json create mode 100644 apps/admin/locales/hi-IN/auth-control.json create mode 100644 apps/admin/locales/hi-IN/email.json create mode 100644 apps/admin/locales/hi-IN/phone.json create mode 100644 apps/admin/locales/hu-HU/auth-control.json create mode 100644 apps/admin/locales/hu-HU/email.json create mode 100644 apps/admin/locales/hu-HU/phone.json create mode 100644 apps/admin/locales/ja-JP/auth-control.json create mode 100644 apps/admin/locales/ja-JP/email.json create mode 100644 apps/admin/locales/ja-JP/phone.json create mode 100644 apps/admin/locales/ko-KR/auth-control.json create mode 100644 apps/admin/locales/ko-KR/email.json create mode 100644 apps/admin/locales/ko-KR/phone.json create mode 100644 apps/admin/locales/no-NO/auth-control.json create mode 100644 apps/admin/locales/no-NO/email.json create mode 100644 apps/admin/locales/no-NO/phone.json create mode 100644 apps/admin/locales/pl-PL/auth-control.json create mode 100644 apps/admin/locales/pl-PL/email.json create mode 100644 apps/admin/locales/pl-PL/phone.json create mode 100644 apps/admin/locales/pt-BR/auth-control.json create mode 100644 apps/admin/locales/pt-BR/email.json create mode 100644 apps/admin/locales/pt-BR/phone.json create mode 100644 apps/admin/locales/ro-RO/auth-control.json create mode 100644 apps/admin/locales/ro-RO/email.json create mode 100644 apps/admin/locales/ro-RO/phone.json create mode 100644 apps/admin/locales/ru-RU/auth-control.json create mode 100644 apps/admin/locales/ru-RU/email.json create mode 100644 apps/admin/locales/ru-RU/phone.json create mode 100644 apps/admin/locales/th-TH/auth-control.json create mode 100644 apps/admin/locales/th-TH/email.json create mode 100644 apps/admin/locales/th-TH/phone.json create mode 100644 apps/admin/locales/tr-TR/auth-control.json create mode 100644 apps/admin/locales/tr-TR/email.json create mode 100644 apps/admin/locales/tr-TR/phone.json create mode 100644 apps/admin/locales/uk-UA/auth-control.json create mode 100644 apps/admin/locales/uk-UA/email.json create mode 100644 apps/admin/locales/uk-UA/phone.json create mode 100644 apps/admin/locales/vi-VN/auth-control.json create mode 100644 apps/admin/locales/vi-VN/email.json create mode 100644 apps/admin/locales/vi-VN/phone.json create mode 100644 apps/admin/locales/zh-CN/auth-control.json create mode 100644 apps/admin/locales/zh-CN/email.json create mode 100644 apps/admin/locales/zh-CN/phone.json create mode 100644 apps/admin/locales/zh-HK/auth-control.json create mode 100644 apps/admin/locales/zh-HK/email.json create mode 100644 apps/admin/locales/zh-HK/phone.json create mode 100644 apps/admin/services/admin/sms.ts create mode 100644 packages/ui/src/custom-components/area-code-select.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c3459a..7364e05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,39 +1,36 @@ + # Changelog # [1.0.0-beta.6](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.5...v1.0.0-beta.6) (2025-01-10) - ### 🐛 Bug Fixes -* **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d)) +- **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d)) # [1.0.0-beta.5](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2025-01-09) - ### ✨ Features -* **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d)) -* **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af)) -* **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166)) -* **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1)) -* **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e)) - +- **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d)) +- **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af)) +- **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166)) +- **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1)) +- **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e)) ### 🎫 Chores -* **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc)) -* **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429)) - +- **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc)) +- **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429)) ### 🐛 Bug Fixes -* **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d)) -* **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060)) -* **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0)) -* **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82)) -* **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a)) -* **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409)) +- **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d)) +- **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060)) +- **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0)) +- **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82)) +- **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a)) +- **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409)) diff --git a/apps/admin/app/dashboard/auth-control/email/page.tsx b/apps/admin/app/dashboard/auth-control/email/page.tsx new file mode 100644 index 0000000..86b315b --- /dev/null +++ b/apps/admin/app/dashboard/auth-control/email/page.tsx @@ -0,0 +1,179 @@ +'use client'; + +import { getEmailSmtpConfig, testEmailSmtp, updateEmailSmtpConfig } from '@/services/admin/system'; +import { useQuery } from '@tanstack/react-query'; +import { Button } from '@workspace/ui/components/button'; +import { Label } from '@workspace/ui/components/label'; +import { Switch } from '@workspace/ui/components/switch'; +import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; +import { HTMLEditor } from '@workspace/ui/custom-components/editor'; +import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; +import { useTranslations } from 'next-intl'; +import { useRef, useState } from 'react'; +import { toast } from 'sonner'; + +interface ConfigProps { + data?: Record & API.EmailSmtpConfig; + updateConfig: (key: string, value: unknown) => Promise; + isFetching?: boolean; +} + +export default function Page() { + const t = useTranslations('email'); + const ref = useRef>({}); + + const { data, refetch, isFetching } = useQuery({ + queryKey: ['getEmailSmtpConfig'], + queryFn: async () => { + const { data } = await getEmailSmtpConfig(); + ref.current = data.data as API.EmailSmtpConfig; + return data.data; + }, + }); + + async function updateConfig(key: string, value: unknown) { + if (data?.[key] === value) return; + try { + await updateEmailSmtpConfig({ + ...ref.current, + [key]: value, + } as API.EmailSmtpConfig); + toast.success(t('saveSuccess')); + refetch(); + } catch (error) { + /* empty */ + } + } + const [email, setEmail] = useState(); + + return ( + + + {t('emailBasicConfig')} + {t('emailTemplate')} + {t('emailLogs')} + + +
+ + + + {[ + { + key: 'email_smtp_host', + label: t('smtpServerAddress'), + description: t('smtpServerAddressDescription'), + }, + { + key: 'email_smtp_port', + label: t('smtpServerPort'), + description: t('smtpServerPortDescription'), + type: 'number', + }, + { + key: 'email_smtp_ssl', + label: t('smtpEncryptionMethod'), + description: t('smtpEncryptionMethodDescription'), + component: 'switch', + }, + { + key: 'email_smtp_user', + label: t('smtpAccount'), + description: t('smtpAccountDescription'), + }, + { + key: 'email_smtp_pass', + label: t('smtpPassword'), + description: t('smtpPasswordDescription'), + type: 'password', + }, + { + key: 'email_smtp_from', + label: t('senderAddress'), + description: t('senderAddressDescription'), + }, + ].map(({ key, label, description, type = 'text', component = 'input' }) => ( + + + +

{description}

+
+ + {component === 'input' ? ( + updateConfig(key, value)} + /> + ) : ( + updateConfig(key, checked)} + /> + )} + +
+ ))} + + + +

{t('sendTestEmailDescription')}

+
+ + setEmail(value as string)} + /> + + +
+
+
+
+ + +
+ {[ + 'verify_email_template', + 'expiration_email_template', + 'maintenance_email_template', + ].map((templateKey) => ( + { + updateConfig(templateKey, value); + }} + /> + ))} +
+
+ + +
+

TODO: placeholder for email logs

+
+
+
+
+ ); +} diff --git a/apps/admin/app/dashboard/system/register.tsx b/apps/admin/app/dashboard/auth-control/general/page.tsx similarity index 98% rename from apps/admin/app/dashboard/system/register.tsx rename to apps/admin/app/dashboard/auth-control/general/page.tsx index 89748bc..83b01c8 100644 --- a/apps/admin/app/dashboard/system/register.tsx +++ b/apps/admin/app/dashboard/auth-control/general/page.tsx @@ -10,8 +10,8 @@ import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { useTranslations } from 'next-intl'; import { toast } from 'sonner'; -export default function Register() { - const t = useTranslations('system.register'); +export default function Page() { + const t = useTranslations('auth-control'); const { data, refetch } = useQuery({ queryKey: ['getRegisterConfig'], diff --git a/apps/admin/app/dashboard/auth-control/layout.tsx b/apps/admin/app/dashboard/auth-control/layout.tsx new file mode 100644 index 0000000..ab362d9 --- /dev/null +++ b/apps/admin/app/dashboard/auth-control/layout.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { AuthControl } from '@/config/navs'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; +import { useTranslations } from 'next-intl'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +interface AuthControlLayoutProps { + children: React.ReactNode; +} + +export default function AuthControlLayout({ children }: Readonly) { + const pathname = usePathname(); + const t = useTranslations('menu'); + if (!pathname) return null; + return ( + + + {AuthControl.map((item) => ( + + {t(item.title)} + + ))} + + {children} + + ); +} diff --git a/apps/admin/app/dashboard/auth-control/page.tsx b/apps/admin/app/dashboard/auth-control/page.tsx new file mode 100644 index 0000000..f4efdd2 --- /dev/null +++ b/apps/admin/app/dashboard/auth-control/page.tsx @@ -0,0 +1,5 @@ +import { redirect } from 'next/navigation'; + +export default function Page() { + return redirect('/dashboard/auth-control/general'); +} diff --git a/apps/admin/app/dashboard/auth-control/phone/page.tsx b/apps/admin/app/dashboard/auth-control/phone/page.tsx new file mode 100644 index 0000000..589e139 --- /dev/null +++ b/apps/admin/app/dashboard/auth-control/phone/page.tsx @@ -0,0 +1,389 @@ +'use client'; + +import { ProTable, ProTableActions } from '@/components/pro-table'; +import { getSmsList } from '@/services/admin/sms'; +import { + getSmsConfig, + getSmsPlatform, + testSmsSend, + updateSmsConfig, +} from '@/services/admin/system'; +import { useQuery } from '@tanstack/react-query'; +import { Badge } from '@workspace/ui/components/badge'; +import { Button } from '@workspace/ui/components/button'; +import { Label } from '@workspace/ui/components/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@workspace/ui/components/select'; +import { Switch } from '@workspace/ui/components/switch'; +import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; +import { Textarea } from '@workspace/ui/components/textarea'; +import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select'; +import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; +import { formatDate } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; +import { useRef, useState } from 'react'; +import { toast } from 'sonner'; + +export default function Page() { + const t = useTranslations('phone'); + const { data, refetch, isFetching } = useQuery({ + queryKey: ['getSmsConfig'], + queryFn: async () => { + const { data } = await getSmsConfig(); + return data.data; + }, + }); + + const { data: platform } = useQuery({ + queryKey: ['getSmsPlatform'], + queryFn: async () => { + const { data } = await getSmsPlatform(); + return data.data?.list; + }, + }); + + async function updateConfig(key: string, value: unknown) { + if (data?.[key] === value) return; + try { + await updateSmsConfig({ + ...data, + [key]: value, + } as API.SmsConfig); + toast.success(t('updateSuccess')); + refetch(); + } catch (error) { + /* empty */ + } + } + const [params, setParams] = useState({ + telephone: '', + content: t('testSmsContent'), + area_code: '1', + }); + + return ( + + + {t('settings')} + {t('logs')} + + + + + + + + +

{t('enableTip')}

+
+ + updateConfig('sms_enabled', checked)} + disabled={isFetching} + /> + +
+ + + +

{t('expireTimeTip')}

+
+ + updateConfig('sms_expire', value)} + suffix='S' + disabled={isFetching} + placeholder={t('placeholders.expireTime')} + /> + +
+ + + +

{t('intervalTip')}

+
+ + updateConfig('sms_interval', value)} + suffix='S' + disabled={isFetching} + placeholder={t('placeholders.interval')} + /> + +
+ + + +

{t('limitTip')}

+
+ + updateConfig('sms_limit', value)} + disabled={isFetching} + placeholder={t('placeholders.limit')} + /> + +
+ + + +

{t('platformTip')}

+
+ + + +
+ + + +

{t('usernameTip')}

+
+ + updateConfig('sms_key', value)} + disabled={isFetching} + placeholder={t('placeholders.username')} + /> + +
+ + + +

{t('passwordTip')}

+
+ + updateConfig('sms_secret', value)} + disabled={isFetching} + type='password' + placeholder={t('placeholders.password')} + /> + +
+ + + +

{t('apiUrlTip')}

+
+ + updateConfig('sms_api_url', value)} + disabled={isFetching} + placeholder={t('placeholders.apiUrl')} + /> + +
+ + + +

{t('foreignApiUrlTip')}

+
+ + updateConfig('sms_api_foreign_url', value)} + disabled={isFetching} + placeholder={t('placeholders.foreignApiUrl')} + /> + +
+ + + +

{t('regionTip')}

+
+ + updateConfig('sms_region', value)} + disabled={isFetching} + placeholder={t('placeholders.region')} + /> + +
+ + + +

{t('templateCodeTip')}

+
+ + updateConfig('sms_template_code', value)} + disabled={isFetching} + placeholder={t('placeholders.templateCode')} + /> + +
+ + + +

{t('templateParamTip')}

+
+ + updateConfig('sms_template_param', value)} + disabled={isFetching} + placeholder={t('placeholders.templateParam')} + /> + +
+ + + +

+ {t('templateTip', { + code: '{{.Code}}', + })} +

+
+ +