'use client'; import SendCode from '@/app/auth/send-code'; import useGlobalStore from '@/config/use-global'; import { bindOAuth, unbindOAuth, updateBindEmail, updateBindMobile } from '@/services/user/user'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@workspace/ui/components/button'; import { Card } from '@workspace/ui/components/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@workspace/ui/components/dialog'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/ui/components/form'; import { Input } from '@workspace/ui/components/input'; import { AreaCodeSelect } from '@workspace/ui/custom-components/area-code-select'; import { useTranslations } from 'next-intl'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; function MobileBindDialog({ onSuccess, children, }: { onSuccess: () => void; 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({ area_code: z.string().min(1, 'Area code is required'), mobile: z.string().min(5, 'Phone number is required'), code: z.string().min(4, 'Verification code is required'), }); type MobileBindFormValues = z.infer; const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { area_code: '1', mobile: '', code: '', }, }); const onSubmit = async (values: MobileBindFormValues) => { try { await updateBindMobile(values); toast.success(t('bindSuccess')); onSuccess(); setOpen(false); } catch (error) { toast.error(t('bindFailed')); } }; return ( {children} {t('bindMobile')}
(
( { if (value.phone) { form.setValue(field.name, value.phone); } }} /> )} />
)} /> (
)} />
); } export default function ThirdPartyAccounts() { const t = useTranslations('profile.thirdParty'); const { user, getUserInfo, common } = useGlobalStore(); const { oauth_methods } = common; const accounts = [ { id: 'email', icon: 'logos:mailgun-icon', name: 'Email', type: 'Basic', }, { id: 'mobile', icon: 'mdi:telephone', name: 'Mobile', type: 'Basic', }, { id: 'telegram', icon: 'logos:telegram', name: 'Telegram', type: 'OAuth', }, { id: 'apple', icon: 'uil:apple', name: 'Apple', type: 'OAuth', }, { id: 'google', icon: 'logos:google', name: 'Google', type: 'OAuth', }, { id: 'facebook', icon: 'logos:facebook', name: 'Facebook', type: 'OAuth', }, { id: 'github', icon: 'uil:github', name: 'GitHub', type: 'OAuth', }, { id: 'device', icon: 'mdi:devices', name: 'Device', type: 'OAuth', }, ].filter((account) => oauth_methods?.includes(account.id)); const [editValues, setEditValues] = useState>({}); const handleBasicAccountUpdate = async (account: (typeof accounts)[0], value: string) => { if (account.id === 'email') { await updateBindEmail({ email: value }); await getUserInfo(); toast.success(t('updateSuccess')); } }; const handleAccountAction = async (account: (typeof accounts)[number]) => { const isBound = user?.auth_methods?.find( (auth) => auth.auth_type === account.id, )?.auth_identifier; if (isBound) { await unbindOAuth({ method: account.id }); await getUserInfo(); } else { const res = await bindOAuth({ method: account.id, redirect: `${window.location.origin}/bind/${account.id}`, }); if (res.data?.data?.redirect) { window.location.href = res.data.data.redirect; } } }; return ( <>
{t('title')}
{t('save')}
{user?.auth_methods?.[0]?.auth_identifier}
{t('emailLabel')}
{user?.auth_methods?.[0]?.auth_identifier}
{t('save')}
); }