✨ feat(auth): Refactor mobile authentication config to support whitelist functionality
This commit is contained in:
parent
5bac933fbc
commit
c761ec7538
@ -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,
|
||||
|
||||
18
apps/admin/services/admin/typings.d.ts
vendored
18
apps/admin/services/admin/typings.d.ts
vendored
@ -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;
|
||||
|
||||
20
apps/admin/services/common/typings.d.ts
vendored
20
apps/admin/services/common/typings.d.ts
vendored
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,
|
||||
|
||||
20
apps/user/services/common/typings.d.ts
vendored
20
apps/user/services/common/typings.d.ts
vendored
@ -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;
|
||||
|
||||
18
apps/user/services/user/typings.d.ts
vendored
18
apps/user/services/user/typings.d.ts
vendored
@ -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;
|
||||
|
||||
@ -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}>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user