diff --git a/cool_todo_manager/package-lock.json b/cool_todo_manager/package-lock.json index 28cdaa3..6d7f662 100644 --- a/cool_todo_manager/package-lock.json +++ b/cool_todo_manager/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@hello-pangea/dnd": "^18.0.1", + "@radix-ui/react-form": "^0.1.2", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/themes": "^3.2.0", "@tailwindcss/vite": "^4.0.6", @@ -18,6 +19,7 @@ "jotai": "^2.12.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-router-dom": "^6.26.2", "tailwindcss": "^4.0.6" }, "devDependencies": { @@ -2545,6 +2547,15 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.34.7", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz", @@ -5323,6 +5334,38 @@ } } }, + "node_modules/react-router": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "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/cool_todo_manager/package.json b/cool_todo_manager/package.json index 091c7b8..e51fa4e 100644 --- a/cool_todo_manager/package.json +++ b/cool_todo_manager/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@hello-pangea/dnd": "^18.0.1", + "@radix-ui/react-form": "^0.1.2", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/themes": "^3.2.0", "@tailwindcss/vite": "^4.0.6", @@ -20,6 +21,7 @@ "jotai": "^2.12.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-router-dom": "^6.26.2", "tailwindcss": "^4.0.6" }, "devDependencies": { diff --git a/cool_todo_manager/src/App.tsx b/cool_todo_manager/src/App.tsx index 1cf69e1..3d02b76 100644 --- a/cool_todo_manager/src/App.tsx +++ b/cool_todo_manager/src/App.tsx @@ -1,14 +1,21 @@ import { Theme } from '@radix-ui/themes'; import '@radix-ui/themes/styles.css'; +import { QueryClientProvider } from '@tanstack/react-query'; +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import queryClient from './api/queryClient'; import './App.css'; -import MainBoard from './components/MainBoard/MainBoard'; +import MyRoutes from './routes/routes'; + +const router = createBrowserRouter(MyRoutes); function App() { return ( - - + + {/* */} - + + + ); } diff --git a/cool_todo_manager/src/api/axios.ts b/cool_todo_manager/src/api/axios.ts new file mode 100644 index 0000000..7b0f02d --- /dev/null +++ b/cool_todo_manager/src/api/axios.ts @@ -0,0 +1,14 @@ +import axios from "axios"; + +const BASE_URL = 'http://localhost:4567'; + +export const axiosBase = axios.create({ + baseURL: BASE_URL, +}); + +export const axiosAuth = axios.create({ + baseURL: BASE_URL, + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}` // Maybe we will use cookies + } +}); \ No newline at end of file diff --git a/cool_todo_manager/src/api/queryClient.ts b/cool_todo_manager/src/api/queryClient.ts new file mode 100644 index 0000000..75e4ae8 --- /dev/null +++ b/cool_todo_manager/src/api/queryClient.ts @@ -0,0 +1,11 @@ +import { QueryClient } from "@tanstack/react-query"; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 2, + }, + }, +}) + +export default queryClient; \ No newline at end of file diff --git a/cool_todo_manager/src/components/CardGroup/CardGroup.tsx b/cool_todo_manager/src/components/CardGroup/CardGroup.tsx index daa0ea9..cdd8109 100644 --- a/cool_todo_manager/src/components/CardGroup/CardGroup.tsx +++ b/cool_todo_manager/src/components/CardGroup/CardGroup.tsx @@ -8,29 +8,26 @@ const tasks = [ ]; type TCardGroup = { - id: string -} + id: string; +}; export default function CardGroup(props: TCardGroup) { return ( - - {(provided) => ( - - {tasks.map((task, i) => ( - - ))} - {provided.placeholder} - - )} - + + {(provided) => ( + + {tasks.map((task, i) => ( + + ))} + {provided.placeholder} + + )} + ); } diff --git a/cool_todo_manager/src/index.css b/cool_todo_manager/src/index.css index d4b5078..358e675 100644 --- a/cool_todo_manager/src/index.css +++ b/cool_todo_manager/src/index.css @@ -1 +1,5 @@ @import 'tailwindcss'; + +#root { + height: 100vh; +} \ No newline at end of file diff --git a/cool_todo_manager/src/main.tsx b/cool_todo_manager/src/main.tsx index 68176a7..35f6c8f 100644 --- a/cool_todo_manager/src/main.tsx +++ b/cool_todo_manager/src/main.tsx @@ -1,5 +1,5 @@ -import { createRoot } from "react-dom/client"; -import App from "./App.tsx"; -import "./index.css"; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; -createRoot(document.getElementById("root")!).render(); +createRoot(document.getElementById('root')!).render(); diff --git a/cool_todo_manager/src/pages/auth/LoginPage/LoginPage.tsx b/cool_todo_manager/src/pages/auth/LoginPage/LoginPage.tsx new file mode 100644 index 0000000..61064a3 --- /dev/null +++ b/cool_todo_manager/src/pages/auth/LoginPage/LoginPage.tsx @@ -0,0 +1,52 @@ +import { Button, Card, Heading, Text, TextField } from '@radix-ui/themes'; +import { Form } from 'radix-ui'; + +export default function LoginPage() { + return ( + <> + + Login + + e.preventDefault()}> + + + Email is required + + + + Email is not valid + + + + + + + + + + + + Password is required + + + + + + + + + + + + + + ); +} diff --git a/cool_todo_manager/src/pages/auth/RegisterPage/RegisterPage.tsx b/cool_todo_manager/src/pages/auth/RegisterPage/RegisterPage.tsx new file mode 100644 index 0000000..7dceaf2 --- /dev/null +++ b/cool_todo_manager/src/pages/auth/RegisterPage/RegisterPage.tsx @@ -0,0 +1,49 @@ +import { Button, Card, Heading, Text, TextField } from '@radix-ui/themes'; +import { Form } from 'radix-ui'; + +export default function RegisterPage() { + return ( + + Register + e.preventDefault()}> + + + Email is required + + + + Email is not valid + + + + + + + + + + + + Password is required + + + + + + + + + + + + + ); +} diff --git a/cool_todo_manager/src/pages/main/MainPage.tsx b/cool_todo_manager/src/pages/main/MainPage.tsx new file mode 100644 index 0000000..e03c3e5 --- /dev/null +++ b/cool_todo_manager/src/pages/main/MainPage.tsx @@ -0,0 +1,10 @@ +import { Box } from '@radix-ui/themes' +import { Outlet } from 'react-router-dom' + +export default function MainPage() { + return ( + + + + ) +} diff --git a/cool_todo_manager/src/routes/routes.tsx b/cool_todo_manager/src/routes/routes.tsx new file mode 100644 index 0000000..2801816 --- /dev/null +++ b/cool_todo_manager/src/routes/routes.tsx @@ -0,0 +1,18 @@ +import { createRoutesFromElements, Route } from 'react-router-dom'; +import MainBoard from '../components/MainBoard/MainBoard'; +import LoginPage from '../pages/auth/LoginPage/LoginPage'; +import RegisterPage from '../pages/auth/RegisterPage/RegisterPage'; +import MainPage from '../pages/main/MainPage'; + +const MyRoutes = createRoutesFromElements( + <> + }> + } /> + + + } /> + } /> + , +); + +export default MyRoutes;