diff --git a/packages/react-native-calendar-kit/src/components/TimelineBoard/UnavailableHours.tsx b/packages/react-native-calendar-kit/src/components/TimelineBoard/UnavailableHours.tsx index 5cbbbbb..59378bc 100644 --- a/packages/react-native-calendar-kit/src/components/TimelineBoard/UnavailableHours.tsx +++ b/packages/react-native-calendar-kit/src/components/TimelineBoard/UnavailableHours.tsx @@ -48,8 +48,19 @@ export const UnavailableHoursByDate = memo( resources, widthPercentage, }: UnavailableHoursByDateProps) => { - const unavailableHours = useUnavailableHoursByDate(currentUnix); - + let unavailableHours = useUnavailableHoursByDate(currentUnix); + // remove unavailableHours whose resourceId does not exist in resources + if (resources && unavailableHours) { + const resourceIds = new Set( + resources.map((resource) => resource.id) + ); + unavailableHours = unavailableHours.filter((hour) => { + return ( + // if exists, need to check both string and number types + !hour.resourceId || resourceIds.has(hour.resourceId) || resourceIds.has(String(hour.resourceId)) || resourceIds.has(Number(hour.resourceId)) + ); + }); + } if (!unavailableHours) { return null; } @@ -116,11 +127,14 @@ const UnavailableColumns = memo( const result: UnavailableColumnHourProps[] = []; const widthPerResource = widthPercentage || 1 / resourcesList.length; - // Create a map for faster resource lookup - const resourceMap = new Map(); + // Create a map for faster resource lookup - support both string and number ids + const resourceMap = new Map(); resourcesList.forEach((resource, index) => { - if (resource.id) { + if (resource.id !== undefined && resource.id !== null) { + // Store both string and number versions resourceMap.set(resource.id, index); + resourceMap.set(String(resource.id), index); + resourceMap.set(Number(resource.id), index); } }); @@ -136,8 +150,17 @@ const UnavailableColumns = memo( }); }); } else { - // Resource-specific unavailable hour - const resourceIndex = resourceMap.get(item.resourceId); + // Resource-specific unavailable hour - only apply to matching resource + // Try both original value and converted versions + let resourceIndex = resourceMap.get(item.resourceId); + if (resourceIndex === undefined) { + resourceIndex = resourceMap.get(String(item.resourceId)); + } + if (resourceIndex === undefined) { + resourceIndex = resourceMap.get(Number(item.resourceId)); + } + + if (resourceIndex !== undefined) { result.push({ item, @@ -252,4 +275,4 @@ const styles = StyleSheet.create({ container: { position: 'absolute', }, -}); +}); \ No newline at end of file diff --git a/packages/react-native-calendar-kit/src/context/UnavailableHoursProvider.tsx b/packages/react-native-calendar-kit/src/context/UnavailableHoursProvider.tsx index 0bf8649..c9ef869 100644 --- a/packages/react-native-calendar-kit/src/context/UnavailableHoursProvider.tsx +++ b/packages/react-native-calendar-kit/src/context/UnavailableHoursProvider.tsx @@ -36,7 +36,6 @@ const UnavailableHoursProvider: FC< }) ).current; const currentDate = useDateChangedListener(); - const notifyDataChanged = useCallback( (date: number, offset: number = 7) => { let originalData: Record = {}; @@ -71,11 +70,21 @@ const UnavailableHoursProvider: FC< // Get unavailable hours either by specific date or by weekday const unavailableHoursByDate = - originalData[dateStr] || originalData[weekDay]; + originalData[dateStr] || originalData[weekDay] || []; + + // Filter items that match the current date + const filteredHours = unavailableHoursByDate.filter((item) => { + // If item has a date property, only include it if it matches + if (item.date) { + return item.date === dateStr; + } + // If no date property, include it (applies to all matching weekdays) + return true; + }); // If unavailable hours are found for this day, store them - if (unavailableHoursByDate) { - data[dateUnix] = unavailableHoursByDate; + if (filteredHours.length > 0) { + data[dateUnix] = filteredHours; } // Move to the next day @@ -143,4 +152,4 @@ export const useUnavailableHoursByDate = (dateUnix: number) => { selectUnavailableHoursByDate ); return state; -}; +}; \ No newline at end of file