ui/routing: move scene down clans/:id"

This commit is contained in:
Johannes Kirschbauer
2025-07-18 17:11:32 +02:00
parent 23d2975bb5
commit e37b61240b
2 changed files with 100 additions and 11 deletions

View File

@@ -1,10 +1,14 @@
import { RouteSectionProps } from "@solidjs/router";
import { Component, JSX } from "solid-js";
import { useMaybeClanURI } from "@/src/hooks/clan";
import { Component, createEffect, JSX } from "solid-js";
import { useClanURI } from "@/src/hooks/clan";
import { CubeScene } from "@/src/scene/cubes";
import { MachinesQueryResult, useMachinesQuery } from "@/src/queries/queries";
import { callApi } from "@/src/hooks/api";
import { store, setStore } from "@/src/stores/clan";
import { produce } from "solid-js/store";
import { Button } from "@/src/components/Button/Button";
export const Clans: Component<RouteSectionProps> = (props) => {
export const Clan: Component<RouteSectionProps> = (props) => {
return (
<>
<div
@@ -15,17 +19,103 @@ export const Clans: Component<RouteSectionProps> = (props) => {
>
{props.children}
</div>
<ClanSwitchDog />
<ClanSceneController />
</>
);
};
const ClanSwitchDog = () => {
const maybeClanURI = useMaybeClanURI();
const ClanSceneController = () => {
const clanURI = useClanURI({ force: true });
const onCreate = async (id: string) => {
const api = callApi("create_machine", {
opts: {
clan_dir: {
identifier: clanURI,
},
machine: {
name: id,
},
},
});
const res = await api.result;
if (res.status === "error") {
// TODO: Handle displaying errors
console.error("Error creating machine:");
// Important: rejects the promise
throw new Error(res.errors[0].message);
}
return;
};
createEffect(() => {
console.log("sceneData changed:", store.sceneData);
});
return (
<SceneDataProvider clanURI={maybeClanURI}>
{({ query }) => <CubeScene cubesQuery={query} />}
<SceneDataProvider clanURI={clanURI}>
{({ query }) => {
return (
<>
<div
class="flex flex-row"
style={{ position: "absolute", top: "10px", left: "10px" }}
>
<Button
ghost
onClick={() => {
setStore(
produce((s) => {
for (const machineId in s.sceneData[clanURI]) {
// Reset the position of each machine to [0, 0]
// delete s.sceneData[clanURI][machineId];
}
}),
);
}}
>
Reset Store
</Button>
<Button
ghost
onClick={() => {
console.log("Refetching API");
query.refetch();
}}
>
Refetch API
</Button>
</div>
<CubeScene
cubesQuery={query}
onCreate={onCreate}
sceneStore={() => {
const clanURI = useClanURI({ force: true });
return store.sceneData?.[clanURI];
}}
setMachinePos={(machineId: string, pos: [number, number]) => {
console.log("calling setStore", machineId, pos);
setStore(
produce((s) => {
if (!s.sceneData) {
s.sceneData = {};
}
if (!s.sceneData[clanURI]) {
s.sceneData[clanURI] = {};
}
if (!s.sceneData[clanURI][machineId]) {
s.sceneData[clanURI][machineId] = { position: pos };
} else {
s.sceneData[clanURI][machineId].position = pos;
}
}),
);
}}
/>
</>
);
}}
</SceneDataProvider>
);
};

View File

@@ -1,6 +1,6 @@
import type { RouteDefinition } from "@solidjs/router/dist/types";
import { Onboarding } from "@/src/routes/Onboarding/Onboarding";
import { Clans } from "@/src/routes/Clan/Clan";
import { Clan } from "@/src/routes/Clan/Clan";
export const Routes: RouteDefinition[] = [
{
@@ -9,7 +9,6 @@ export const Routes: RouteDefinition[] = [
},
{
path: "/clans",
component: Clans,
children: [
{
path: "/",
@@ -25,7 +24,7 @@ export const Routes: RouteDefinition[] = [
children: [
{
path: "/",
component: (props) => <h1>ClanID: {props.params.clanURI}</h1>,
component: Clan,
},
{
path: "/machines",