* MED-151: add profile view and working smoking dashboard card * update zod * move some components to shared * move some components to shared * remove console.logs * remove unused password form components * only check null for variant * use pathsconfig
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
const RouteMatchingEnd = z
|
|
.union([
|
|
z.boolean(),
|
|
z.function({ input: [z.string()], output: z.boolean() }),
|
|
])
|
|
.default(false)
|
|
.optional();
|
|
|
|
const Divider = z.object({
|
|
divider: z.literal(true),
|
|
});
|
|
|
|
const RouteSubChild = z.object({
|
|
label: z.string(),
|
|
path: z.string(),
|
|
Icon: z.custom<React.ReactNode>().optional(),
|
|
end: RouteMatchingEnd,
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
const RouteChild = z.object({
|
|
label: z.string(),
|
|
path: z.string(),
|
|
Icon: z.custom<React.ReactNode>().optional(),
|
|
end: RouteMatchingEnd,
|
|
children: z.array(RouteSubChild).default([]).optional(),
|
|
collapsible: z.boolean().default(false).optional(),
|
|
collapsed: z.boolean().default(false).optional(),
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
const RouteGroup = z.object({
|
|
label: z.string().optional(),
|
|
collapsible: z.boolean().optional(),
|
|
collapsed: z.boolean().optional(),
|
|
children: z.array(RouteChild),
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
export const NavigationConfigSchema = z.object({
|
|
style: z.enum(['custom', 'sidebar', 'header']).default('custom'),
|
|
sidebarCollapsed: z.boolean().optional(),
|
|
sidebarCollapsedStyle: z.enum(['offcanvas', 'icon', 'none']).default('icon'),
|
|
routes: z.array(z.union([RouteGroup, Divider])),
|
|
});
|