diff --git a/package-lock.json b/package-lock.json
index 05f5f09..046c494 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,7 +22,6 @@
"winax": "^3.6.2"
},
"devDependencies": {
- "@ant-design/v5-patch-for-react-19": "^1.0.3",
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.1.0",
"@electron-toolkit/tsconfig": "^2.0.0",
@@ -174,21 +173,6 @@
"react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/@ant-design/v5-patch-for-react-19": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@ant-design/v5-patch-for-react-19/-/v5-patch-for-react-19-1.0.3.tgz",
- "integrity": "sha512-iWfZuSUl5kuhqLUw7jJXUQFMMkM7XpW7apmKzQBQHU0cpifYW4A79xIBt9YVO5IBajKpPG5UKP87Ft7Yrw1p/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.x"
- },
- "peerDependencies": {
- "antd": ">=5.22.6",
- "react": ">=19.0.0",
- "react-dom": ">=19.0.0"
- }
- },
"node_modules/@apm-js-collab/code-transformer": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz",
diff --git a/package.json b/package.json
index adc3dca..6b4a436 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,6 @@
"winax": "^3.6.2"
},
"devDependencies": {
- "@ant-design/v5-patch-for-react-19": "^1.0.3",
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.1.0",
"@electron-toolkit/tsconfig": "^2.0.0",
diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx
index 1e4fa2a..d1009fd 100644
--- a/src/renderer/src/App.tsx
+++ b/src/renderer/src/App.tsx
@@ -1,10 +1,10 @@
-import "@ant-design/v5-patch-for-react-19";
-import { ConfigProvider, Layout, Space } from "antd";
+import { ConfigProvider, Layout } from "antd";
import { FC } from "react";
import { ErrorBoundary } from "react-error-boundary";
import { Provider } from "react-redux";
import { HashRouter, Route, Routes } from "react-router";
import ErrorBoundaryFallback from "./components/ErrorBoundaryFallback/ErrorBoundaryFallback";
+import Home from "./components/Home/Home";
import Settings from "./components/Settings/Settings";
import UpdateAvailable from "./components/UpdateAvailable/UpdateAvailable";
import reduxStore from "./redux/redux-store";
@@ -32,7 +32,8 @@ const App: FC = () => {
- } />
+ } />
+ } />
diff --git a/src/renderer/src/components/Home/Home.tsx b/src/renderer/src/components/Home/Home.tsx
new file mode 100644
index 0000000..6dda336
--- /dev/null
+++ b/src/renderer/src/components/Home/Home.tsx
@@ -0,0 +1,284 @@
+// renderer/Home.tsx
+import {
+ Button,
+ Card,
+ Col,
+ Flex,
+ Row,
+ Space,
+ Statistic,
+ Table,
+ Tag,
+ Typography,
+ theme,
+ List,
+ Avatar,
+ Divider,
+} from "antd";
+import { FC } from "react";
+import { useNavigate } from "react-router";
+import {
+ FileTextOutlined,
+ CheckCircleOutlined,
+ ClockCircleOutlined,
+ SettingOutlined,
+ EyeOutlined,
+ RightOutlined,
+} from "@ant-design/icons";
+
+const { Title, Text, Paragraph } = Typography;
+
+// Placeholder data for recently scrubbed estimates
+const placeholderEstimates = [
+ {
+ id: "EST-2026-001",
+ fileName: "estimate_john_doe.pdf",
+ scrubbedAt: "2026-01-12T10:30:00",
+ status: "completed",
+ itemsProcessed: 24,
+ },
+ {
+ id: "EST-2026-002",
+ fileName: "estimate_jane_smith.pdf",
+ scrubbedAt: "2026-01-12T09:15:00",
+ status: "completed",
+ itemsProcessed: 18,
+ },
+ {
+ id: "EST-2026-003",
+ fileName: "estimate_acme_corp.pdf",
+ scrubbedAt: "2026-01-11T16:45:00",
+ status: "completed",
+ itemsProcessed: 32,
+ },
+ {
+ id: "EST-2026-004",
+ fileName: "estimate_bob_johnson.pdf",
+ scrubbedAt: "2026-01-11T14:20:00",
+ status: "completed",
+ itemsProcessed: 15,
+ },
+ {
+ id: "EST-2026-005",
+ fileName: "estimate_tech_solutions.pdf",
+ scrubbedAt: "2026-01-11T11:00:00",
+ status: "completed",
+ itemsProcessed: 27,
+ },
+];
+
+const columns = [
+ {
+ title: "Estimate",
+ dataIndex: "id",
+ key: "id",
+ responsive: ["md"] as const,
+ render: (text: string, record: (typeof placeholderEstimates)[0]) => (
+
+ {text}
+
+ {record.fileName}
+
+
+ ),
+ },
+ {
+ title: "File",
+ dataIndex: "fileName",
+ key: "fileName",
+ responsive: ["xs"] as const,
+ render: (text: string, record: (typeof placeholderEstimates)[0]) => (
+
+ {record.id}
+
+ {text}
+
+
+ ),
+ },
+ {
+ title: "Scrubbed",
+ dataIndex: "scrubbedAt",
+ key: "scrubbedAt",
+ responsive: ["sm"] as const,
+ render: (text: string) => {
+ const date = new Date(text);
+ return (
+
+ {date.toLocaleDateString()}
+
+ {date.toLocaleTimeString()}
+
+
+ );
+ },
+ },
+ {
+ title: "Items",
+ dataIndex: "itemsProcessed",
+ key: "itemsProcessed",
+ responsive: ["lg"] as const,
+ render: (value: number) => {value},
+ },
+ {
+ title: "Status",
+ dataIndex: "status",
+ key: "status",
+ responsive: ["sm"] as const,
+ render: (status: string) => (
+ }
+ style={{ margin: 0 }}
+ >
+ {status === "completed" ? "Done" : "Processing"}
+
+ ),
+ },
+ {
+ title: "",
+ key: "action",
+ width: 100,
+ render: () => (
+ } size="small">
+ View
+
+ ),
+ },
+];
+
+const Home: FC = () => {
+ const navigate = useNavigate();
+ const { token } = theme.useToken();
+
+ return (
+
+
+ {/* Header */}
+
+
+ Dashboard
+
+ }
+ onClick={() => navigate("/settings")}
+ size="large"
+ >
+ Settings
+
+
+
+ {/* Stats Cards */}
+
+
+
+
+ Total Estimates
+
+ }
+ value={placeholderEstimates.length}
+ prefix={}
+ valueStyle={{ color: "#fff", fontWeight: 600 }}
+ />
+
+
+
+
+
+ Items Scrubbed
+
+ }
+ value={placeholderEstimates.reduce(
+ (acc, est) => acc + est.itemsProcessed,
+ 0,
+ )}
+ prefix={}
+ valueStyle={{ color: "#fff", fontWeight: 600 }}
+ />
+
+
+
+
+
+ Last Processed
+
+ }
+ value={new Date(
+ placeholderEstimates[0].scrubbedAt,
+ ).toLocaleTimeString()}
+ prefix={}
+ valueStyle={{ color: "#fff", fontWeight: 600 }}
+ />
+
+
+
+
+ {/* Recent Estimates Card */}
+
+
+ Recently Scrubbed Estimates
+
+ }
+ extra={
+ }
+ iconPlacement="end"
+ onClick={() => alert("View all estimates - coming soon!")}
+ >
+ View All
+
+ }
+ styles={{
+ header: {
+ borderBottom: `2px solid ${token.colorBorderSecondary}`,
+ },
+ }}
+ >
+ {/* Table view for larger screens */}
+
+
+
+
+ );
+};
+
+export default Home;
diff --git a/src/renderer/src/components/Settings/Settings.Watcher.tsx b/src/renderer/src/components/Settings/Settings.Watcher.tsx
index 1de71b2..7777441 100644
--- a/src/renderer/src/components/Settings/Settings.Watcher.tsx
+++ b/src/renderer/src/components/Settings/Settings.Watcher.tsx
@@ -1,26 +1,18 @@
-import { useAppSelector } from "@renderer/redux/reduxHooks";
-import {
- CheckCircleFilled,
- ExclamationCircleFilled,
- PauseCircleOutlined,
- PlayCircleOutlined,
-} from "@ant-design/icons";
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons";
import {
selectWatcherError,
selectWatcherStatus,
} from "@renderer/redux/app.slice";
+import { useAppSelector } from "@renderer/redux/reduxHooks";
import {
Alert,
- Badge,
Button,
Card,
- Divider,
Flex,
InputNumber,
Radio,
RadioChangeEvent,
Space,
- Switch,
Typography,
} from "antd";
import { FC, useEffect, useState } from "react";
diff --git a/src/renderer/src/components/Settings/Settings.tsx b/src/renderer/src/components/Settings/Settings.tsx
index 4fa5a7a..5938a2d 100644
--- a/src/renderer/src/components/Settings/Settings.tsx
+++ b/src/renderer/src/components/Settings/Settings.tsx
@@ -1,12 +1,25 @@
// renderer/Settings.tsx
-import { Space } from "antd";
+import { Button, Space } from "antd";
+import { ArrowLeftOutlined } from "@ant-design/icons";
import { FC } from "react";
+import { useNavigate } from "react-router";
import SettingsConfig from "./Settings.Config";
import SettingsWatcher from "./Settings.Watcher";
const Settings: FC = () => {
+ const navigate = useNavigate();
+
return (
+ }
+ onClick={() => navigate("/")}
+ style={{ alignSelf: "flex-start" }}
+ >
+ Back
+
+