'use client' import { useState } from 'react' import { useTranslation } from 'react-i18next' import useSWR from 'swr' import { useSearchParams } from 'next/navigation' import cn from 'classnames' import Link from 'next/link' import { CheckCircleIcon } from '@heroicons/react/24/solid' import style from './style.module.css' import Button from '@/app/components/base/button' import { SimpleSelect } from '@/app/components/base/select' import { timezones } from '@/utils/timezone' import { languageMaps, languages } from '@/utils/language' import { activateMember, invitationCheck } from '@/service/common' import Toast from '@/app/components/base/toast' import Loading from '@/app/components/base/loading' const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/ const ActivateForm = () => { const { t } = useTranslation() const searchParams = useSearchParams() const workspaceID = searchParams.get('workspace_id') const email = searchParams.get('email') const token = searchParams.get('token') const checkParams = { url: '/activate/check', params: { workspace_id: workspaceID, email, token, }, } const { data: checkRes, mutate: recheck } = useSWR(checkParams, invitationCheck, { revalidateOnFocus: false, }) const [name, setName] = useState('') const [password, setPassword] = useState('') const [timezone, setTimezone] = useState('Asia/Shanghai') const [language, setLanguage] = useState('en-US') const [showSuccess, setShowSuccess] = useState(false) const showErrorMessage = (message: string) => { Toast.notify({ type: 'error', message, }) } const valid = () => { if (!name.trim()) { showErrorMessage(t('login.error.nameEmpty')) return false } if (!password.trim()) { showErrorMessage(t('login.error.passwordEmpty')) return false } if (!validPassword.test(password)) showErrorMessage(t('login.error.passwordInvalid')) return true } const handleActivate = async () => { if (!valid()) return try { await activateMember({ url: '/activate', body: { workspace_id: workspaceID, email, token, name, password, interface_language: language, timezone, }, }) setShowSuccess(true) } catch { recheck() } } return (
{`${t('login.joinTipStart')} ${checkRes.workspace_name} ${t('login.joinTipEnd')}`}