Refactor: Remove passkey-related functionality and types

- Deleted passkey-related interfaces and types from index.ts and types.ts.
- Removed passkey handling from App component, including related state and functions.
- Cleaned up API calls in auth.ts, removing passkey registration and login functions.
- Updated vault and import formats to eliminate passkey references.
- Removed passkey support checks and UI elements from AuthViews and SettingsPage.
- Cleaned up unused passkey helper functions and constants.
- Adjusted related components and hooks to ensure consistent functionality without passkey support.
This commit is contained in:
shuaiplus
2026-04-06 00:46:13 +08:00
parent 90a7731351
commit 76623d7201
28 changed files with 28 additions and 1064 deletions
-108
View File
@@ -15,10 +15,6 @@ interface SettingsPageProps {
onOpenDisableTotp: () => void;
onGetRecoveryCode: (masterPassword: string) => Promise<string>;
onNotify?: (type: 'success' | 'error', text: string) => void;
passkeys: Array<{ id: string; name: string; creationDate: string; lastUsedDate: string | null }>;
onCreatePasskey: (name: string) => Promise<void>;
onRenamePasskey: (id: string, name: string) => Promise<void>;
onDeletePasskey: (id: string) => Promise<void>;
}
function randomBase32Secret(length: number): string {
@@ -52,10 +48,6 @@ export default function SettingsPage(props: SettingsPageProps) {
const [totpLocked, setTotpLocked] = useState(props.totpEnabled);
const [recoveryMasterPassword, setRecoveryMasterPassword] = useState('');
const [recoveryCode, setRecoveryCode] = useState('');
const [passkeyName, setPasskeyName] = useState('');
const [renamePasskey, setRenamePasskey] = useState<{ id: string; name: string } | null>(null);
const [renamePasskeyName, setRenamePasskeyName] = useState('');
const [deletePasskey, setDeletePasskey] = useState<{ id: string; name: string } | null>(null);
useEffect(() => {
if (!props.totpEnabled) {
@@ -102,21 +94,6 @@ export default function SettingsPage(props: SettingsPageProps) {
return parsed.toLocaleString();
}
async function confirmRenamePasskey(): Promise<void> {
if (!renamePasskey) return;
const nextName = renamePasskeyName.trim();
if (!nextName) return;
await props.onRenamePasskey(renamePasskey.id, nextName);
setRenamePasskey(null);
setRenamePasskeyName('');
}
async function confirmDeletePasskey(): Promise<void> {
if (!deletePasskey) return;
await props.onDeletePasskey(deletePasskey.id);
setDeletePasskey(null);
}
return (
<div className="stack">
<section className="card">
@@ -172,91 +149,6 @@ export default function SettingsPage(props: SettingsPageProps) {
</button>
</section>
<section className="card">
<h3>Passkey</h3>
<div className="field-grid">
<label className="field">
<span></span>
<input className="input" value={passkeyName} onInput={(e) => setPasskeyName((e.currentTarget as HTMLInputElement).value)} placeholder="例如:MacBook Touch ID" />
</label>
<div className="field" style={{ alignSelf: 'end' }}>
<button type="button" className="btn btn-primary" disabled={!passkeyName.trim()} onClick={() => void props.onCreatePasskey(passkeyName.trim()).then(() => setPasskeyName(''))}>
Passkey
</button>
</div>
</div>
<p className="muted-inline" style={{ marginBottom: 8 }}> 5 </p>
<div className="stack" style={{ gap: 6 }}>
{props.passkeys.map((item) => (
<div
key={item.id}
style={{
display: 'flex',
gap: 8,
alignItems: 'center',
border: '1px solid var(--line)',
borderRadius: 10,
padding: '10px 12px',
flexWrap: 'wrap',
}}
>
<strong>{item.name}</strong>
<span style={{ marginLeft: 'auto', fontSize: 12, opacity: 0.72 }}>
{formatDateTime(item.creationDate)}
</span>
<button
type="button"
className="btn btn-secondary small"
onClick={() => {
setRenamePasskey({ id: item.id, name: item.name });
setRenamePasskeyName(item.name);
}}
>
{t('txt_edit')}
</button>
<button
type="button"
className="btn btn-danger small"
onClick={() => setDeletePasskey({ id: item.id, name: item.name })}
>
</button>
</div>
))}
{!props.passkeys.length && <div className="empty"> Passkey</div>}
</div>
</section>
<ConfirmDialog
open={!!renamePasskey}
title={t('txt_edit')}
message={t('txt_enter_a_folder_name')}
confirmText={t('txt_save')}
cancelText={t('txt_cancel')}
onConfirm={() => void confirmRenamePasskey()}
onCancel={() => {
setRenamePasskey(null);
setRenamePasskeyName('');
}}
>
<label className="field">
<span>{t('txt_name')}</span>
<input className="input" value={renamePasskeyName} onInput={(e) => setRenamePasskeyName((e.currentTarget as HTMLInputElement).value)} />
</label>
</ConfirmDialog>
<ConfirmDialog
open={!!deletePasskey}
title={t('txt_delete')}
message={deletePasskey ? `确认删除 Passkey「${deletePasskey.name}」吗?` : ''}
variant="warning"
danger
confirmText={t('txt_delete')}
cancelText={t('txt_cancel')}
onConfirm={() => void confirmDeletePasskey()}
onCancel={() => setDeletePasskey(null)}
/>
<section className="card">
<div className="settings-twofactor-grid">
<div className="settings-subcard">