Skip to content

Commit 93e2b96

Browse files
drew-harrisskeptrunedev
authored andcommitted
feat: even better context
1 parent aba6ed4 commit 93e2b96

File tree

4 files changed

+43
-103
lines changed

4 files changed

+43
-103
lines changed

frontends/dashboard/src/contexts/DatasetContext.tsx

Lines changed: 28 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,40 @@
1-
import {
2-
Accessor,
3-
JSX,
4-
createEffect,
5-
createContext,
6-
createSignal,
7-
useContext,
8-
} from "solid-js";
9-
import { Dataset } from "shared/types";
10-
import { UserContext } from "./UserContext";
111
import { useParams } from "@solidjs/router";
12-
import { createToast } from "../components/ShowToasts";
13-
14-
export interface DatasetStoreContextProps {
15-
children: JSX.Element;
16-
}
2+
import { Accessor, createContext, createMemo, useContext } from "solid-js";
3+
import { JSX } from "solid-js";
4+
import { DatasetAndUsage } from "trieve-ts-sdk";
5+
import { UserContext } from "./UserContext";
176

18-
export interface DatasetStore {
19-
dataset: Accessor<Dataset | null> | null;
20-
}
7+
type DatasetStore = {
8+
dataset: Accessor<DatasetAndUsage | null>;
9+
datasetId: string;
10+
};
2111

2212
export const DatasetContext = createContext<DatasetStore>({
23-
dataset: null,
13+
dataset: () => null as unknown as DatasetAndUsage,
14+
datasetId: "",
2415
});
2516

26-
export const DatasetContextWrapper = (props: DatasetStoreContextProps) => {
27-
const apiHost = import.meta.env.VITE_API_HOST as string;
28-
const userContext = useContext(UserContext);
29-
const [dataset, setDataset] = createSignal<Dataset | null>(null);
30-
31-
createEffect(() => {
32-
if (userContext?.user?.()) {
33-
const id = useParams().dataset_id;
34-
if (!id) return;
35-
36-
if (!id || !id.match(/^[a-f0-9-]+$/)) {
37-
console.error("Invalid dataset id for fetch");
38-
return;
39-
}
40-
41-
fetch(`${apiHost}/dataset/${id}`, {
42-
method: "GET",
43-
headers: {
44-
"Content-Type": "application/json",
45-
"TR-Organization": userContext.selectedOrganizationId?.() as string,
46-
},
47-
credentials: "include",
48-
})
49-
.then((res) => res.json())
50-
.then((data) => {
51-
setDataset(data);
52-
})
53-
.catch(() => {
54-
createToast({
55-
title: "Error",
56-
type: "error",
57-
message: "Failed to fetch the dataset",
58-
});
59-
});
17+
export const DatasetContextProvider = (props: { children: JSX.Element }) => {
18+
const datasetId = useParams().id;
19+
const orgContext = useContext(UserContext);
20+
21+
const dataset = createMemo(() => {
22+
const possDatasets = orgContext.orgDatasets();
23+
if (possDatasets) {
24+
return (
25+
possDatasets.find((dataset) => dataset.dataset.id === datasetId) || null
26+
);
27+
} else {
28+
return null;
6029
}
6130
});
62-
63-
const datasetStore: DatasetStore = {
64-
dataset,
65-
};
66-
6731
return (
68-
<DatasetContext.Provider value={datasetStore}>
32+
<DatasetContext.Provider
33+
value={{
34+
dataset: dataset,
35+
datasetId: datasetId,
36+
}}
37+
>
6938
{props.children}
7039
</DatasetContext.Provider>
7140
);

frontends/dashboard/src/index.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { NavbarLayout } from "./layouts/NavbarLayout.tsx";
1212
import { OrganizationHomepage } from "./pages/OrganizationHomepage.tsx";
1313
import { DatasetHomepage } from "./pages/dataset/DatasetHomepage.tsx";
1414
import { DatasetLayout } from "./layouts/DatasetSidebarLayout.tsx";
15+
import { DatasetContextProvider } from "./contexts/DatasetContext.tsx";
1516

1617
if (!DEV) {
1718
Sentry.init({
@@ -53,7 +54,11 @@ const routes: RouteDefinition[] = [
5354
},
5455
{
5556
path: "/dataset/:id",
56-
component: DatasetLayout,
57+
component: (props) => (
58+
<DatasetContextProvider>
59+
<DatasetLayout>{props.children}</DatasetLayout>
60+
</DatasetContextProvider>
61+
),
5762
// ANY CHILD will have access to datasetID
5863
children: [
5964
{
Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,15 @@
1-
import { useParams } from "@solidjs/router";
2-
import { Accessor, createContext, JSX, useContext } from "solid-js";
3-
import { UserContext } from "../contexts/UserContext";
4-
import { createMemo } from "solid-js/types/server/reactive.js";
5-
import { DatasetAndUsage } from "trieve-ts-sdk";
1+
import { JSX } from "solid-js";
62

73
interface Props {
84
children?: JSX.Element;
95
}
106

11-
type DatasetStore = {
12-
dataset: Accessor<DatasetAndUsage | null>;
13-
datasetId: string;
14-
};
15-
16-
const DatasetContext = createContext<DatasetStore>({
17-
dataset: () => null as unknown as DatasetAndUsage,
18-
datasetId: "",
19-
});
20-
217
// Needs to ensure dataset and org don't desync
228
export const DatasetLayout = (props: Props) => {
23-
const datasetId = useParams().id;
24-
const orgContext = useContext(UserContext);
25-
26-
const dataset = createMemo(() => {
27-
const possDatasets = orgContext.orgDatasets();
28-
if (possDatasets) {
29-
return (
30-
possDatasets.find((dataset) => dataset.dataset.id === datasetId) || null
31-
);
32-
} else {
33-
return null;
34-
}
35-
});
36-
379
return (
38-
<DatasetContext.Provider
39-
value={{
40-
dataset,
41-
datasetId,
42-
}}
43-
>
44-
<div class="grid max-h-full grow grid-cols-[200px_1fr] overflow-hidden bg-green-500">
45-
<div class="h-full bg-red-500">sidebar</div>
46-
<div class="overflow-scroll">{props.children}</div>
47-
</div>
48-
</DatasetContext.Provider>
10+
<div class="grid max-h-full grow grid-cols-[200px_1fr] overflow-hidden">
11+
<div class="h-full bg-red-500">sidebar</div>
12+
<div class="overflow-scroll">{props.children}</div>
13+
</div>
4914
);
5015
};
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { useParams } from "@solidjs/router";
1+
import { useContext } from "solid-js";
2+
import { DatasetContext } from "../../contexts/DatasetContext";
23

34
export const DatasetHomepage = () => {
4-
const datasetId = useParams().id;
5+
const { datasetId } = useContext(DatasetContext);
56
return (
67
<div>
78
<div>Dataset Homepage</div>
8-
<div class="m-3 h-[4000px] bg-orange-700">{datasetId}</div>
9+
<div class="m-3 bg-orange-700">ID: {datasetId}</div>
910
</div>
1011
);
1112
};

0 commit comments

Comments
 (0)