Skip to content

Commit b505a2f

Browse files
committed
add provider
1 parent e7fea6e commit b505a2f

File tree

5 files changed

+73
-49
lines changed

5 files changed

+73
-49
lines changed

apps/api/src/server.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ app.use(
5959
trpcExpress.createExpressMiddleware({
6060
router: appRouter,
6161
createContext: async (opts) => {
62-
console.log("createContext");
6362
const headers = Object.fromEntries(
6463
Object.entries(opts.req.headers)
6564
.filter(([_, v]) => typeof v === "string")
@@ -71,8 +70,6 @@ app.use(
7170
headers: new Headers(headers),
7271
})) ?? null;
7372

74-
console.log("session", session?.user.id);
75-
7673
return createTRPCContext(session);
7774
},
7875
}),
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import type { ReactNode } from "react";
2+
import { createContext, useContext } from "react";
3+
4+
type Workspace = {
5+
id: string;
6+
name: string;
7+
slug: string;
8+
};
9+
10+
// Define the WorkspaceContext type and default value
11+
type WorkspaceContextType = {
12+
workspace: Workspace;
13+
};
14+
15+
const WorkspaceContext = createContext<WorkspaceContextType | undefined>(
16+
undefined,
17+
);
18+
19+
export function WorkspaceProvider({
20+
children,
21+
workspace,
22+
}: {
23+
children: ReactNode;
24+
workspace: Workspace;
25+
}) {
26+
return (
27+
<WorkspaceContext.Provider value={{ workspace }}>
28+
{children}
29+
</WorkspaceContext.Provider>
30+
);
31+
}
32+
33+
export function useWorkspace() {
34+
const ctx = useContext(WorkspaceContext);
35+
if (!ctx)
36+
throw new Error("useWorkspace must be used within a WorkspaceProvider");
37+
return ctx;
38+
}

apps/web/app/routes/protected.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Navigate, Outlet, useParams } from "react-router";
22

33
import { trpc } from "~/api/trpc";
4+
import { WorkspaceProvider } from "~/components/WorkspaceProvider";
45

56
function LoadingScreen() {
67
return (
@@ -30,5 +31,9 @@ export default function ProtectedLayout() {
3031
return <Navigate to={`/${activeWorkspace.slug}/deployments`} />;
3132
}
3233

33-
return <Outlet />;
34+
return (
35+
<WorkspaceProvider workspace={activeWorkspace}>
36+
<Outlet />
37+
</WorkspaceProvider>
38+
);
3439
}

apps/web/app/routes/ws/resources.tsx

Lines changed: 27 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Upload,
99
} from "lucide-react";
1010

11+
import { trpc } from "~/api/trpc";
1112
import { Badge } from "~/components/ui/badge";
1213
import {
1314
Breadcrumb,
@@ -34,6 +35,7 @@ import {
3435
TableHeader,
3536
TableRow,
3637
} from "~/components/ui/table";
38+
import { useWorkspace } from "~/components/WorkspaceProvider";
3739

3840
type Resource = {
3941
id: string;
@@ -46,43 +48,25 @@ type Resource = {
4648
};
4749

4850
export default function Resources() {
49-
const resources = [
50-
{
51-
id: "1",
52-
name: "prod-api-server-01",
53-
type: "Compute Instance",
54-
status: "active",
55-
region: "us-east-1",
56-
lastUpdated: "2025-10-20T10:30:00",
57-
description: "Production API server",
58-
},
59-
{
60-
id: "2",
61-
name: "staging-db-cluster",
62-
type: "Database",
63-
status: "active",
64-
region: "us-west-2",
65-
lastUpdated: "2025-10-19T15:45:00",
66-
description: "Staging database cluster",
67-
},
68-
{
69-
id: "3",
70-
name: "dev-cache-redis",
71-
type: "Cache",
72-
status: "active",
73-
region: "us-east-1",
74-
lastUpdated: "2025-10-18T09:20:00",
75-
description: "Development Redis cache",
76-
},
77-
];
78-
51+
const { workspace } = useWorkspace();
7952
const [searchQuery, setSearchQuery] = useState("");
8053

81-
const filteredResources = resources.filter(
82-
(resource) =>
83-
resource.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
84-
resource.type.toLowerCase().includes(searchQuery.toLowerCase()) ||
85-
resource.region.toLowerCase().includes(searchQuery.toLowerCase()),
54+
const cel = `resource.name.startsWith("${searchQuery}")
55+
|| resource.name.endsWith("${searchQuery}")
56+
|| resource.name.contains("${searchQuery}")
57+
|| resource.identifier.startsWith("${searchQuery}")
58+
|| resource.identifier.endsWith("${searchQuery}")
59+
|| resource.identifier.contains("${searchQuery}")`;
60+
61+
const { data: resources } = trpc.resources.list.useQuery({
62+
workspaceId: workspace.id,
63+
selector: { cel },
64+
limit: 10,
65+
offset: 0,
66+
});
67+
68+
const filteredResources = resources?.items.filter((resource) =>
69+
resource.name.toLowerCase().includes(searchQuery.toLowerCase()),
8670
);
8771

8872
const getStatusColor = (status: Resource["status"]) => {
@@ -147,7 +131,7 @@ export default function Resources() {
147131
</TableRow>
148132
</TableHeader>
149133
<TableBody>
150-
{filteredResources.length === 0 ? (
134+
{filteredResources?.length === 0 ? (
151135
<TableRow>
152136
<TableCell colSpan={6} className="py-8 text-center">
153137
<div className="flex flex-col items-center gap-2">
@@ -159,30 +143,28 @@ export default function Resources() {
159143
</TableCell>
160144
</TableRow>
161145
) : (
162-
filteredResources.map((resource) => (
146+
filteredResources?.map((resource) => (
163147
<TableRow key={resource.id}>
164148
<TableCell className="font-medium">
165149
<div>
166150
<div>{resource.name}</div>
167151
<div className="text-xs text-muted-foreground">
168-
{resource.description}
152+
{resource.version}
169153
</div>
170154
</div>
171155
</TableCell>
172-
<TableCell>{resource.type}</TableCell>
156+
<TableCell>{resource.kind}</TableCell>
173157
<TableCell>
174158
<Badge
175159
variant="secondary"
176-
className={getStatusColor(
177-
resource.status as Resource["status"],
178-
)}
160+
className={getStatusColor("active")}
179161
>
180-
{resource.status}
162+
Active
181163
</Badge>
182164
</TableCell>
183-
<TableCell>{resource.region}</TableCell>
165+
<TableCell>{resource.workspaceId}</TableCell>
184166
<TableCell>
185-
{new Date(resource.lastUpdated).toLocaleDateString()}
167+
{new Date(resource.createdAt).toLocaleDateString()}
186168
</TableCell>
187169
<TableCell className="text-right">
188170
<DropdownMenu>

packages/trpc/src/root.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import { resourcesRouter } from "./routes/resources.js";
12
import { userRouter } from "./routes/user.js";
23
import { router } from "./trpc.js";
34

45
export const appRouter = router({
56
user: userRouter,
7+
resources: resourcesRouter,
68
});

0 commit comments

Comments
 (0)