Skip to main content
Version: 2.x

Unavailable Hours

React Native Calendar Kit allows you to specify certain hours as unavailable in your calendar view. This feature is useful for indicating non-working hours, lunch breaks, or any other time slots that should be visually distinguished or blocked off.

Using the unavailableHours Prop​

The unavailableHours prop accepts an array or object with the following properties:

  • start: The start hour of the unavailable time range (0-1440, where 0 is midnight and 1440 is the last minute of the day)
  • end: The end hour of the unavailable time range (0-1440, where 0 is midnight and 1440 is the last minute of the day)
  • enableBackgroundInteraction: A boolean that determines whether interactions (like creating events) are allowed in unavailable hours. Default is false.
  • backgroundColor: A string representing the background color for unavailable hours.

Here's the basic structure:

Applying to all days of the week​

const unavailableHours = useMemo(
() => [
{
start: 0,
end: 6 * 60,
enableBackgroundInteraction: true,
backgroundColor: '#ccc',
}, // 00:00 - 06:00
{
start: 20 * 60,
end: 24 * 60,
enableBackgroundInteraction: true,
backgroundColor: '#ccc',
}, // 20:00 - 24:00
],
[]
);
<CalendarContainer
unavailableHours={unavailableHours}
// ... other props
>
<CalendarHeader />
<CalendarBody />
</CalendarContainer>

unavailable-hours

Applying to specific days​

<CalendarKit
unavailableHours={{
1: [{ start: 0, end: 6 * 60 }, { start: 20 * 60, end: 24 * 60 }], // 00:00 - 06:00 and 20:00 - 24:00
'2024-05-01': [{ start: 0, end: 6 * 60 }, { start: 20 * 60, end: 24 * 60 }], // 00:00 - 06:00 and 20:00 - 24:00
'2024-05-02': [{ start: 0, end: 24 * 60 }], // All day
}}
/>

Examples​

Let's explore various cases and how to implement them:

1. Weekday Working Hours​

To set unavailable hours for weekdays (assuming work hours are 9 AM to 5 PM):

const unavailableHours = useMemo(
() => ({
1: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Monday 00:00 - 09:00 and 17:00 - 24:00
2: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Tuesday 00:00 - 09:00 and 17:00 - 24:00
3: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Wednesday 00:00 - 09:00 and 17:00 - 24:00
4: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Thursday 00:00 - 09:00 and 17:00 - 24:00
5: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Friday 00:00 - 09:00 and 17:00 - 24:00
}),
[]
);

2. Weekend Unavailability​

To mark weekends as entirely unavailable:

const unavailableHours = useMemo(
() => ({
6: [{ start: 0, end: 24 * 60 }], // Saturday
7: [{ start: 0, end: 24 * 60 }], // Sunday
}),
[]
);

3. Lunch Break​

To mark a lunch break as unavailable on all days:

const unavailableHours = useMemo(
() => ({
1: [{ start: 12 * 60, end: 13 * 60 }],
2: [{ start: 12 * 60, end: 13 * 60 }],
3: [{ start: 12 * 60, end: 13 * 60 }],
4: [{ start: 12 * 60, end: 13 * 60 }],
5: [{ start: 12 * 60, end: 13 * 60 }],
6: [{ start: 12 * 60, end: 13 * 60 }],
7: [{ start: 12 * 60, end: 13 * 60 }],
}),
[]
);

4. Complex Schedule​

For a more complex schedule with different hours for different days:

const unavailableHours = useMemo(
() => ({
1: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Monday 00:00 - 09:00 and 17:00 - 24:00
2: [{ start: 0, end: 10 * 60 }, { start: 16 * 60, end: 24 * 60 }], // Tuesday 00:00 - 10:00 and 16:00 - 24:00
3: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }], // Wednesday 00:00 - 09:00 and 17:00 - 24:00
4: [{ start: 0, end: 10 * 60 }, { start: 16 * 60, end: 24 * 60 }], // Thursday 00:00 - 10:00 and 16:00 - 24:00
5: [{ start: 0, end: 9 * 60 }, { start: 14 * 60, end: 24 * 60 }], // Friday 00:00 - 09:00 and 14:00 - 24:00
6: [{ start: 0, end: 24 * 60 }], // Saturday 00:00 - 24:00
7: [{ start: 0, end: 24 * 60 }], // Sunday 00:00 - 24:00
}),
[]
);

Considerations​

  • The day numbers are 1-7, where 1 is Monday and 7 is Sunday.
  • When specifying hours, use minutes from midnight (0-1440).
  • You can specify multiple unavailable ranges for each day.
  • If a day is not specified in the object, it will be treated as fully available.

Customizing Appearance​

You can set default background color for unavailable hours using the theme prop:

<CalendarKit
unavailableHours={{
1: [{ start: 0, end: 9 * 60 }, { start: 17 * 60, end: 24 * 60 }],
}}
theme={{
unavailableHourBackgroundColor: 'rgba(0, 0, 0, 0.1)', // Customize the background color
}}
/>

renderCustomUnavailableHour Prop​

The renderCustomUnavailableHour prop is a function that receives an object with the following properties:

  • start: The start hour (in minutes)
  • end: The end hour (in minutes)
  • enableBackgroundInteraction: Whether background interaction is enabled
  • backgroundColor: The background color
  • width: The width of the unavailable slot (SharedValue<number>)
  • height: The height of the unavailable slot (SharedValue<number>)

Here's an example of how to use renderCustomUnavailableHour:

 const renderCustomUnavailableHour = useCallback(
(
props: UnavailableHourProps & {
width: SharedValue<number>;
height: SharedValue<number>;
}
) => {
return <CustomUnavailableHour {...props} />;
},
[]
);

<CalendarBody renderCustomUnavailableHour={renderCustomUnavailableHour} />
  • CustomUnavailableHour component:
import { UnavailableHourProps } from '@howljs/calendar-kit';
import React, { FC } from 'react';
import Animated, {
SharedValue,
useAnimatedProps,
} from 'react-native-reanimated';
import { Defs, Line, Pattern, Rect, Svg } from 'react-native-svg';

const AnimatedRect = Animated.createAnimatedComponent(Rect);

const CustomUnavailableHour: FC<
UnavailableHourProps & {
width: SharedValue<number>;
height: SharedValue<number>;
}
> = (props) => {
const patternSize = 5;

const rectProps = useAnimatedProps(() => ({
height: props.height.value,
}));

return (
<Svg>
<Defs>
<Pattern
id="stripe-pattern"
patternUnits="userSpaceOnUse"
width={patternSize}
height={patternSize}
patternTransform="rotate(-45)">
<Line
x1={0}
y={0}
x2={0}
y2={patternSize + 5}
stroke="red"
strokeWidth={1.5}
strokeLinecap="butt"
/>
</Pattern>
</Defs>
<AnimatedRect
x="0"
y="0"
width="100%"
fill="url(#stripe-pattern)"
animatedProps={rectProps}
/>
</Svg>
);
};

export default CustomUnavailableHour;