Skip to content

Commit baa52c2

Browse files
Merge pull request #249 from crabnebula-dev/fix/tauri-tab-configuration-loading
Fix/tauri tab configuration loading
2 parents 6eacc6d + 0b7b5ba commit baa52c2

11 files changed

Lines changed: 426 additions & 114 deletions

File tree

clients/web/src/components/health-status.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HealthCheckResponse_ServingStatus } from "~/lib/proto/health";
22
import { Show, createEffect, createSignal, onMount } from "solid-js";
33
import { ErrorDialog } from "./dialogs/error-dialog";
44
import {
5-
addStreamListneners,
5+
addStreamListeners,
66
connect,
77
checkConnection,
88
} from "~/lib/connection/transport";
@@ -121,7 +121,7 @@ export function HealthStatus() {
121121
setMonitorData("spans", reconcile([]));
122122
const newConnection = connect(connectionStore.serviceUrl);
123123
setConnection(reconcile(newConnection, { merge: false }));
124-
addStreamListneners(connectionStore.stream.update, setMonitorData);
124+
addStreamListeners(connectionStore.stream.update, setMonitorData);
125125
connectionStore.stream.health.responses.onError(healthErrorHandler);
126126
connectionStore.stream.update.responses.onError(updateErrorHandler);
127127
}

clients/web/src/components/tauri/configuration-context.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import {
44
useContext,
55
type JSXElement,
66
} from "solid-js";
7-
import { type ConfigurationStore } from "~/lib/tauri/config/retrieve-configurations";
8-
import { createStore } from "solid-js/store";
97

