diff --git a/web/src/features/home/AccountPanel.tsx b/web/src/features/home/AccountPanel.tsx
index 1f9de12..d9d2572 100644
--- a/web/src/features/home/AccountPanel.tsx
+++ b/web/src/features/home/AccountPanel.tsx
@@ -25,6 +25,7 @@ export function AccountPanel({ variant = 'default' }: { variant?: 'default' | 'a
const refreshShares = useShares((s) => s.refresh);
const [register, setRegister] = useState(true);
const [username, setUsername] = useState('');
+ const [displayName, setDisplayName] = useState('');
const [password, setPassword] = useState('');
const [confirm, setConfirm] = useState('');
const [message, setMessage] = useState('');
@@ -63,8 +64,8 @@ export function AccountPanel({ variant = 'default' }: { variant?: 'default' | 'a
if (creating && password !== confirm) { setMessage('两次输入的密码不一致'); return; }
setMessage('');
try {
- if (unlockUsername) await unlockPasskey(password, remember); else await login(username, password, register, remember);
- setPassword(''); setConfirm('');
+ if (unlockUsername) await unlockPasskey(password, remember); else await login(username, password, register, remember, displayName);
+ setPassword(''); setConfirm(''); setDisplayName('');
await Promise.all([refreshChannels(), refreshShares()]);
setMessage(register ? '账号已创建,资源保险库已同步。' : '已登录,资源保险库已同步。');
const pending = useChannels.getState().pendingLink;
@@ -90,13 +91,14 @@ export function AccountPanel({ variant = 'default' }: { variant?: 'default' | 'a
: null}
{unlockUsername ?
已用Passkey确认账号,请输入账号密码解锁资源。
: null}
+ {creating ? : null}
{creating ? : null}
{creating ?
{rules.map((rule) => - {rule.met ? '✓' : '○'}{rule.text}{rule.met ? ',已满足' : ',未满足'}
)}
: null}
- {creating ? 账号 ID 是登录用的唯一标识,不是显示名称;显示名称可在登录后的个人资料里设置。密码用于在本机加密你的资源保险库,忘记后无法找回,请妥善保管。
: null}
+ {creating ? 账号 ID 是登录用的唯一标识,注册后不能改;个人名称是其他成员看到的名字,留空就显示账号 ID,之后可在个人资料里修改。密码用于在本机加密你的资源保险库,忘记后无法找回,请妥善保管。
: null}
diff --git a/web/src/store/account.ts b/web/src/store/account.ts
index 6bbfd36..24533cc 100644
--- a/web/src/store/account.ts
+++ b/web/src/store/account.ts
@@ -12,7 +12,7 @@ import { loginWithPasskey, passkeyApi } from '@/core-bridge/passkeys';
interface AccountState extends AccountStatus {
busy: boolean;
hydrated: boolean;
- login: (username: string, password: string, create: boolean, remember?: boolean) => Promise
;
+ login: (username: string, password: string, create: boolean, remember?: boolean, displayName?: string) => Promise;
passkeyLogin: (username: string, remember: boolean) => Promise;
unlockPasskey: (password: string, remember: boolean) => Promise;
cancelPasskey: () => Promise;
@@ -46,10 +46,12 @@ export const useAccount = create()((set, get) => ({
catch (error) { set({ busy: false, unlockUsername: undefined, error: error instanceof Error ? error.message : '账号解锁失败' }); throw error; }
},
cancelPasskey: async () => { await passkeyApi.cancel(); set({ unlockUsername: undefined, error: undefined }); },
- login: async (username, password, create, remember = true) => {
+ login: async (username, password, create, remember = true, displayName = '') => {
set({ busy: true, error: undefined });
try {
- const status = create ? await accountApi.register(username, password, remember) : await accountApi.login(username, password, remember);
+ let status = create ? await accountApi.register(username, password, remember) : await accountApi.login(username, password, remember);
+ // 注册时填的个人名称:账号已经建好,这一步失败不算注册失败,之后可在个人资料里补
+ if (create && displayName.trim()) status = await accountApi.updatePersonal(displayName.trim()).catch(() => status);
clearViews(); await refreshResources();
set({ ...status, busy: false, hydrated: true });
} catch (error) {