From ea7de13d2807361547a5eb9d5ab776ee15645a76 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 30 Apr 2025 16:31:18 +0800 Subject: [PATCH] Admin Dashboard Bagian Data Kesehatan --- bun.lockb | Bin 308027 -> 308636 bytes package.json | 2 +- prisma/schema.prisma | 327 +++++++++--------- .../data_kesehatan_warga/grafikKepuasan.ts | 76 ++++ .../persentaseKelahiran.ts | 84 +++++ .../_ui/grafik_hasil_kepuasan/page.tsx | 68 +++- .../_ui/jadwal_kegiatan/page.tsx | 8 +- .../_ui/jadwal_kegiatan/pendaftaran/page.tsx | 26 +- .../page.tsx | 103 +++++- .../kesehatan/data-kesehatan-warga/page.tsx | 4 +- .../grafik_kepuasan/create.ts | 27 ++ .../grafik_kepuasan/find-many.ts | 8 + .../grafik_kepuasan/index.ts | 16 + .../persentase_kelahiran_kematian/create.ts | 32 ++ .../find-many.ts | 9 + .../persentase_kelahiran_kematian/index.ts | 19 + .../api/[[...slugs]]/_lib/kesehatan/index.ts | 5 + src/app/percobaan/_lib/ClientRouter.txt | 300 ++++++++++++++++ src/app/percobaan/_router/router.txt | 20 ++ src/app/percobaan/dashboard/berita/page.txt | 11 + src/app/percobaan/dashboard/page.txt | 33 ++ src/app/percobaan/page2.txt | 18 + 22 files changed, 1007 insertions(+), 189 deletions(-) create mode 100644 src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan.ts create mode 100644 src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/create.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/find-many.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/create.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/find-many.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/index.ts create mode 100644 src/app/percobaan/_lib/ClientRouter.txt create mode 100644 src/app/percobaan/_router/router.txt create mode 100644 src/app/percobaan/dashboard/berita/page.txt create mode 100644 src/app/percobaan/dashboard/page.txt create mode 100644 src/app/percobaan/page2.txt diff --git a/bun.lockb b/bun.lockb index c65dcabb335a32e47eaada7d039d4290ac9aee6c..0618a3a7fa17aac9f249b03c9a8d55f31e9221a1 100755 GIT binary patch delta 37605 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 + +const defaultForm: GrafikKepuasan = { + label: "", + jumlah: "" +}; + +const grafikkepuasan = proxy({ + create: { + form: defaultForm, + loading: false, + async create() { + const cek = templateGrafikKepuasan.safeParse(grafikkepuasan.create.form); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + grafikkepuasan.create.loading = true; + const res = await ApiFetch.api.kesehatan.grafikkepuasan["create"].post( + grafikkepuasan.create.form + ); + if (res.status === 200) { + grafikkepuasan.create.form = { + label: "", + jumlah: "" + }; + grafikkepuasan.findMany.load(); + return toast.success("success create"); + } + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + grafikkepuasan.create.loading = false; + } + }, + }, + findMany: { + data: null as + | Prisma.GrafikKepuasanGetPayload<{ omit: { isActive: true } }>[] + | null, + async load() { + const res = await ApiFetch.api.kesehatan.grafikkepuasan[ + "find-many" + ].get(); + if (res.status === 200) { + grafikkepuasan.findMany.data = res.data?.data ?? []; + } + }, + }, +}); + +const stategrafikKepuasan = proxy({ + grafikkepuasan, +}); + +export default stategrafikKepuasan; diff --git a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts new file mode 100644 index 00000000..3521775c --- /dev/null +++ b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts @@ -0,0 +1,84 @@ +import ApiFetch from "@/lib/api-fetch"; +import { Prisma } from "@prisma/client"; +import { toast } from "react-toastify"; +import { proxy } from "valtio"; +import { z } from "zod"; + +const templatePersentase = z.object({ + tahun: z.string().min(4, "Tahun harus diisi"), + kematianKasar: z.string().min(2, "Kematian kasar harus diisi"), + kelahiranKasar: z.string().min(2, "Kelahiran kasar harus diisi"), + kematianBayi: z.string().min(2, "Kematian bayi harus diisi"), +}); + +type Persentase = Prisma.DataKematian_KelahiranGetPayload<{ + select: { + tahun: true; + kematianKasar: true; + kelahiranKasar: true; + kematianBayi: true; + }; +}>; + +const defaultForm: Persentase = { + tahun: "", + kematianKasar: "", + kelahiranKasar: "", + kematianBayi: "", +}; + +const persentasekelahiran = proxy({ + create: { + form: defaultForm, + loading: false, + async create() { + const cek = templatePersentase.safeParse(persentasekelahiran.create.form); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + persentasekelahiran.create.loading = true; + const res = await ApiFetch.api.kesehatan.persentasekelahiran[ + "create" + ].post(persentasekelahiran.create.form); + if (res.status === 200) { + persentasekelahiran.create.form = { + tahun: "", + kematianKasar: "", + kelahiranKasar: "", + kematianBayi: "", + }; + persentasekelahiran.findMany.load(); + return toast.success("success create"); + } + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + persentasekelahiran.create.loading = false; + } + }, + }, + findMany: { + data: null as + | Prisma.DataKematian_KelahiranGetPayload<{ omit: { isActive: true } }>[] + | null, + async load() { + const res = await ApiFetch.api.kesehatan.persentasekelahiran[ + "find-many" + ].get(); + if (res.status === 200) { + persentasekelahiran.findMany.data = res.data?.data ?? []; + } + }, + }, +}); + +const statePersentase = proxy({ + persentasekelahiran, +}); + +export default statePersentase; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/grafik_hasil_kepuasan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/grafik_hasil_kepuasan/page.tsx index f1da5b60..d9aefcf6 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/grafik_hasil_kepuasan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/grafik_hasil_kepuasan/page.tsx @@ -1,10 +1,72 @@ -import { Stack, Title } from '@mantine/core'; -import React from 'react'; +'use client' +import stategrafikKepuasan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan'; +import colors from '@/con/colors'; +import { Box, Button, Group, Stack, TextInput, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { useState } from 'react'; +import { Bar, Legend, RadialBarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; +import { useProxy } from 'valtio/utils'; function GrafikHasilKepuasan() { + const grafikkepuasan = useProxy(stategrafikKepuasan.grafikkepuasan) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const [chartData, setChartData] = useState([]) + useShallowEffect(() => { + const fetchData = async () => { + await grafikkepuasan.findMany.load(); + if (grafikkepuasan.findMany.data && grafikkepuasan.findMany.data.length > 0) { + setChartData(grafikkepuasan.findMany.data); + } + }; + fetchData(); + }, []); return ( - + Grafik Hasil Kepuasan + + { + grafikkepuasan.create.form.label = val.currentTarget.value + }} + /> + { + grafikkepuasan.create.form.jumlah = val.currentTarget.value + }} + /> + + + + + + Data Kelahiran & Kematian + + + + + + + + + + ); } diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/page.tsx index d3006d90..a38ea92f 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/page.tsx @@ -61,7 +61,7 @@ function JadwalKegiatan() { - @@ -84,13 +84,15 @@ function AllList() { allList.layanantersedia.findMany.load() allList.syaratketentuan.findMany.load() allList.dokumenjadwalkegiatan.findMany.load() - }) + allList.pendaftaranjadwal.findMany.load() + }, []) const isLoading = !allList.informasiKegiatan.findMany.data || !allList.deskripsiKegiatan.findMany.data || !allList.layanantersedia.findMany.data || !allList.syaratketentuan.findMany.data || - !allList.dokumenjadwalkegiatan.findMany.data + !allList.dokumenjadwalkegiatan.findMany.data || + !allList.pendaftaranjadwal.findMany.data if (isLoading) { return ( diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/pendaftaran/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/pendaftaran/page.tsx index 8541a65a..f59af324 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/pendaftaran/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/_ui/jadwal_kegiatan/pendaftaran/page.tsx @@ -1,21 +1,10 @@ 'use client' import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan'; -import { ActionIcon, Box, Text, Textarea, TextInput } from '@mantine/core'; -import { DateInput } from '@mantine/dates'; -import { IconCalendar } from '@tabler/icons-react'; -import { useState } from 'react'; +import { Box, Text, Textarea, TextInput } from '@mantine/core'; import { useProxy } from 'valtio/utils'; function Pendaftaran() { const pendaftaran = useProxy(stateJadwalKegiatan.pendaftaranjadwal) - const [dateInputOpened, setDateInputOpened] = useState(false); - const pickerControl = ( - setDateInputOpened(true)} variant="subtle" color="gray"> - - - ); - - const formatDate = (date: Date | null): string => { if (!date) return ""; return date.toISOString().split('T')[0]; } return ( @@ -27,16 +16,11 @@ function Pendaftaran() { pendaftaran.create.form.name = val.target.value }} /> - { - pendaftaran.create.form.tanggal = formatDate(val); + pendaftaran.create.form.tanggal = val.target.value }} /> ([]); + const [mounted, setMounted] = useState(false); // untuk memastikan DOM sudah ready + + useEffect(() => { + setMounted(true); + }, []); + + useShallowEffect(() => { + const fetchData = async () => { + await persentase.findMany.load(); + if (persentase.findMany.data && persentase.findMany.data.length > 0) { + setChartData(persentase.findMany.data); + } + }; + fetchData(); + }, []); + return ( - Persentase Data Kelahiran & Kematian + {/* Form Input */} + + Persentase Data Kelahiran & Kematian + { + persentase.create.form.tahun = val.currentTarget.value; + }} + /> + { + persentase.create.form.kematianKasar = val.currentTarget.value; + }} + /> + { + persentase.create.form.kematianBayi = val.currentTarget.value; + }} + /> + { + persentase.create.form.kelahiranKasar = val.currentTarget.value; + }} + /> + + + + {/* Chart */} + + Data Kelahiran & Kematian + {mounted && chartData.length > 0 && ( + + + + + + + + + + + + )} + ); } diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/page.tsx index e8924f81..14e45529 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/page.tsx @@ -1,10 +1,10 @@ +import colors from '@/con/colors'; import { Stack, Tabs, TabsList, TabsPanel, TabsTab } from '@mantine/core'; import ArtikelKesehatan from './_ui/artikel_kesehatan/page'; import FasilitasKesehatan from './_ui/fasilitas_kesehatan/page'; +import GrafikHasilKepuasan from './_ui/grafik_hasil_kepuasan/page'; import JadwalKegiatan from './_ui/jadwal_kegiatan/page'; import PersentaseDataKelahiranKematian from './_ui/persentase_data_kelahiran_kematian/page'; -import GrafikHasilKepuasan from './_ui/grafik_hasil_kepuasan/page'; -import colors from '@/con/colors'; function Page() { diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/create.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/create.ts new file mode 100644 index 00000000..cb7e6f8b --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/create.ts @@ -0,0 +1,27 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.GrafikKepuasanGetPayload<{ + select: { + label: true; + jumlah: true + }; +}>; +export default async function grafikKepuasanCreate(context: Context) { + const body = context.body as FormCreate; + + await prisma.grafikKepuasan.create({ + data: { + label: body.label, + jumlah: body.jumlah, + }, + }); + return { + success: true, + message: "Success create grafik kepuasan", + data: { + ...body, + }, + }; +} diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/find-many.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/find-many.ts new file mode 100644 index 00000000..f01bdab5 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/find-many.ts @@ -0,0 +1,8 @@ +import prisma from "@/lib/prisma" + +export default async function grafikKepuasanFindMany() { + const res = await prisma.grafikKepuasan.findMany() + return { + data: res + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/index.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/index.ts new file mode 100644 index 00000000..e533a509 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/grafik_kepuasan/index.ts @@ -0,0 +1,16 @@ +import Elysia, { t } from "elysia"; +import grafikKepuasanCreate from "./create"; +import grafikKepuasanFindMany from "./find-many"; + +const GrafikKepuasan = new Elysia({ + prefix: "/grafikkepuasan", + tags: ["Data Kesehatan/Grafik Kepuasan"] +}) + .get("/find-many", grafikKepuasanFindMany) + .post("/create", grafikKepuasanCreate, { + body: t.Object({ + label: t.String(), + jumlah: t.String(), + }), + }) +export default GrafikKepuasan \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/create.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/create.ts new file mode 100644 index 00000000..70942825 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/create.ts @@ -0,0 +1,32 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.DataKematian_KelahiranGetPayload<{ + select: { + tahun: true; + kematianKasar: true; + kematianBayi: true; + kelahiranKasar: true; + }; +}>; + +export default async function persentaseKelahiranKematianCreate(context: Context) { + const body = context.body as FormCreate + + await prisma.dataKematian_Kelahiran.create({ + data: { + tahun: body.tahun, + kematianKasar: body.kematianKasar, + kematianBayi: body.kematianBayi, + kelahiranKasar: body.kelahiranKasar, + } + }) + return{ + success: true, + message: "Success create persentase kelahiran kematian", + data: { + ...body + } + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/find-many.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/find-many.ts new file mode 100644 index 00000000..c3ed94ee --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/find-many.ts @@ -0,0 +1,9 @@ +import prisma from "@/lib/prisma"; + +export default async function persentaseKelahiranKematianFindMany() { + const res = await prisma.dataKematian_Kelahiran.findMany(); + return { + data: res + } +} + \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/index.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/index.ts new file mode 100644 index 00000000..7ecb2381 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/persentase_kelahiran_kematian/index.ts @@ -0,0 +1,19 @@ +import Elysia, { t } from "elysia"; +import persentaseKelahiranKematianCreate from "./create"; +import persentaseKelahiranKematianFindMany from "./find-many"; + +const PersentaseKelahiranKematian = new Elysia({ + prefix: "/persentasekelahiran", + tags: ["Data Kesehatan/Persentase Kelahiran Kematian"], +}) + .get("/find-many", persentaseKelahiranKematianFindMany) + .post("/create", persentaseKelahiranKematianCreate, { + body: t.Object({ + tahun: t.String(), + kematianKasar: t.String(), + kematianBayi: t.String(), + kelahiranKasar: t.String(), + }), + }) + +export default PersentaseKelahiranKematian; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/index.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/index.ts index 5a06c789..b064f356 100644 --- a/src/app/api/[[...slugs]]/_lib/kesehatan/index.ts +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/index.ts @@ -11,6 +11,9 @@ import LayananTersedia from "./data_kesehatan_warga/jadwal_kegiatan/layanan_yang import SyaratKetentuan from "./data_kesehatan_warga/jadwal_kegiatan/syarat_dan_ketentuan"; import DokumenDiperlukan from "./data_kesehatan_warga/jadwal_kegiatan/dokumen_yang_diperlukan"; import PendaftaranJadwal from "./data_kesehatan_warga/jadwal_kegiatan/pendaftaran"; +import PersentaseKelahiranKematian from "./data_kesehatan_warga/persentase_kelahiran_kematian"; +import GrafikKepuasan from "./data_kesehatan_warga/grafik_kepuasan"; + const Kesehatan = new Elysia({ prefix: "/api/kesehatan", @@ -28,4 +31,6 @@ const Kesehatan = new Elysia({ .use(SyaratKetentuan) .use(DokumenDiperlukan) .use(PendaftaranJadwal) +.use(PersentaseKelahiranKematian) +.use(GrafikKepuasan) export default Kesehatan; diff --git a/src/app/percobaan/_lib/ClientRouter.txt b/src/app/percobaan/_lib/ClientRouter.txt new file mode 100644 index 00000000..b666bba3 --- /dev/null +++ b/src/app/percobaan/_lib/ClientRouter.txt @@ -0,0 +1,300 @@ +"use client"; +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-empty-object-type */ +import { z } from "zod"; + +type RouterLeaf> = { + get: () => string; + query: (params: z.infer) => string; + parse: (searchParams: URLSearchParams) => z.infer; +}; + +// Helper type to convert dashes to camelCase +type DashToCamelCase = S extends `${infer F}-${infer R}` + ? `${F}${Capitalize>}` + : S; + +// Modified RouterPath to handle dash conversion +type RouterPath< + T extends z.ZodType = z.ZodObject<{}>, + Segments extends string[] = [] +> = Segments extends [infer Head extends string, ...infer Tail extends string[]] + ? { [K in DashToCamelCase]: RouterPath } + : RouterLeaf; + +type RemoveLeadingSlash = S extends `/${infer Rest}` + ? Rest + : S; + +type SplitPath = S extends `${infer Head}/${infer Tail}` + ? [Head, ...SplitPath] + : S extends "" + ? [] + : [S]; + +type WibuRouterOptions = { + prefix?: string; + name?: string; +}; + +export class V2ClientRouter { + private tree: any = {}; + private prefix: string = ""; + private name: string = ""; + private querySchemas: Map = new Map(); + + constructor(options?: WibuRouterOptions) { + if (options?.prefix) { + // Ensure prefix starts with / and doesn't end with / + this.prefix = options.prefix.startsWith("/") + ? options.prefix + : `/${options.prefix}`; + + if (this.prefix.endsWith("/")) { + this.prefix = this.prefix.slice(0, -1); + } + } + + if (options?.name) { + this.name = options.name; + } + } + + // Convert dash-case to camelCase + private toCamelCase(str: string): string { + return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); + } + + add< + Path extends string, + NormalizedPath extends string = RemoveLeadingSlash, + Segments extends string[] = SplitPath, + T extends z.ZodType = z.ZodObject<{}> + >( + path: Path, + schema?: { query: T } + ): V2ClientRouter< + Routes & + (NormalizedPath extends "" + ? RouterLeaf + : { + [K in Segments[0] as DashToCamelCase]: RouterPath< + T, + Segments extends [any, ...infer Rest] ? Rest : [] + >; + }) + > { + const normalizedPath = path.startsWith("/") ? path : `/${path}`; + const fullPath = `${this.prefix}${normalizedPath}`; + const segments = normalizedPath.split("/").filter(Boolean); + + // Store the Zod schema for this path + if (schema) { + this.querySchemas.set(fullPath, schema.query); + } else { + // Default empty schema + this.querySchemas.set(fullPath, z.object({})); + } + + const handleQuery = (params: any): string => { + if (!params || Object.keys(params).length === 0) return fullPath; + + // Validate params against schema + const schema = this.querySchemas.get(fullPath); + if (schema) { + try { + schema.parse(params); + } catch (error) { + console.error("Query params validation failed:", error); + throw new Error("Invalid query parameters"); + } + } + + const queryString = Object.entries(params) + .map( + ([key, value]) => + `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}` + ) + .join("&"); + return `${fullPath}?${queryString}`; + }; + + const handleGet = () => fullPath; + + const handleParse = (searchParams: URLSearchParams): any => { + const schema = this.querySchemas.get(fullPath); + if (!schema) return {}; + + // Convert URLSearchParams to object + const queryObject: Record = {}; + searchParams.forEach((value, key) => { + queryObject[key] = value; + }); + + // Parse through Zod schema + try { + return schema.parse(queryObject); + } catch (error) { + console.error("Failed to parse search params:", error); + // Return safe default values + const safeParsed = schema.safeParse(queryObject); + if (safeParsed.success) { + return safeParsed.data; + } + return {}; + } + }; + + // Special case for root path "/" + if (segments.length === 0) { + this.tree.get = handleGet; + this.tree.query = handleQuery; + this.tree.parse = handleParse; + } else { + let current = this.tree; + for (const segment of segments) { + // Use camelCase version for the property name + const camelSegment = this.toCamelCase(segment); + if (!current[camelSegment]) { + current[camelSegment] = {}; + } + current = current[camelSegment]; + } + + current.get = handleGet; + current.query = handleQuery; + current.parse = handleParse; + } + + return this as any; + } + + // Add a method to incorporate another router's routes into this one + use( + name: N, + childRouter: V2ClientRouter + ): V2ClientRouter, ChildRoutes>> { + const camelName = this.toCamelCase(name); + + if (!this.tree[camelName]) { + this.tree[camelName] = {}; + } + + // Copy query schemas from child router + childRouter.querySchemas.forEach((schema, path) => { + const newPath = `${this.prefix}/${name}${path.substring( + childRouter.prefix.length + )}`; + this.querySchemas.set(newPath, schema); + }); + + // Create a deep copy of the child router's tree with updated paths + const updatePaths = (obj: any, childPrefix: string): any => { + const result: any = {}; + + for (const key in obj) { + if (key === "get" && typeof obj[key] === "function") { + // Capture the original path from the child router + const originalPath = obj[key](); + // Create a new function that returns the combined path + result[key] = () => { + const newPath = `${this.prefix}/${name}${originalPath.substring( + childPrefix.length + )}`; + return newPath; + }; + } else if (key === "query" && typeof obj[key] === "function") { + // Capture the child router's prefix for path adjustment + result[key] = (params: any) => { + // Get the original result without query params + const originalPathWithoutParams = obj["get"](); + // Create the proper path with our parent prefix + const newBasePath = `${ + this.prefix + }/${name}${originalPathWithoutParams.substring( + childPrefix.length + )}`; + + // Add query params if any + if (!params || Object.keys(params).length === 0) return newBasePath; + + // Validate params against schema + const newPath = `${ + this.prefix + }/${name}${originalPathWithoutParams.substring( + childPrefix.length + )}`; + const schema = this.querySchemas.get(newPath); + + if (schema) { + try { + schema.parse(params); + } catch (error) { + console.error("Query params validation failed:", error); + throw new Error("Invalid query parameters"); + } + } + + const queryString = Object.entries(params) + .map( + ([k, v]) => + `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}` + ) + .join("&"); + return `${newBasePath}?${queryString}`; + }; + } else if (key === "parse" && typeof obj[key] === "function") { + result[key] = (searchParams: URLSearchParams) => { + const originalPath = obj["get"](); + const newPath = `${this.prefix}/${name}${originalPath.substring( + childPrefix.length + )}`; + const schema = this.querySchemas.get(newPath); + + if (!schema) return {}; + + // Convert URLSearchParams to object + const queryObject: Record = {}; + searchParams.forEach((value, key) => { + queryObject[key] = value; + }); + + // Parse through Zod schema + try { + return schema.parse(queryObject); + } catch (error) { + console.error("Failed to parse search params:", error); + // Return safe default values + const safeParsed = schema.safeParse(queryObject); + if (safeParsed.success) { + return safeParsed.data; + } + return {}; + } + }; + } else if (typeof obj[key] === "object" && obj[key] !== null) { + result[key] = updatePaths(obj[key], childPrefix); + } else { + result[key] = obj[key]; + } + } + + return result; + }; + + // Copy the child router's tree into this router + this.tree[camelName] = updatePaths( + (childRouter as any).tree, + childRouter.prefix + ); + + return this as any; + } + + // Allow access to the tree with strong typing + get routes(): Routes { + return this.tree as Routes; + } +} + +export default V2ClientRouter; \ No newline at end of file diff --git a/src/app/percobaan/_router/router.txt b/src/app/percobaan/_router/router.txt new file mode 100644 index 00000000..e394a306 --- /dev/null +++ b/src/app/percobaan/_router/router.txt @@ -0,0 +1,20 @@ +import { z } from "zod"; +import V2ClientRouter from "../_lib/ClientRouter"; + +const dashboard = new V2ClientRouter({ + prefix: "/dashboard", + name: "dashboard", +}) + .add("/", { + query: z.object({ + page: z.string(), + }), + }) + .add("/berita"); + +const router = new V2ClientRouter({ + prefix: "/percobaan", + name: "percobaan", +}).use("dashboard", dashboard); + +export default router; diff --git a/src/app/percobaan/dashboard/berita/page.txt b/src/app/percobaan/dashboard/berita/page.txt new file mode 100644 index 00000000..4bba2a3f --- /dev/null +++ b/src/app/percobaan/dashboard/berita/page.txt @@ -0,0 +1,11 @@ +import React from 'react'; + +function Page() { + return ( +
+ berita +
+ ); +} + +export default Page; diff --git a/src/app/percobaan/dashboard/page.txt b/src/app/percobaan/dashboard/page.txt new file mode 100644 index 00000000..cc00a4fd --- /dev/null +++ b/src/app/percobaan/dashboard/page.txt @@ -0,0 +1,33 @@ +'use client' +import { useSearchParams } from 'next/navigation'; +import router from '../_router/router'; +import { Box } from '@mantine/core'; + + +function Page() { + const { page } = router.routes.dashboard.parse(useSearchParams()) + switch (page) { + case "1": + return + case "2": + return + case "3": + return + default: + return + } +} + +const Page1 = () => { + return Page 1 +} + +const Page2 = () => { + return Page 2 +} + +const Page3 = () => { + return Page 3 +} + +export default Page; diff --git a/src/app/percobaan/page2.txt b/src/app/percobaan/page2.txt new file mode 100644 index 00000000..69f2114b --- /dev/null +++ b/src/app/percobaan/page2.txt @@ -0,0 +1,18 @@ +'use client' +import { Button, Group, Stack } from "@mantine/core" +import { Link } from "next-view-transitions" +import router from "./_router/router" + +const Page = () => { + return + + {[1, 2, 3].map((v) => ())} + + + + +} + +export default Page \ No newline at end of file