diff --git a/pkgs/clan-app/ui/src/components/Sidebar/Sidebar.stories.tsx b/pkgs/clan-app/ui/src/components/Sidebar/Sidebar.stories.tsx index daa870dba..039f27df0 100644 --- a/pkgs/clan-app/ui/src/components/Sidebar/Sidebar.stories.tsx +++ b/pkgs/clan-app/ui/src/components/Sidebar/Sidebar.stories.tsx @@ -11,6 +11,13 @@ import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"; import { addClanURI, resetStore } from "@/src/stores/clan"; import { SolidQueryDevtools } from "@tanstack/solid-query-devtools"; import { encodeBase64 } from "@/src/hooks/clan"; +import { ApiClientProvider } from "@/src/hooks/ApiClient"; +import { + ApiCall, + OperationArgs, + OperationNames, + OperationResponse, +} from "@/src/hooks/api"; const defaultClanURI = "/home/brian/clans/my-clan"; @@ -24,10 +31,16 @@ const queryData = { europa: { name: "Europa", machineClass: "nixos", + state: { + status: "online", + }, }, ganymede: { name: "Ganymede", machineClass: "nixos", + state: { + status: "out_of_sync", + }, }, }, }, @@ -40,10 +53,16 @@ const queryData = { callisto: { name: "Callisto", machineClass: "nixos", + state: { + status: "not_installed", + }, }, amalthea: { name: "Amalthea", machineClass: "nixos", + state: { + status: "offline", + }, }, }, }, @@ -56,10 +75,16 @@ const queryData = { thebe: { name: "Thebe", machineClass: "nixos", + state: { + status: "online", + }, }, sponde: { name: "Sponde", machineClass: "nixos", + state: { + status: "online", + }, }, }, }, @@ -123,6 +148,18 @@ export default meta; type Story = StoryObj; +const mockFetcher = ( + method: K, + args: OperationArgs, +) => + ({ + uuid: "mock", + result: Promise.reject>("not implemented"), + cancel: async () => { + throw new Error("not implemented"); + }, + }) satisfies ApiCall; + export const Default: Story = { args: {}, decorators: [ @@ -141,16 +178,28 @@ export const Default: Story = { ["clans", encodeBase64(clanURI), "details"], clan.details, ); + + const machines = clan.machines || {}; + queryClient.setQueryData( ["clans", encodeBase64(clanURI), "machines"], - clan.machines || {}, + machines, ); + + Object.entries(machines).forEach(([name, machine]) => { + queryClient.setQueryData( + ["clans", encodeBase64(clanURI), "machine", name, "state"], + machine.state, + ); + }); }); return ( - - - + + + + + ); }, ], diff --git a/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.css b/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.css index c1fcb541f..43ffd4e6e 100644 --- a/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.css +++ b/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.css @@ -58,6 +58,7 @@ div.sidebar-header { @apply px-1; .dropdown-group-label { + @apply flex items-baseline justify-between w-full; } .dropdown-group-items { diff --git a/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.tsx b/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.tsx index 968617a2c..3e26c0a2a 100644 --- a/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.tsx +++ b/pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.tsx @@ -5,8 +5,13 @@ import { useNavigate } from "@solidjs/router"; import { Typography } from "../Typography/Typography"; import { createSignal, For, Suspense } from "solid-js"; import { useClanListQuery } from "@/src/hooks/queries"; -import { navigateToClan, useClanURI } from "@/src/hooks/clan"; -import { clanURIs } from "@/src/stores/clan"; +import { + navigateToClan, + navigateToOnboarding, + useClanURI, +} from "@/src/hooks/clan"; +import { clanURIs, setActiveClanURI } from "@/src/stores/clan"; +import { Button } from "../Button/Button"; export const SidebarHeader = () => { const navigate = useNavigate(); @@ -71,9 +76,19 @@ export const SidebarHeader = () => { family="mono" size="xs" color="tertiary" + transform="uppercase" > - YOUR CLANS + Your Clans +