feat(frontend): auth work

This commit is contained in:
2025-03-03 12:30:29 -06:00
parent 8e5903cbf3
commit 5465e1491d
8 changed files with 55 additions and 35 deletions

View File

@@ -11,5 +11,5 @@ get {
} }
auth:bearer { auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7InVzZXJfaWQiOiIyYzYzODQ3Zi1mMWVjLTRkNTAtOGFkMi05ODBkMWYzZTgwZWIiLCJ1c2VybmFtZSI6Im1hdHRoZXMwMSIsImVtYWlsIjoiYmxha2UubWF0dGhlc0BhbHBsYS5jb20iLCJyb2xlcyI6W10sInJvbGUiOiJ1c2VyIn0sImlhdCI6MTc0MDY3NTMyMiwiZXhwIjoxNzQwNjc4OTIyfQ.D4rLIBAZfo0larMGUmXF6Z2KVnZvRLvth2116JyK2z8 token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7InVzZXJfaWQiOiIyYzYzODQ3Zi1mMWVjLTRkNTAtOGFkMi05ODBkMWYzZTgwZWIiLCJ1c2VybmFtZSI6Im1hdHRoZXMwMSIsImVtYWlsIjoiYmxha2UubWF0dGhlc0BhbHBsYS5jb20iLCJyb2xlcyI6W10sInJvbGUiOiJ1c2VyIn0sImlhdCI6MTc0MDg2ODMzNCwiZXhwIjoxNzQwODcxOTM0fQ.HpPh56_8API25IeO5FSfYSvAqf97_tKUT_GEBqbggO0
} }

View File

@@ -1,28 +1,26 @@
import js from '@eslint/js' import js from "@eslint/js";
import globals from 'globals' import globals from "globals";
import reactHooks from 'eslint-plugin-react-hooks' import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from 'eslint-plugin-react-refresh' import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from 'typescript-eslint' import tseslint from "typescript-eslint";
export default tseslint.config( export default tseslint.config(
{ ignores: ['dist'] }, {ignores: ["dist"]},
{ {
extends: [js.configs.recommended, ...tseslint.configs.recommended], extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'], files: ["**/*.{ts,tsx}"],
languageOptions: { languageOptions: {
ecmaVersion: 2020, ecmaVersion: 2020,
globals: globals.browser, globals: globals.browser,
}, },
plugins: { plugins: {
'react-hooks': reactHooks, "react-hooks": reactHooks,
'react-refresh': reactRefresh, "react-refresh": reactRefresh,
}, },
rules: { rules: {
...reactHooks.configs.recommended.rules, ...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [ "react-refresh/only-export-components": ["warn", {allowConstantExport: true}],
'warn', "no-console": ["error", {allow: ["warn", "error"]}],
{ allowConstantExport: true }, },
], }
}, );
},
)

View File

@@ -23,6 +23,7 @@
"@tanstack/react-router": "^1.111.11", "@tanstack/react-router": "^1.111.11",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dotenv": "^16.4.7",
"hono": "^4.7.2", "hono": "^4.7.2",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
@@ -3552,6 +3553,18 @@
"node": ">=0.3.1" "node": ">=0.3.1"
} }
}, },
"node_modules/dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
"integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/ecdsa-sig-formatter": { "node_modules/ecdsa-sig-formatter": {
"version": "1.0.11", "version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",

View File

@@ -26,6 +26,7 @@
"@tanstack/react-router": "^1.111.11", "@tanstack/react-router": "^1.111.11",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dotenv": "^16.4.7",
"hono": "^4.7.2", "hono": "^4.7.2",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",

View File

@@ -26,7 +26,7 @@ const LoginForm = () => {
// } // }
const data = await response.json(); const data = await response.json();
console.log("Response", data.data); // console.log("Response", data.data);
// Store token in localStorage // Store token in localStorage
localStorage.setItem("auth_token", data.data.token); localStorage.setItem("auth_token", data.data.token);
@@ -41,6 +41,7 @@ const LoginForm = () => {
setUsername(""); setUsername("");
setPassword(""); setPassword("");
} catch (err) { } catch (err) {
console.error(err);
setError("Invalid credentials"); setError("Invalid credentials");
} }
}; };

