diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index a7ae637..b0d8710 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -10,7 +10,7 @@ jobs:
name: Tests
runs-on: docker
container:
- image: cypress/browsers:latest@sha256:95587c1ce688ce6f59934cc234a753a32a1782ca1c7959707a7d2332e69f6f63
+ image: cypress/browsers:latest@sha256:9daea41366dfd1b72496bf3e8295eda215a6990c2dbe4f9ff4b8ba47342864fb
options: --user 1001
steps:
- name: Checkout
diff --git a/Dockerfile b/Dockerfile
index 36f92ea..29e8dfa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:22-alpine@sha256:3d5fc849018cfc7e3d770820582857fb6c8d88eb10db7d3af699e8cf81b9e551 AS base
+FROM node:22-alpine@sha256:5340cbfc2df14331ab021555fdd9f83f072ce811488e705b0e736b11adeec4bb AS base
# ----- Dependencies -----
FROM base AS deps
diff --git a/Dockerfile.dev b/Dockerfile.dev
index 32ba7ac..a77f9a8 100644
--- a/Dockerfile.dev
+++ b/Dockerfile.dev
@@ -1,4 +1,4 @@
-FROM node:22-alpine@sha256:3d5fc849018cfc7e3d770820582857fb6c8d88eb10db7d3af699e8cf81b9e551
+FROM node:22-alpine@sha256:5340cbfc2df14331ab021555fdd9f83f072ce811488e705b0e736b11adeec4bb
WORKDIR /app
diff --git a/package.json b/package.json
index 44f9d65..2950955 100644
--- a/package.json
+++ b/package.json
@@ -73,15 +73,15 @@
"devDependencies": {
"@eslint/eslintrc": "3.3.1",
"@tailwindcss/postcss": "4.1.11",
- "@types/node": "22.16.2",
+ "@types/node": "22.15.34",
"@types/react": "19.1.8",
"@types/react-big-calendar": "1.16.2",
"@types/react-dom": "19.1.6",
"@types/swagger-ui-react": "5.18.0",
"@types/webpack-env": "1.18.8",
- "cypress": "14.5.1",
+ "cypress": "14.5.0",
"dotenv-cli": "8.0.0",
- "eslint": "9.30.1",
+ "eslint": "9.30.0",
"eslint-config-next": "15.3.4",
"eslint-config-prettier": "10.1.5",
"orval": "7.10.0",
diff --git a/src/app/api/blocked_slots/validation.ts b/src/app/api/blocked_slots/validation.ts
index 1cbe42c..3353f5e 100644
--- a/src/app/api/blocked_slots/validation.ts
+++ b/src/app/api/blocked_slots/validation.ts
@@ -25,6 +25,14 @@ export const BlockedSlotsSchema = zod
created_at: zod.date(),
updated_at: zod.date(),
})
+ .refine(
+ (data) => {
+ return new Date(data.start_time) < new Date(data.end_time);
+ },
+ {
+ message: 'Start time must be before end time',
+ },
+ )
.openapi('BlockedSlotsSchema', {
description: 'Blocked time slot in the user calendar',
});
@@ -39,37 +47,11 @@ export const BlockedSlotResponseSchema = zod.object({
blocked_slot: BlockedSlotsSchema,
});
-export const createBlockedSlotSchema = zod
- .object({
- start_time: eventStartTimeSchema,
- end_time: eventEndTimeSchema,
- reason: zod.string().nullish(),
- })
- .refine(
- (data) => {
- return new Date(data.start_time) < new Date(data.end_time);
- },
- {
- message: 'Start time must be before end time',
- path: ['end_time'],
- },
- );
-
-export const createBlockedSlotClientSchema = zod
- .object({
- start_time: zod.iso.datetime({ local: true }),
- end_time: zod.iso.datetime({ local: true }),
- reason: zod.string().nullish(),
- })
- .refine(
- (data) => {
- return new Date(data.start_time) < new Date(data.end_time);
- },
- {
- message: 'Start time must be before end time',
- path: ['end_time'],
- },
- );
+export const createBlockedSlotSchema = BlockedSlotsSchema.omit({
+ id: true,
+ created_at: true,
+ updated_at: true,
+});
export const updateBlockedSlotSchema = zod.object({
start_time: eventStartTimeSchema.optional(),
diff --git a/src/components/forms/blocked-slot-form.tsx b/src/components/forms/blocked-slot-form.tsx
index 52a119d..1293e58 100644
--- a/src/components/forms/blocked-slot-form.tsx
+++ b/src/components/forms/blocked-slot-form.tsx
@@ -3,7 +3,7 @@
import useZodForm from '@/lib/hooks/useZodForm';
import {
updateBlockedSlotSchema,
- createBlockedSlotClientSchema,
+ createBlockedSlotSchema,
} from '@/app/api/blocked_slots/validation';
import {
useGetApiBlockedSlotsSlotID,
@@ -40,7 +40,12 @@ export default function BlockedSlotForm({
handleSubmit: handleCreateSubmit,
formState: formStateCreate,
reset: resetCreate,
- } = useZodForm(createBlockedSlotClientSchema);
+ } = useZodForm(
+ createBlockedSlotSchema.extend({
+ start_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })),
+ end_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })),
+ }),
+ );
const {
register: registerUpdate,
@@ -140,146 +145,100 @@ export default function BlockedSlotForm({
});
});
- if (existingBlockedSlotId)
- return (
-
-
-
-
-
-
-
-
-
{'Update Blocker'}
-
-
+ return (
+
+
+
+
- );
- else
- return (
-
-
-
-
-
-
-
-
-
{'Create Blocker'}
-
-
+
+
+ {existingBlockedSlotId ? 'Update Blocker' : 'Create Blocker'}
+
-
-
-
- );
+
+ {formStateCreate.errors.root && (
+
+ {formStateCreate.errors.root.message}
+
+ )}
+ {formStateUpdate.errors.root && (
+
+ {formStateUpdate.errors.root.message}
+
+ )}
+
+
+
+
+ );
}
diff --git a/yarn.lock b/yarn.lock
index 11a0ab0..3d5b0ce 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -489,10 +489,10 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/js@npm:9.30.1":
- version: 9.30.1
- resolution: "@eslint/js@npm:9.30.1"
- checksum: 10c0/17fc382a0deafdb1cadac1269d9c2f2464f025bde6e4d12fc4f4775eb9886b41340d4650b72e85a53423644fdc89bf59c987a852f27379ad25feecf2c5bbc1c9
+"@eslint/js@npm:9.30.0":
+ version: 9.30.0
+ resolution: "@eslint/js@npm:9.30.0"
+ checksum: 10c0/aec2df7f4e4e884d693dc27dbf4713c1a48afa327bfadac25ebd0e61a2797ce906f2f2a9be0d7d922acb68ccd68cc88779737811f9769eb4933d1f5e574c469e
languageName: node
linkType: hard
@@ -3387,12 +3387,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/node@npm:22.16.2":
- version: 22.16.2
- resolution: "@types/node@npm:22.16.2"
+"@types/node@npm:22.15.34":
+ version: 22.15.34
+ resolution: "@types/node@npm:22.15.34"
dependencies:
undici-types: "npm:~6.21.0"
- checksum: 10c0/4b5e34ca73cceb2630ae2ca46cc8fe1173e0026edb24dcd203cb7cfa788f0bab84b0d8599c32aedbc506a519acc5027177ce8b47a4f63e4f7887808499fec6a3
+ checksum: 10c0/fb6a6b36daaa1b484aaba3d33b4d1e7b37ea993e29f20b7a676affa76ed6ff6acd2ded4d5003469bc8dbc815b3d224533b4560896037ef6d5b5d552721ab7d57
languageName: node
linkType: hard
@@ -4786,9 +4786,9 @@ __metadata:
languageName: node
linkType: hard
-"cypress@npm:14.5.1":
- version: 14.5.1
- resolution: "cypress@npm:14.5.1"
+"cypress@npm:14.5.0":
+ version: 14.5.0
+ resolution: "cypress@npm:14.5.0"
dependencies:
"@cypress/request": "npm:^3.0.8"
"@cypress/xvfb": "npm:^1.2.4"
@@ -4836,7 +4836,7 @@ __metadata:
yauzl: "npm:^2.10.0"
bin:
cypress: bin/cypress
- checksum: 10c0/23c87cafcd2fe949af1b3297cc4c9c8f8d741f5dfa8119ff54b387227dba8dc0dbcfb2d160c4df5d4f281374524753598f3501f0fdf0b1ea66c5b8047484c0d2
+ checksum: 10c0/b76b05c029625357fbc34f22b632c55f9f981f86c3a568a88ea3d8982b8299e4bd4275e966b2ec767f9a989c6e9059fb03a4a8086048b4e990079b1cab19ba11
languageName: node
linkType: hard
@@ -5676,9 +5676,9 @@ __metadata:
languageName: node
linkType: hard
-"eslint@npm:9.30.1":
- version: 9.30.1
- resolution: "eslint@npm:9.30.1"
+"eslint@npm:9.30.0":
+ version: 9.30.0
+ resolution: "eslint@npm:9.30.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.2.0"
"@eslint-community/regexpp": "npm:^4.12.1"
@@ -5686,7 +5686,7 @@ __metadata:
"@eslint/config-helpers": "npm:^0.3.0"
"@eslint/core": "npm:^0.14.0"
"@eslint/eslintrc": "npm:^3.3.1"
- "@eslint/js": "npm:9.30.1"
+ "@eslint/js": "npm:9.30.0"
"@eslint/plugin-kit": "npm:^0.3.1"
"@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1"
@@ -5722,7 +5722,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
- checksum: 10c0/5a5867078e03ea56a1b6d1ee1548659abc38a6d5136c7ef94e21c5dbeb28e3ed50b15d2e0da25fce85600f6cf7ea7715eae650c41e8ae826c34490e9ec73d5d6
+ checksum: 10c0/ebc4b17cfd96f308ebaeb12dfab133a551eb03200c80109ecf663fbeb9af83c4eb3c143407c1b04522d23b5f5844fe9a629b00d409adfc460c1aadf5108da86a
languageName: node
linkType: hard
@@ -7717,7 +7717,7 @@ __metadata:
"@radix-ui/react-tooltip": "npm:^1.2.7"
"@tailwindcss/postcss": "npm:4.1.11"
"@tanstack/react-query": "npm:^5.80.7"
- "@types/node": "npm:22.16.2"
+ "@types/node": "npm:22.15.34"
"@types/react": "npm:19.1.8"
"@types/react-big-calendar": "npm:1.16.2"
"@types/react-dom": "npm:19.1.6"
@@ -7727,10 +7727,10 @@ __metadata:
class-variance-authority: "npm:^0.7.1"
clsx: "npm:^2.1.1"
cmdk: "npm:^1.1.1"
- cypress: "npm:14.5.1"
+ cypress: "npm:14.5.0"
date-fns: "npm:^4.1.0"
dotenv-cli: "npm:8.0.0"
- eslint: "npm:9.30.1"
+ eslint: "npm:9.30.0"
eslint-config-next: "npm:15.3.4"
eslint-config-prettier: "npm:10.1.5"
lucide-react: "npm:^0.525.0"
@@ -8988,15 +8988,15 @@ __metadata:
linkType: hard
"react-day-picker@npm:^9.7.0":
- version: 9.8.0
- resolution: "react-day-picker@npm:9.8.0"
+ version: 9.7.0
+ resolution: "react-day-picker@npm:9.7.0"
dependencies:
"@date-fns/tz": "npm:1.2.0"
date-fns: "npm:4.1.0"
date-fns-jalali: "npm:4.1.0-0"
peerDependencies:
react: ">=16.8.0"
- checksum: 10c0/910dfbc59e9fece7f5365a2a23ed497e07f227a733289e8141b858b6ce482087df6b01f2ba4f9f7e452ebc3465af0e227f192708a673396221865df07e5ab2ac
+ checksum: 10c0/c08c45a53aebceda1c938d2e4c95eb1702dcf149715e3457739f8930dce19a3be5780e5bad12dcc9d244d50b7e0efb226c336d81c1c062f616cf422e6a3804a6
languageName: node
linkType: hard
@@ -9035,11 +9035,11 @@ __metadata:
linkType: hard
"react-hook-form@npm:^7.56.4":
- version: 7.60.0
- resolution: "react-hook-form@npm:7.60.0"
+ version: 7.59.0
+ resolution: "react-hook-form@npm:7.59.0"
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
- checksum: 10c0/eb8518d42a074d9e115d4b414bac18ae72708b2d047a9453dcc7588b00df300b32cebf6ecb7f2c8aa534808b3dc54bde4124af95c1e432b6691f9aba07c93b11
+ checksum: 10c0/6be30ce65121f4be0f491c2929142e2d9a390a8802f58fb7a41ab978ab8daa6fcd2c442258dbd1b053e6864a83c8f4b1d83de9c95f0efdf5c2120d3c21bd838e
languageName: node
linkType: hard
@@ -10214,8 +10214,8 @@ __metadata:
linkType: hard
"swagger-ui-react@npm:^5.24.1":
- version: 5.26.2
- resolution: "swagger-ui-react@npm:5.26.2"
+ version: 5.25.3
+ resolution: "swagger-ui-react@npm:5.25.3"
dependencies:
"@babel/runtime-corejs3": "npm:^7.27.1"
"@scarf/scarf": "npm:=1.4.0"
@@ -10253,7 +10253,7 @@ __metadata:
peerDependencies:
react: ">=16.8.0 <19"
react-dom: ">=16.8.0 <19"
- checksum: 10c0/07fa118797d9a65870892b8aa9a4cd3c383452293ecd972b428b774ef488f47a66dd2b94c7f98d399eafc0f6e9043afda467a192d234bbf6c3e1532ae21a3970
+ checksum: 10c0/9d6542d0d1bd2533e87853d4deef5507d30b35941c697d50c763428533a88cbd9c2e3abe1af5946e35aa7fa3568dc14b9da4363f09bdf6d8023e0699efceb5cf
languageName: node
linkType: hard
@@ -11314,8 +11314,8 @@ __metadata:
linkType: hard
"zod@npm:^3.25.60":
- version: 3.25.74
- resolution: "zod@npm:3.25.74"
- checksum: 10c0/59e38b046ac333b5bd1ba325a83b6798721227cbfb1e69dfc7159bd7824b904241ab923026edb714fafefec3624265ae374a70aee9a5a45b365bd31781ffa105
+ version: 3.25.67
+ resolution: "zod@npm:3.25.67"
+ checksum: 10c0/80a0cab3033272c4ab9312198081f0c4ea88e9673c059aa36dc32024906363729db54bdb78f3dc9d5529bd1601f74974d5a56c0a23e40c6f04a9270c9ff22336
languageName: node
linkType: hard