Skip to content

Commit 5b7c900

Browse files
committed
Set defaults in the schema
1 parent f7fcedf commit 5b7c900

File tree

2 files changed

+14
-19
lines changed

2 files changed

+14
-19
lines changed

apps/webapp/app/routes/resources.preferences.sidemenu.tsx

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ import { z } from "zod";
33
import { updateSideMenuPreferences } from "~/services/dashboardPreferences.server";
44
import { requireUser } from "~/services/session.server";
55

6+
// Transforms form data string "true"/"false" to boolean, or undefined if not present
7+
const booleanFromFormData = z
8+
.enum(["true", "false"])
9+
.transform((val) => val === "true")
10+
.optional();
11+
612
const RequestSchema = z.object({
7-
isCollapsed: z.boolean().optional(),
8-
manageSectionCollapsed: z.boolean().optional(),
13+
isCollapsed: booleanFromFormData,
14+
manageSectionCollapsed: booleanFromFormData,
915
});
1016

1117
export async function action({ request }: ActionFunctionArgs) {
@@ -14,17 +20,7 @@ export async function action({ request }: ActionFunctionArgs) {
1420
const formData = await request.formData();
1521
const rawData = Object.fromEntries(formData);
1622

17-
// Parse booleans from form data strings
18-
const data = {
19-
isCollapsed:
20-
rawData.isCollapsed !== undefined ? rawData.isCollapsed === "true" : undefined,
21-
manageSectionCollapsed:
22-
rawData.manageSectionCollapsed !== undefined
23-
? rawData.manageSectionCollapsed === "true"
24-
: undefined,
25-
};
26-
27-
const result = RequestSchema.safeParse(data);
23+
const result = RequestSchema.safeParse(rawData);
2824
if (!result.success) {
2925
return json({ success: false, error: "Invalid request data" }, { status: 400 });
3026
}

apps/webapp/app/services/dashboardPreferences.server.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import { logger } from "./logger.server";
44
import { type UserFromSession } from "./session.server";
55

66
const SideMenuPreferences = z.object({
7-
isCollapsed: z.boolean(),
8-
manageSectionCollapsed: z.boolean(),
7+
isCollapsed: z.boolean().default(false),
8+
manageSectionCollapsed: z.boolean().default(false),
99
});
1010

11+
export const SideMenuPreferencesDefaults = SideMenuPreferences.parse({});
12+
1113
export type SideMenuPreferences = z.infer<typeof SideMenuPreferences>;
1214

1315
const DashboardPreferences = z.object({
@@ -121,10 +123,7 @@ export async function updateSideMenuPreferences({
121123
return;
122124
}
123125

124-
const currentSideMenu = user.dashboardPreferences.sideMenu ?? {
125-
isCollapsed: false,
126-
manageSectionCollapsed: false,
127-
};
126+
const currentSideMenu = user.dashboardPreferences.sideMenu ?? SideMenuPreferencesDefaults;
128127

129128
const updatedSideMenu: SideMenuPreferences = {
130129
isCollapsed: isCollapsed ?? currentSideMenu.isCollapsed,

0 commit comments

Comments
 (0)