From 7f281cd82bf6d50786b0fc60034828c1dafd1046 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 7 Mar 2024 05:33:00 +0700 Subject: [PATCH] chain entity --- src/entities/chain/api/list.ts | 14 ++++++++++++++ src/entities/chain/index.ts | 0 src/entities/chain/lib.ts | 13 +++++++++++++ src/entities/chain/model.ts | 11 +++++++++++ src/entities/chain/schema.ts | 11 +++++++++++ 5 files changed, 49 insertions(+) create mode 100644 src/entities/chain/api/list.ts create mode 100644 src/entities/chain/index.ts create mode 100644 src/entities/chain/lib.ts create mode 100644 src/entities/chain/model.ts create mode 100644 src/entities/chain/schema.ts diff --git a/src/entities/chain/api/list.ts b/src/entities/chain/api/list.ts new file mode 100644 index 0000000..24ee1f2 --- /dev/null +++ b/src/entities/chain/api/list.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; +import { chainSchema } from "../schema"; +import { getAxios } from "@/shared/lib/getAxios"; + +export async function getChainList() { + const axios = await getAxios(); + + try { + const response = await axios.get("/chain/list"); + return z.array(chainSchema).parse(response.data); + } catch { + return null; + } +} diff --git a/src/entities/chain/index.ts b/src/entities/chain/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/entities/chain/lib.ts b/src/entities/chain/lib.ts new file mode 100644 index 0000000..5e15751 --- /dev/null +++ b/src/entities/chain/lib.ts @@ -0,0 +1,13 @@ +import { useChainState } from "./model"; +import { getChainList } from "./api/list"; +import { redirect } from "@tanstack/react-router"; + +export async function requireChains() { + const chainState = useChainState.getState(); + if (chainState.chains) return; + + const chains = await getChainList(); + if (chains === null) throw redirect({ to: "/" }); + + chainState.setChains(chains); +} diff --git a/src/entities/chain/model.ts b/src/entities/chain/model.ts new file mode 100644 index 0000000..fc33b5e --- /dev/null +++ b/src/entities/chain/model.ts @@ -0,0 +1,11 @@ +import { create } from "zustand"; +import type { Chain } from "./schema"; + +interface ChainState { + chains?: Chain[]; + setChains: (chains: Chain[]) => void; +} + +export const useChainState = create((set) => ({ + setChains: (chains) => set({ chains }), +})); diff --git a/src/entities/chain/schema.ts b/src/entities/chain/schema.ts new file mode 100644 index 0000000..1f10915 --- /dev/null +++ b/src/entities/chain/schema.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; +import { actionSchema } from "../action/schema"; + +export const chainSchema = z.object({ + _id: z.string().uuid(), + name: z.string().nullable(), + actions: z.array(actionSchema), + lastModified: z.string(), +}); + +export type Chain = z.infer;