🐛 fix(user): Update notification and verify code settings

This commit is contained in:
web@ppanel 2025-02-14 15:39:25 +07:00
parent e3f9ef6ebe
commit 574b043be6
112 changed files with 500 additions and 502 deletions

View File

@ -3,13 +3,15 @@
import { Invite } from './invite';
import { Register } from './register';
import { Verify } from './verify';
import { VerifyCode } from './verify-code';
export default function Page() {
return (
<div className='space-y-3'>
<Register />
<Verify />
<Invite />
<Register />
<VerifyCode />
<Verify />
</div>
);
}

View File

@ -0,0 +1,95 @@
'use client';
import { getVerifyCodeConfig, updateVerifyCodeConfig } from '@/services/admin/system';
import { useQuery } from '@tanstack/react-query';
import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card';
import { Label } from '@workspace/ui/components/label';
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { useTranslations } from 'next-intl';
import { toast } from 'sonner';
export function VerifyCode() {
const t = useTranslations('auth-control.verify-code');
const { data, refetch } = useQuery({
queryKey: ['getVerifyCodeConfig'],
queryFn: async () => {
const { data } = await getVerifyCodeConfig();
return data.data;
},
});
async function updateConfig(key: string, value: unknown) {
if (data?.[key] === value) return;
try {
await updateVerifyCodeConfig({
...data,
[key]: value,
} as API.VerifyCodeConfig);
toast.success(t('saveSuccess'));
refetch();
} catch (error) {
/* empty */
}
}
return (
<Card className='mb-6'>
<CardHeader>
<CardTitle>{t('verifyCodeSettings')}</CardTitle>
</CardHeader>
<CardContent>
<Table>
<TableBody>
<TableRow>
<TableCell>
<Label>{t('expireTime')}</Label>
<p className='text-muted-foreground text-xs'>{t('expireTimeDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
placeholder='5'
value={data?.verify_code_expire_time}
onValueBlur={(value) => updateConfig('verify_code_expire_time', Number(value))}
suffix={t('minute')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('interval')}</Label>
<p className='text-muted-foreground text-xs'>{t('intervalDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
placeholder='60'
value={data?.verify_code_interval}
onValueBlur={(value) => updateConfig('verify_code_interval', Number(value))}
suffix={t('second')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('dailyLimit')}</Label>
<p className='text-muted-foreground text-xs'>{t('dailyLimitDescription')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
placeholder='15'
value={data?.verify_code_limit}
onValueBlur={(value) => updateConfig('verify_code_limit', Number(value))}
suffix={t('times')}
/>
</TableCell>
</TableRow>
</TableBody>
</Table>
</CardContent>
</Card>
);
}

View File

@ -96,71 +96,6 @@ export default function Page() {
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('expireTime')}</Label>
<p className='text-muted-foreground text-xs'>{t('expireTimeTip')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
min={0}
value={data?.config?.expire_time ?? 300}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
expire_time: value,
})
}
suffix='S'
disabled={isFetching}
placeholder={t('placeholders.expireTime')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell className='align-top'>
<Label>{t('interval')}</Label>
<p className='text-muted-foreground text-xs'>{t('intervalTip')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
value={data?.config?.interval ?? 60}
min={0}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
interval: value,
})
}
suffix='S'
disabled={isFetching}
placeholder={t('placeholders.interval')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('limit')}</Label>
<p className='text-muted-foreground text-xs'>{t('limitTip')}</p>
</TableCell>
<TableCell className='text-right'>
<EnhancedInput
type='number'
value={data?.config?.limit ?? 20}
min={0}
onValueBlur={(value) =>
updateConfig('config', {
...data?.config,
limit: value,
})
}
disabled={isFetching}
placeholder={t('placeholders.limit')}
/>
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<Label>{t('whitelistValidation')}</Label>

View File

@ -35,7 +35,7 @@ function getTimeRangeData(slots: API.TimePeriod[]) {
.filter((slot) => slot.start_time && slot.end_time)
.flatMap((slot) => {
const [startH = 0, startM = 0] = slot.start_time.split(':').map(Number);
const [endH = 0, endM = 0] = slot?.end_time?.split(':').map(Number);
const [endH = 0, endM = 0] = slot?.end_time.split(':').map(Number);
const start = startH * 60 + startM;
let end = endH * 60 + endM;
if (end < start) end += MINUTES_IN_DAY;
@ -117,7 +117,7 @@ export default function NodeConfig() {
}, [timeSlots]);
const chartConfig = useMemo(() => {
return chartTimeSlots.reduce(
return chartTimeSlots?.reduce(
(acc, item, index) => {
acc[item.name] = {
label: item.name,

View File

@ -12,8 +12,6 @@ import { toast } from 'sonner';
import * as z from 'zod';
const notifySettingsSchema = z.object({
enable_email_notify: z.boolean(),
enable_telegram_notify: z.boolean(),
enable_balance_notify: z.boolean(),
enable_login_notify: z.boolean(),
enable_subscribe_notify: z.boolean(),
@ -28,8 +26,6 @@ export function NotifySettingsForm({ user }: { user: API.User }) {
const form = useForm<NotifySettingsValues>({
resolver: zodResolver(notifySettingsSchema),
defaultValues: {
enable_email_notify: user.enable_email_notify,
enable_telegram_notify: user.enable_telegram_notify,
enable_balance_notify: user.enable_balance_notify,
enable_login_notify: user.enable_login_notify,
enable_subscribe_notify: user.enable_subscribe_notify,
@ -57,32 +53,6 @@ export function NotifySettingsForm({ user }: { user: API.User }) {
</CardHeader>
<CardContent className='space-y-4'>
<div className='grid grid-cols-1 gap-4'>
<FormField
control={form.control}
name='enable_email_notify'
render={({ field }) => (
<FormItem className='flex items-center justify-between space-x-2'>
<FormLabel>{t('emailNotifications')}</FormLabel>
<FormControl>
<Switch checked={field.value} onCheckedChange={field.onChange} />
</FormControl>
</FormItem>
)}
/>
<FormField
control={form.control}
name='enable_telegram_notify'
render={({ field }) => (
<FormItem className='flex items-center justify-between space-x-2'>
<FormLabel>{t('telegramNotifications')}</FormLabel>
<FormControl>
<Switch checked={field.value} onCheckedChange={field.onChange} />
</FormControl>
</FormItem>
)}
/>
<FormField
control={form.control}
name='enable_balance_notify'

View File

@ -37,6 +37,9 @@ 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,
@ -48,8 +51,8 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
only_first_purchase: false,
},
currency: {
currency_unit: '',
currency_symbol: '',
currency_unit: 'USD',
currency_symbol: '$',
},
subscribe: {
single_model: false,
@ -57,6 +60,11 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
subscribe_domain: '',
pan_domain: false,
},
verify_code: {
verify_code_expire_time: 5,
verify_code_limit: 15,
verify_code_interval: 60,
},
oauth_methods: [],
},
user: undefined,

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Tajný klíč turniketu poskytovaný Cloudflare",
"turnstileSiteKeyDescription": "Klíč pro web turniketu poskytovaný Cloudflare",
"verifySettings": "Nastavení ověření"
},
"verify-code": {
"dailyLimit": "Denní limit",
"dailyLimitDescription": "Maximální počet ověřovacích kódů, které lze odeslat za den",
"expireTime": "Čas vypršení",
"expireTimeDescription": "Doba platnosti ověřovacího kódu (minuty)",
"interval": "Interval odesílání",
"intervalDescription": "Minimální interval mezi odesíláním ověřovacích kódů (sekundy)",
"minute": "minuty",
"saveSuccess": "Uložení úspěšné",
"second": "sekundy",
"times": "krát",
"verifyCodeSettings": "Nastavení ověřovacího kódu"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Povolit",
"enableTip": "Po povolení budou povoleny funkce registrace, přihlášení, připojení a odpojení mobilního telefonu",
"endpointLabel": "Koncový bod",
"expireTime": "Čas vypršení",
"expireTimeTip": "Doba platnosti ověřovacího kódu SMS (v sekundách)",
"interval": "Interval",
"intervalTip": "Interval odesílání SMS ověřovacího kódu pro stejné telefonní číslo (v sekundách), 0 znamená bez omezení",
"limit": "Denní limit",
"limitTip": "Denní limit pro odesílání ověřovacích SMS kódů na stejné telefonní číslo, 0 znamená bez omezení",
"logs": "Protokoly",
"phoneNumberLabel": "Telefonní číslo",
"placeholders": {
"expireTime": "Zadejte dobu vypršení, výchozí je 300",
"interval": "Zadejte interval, výchozí je 60",
"limit": "Zadejte denní limit, výchozí je 20",
"template": "Váš ověřovací kód je {code}, platný po dobu 5 minut",
"templateCode": "Zadejte kód šablony"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Upravit předplatné",
"editUser": "Upravit uživatele",
"email": "e-mail",
"emailNotifications": "E-mailová oznámení",
"enable": "Povolit",
"expireTime": "Čas vypršení",
"expiredAt": "Platnost vypršela",
@ -82,7 +81,6 @@
"subscriptionName": "Název předplatného",
"subscriptionNotifications": "Oznámení o předplatném",
"success": "Úspěch",
"telegramNotifications": "Telegram oznámení",
"telephone": "Telefonní číslo",
"telephonePlaceholder": "Zadejte telefonní číslo",
"time": "Čas",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Turnstile-Geheimschlüssel, bereitgestellt von Cloudflare",
"turnstileSiteKeyDescription": "Turnstile-Seitenschlüssel, bereitgestellt von Cloudflare",
"verifySettings": "Überprüfungseinstellungen"
},
"verify-code": {
"dailyLimit": "Tägliches Limit",
"dailyLimitDescription": "Maximale Anzahl von Bestätigungscodes, die pro Tag gesendet werden können",
"expireTime": "Ablaufzeit",
"expireTimeDescription": "Ablaufzeit des Bestätigungscodes (Minuten)",
"interval": "Sendeintervall",
"intervalDescription": "Minimales Intervall zwischen dem Versenden von Bestätigungscodes (Sekunden)",
"minute": "Minuten",
"saveSuccess": "Erfolgreich gespeichert",
"second": "Sekunden",
"times": "Mal",
"verifyCodeSettings": "Einstellungen für den Bestätigungscode"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Aktivieren",
"enableTip": "Nach der Aktivierung werden die Funktionen zur Registrierung, Anmeldung, Bindung und Entbindung von Mobiltelefonen aktiviert",
"endpointLabel": "Endpunkt",
"expireTime": "Ablaufzeit",
"expireTimeTip": "Gültigkeitsdauer des SMS-Bestätigungscodes (Sekunden)",
"interval": "Intervall",
"intervalTip": "SMS-Bestätigungscode-Sendeintervall für dieselbe Telefonnummer (Sekunden), 0 bedeutet keine Begrenzung",
"limit": "Tageslimit",
"limitTip": "Tägliches Limit für das Senden von SMS-Verifizierungscodes an dieselbe Telefonnummer, 0 bedeutet kein Limit",
"logs": "Protokolle",
"phoneNumberLabel": "Telefonnummer",
"placeholders": {
"expireTime": "Geben Sie die Ablaufzeit ein, Standard ist 300",
"interval": "Geben Sie das Intervall ein, Standard ist 60",
"limit": "Geben Sie das tägliche Limit ein, Standard ist 20",
"template": "Ihr Bestätigungscode ist {code}, gültig für 5 Minuten",
"templateCode": "Geben Sie den Vorlagen-Code ein"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Abonnement bearbeiten",
"editUser": "Benutzer bearbeiten",
"email": "E-Mail",
"emailNotifications": "E-Mail-Benachrichtigungen",
"enable": "Aktivieren",
"expireTime": "Ablaufzeit",
"expiredAt": "Abgelaufen am",
@ -82,7 +81,6 @@
"subscriptionName": "Abonnementname",
"subscriptionNotifications": "Abonnement-Benachrichtigungen",
"success": "Erfolg",
"telegramNotifications": "Telegram-Benachrichtigungen",
"telephone": "Telefonnummer",
"telephonePlaceholder": "Telefonnummer eingeben",
"time": "Zeit",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Turnstile secret key provided by Cloudflare",
"turnstileSiteKeyDescription": "Turnstile site key provided by Cloudflare",
"verifySettings": "Verify Settings"
},
"verify-code": {
"dailyLimit": "Daily Limit",
"dailyLimitDescription": "Maximum number of verification codes that can be sent per day",
"expireTime": "Expire Time",
"expireTimeDescription": "Verification code expiration time (minutes)",
"interval": "Send Interval",
"intervalDescription": "Minimum interval between sending verification codes (seconds)",
"minute": "minutes",
"saveSuccess": "Save Successful",
"second": "seconds",
"times": "times",
"verifyCodeSettings": "Verification Code Settings"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Enable",
"enableTip": "After enabling, mobile phone registration, login, binding, and unbinding functions will be enabled",
"endpointLabel": "Endpoint",
"expireTime": "Expire Time",
"expireTimeTip": "SMS verification code validity period (seconds)",
"interval": "Interval",
"intervalTip": "SMS verification code sending interval for the same phone number (seconds), 0 means no limit",
"limit": "Daily Limit",
"limitTip": "Daily SMS verification code sending limit for the same phone number, 0 means no limit",
"logs": "Logs",
"phoneNumberLabel": "Phone Number",
"placeholders": {
"expireTime": "Enter expire time, default is 300",
"interval": "Enter interval time, default is 60",
"limit": "Enter daily limit, default is 20",
"template": "Your verification code is {code}, valid for 5 minutes",
"templateCode": "Enter template code"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Edit Subscription",
"editUser": "Edit User",
"email": "Email",
"emailNotifications": "Email Notifications",
"enable": "Enable",
"expireTime": "Expire Time",
"expiredAt": "Expired At",
@ -82,7 +81,6 @@
"subscriptionName": "Subscription Name",
"subscriptionNotifications": "Subscription Notifications",
"success": "Success",
"telegramNotifications": "Telegram Notifications",
"telephone": "Phone Number",
"telephonePlaceholder": "Enter phone number",
"time": "Time",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Clave secreta de Turnstile proporcionada por Cloudflare",
"turnstileSiteKeyDescription": "Clave del sitio de Turnstile proporcionada por Cloudflare",
"verifySettings": "Configuración de Verificación"
},
"verify-code": {
"dailyLimit": "Límite Diario",
"dailyLimitDescription": "Número máximo de códigos de verificación que se pueden enviar por día",
"expireTime": "Tiempo de Expiración",
"expireTimeDescription": "Tiempo de expiración del código de verificación (minutos)",
"interval": "Intervalo de Envío",
"intervalDescription": "Intervalo mínimo entre el envío de códigos de verificación (segundos)",
"minute": "minutos",
"saveSuccess": "Guardado Exitoso",
"second": "segundos",
"times": "veces",
"verifyCodeSettings": "Configuración del Código de Verificación"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Habilitar",
"enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil",
"endpointLabel": "Punto final",
"expireTime": "Tiempo de Expiración",
"expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)",
"interval": "Intervalo",
"intervalTip": "Intervalo de envío del código de verificación por SMS para el mismo número de teléfono (segundos), 0 significa sin límite",
"limit": "Límite Diario",
"limitTip": "Límite diario de envío de códigos de verificación por SMS para el mismo número de teléfono, 0 significa sin límite",
"logs": "Registros",
"phoneNumberLabel": "Número de Teléfono",
"placeholders": {
"expireTime": "Ingrese el tiempo de expiración, el valor predeterminado es 300",
"interval": "Ingrese el tiempo de intervalo, el valor predeterminado es 60",
"limit": "Ingrese el límite diario, el valor predeterminado es 20",
"template": "Su código de verificación es {code}, válido por 5 minutos",
"templateCode": "Ingrese el código de la plantilla"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Editar suscripción",
"editUser": "Editar usuario",
"email": "correo electrónico",
"emailNotifications": "Notificaciones por correo electrónico",
"enable": "Habilitar",
"expireTime": "Tiempo de Expiración",
"expiredAt": "Fecha de vencimiento",
@ -82,7 +81,6 @@
"subscriptionName": "Nombre de la Suscripción",
"subscriptionNotifications": "Notificaciones de suscripción",
"success": "Éxito",
"telegramNotifications": "Notificaciones de Telegram",
"telephone": "Número de Teléfono",
"telephonePlaceholder": "Ingrese número de teléfono",
"time": "Hora",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Clave secreta de Turnstile proporcionada por Cloudflare",
"turnstileSiteKeyDescription": "Clave del sitio de Turnstile proporcionada por Cloudflare",
"verifySettings": "Configuración de Verificación"
},
"verify-code": {
"dailyLimit": "Límite Diario",
"dailyLimitDescription": "Número máximo de códigos de verificación que se pueden enviar por día",
"expireTime": "Tiempo de Expiración",
"expireTimeDescription": "Tiempo de expiración del código de verificación (minutos)",
"interval": "Intervalo de Envío",
"intervalDescription": "Intervalo mínimo entre el envío de códigos de verificación (segundos)",
"minute": "minutos",
"saveSuccess": "Guardado Exitoso",
"second": "segundos",
"times": "veces",
"verifyCodeSettings": "Configuración del Código de Verificación"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Habilitar",
"enableTip": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación del teléfono móvil",
"endpointLabel": "Punto final",
"expireTime": "Tiempo de Expiración",
"expireTimeTip": "Periodo de validez del código de verificación por SMS (segundos)",
"interval": "Intervalo",
"intervalTip": "Intervalo de envío del código de verificación por SMS para el mismo número de teléfono (segundos), 0 significa sin límite",
"limit": "Límite Diario",
"limitTip": "Límite diario de envío de códigos de verificación por SMS para el mismo número de teléfono, 0 significa sin límite",
"logs": "Registros",
"phoneNumberLabel": "Número de Teléfono",
"placeholders": {
"expireTime": "Ingrese el tiempo de expiración, el valor predeterminado es 300",
"interval": "Ingrese el tiempo de intervalo, el valor predeterminado es 60",
"limit": "Ingrese el límite diario, el valor predeterminado es 20",
"template": "Su código de verificación es {code}, válido por 5 minutos",
"templateCode": "Ingrese el código de la plantilla"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Editar Suscripción",
"editUser": "Editar usuario",
"email": "correo electrónico",
"emailNotifications": "Notificaciones por Correo Electrónico",
"enable": "Habilitar",
"expireTime": "Tiempo de Expiración",
"expiredAt": "Fecha de vencimiento",
@ -82,7 +81,6 @@
"subscriptionName": "Nombre de la Suscripción",
"subscriptionNotifications": "Notificaciones de Suscripción",
"success": "Éxito",
"telegramNotifications": "Notificaciones de Telegram",
"telephone": "Número de Teléfono",
"telephonePlaceholder": "Ingrese número de teléfono",
"time": "Hora",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "کلید مخفی ترنستایل ارائه شده توسط Cloudflare",
"turnstileSiteKeyDescription": "کلید سایت ترنستایل ارائه شده توسط Cloudflare",
"verifySettings": "تنظیمات تأیید"
},
"verify-code": {
"dailyLimit": "حداکثر روزانه",
"dailyLimitDescription": "حداکثر تعداد کدهای تأیید که می‌توان در روز ارسال کرد",
"expireTime": "زمان انقضا",
"expireTimeDescription": "زمان انقضای کد تأیید (دقیقه)",
"interval": "فاصله ارسال",
"intervalDescription": "حداقل فاصله بین ارسال کدهای تأیید (ثانیه)",
"minute": "دقیقه",
"saveSuccess": "ذخیره با موفقیت",
"second": "ثانیه",
"times": "بار",
"verifyCodeSettings": "تنظیمات کد تأیید"
}
}

View File

@ -4,18 +4,9 @@
"enable": "فعال کردن",
"enableTip": "پس از فعال‌سازی، عملکردهای ثبت‌نام، ورود، اتصال و قطع اتصال تلفن همراه فعال خواهند شد",
"endpointLabel": "نقطه پایانی",
"expireTime": "زمان انقضا",
"expireTimeTip": "مدت اعتبار کد تأیید پیامکی (ثانیه)",
"interval": "فاصله زمانی",
"intervalTip": "فاصله زمانی ارسال کد تأیید پیامکی برای همان شماره تلفن (ثانیه)، 0 به معنای بدون محدودیت است",
"limit": "محدودیت روزانه",
"limitTip": "محدودیت ارسال کد تأییدیه پیامکی روزانه برای همان شماره تلفن، ۰ به معنای بدون محدودیت است",
"logs": "لاگ‌ها",
"phoneNumberLabel": "شماره تلفن",
"placeholders": {
"expireTime": "زمان انقضا را وارد کنید، پیش‌فرض ۳۰۰ است",
"interval": "زمان فاصله را وارد کنید، پیش‌فرض ۶۰ است",
"limit": "محدودیت روزانه را وارد کنید، پیش‌فرض ۲۰ است",
"template": "کد تأیید شما {code} است و به مدت ۵ دقیقه معتبر است",
"templateCode": "کد قالب را وارد کنید"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "ویرایش اشتراک",
"editUser": "ویرایش کاربر",
"email": "ایمیل",
"emailNotifications": "اعلان‌های ایمیل",
"enable": "فعال کردن",
"expireTime": "زمان انقضا",
"expiredAt": "منقضی شده در",
@ -82,7 +81,6 @@
"subscriptionName": "نام اشتراک",
"subscriptionNotifications": "اعلان‌های اشتراک",
"success": "موفقیت",
"telegramNotifications": "اعلان‌های تلگرام",
"telephone": "شماره تلفن",
"telephonePlaceholder": "شماره تلفن را وارد کنید",
"time": "زمان",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Turnstile-salaisavain, jonka Cloudflare on toimittanut",
"turnstileSiteKeyDescription": "Turnstile-sivuston avain, jonka Cloudflare on toimittanut",
"verifySettings": "Vahvistusasetukset"
},
"verify-code": {
"dailyLimit": "Päivittäinen raja",
"dailyLimitDescription": "Suurin määrä vahvistuskoodien lähettämistä päivässä",
"expireTime": "Voimassaoloaika",
"expireTimeDescription": "Vahvistuskoodin voimassaoloaika (minuutteina)",
"interval": "Lähetysväli",
"intervalDescription": "Minimi väli vahvistuskoodien lähettämisen välillä (sekunteina)",
"minute": "minuuttia",
"saveSuccess": "Tallennus onnistui",
"second": "sekuntia",
"times": "kertaa",
"verifyCodeSettings": "Vahvistuskoodin asetukset"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Ota käyttöön",
"enableTip": "Kun otat tämän käyttöön, matkapuhelimen rekisteröinti-, kirjautumis-, sitomis- ja purkutoiminnot otetaan käyttöön",
"endpointLabel": "Päätepiste",
"expireTime": "Vanhentumisaika",
"expireTimeTip": "Tekstiviestivarmennuskoodin voimassaoloaika (sekunteina)",
"interval": "Aikaväli",
"intervalTip": "Saman puhelinnumeron SMS-varmistuskoodin lähetysväli (sekunteina), 0 tarkoittaa ei rajoitusta",
"limit": "Päivittäinen raja",
"limitTip": "Päivittäinen tekstiviestivarmistuskoodin lähetysraja samalle puhelinnumerolle, 0 tarkoittaa ei rajoitusta",
"logs": "Lokit",
"phoneNumberLabel": "Puhelinnumero",
"placeholders": {
"expireTime": "Syötä vanhentumisaika, oletus on 300",
"interval": "Anna aikaväli, oletus on 60",
"limit": "Anna päivittäinen raja, oletus on 20",
"template": "Vahvistuskoodisi on {code}, voimassa 5 minuuttia",
"templateCode": "Anna mallikoodi"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Muokkaa tilausta",
"editUser": "Muokkaa käyttäjää",
"email": "sähköposti",
"emailNotifications": "Sähköposti-ilmoitukset",
"enable": "Ota käyttöön",
"expireTime": "Vanhentumisaika",
"expiredAt": "Vanhentunut",
@ -82,7 +81,6 @@
"subscriptionName": "Tilauksen nimi",
"subscriptionNotifications": "Tilausilmoitukset",
"success": "Onnistuminen",
"telegramNotifications": "Telegram-ilmoitukset",
"telephone": "Puhelinnumero",
"telephonePlaceholder": "Syötä puhelinnumero",
"time": "Aika",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Clé secrète de tourniquet fournie par Cloudflare",
"turnstileSiteKeyDescription": "Clé de site de tourniquet fournie par Cloudflare",
"verifySettings": "Paramètres de vérification"
},
"verify-code": {
"dailyLimit": "Limite quotidienne",
"dailyLimitDescription": "Nombre maximum de codes de vérification pouvant être envoyés par jour",
"expireTime": "Temps d'expiration",
"expireTimeDescription": "Temps d'expiration du code de vérification (minutes)",
"interval": "Intervalle d'envoi",
"intervalDescription": "Intervalle minimum entre l'envoi des codes de vérification (secondes)",
"minute": "minutes",
"saveSuccess": "Enregistrement réussi",
"second": "secondes",
"times": "fois",
"verifyCodeSettings": "Paramètres du code de vérification"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Activer",
"enableTip": "Après activation, les fonctions d'enregistrement, de connexion, de liaison et de déliaison par téléphone mobile seront activées",
"endpointLabel": "Point de terminaison",
"expireTime": "Date d'expiration",
"expireTimeTip": "Période de validité du code de vérification par SMS (secondes)",
"interval": "Intervalle",
"intervalTip": "Intervalle d'envoi du code de vérification par SMS pour le même numéro de téléphone (secondes), 0 signifie aucune limite",
"limit": "Limite quotidienne",
"limitTip": "Limite quotidienne d'envoi de code de vérification par SMS pour le même numéro de téléphone, 0 signifie aucune limite",
"logs": "Journaux",
"phoneNumberLabel": "Numéro de téléphone",
"placeholders": {
"expireTime": "Entrez le temps d'expiration, par défaut 300",
"interval": "Entrez le temps d'intervalle, par défaut 60",
"limit": "Entrez la limite quotidienne, par défaut 20",
"template": "Votre code de vérification est {code}, valable pendant 5 minutes",
"templateCode": "Entrez le code du modèle"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Modifier l'abonnement",
"editUser": "Modifier l'utilisateur",
"email": "e-mail",
"emailNotifications": "Notifications par e-mail",
"enable": "Activer",
"expireTime": "Date d'expiration",
"expiredAt": "Expiré le",
@ -82,7 +81,6 @@
"subscriptionName": "Nom de l'abonnement",
"subscriptionNotifications": "Notifications d'abonnement",
"success": "Succès",
"telegramNotifications": "Notifications Telegram",
"telephone": "Numéro de téléphone",
"telephonePlaceholder": "Entrez le numéro de téléphone",
"time": "Temps",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "क्लाउडफ्लेयर द्वारा प्रदान की गई टर्नस्टाइल गुप्त कुंजी",
"turnstileSiteKeyDescription": "क्लाउडफ्लेयर द्वारा प्रदान की गई टर्नस्टाइल साइट कुंजी",
"verifySettings": "सत्यापन सेटिंग्स"
},
"verify-code": {
"dailyLimit": "दैनिक सीमा",
"dailyLimitDescription": "प्रति दिन भेजे जा सकने वाले अधिकतम सत्यापन कोड की संख्या",
"expireTime": "समाप्ति समय",
"expireTimeDescription": "सत्यापन कोड की समाप्ति का समय (मिनट)",
"interval": "भेजने का अंतराल",
"intervalDescription": "सत्यापन कोड भेजने के बीच का न्यूनतम अंतराल (सेकंड)",
"minute": "मिनट",
"saveSuccess": "सफलतापूर्वक सहेजा गया",
"second": "सेकंड",
"times": "बार",
"verifyCodeSettings": "सत्यापन कोड सेटिंग्स"
}
}

View File

@ -4,18 +4,9 @@
"enable": "सक्षम करें",
"enableTip": "सक्षम करने के बाद, मोबाइल फोन पंजीकरण, लॉगिन, बाइंडिंग, और अनबाइंडिंग कार्यक्षमताएँ सक्षम हो जाएँगी",
"endpointLabel": "अंतिम बिंदु",
"expireTime": "समाप्ति समय",
"expireTimeTip": "एसएमएस सत्यापन कोड की वैधता अवधि (सेकंड)",
"interval": "अंतराल",
"intervalTip": "उसी फोन नंबर के लिए एसएमएस सत्यापन कोड भेजने का अंतराल (सेकंड में), 0 का मतलब है कोई सीमा नहीं",
"limit": "दैनिक सीमा",
"limitTip": "उसी फोन नंबर के लिए दैनिक एसएमएस सत्यापन कोड भेजने की सीमा, 0 का मतलब कोई सीमा नहीं है",
"logs": "लॉग्स",
"phoneNumberLabel": "फोन नंबर",
"placeholders": {
"expireTime": "समाप्ति समय दर्ज करें, डिफ़ॉल्ट 300 है",
"interval": "अंतराल समय दर्ज करें, डिफ़ॉल्ट 60 है",
"limit": "दैनिक सीमा दर्ज करें, डिफ़ॉल्ट 20 है",
"template": "आपका सत्यापन कोड {code} है, 5 मिनट के लिए मान्य",
"templateCode": "टेम्पलेट कोड दर्ज करें"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "सदस्यता संपादित करें",
"editUser": "उपयोगकर्ता संपादित करें",
"email": "ईमेल",
"emailNotifications": "ईमेल सूचनाएं",
"enable": "सक्षम करें",
"expireTime": "समाप्ति समय",
"expiredAt": "समाप्ति तिथि",
@ -82,7 +81,6 @@
"subscriptionName": "सदस्यता नाम",
"subscriptionNotifications": "सदस्यता सूचनाएं",
"success": "सफलता",
"telegramNotifications": "टेलीग्राम सूचनाएं",
"telephone": "फ़ोन नंबर",
"telephonePlaceholder": "फ़ोन नंबर दर्ज करें",
"time": "समय",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "A Cloudflare által biztosított forgókapu titkos kulcs",
"turnstileSiteKeyDescription": "A Cloudflare által biztosított forgókapu webhely kulcs",
"verifySettings": "Ellenőrzési beállítások"
},
"verify-code": {
"dailyLimit": "Napi Korlát",
"dailyLimitDescription": "A naponta küldhető ellenőrző kódok maximális száma",
"expireTime": "Lejárati Idő",
"expireTimeDescription": "Az ellenőrző kód lejárati ideje (perc)",
"interval": "Küldési Intervallum",
"intervalDescription": "Minimum intervallum az ellenőrző kódok küldése között (másodperc)",
"minute": "perc",
"saveSuccess": "Mentés Sikeres",
"second": "másodperc",
"times": "alkalom",
"verifyCodeSettings": "Ellenőrző Kód Beállítások"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Engedélyez",
"enableTip": "A bekapcsolás után a mobiltelefon regisztráció, bejelentkezés, kötés és oldás funkciók elérhetővé válnak",
"endpointLabel": "Végpont",
"expireTime": "Lejárati idő",
"expireTimeTip": "Az SMS ellenőrző kód érvényességi ideje (másodpercben)",
"interval": "Intervallum",
"intervalTip": "SMS ellenőrző kód küldési intervalluma ugyanarra a telefonszámra (másodpercben), 0 azt jelenti, hogy nincs korlátozás",
"limit": "Napi limit",
"limitTip": "Napi SMS ellenőrző kód küldési limit ugyanarra a telefonszámra, 0 azt jelenti, hogy nincs korlátozás",
"logs": "Naplók",
"phoneNumberLabel": "Telefonszám",
"placeholders": {
"expireTime": "Adja meg a lejárati időt, alapértelmezett érték: 300",
"interval": "Adja meg az intervallum időt, alapértelmezett 60",
"limit": "Adja meg a napi limitet, alapértelmezett 20",
"template": "Az Ön ellenőrző kódja {code}, érvényes 5 percig",
"templateCode": "Adja meg a sablonkódot"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Előfizetés szerkesztése",
"editUser": "Felhasználó szerkesztése",
"email": "e-mail",
"emailNotifications": "Email értesítések",
"enable": "Engedélyezés",
"expireTime": "Lejárati idő",
"expiredAt": "Lejárati dátum",
@ -82,7 +81,6 @@
"subscriptionName": "Előfizetés neve",
"subscriptionNotifications": "Előfizetési értesítések",
"success": "Siker",
"telegramNotifications": "Telegram értesítések",
"telephone": "Telefonszám",
"telephonePlaceholder": "Adja meg a telefonszámot",
"time": "Idő",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Cloudflareが提供するターンスタイル秘密鍵",
"turnstileSiteKeyDescription": "Cloudflareが提供するターンスタイルサイトキー",
"verifySettings": "確認設定"
},
"verify-code": {
"dailyLimit": "1日の制限",
"dailyLimitDescription": "1日に送信できる認証コードの最大数",
"expireTime": "有効期限",
"expireTimeDescription": "認証コードの有効期限(分)",
"interval": "送信間隔",
"intervalDescription": "認証コード送信の最小間隔(秒)",
"minute": "分",
"saveSuccess": "保存成功",
"second": "秒",
"times": "回",
"verifyCodeSettings": "認証コード設定"
}
}

View File

@ -4,18 +4,9 @@
"enable": "有効にする",
"enableTip": "有効にすると、携帯電話の登録、ログイン、バインド、アンバインド機能が有効になります",
"endpointLabel": "エンドポイント",
"expireTime": "有効期限",
"expireTimeTip": "SMS認証コードの有効期間",
"interval": "間隔",
"intervalTip": "同じ電話番号へのSMS認証コード送信間隔、0は制限なしを意味します",
"limit": "1日の制限",
"limitTip": "同一の電話番号に対する1日のSMS認証コード送信制限。0は制限なしを意味します。",
"logs": "ログ",
"phoneNumberLabel": "電話番号",
"placeholders": {
"expireTime": "有効期限を入力してください。デフォルトは300です",
"interval": "間隔時間を入力してください。デフォルトは60です",
"limit": "1日の制限を入力してください。デフォルトは20です",
"template": "あなたの認証コードは{code}です。5分間有効です",
"templateCode": "テンプレートコードを入力してください"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "サブスクリプションを編集",
"editUser": "ユーザー編集",
"email": "メールアドレス",
"emailNotifications": "メール通知",
"enable": "有効",
"expireTime": "有効期限",
"expiredAt": "有効期限",
@ -82,7 +81,6 @@
"subscriptionName": "サブスクリプション名",
"subscriptionNotifications": "サブスクリプション通知",
"success": "成功",
"telegramNotifications": "Telegram通知",
"telephone": "電話番号",
"telephonePlaceholder": "電話番号を入力してください",
"time": "時間",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Cloudflare에서 제공하는 턴스타일 비밀 키",
"turnstileSiteKeyDescription": "Cloudflare에서 제공하는 턴스타일 사이트 키",
"verifySettings": "검증 설정"
},
"verify-code": {
"dailyLimit": "일일 한도",
"dailyLimitDescription": "하루에 보낼 수 있는 인증 코드의 최대 수",
"expireTime": "만료 시간",
"expireTimeDescription": "인증 코드 만료 시간(분)",
"interval": "전송 간격",
"intervalDescription": "인증 코드 전송 간의 최소 간격(초)",
"minute": "분",
"saveSuccess": "저장 성공",
"second": "초",
"times": "회",
"verifyCodeSettings": "인증 코드 설정"
}
}

View File

@ -4,18 +4,9 @@
"enable": "활성화",
"enableTip": "활성화 후, 휴대폰 등록, 로그인, 연결 및 연결 해제 기능이 활성화됩니다",
"endpointLabel": "엔드포인트",
"expireTime": "만료 시간",
"expireTimeTip": "SMS 인증 코드 유효 기간 (초)",
"interval": "간격",
"intervalTip": "같은 전화번호로 SMS 인증 코드를 보내는 간격(초), 0은 제한 없음",
"limit": "일일 한도",
"limitTip": "동일한 전화번호에 대한 일일 SMS 인증 코드 전송 제한, 0은 제한 없음",
"logs": "로그",
"phoneNumberLabel": "전화번호",
"placeholders": {
"expireTime": "만료 시간을 입력하세요. 기본값은 300입니다",
"interval": "간격 시간을 입력하세요, 기본값은 60입니다",
"limit": "일일 제한을 입력하세요, 기본값은 20입니다",
"template": "귀하의 인증 코드는 {code}이며, 5분 동안 유효합니다",
"templateCode": "템플릿 코드를 입력하세요"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "구독 수정",
"editUser": "사용자 편집",
"email": "이메일",
"emailNotifications": "이메일 알림",
"enable": "사용",
"expireTime": "만료 시간",
"expiredAt": "만료일",
@ -82,7 +81,6 @@
"subscriptionName": "구독 이름",
"subscriptionNotifications": "구독 알림",
"success": "성공",
"telegramNotifications": "텔레그램 알림",
"telephone": "전화번호",
"telephonePlaceholder": "전화번호 입력",
"time": "시간",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Turnstile hemmelig nøkkel levert av Cloudflare",
"turnstileSiteKeyDescription": "Turnstile nettsted nøkkel levert av Cloudflare",
"verifySettings": "Verifiseringsinnstillinger"
},
"verify-code": {
"dailyLimit": "Dagsgrense",
"dailyLimitDescription": "Maksimalt antall bekreftelseskoder som kan sendes per dag",
"expireTime": "Utløpstid",
"expireTimeDescription": "Utløpstid for bekreftelseskode (minutter)",
"interval": "Sendingsintervall",
"intervalDescription": "Minimum intervall mellom sending av bekreftelseskoder (sekunder)",
"minute": "minutter",
"saveSuccess": "Lagring vellykket",
"second": "sekunder",
"times": "ganger",
"verifyCodeSettings": "Innstillinger for bekreftelseskode"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Aktiver",
"enableTip": "Etter aktivering vil funksjonene for registrering, innlogging, binding og frakobling av mobiltelefon bli aktivert",
"endpointLabel": "Endepunkt",
"expireTime": "Utløpstid",
"expireTimeTip": "Gyldighetsperiode for SMS-bekreftelseskode (sekunder)",
"interval": "Intervall",
"intervalTip": "SMS-verifiseringskode sendingsintervall for samme telefonnummer (sekunder), 0 betyr ingen begrensning",
"limit": "Daglig grense",
"limitTip": "Daglig grense for sending av SMS-verifiseringskode til samme telefonnummer, 0 betyr ingen grense",
"logs": "Logger",
"phoneNumberLabel": "Telefonnummer",
"placeholders": {
"expireTime": "Skriv inn utløpstid, standard er 300",
"interval": "Skriv inn intervalltid, standard er 60",
"limit": "Skriv inn daglig grense, standard er 20",
"template": "Din verifiseringskode er {code}, gyldig i 5 minutter",
"templateCode": "Skriv inn malkode"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Rediger abonnement",
"editUser": "Rediger bruker",
"email": "e-post",
"emailNotifications": "E-postvarsler",
"enable": "Aktiver",
"expireTime": "Utløpstid",
"expiredAt": "Utløpt Dato",
@ -82,7 +81,6 @@
"subscriptionName": "Abonnementsnavn",
"subscriptionNotifications": "Abonnementsvarsler",
"success": "Suksess",
"telegramNotifications": "Telegramvarsler",
"telephone": "Telefonnummer",
"telephonePlaceholder": "Skriv inn telefonnummer",
"time": "Tid",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Sekretny klucz bramki dostarczony przez Cloudflare",
"turnstileSiteKeyDescription": "Klucz witryny bramki dostarczony przez Cloudflare",
"verifySettings": "Ustawienia weryfikacji"
},
"verify-code": {
"dailyLimit": "Limit dzienny",
"dailyLimitDescription": "Maksymalna liczba kodów weryfikacyjnych, które można wysłać dziennie",
"expireTime": "Czas wygaśnięcia",
"expireTimeDescription": "Czas wygaśnięcia kodu weryfikacyjnego (minuty)",
"interval": "Interwał wysyłania",
"intervalDescription": "Minimalny interwał między wysyłaniem kodów weryfikacyjnych (sekundy)",
"minute": "minuty",
"saveSuccess": "Zapisano pomyślnie",
"second": "sekundy",
"times": "razy",
"verifyCodeSettings": "Ustawienia kodu weryfikacyjnego"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Włącz",
"enableTip": "Po włączeniu zostaną aktywowane funkcje rejestracji, logowania, wiązania i odwiązywania telefonu komórkowego",
"endpointLabel": "Punkt końcowy",
"expireTime": "Czas wygaśnięcia",
"expireTimeTip": "Okres ważności kodu weryfikacyjnego SMS (sekundy)",
"interval": "Interwał",
"intervalTip": "Interwał wysyłania kodu weryfikacyjnego SMS dla tego samego numeru telefonu (w sekundach), 0 oznacza brak ograniczeń",
"limit": "Dzienne ograniczenie",
"limitTip": "Dzienny limit wysyłania kodów weryfikacyjnych SMS dla tego samego numeru telefonu, 0 oznacza brak limitu",
"logs": "Dzienniki",
"phoneNumberLabel": "Numer telefonu",
"placeholders": {
"expireTime": "Wprowadź czas wygaśnięcia, domyślnie 300",
"interval": "Wprowadź czas interwału, domyślnie 60",
"limit": "Wprowadź dzienny limit, domyślnie 20",
"template": "Twój kod weryfikacyjny to {code}, ważny przez 5 minut",
"templateCode": "Wprowadź kod szablonu"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Edytuj subskrypcję",
"editUser": "Edytuj użytkownika",
"email": "e-mail",
"emailNotifications": "Powiadomienia e-mailowe",
"enable": "Włącz",
"expireTime": "Czas wygaśnięcia",
"expiredAt": "Data wygaśnięcia",
@ -82,7 +81,6 @@
"subscriptionName": "Nazwa subskrypcji",
"subscriptionNotifications": "Powiadomienia o subskrypcji",
"success": "Sukces",
"telegramNotifications": "Powiadomienia Telegram",
"telephone": "Numer telefonu",
"telephonePlaceholder": "Wprowadź numer telefonu",
"time": "Czas",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Chave secreta do Turnstile fornecida pela Cloudflare",
"turnstileSiteKeyDescription": "Chave do site do Turnstile fornecida pela Cloudflare",
"verifySettings": "Configurações de Verificação"
},
"verify-code": {
"dailyLimit": "Limite Diário",
"dailyLimitDescription": "Número máximo de códigos de verificação que podem ser enviados por dia",
"expireTime": "Tempo de Expiração",
"expireTimeDescription": "Tempo de expiração do código de verificação (minutos)",
"interval": "Intervalo de Envio",
"intervalDescription": "Intervalo mínimo entre o envio de códigos de verificação (segundos)",
"minute": "minutos",
"saveSuccess": "Salvo com Sucesso",
"second": "segundos",
"times": "vezes",
"verifyCodeSettings": "Configurações do Código de Verificação"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Habilitar",
"enableTip": "Após a ativação, as funções de registro, login, vinculação e desvinculação de telefone celular serão ativadas",
"endpointLabel": "Endpoint",
"expireTime": "Tempo de Expiração",
"expireTimeTip": "Período de validade do código de verificação por SMS (segundos)",
"interval": "Intervalo",
"intervalTip": "Intervalo de envio do código de verificação por SMS para o mesmo número de telefone (segundos), 0 significa sem limite",
"limit": "Limite Diário",
"limitTip": "Limite diário de envio de código de verificação por SMS para o mesmo número de telefone, 0 significa sem limite",
"logs": "Registros",
"phoneNumberLabel": "Número de Telefone",
"placeholders": {
"expireTime": "Insira o tempo de expiração, o padrão é 300",
"interval": "Insira o tempo de intervalo, o padrão é 60",
"limit": "Insira o limite diário, o padrão é 20",
"template": "Seu código de verificação é {code}, válido por 5 minutos",
"templateCode": "Insira o código do modelo"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Editar Assinatura",
"editUser": "Editar Usuário",
"email": "e-mail",
"emailNotifications": "Notificações por Email",
"enable": "Habilitar",
"expireTime": "Tempo de Expiração",
"expiredAt": "Expirado Em",
@ -82,7 +81,6 @@
"subscriptionName": "Nome da Assinatura",
"subscriptionNotifications": "Notificações de Assinatura",
"success": "Sucesso",
"telegramNotifications": "Notificações do Telegram",
"telephone": "Número de Telefone",
"telephonePlaceholder": "Digite o número de telefone",
"time": "Hora",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Cheia secretă a turnstilei furnizată de Cloudflare",
"turnstileSiteKeyDescription": "Cheia site-ului turnstile furnizată de Cloudflare",
"verifySettings": "Setări Verificare"
},
"verify-code": {
"dailyLimit": "Limită Zilnică",
"dailyLimitDescription": "Numărul maxim de coduri de verificare care pot fi trimise pe zi",
"expireTime": "Timp de Expirare",
"expireTimeDescription": "Timpul de expirare a codului de verificare (minute)",
"interval": "Interval de Trimitere",
"intervalDescription": "Intervalul minim între trimiterea codurilor de verificare (secunde)",
"minute": "minute",
"saveSuccess": "Salvare cu Succes",
"second": "secunde",
"times": "ori",
"verifyCodeSettings": "Setări Cod de Verificare"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Activează",
"enableTip": "După activare, funcțiile de înregistrare, autentificare, asociere și disociere a telefonului mobil vor fi activate",
"endpointLabel": "Punct de acces",
"expireTime": "Timp de expirare",
"expireTimeTip": "Perioada de valabilitate a codului de verificare prin SMS (secunde)",
"interval": "Interval",
"intervalTip": "Intervalul de trimitere a codului de verificare prin SMS pentru același număr de telefon (secunde), 0 înseamnă fără limită",
"limit": "Limită zilnică",
"limitTip": "Limita zilnică de trimitere a codului de verificare prin SMS pentru același număr de telefon, 0 înseamnă fără limită",
"logs": "Jurnale",
"phoneNumberLabel": "Număr de telefon",
"placeholders": {
"expireTime": "Introduceți timpul de expirare, implicit este 300",
"interval": "Introduceți timpul de interval, implicit este 60",
"limit": "Introduceți limita zilnică, implicit este 20",
"template": "Codul dumneavoastră de verificare este {code}, valabil timp de 5 minute",
"templateCode": "Introduceți codul șablonului"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Editează Abonamentul",
"editUser": "Editare utilizator",
"email": "e-mail",
"emailNotifications": "Notificări prin email",
"enable": "Activare",
"expireTime": "Timp de expirare",
"expiredAt": "Expiră la",
@ -82,7 +81,6 @@
"subscriptionName": "Numele Abonamentului",
"subscriptionNotifications": "Notificări de abonament",
"success": "Succes",
"telegramNotifications": "Notificări Telegram",
"telephone": "Număr de telefon",
"telephonePlaceholder": "Introduceți numărul de telefon",
"time": "Timp",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Секретный ключ Turnstile, предоставленный Cloudflare",
"turnstileSiteKeyDescription": "Ключ сайта Turnstile, предоставленный Cloudflare",
"verifySettings": "Настройки проверки"
},
"verify-code": {
"dailyLimit": "Ежедневный лимит",
"dailyLimitDescription": "Максимальное количество кодов подтверждения, которые можно отправить за день",
"expireTime": "Время истечения",
"expireTimeDescription": "Время истечения кода подтверждения (минуты)",
"interval": "Интервал отправки",
"intervalDescription": "Минимальный интервал между отправкой кодов подтверждения (секунды)",
"minute": "минуты",
"saveSuccess": "Сохранение успешно",
"second": "секунды",
"times": "раз",
"verifyCodeSettings": "Настройки кода подтверждения"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Включить",
"enableTip": "После включения будут доступны функции регистрации, входа, привязки и отвязки мобильного телефона",
"endpointLabel": "Конечная точка",
"expireTime": "Время истечения",
"expireTimeTip": "Срок действия кода подтверждения по SMS (в секундах)",
"interval": "Интервал",
"intervalTip": "Интервал отправки SMS-кода подтверждения для одного и того же номера телефона (в секундах), 0 означает отсутствие ограничений",
"limit": "Дневной лимит",
"limitTip": "Дневной лимит отправки SMS-кодов подтверждения на один и тот же номер телефона, 0 означает отсутствие лимита",
"logs": "Журналы",
"phoneNumberLabel": "Номер телефона",
"placeholders": {
"expireTime": "Введите время истечения, по умолчанию 300",
"interval": "Введите интервал времени, по умолчанию 60",
"limit": "Введите дневной лимит, по умолчанию 20",
"template": "Ваш проверочный код: {code}, действителен в течение 5 минут",
"templateCode": "Введите код шаблона"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Редактировать подписку",
"editUser": "Редактировать пользователя",
"email": "Электронная почта",
"emailNotifications": "Уведомления по электронной почте",
"enable": "Включить",
"expireTime": "Время истечения",
"expiredAt": "Срок действия истек",
@ -82,7 +81,6 @@
"subscriptionName": "Название подписки",
"subscriptionNotifications": "Уведомления о подписке",
"success": "Успех",
"telegramNotifications": "Уведомления Telegram",
"telephone": "Номер телефона",
"telephonePlaceholder": "Введите номер телефона",
"time": "Время",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "รหัสลับ Turnstile ที่จัดเตรียมโดย Cloudflare",
"turnstileSiteKeyDescription": "รหัสไซต์ Turnstile ที่จัดเตรียมโดย Cloudflare",
"verifySettings": "การตั้งค่าการตรวจสอบ"
},
"verify-code": {
"dailyLimit": "ขีดจำกัดรายวัน",
"dailyLimitDescription": "จำนวนสูงสุดของรหัสยืนยันที่สามารถส่งได้ต่อวัน",
"expireTime": "เวลาหมดอายุ",
"expireTimeDescription": "เวลาหมดอายุของรหัสยืนยัน (นาที)",
"interval": "ช่วงเวลาส่ง",
"intervalDescription": "ช่วงเวลาขั้นต่ำระหว่างการส่งรหัสยืนยัน (วินาที)",
"minute": "นาที",
"saveSuccess": "บันทึกสำเร็จ",
"second": "วินาที",
"times": "ครั้ง",
"verifyCodeSettings": "การตั้งค่ารหัสยืนยัน"
}
}

View File

@ -4,18 +4,9 @@
"enable": "เปิดใช้งาน",
"enableTip": "หลังจากเปิดใช้งานแล้ว ฟังก์ชันการลงทะเบียน การเข้าสู่ระบบ การผูก และการยกเลิกการผูกโทรศัพท์มือถือจะถูกเปิดใช้งาน",
"endpointLabel": "จุดสิ้นสุด",
"expireTime": "เวลาหมดอายุ",
"expireTimeTip": "ระยะเวลาหมดอายุของรหัสยืนยันทาง SMS (วินาที)",
"interval": "ช่วงเวลา",
"intervalTip": "ช่วงเวลาการส่งรหัสยืนยันทาง SMS สำหรับหมายเลขโทรศัพท์เดียวกัน (วินาที), 0 หมายถึงไม่มีข้อจำกัด",
"limit": "ขีดจำกัดรายวัน",
"limitTip": "จำกัดการส่งรหัสยืนยันทาง SMS รายวันสำหรับหมายเลขโทรศัพท์เดียวกัน, 0 หมายถึงไม่จำกัด",
"logs": "บันทึก",
"phoneNumberLabel": "หมายเลขโทรศัพท์",
"placeholders": {
"expireTime": "กรอกเวลาหมดอายุ ค่าเริ่มต้นคือ 300",
"interval": "กรอกช่วงเวลา ค่าเริ่มต้นคือ 60",
"limit": "กรอกขีดจำกัดรายวัน ค่าเริ่มต้นคือ 20",
"template": "รหัสยืนยันของคุณคือ {code} ใช้ได้ภายใน 5 นาที",
"templateCode": "กรอกรหัสเทมเพลต"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "แก้ไขการสมัครสมาชิก",
"editUser": "แก้ไขผู้ใช้",
"email": "อีเมล",
"emailNotifications": "การแจ้งเตือนทางอีเมล",
"enable": "เปิดใช้งาน",
"expireTime": "เวลาหมดอายุ",
"expiredAt": "วันหมดอายุ",
@ -82,7 +81,6 @@
"subscriptionName": "ชื่อการสมัครสมาชิก",
"subscriptionNotifications": "การแจ้งเตือนการสมัครสมาชิก",
"success": "สำเร็จ",
"telegramNotifications": "การแจ้งเตือนทาง Telegram",
"telephone": "หมายเลขโทรศัพท์",
"telephonePlaceholder": "กรอกหมายเลขโทรศัพท์",
"time": "เวลา",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Cloudflare tarafından sağlanan turnstile gizli anahtarı.",
"turnstileSiteKeyDescription": "Cloudflare tarafından sağlanan turnstile site anahtarı.",
"verifySettings": "Doğrulama Ayarları"
},
"verify-code": {
"dailyLimit": "Günlük Limit",
"dailyLimitDescription": "Günde gönderilebilecek maksimum doğrulama kodu sayısı",
"expireTime": "Son Kullanma Süresi",
"expireTimeDescription": "Doğrulama kodunun son kullanma süresi (dakika)",
"interval": "Gönderim Aralığı",
"intervalDescription": "Doğrulama kodlarının gönderimi arasındaki minimum aralık (saniye)",
"minute": "dakika",
"saveSuccess": "Başarıyla Kaydedildi",
"second": "saniye",
"times": "kez",
"verifyCodeSettings": "Doğrulama Kodu Ayarları"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Etkinleştir",
"enableTip": "Etkinleştirildikten sonra, cep telefonu kaydı, giriş, bağlama ve bağlantı kesme işlevleri etkinleştirilecektir",
"endpointLabel": "Uç Nokta",
"expireTime": "Sona Erme Süresi",
"expireTimeTip": "SMS doğrulama kodu geçerlilik süresi (saniye)",
"interval": "Aralık",
"intervalTip": "Aynı telefon numarası için SMS doğrulama kodu gönderme aralığı (saniye), 0 sınırsız demektir",
"limit": "Günlük Limit",
"limitTip": "Aynı telefon numarası için günlük SMS doğrulama kodu gönderim limiti, 0 sınırsız demektir",
"logs": "Günlükler",
"phoneNumberLabel": "Telefon Numarası",
"placeholders": {
"expireTime": "Sona erme süresini girin, varsayılan 300",
"interval": "Aralık süresini girin, varsayılan 60'tır",
"limit": "Günlük limiti girin, varsayılan 20'dir",
"template": "Doğrulama kodunuz {code}, 5 dakika geçerlidir",
"templateCode": "Şablon kodunu girin"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Aboneliği Düzenle",
"editUser": "Kullanıcıyı Düzenle",
"email": "e-posta",
"emailNotifications": "E-posta Bildirimleri",
"enable": "etkinleştir",
"expireTime": "Sona Erme Zamanı",
"expiredAt": "Son Kullanma Tarihi",
@ -82,7 +81,6 @@
"subscriptionName": "Abonelik Adı",
"subscriptionNotifications": "Abonelik Bildirimleri",
"success": "Başarı",
"telegramNotifications": "Telegram Bildirimleri",
"telephone": "Telefon Numarası",
"telephonePlaceholder": "Telefon numarasını girin",
"time": "Zaman",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Секретний ключ Turnstile, наданий Cloudflare",
"turnstileSiteKeyDescription": "Ключ сайту Turnstile, наданий Cloudflare",
"verifySettings": "Налаштування перевірки"
},
"verify-code": {
"dailyLimit": "Щоденний ліміт",
"dailyLimitDescription": "Максимальна кількість кодів підтвердження, які можуть бути надіслані за день",
"expireTime": "Час закінчення",
"expireTimeDescription": "Час закінчення коду підтвердження (хвилини)",
"interval": "Інтервал надсилання",
"intervalDescription": "Мінімальний інтервал між надсиланням кодів підтвердження (секунди)",
"minute": "хвилин",
"saveSuccess": "Успішно збережено",
"second": "секунд",
"times": "разів",
"verifyCodeSettings": "Налаштування коду підтвердження"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Увімкнути",
"enableTip": "Після увімкнення будуть доступні функції реєстрації, входу, прив'язки та відв'язки мобільного телефону",
"endpointLabel": "Кінцева точка",
"expireTime": "Час закінчення",
"expireTimeTip": "Термін дії коду перевірки SMS (секунди)",
"interval": "Інтервал",
"intervalTip": "Інтервал відправки SMS-коду підтвердження для одного і того ж номера телефону (в секундах), 0 означає без обмежень",
"limit": "Денний ліміт",
"limitTip": "Добова межа відправлення SMS-кодів перевірки для одного і того ж номера телефону, 0 означає відсутність обмежень",
"logs": "Журнали",
"phoneNumberLabel": "Номер телефону",
"placeholders": {
"expireTime": "Введіть час закінчення, за замовчуванням 300",
"interval": "Введіть інтервал часу, за замовчуванням 60",
"limit": "Введіть денний ліміт, за замовчуванням 20",
"template": "Ваш код підтвердження {code}, дійсний протягом 5 хвилин",
"templateCode": "Введіть код шаблону"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Редагувати підписку",
"editUser": "Редагувати користувача",
"email": "електронна пошта",
"emailNotifications": "Сповіщення електронною поштою",
"enable": "Увімкнути",
"expireTime": "Час закінчення",
"expiredAt": "Термін дії закінчився",
@ -82,7 +81,6 @@
"subscriptionName": "Назва підписки",
"subscriptionNotifications": "Сповіщення про підписку",
"success": "Успіх",
"telegramNotifications": "Сповіщення Telegram",
"telephone": "Номер телефону",
"telephonePlaceholder": "Введіть номер телефону",
"time": "Час",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Khóa bí mật Turnstile được cung cấp bởi Cloudflare",
"turnstileSiteKeyDescription": "Khóa trang Turnstile được cung cấp bởi Cloudflare",
"verifySettings": "Cài đặt Xác minh"
},
"verify-code": {
"dailyLimit": "Giới hạn hàng ngày",
"dailyLimitDescription": "Số lượng mã xác minh tối đa có thể gửi trong một ngày",
"expireTime": "Thời gian hết hạn",
"expireTimeDescription": "Thời gian hết hạn của mã xác minh (phút)",
"interval": "Khoảng thời gian gửi",
"intervalDescription": "Khoảng thời gian tối thiểu giữa các lần gửi mã xác minh (giây)",
"minute": "phút",
"saveSuccess": "Lưu thành công",
"second": "giây",
"times": "lần",
"verifyCodeSettings": "Cài đặt mã xác minh"
}
}

View File

@ -4,18 +4,9 @@
"enable": "Kích hoạt",
"enableTip": "Sau khi kích hoạt, các chức năng đăng ký, đăng nhập, liên kết và hủy liên kết điện thoại di động sẽ được kích hoạt",
"endpointLabel": "Điểm cuối",
"expireTime": "Thời Gian Hết Hạn",
"expireTimeTip": "Thời gian hiệu lực của mã xác minh SMS (giây)",
"interval": "Khoảng thời gian",
"intervalTip": "Khoảng thời gian gửi mã xác minh SMS cho cùng một số điện thoại (giây), 0 có nghĩa là không giới hạn",
"limit": "Giới hạn hàng ngày",
"limitTip": "Giới hạn gửi mã xác minh SMS hàng ngày cho cùng một số điện thoại, 0 có nghĩa là không giới hạn",
"logs": "Nhật ký",
"phoneNumberLabel": "Số Điện Thoại",
"placeholders": {
"expireTime": "Nhập thời gian hết hạn, mặc định là 300",
"interval": "Nhập thời gian khoảng cách, mặc định là 60",
"limit": "Nhập giới hạn hàng ngày, mặc định là 20",
"template": "Mã xác minh của bạn là {code}, có hiệu lực trong 5 phút",
"templateCode": "Nhập mã mẫu"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "Chỉnh sửa Đăng ký",
"editUser": "Chỉnh sửa người dùng",
"email": "Email",
"emailNotifications": "Thông báo qua Email",
"enable": "Kích hoạt",
"expireTime": "Thời gian hết hạn",
"expiredAt": "Ngày hết hạn",
@ -82,7 +81,6 @@
"subscriptionName": "Tên Đăng Ký",
"subscriptionNotifications": "Thông báo Đăng ký",
"success": "Thành công",
"telegramNotifications": "Thông báo Telegram",
"telephone": "Số điện thoại",
"telephonePlaceholder": "Nhập số điện thoại",
"time": "Thời Gian",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "由 Cloudflare 提供的闸机密钥",
"turnstileSiteKeyDescription": "由 Cloudflare 提供的闸机站点密钥",
"verifySettings": "验证设置"
},
"verify-code": {
"dailyLimit": "每日限制",
"dailyLimitDescription": "每天最多可发送的验证码数量",
"expireTime": "过期时间",
"expireTimeDescription": "验证码的有效期(分钟)",
"interval": "发送间隔",
"intervalDescription": "两次发送验证码的最小间隔时间(秒)",
"minute": "分钟",
"saveSuccess": "保存成功",
"second": "秒",
"times": "次",
"verifyCodeSettings": "验证码设置"
}
}

View File

@ -4,18 +4,9 @@
"enable": "启用",
"enableTip": "启用后,将启用手机注册、登录、绑定和解绑功能",
"endpointLabel": "端点",
"expireTime": "过期时间",
"expireTimeTip": "短信验证码有效期(秒)",
"interval": "间隔",
"intervalTip": "同一手机号发送短信验证码的间隔时间0表示无限制",
"limit": "每日限额",
"limitTip": "同一手机号每日短信验证码发送限制0表示无限制",
"logs": "日志",
"phoneNumberLabel": "电话号码",
"placeholders": {
"expireTime": "输入过期时间默认为300",
"interval": "输入间隔时间默认为60",
"limit": "输入每日限制默认为20",
"template": "您的验证码是{code}有效期为5分钟",
"templateCode": "输入模板代码"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "编辑订阅",
"editUser": "编辑用户",
"email": "邮箱",
"emailNotifications": "邮件通知",
"enable": "启用",
"expireTime": "到期时间",
"expiredAt": "过期时间",
@ -82,7 +81,6 @@
"subscriptionName": "订阅名称",
"subscriptionNotifications": "订阅通知",
"success": "成功",
"telegramNotifications": "Telegram通知",
"telephone": "手机号",
"telephonePlaceholder": "输入手机号",
"time": "时间",

View File

@ -58,5 +58,18 @@
"turnstileSecretDescription": "Cloudflare 提供的轉閘密鑰",
"turnstileSiteKeyDescription": "Cloudflare 提供的轉閘網站密鑰",
"verifySettings": "驗證設置"
},
"verify-code": {
"dailyLimit": "每日限制",
"dailyLimitDescription": "每天可以發送的最大驗證碼數量",
"expireTime": "過期時間",
"expireTimeDescription": "驗證碼過期時間(分鐘)",
"interval": "發送間隔",
"intervalDescription": "發送驗證碼的最小間隔(秒)",
"minute": "分鐘",
"saveSuccess": "保存成功",
"second": "秒",
"times": "次",
"verifyCodeSettings": "驗證碼設置"
}
}

View File

@ -4,18 +4,9 @@
"enable": "啟用",
"enableTip": "啟用後,將啟用手機註冊、登入、綁定和解綁功能",
"endpointLabel": "端點",
"expireTime": "到期時間",
"expireTimeTip": "SMS 驗證碼有效期(秒)",
"interval": "間隔",
"intervalTip": "相同電話號碼的短信驗證碼發送間隔0 表示無限制",
"limit": "每日限額",
"limitTip": "同一電話號碼每日發送SMS驗證碼的限制0表示無限制",
"logs": "日誌",
"phoneNumberLabel": "電話號碼",
"placeholders": {
"expireTime": "輸入過期時間預設為300",
"interval": "輸入間隔時間默認為60",
"limit": "輸入每日限制默認為20",
"template": "您的驗證碼是{code}有效期為5分鐘",
"templateCode": "輸入模板代碼"
},

View File

@ -39,7 +39,6 @@
"editSubscription": "編輯訂閱",
"editUser": "編輯使用者",
"email": "電子郵件",
"emailNotifications": "電郵通知",
"enable": "啟用",
"expireTime": "到期時間",
"expiredAt": "到期時間",
@ -82,7 +81,6 @@
"subscriptionName": "訂閱名稱",
"subscriptionNotifications": "訂閱通知",
"success": "成功",
"telegramNotifications": "Telegram 通知",
"telephone": "電話號碼",
"telephonePlaceholder": "輸入電話號碼",
"time": "時間",

View File

@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as announcement from './announcement';

View File

@ -323,6 +323,32 @@ export async function updateTosConfig(body: API.TosConfig, options?: { [key: str
});
}
/** Get Verify Code Config GET /v1/admin/system/verify_code_config */
export async function getVerifyCodeConfig(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.VerifyCodeConfig }>(
'/v1/admin/system/verify_code_config',
{
method: 'GET',
...(options || {}),
},
);
}
/** Update Verify Code Config PUT /v1/admin/system/verify_code_config */
export async function updateVerifyCodeConfig(
body: API.VerifyCodeConfig,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: any }>('/v1/admin/system/verify_code_config', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** Get verify config GET /v1/admin/system/verify_config */
export async function getVerifyConfig(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.VerifyConfig }>('/v1/admin/system/verify_config', {

View File

@ -1362,8 +1362,6 @@ declare namespace API {
type UpdateUserNotifySettingRequest = {
user_id: number;
enable_email_notify: boolean;
enable_telegram_notify: boolean;
enable_balance_notify: boolean;
enable_login_notify: boolean;
enable_subscribe_notify: boolean;
@ -1390,9 +1388,6 @@ declare namespace API {
referer_id: number;
enable: boolean;
is_admin?: boolean;
valid_email: boolean;
enable_email_notify: boolean;
enable_telegram_notify: boolean;
enable_balance_notify: boolean;
enable_login_notify: boolean;
enable_subscribe_notify: boolean;
@ -1497,6 +1492,12 @@ declare namespace API {
download: number;
};
type VerifyCodeConfig = {
verify_code_expire_time: number;
verify_code_limit: number;
verify_code_interval: number;
};
type VerifyConfig = {
turnstile_site_key: string;
turnstile_secret: string;

View File

@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';

View File

@ -152,6 +152,7 @@ declare namespace API {
invite: InviteConfig;
currency: CurrencyConfig;
subscribe: SubscribeConfig;
verify_code: VerifyCodeConfig;
oauth_methods: string[];
};
@ -579,9 +580,6 @@ declare namespace API {
referer_id: number;
enable: boolean;
is_admin?: boolean;
valid_email: boolean;
enable_email_notify: boolean;
enable_telegram_notify: boolean;
enable_balance_notify: boolean;
enable_login_notify: boolean;
enable_subscribe_notify: boolean;
@ -686,6 +684,12 @@ declare namespace API {
enable_reset_password_verify: boolean;
};
type VerifyCodeConfig = {
verify_code_expire_time: number;
verify_code_limit: number;
verify_code_interval: number;
};
type VerifyConfig = {
turnstile_site_key: string;
turnstile_secret: string;

View File

@ -13,9 +13,6 @@ import { toast } from 'sonner';
import { z } from 'zod';
const FormSchema = z.object({
telegram: z.number().nullish(),
enable_email_notify: z.boolean(),
enable_telegram_notify: z.boolean(),
enable_balance_notify: z.boolean(),
enable_login_notify: z.boolean(),
enable_subscribe_notify: z.boolean(),
@ -28,9 +25,6 @@ export default function NotifySettings() {
const form = useForm<z.infer<typeof FormSchema>>({
resolver: zodResolver(FormSchema),
defaultValues: {
telegram: user?.telegram,
enable_email_notify: user?.enable_email_notify,
enable_telegram_notify: user?.enable_telegram_notify,
enable_balance_notify: user?.enable_balance_notify,
enable_login_notify: user?.enable_login_notify,
enable_subscribe_notify: user?.enable_subscribe_notify,
@ -59,8 +53,6 @@ export default function NotifySettings() {
<form id='notify-form' onSubmit={form.handleSubmit(onSubmit)} className='space-y-4'>
<div className='space-y-4'>
{[
{ name: 'enable_email_notify', label: 'emailNotification' },
{ name: 'enable_telegram_notify', label: 'telegramNotification' },
{ name: 'enable_balance_notify', label: 'balanceChange' },
{ name: 'enable_login_notify', label: 'login' },
{ name: 'enable_subscribe_notify', label: 'subscribe' },

View File

@ -1,10 +1,11 @@
'use client';
import useGlobalStore from '@/config/use-global';
import { sendEmailCode, sendSmsCode } from '@/services/common/common';
import { Button } from '@workspace/ui/components/button';
import { useCountDown } from 'ahooks';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
import { useEffect, useState } from 'react';
interface SendCodeProps {
type: 'email' | 'phone';
@ -17,22 +18,43 @@ interface SendCodeProps {
}
export default function SendCode({ type, params }: SendCodeProps) {
const t = useTranslations('auth');
const { common } = useGlobalStore();
const { verify_code_interval } = common.verify_code;
const [targetDate, setTargetDate] = useState<number>();
useEffect(() => {
const storedEndTime = localStorage.getItem(`verify_code_${type}`);
if (storedEndTime) {
const endTime = parseInt(storedEndTime);
if (endTime > Date.now()) {
setTargetDate(endTime);
} else {
localStorage.removeItem(`verify_code_${type}`);
}
}
}, [type]);
const [, { seconds }] = useCountDown({
targetDate,
onEnd: () => {
setTargetDate(undefined);
localStorage.removeItem(`verify_code_${type}`);
},
});
const setCodeTimer = () => {
const endTime = Date.now() + verify_code_interval * 1000;
setTargetDate(endTime);
localStorage.setItem(`verify_code_${type}`, endTime.toString());
};
const getEmailCode = async () => {
if (params.email && params.type) {
await sendEmailCode({
email: params.email,
type: params.type,
});
setTargetDate(Date.now() + 60000);
setCodeTimer();
}
};
@ -43,7 +65,7 @@ export default function SendCode({ type, params }: SendCodeProps) {
telephone_area_code: params.telephone_area_code,
type: params.type,
});
setTargetDate(Date.now() + 60000);
setCodeTimer();
}
};

View File

@ -84,7 +84,7 @@ export default function Purchase({ subscribe, setSubscribe }: Readonly<PurchaseP
console.log(error);
}
});
}, [params, router]);
}, [params, router, getUserInfo]);
return (
<Dialog

View File

@ -92,7 +92,7 @@ export default function Renewal({ id, subscribe }: Readonly<RenewalProps>) {
console.log(error);
}
});
}, [params, router]);
}, [params, router, getUserInfo]);
return (
<Dialog open={open} onOpenChange={setOpen}>

View File

@ -43,6 +43,9 @@ 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,
@ -63,6 +66,11 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
subscribe_domain: '',
pan_domain: false,
},
verify_code: {
verify_code_expire_time: 5,
verify_code_limit: 15,
verify_code_interval: 60,
},
oauth_methods: [],
},
user: undefined,

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Změna zůstatku",
"bind": "Přejít na vazbu",
"channels": "Notifikační kanály",
"emailNotification": "E-mailové oznámení",
"finance": "Finance",
"login": "Přihlášení",
"notificationSettings": "Nastavení oznámení",
"notificationTypes": "Typy notifikací",
"save": "Uložit změny",
"subscribe": "Přihlásit se",
"telegramIdPlaceholder": "Zadejte Telegram ID",
"telegramNotification": "Telegram oznámení",
"unbind": "Zrušit vazbu",
"updateSuccess": "Aktualizace byla úspěšná"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Kontostandsänderung",
"bind": "Zur Bindung gehen",
"channels": "Benachrichtigungskanäle",
"emailNotification": "E-Mail-Benachrichtigung",
"finance": "Finanzen",
"login": "Anmelden",
"notificationSettings": "Benachrichtigungseinstellungen",
"notificationTypes": "Benachrichtigungstypen",
"save": "Änderungen speichern",
"subscribe": "Abonnieren",
"telegramIdPlaceholder": "Telegram-ID eingeben",
"telegramNotification": "Telegram-Benachrichtigung",
"unbind": "Lösen",
"updateSuccess": "Erfolgreich aktualisiert"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Balance Change",
"bind": "Go to Binding",
"channels": "Notification Channels",
"emailNotification": "Email Notification",
"finance": "Finance",
"login": "Login",
"notificationSettings": "Notification Settings",
"notificationTypes": "Notification Types",
"save": "Save Changes",
"subscribe": "Subscribe",
"telegramIdPlaceholder": "Enter Telegram ID",
"telegramNotification": "Telegram Notification",
"unbind": "Unbind",
"updateSuccess": "Update Successful"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Cambio de Saldo",
"bind": "Ir a Vinculación",
"channels": "Canales de Notificación",
"emailNotification": "Notificación por correo electrónico",
"finance": "Finanzas",
"login": "Iniciar Sesión",
"notificationSettings": "Configuración de notificaciones",
"notificationTypes": "Tipos de Notificación",
"save": "Guardar Cambios",
"subscribe": "Suscribirse",
"telegramIdPlaceholder": "Ingrese ID de Telegram",
"telegramNotification": "Notificación de Telegram",
"unbind": "Desvincular",
"updateSuccess": "Actualización exitosa"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Cambio de Saldo",
"bind": "Ir a Vinculación",
"channels": "Canales de Notificación",
"emailNotification": "Notificación por correo electrónico",
"finance": "Finanzas",
"login": "Iniciar Sesión",
"notificationSettings": "Configuración de notificaciones",
"notificationTypes": "Tipos de Notificación",
"save": "Guardar Cambios",
"subscribe": "Suscribirse",
"telegramIdPlaceholder": "Ingrese ID de Telegram",
"telegramNotification": "Notificación de Telegram",
"unbind": "Desvincular",
"updateSuccess": "Actualización exitosa"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "تغییر موجودی",
"bind": "رفتن به اتصال",
"channels": "کانال‌های اعلان",
"emailNotification": "اعلان ایمیل",
"finance": "مالی",
"login": "ورود",
"notificationSettings": "تنظیمات اعلان",
"notificationTypes": "نوع‌های اعلان",
"save": "ذخیره تغییرات",
"subscribe": "اشتراک‌گذاری",
"telegramIdPlaceholder": "شناسه تلگرام را وارد کنید",
"telegramNotification": "اعلان تلگرام",
"unbind": "لغو اتصال",
"updateSuccess": "به‌روزرسانی موفقیت‌آمیز"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Saldo Muutos",
"bind": "Siirry sitomiseen",
"channels": "Ilmoituskanavat",
"emailNotification": "Sähköposti-ilmoitus",
"finance": "Rahoitus",
"login": "Kirjaudu",
"notificationSettings": "Ilmoitusasetukset",
"notificationTypes": "Ilmoitustyypit",
"save": "Tallenna muutokset",
"subscribe": "Tilaa",
"telegramIdPlaceholder": "Syötä Telegram ID",
"telegramNotification": "Telegram-ilmoitus",
"unbind": "Poista sitominen",
"updateSuccess": "Päivitys onnistui"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Changement de Solde",
"bind": "Aller à la liaison",
"channels": "Canaux de Notification",
"emailNotification": "Notification par e-mail",
"finance": "Finance",
"login": "Connexion",
"notificationSettings": "Paramètres de notification",
"notificationTypes": "Types de Notification",
"save": "Enregistrer les Modifications",
"subscribe": "S'abonner",
"telegramIdPlaceholder": "Entrez l'ID Telegram",
"telegramNotification": "Notification Telegram",
"unbind": "Délier",
"updateSuccess": "Mise à jour réussie"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "बैलेंस परिवर्तन",
"bind": "बाइंडिंग पर जाएं",
"channels": "सूचना चैनल",
"emailNotification": "ईमेल सूचना",
"finance": "वित्त",
"login": "लॉगिन",
"notificationSettings": "सूचना सेटिंग्स",
"notificationTypes": "सूचना प्रकार",
"save": "परिवर्तन सहेजें",
"subscribe": "सदस्यता लें",
"telegramIdPlaceholder": "टेलीग्राम आईडी दर्ज करें",
"telegramNotification": "टेलीग्राम सूचना",
"unbind": "अनबाइंड करें",
"updateSuccess": "सफलतापूर्वक अपडेट किया गया"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Egyenleg Változás",
"bind": "Menj a kötéshez",
"channels": "Értesítési Csatornák",
"emailNotification": "E-mail értesítés",
"finance": "Pénzügy",
"login": "Bejelentkezés",
"notificationSettings": "Értesítési beállítások",
"notificationTypes": "Értesítési Típusok",
"save": "Változtatások Mentése",
"subscribe": "Feliratkozás",
"telegramIdPlaceholder": "Adja meg a Telegram azonosítót",
"telegramNotification": "Telegram értesítés",
"unbind": "Kötés feloldása",
"updateSuccess": "Sikeres frissítés"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "残高の変更",
"bind": "バインディングに移動",
"channels": "通知チャネル",
"emailNotification": "メール通知",
"finance": "ファイナンス",
"login": "ログイン",
"notificationSettings": "通知設定",
"notificationTypes": "通知タイプ",
"save": "変更を保存",
"subscribe": "購読する",
"telegramIdPlaceholder": "Telegram IDを入力",
"telegramNotification": "Telegram通知",
"unbind": "バインド解除",
"updateSuccess": "更新成功"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "잔액 변경",
"bind": "바인딩으로 이동",
"channels": "알림 채널",
"emailNotification": "이메일 알림",
"finance": "재무",
"login": "로그인",
"notificationSettings": "알림 설정",
"notificationTypes": "알림 유형",
"save": "변경 사항 저장",
"subscribe": "구독",
"telegramIdPlaceholder": "텔레그램 ID 입력",
"telegramNotification": "텔레그램 알림",
"unbind": "바인딩 해제",
"updateSuccess": "업데이트 성공"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Endring i saldo",
"bind": "Gå til binding",
"channels": "Varslingskanaler",
"emailNotification": "E-postvarsling",
"finance": "Økonomi",
"login": "Logg inn",
"notificationSettings": "Varslingsinnstillinger",
"notificationTypes": "Varslingstyper",
"save": "Lagre endringer",
"subscribe": "Abonner",
"telegramIdPlaceholder": "Skriv inn Telegram-ID",
"telegramNotification": "Telegram-varsling",
"unbind": "Løsne",
"updateSuccess": "Oppdatering vellykket"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Zmiana salda",
"bind": "Przejdź do wiązania",
"channels": "Kanały powiadomień",
"emailNotification": "Powiadomienie e-mail",
"finance": "Finanse",
"login": "Zaloguj się",
"notificationSettings": "Ustawienia powiadomień",
"notificationTypes": "Typy powiadomień",
"save": "Zapisz zmiany",
"subscribe": "Subskrybuj",
"telegramIdPlaceholder": "Wprowadź Telegram ID",
"telegramNotification": "Powiadomienie Telegram",
"unbind": "Odwiąż",
"updateSuccess": "Aktualizacja zakończona sukcesem"
},
"thirdParty": {

View File

@ -9,18 +9,13 @@
},
"notify": {
"balanceChange": "Mudança de Saldo",
"bind": "Ir para Vinculação",
"channels": "Canais de Notificação",
"emailNotification": "Notificação por e-mail",
"finance": "Finanças",
"login": "Login",
"notificationSettings": "Configurações de notificação",
"notificationTypes": "Tipos de Notificação",
"save": "Salvar Alterações",
"subscribe": "Inscrever-se",
"telegramIdPlaceholder": "Insira o ID do Telegram",
"telegramNotification": "Notificação do Telegram",
"unbind": "Desvincular",
"updateSuccess": "Atualização bem-sucedida"
},
"thirdParty": {

Some files were not shown because too many files have changed in this diff Show More