import React, { useState } from 'react'; import { View, Text, ScrollView, StyleSheet } from 'react-native'; import { Ux4gTimeslot, SlotDateStatus, SlotPickerViewMode, SlotTimeStatus, SlotTimeEntry } from '../components/slot-grid/SlotGrid'; import { useUx4gTheme } from '../theme/Ux4gThemeContext'; export const SlotGridShowcase: React.FC = () => { const theme = useUx4gTheme(); const colors = theme.colors; const [selectedDate1, setSelectedDate1] = useState(); const [confirmedSlot1, setConfirmedSlot1] = useState(); const [selectedDate2, setSelectedDate2] = useState(); const [confirmedSlot2, setConfirmedSlot2] = useState(); const handleDateSelected1 = (date: Date) => { setSelectedDate1(date); setConfirmedSlot1(undefined); }; const handleSlotConfirmed1 = (date: Date, slot: SlotTimeEntry) => { setSelectedDate1(date); setConfirmedSlot1(slot); }; const handleDateSelected2 = (date: Date) => { setSelectedDate2(date); setConfirmedSlot2(undefined); }; const handleSlotConfirmed2 = (date: Date, slot: SlotTimeEntry) => { setSelectedDate2(date); setConfirmedSlot2(slot); }; const getDummyTimeSlots = async (date: Date): Promise => { // Simulate network delay await new Promise(resolve => setTimeout(resolve, 500)); const day = date.getDate(); if (day % 3 === 0) { return [ { time: '09:00 AM', slotCount: 2, status: SlotTimeStatus.limited }, { time: '10:00 AM', slotCount: 5, status: SlotTimeStatus.available }, { time: '11:00 AM', slotCount: 0, status: SlotTimeStatus.noSlots }, { time: '12:00 PM', slotCount: 1, status: SlotTimeStatus.limited }, { time: '01:00 PM', slotCount: 3, status: SlotTimeStatus.available }, ]; } else if (day % 2 === 0) { return [ { time: '09:30 AM', slotCount: 12, status: SlotTimeStatus.available }, { time: '11:30 AM', slotCount: 8, status: SlotTimeStatus.available }, { time: '02:30 PM', slotCount: 0, status: SlotTimeStatus.noSlots }, { time: '04:30 PM', slotCount: 4, status: SlotTimeStatus.available }, ]; } return [ { time: '09:00 AM', slotCount: 5, status: SlotTimeStatus.available }, { time: '10:00 AM', slotCount: 0, status: SlotTimeStatus.noSlots }, { time: '11:00 AM', slotCount: 2, status: SlotTimeStatus.limited }, { time: '12:00 PM', slotCount: 8, status: SlotTimeStatus.available }, { time: '01:00 PM', slotCount: 1, status: SlotTimeStatus.limited }, { time: '02:00 PM', slotCount: 0, status: SlotTimeStatus.noSlots }, { time: '03:00 PM', slotCount: 4, status: SlotTimeStatus.available }, ]; }; return ( 📅 Slot Grid Calendar-style slot grid with an integrated time slot picker sheet. 1. Expanded View Mode Vertical list for time slot selection. {(selectedDate1 || confirmedSlot1) && ( Selection Result: {selectedDate1 && • Date: {selectedDate1.toDateString()}} {confirmedSlot1 && • Time: {confirmedSlot1.time}} {!confirmedSlot1 && • Time: None selected yet} )} 2. Compact View Mode Grid layout for time slot selection. {(selectedDate2 || confirmedSlot2) && ( Selection Result: {selectedDate2 && • Date: {selectedDate2.toDateString()}} {confirmedSlot2 && • Time: {confirmedSlot2.time}} {!confirmedSlot2 && • Time: None selected yet} )} ); }; const styles = StyleSheet.create({ container: { flex: 1 }, contentContainer: { padding: 16, paddingBottom: 40 }, header: { marginBottom: 16 }, title: { fontSize: 22, fontWeight: '800', marginBottom: 6 }, subText: { fontSize: 14, lineHeight: 20 }, card: { borderWidth: 1, borderRadius: 16, padding: 16, marginBottom: 16 }, sectionTitle: { fontSize: 16, fontWeight: '700', marginBottom: 4 }, resultBox: { marginTop: 16, padding: 12, borderRadius: 8, borderWidth: 1, }, resultTitle: { fontSize: 14, fontWeight: 'bold', marginBottom: 4, }, resultText: { fontSize: 14, marginTop: 2, }, });