From c761ec7538ab589fbbbfc84b6b2e50ce1a37dfe0 Mon Sep 17 00:00:00 2001 From: "web@ppanel" Date: Fri, 14 Feb 2025 22:13:50 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(auth):=20Refactor=20mobile=20a?= =?UTF-8?q?uthentication=20config=20to=20support=20whitelist=20functionali?= =?UTF-8?q?ty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/config/use-global.tsx | 9 ++--- apps/admin/services/admin/index.ts | 2 +- apps/admin/services/admin/typings.d.ts | 18 +++++++--- apps/admin/services/common/index.ts | 2 +- apps/admin/services/common/typings.d.ts | 20 ++++++++--- .../(user)/profile/third-party-accounts.tsx | 3 ++ apps/user/app/auth/phone/register-form.tsx | 2 ++ apps/user/config/use-global.tsx | 9 ++--- apps/user/services/common/index.ts | 2 +- apps/user/services/common/typings.d.ts | 20 ++++++++--- apps/user/services/user/typings.d.ts | 18 +++++++--- .../custom-components/area-code-select.tsx | 36 +++++++++++-------- 12 files changed, 92 insertions(+), 49 deletions(-) diff --git a/apps/admin/config/use-global.tsx b/apps/admin/config/use-global.tsx index cae3302..10c4b23 100644 --- a/apps/admin/config/use-global.tsx +++ b/apps/admin/config/use-global.tsx @@ -24,9 +24,8 @@ export const useGlobalStore = create((set) => ({ auth: { mobile: { enable: false, - limit: 0, - interval: 0, - expire_time: 0, + enable_whitelist: false, + whitelist: [], }, email: { enable: false, @@ -36,10 +35,6 @@ export const useGlobalStore = create((set) => ({ }, register: { stop_register: false, - enable_trial: false, - trial_subscribe: 0, - trial_time: 0, - trial_time_unit: '', enable_ip_register_limit: false, ip_register_limit: 0, ip_register_limit_duration: 0, diff --git a/apps/admin/services/admin/index.ts b/apps/admin/services/admin/index.ts index 1ca3f9e..5cf2608 100644 --- a/apps/admin/services/admin/index.ts +++ b/apps/admin/services/admin/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as announcement from './announcement'; diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index bcdbcc0..2270f86 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -68,7 +68,7 @@ declare namespace API { type AuthConfig = { mobile: MobileAuthenticateConfig; email: EmailAuthticateConfig; - register: RegisterConfig; + register: PubilcRegisterConfig; }; type AuthMethodConfig = { @@ -768,9 +768,8 @@ declare namespace API { type MobileAuthenticateConfig = { enable: boolean; - limit: number; - interval: number; - expire_time: number; + enable_whitelist: boolean; + whitelist: string[]; }; type NodeConfig = { @@ -876,6 +875,17 @@ declare namespace API { list: PlatformInfo[]; }; + type PubilcRegisterConfig = { + stop_register: boolean; + enable_ip_register_limit: boolean; + ip_register_limit: number; + ip_register_limit_duration: number; + }; + + type PubilcVerifyCodeConfig = { + verify_code_interval: number; + }; + type RegisterConfig = { stop_register: boolean; enable_trial: boolean; diff --git a/apps/admin/services/common/index.ts b/apps/admin/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/admin/services/common/index.ts +++ b/apps/admin/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index 4318a44..2bdb299 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -66,7 +66,7 @@ declare namespace API { type AuthConfig = { mobile: MobileAuthenticateConfig; email: EmailAuthticateConfig; - register: RegisterConfig; + register: PubilcRegisterConfig; }; type AuthMethodConfig = { @@ -152,7 +152,7 @@ declare namespace API { invite: InviteConfig; currency: CurrencyConfig; subscribe: SubscribeConfig; - verify_code: VerifyCodeConfig; + verify_code: PubilcVerifyCodeConfig; oauth_methods: string[]; }; @@ -208,9 +208,8 @@ declare namespace API { type MobileAuthenticateConfig = { enable: boolean; - limit: number; - interval: number; - expire_time: number; + enable_whitelist: boolean; + whitelist: string[]; }; type NodeConfig = { @@ -310,6 +309,17 @@ declare namespace API { enable: boolean; }; + type PubilcRegisterConfig = { + stop_register: boolean; + enable_ip_register_limit: boolean; + ip_register_limit: number; + ip_register_limit_duration: number; + }; + + type PubilcVerifyCodeConfig = { + verify_code_interval: number; + }; + type RegisterConfig = { stop_register: boolean; enable_trial: boolean; diff --git a/apps/user/app/(main)/(user)/profile/third-party-accounts.tsx b/apps/user/app/(main)/(user)/profile/third-party-accounts.tsx index 921650a..c50ea99 100644 --- a/apps/user/app/(main)/(user)/profile/third-party-accounts.tsx +++ b/apps/user/app/(main)/(user)/profile/third-party-accounts.tsx @@ -31,6 +31,8 @@ function MobileBindDialog({ children: React.ReactNode; }) { const t = useTranslations('profile.thirdParty'); + const { common } = useGlobalStore(); + const { enable_whitelist, whitelist } = common.auth.mobile; const [open, setOpen] = useState(false); const formSchema = z.object({ @@ -88,6 +90,7 @@ function MobileBindDialog({ className='w-32 rounded-r-none border-r-0' placeholder='Area code...' value={field.value} + whitelist={enable_whitelist ? whitelist : []} onChange={(value) => { if (value.phone) { form.setValue(field.name, value.phone); diff --git a/apps/user/app/auth/phone/register-form.tsx b/apps/user/app/auth/phone/register-form.tsx index 4697c6e..ded1617 100644 --- a/apps/user/app/auth/phone/register-form.tsx +++ b/apps/user/app/auth/phone/register-form.tsx @@ -29,6 +29,7 @@ export default function RegisterForm({ const t = useTranslations('auth.register'); const { common } = useGlobalStore(); const { verify, auth, invite } = common; + const { enable_whitelist, whitelist } = auth.mobile; const formSchema = z .object({ @@ -87,6 +88,7 @@ export default function RegisterForm({ className='w-32 rounded-r-none border-r-0' placeholder='Area code...' value={field.value} + whitelist={enable_whitelist ? whitelist : []} onChange={(value) => { if (value.phone) { form.setValue('telephone_area_code', value.phone); diff --git a/apps/user/config/use-global.tsx b/apps/user/config/use-global.tsx index 4eece58..fd0976f 100644 --- a/apps/user/config/use-global.tsx +++ b/apps/user/config/use-global.tsx @@ -30,9 +30,8 @@ export const useGlobalStore = create((set, get) => ({ auth: { mobile: { enable: false, - limit: 0, - interval: 0, - expire_time: 0, + enable_whitelist: false, + whitelist: [], }, email: { enable: false, @@ -42,10 +41,6 @@ export const useGlobalStore = create((set, get) => ({ }, register: { stop_register: false, - enable_trial: false, - trial_subscribe: 0, - trial_time: 0, - trial_time_unit: '', enable_ip_register_limit: false, ip_register_limit: 0, ip_register_limit_duration: 0, diff --git a/apps/user/services/common/index.ts b/apps/user/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/user/services/common/index.ts +++ b/apps/user/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index 4318a44..2bdb299 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -66,7 +66,7 @@ declare namespace API { type AuthConfig = { mobile: MobileAuthenticateConfig; email: EmailAuthticateConfig; - register: RegisterConfig; + register: PubilcRegisterConfig; }; type AuthMethodConfig = { @@ -152,7 +152,7 @@ declare namespace API { invite: InviteConfig; currency: CurrencyConfig; subscribe: SubscribeConfig; - verify_code: VerifyCodeConfig; + verify_code: PubilcVerifyCodeConfig; oauth_methods: string[]; }; @@ -208,9 +208,8 @@ declare namespace API { type MobileAuthenticateConfig = { enable: boolean; - limit: number; - interval: number; - expire_time: number; + enable_whitelist: boolean; + whitelist: string[]; }; type NodeConfig = { @@ -310,6 +309,17 @@ declare namespace API { enable: boolean; }; + type PubilcRegisterConfig = { + stop_register: boolean; + enable_ip_register_limit: boolean; + ip_register_limit: number; + ip_register_limit_duration: number; + }; + + type PubilcVerifyCodeConfig = { + verify_code_interval: number; + }; + type RegisterConfig = { stop_register: boolean; enable_trial: boolean; diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index fd5fccc..344f976 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -60,7 +60,7 @@ declare namespace API { type AuthConfig = { mobile: MobileAuthenticateConfig; email: EmailAuthticateConfig; - register: RegisterConfig; + register: PubilcRegisterConfig; }; type AuthMethodConfig = { @@ -264,9 +264,8 @@ declare namespace API { type MobileAuthenticateConfig = { enable: boolean; - limit: number; - interval: number; - expire_time: number; + enable_whitelist: boolean; + whitelist: string[]; }; type NodeConfig = { @@ -372,6 +371,17 @@ declare namespace API { deduction_amount: number; }; + type PubilcRegisterConfig = { + stop_register: boolean; + enable_ip_register_limit: boolean; + ip_register_limit: number; + ip_register_limit_duration: number; + }; + + type PubilcVerifyCodeConfig = { + verify_code_interval: number; + }; + type PurchaseOrderRequest = { subscribe_id: number; quantity: number; diff --git a/packages/ui/src/custom-components/area-code-select.tsx b/packages/ui/src/custom-components/area-code-select.tsx index 14b5bb1..ea89866 100644 --- a/packages/ui/src/custom-components/area-code-select.tsx +++ b/packages/ui/src/custom-components/area-code-select.tsx @@ -22,21 +22,27 @@ interface AreaCodeSelectProps { className?: string; placeholder?: string; simple?: boolean; + whitelist?: string[]; } -const items = countries - .filter((item) => !!item.phone) - .map((item) => { - const phones = item.phone!.split(','); - if (phones.length > 1) { - return [...phones].map((phone) => ({ - ...item, - phone, - })); - } - return item; - }) - .flat(); +const filterItems = (whitelist?: string[]) => { + const baseItems = countries + .filter((item) => !!item.phone) + .map((item) => { + const phones = item.phone!.split(','); + if (phones.length > 1) { + return [...phones].map((phone) => ({ + ...item, + phone, + })); + } + return item; + }) + .flat(); + + if (!whitelist?.length) return baseItems; + return baseItems.filter((item) => whitelist.includes(item.phone!)); +}; export const AreaCodeSelect = ({ value, @@ -44,16 +50,18 @@ export const AreaCodeSelect = ({ className, placeholder = 'Select Area Code', simple = false, + whitelist, }: AreaCodeSelectProps) => { const [open, setOpen] = useState(false); const [selectedItem, setSelectedItem] = useState(); + const items = filterItems(whitelist); useEffect(() => { if (value !== selectedItem?.phone) { const found = items.find((item) => item.phone === value); setSelectedItem(found); } - }, [selectedItem?.phone, value]); + }, [selectedItem?.phone, value, items]); return (