diff --git a/src/app/[locale]/admin/clubs/[club_id]/slot-definitions/GenerateSlotDefinitionsModal.tsx b/src/app/[locale]/admin/clubs/[club_id]/slot-definitions/GenerateSlotDefinitionsModal.tsx index 3a63142..eee68c8 100644 --- a/src/app/[locale]/admin/clubs/[club_id]/slot-definitions/GenerateSlotDefinitionsModal.tsx +++ b/src/app/[locale]/admin/clubs/[club_id]/slot-definitions/GenerateSlotDefinitionsModal.tsx @@ -1,16 +1,17 @@ 'use client'; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { X, Loader2, AlertCircle, ChevronDown, ChevronUp } from 'lucide-react'; -import { generateSlotDefinitions } from '@/src/lib/api/slot-definitions'; +import { generateSlotDefinitions, getSlotDefinitionPresets } from '@/src/lib/api/slot-definitions'; import type { Court } from '@/src/types/courts'; import type { SlotDefinitionPreset, GenerateSlotDefinitionsRequest, PatternOverrides, DayOfWeek, + PresetInfo, } from '@/src/types/slot-definitions'; -import { PRESET_OPTIONS, DAY_NAMES } from '@/src/types/slot-definitions'; +import { DAY_NAMES } from '@/src/types/slot-definitions'; interface GenerateSlotDefinitionsModalProps { clubId: number; @@ -25,6 +26,10 @@ export default function GenerateSlotDefinitionsModal({ onClose, onSuccess, }: GenerateSlotDefinitionsModalProps) { + // Preset data + const [presets, setPresets] = useState([]); + const [loadingPresets, setLoadingPresets] = useState(true); + // Form state const [preset, setPreset] = useState('workday_standard'); const [selectedCourtIds, setSelectedCourtIds] = useState([]); @@ -44,6 +49,21 @@ export default function GenerateSlotDefinitionsModal({ const [loading, setLoading] = useState(false); const [error, setError] = useState(null); + // Fetch presets on mount + useEffect(() => { + async function loadPresets() { + const result = await getSlotDefinitionPresets(); + if (result.success) { + setPresets(result.data.data.presets); + setLoadingPresets(false); + } else { + setError('Failed to load presets'); + setLoadingPresets(false); + } + } + loadPresets(); + }, []); + function handleSelectAllCourts() { if (selectedCourtIds.length === courts.length) { setSelectedCourtIds([]); @@ -113,7 +133,7 @@ export default function GenerateSlotDefinitionsModal({ setLoading(false); } - const selectedPreset = PRESET_OPTIONS.find(p => p.id === preset); + const selectedPreset = presets.find((p) => p.key === preset); return (
@@ -131,30 +151,43 @@ export default function GenerateSlotDefinitionsModal({ {/* Body */}
+ {/* Loading State */} + {loadingPresets && ( +
+ + Loading presets... +
+ )} + {/* Preset Selection */} -
- - - {selectedPreset && ( -

{selectedPreset.description}

- )} -
+ {!loadingPresets && presets.length > 0 && ( +
+ + + {selectedPreset && ( +

{selectedPreset.description}

+ )} +
+ )} - {/* Court Selection */} -
-
+ {/* Form Elements */} + {!loadingPresets && ( + <> + {/* Court Selection */} +
+
@@ -323,6 +356,8 @@ export default function GenerateSlotDefinitionsModal({
)}
+ + )} {/* Error Message */} {error && ( @@ -343,7 +378,7 @@ export default function GenerateSlotDefinitionsModal({