Phase 1 - Feature Repair: - Fix member kick/leave: add missing db.delete() call in servers.ts - Stabilize invite codes: return existing code instead of regenerating - Fix user search: use LIKE instead of exact match in social.ts - Wire DM button on FriendsPage to create/navigate to DM channels - Add cancel outgoing friend request (DELETE endpoint + frontend) - Add accept/decline friend request actions with WS real-time events - Fix replyToId persistence in message creation - Hydrate reactions and replyTo in message queries - Add joinByCode to API client and serverStore - Add friend_request_received/accepted WebSocket events Phase 2 - Discord UI Overhaul: - Remove stray borders between layout columns - Replace shadow-sm with shadow-header on content headers - Replace all bg-gray-*/text-gray-* with Discord color tokens - Ensure flat color contrast (#1E1F22, #2B2D31, #313338) Testing: - Set up vitest + @testing-library/react + jsdom - Add 17 tests across InviteModal, JoinServer, FriendsPage (all passing) - Fix vite resolve.extensions to prefer .tsx over stale .js files
22 lines
1.6 KiB
JavaScript
22 lines
1.6 KiB
JavaScript
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
import { Routes, Route, Navigate } from 'react-router-dom';
|
|
import { LoginPage } from './components/auth/LoginPage';
|
|
import { RegisterPage } from './components/auth/RegisterPage';
|
|
import { AppLayout } from './components/layout/AppLayout';
|
|
import { useAuthStore } from './stores/authStore';
|
|
function ProtectedRoute({ children }) {
|
|
const token = useAuthStore((s) => s.token);
|
|
if (!token)
|
|
return _jsx(Navigate, { to: "/login", replace: true });
|
|
return _jsx(_Fragment, { children: children });
|
|
}
|
|
function AuthRedirect({ children }) {
|
|
const token = useAuthStore((s) => s.token);
|
|
if (token)
|
|
return _jsx(Navigate, { to: "/channels/@me", replace: true });
|
|
return _jsx(_Fragment, { children: children });
|
|
}
|
|
export function App() {
|
|
return (_jsxs(Routes, { children: [_jsx(Route, { path: "/login", element: _jsx(AuthRedirect, { children: _jsx(LoginPage, {}) }) }), _jsx(Route, { path: "/register", element: _jsx(AuthRedirect, { children: _jsx(RegisterPage, {}) }) }), _jsx(Route, { path: "/channels/:serverId/:channelId?", element: _jsx(ProtectedRoute, { children: _jsx(AppLayout, {}) }) }), _jsx(Route, { path: "/channels/@me/:channelId?", element: _jsx(ProtectedRoute, { children: _jsx(AppLayout, {}) }) }), _jsx(Route, { path: "/join/:inviteCode", element: _jsx(ProtectedRoute, { children: _jsx(AppLayout, {}) }) }), _jsx(Route, { path: "/", element: _jsx(Navigate, { to: "/channels/@me", replace: true }) }), _jsx(Route, { path: "*", element: _jsx(Navigate, { to: "/channels/@me", replace: true }) })] }));
|
|
}
|