feat(auth): Refactor mobile authentication config to support whitelist functionality

This commit is contained in:
web@ppanel 2025-02-14 22:13:50 +07:00
parent 5bac933fbc
commit c761ec7538
12 changed files with 92 additions and 49 deletions

View File

@ -24,9 +24,8 @@ export const useGlobalStore = create<GlobalStore>((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<GlobalStore>((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,

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -30,9 +30,8 @@ export const useGlobalStore = create<GlobalStore>((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<GlobalStore>((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,

View File

@ -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;

View File

@ -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;

View File

@ -22,9 +22,11 @@ interface AreaCodeSelectProps {
className?: string;
placeholder?: string;
simple?: boolean;
whitelist?: string[];
}
const items = countries
const filterItems = (whitelist?: string[]) => {
const baseItems = countries
.filter((item) => !!item.phone)
.map((item) => {
const phones = item.phone!.split(',');
@ -38,22 +40,28 @@ const items = countries
})
.flat();
if (!whitelist?.length) return baseItems;
return baseItems.filter((item) => whitelist.includes(item.phone!));
};
export const AreaCodeSelect = ({
value,
onChange,
className,
placeholder = 'Select Area Code',
simple = false,
whitelist,
}: AreaCodeSelectProps) => {
const [open, setOpen] = useState(false);
const [selectedItem, setSelectedItem] = useState<ICountry | undefined>();
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 (
<Popover open={open} onOpenChange={setOpen}>