mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
Store the user in localStorage
This commit is contained in:
@@ -4,9 +4,15 @@ import LoginScreen from "./screen/LoginScreen";
|
|||||||
import RegisterScreen from "./screen/RegisterScreen";
|
import RegisterScreen from "./screen/RegisterScreen";
|
||||||
import { useAppState } from "./state";
|
import { useAppState } from "./state";
|
||||||
import { DialogProvider } from "./contexts/DialogContext";
|
import { DialogProvider } from "./contexts/DialogContext";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const { currentPage } = useAppState();
|
const { currentPage, restoreUserFromStorage } = useAppState();
|
||||||
|
|
||||||
|
// Restore user from localStorage on app initialization
|
||||||
|
useEffect(() => {
|
||||||
|
restoreUserFromStorage();
|
||||||
|
}, [restoreUserFromStorage]);
|
||||||
|
|
||||||
let page = <LoginScreen />;
|
let page = <LoginScreen />;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ import type { ChatTabs } from "../../state";
|
|||||||
|
|
||||||
function BottomAppBar() {
|
function BottomAppBar() {
|
||||||
const [settingsOpen, onSettingsOpenChange] = useState(false);
|
const [settingsOpen, onSettingsOpenChange] = useState(false);
|
||||||
|
const { logout } = useAppState();
|
||||||
|
|
||||||
|
const handleLogout = () => {
|
||||||
|
logout();
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -19,6 +24,12 @@ function BottomAppBar() {
|
|||||||
<mdui-button-icon icon="settings--filled" id="settings-open" onClick={() => onSettingsOpenChange(true)}></mdui-button-icon>
|
<mdui-button-icon icon="settings--filled" id="settings-open" onClick={() => onSettingsOpenChange(true)}></mdui-button-icon>
|
||||||
<mdui-button-icon icon="group_add--filled"></mdui-button-icon>
|
<mdui-button-icon icon="group_add--filled"></mdui-button-icon>
|
||||||
<div style={{ flexGrow: 1 }}></div>
|
<div style={{ flexGrow: 1 }}></div>
|
||||||
|
<mdui-button-icon
|
||||||
|
icon="logout--filled"
|
||||||
|
id="logout-btn"
|
||||||
|
onClick={handleLogout}
|
||||||
|
title="Выйти"
|
||||||
|
></mdui-button-icon>
|
||||||
<mdui-fab icon="edit--filled"></mdui-fab>
|
<mdui-fab icon="edit--filled"></mdui-fab>
|
||||||
</mdui-bottom-app-bar>
|
</mdui-bottom-app-bar>
|
||||||
<SettingsDialog isOpen={settingsOpen} onOpenChange={onSettingsOpenChange} />
|
<SettingsDialog isOpen={settingsOpen} onOpenChange={onSettingsOpenChange} />
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ interface AppState {
|
|||||||
user: UserState;
|
user: UserState;
|
||||||
setUser: (token: string, user: User) => void;
|
setUser: (token: string, user: User) => void;
|
||||||
logout: () => void;
|
logout: () => void;
|
||||||
|
restoreUserFromStorage: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useAppState = create<AppState>((set, get) => ({
|
export const useAppState = create<AppState>((set, get) => ({
|
||||||
@@ -151,6 +152,14 @@ export const useAppState = create<AppState>((set, get) => ({
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Store credentials in localStorage
|
||||||
|
try {
|
||||||
|
localStorage.setItem('authToken', token);
|
||||||
|
localStorage.setItem('currentUser', JSON.stringify(user));
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to store credentials in localStorage:', error);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const payload: WebSocketMessage = {
|
const payload: WebSocketMessage = {
|
||||||
type: "ping",
|
type: "ping",
|
||||||
@@ -166,13 +175,45 @@ export const useAppState = create<AppState>((set, get) => ({
|
|||||||
})
|
})
|
||||||
} catch {}
|
} catch {}
|
||||||
},
|
},
|
||||||
logout: () => set(() => ({
|
logout: () => {
|
||||||
user: {
|
// Clear localStorage
|
||||||
currentUser: null,
|
try {
|
||||||
authToken: null
|
localStorage.removeItem('authToken');
|
||||||
},
|
localStorage.removeItem('currentUser');
|
||||||
currentPage: "login"
|
} catch (error) {
|
||||||
})),
|
console.error('Failed to clear localStorage:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
set(() => ({
|
||||||
|
user: {
|
||||||
|
currentUser: null,
|
||||||
|
authToken: null
|
||||||
|
},
|
||||||
|
currentPage: "login"
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
restoreUserFromStorage: () => {
|
||||||
|
try {
|
||||||
|
const token = localStorage.getItem('authToken');
|
||||||
|
const userStr = localStorage.getItem('currentUser');
|
||||||
|
|
||||||
|
if (token && userStr) {
|
||||||
|
const user = JSON.parse(userStr) as User;
|
||||||
|
set(() => ({
|
||||||
|
user: {
|
||||||
|
currentUser: user,
|
||||||
|
authToken: token
|
||||||
|
},
|
||||||
|
currentPage: "chat"
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to restore user from localStorage:', error);
|
||||||
|
// Clear invalid data
|
||||||
|
localStorage.removeItem('authToken');
|
||||||
|
localStorage.removeItem('currentUser');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// Panel management
|
// Panel management
|
||||||
setActivePanel: (panel: MessagePanel | null) => set((state) => ({
|
setActivePanel: (panel: MessagePanel | null) => set((state) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user