Migrate to React Router

This commit is contained in:
2025-10-02 18:35:29 +03:00
Unverified
parent 2995bc96ac
commit aa1fb8c518
14 changed files with 514 additions and 54 deletions
@@ -7,14 +7,15 @@ import { API_BASE_URL } from "../../core/config";
import { useRef } from "react";
import type { TextField } from "mdui/components/text-field";
import { useAppState } from "../state";
import { useNavigate } from "react-router-dom";
import { MaterialTextField } from "../components/core/TextField";
import { initialize, isSupported, startElectronReceiver, subscribe } from "../../utils/push-notifications";
import { isElectron } from "../../electron/electron";
export default function LoginScreen() {
const [alerts, updateAlerts] = useImmer<Alert[]>([]);
const setCurrentPage = useAppState(state => state.setCurrentPage);
const setUser = useAppState(state => state.setUser);
const navigate = useNavigate();
function showAlert(type: AlertType, message: string) {
updateAlerts((alerts) => { alerts.push({type: type, message: message}) });
@@ -67,7 +68,7 @@ export default function LoginScreen() {
console.error("Key setup failed:", e);
}
setCurrentPage("chat");
navigate("/chat");
// Initialize notifications
try {
@@ -130,7 +131,7 @@ export default function LoginScreen() {
<a
href="#"
className="link"
onClick={() => setCurrentPage("register")}>
onClick={() => navigate("/register")}>
Зарегистрируйтесь
</a>
</p>
@@ -7,13 +7,14 @@ import { TextField } from "mdui/components/text-field";
import type { ErrorResponse, RegisterRequest, LoginResponse } from "../../core/types";
import { API_BASE_URL } from "../../core/config";
import { useAppState } from "../state";
import { useNavigate } from "react-router-dom";
import { MaterialTextField } from "../components/core/TextField";
import { ensureKeysOnLogin } from "../../auth/crypto";
export default function RegisterScreen() {
const [alerts, updateAlerts] = useImmer<Alert[]>([]);
const setCurrentPage = useAppState(state => state.setCurrentPage);
const setUser = useAppState(state => state.setUser);
const navigate = useNavigate();
function showAlert(type: AlertType, message: string) {
updateAlerts((alerts) => { alerts.push({type: type, message: message}) });
@@ -83,7 +84,7 @@ export default function RegisterScreen() {
console.error("Key setup failed:", e);
}
setCurrentPage("chat");
navigate("/chat");
} else {
const data: ErrorResponse = await response.json();
showAlert("danger", data.message || "Ошибка при регистрации");
@@ -136,7 +137,7 @@ export default function RegisterScreen() {
href="#"
id="login-link"
className="link"
onClick={() => setCurrentPage("login")}>
onClick={() => navigate("/login")}>
Войдите
</a>
</p>
+3 -12
View File
@@ -10,7 +10,6 @@ import { API_BASE_URL } from "../core/config";
import { initialize, subscribe, startElectronReceiver, isSupported } from "../utils/push-notifications";
import { isElectron } from "../electron/electron";
type Page = "login" | "register" | "chat"
export type ChatTabs = "chats" | "channels" | "contacts" | "dms"
interface ActiveDM {
@@ -37,9 +36,6 @@ export interface UserState {
}
interface AppState {
currentPage: Page;
setCurrentPage: (page: Page) => void;
// Chat state
chat: ChatState;
addMessage: (message: Message) => void;
@@ -60,13 +56,10 @@ interface AppState {
user: UserState;
setUser: (token: string, user: User) => void;
logout: () => void;
restoreUserFromStorage: () => void;
restoreUserFromStorage: () => Promise<void>;
}
export const useAppState = create<AppState>((set, get) => ({
currentPage: "login", // default page
setCurrentPage: (page: Page) => set({ currentPage: page }),
// Chat state
chat: {
messages: [],
@@ -191,8 +184,7 @@ export const useAppState = create<AppState>((set, get) => ({
user: {
currentUser: null,
authToken: null
},
currentPage: "login"
}
}));
},
restoreUserFromStorage: async () => {
@@ -212,8 +204,7 @@ export const useAppState = create<AppState>((set, get) => ({
user: {
currentUser: user,
authToken: token
},
currentPage: "chat"
}
}));
try {