108
type ConfigurationContextType = ReturnType<typeof makeConfigurationContext>;
119
const ConfigurationContext = createContext<ConfigurationContextType>();
@@ -24,7 +22,6 @@ export const makeConfigurationContext = () => {
2422
const [descriptions, setDescriptions] = createSignal<
2523
Map<string, { default?: string }>
2624
>(new Map());
27-
const [configurations, setConfigurations] = createStore<ConfigurationStore>();
2825
return {
2926
highlightKey: {
3027
highlightKey: highlightKey,
@@ -34,10 +31,6 @@ export const makeConfigurationContext = () => {
3431
descriptions: descriptions,
3532
setDescriptions: setDescriptions,
3633
},
37-
configurations: {
38-
configurations: configurations,
39-
setConfigurations: setConfigurations,
40-
},
4134
} as const;
4235
};
4336

clients/web/src/components/tauri/configuration-value.tsx

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,43 @@
1-
import { Show, For, Switch, Match } from "solid-js";
1+
import { Show, For, createMemo } from "solid-js";
22
import { ConfigurationTooltip } from "./configuration-tooltip";
33
import { Flags } from "./configuration-value/flags";
4+
import { TauriConfig } from "~/lib/tauri/config/tauri-conf";
45

5-
type ConfigurationValue =
6-
| ConfigurationRecord
7-
| string
8-
| []
9-
| boolean
10-
| null
11-
| undefined
12-
| unknown;
13-
14-
/* eslint-disable-next-line @typescript-eslint/no-empty-interface */
15-
interface ConfigurationRecord extends Record<string, ConfigurationValue> {}
6+
type ConfigurationValue = TauriConfig[keyof TauriConfig];
167

178
interface ConfigurationValueProps {
189
parentKey: string;
1910
key: string;
2011
value: ConfigurationValue;
2112
}
2213

23-
interface TextConfigurationValueProps extends ConfigurationValueProps {
14+
type TextConfigurationValueProps = Omit<ConfigurationValueProps, "value"> & {
2415
value: string | boolean;
25-
}
16+
};
2617

2718
interface ArrayConfigurationValueProps extends ConfigurationValueProps {
28-
value: [];
19+
value: ConfigurationValue[];
2920
}
3021

3122
interface ObjectConfigurationValueProps extends ConfigurationValueProps {
32-
value: ConfigurationRecord;
23+
value: Omit<ConfigurationValue, "undefined">;
3324
}
3425

3526
export function ConfigurationValue(props: ConfigurationValueProps) {
36-
return (
37-
<Switch
38-
fallback={<TextValue {...(props as TextConfigurationValueProps)} />}
39-
>
40-
<Match
41-
when={
42-
typeof props.value === "string" || typeof props.value === "boolean"
43-
}
44-
>
45-
<TextValue {...(props as TextConfigurationValueProps)} />
46-
</Match>
47-
<Match when={Array.isArray(props.value)}>
48-
<ArrayValue {...(props as ArrayConfigurationValueProps)} />
49-
</Match>
50-
<Match when={typeof props.value === "object" && props.value !== null}>
51-
<ObjectValue {...(props as ObjectConfigurationValueProps)} />
52-
</Match>
53-
</Switch>
54-
);
27+
const selectedTemplate = createMemo(() => {
28+
if (typeof props.value === "string" || typeof props.value === "boolean")
29+
return <TextValue {...props} value={props.value} />;
30+
31+
if (Array.isArray(props.value))
32+
return <ArrayValue {...props} value={props.value} />;
33+
34+
if (typeof props.value === "object" && props.value)
35+
return <ObjectValue {...props} value={props.value} />;
36+
37+
return <TextValue {...props} value={String(props.value)} />;
38+
});
39+
40+
return <>{selectedTemplate()}</>;
5541
}
5642

5743
function TextValue(props: TextConfigurationValueProps) {
@@ -84,7 +70,7 @@ function ObjectValue(props: ObjectConfigurationValueProps) {
8470
<ConfigurationTooltip parentKey={props.parentKey} key={props.key} />
8571
</h2>
8672
<ul class="flex flex-col">
87-
<For each={Object.entries(props.value)}>
73+
<For each={Object.entries<ConfigurationValue>(props.value)}>
8874
{([childKey, value]) => (
8975
<li>
9076
<ConfigurationValue

clients/web/src/components/tauri/configuration-view.tsx

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { ConfigurationErrors } from "./configuration-errors";
88
import { MissingConfigurationParameterDialog } from "./dialogs/missing-configuration-parameter-dialog";
99
import { MissingConfigurationDialog } from "./dialogs/missing-configuration-dialog";
1010
import { Heading } from "../heading";
11+
import { TauriConfig } from "~/lib/tauri/config/tauri-conf";
12+
import { createMemo } from "solid-js";
1113

1214
export function ConfigurationView() {
1315
const params = useParams<{
@@ -17,22 +19,29 @@ export function ConfigurationView() {
1719
| "tauri.windows.conf"
1820
| "tauri.linux.conf"
1921
| "tauri.macos.conf";
20-
selected: "build" | "package" | "plugins" | "tauri";
22+
selected: keyof TauriConfig;
2123
}>();
2224

2325
const config = () => retrieveConfigurationByKey(params.config);
2426

25-
const tab = () => {
27+
const tab = createMemo(() => {
2628
const config = retrieveConfigurationByKey(params.config);
27-
if (config && config.data && config.data[params.selected])
29+
if (
30+
config &&
31+
config.data &&
32+
(config.data[params.selected] ||
33+
typeof config.data[params.selected] === "string")
34+
)
2835
return config.data[params.selected];
2936
return undefined;
30-
};
37+
});
3138

32-
const tabWithKeys = (currentTab: ReturnType<typeof tab>) => {
39+
const tabWithKeys = createMemo(() => {
40+
const currentTab = tab();
41+
if (typeof currentTab === "string" && currentTab === "") return "empty";
3342
if (!currentTab || !(Object.keys(currentTab).length > 0)) return undefined;
3443
return currentTab;
35-
};
44+
});
3645

3746
createEffect(() => {
3847
const data = tab();
@@ -54,7 +63,7 @@ export function ConfigurationView() {
5463
<h1 class="text-3xl">{config()?.label}</h1>
5564
<ConfigurationErrors error={config()?.error} />
5665
</Match>
57-
<Match when={tabWithKeys(tab())}>
66+
<Match when={tabWithKeys()}>
5867
{(t) => (
5968
<>
6069
<header>

clients/web/src/components/tauri/sidebar.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import { For, Suspense, Show } from "solid-js";
22
import { FileIcon } from "~/components/icons/ide-icons";
33
import { A } from "@solidjs/router";
4-
import {
5-
type ConfigurationObject,
6-
retrieveConfigurations,
7-
} from "~/lib/tauri/config/retrieve-configurations";
4+
import { type ConfigurationObject } from "~/lib/tauri/config/retrieve-configurations";
85
import { Loader } from "~/components/loader";
96
import { getTauriTabBasePath } from "~/lib/tauri/get-tauri-tab-base-path";
7+
import { useMonitor } from "~/context/monitor-provider";
108

119
export function Sidebar() {
12-
const [configEntries] = retrieveConfigurations();
10+
const { monitorData } = useMonitor();
1311

1412
return (
1513
<>
1614
<h2 class="text-neutral-300 p-4 pb-2 text-2xl">Config</h2>
1715
<Suspense fallback={<Loader />}>
18-
<For each={configEntries()}>{(child) => <Config config={child} />}</For>
16+
<For each={monitorData.tauriConfigStore?.configs}>
17+
{(child) => <Config config={child} />}
18+
</For>
1919
</Suspense>
2020
</>
2121
);

clients/web/src/context/monitor-provider.tsx

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Show,
55
createContext,
66
useContext,
7+
createResource,
78
} from "solid-js";
89
import { SetStoreFunction, createStore } from "solid-js/store";
910
import {
@@ -13,9 +14,10 @@ import {
1314
getVersions,
1415
} from "~/lib/connection/getters";
1516
import { MonitorData, initialMonitorData } from "~/lib/connection/monitor";
16-
import { addStreamListneners } from "~/lib/connection/transport";
17+
import { addStreamListeners } from "~/lib/connection/transport";
1718
import { useConnection } from "~/context/connection-provider";
1819
import { jsonSchemaForVersion } from "~/lib/tauri/config/json-schema-for-version";
20+
import { loadConfigurations } from "~/lib/tauri/config/retrieve-configurations";
1921

2022
type ProviderProps = {
2123
children: JSXElement;
@@ -37,18 +39,24 @@ export function MonitorProvider(props: ProviderProps) {
3739
const { connectionStore } = useConnection();
3840
const [monitorData, setMonitorData] = createStore(initialMonitorData);
3941
const [tauriMetrics] = getTauriMetrics(connectionStore.client.tauri);
42+
const [appMetadata] = getMetadata(connectionStore.client.meta);
4043
const [tauriConfig] = getTauriConfig(connectionStore.client.tauri);
4144
const [tauriVersions] = getVersions(connectionStore.client.tauri);
42-
const [appMetadata] = getMetadata(connectionStore.client.meta);
45+
const [tauriConfigStore] = createResource(
46+
/** The base configuration and the active tauri version have to be loaded for proper parsing */
47+
() =>
48+
tauriConfig() && tauriVersions()
49+
? [tauriConfig(), tauriVersions()]
50+
: undefined,
51+
([tauriConfig, tauriVersions]) => {
52+
return loadConfigurations(tauriConfig, tauriVersions);
53+
},
54+
);
4355

4456
createEffect(() => {
4557
setMonitorData("tauriConfig", tauriConfig());
4658
});
4759

48-
createEffect(() => {
49-
setMonitorData("appMetadata", appMetadata());
50-
});
51-
5260
createEffect(() => {
5361
const versions = tauriVersions();
5462
if (versions) {
@@ -59,13 +67,22 @@ export function MonitorProvider(props: ProviderProps) {
5967
});
6068

6169
createEffect(() => {
62-
if (tauriMetrics()) {
63-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
64-
setMonitorData("perf", tauriMetrics()!);
70+
const configs = tauriConfigStore();
71+
setMonitorData("tauriConfigStore", { configs });
72+
});
73+
74+
createEffect(() => {
75+
setMonitorData("appMetadata", appMetadata());
76+
});
77+
78+
createEffect(() => {
79+
const metrics = tauriMetrics();
80+
if (metrics) {
81+
setMonitorData("perf", metrics);
6582
}
6683
});
6784

68-
addStreamListneners(connectionStore.stream.update, setMonitorData);
85+
addStreamListeners(connectionStore.stream.update, setMonitorData);
6986

7087
return (
7188
<Show when={tauriMetrics()}>

clients/web/src/lib/connection/monitor.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Timestamp } from "~/lib/proto/google/protobuf/timestamp";
66
import { timestampToDate } from "~/lib/formatters";
77
import { AppMetadata } from "../proto/meta";
88
import { Versions } from "../proto/tauri";
9+
import { ConfigurationStore } from "../tauri/config/retrieve-configurations";
910

1011
export type HealthStatus = keyof typeof HealthCheckResponse_ServingStatus;
1112

@@ -26,8 +27,10 @@ export type MonitorData = {
2627
metadata: Map<bigint, Metadata>;
2728
logs: LogEvent[];
2829
spans: Span[];
29-
30+
/** The original/parsed tauri configuration we receive from instrumentation */
3031
tauriConfig?: Record<"build" | "package" | "plugins" | "tauri", object>;
32+
/** All the parsed configuration files we read from the frontend */
33+
tauriConfigStore?: ConfigurationStore;
3134
tauriVersions?: Versions;
3235
appMetadata?: AppMetadata;
3336
schema?: object;
@@ -44,7 +47,6 @@ export const initialMonitorData: MonitorData = {
4447
metadata: new Map(),
4548
logs: [],
4649
spans: [],
47-
4850
tauriConfig: undefined,
4951
tauriVersions: undefined,
5052
appMetadata: undefined,

clients/web/src/lib/connection/transport.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export function setup(url: string) {
9999

100100
type UpdateStream = ReturnType<typeof connect>["stream"]["update"];
101101

102-
export function addStreamListneners(
102+
export function addStreamListeners(
103103
stream: UpdateStream,
104104
setMonitorData: SetStoreFunction<MonitorData>,
105105
) {

0 commit comments

Comments
 (0)