feat(ui): lazy load routes
This commit is contained in:
@@ -18,7 +18,7 @@ interface APITesterForm extends FieldValues {
|
|||||||
payload: string;
|
payload: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ApiTester = () => {
|
const ApiTester = () => {
|
||||||
const [persistedTestData, setPersistedTestData] = makePersisted(
|
const [persistedTestData, setPersistedTestData] = makePersisted(
|
||||||
createSignal<APITesterForm>(),
|
createSignal<APITesterForm>(),
|
||||||
{
|
{
|
||||||
@@ -103,3 +103,5 @@ export const ApiTester = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ApiTester;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ type CreateForm = Meta & {
|
|||||||
template: string;
|
template: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CreateClan = () => {
|
const CreateClan = () => {
|
||||||
const [formStore, { Form, Field }] = createForm<CreateForm>({
|
const [formStore, { Form, Field }] = createForm<CreateForm>({
|
||||||
initialValues: {
|
initialValues: {
|
||||||
name: "",
|
name: "",
|
||||||
@@ -205,3 +205,5 @@ type Meta = Extract<
|
|||||||
OperationResponse<"show_clan_meta">,
|
OperationResponse<"show_clan_meta">,
|
||||||
{ status: "success" }
|
{ status: "success" }
|
||||||
>["data"];
|
>["data"];
|
||||||
|
|
||||||
|
export default CreateClan;
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ const EditClanForm = (props: EditClanFormProps) => {
|
|||||||
|
|
||||||
type GeneralData = SuccessQuery<"show_clan_meta">["data"];
|
type GeneralData = SuccessQuery<"show_clan_meta">["data"];
|
||||||
|
|
||||||
export const ClanDetails = () => {
|
const ClanDetails = () => {
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const clan_dir = window.atob(params.id);
|
const clan_dir = window.atob(params.id);
|
||||||
// Fetch general meta data
|
// Fetch general meta data
|
||||||
@@ -158,3 +158,5 @@ export const ClanDetails = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ClanDetails;
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
export * from "./list";
|
|
||||||
export * from "./create";
|
|
||||||
export * from "./details";
|
|
||||||
@@ -124,7 +124,7 @@ const ClanItem = (props: ClanItemProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ClanList = () => {
|
const ClanList = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
return (
|
return (
|
||||||
<div class="">
|
<div class="">
|
||||||
@@ -158,3 +158,5 @@ export const ClanList = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ClanList;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const disabled = [false, true];
|
|||||||
const readOnly = [false, true];
|
const readOnly = [false, true];
|
||||||
const error = [false, true];
|
const error = [false, true];
|
||||||
|
|
||||||
export const Components = () => {
|
const Components = () => {
|
||||||
const [formStore, { Form, Field }] = createForm<{ ef: string }>({});
|
const [formStore, { Form, Field }] = createForm<{ ef: string }>({});
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -116,3 +116,5 @@ export const Components = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Components;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { callApi } from "@/src/api";
|
|||||||
import { useQuery } from "@tanstack/solid-query";
|
import { useQuery } from "@tanstack/solid-query";
|
||||||
import { useClanContext } from "@/src/contexts/clan";
|
import { useClanContext } from "@/src/contexts/clan";
|
||||||
|
|
||||||
export function DiskView() {
|
const DiskView = () => {
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
|
|
||||||
const query = useQuery(() => ({
|
const query = useQuery(() => ({
|
||||||
@@ -28,4 +28,6 @@ export function DiskView() {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export default DiskView;
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export interface FlashFormValues extends FieldValues {
|
|||||||
sshKeys: File[]; // This field will use CustomFileField
|
sshKeys: File[]; // This field will use CustomFileField
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Flash = () => {
|
const Flash = () => {
|
||||||
const [formStore, { Form, Field }] = createForm<FlashFormValues>({
|
const [formStore, { Form, Field }] = createForm<FlashFormValues>({
|
||||||
initialValues: {
|
initialValues: {
|
||||||
machine: {
|
machine: {
|
||||||
@@ -436,3 +436,5 @@ export const Flash = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Flash;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ type ServiceModel = Extract<
|
|||||||
{ status: "success" }
|
{ status: "success" }
|
||||||
>["data"]["services"];
|
>["data"]["services"];
|
||||||
|
|
||||||
export const HostList: Component = () => {
|
const HostList: Component = () => {
|
||||||
const [services, setServices] = createSignal<ServiceModel>();
|
const [services, setServices] = createSignal<ServiceModel>();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -74,3 +74,5 @@ export const HostList: Component = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default HostList;
|
||||||
@@ -1,21 +1,6 @@
|
|||||||
import { Navigate, RouteDefinition } from "@solidjs/router";
|
import { Navigate, RouteDefinition } from "@solidjs/router";
|
||||||
import {
|
|
||||||
CreateMachine,
|
|
||||||
MachineDetails,
|
|
||||||
MachineListView,
|
|
||||||
} from "@/src/routes/machines";
|
|
||||||
import { VarsPage } from "@/src/routes/machines/install/vars-step";
|
|
||||||
import { ClanDetails, ClanList, CreateClan } from "@/src/routes/clans";
|
|
||||||
import { ModuleList } from "@/src/routes/modules/list";
|
|
||||||
import { ModuleDetails } from "@/src/routes/modules/details";
|
|
||||||
import { ModuleDetails as AddModule } from "@/src/routes/modules/add";
|
|
||||||
import { Flash } from "@/src/routes/flash/view";
|
|
||||||
import { Welcome } from "@/src/routes/welcome";
|
|
||||||
import { HostList } from "@/src/routes/hosts/view";
|
|
||||||
import { ThreePlayground } from "@/src/three";
|
|
||||||
import { ApiTester } from "@/src/api_test";
|
|
||||||
import { Components } from "@/src/routes/components";
|
|
||||||
import { IconVariant } from "@/src/components/icon";
|
import { IconVariant } from "@/src/components/icon";
|
||||||
|
import { lazy } from "solid-js";
|
||||||
|
|
||||||
export type AppRoute = Omit<RouteDefinition, "children"> & {
|
export type AppRoute = Omit<RouteDefinition, "children"> & {
|
||||||
label: string;
|
label: string;
|
||||||
@@ -24,6 +9,8 @@ export type AppRoute = Omit<RouteDefinition, "children"> & {
|
|||||||
hidden?: boolean;
|
hidden?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const lazyLoad = (path: string) => lazy(() => import(path));
|
||||||
|
|
||||||
const routes: AppRoute[] = [
|
const routes: AppRoute[] = [
|
||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
@@ -39,24 +26,24 @@ const routes: AppRoute[] = [
|
|||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
label: "Overview",
|
label: "Overview",
|
||||||
component: () => <MachineListView />,
|
component: lazyLoad("./machines/list"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/create",
|
path: "/create",
|
||||||
label: "Create",
|
label: "Create",
|
||||||
component: () => <CreateMachine />,
|
component: lazyLoad("./machines/create"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/:id",
|
path: "/:id",
|
||||||
label: "Details",
|
label: "Details",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <MachineDetails />,
|
component: lazyLoad("./machines/details"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/:id/vars",
|
path: "/:id/vars",
|
||||||
label: "Vars",
|
label: "Vars",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <VarsPage />,
|
component: lazyLoad("./machines/install/vars-step"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -69,18 +56,18 @@ const routes: AppRoute[] = [
|
|||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
label: "Overview",
|
label: "Overview",
|
||||||
component: () => <ClanList />,
|
component: lazyLoad("./clans/list"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/create",
|
path: "/create",
|
||||||
label: "Create",
|
label: "Create",
|
||||||
component: () => <CreateClan />,
|
component: lazyLoad("./clans/create"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/:id",
|
path: "/:id",
|
||||||
label: "Details",
|
label: "Details",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <ClanDetails />,
|
component: lazyLoad("./clans/details"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -92,19 +79,19 @@ const routes: AppRoute[] = [
|
|||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
label: "App Store",
|
label: "App Store",
|
||||||
component: () => <ModuleList />,
|
component: lazyLoad("./modules/list"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "details/:id",
|
path: "details/:id",
|
||||||
label: "Details",
|
label: "Details",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <ModuleDetails />,
|
component: lazyLoad("./modules/details"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/add/:id",
|
path: "/add/:id",
|
||||||
label: "Details",
|
label: "Details",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <AddModule />,
|
component: lazyLoad("./modules/add"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -116,7 +103,7 @@ const routes: AppRoute[] = [
|
|||||||
{
|
{
|
||||||
path: "/flash",
|
path: "/flash",
|
||||||
label: "Flash Installer",
|
label: "Flash Installer",
|
||||||
component: () => <Flash />,
|
component: lazyLoad("./flash/view"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -124,7 +111,7 @@ const routes: AppRoute[] = [
|
|||||||
path: "/welcome",
|
path: "/welcome",
|
||||||
label: "",
|
label: "",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => <Welcome />,
|
component: lazyLoad("./welcome"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/internal-dev",
|
path: "/internal-dev",
|
||||||
@@ -133,24 +120,24 @@ const routes: AppRoute[] = [
|
|||||||
{
|
{
|
||||||
path: "/hosts",
|
path: "/hosts",
|
||||||
label: "Local Hosts",
|
label: "Local Hosts",
|
||||||
component: () => <HostList />,
|
component: lazyLoad("./hosts/list"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/3d",
|
path: "/3d",
|
||||||
label: "3D-Playground",
|
label: "3D-Playground",
|
||||||
component: () => <ThreePlayground />,
|
component: lazyLoad("../three"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/api_testing",
|
path: "/api_testing",
|
||||||
label: "api_testing",
|
label: "api_testing",
|
||||||
hidden: false,
|
hidden: false,
|
||||||
component: () => <ApiTester />,
|
component: lazyLoad("../api_test"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/components",
|
path: "/components",
|
||||||
label: "Components",
|
label: "Components",
|
||||||
hidden: false,
|
hidden: false,
|
||||||
component: () => <Components />,
|
component: lazyLoad("./components"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { useClanContext } from "@/src/contexts/clan";
|
|||||||
|
|
||||||
type CreateMachineForm = OperationArgs<"create_machine">;
|
type CreateMachineForm = OperationArgs<"create_machine">;
|
||||||
|
|
||||||
export function CreateMachine() {
|
const CreateMachine = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
|
|
||||||
@@ -189,4 +189,6 @@ export function CreateMachine() {
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export default CreateMachine;
|
||||||
|
|||||||
@@ -699,7 +699,7 @@ const MachineForm = (props: MachineDetailsProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const MachineDetails = () => {
|
const MachineDetails = () => {
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
|
|
||||||
@@ -735,3 +735,5 @@ export const MachineDetails = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default MachineDetails;
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
export * from "./details";
|
|
||||||
export * from "./create";
|
|
||||||
export * from "./list";
|
|
||||||
@@ -203,7 +203,7 @@ export const VarsStep = (props: VarsStepProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const VarsPage = () => {
|
const VarsPage = () => {
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
@@ -249,3 +249,5 @@ export const VarsPage = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default VarsPage;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export interface Filter {
|
|||||||
tags: string[];
|
tags: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MachineListView: Component = () => {
|
const MachineListView: Component = () => {
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
const [filter, setFilter] = createSignal<Filter>({ tags: [] });
|
const [filter, setFilter] = createSignal<Filter>({ tags: [] });
|
||||||
@@ -213,3 +213,5 @@ export const MachineListView: Component = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default MachineListView;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { createForm, FieldValues, SubmitHandler } from "@modular-forms/solid";
|
|||||||
import { SelectInput } from "@/src/Form/fields/Select";
|
import { SelectInput } from "@/src/Form/fields/Select";
|
||||||
import { useClanContext } from "@/src/contexts/clan";
|
import { useClanContext } from "@/src/contexts/clan";
|
||||||
|
|
||||||
export const ModuleDetails = () => {
|
const ModuleDetails = () => {
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
const modulesQuery = createModulesQuery(activeClanURI());
|
const modulesQuery = createModulesQuery(activeClanURI());
|
||||||
@@ -27,6 +27,8 @@ export const ModuleDetails = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ModuleDetails;
|
||||||
|
|
||||||
interface AddModuleProps {
|
interface AddModuleProps {
|
||||||
data: ModuleInfo;
|
data: ModuleInfo;
|
||||||
id: string;
|
id: string;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import Icon from "@/src/components/icon";
|
|||||||
import { useClanContext } from "@/src/contexts/clan";
|
import { useClanContext } from "@/src/contexts/clan";
|
||||||
import { activeClanURI } from "@/src/stores/clan";
|
import { activeClanURI } from "@/src/stores/clan";
|
||||||
|
|
||||||
export const ModuleDetails = () => {
|
const ModuleDetails = () => {
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
const modulesQuery = createModulesQuery(activeClanURI());
|
const modulesQuery = createModulesQuery(activeClanURI());
|
||||||
@@ -32,6 +32,8 @@ export const ModuleDetails = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ModuleDetails;
|
||||||
|
|
||||||
function deepMerge(
|
function deepMerge(
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
obj1: Record<string, any>,
|
obj1: Record<string, any>,
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ const ModuleItem = (props: {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ModuleList = () => {
|
const ModuleList = () => {
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
const { activeClanURI } = useClanContext();
|
const { activeClanURI } = useClanContext();
|
||||||
const modulesQuery = createModulesQuery(activeClanURI(), {
|
const modulesQuery = createModulesQuery(activeClanURI(), {
|
||||||
@@ -214,3 +214,5 @@ export const ModuleList = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ModuleList;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { registerClan } from "@/src/hooks";
|
|||||||
import { useNavigate } from "@solidjs/router";
|
import { useNavigate } from "@solidjs/router";
|
||||||
import { useClanContext } from "@/src/contexts/clan";
|
import { useClanContext } from "@/src/contexts/clan";
|
||||||
|
|
||||||
export const Welcome = () => {
|
const Welcome = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { setActiveClanURI } = useClanContext();
|
const { setActiveClanURI } = useClanContext();
|
||||||
return (
|
return (
|
||||||
@@ -35,3 +35,5 @@ export const Welcome = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Welcome;
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ const View = (props: ViewProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ThreePlayground = () => {
|
const ThreePlayground = () => {
|
||||||
const [count, setCount] = createSignal(1);
|
const [count, setCount] = createSignal(1);
|
||||||
const [selected, setSelected] = createSignal<string>("");
|
const [selected, setSelected] = createSignal<string>("");
|
||||||
|
|
||||||
@@ -269,3 +269,5 @@ export const ThreePlayground = () => {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ThreePlayground;
|
||||||
|
|||||||
Reference in New Issue
Block a user