-
}>
+
+
}>
-
}>
+
}>
-
}>
+
}>
- }>
+ }>
- }>
+ }>
-
}>
+
}>
-
}>
+
}>
-
}>
+
}>
diff --git a/web/src/routes/(webapp)/hometitle.tsx b/web/src/routes/(webapp)/hometitle.tsx
index 4a90fb3..30b77d6 100644
--- a/web/src/routes/(webapp)/hometitle.tsx
+++ b/web/src/routes/(webapp)/hometitle.tsx
@@ -1,11 +1,21 @@
-import { createSignal, createResource, For, Show } from "solid-js";
+import { createSignal, createResource, For, Show, Suspense } from "solid-js";
import { Title } from "@solidjs/meta";
import { Sidebar, TopBar } from "~/components/dashboard";
-import { Button, Input, Card } from "~/components/ui";
+import { Button, Input, Card, EmptyState, SkeletonTable } from "~/components/ui";
import { api } from "~/lib/api";
+function HomeIcon() {
+ return (
+
+
+
+
+ );
+}
+
export default function HomeTitlePage() {
const [sidebarOpen, setSidebarOpen] = createSignal(false);
+ const [adding, setAdding] = createSignal(false);
const [address, setAddress] = createSignal("");
const [properties, { refetch }] = createResource(
() => api.hometitle.getProperties.query(),
@@ -13,9 +23,14 @@ export default function HomeTitlePage() {
);
async function addProperty() {
- await api.hometitle.addProperty.mutate({ address: address(), parcelId: "", ownerName: "" });
- setAddress("");
- refetch();
+ setAdding(true);
+ try {
+ await api.hometitle.addProperty.mutate({ address: address(), parcelId: "", ownerName: "" });
+ setAddress("");
+ refetch();
+ } finally {
+ setAdding(false);
+ }
}
async function removeProperty(propertyId: string) {
@@ -29,7 +44,7 @@ export default function HomeTitlePage() {
setSidebarOpen(false)} />
setSidebarOpen(v => !v)} />
-
+
HomeTitle
@@ -41,7 +56,7 @@ export default function HomeTitlePage() {
value={address()}
onInput={(e) => setAddress(e.currentTarget.value)}
/>
- Add
+ Add
@@ -49,23 +64,29 @@ export default function HomeTitlePage() {
Monitored Properties
-
-
- {(prop: Record) => (
-
-
{String(prop.address ?? "")}
-
removeProperty(String(prop.id))}>
- Remove
-
-
- )}
-
-
-
- No properties monitored
+
}>
+ 0} fallback={
+ }
+ title="No properties monitored"
+ description="Add a property address to monitor for title fraud and ownership changes."
+ action={{ label: "Add property", onClick: () => document.querySelector("input")?.focus() }}
+ />
+ }>
+
+
+ {(prop: Record) => (
+
+
{String(prop.address ?? "")}
+
removeProperty(String(prop.id))}>
+ Remove
+
+
+ )}
+
-
+
diff --git a/web/src/routes/(webapp)/removebrokers.tsx b/web/src/routes/(webapp)/removebrokers.tsx
index 6971d4d..a39eeb9 100644
--- a/web/src/routes/(webapp)/removebrokers.tsx
+++ b/web/src/routes/(webapp)/removebrokers.tsx
@@ -1,9 +1,19 @@
-import { createSignal, createResource, For, Show } from "solid-js";
+import { createSignal, createResource, For, Show, Suspense } from "solid-js";
import { Title } from "@solidjs/meta";
import { Sidebar, TopBar } from "~/components/dashboard";
-import { Button, Card } from "~/components/ui";
+import { Button, Card, EmptyState, SkeletonCard, SkeletonTable } from "~/components/ui";
import { api } from "~/lib/api";
+function BrokerIcon() {
+ return (
+
+
+
+
+
+ );
+}
+
export default function RemoveBrokersPage() {
const [sidebarOpen, setSidebarOpen] = createSignal(false);
const [brokers] = createResource(
@@ -31,70 +41,86 @@ export default function RemoveBrokersPage() {
setSidebarOpen(false)} />
setSidebarOpen(v => !v)} />
-
+
RemoveBrokers
-
-
-
-
- {String((stats() as Record)?.totalRequests ?? 0)}
-
- Total Requests
-
-
-
- {String((stats() as Record)?.completedRequests ?? 0)}
-
- Completed
-
-
-
- {String((stats() as Record)?.pendingRequests ?? 0)}
-
- Pending
-
-
-
+
}>
+
+
+
+
+ {String((stats() as Record)?.totalRequests ?? 0)}
+
+ Total Requests
+
+
+
+ {String((stats() as Record)?.completedRequests ?? 0)}
+
+ Completed
+
+
+
+ {String((stats() as Record)?.pendingRequests ?? 0)}
+
+ Pending
+
+
+
+
Data Brokers
-
-
- {(broker: Record) => (
-
-
{String(broker.name ?? "")}
-
createRequest(String(broker.id))}>
- Opt Out
-
-
- )}
-
-
+ }>
+ 0} fallback={
+ }
+ title="No data brokers found"
+ description="Your broker registry is empty. We'll scan for brokers automatically."
+ />
+ }>
+
+
+ {(broker: Record) => (
+
+
{String(broker.name ?? "")}
+
createRequest(String(broker.id))}>
+ Opt Out
+
+
+ )}
+
+
+
+
Removal Requests
-
-
- {(req: Record) => (
-
-
{String(req.brokerName ?? "")}
-
Status: {String(req.status ?? "")}
-
- )}
-
-
-
- No removal requests yet
+
}>
+ 0} fallback={
+
+ }>
+
+
+ {(req: Record) => (
+
+
{String(req.brokerName ?? "")}
+
Status: {String(req.status ?? "")}
+
+ )}
+
-
+
diff --git a/web/src/routes/(webapp)/settings.tsx b/web/src/routes/(webapp)/settings.tsx
index 1b06674..48e2bb0 100644
--- a/web/src/routes/(webapp)/settings.tsx
+++ b/web/src/routes/(webapp)/settings.tsx
@@ -27,7 +27,7 @@ export default function SettingsPage() {