From aedd7f1e09ec2504fd536e50ce09f3b9bd90910b Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 8 Dec 2025 00:27:46 +0000 Subject: [PATCH] Fix: Registration navigation logic and add Sign Out button --- docs/backend/backend_python/openapi.json | 10 ++++--- frontend/package-lock.json | 23 +++++++++++++--- frontend/package.json | 1 + .../OnboardingSteps/AvatarSelectionStep.tsx | 21 +++++++++------ .../OnboardingSteps/FolderSetupStep.tsx | 16 +++++++----- .../OnboardingSteps/ThemeSelectionStep.tsx | 4 +-- frontend/src/pages/SettingsPage/Settings.tsx | 26 ++++++++++++++++++- 7 files changed, 77 insertions(+), 24 deletions(-) diff --git a/docs/backend/backend_python/openapi.json b/docs/backend/backend_python/openapi.json index 44eb908b1..a29e7c4f1 100644 --- a/docs/backend/backend_python/openapi.json +++ b/docs/backend/backend_python/openapi.json @@ -1117,9 +1117,14 @@ "in": "query", "required": false, "schema": { - "$ref": "#/components/schemas/InputType", + "allOf": [ + { + "$ref": "#/components/schemas/InputType" + } + ], "description": "Choose input type: 'path' or 'base64'", - "default": "path" + "default": "path", + "title": "Input Type" }, "description": "Choose input type: 'path' or 'base64'" } @@ -2199,7 +2204,6 @@ "metadata": { "anyOf": [ { - "additionalProperties": true, "type": "object" }, { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e1e1ddd5f..fbb649959 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -47,6 +47,7 @@ "react-image-crop": "^11.0.7", "react-redux": "^9.2.0", "react-router": "^7.6.2", + "react-router-dom": "^7.10.1", "react-webcam": "^7.2.0", "react-zoom-pan-pinch": "^3.7.0", "tailwind-merge": "^3.3.0", @@ -12372,9 +12373,9 @@ } }, "node_modules/react-router": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz", - "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.10.1.tgz", + "integrity": "sha512-gHL89dRa3kwlUYtRQ+m8NmxGI6CgqN+k4XyGjwcFoQwwCWF6xXpOCUlDovkXClS0d0XJN/5q7kc5W3kiFEd0Yw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -12393,6 +12394,22 @@ } } }, + "node_modules/react-router-dom": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.10.1.tgz", + "integrity": "sha512-JNBANI6ChGVjA5bwsUIwJk7LHKmqB4JYnYfzFwyp2t12Izva11elds2jx7Yfoup2zssedntwU0oZ5DEmk5Sdaw==", + "license": "MIT", + "dependencies": { + "react-router": "7.10.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index 0a53f1b8d..c4e65ca33 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -62,6 +62,7 @@ "react-image-crop": "^11.0.7", "react-redux": "^9.2.0", "react-router": "^7.6.2", + "react-router-dom": "^7.10.1", "react-webcam": "^7.2.0", "react-zoom-pan-pinch": "^3.7.0", "tailwind-merge": "^3.3.0", diff --git a/frontend/src/components/OnboardingSteps/AvatarSelectionStep.tsx b/frontend/src/components/OnboardingSteps/AvatarSelectionStep.tsx index 019dd7f43..fa29c54a9 100644 --- a/frontend/src/components/OnboardingSteps/AvatarSelectionStep.tsx +++ b/frontend/src/components/OnboardingSteps/AvatarSelectionStep.tsx @@ -33,9 +33,16 @@ export const AvatarSelectionStep: React.FC = ({ const [name, setLocalName] = useState(''); const [selectedAvatar, setLocalAvatar] = useState(''); + // FIX: Restore saved data instead of auto-skipping useEffect(() => { - if (localStorage.getItem('name') && localStorage.getItem('avatar')) { - dispatch(markCompleted(stepIndex)); + const savedName = localStorage.getItem('name'); + const savedAvatar = localStorage.getItem('avatar'); + + if (savedName) { + setLocalName(savedName); + } + if (savedAvatar) { + setLocalAvatar(savedAvatar); } }, []); @@ -55,9 +62,7 @@ export const AvatarSelectionStep: React.FC = ({ dispatch(markCompleted(stepIndex)); }; - if (localStorage.getItem('name') && localStorage.getItem('avatar')) { - return null; - } + return ( <> @@ -65,14 +70,14 @@ export const AvatarSelectionStep: React.FC = ({
- Step {stepIndex + 1} of {totalSteps} + Step {stepIndex} of {totalSteps} - {Math.round(((stepIndex + 1) / totalSteps) * 100)}% + {Math.round(((stepIndex) / totalSteps) * 100)}%
diff --git a/frontend/src/components/OnboardingSteps/FolderSetupStep.tsx b/frontend/src/components/OnboardingSteps/FolderSetupStep.tsx index e76c1079a..eb17cc74f 100644 --- a/frontend/src/components/OnboardingSteps/FolderSetupStep.tsx +++ b/frontend/src/components/OnboardingSteps/FolderSetupStep.tsx @@ -30,9 +30,11 @@ export function FolderSetupStep({ // Local state for folders const [folder, setFolder] = useState(''); + // FIX: Restore saved folder path if it exists useEffect(() => { - if (localStorage.getItem('folderChosen') === 'true') { - dispatch(markCompleted(stepIndex)); + const savedFolder = localStorage.getItem('savedFolderPath'); + if (savedFolder) { + setFolder(savedFolder); } }, []); @@ -53,6 +55,8 @@ export function FolderSetupStep({ const handleNext = () => { localStorage.setItem('folderChosen', 'true'); + // FIX: Save the actual path so we can restore it later + localStorage.setItem('savedFolderPath', folder); addFolderMutate(folder); dispatch(markCompleted(stepIndex)); }; @@ -61,10 +65,8 @@ export function FolderSetupStep({ dispatch(previousStep()); }; - if (localStorage.getItem('folderChosen') === 'true') { - return null; - } - const progressPercent = Math.round(((stepIndex + 1) / totalSteps) * 100); + + const progressPercent = Math.round(((stepIndex ) / totalSteps) * 100); return ( <> @@ -72,7 +74,7 @@ export function FolderSetupStep({
- Step {stepIndex + 1} of {totalSteps} + Step {stepIndex } of {totalSteps} {progressPercent}%
diff --git a/frontend/src/components/OnboardingSteps/ThemeSelectionStep.tsx b/frontend/src/components/OnboardingSteps/ThemeSelectionStep.tsx index 33e8bbd5f..ec1fe31f2 100644 --- a/frontend/src/components/OnboardingSteps/ThemeSelectionStep.tsx +++ b/frontend/src/components/OnboardingSteps/ThemeSelectionStep.tsx @@ -51,14 +51,14 @@ export const ThemeSelectionStep: React.FC = ({ return null; } - const progressPercent = Math.round(((stepIndex + 1) / totalSteps) * 100); + const progressPercent = Math.round(((stepIndex) / totalSteps) * 100); return ( <>
- Step {stepIndex + 1} of {totalSteps} + Step {stepIndex} of {totalSteps} {progressPercent}%
diff --git a/frontend/src/pages/SettingsPage/Settings.tsx b/frontend/src/pages/SettingsPage/Settings.tsx index fdc84cd8f..dd2fc1f5d 100644 --- a/frontend/src/pages/SettingsPage/Settings.tsx +++ b/frontend/src/pages/SettingsPage/Settings.tsx @@ -1,4 +1,6 @@ import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Button } from '@/components/ui/button'; // Import modular components import FolderManagementCard from './components/FolderManagementCard'; @@ -10,6 +12,15 @@ import ApplicationControlsCard from './components/ApplicationControlsCard'; * Acts as an orchestrator for the settings sections */ const Settings: React.FC = () => { + const navigate = useNavigate(); + + const handleSignOut = () => { + // 1. Wipe all local storage (Auth, Folder, Name) + localStorage.clear(); + // 2. Force a hard reload to reset state and go to Welcome screen + window.location.href = "/"; + }; + return (
@@ -21,9 +32,22 @@ const Settings: React.FC = () => { {/* Application Controls */} + + {/* Sign Out Button - Aligned Right */} +
+ +
+
); }; -export default Settings; +export default Settings; \ No newline at end of file