Merge pull request 'UI: add open clan button' (#1590) from hsjobeki/clan-core:hsjobeki-main into main

This commit is contained in:
clan-bot 2024-06-08 13:28:18 +00:00
commit 6e99beb335
6 changed files with 49 additions and 17 deletions

View File

@ -1,6 +1,6 @@
import { JSONSchemaFaker } from "json-schema-faker"; import { JSONSchemaFaker } from "json-schema-faker";
import { schema } from "./api/index"; import { schema } from "./api/index";
import { OperationNames } from "./src/message"; import { OperationNames } from "./src/api";
const faker = JSONSchemaFaker; const faker = JSONSchemaFaker;

View File

@ -1,5 +1,5 @@
import { createSignal, type Component } from "solid-js"; import { createSignal, type Component } from "solid-js";
import { CountProvider } from "./Config"; import { MachineProvider } from "./Config";
import { Layout } from "./layout/layout"; import { Layout } from "./layout/layout";
import { Route, Router } from "./Routes"; import { Route, Router } from "./Routes";
@ -10,11 +10,11 @@ export { route, setRoute };
const App: Component = () => { const App: Component = () => {
return ( return (
<CountProvider> <MachineProvider>
<Layout> <Layout>
<Router route={route} /> <Router route={route} />
</Layout> </Layout>
</CountProvider> </MachineProvider>
); );
}; };

View File

@ -5,9 +5,9 @@ import {
JSXElement, JSXElement,
createEffect, createEffect,
} from "solid-js"; } from "solid-js";
import { OperationResponse, pyApi } from "./message"; import { OperationResponse, pyApi } from "./api";
export const makeCountContext = () => { export const makeMachineContext = () => {
const [machines, setMachines] = const [machines, setMachines] =
createSignal<OperationResponse<"list_machines">>(); createSignal<OperationResponse<"list_machines">>();
const [loading, setLoading] = createSignal(false); const [loading, setLoading] = createSignal(false);
@ -18,7 +18,7 @@ export const makeCountContext = () => {
}); });
createEffect(() => { createEffect(() => {
console.log("The count is now", machines()); console.log("The state is now", machines());
}); });
return [ return [
@ -33,9 +33,9 @@ export const makeCountContext = () => {
] as const; ] as const;
// `as const` forces tuple type inference // `as const` forces tuple type inference
}; };
type CountContextType = ReturnType<typeof makeCountContext>; type MachineContextType = ReturnType<typeof makeMachineContext>;
export const CountContext = createContext<CountContextType>([ export const MachineContext = createContext<MachineContextType>([
{ {
loading: () => false, loading: () => false,
@ -48,12 +48,12 @@ export const CountContext = createContext<CountContextType>([
}, },
]); ]);
export const useCountContext = () => useContext(CountContext); export const useMachineContext = () => useContext(MachineContext);
export function CountProvider(props: { children: JSXElement }) { export function MachineProvider(props: { children: JSXElement }) {
return ( return (
<CountContext.Provider value={makeCountContext()}> <MachineContext.Provider value={makeMachineContext()}>
{props.children} {props.children}
</CountContext.Provider> </MachineContext.Provider>
); );
} }

View File

@ -7,6 +7,11 @@ export type OperationNames = keyof API;
export type OperationArgs<T extends OperationNames> = API[T]["arguments"]; export type OperationArgs<T extends OperationNames> = API[T]["arguments"];
export type OperationResponse<T extends OperationNames> = API[T]["return"]; export type OperationResponse<T extends OperationNames> = API[T]["return"];
export type SuccessData<T extends OperationNames> = Extract<
OperationResponse<T>,
{ status: "success" }
>;
declare global { declare global {
interface Window { interface Window {
clan: { clan: {

View File

@ -6,11 +6,28 @@ import {
createSignal, createSignal,
type Component, type Component,
} from "solid-js"; } from "solid-js";
import { useCountContext } from "../../Config"; import { useMachineContext } from "../../Config";
import { route } from "@/src/App"; import { route } from "@/src/App";
import { OperationResponse, pyApi } from "@/src/api";
type FilesModel = Extract<
OperationResponse<"get_directory">,
{ status: "success" }
>["data"]["files"];
export const MachineListView: Component = () => { export const MachineListView: Component = () => {
const [{ machines, loading }, { getMachines }] = useCountContext(); const [{ machines, loading }, { getMachines }] = useMachineContext();
const [files, setFiles] = createSignal<FilesModel>([]);
pyApi.get_directory.receive((r) => {
const { status } = r;
if (status === "error") return console.error(r.errors);
setFiles(r.data.files);
});
createEffect(() => {
console.log(files());
});
const [data, setData] = createSignal<string[]>([]); const [data, setData] = createSignal<string[]>([]);
createEffect(() => { createEffect(() => {
@ -27,7 +44,17 @@ export const MachineListView: Component = () => {
return ( return (
<div class="max-w-screen-lg"> <div class="max-w-screen-lg">
<div class="tooltip" data-tip="Refresh "> <div class="tooltip" data-tip="Open Clan">
<button
class="btn btn-ghost"
onClick={() =>
pyApi.get_directory.dispatch({ current_path: "/home/" })
}
>
<span class="material-icons ">folder_open</span>
</button>
</div>
<div class="tooltip" data-tip="Refresh">
<button class="btn btn-ghost" onClick={() => getMachines()}> <button class="btn btn-ghost" onClick={() => getMachines()}>
<span class="material-icons ">refresh</span> <span class="material-icons ">refresh</span>
</button> </button>

View File

@ -1,6 +1,6 @@
import { describe, it, expectTypeOf } from "vitest"; import { describe, it, expectTypeOf } from "vitest";
import { OperationNames, pyApi } from "@/src/message"; import { OperationNames, pyApi } from "@/src/api";
describe.concurrent("API types work properly", () => { describe.concurrent("API types work properly", () => {
// Test some basic types // Test some basic types