feat: Add persistent sign-in toast for orphaned passwords

This commit is contained in:
gpt-engineer-app[bot]
2025-10-14 16:01:12 +00:00
parent 4ce2c266eb
commit 69c16c2b1e
3 changed files with 58 additions and 3 deletions

View File

@@ -111,6 +111,58 @@ function AuthProviderComponent({ children }: { children: React.ReactNode }) {
} else {
setAal(null);
}
// Check for orphaned password on SIGNED_IN events
if (event === 'SIGNED_IN' && session?.user) {
try {
// Import identityService functions
const { getUserIdentities, hasOrphanedPassword, triggerOrphanedPasswordConfirmation } =
await import('@/lib/identityService');
// Check if user has email identity
const identities = await getUserIdentities();
const hasEmailIdentity = identities.some(i => i.provider === 'email');
// If no email identity but has other identities, check for orphaned password
if (!hasEmailIdentity && identities.length > 0) {
const isOrphaned = await hasOrphanedPassword();
if (isOrphaned) {
// Show persistent toast with Resend button
const { toast: sonnerToast } = await import('sonner');
sonnerToast.warning("Password Activation Pending", {
description: "Your password needs email confirmation to be fully activated.",
duration: Infinity, // Persistent until dismissed
action: {
label: "Resend Email",
onClick: async () => {
const result = await triggerOrphanedPasswordConfirmation('signin_toast');
if (result.success) {
sonnerToast.success("Confirmation Email Sent!", {
description: `Check ${result.email} for the confirmation link.`,
duration: 10000,
});
} else {
sonnerToast.error("Failed to Send Email", {
description: result.error,
duration: 8000,
});
}
}
},
cancel: {
label: "Dismiss",
onClick: () => {} // Allow dismissal
}
});
}
}
} catch (error) {
authError('[Auth] Failed to check for orphaned password:', error);
}
}
}, 0);
// Detect confirmed email change: email changed AND no longer pending