'use client' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext, useContextSelector } from 'use-context-selector' import Collapse from '../collapse' import type { IItem } from '../collapse' import s from './index.module.css' import classNames from '@/utils/classnames' import Modal from '@/app/components/base/modal' import Confirm from '@/app/components/base/confirm' import Button from '@/app/components/base/button' import { updateUserProfile } from '@/service/common' import AppContext, { useAppContext } from '@/context/app-context' import { ToastContext } from '@/app/components/base/toast' import AppIcon from '@/app/components/base/app-icon' import Avatar from '@/app/components/base/avatar' import { IS_CE_EDITION } from '@/config' const titleClassName = ` text-sm font-medium text-gray-900 ` const descriptionClassName = ` mt-1 text-xs font-normal text-gray-500 ` const inputClassName = ` mt-2 w-full px-3 py-2 bg-gray-100 rounded text-sm font-normal text-gray-800 ` const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/ export default function AccountPage() { const { t } = useTranslation() const { mutateUserProfile, userProfile, apps } = useAppContext() const { notify } = useContext(ToastContext) const [editNameModalVisible, setEditNameModalVisible] = useState(false) const [editName, setEditName] = useState('') const [editing, setEditing] = useState(false) const [editPasswordModalVisible, setEditPasswordModalVisible] = useState(false) const [currentPassword, setCurrentPassword] = useState('') const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [showDeleteAccountModal, setShowDeleteAccountModal] = useState(false) const systemFeatures = useContextSelector(AppContext, state => state.systemFeatures) const handleEditName = () => { setEditNameModalVisible(true) setEditName(userProfile.name) } const handleSaveName = async () => { try { setEditing(true) await updateUserProfile({ url: 'account/name', body: { name: editName } }) notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) mutateUserProfile() setEditNameModalVisible(false) setEditing(false) } catch (e) { notify({ type: 'error', message: (e as Error).message }) setEditNameModalVisible(false) setEditing(false) } } const showErrorMessage = (message: string) => { notify({ type: 'error', message, }) } const valid = () => { if (!password.trim()) { showErrorMessage(t('login.error.passwordEmpty')) return false } if (!validPassword.test(password)) { showErrorMessage(t('login.error.passwordInvalid')) return false } if (password !== confirmPassword) { showErrorMessage(t('common.account.notEqual')) return false } return true } const resetPasswordForm = () => { setCurrentPassword('') setPassword('') setConfirmPassword('') } const handleSavePassword = async () => { if (!valid()) return try { setEditing(true) await updateUserProfile({ url: 'account/password', body: { password: currentPassword, new_password: password, repeat_new_password: confirmPassword, }, }) notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) mutateUserProfile() setEditPasswordModalVisible(false) resetPasswordForm() setEditing(false) } catch (e) { notify({ type: 'error', message: (e as Error).message }) setEditPasswordModalVisible(false) setEditing(false) } } const renderAppItem = (item: IItem) => { return (