View File

@@ -1,17 +1,17 @@
import {QueryClient, QueryClientProvider} from "@tanstack/react-query"; import {QueryClient, QueryClientProvider} from "@tanstack/react-query";
import {useModuleStore} from "../../lib/store/useModuleStore"; import {useModuleStore} from "../../lib/store/useModuleStore";
import {useEffect} from "react"; import {useEffect} from "react";
import {useGetUserRoles} from "@/lib/store/useGetRoles"; //import {useGetUserRoles} from "@/lib/store/useGetRoles";
const queryClient = new QueryClient(); const queryClient = new QueryClient();
export const SessionProvider = ({children}: {children: React.ReactNode}) => { export const SessionProvider = ({children}: {children: React.ReactNode}) => {
const {fetchModules} = useModuleStore(); const {fetchModules} = useModuleStore();
const {fetchUserRoles} = useGetUserRoles(); //const {fetchUserRoles} = useGetUserRoles();
useEffect(() => { useEffect(() => {
fetchModules(); fetchModules();
fetchUserRoles(); //fetchUserRoles();
}, []); }, []);
return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>; return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
}; };

View File

@@ -1,5 +1,5 @@
import {createFileRoute} from "@tanstack/react-router"; import {createFileRoute} from "@tanstack/react-router";
import GridLayout from "react-grid-layout"; //import GridLayout from "react-grid-layout";
import "../../node_modules/react-grid-layout/css/styles.css"; import "../../node_modules/react-grid-layout/css/styles.css";
import "../../node_modules/react-resizable/css/styles.css"; import "../../node_modules/react-resizable/css/styles.css";
@@ -32,7 +32,7 @@ function Index() {
return ( return (
<> <>
{/* <AddCards addCard={addCard} cards={cards} /> */} {/* <AddCards addCard={addCard} cards={cards} /> */}
<GridLayout className="layout" cols={12} rowHeight={30} width={window.innerWidth}> {/* <GridLayout className="layout" cols={12} rowHeight={30} width={window.innerWidth}>
<div className="bg-blue-400" key="a" data-grid={{x: 0, y: 0, w: 1, h: 2, static: true}}> <div className="bg-blue-400" key="a" data-grid={{x: 0, y: 0, w: 1, h: 2, static: true}}>
a a
</div> </div>
@@ -42,7 +42,10 @@ function Index() {
<div className="bg-blue-400" key="c" data-grid={{x: 4, y: 0, w: 1, h: 2}}> <div className="bg-blue-400" key="c" data-grid={{x: 4, y: 0, w: 1, h: 2}}>
c c
</div> </div>
</GridLayout> </GridLayout> */}
<div className="m-auto">
<span>Empty Space why dont you add some cards?</span>
</div>
</> </>
); );
} }

View File

@@ -4,6 +4,10 @@ import tailwindcss from "@tailwindcss/vite";
import {TanStackRouterVite} from "@tanstack/router-plugin/vite"; import {TanStackRouterVite} from "@tanstack/router-plugin/vite";
import path from "path"; import path from "path";
import dotenv from "dotenv";
import {fileURLToPath} from "url";
dotenv.config({path: path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.env")});
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react(), tailwindcss(), TanStackRouterVite({target: "react", autoCodeSplitting: true})], plugins: [react(), tailwindcss(), TanStackRouterVite({target: "react", autoCodeSplitting: true})],
@@ -14,7 +18,7 @@ export default defineConfig({
}, },
server: { server: {
proxy: { proxy: {
"/api": {target: `http://localhost:4400`, changeOrigin: true}, "/api": {target: `http://localhost:${Number(process.env.VITE_SERVER_PORT || 4400)}`, changeOrigin: true},
}, },
}, },
}); });