diff --git a/src/app/(auth)/connect/page.tsx b/src/app/(auth)/connect/page.tsx index 6f95752..e9dca42 100644 --- a/src/app/(auth)/connect/page.tsx +++ b/src/app/(auth)/connect/page.tsx @@ -71,16 +71,17 @@ export default function ConnectPage() { return; } - addToast("Wallet connected successfully!", "success"); try { const { getProfile } = await import("@/lib/api/auth"); const { useAuthStore } = await import("@/store/auth-store"); const jwt = useAuthStore.getState().jwt; const profile = jwt ? await getProfile(jwt) : null; + addToast("Wallet connected successfully!", "success"); router.replace(profile?.displayName ? "/dashboard" : "/onboarding"); - } catch { - addToast("Wallet connected, but your profile could not be loaded. Continue setup to get started.", "error"); - router.replace("/onboarding"); + } catch (err) { + connectingFromPage.current = false; + const errorMessage = err instanceof Error ? err.message : "Failed to fetch profile"; + addToast(`Error: ${errorMessage}`, "error"); } }; diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 7ed7be2..4cd030d 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -67,6 +67,7 @@ export default function SettingsPage() { setBackground(profile.background ?? ""); setLearningGoals((profile.learningGoals ?? []).join(", ")); setPace(profile.preferredPace ?? "moderate"); + setLanguage(profile.language ?? "English"); }) .catch(() => { addToast("Failed to load profile", "error"); @@ -86,6 +87,7 @@ export default function SettingsPage() { .map((g) => g.trim()) .filter(Boolean), preferredPace: pace, + language, }); addToast("Profile updated successfully", "success"); } catch { diff --git a/src/components/shared/confirm-dialog.tsx b/src/components/shared/confirm-dialog.tsx index d1b6918..c2122ee 100644 --- a/src/components/shared/confirm-dialog.tsx +++ b/src/components/shared/confirm-dialog.tsx @@ -39,8 +39,15 @@ export function ConfirmDialog({ destructive = false, icon, }: ConfirmDialogProps) { + const handleOpenChange = (newOpen: boolean) => { + if (loading && !newOpen) { + return; + } + onOpenChange(newOpen); + }; + return ( - +
(null); const [revokingId, setRevokingId] = useState(null); - const fetchSessions = useCallback(async () => { + const fetchSessions = useCallback(async (controller?: AbortController) => { if (!jwt) { setLoading(false); return; @@ -26,14 +26,14 @@ export function useSessions() { setLoading(true); setError(null); - const controller = new AbortController(); + const signal = controller?.signal; try { - const data = await getSessions(jwt, controller.signal); + const data = await getSessions(jwt, signal); setSessions(data || []); } catch (err) { if (isAbortError(err)) return; - + // Fallback to current session if endpoint is not available const fallbackSession: UserSession = { id: "current-session", @@ -44,14 +44,12 @@ export function useSessions() { createdAt: new Date().toISOString(), isCurrent: true, }; - + setSessions([fallbackSession]); setError(err instanceof Error ? err.message : "Failed to fetch sessions"); } finally { setLoading(false); } - - return () => controller.abort(); }, [jwt]); const revoke = useCallback( @@ -77,7 +75,10 @@ export function useSessions() { ); useEffect(() => { - fetchSessions(); + const controller = new AbortController(); + fetchSessions(controller); + + return () => controller.abort(); }, [fetchSessions]); return {