diff --git a/apps/console/eslint.config.js b/apps/console/eslint.config.js
new file mode 100644
index 000000000..cf9e935b9
--- /dev/null
+++ b/apps/console/eslint.config.js
@@ -0,0 +1,34 @@
+import globals from "globals";
+import pluginJs from "@eslint/js";
+import tseslint from "typescript-eslint";
+import pluginReact from "eslint-plugin-react";
+
+
+/** @type {import('eslint').Linter.Config[]} */
+export default [
+ {files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"]},
+ {languageOptions: {
+ globals: globals.browser,
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true
+ }
+ }
+ }},
+ pluginJs.configs.recommended,
+ ...tseslint.configs.recommended,
+ pluginReact.configs.flat.recommended,
+ {
+ settings: {
+ react: {
+ version: "detect"
+ }
+ },
+ rules: {
+ "react/react-in-jsx-scope": "off",
+ "react/prop-types": "off",
+ "@typescript-eslint/no-explicit-any": "warn",
+ "react/no-unescaped-entities": "off"
+ }
+ }
+];
\ No newline at end of file
diff --git a/apps/console/package.json b/apps/console/package.json
index 091e943db..a98d8aa4c 100644
--- a/apps/console/package.json
+++ b/apps/console/package.json
@@ -43,6 +43,7 @@
"@babel/preset-env": "^7.26.7",
"@babel/preset-typescript": "^7.26.0",
"@deanc/esbuild-plugin-postcss": "^1.0.2",
+ "@eslint/js": "^9.21.0",
"@probo/tsconfig": "^0.0.1",
"@types/babel-core": "^6.25.10",
"@types/node": "^22.13.0",
@@ -54,9 +55,12 @@
"babel-plugin-relay": "^18.2.0",
"esbuild": "^0.25.0",
"eslint": "^9.21.0",
+ "eslint-plugin-react": "^7.37.4",
+ "globals": "^16.0.0",
"relay-compiler": "^18.2.0",
"tailwindcss": "^3.4.17",
- "typescript": "^5.7.3"
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.25.0"
},
"relay": {
"src": "src",
diff --git a/apps/console/src/App.tsx b/apps/console/src/App.tsx
index 87f09dd3b..fb5e37fe4 100644
--- a/apps/console/src/App.tsx
+++ b/apps/console/src/App.tsx
@@ -4,13 +4,7 @@ import { lazy, StrictMode, Suspense } from "react";
import { createRoot } from "react-dom/client";
import { HelmetProvider } from "react-helmet-async";
import { RelayEnvironmentProvider } from "react-relay";
-import {
- BrowserRouter,
- Route,
- Routes,
- useLocation,
- Navigate,
-} from "react-router";
+import { BrowserRouter, Route, Routes, useLocation } from "react-router";
import "App.css";
import ErrorBoundary from "./components/ErrorBoundary";
import ConsoleLayout from "./layouts/ConsoleLayout";
@@ -122,11 +116,22 @@ function App() {
element={
+
Create a new organization to manage your compliance and security needs.
diff --git a/apps/console/src/pages/CreatePeoplePage.tsx b/apps/console/src/pages/CreatePeoplePage.tsx index dc5cc085c..cfb74e3ca 100644 --- a/apps/console/src/pages/CreatePeoplePage.tsx +++ b/apps/console/src/pages/CreatePeoplePage.tsx @@ -1,14 +1,6 @@ -import { Suspense, useEffect, useState } from "react"; +import { Suspense, useState } from "react"; import { useNavigate, useParams } from "react-router"; -import { - graphql, - PreloadedQuery, - usePreloadedQuery, - useQueryLoader, - useMutation, - useRelayEnvironment, - ConnectionHandler, -} from "react-relay"; +import { graphql, useMutation, ConnectionHandler } from "react-relay"; import { Helmet } from "react-helmet-async"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; @@ -86,7 +78,7 @@ function CreatePeoplePageContent() { kind: "EMPLOYEE" as "EMPLOYEE" | "CONTRACTOR", }); - const handleFieldChange = (field: keyof typeof formData, value: any) => { + const handleFieldChange = (field: keyof typeof formData, value: unknown) => { setFormData((prev) => ({ ...prev, [field]: value, diff --git a/apps/console/src/pages/FrameworkOverviewPage.tsx b/apps/console/src/pages/FrameworkOverviewPage.tsx index e19140b1a..eb5f9608c 100644 --- a/apps/console/src/pages/FrameworkOverviewPage.tsx +++ b/apps/console/src/pages/FrameworkOverviewPage.tsx @@ -6,10 +6,9 @@ import { usePreloadedQuery, useQueryLoader, } from "react-relay"; -import { Shield, FileText, Clock, MoveUpRight } from "lucide-react"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Progress } from "@/components/ui/progress"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Shield, MoveUpRight, Clock } from "lucide-react"; +import { Card, CardContent } from "@/components/ui/card"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import type { FrameworkOverviewPageQuery as FrameworkOverviewPageQueryType } from "./__generated__/FrameworkOverviewPageQuery.graphql"; import { Helmet } from "react-helmet-async"; import { createPortal } from "react-dom"; diff --git a/apps/console/src/pages/LoginPage.tsx b/apps/console/src/pages/LoginPage.tsx index 323ea9965..a76fc1291 100644 --- a/apps/console/src/pages/LoginPage.tsx +++ b/apps/console/src/pages/LoginPage.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; -import { Link, useLocation, useNavigate } from "react-router"; -import { Helmet } from "react-helmet-async"; +import { Link, useNavigate } from "react-router"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; @@ -14,12 +13,8 @@ export default function LoginPage() { const [isLoading, setIsLoading] = useState(false); const { toast } = useToast(); const navigate = useNavigate(); - const location = useLocation(); const { checkAuth } = useAuth(); - // Get the redirect path from location state or default to home - const from = location.state?.from?.pathname || "/"; - const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); @@ -50,10 +45,10 @@ export default function LoginPage() { } else { throw new Error("Authentication failed"); } - } catch (error: any) { + } catch (error: unknown) { toast({ title: "Error", - description: error.message || "Failed to login", + description: error instanceof Error ? error.message : "Failed to login", variant: "destructive", }); } finally { diff --git a/apps/console/src/pages/OrganizationSelectionPage.tsx b/apps/console/src/pages/OrganizationSelectionPage.tsx index e2702fcf6..f45f55058 100644 --- a/apps/console/src/pages/OrganizationSelectionPage.tsx +++ b/apps/console/src/pages/OrganizationSelectionPage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useNavigate } from "react-router"; import { graphql, useLazyLoadQuery } from "react-relay"; import { Helmet } from "react-helmet-async"; diff --git a/apps/console/src/pages/PeopleListPage.tsx b/apps/console/src/pages/PeopleListPage.tsx index 275a3d775..2234078a3 100644 --- a/apps/console/src/pages/PeopleListPage.tsx +++ b/apps/console/src/pages/PeopleListPage.tsx @@ -8,7 +8,7 @@ import { usePaginationFragment, } from "react-relay"; import { useSearchParams, useParams } from "react-router"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { UserPlus, Trash2, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -136,8 +136,8 @@ function PeopleListContent({ peopleListPageQuery, queryRef ); - const [searchParams, setSearchParams] = useSearchParams(); - const [isPending, startTransition] = useTransition(); + const [, setSearchParams] = useSearchParams(); + const [, startTransition] = useTransition(); const [deletePeople] = useMutation