@@ -35,9 +35,8 @@ const createPollSchema = z.object({
35
35
. min ( 2 , "At least 2 options required" ) ,
36
36
deadline : z
37
37
. string ( )
38
- . optional ( )
38
+ . min ( 1 , "Deadline is required" )
39
39
. refine ( ( val ) => {
40
- if ( ! val ) return true ; // Allow empty deadline
41
40
const date = new Date ( val ) ;
42
41
return ! Number . isNaN ( date . getTime ( ) ) && date > new Date ( ) ;
43
42
} , "Deadline must be a valid future date" ) ,
@@ -217,15 +216,16 @@ export default function CreatePoll() {
217
216
{ /* Vote Deadline */ }
218
217
< div >
219
218
< Label className = "text-sm font-semibold text-gray-700" >
220
- Vote Deadline (Optional)
219
+ Vote Deadline
221
220
</ Label >
222
221
< Input
223
222
{ ...register ( "deadline" ) }
224
223
type = "datetime-local"
225
224
className = "mt-2 focus:ring-(--crimson) focus:border-(--crimson)"
225
+ required
226
226
/>
227
227
< p className = "mt-1 text-sm text-gray-500" >
228
- Leave empty for no deadline. Voting will be open indefinitely .
228
+ Set a deadline for when voting will end .
229
229
</ p >
230
230
{ errors . deadline && (
231
231
< p className = "mt-1 text-sm text-red-600" >
@@ -234,6 +234,59 @@ export default function CreatePoll() {
234
234
) }
235
235
</ div >
236
236
237
+ { /* Vote Visibility */ }
238
+ < div >
239
+ < Label className = "text-sm font-semibold text-gray-700" >
240
+ Vote Visibility
241
+ </ Label >
242
+ < div className = "mt-2 space-y-3" >
243
+ < Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
244
+ watchedVisibility === "public"
245
+ ? "border-(--crimson) bg-(--crimson) text-white"
246
+ : "border-gray-300 hover:border-gray-400"
247
+ } `} >
248
+ < input
249
+ type = "radio"
250
+ value = "public"
251
+ { ...register ( "visibility" ) }
252
+ className = "sr-only"
253
+ />
254
+ < div className = "flex items-center" >
255
+ < Eye className = "w-6 h-6 mr-3" />
256
+ < div >
257
+ < div className = "font-semibold" > Public</ div >
258
+ < div className = "text-sm opacity-90" > Voters are public</ div >
259
+ </ div >
260
+ </ div >
261
+ </ Label >
262
+
263
+ < Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
264
+ watchedVisibility === "private"
265
+ ? "border-(--crimson) bg-(--crimson) text-white"
266
+ : "border-gray-300 hover:border-gray-400"
267
+ } `} >
268
+ < input
269
+ type = "radio"
270
+ value = "private"
271
+ { ...register ( "visibility" ) }
272
+ className = "sr-only"
273
+ />
274
+ < div className = "flex items-center" >
275
+ < UserX className = "w-6 h-6 mr-3" />
276
+ < div >
277
+ < div className = "font-semibold" > Private</ div >
278
+ < div className = "text-sm opacity-90" > Voters are hidden</ div >
279
+ </ div >
280
+ </ div >
281
+ </ Label >
282
+ </ div >
283
+ { errors . visibility && (
284
+ < p className = "mt-1 text-sm text-red-600" >
285
+ { errors . visibility . message }
286
+ </ p >
287
+ ) }
288
+ </ div >
289
+
237
290
{ /* Vote Type */ }
238
291
< div >
239
292
< Label className = "text-sm font-semibold text-gray-700" >
@@ -263,13 +316,16 @@ export default function CreatePoll() {
263
316
< Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
264
317
watchedMode === "point"
265
318
? "border-(--crimson) bg-(--crimson) text-white"
319
+ : watchedVisibility === "private"
320
+ ? "border-gray-300 bg-gray-100 opacity-50 cursor-not-allowed"
266
321
: "border-gray-300 hover:border-gray-400"
267
322
} `} >
268
323
< input
269
324
type = "radio"
270
325
value = "point"
271
326
{ ...register ( "mode" ) }
272
327
className = "sr-only"
328
+ disabled = { watchedVisibility === "private" }
273
329
/>
274
330
< div className = "flex items-center" >
275
331
< ChartLine className = "w-6 h-6 mr-3" />
@@ -283,13 +339,16 @@ export default function CreatePoll() {
283
339
< Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
284
340
watchedMode === "rank"
285
341
? "border-(--crimson) bg-(--crimson) text-white"
342
+ : watchedVisibility === "private"
343
+ ? "border-gray-300 bg-gray-100 opacity-50 cursor-not-allowed"
286
344
: "border-gray-300 hover:border-gray-400"
287
345
} `} >
288
346
< input
289
347
type = "radio"
290
348
value = "rank"
291
349
{ ...register ( "mode" ) }
292
350
className = "sr-only"
351
+ disabled = { watchedVisibility === "private" }
293
352
/>
294
353
< div className = "flex items-center" >
295
354
< ListOrdered className = "w-6 h-6 mr-3" />
@@ -363,59 +422,6 @@ export default function CreatePoll() {
363
422
< p className = "mt-2 text-sm text-gray-500" > Coming soon - currently disabled</ p >
364
423
</ div >
365
424
366
- { /* Vote Visibility */ }
367
- < div >
368
- < Label className = "text-sm font-semibold text-gray-700" >
369
- Vote Visibility
370
- </ Label >
371
- < div className = "mt-2 space-y-3" >
372
- < Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
373
- watchedVisibility === "public"
374
- ? "border-(--crimson) bg-(--crimson) text-white"
375
- : "border-gray-300 hover:border-gray-400"
376
- } `} >
377
- < input
378
- type = "radio"
379
- value = "public"
380
- { ...register ( "visibility" ) }
381
- className = "sr-only"
382
- />
383
- < div className = "flex items-center" >
384
- < Eye className = "w-6 h-6 mr-3" />
385
- < div >
386
- < div className = "font-semibold" > Public</ div >
387
- < div className = "text-sm opacity-90" > Voters are public</ div >
388
- </ div >
389
- </ div >
390
- </ Label >
391
-
392
- < Label className = { `flex items-center cursor-pointer p-4 border-2 rounded-lg transition-all duration-200 ${
393
- watchedVisibility === "private"
394
- ? "border-(--crimson) bg-(--crimson) text-white"
395
- : "border-gray-300 hover:border-gray-400"
396
- } `} >
397
- < input
398
- type = "radio"
399
- value = "private"
400
- { ...register ( "visibility" ) }
401
- className = "sr-only"
402
- />
403
- < div className = "flex items-center" >
404
- < UserX className = "w-6 h-6 mr-3" />
405
- < div >
406
- < div className = "font-semibold" > Private</ div >
407
- < div className = "text-sm opacity-90" > Voters are hidden</ div >
408
- </ div >
409
- </ div >
410
- </ Label >
411
- </ div >
412
- { errors . visibility && (
413
- < p className = "mt-1 text-sm text-red-600" >
414
- { errors . visibility . message }
415
- </ p >
416
- ) }
417
- </ div >
418
-
419
425
{ /* Vote Options */ }
420
426
< div >
421
427
< Label className = "text-sm font-semibold text-gray-700" >
0 commit comments