@@ -8,6 +8,7 @@ import EventRsvpPanel from "@/app/(dashboard)/(officer)/officer/events/component
88import { officerRemoveCheckIn } from "@/app/actions/attendance" ;
99import {
1010 publishEvent ,
11+ updateScheduledPublish ,
1112 updateEventMixerFamilies ,
1213 updateEventRsvp ,
1314 updateEventSchedule ,
@@ -160,6 +161,15 @@ export default function EventDetailClient({
160161 const [ scheduleSaving , setScheduleSaving ] = useState ( false ) ;
161162 const [ scheduleError , setScheduleError ] = useState < string | null > ( null ) ;
162163 const [ scheduleSaved , setScheduleSaved ] = useState ( false ) ;
164+ const [ publishDate , setPublishDate ] = useState ( ( ) =>
165+ event . publish_at ? eventTimestampToFormDate ( event . publish_at ) : "" ,
166+ ) ;
167+ const [ publishTime , setPublishTime ] = useState ( ( ) =>
168+ event . publish_at ? eventTimestampToFormTime ( event . publish_at ) : "" ,
169+ ) ;
170+ const [ publishTimeSaving , setPublishTimeSaving ] = useState ( false ) ;
171+ const [ publishTimeError , setPublishTimeError ] = useState < string | null > ( null ) ;
172+ const [ publishTimeSaved , setPublishTimeSaved ] = useState ( false ) ;
163173 const [ uncheckTarget , setUncheckTarget ] = useState < AttendanceRow | null > (
164174 null ,
165175 ) ;
@@ -208,13 +218,16 @@ export default function EventDetailClient({
208218 setLocation ( event . location ?? "" ) ;
209219 setLocationMapsUrl ( event . location_maps_url ?? null ) ;
210220 setDescription ( event . description ?? "" ) ;
221+ setPublishDate ( event . publish_at ? eventTimestampToFormDate ( event . publish_at ) : "" ) ;
222+ setPublishTime ( event . publish_at ? eventTimestampToFormTime ( event . publish_at ) : "" ) ;
211223 } , [
212224 event . name ,
213225 event . starts_at ,
214226 event . ends_at ,
215227 event . location ,
216228 event . location_maps_url ,
217229 event . description ,
230+ event . publish_at ,
218231 ] ) ;
219232
220233 const toggleMixerFamily = ( id : string ) => {
@@ -300,6 +313,25 @@ export default function EventDetailClient({
300313 router . refresh ( ) ;
301314 } ;
302315
316+ const handleSavePublishTime = async ( ) => {
317+ setPublishTimeSaving ( true ) ;
318+ setPublishTimeError ( null ) ;
319+ setPublishTimeSaved ( false ) ;
320+
321+ const result = await updateScheduledPublish ( event . id , {
322+ scheduleDate : publishDate ,
323+ scheduleTime : publishTime ,
324+ } ) ;
325+
326+ setPublishTimeSaving ( false ) ;
327+ if ( ! result . success ) {
328+ setPublishTimeError ( result . error ?? "Failed to update publish time." ) ;
329+ return ;
330+ }
331+ setPublishTimeSaved ( true ) ;
332+ router . refresh ( ) ;
333+ } ;
334+
303335 const handlePublishStandings = async ( ) => {
304336 if (
305337 ! window . confirm (
@@ -499,6 +531,74 @@ export default function EventDetailClient({
499531 { publishError && (
500532 < p className = "mt-3 text-sm text-red-600" > { publishError } </ p >
501533 ) }
534+ { publishStatus === "scheduled" && (
535+ < CollapsibleSettings
536+ title = "Schedule publish"
537+ defaultOpen
538+ summary = {
539+ event . publish_at
540+ ? new Date ( event . publish_at ) . toLocaleString ( "en-US" , {
541+ timeZone : EVENT_TIMEZONE ,
542+ dateStyle : "medium" ,
543+ timeStyle : "short" ,
544+ } ) + " CT"
545+ : "No publish time set"
546+ }
547+ >
548+ < p className = "text-xs leading-5 text-subtitle" >
549+ Update when this event should become visible to members. Times are
550+ Central Time.
551+ </ p >
552+ < div className = "grid gap-3 sm:grid-cols-2" >
553+ < div >
554+ < label className = { labelClassName } htmlFor = "event-publish-date" >
555+ Publish date
556+ </ label >
557+ < input
558+ id = "event-publish-date"
559+ type = "date"
560+ className = { inputClassName }
561+ value = { publishDate }
562+ onChange = { ( e ) => {
563+ setPublishDate ( e . target . value ) ;
564+ setPublishTimeSaved ( false ) ;
565+ setPublishTimeError ( null ) ;
566+ } }
567+ />
568+ </ div >
569+ < div >
570+ < label className = { labelClassName } htmlFor = "event-publish-time" >
571+ Publish time
572+ </ label >
573+ < input
574+ id = "event-publish-time"
575+ type = "time"
576+ className = { inputClassName }
577+ value = { publishTime }
578+ onChange = { ( e ) => {
579+ setPublishTime ( e . target . value ) ;
580+ setPublishTimeSaved ( false ) ;
581+ setPublishTimeError ( null ) ;
582+ } }
583+ />
584+ </ div >
585+ </ div >
586+ { publishTimeError && (
587+ < p className = "text-sm text-red-600" > { publishTimeError } </ p >
588+ ) }
589+ { publishTimeSaved && (
590+ < p className = "text-sm text-green-700" > Publish time saved.</ p >
591+ ) }
592+ < button
593+ type = "button"
594+ onClick = { ( ) => void handleSavePublishTime ( ) }
595+ disabled = { publishTimeSaving }
596+ className = { btnPrimaryClassName }
597+ >
598+ { publishTimeSaving ? "Saving…" : "Save publish time" }
599+ </ button >
600+ </ CollapsibleSettings >
601+ ) }
502602 < CollapsibleSettings
503603 title = "Event details"
504604 defaultOpen
0 commit comments