From ab86e25f5e536672e8026c48133d5ebeb043bae4 Mon Sep 17 00:00:00 2001 From: Howl Date: Mon, 21 Oct 2024 20:44:37 +0700 Subject: [PATCH 1/2] feat: support custom day dar item --- .../src/CalendarHeader.tsx | 5 ++ .../src/components/DayItem.tsx | 74 ++++++++++++------- .../src/components/MultiDayBarItem.tsx | 8 +- .../src/components/SingleDayBarItem.tsx | 14 +++- .../react-native-calendar-kit/src/index.tsx | 3 +- .../react-native-calendar-kit/src/types.ts | 56 +++++++++++--- 6 files changed, 119 insertions(+), 41 deletions(-) diff --git a/packages/react-native-calendar-kit/src/CalendarHeader.tsx b/packages/react-native-calendar-kit/src/CalendarHeader.tsx index 4733543..f554ca6 100644 --- a/packages/react-native-calendar-kit/src/CalendarHeader.tsx +++ b/packages/react-native-calendar-kit/src/CalendarHeader.tsx @@ -42,6 +42,7 @@ const CalendarHeader: React.FC = ({ eventMinMinutes = MIN_ALL_DAY_MINUTES, eventMaxMinutes = MAX_ALL_DAY_MINUTES, eventInitialMinutes = DEFAULT_ALL_DAY_MINUTES, + renderDayItem, }) => { const { calendarLayout, @@ -202,6 +203,7 @@ const CalendarHeader: React.FC = ({ renderEvent, renderExpandIcon, resources, + renderDayItem, }), [ calendarData.minDateUnix, @@ -211,6 +213,7 @@ const CalendarHeader: React.FC = ({ renderEvent, renderExpandIcon, resources, + renderDayItem, ] ); @@ -244,6 +247,7 @@ const CalendarHeader: React.FC = ({ renderExpandIcon={extra.renderExpandIcon} renderEvent={extra.renderEvent} pageIndex={index} + renderDayItem={extra.renderDayItem} /> ); } @@ -253,6 +257,7 @@ const CalendarHeader: React.FC = ({ pageIndex={index * extra.columns} startUnix={dateUnixByIndex} renderEvent={extra.renderEvent} + renderDayItem={extra.renderDayItem} /> ); }; diff --git a/packages/react-native-calendar-kit/src/components/DayItem.tsx b/packages/react-native-calendar-kit/src/components/DayItem.tsx index c092a31..9aa6bd2 100644 --- a/packages/react-native-calendar-kit/src/components/DayItem.tsx +++ b/packages/react-native-calendar-kit/src/components/DayItem.tsx @@ -1,5 +1,11 @@ -import React, { useMemo } from 'react'; -import { StyleSheet, TouchableOpacity, View } from 'react-native'; +import React, { PropsWithChildren, useMemo } from 'react'; +import { + StyleProp, + StyleSheet, + TouchableOpacity, + View, + ViewStyle, +} from 'react-native'; import { useActions } from '../context/ActionsProvider'; import { useHighlightDates } from '../context/HighlightDatesProvider'; import { useLocale } from '../context/LocaleProvider'; @@ -11,6 +17,8 @@ import Text from './Text'; interface DayItemProps { dateUnix: number; + showDayItem?: boolean; + dayItemContainerStyle?: StyleProp; } const selectDayItemTheme = (state: ThemeConfigs) => ({ @@ -26,7 +34,12 @@ const selectDayItemTheme = (state: ThemeConfigs) => ({ dayContainer: state.dayContainer, }); -const DayItem: React.FC = ({ dateUnix }) => { +const DayItem: React.FC> = ({ + dateUnix, + children, + showDayItem = true, + dayItemContainerStyle, +}) => { const { weekDayShort } = useLocale(); const { currentDateUnix } = useNowIndicator(); const { onPressDayNumber } = useActions(); @@ -79,32 +92,37 @@ const DayItem: React.FC = ({ dateUnix }) => { }; return ( - - - - {weekDayShort[date.weekday % 7]} - + + {showDayItem && ( + + + + {weekDayShort[date.weekday % 7]} + - - - {date.day} - - - - + + + {date.day} + + + + + )} + {children} + ); }; diff --git a/packages/react-native-calendar-kit/src/components/MultiDayBarItem.tsx b/packages/react-native-calendar-kit/src/components/MultiDayBarItem.tsx index a12e4af..31a856b 100644 --- a/packages/react-native-calendar-kit/src/components/MultiDayBarItem.tsx +++ b/packages/react-native-calendar-kit/src/components/MultiDayBarItem.tsx @@ -34,12 +34,14 @@ interface MultiDayBarItemProps { event: PackedAllDayEvent, size: SizeAnimation ) => React.ReactNode; + renderDayItem?: (date: { dateUnix: number }) => React.ReactNode; } const MultiDayBarItem: React.FC = ({ pageIndex, startUnix, renderEvent, + renderDayItem, }) => { const dayBarStyles = useTheme( useCallback( @@ -122,7 +124,11 @@ const MultiDayBarItem: React.FC = ({ key={`column_${visibleDates[date].unix}`} pointerEvents="box-none" style={animStyle}> - + {renderDayItem ? ( + renderDayItem({ dateUnix: visibleDates[date].unix }) + ) : ( + + )} ); }; diff --git a/packages/react-native-calendar-kit/src/components/SingleDayBarItem.tsx b/packages/react-native-calendar-kit/src/components/SingleDayBarItem.tsx index 8ef54db..2e59462 100644 --- a/packages/react-native-calendar-kit/src/components/SingleDayBarItem.tsx +++ b/packages/react-native-calendar-kit/src/components/SingleDayBarItem.tsx @@ -41,6 +41,7 @@ interface SingleDayBarItemProps { size: SizeAnimation ) => React.ReactNode; pageIndex: number; + renderDayItem?: (date: { dateUnix: number }) => React.ReactNode; } const SingleDayBarItem = ({ @@ -48,6 +49,7 @@ const SingleDayBarItem = ({ renderExpandIcon, renderEvent, pageIndex, + renderDayItem, }: SingleDayBarItemProps) => { const dayBarStyles = useTheme( useCallback( @@ -135,7 +137,11 @@ const SingleDayBarItem = ({ styles.dayItemContainer, { width: hourWidth, borderRightColor: dayBarStyles.borderColor }, ]}> - + {renderDayItem ? ( + renderDayItem({ dateUnix: startUnix }) + ) : ( + + )} - + {renderDayItem ? ( + renderDayItem({ dateUnix: startUnix }) + ) : ( + + )} ); }; diff --git a/packages/react-native-calendar-kit/src/index.tsx b/packages/react-native-calendar-kit/src/index.tsx index ab3df51..22689ad 100644 --- a/packages/react-native-calendar-kit/src/index.tsx +++ b/packages/react-native-calendar-kit/src/index.tsx @@ -8,6 +8,7 @@ export { default as CalendarHeader } from './CalendarHeader'; export { default as ResourceHeaderItem } from './components/ResourceHeaderItem'; export { default as MultiDayBarItem } from './components/MultiDayBarItem'; export { default as SingleDayBarItem } from './components/SingleDayBarItem'; +export { default as DayItem } from './components/DayItem'; export { useActions } from './context/ActionsProvider'; export { useBody } from './context/BodyContext'; @@ -48,7 +49,7 @@ export { DraggingEvent } from './components/DraggingEvent'; export type { WeekdayNumbers } from 'luxon'; -export { parseDateTime } from './utils/dateUtils'; +export * from './utils/dateUtils'; export * from './service/rrule'; diff --git a/packages/react-native-calendar-kit/src/types.ts b/packages/react-native-calendar-kit/src/types.ts index d29a1e2..b63a4c3 100644 --- a/packages/react-native-calendar-kit/src/types.ts +++ b/packages/react-native-calendar-kit/src/types.ts @@ -623,20 +623,36 @@ export interface CalendarHeaderProps { */ dayBarHeight?: number; - /** Custom header item */ + /** Custom header item + * + * Note: Please use `useCallback` to memoize the function + */ renderHeaderItem?: (props: HeaderItemProps) => React.ReactElement | null; - /** Custom expand icon */ + /** Custom expand icon + * + * Note: Please use `useCallback` to memoize the function + */ renderExpandIcon?: (props: { isExpanded: SharedValue; }) => React.ReactElement | null; - /** Custom event item */ + /** Custom event item + * + * Note: Please use `useCallback` to memoize the function + */ renderEvent?: ( event: PackedAllDayEvent, size: SizeAnimation ) => React.ReactNode; + /** + * Custom day item + * + * Note: Please use `useCallback` to memoize the function + */ + renderDayItem?: (date: { dateUnix: number }) => React.ReactNode; + /** Custom left area (multiple days) */ LeftAreaComponent?: React.ReactElement | null | undefined; @@ -674,20 +690,33 @@ export interface CalendarBodyProps { /** Custom hour text */ hourFormat?: string; - /** Custom hour text */ + /** Custom hour text + * + * Note: Please use `useCallback` to memoize the function + */ renderHour?: (props: RenderHourProps) => React.ReactElement | null; + /** Custom dragging hour text + * + * Note: Please use `useCallback` to memoize the function + */ renderDraggingHour?: (props: RenderHourProps) => React.ReactElement | null; /** Show now indicator */ showNowIndicator?: boolean; - /** Custom Out of Range item */ + /** Custom Out of Range item + * + * Note: Please use `useCallback` to memoize the function + */ renderCustomOutOfRange?: ( props: OutOfRangeProps ) => React.ReactElement | null; - /** Custom Unavailable Item */ + /** Custom Unavailable Item + * + * Note: Please use `useCallback` to memoize the function + */ renderCustomUnavailableHour?: ( props: UnavailableHourProps & { width: SharedValue; @@ -695,18 +724,27 @@ export interface CalendarBodyProps { } ) => React.ReactElement | null; - /** Custom event item */ + /** Custom event item + * + * Note: Please use `useCallback` to memoize the function + */ renderEvent?: ( event: PackedEvent, size: SizeAnimation ) => React.ReactElement | null; - /** Custom draggable event item */ + /** Custom draggable event item + * + * Note: Please use `useCallback` to memoize the function + */ renderDraggableEvent?: ( props: DraggableEventProps ) => React.ReactElement | null; - /** Custom dragging event item */ + /** Custom dragging event item + * + * Note: Please use `useCallback` to memoize the function + */ renderDraggingEvent?: ( props: DraggingEventProps ) => React.ReactElement | null; From c287d19973bb373ca70921729e92e4c63197825f Mon Sep 17 00:00:00 2001 From: Howl Date: Mon, 21 Oct 2024 20:45:53 +0700 Subject: [PATCH 2/2] docs: update doc --- apps/docs/docs/assets/custom-hour.png | Bin 0 -> 34891 bytes apps/docs/docs/customization/CalendarBody.md | 66 +++++++++++++++++++ apps/docs/docs/customization/_category_.json | 6 ++ apps/docs/package.json | 2 +- apps/docs/yarn.lock | 10 +-- 5 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 apps/docs/docs/assets/custom-hour.png create mode 100644 apps/docs/docs/customization/CalendarBody.md create mode 100644 apps/docs/docs/customization/_category_.json diff --git a/apps/docs/docs/assets/custom-hour.png b/apps/docs/docs/assets/custom-hour.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7cd00c2842db2c39167cff5bb494e3bb952e00 GIT binary patch literal 34891 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 aKt|ew?vQ4(KSaMO`Khd;Oreya@BaaLJ$YgP literal 0 HcmV?d00001 diff --git a/apps/docs/docs/customization/CalendarBody.md b/apps/docs/docs/customization/CalendarBody.md new file mode 100644 index 0000000..13306b2 --- /dev/null +++ b/apps/docs/docs/customization/CalendarBody.md @@ -0,0 +1,66 @@ +# CalendarBody + +`CalendarBody` is a core component of the React Native Calendar Kit. It renders the main calendar grid, including time slots, events, and various interactive elements. + +## renderHour + +A function that allows customization of the hour labels in the time column of the calendar. + +### Description + +The `renderHour` prop provides a way to customize the appearance of hour labels in the calendar's time column. When provided, this function will be called for each hour label, allowing you to render custom content instead of the default hour text. + +### Parameters + +The function receives an object with the following properties: + +- `hourStr`: A string representation of the hour (e.g., "9:00 AM"). +- `minutes`: The number of minutes since the start of the day for this hour label. +- `style`: The default style object applied to the hour label. You can extend or override this style in your custom rendering. + +### Return Value + +The function should return a React node (e.g., JSX element) that will be rendered as the hour label. + +### Example + +Here's an example of how to use the `renderHour` prop to create custom hour labels with a colored dot: + +```tsx +const renderHour = useCallback(({ hourStr }: RenderHourProps) => { + return ( + + + {hourStr} + + ); + }, []); + + + +const styles = StyleSheet.create({ + hourContainer: { + flexDirection: 'row', + alignItems: 'center', + position: 'absolute', + left: 8, + right: 0, + top: -4, + gap: 4, + }, + dot: { + width: 6, + height: 6, + borderRadius: 3, + backgroundColor: 'blue', + }, + hourText: { + fontWeight: 'bold', + fontSize: 8, + }, +}); +``` + +In this example, we're rendering a small blue dot next to each hour label and making the text bold. You can customize this further based on your specific design requirements. + +![custom-hour](../assets/custom-hour.png) diff --git a/apps/docs/docs/customization/_category_.json b/apps/docs/docs/customization/_category_.json new file mode 100644 index 0000000..ff9116d --- /dev/null +++ b/apps/docs/docs/customization/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Customization", + "position": 3, + "collapsible": true, + "collapsed": false +} diff --git a/apps/docs/package.json b/apps/docs/package.json index 1c25aa0..ae09111 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -21,7 +21,7 @@ "@docusaurus/preset-classic": "3.5.2", "@docusaurus/remark-plugin-npm2yarn": "^3.5.2", "@easyops-cn/docusaurus-search-local": "^0.44.5", - "@howljs/calendar-kit": "2.0.3", + "@howljs/calendar-kit": "2.0.6", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "glob": "^10.4.2", diff --git a/apps/docs/yarn.lock b/apps/docs/yarn.lock index 665493a..7743c89 100644 --- a/apps/docs/yarn.lock +++ b/apps/docs/yarn.lock @@ -2573,9 +2573,9 @@ __metadata: languageName: node linkType: hard -"@howljs/calendar-kit@npm:2.0.3": - version: 2.0.3 - resolution: "@howljs/calendar-kit@npm:2.0.3" +"@howljs/calendar-kit@npm:2.0.6": + version: 2.0.6 + resolution: "@howljs/calendar-kit@npm:2.0.6" dependencies: lodash.debounce: "npm:^4.0.8" lodash.isequal: "npm:^4.5.0" @@ -2594,7 +2594,7 @@ __metadata: optional: true react-native-haptic-feedback: optional: true - checksum: 10/3bcca8efd70749a524e4732366e9efef3f102a46549a1a6bcd9a8edebad84aad16ee6bf27eed40b5464e4469a5ac9c94825425c0f88dd03d2e7bf78769d82b41 + checksum: 10/330c774a4d5c054cd2577cbddcc3b27f7909d56c747f42baef3cfa71eaddb9a57057beb8850137ae3d7685b64e8650a151cdd2559ad10fe4a7b56bf476f2d5b3 languageName: node linkType: hard @@ -5036,7 +5036,7 @@ __metadata: "@docusaurus/tsconfig": "npm:3.5.2" "@docusaurus/types": "npm:3.5.2" "@easyops-cn/docusaurus-search-local": "npm:^0.44.5" - "@howljs/calendar-kit": "npm:2.0.3" + "@howljs/calendar-kit": "npm:2.0.6" "@mdx-js/react": "npm:^3.0.0" clsx: "npm:^2.0.0" glob: "npm:^10.4.2"