feat: Complete type safety for Phase 1 & 2

This commit is contained in:
gpt-engineer-app[bot]
2025-10-17 15:23:15 +00:00
parent 77deb62742
commit debb5325bd
5 changed files with 120 additions and 40 deletions

View File

@@ -33,6 +33,15 @@ interface PasswordUpdateDialogProps {
type Step = 'password' | 'mfa' | 'success';
interface ErrorWithCode {
code?: string;
status?: number;
}
function isErrorWithCode(error: unknown): error is Error & ErrorWithCode {
return error instanceof Error && ('code' in error || 'status' in error);
}
export function PasswordUpdateDialog({ open, onOpenChange, onSuccess }: PasswordUpdateDialogProps) {
const { theme } = useTheme();
const [step, setStep] = useState<Step>('password');
@@ -135,16 +144,20 @@ export function PasswordUpdateDialog({ open, onOpenChange, onSuccess }: Password
await updatePasswordWithNonce(data.newPassword, generatedNonce);
}
} catch (error) {
const errorDetails = isErrorWithCode(error) ? {
errorCode: error.code,
errorStatus: error.status
} : {};
logger.error('Password change failed', {
userId,
action: 'password_change',
error: getErrorMessage(error),
errorCode: error instanceof Error && 'code' in error ? (error as any).code : undefined,
errorStatus: error instanceof Error && 'status' in error ? (error as any).status : undefined
...errorDetails
});
const errorMessage = getErrorMessage(error);
const errorStatus = error instanceof Error && 'status' in error ? (error as any).status : undefined;
const errorStatus = isErrorWithCode(error) ? error.status : undefined;
if (errorMessage?.includes('rate limit') || errorStatus === 429) {
handleError(