@isma91/react-scheduler 4.0.5 → 4.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/package.json +6 -6
  2. package/package.json +9 -7
  3. package/.github/workflows/publish.yml +0 -29
  4. package/.github/workflows/tests.yml +0 -35
  5. package/.gitignore +0 -32
  6. package/.husky/pre-commit +0 -2
  7. package/.prettierignore +0 -1
  8. package/.prettierrc.json +0 -7
  9. package/.yarnrc.yml +0 -1
  10. package/eslint.config.js +0 -79
  11. package/index.html +0 -41
  12. package/isma91-react-scheduler-4.0.5.tgz +0 -0
  13. package/jest.config.ts +0 -194
  14. package/public/favicon.ico +0 -0
  15. package/public/logo192.png +0 -0
  16. package/public/logo512.png +0 -0
  17. package/public/manifest.json +0 -25
  18. package/public/robots.txt +0 -3
  19. package/scripts/post-pack.js +0 -34
  20. package/src/App.tsx +0 -25
  21. package/src/Page1.tsx +0 -67
  22. package/src/events.tsx +0 -227
  23. package/src/index.tsx +0 -21
  24. package/src/lib/SchedulerComponent.tsx +0 -78
  25. package/src/lib/__tests__/index.test.tsx +0 -24
  26. package/src/lib/components/common/Cell.tsx +0 -52
  27. package/src/lib/components/common/LocaleArrow.tsx +0 -38
  28. package/src/lib/components/common/ResourceHeader.tsx +0 -73
  29. package/src/lib/components/common/Tabs.tsx +0 -119
  30. package/src/lib/components/common/TodayTypo.tsx +0 -44
  31. package/src/lib/components/common/WithResources.tsx +0 -98
  32. package/src/lib/components/events/Actions.tsx +0 -65
  33. package/src/lib/components/events/AgendaEventsList.tsx +0 -126
  34. package/src/lib/components/events/CurrentTimeBar.tsx +0 -59
  35. package/src/lib/components/events/EmptyAgenda.tsx +0 -27
  36. package/src/lib/components/events/EventItem.tsx +0 -180
  37. package/src/lib/components/events/EventItemPopover.tsx +0 -179
  38. package/src/lib/components/events/MonthEvents.tsx +0 -141
  39. package/src/lib/components/events/TodayEvents.tsx +0 -99
  40. package/src/lib/components/hoc/DateProvider.tsx +0 -19
  41. package/src/lib/components/inputs/DatePicker.tsx +0 -95
  42. package/src/lib/components/inputs/Input.tsx +0 -113
  43. package/src/lib/components/inputs/SelectInput.tsx +0 -164
  44. package/src/lib/components/month/MonthTable.tsx +0 -207
  45. package/src/lib/components/nav/DayDateBtn.tsx +0 -77
  46. package/src/lib/components/nav/MonthDateBtn.tsx +0 -80
  47. package/src/lib/components/nav/Navigation.tsx +0 -201
  48. package/src/lib/components/nav/WeekDateBtn.tsx +0 -89
  49. package/src/lib/components/week/WeekTable.tsx +0 -229
  50. package/src/lib/helpers/constants.ts +0 -4
  51. package/src/lib/helpers/generals.tsx +0 -354
  52. package/src/lib/hooks/useArrowDisable.ts +0 -26
  53. package/src/lib/hooks/useCellAttributes.ts +0 -67
  54. package/src/lib/hooks/useDragAttributes.ts +0 -31
  55. package/src/lib/hooks/useEventPermissions.ts +0 -42
  56. package/src/lib/hooks/useStore.ts +0 -8
  57. package/src/lib/hooks/useSyncScroll.ts +0 -31
  58. package/src/lib/hooks/useWindowResize.ts +0 -37
  59. package/src/lib/index.tsx +0 -14
  60. package/src/lib/positionManger/context.ts +0 -14
  61. package/src/lib/positionManger/provider.tsx +0 -113
  62. package/src/lib/positionManger/usePosition.ts +0 -8
  63. package/src/lib/store/context.ts +0 -5
  64. package/src/lib/store/default.ts +0 -159
  65. package/src/lib/store/provider.tsx +0 -226
  66. package/src/lib/store/types.ts +0 -40
  67. package/src/lib/styles/styles.ts +0 -256
  68. package/src/lib/types.ts +0 -429
  69. package/src/lib/views/Day.tsx +0 -272
  70. package/src/lib/views/DayAgenda.tsx +0 -57
  71. package/src/lib/views/Editor.tsx +0 -258
  72. package/src/lib/views/Month.tsx +0 -82
  73. package/src/lib/views/MonthAgenda.tsx +0 -84
  74. package/src/lib/views/Week.tsx +0 -92
  75. package/src/lib/views/WeekAgenda.tsx +0 -81
  76. package/src/vite-env.d.ts +0 -3
  77. package/tsconfig.build.json +0 -5
  78. package/tsconfig.json +0 -27
  79. package/vite.config.js +0 -40
@@ -1,272 +0,0 @@
1
- import { useEffect, useCallback, Fragment } from "react";
2
- import { Typography } from "@mui/material";
3
- import {
4
- format,
5
- eachMinuteOfInterval,
6
- isToday,
7
- isBefore,
8
- isAfter,
9
- startOfDay,
10
- endOfDay,
11
- addDays,
12
- addMinutes,
13
- set,
14
- } from "date-fns";
15
- import TodayTypo from "../components/common/TodayTypo";
16
- import EventItem from "../components/events/EventItem";
17
- import { DefaultResource, ProcessedEvent } from "../types";
18
- import {
19
- calcCellHeight,
20
- calcMinuteHeight,
21
- filterMultiDaySlot,
22
- filterTodayEvents,
23
- getHourFormat,
24
- getResourcedEvents,
25
- } from "../helpers/generals";
26
- import { WithResources } from "../components/common/WithResources";
27
- import Cell from "../components/common/Cell";
28
- import TodayEvents from "../components/events/TodayEvents";
29
- import { TableGrid } from "../styles/styles";
30
- import { MULTI_DAY_EVENT_HEIGHT } from "../helpers/constants";
31
- import useStore from "../hooks/useStore";
32
- import { DayAgenda } from "./DayAgenda";
33
-
34
- const Day = () => {
35
- const {
36
- day,
37
- selectedDate,
38
- events,
39
- height,
40
- getRemoteEvents,
41
- triggerLoading,
42
- handleState,
43
- resources,
44
- resourceFields,
45
- resourceViewMode,
46
- fields,
47
- direction,
48
- locale,
49
- hourFormat,
50
- timeZone,
51
- stickyNavigation,
52
- agenda,
53
- stickyNavigationOffset,
54
- stickyNavigationHeight,
55
- currentTime,
56
- showCurrentTimeBar,
57
- currentTimeBarColor,
58
- forceInlineMultiDay,
59
- _refetchToken,
60
- } = useStore();
61
-
62
- const { startHour, endHour, step, cellRenderer, headRenderer, hourRenderer } = day!;
63
- const START_TIME = set(selectedDate, { hours: startHour, minutes: 0, seconds: 0 });
64
- const END_TIME = set(selectedDate, { hours: endHour, minutes: -step, seconds: 0 });
65
- const hours = eachMinuteOfInterval(
66
- {
67
- start: START_TIME,
68
- end: END_TIME,
69
- },
70
- { step: step }
71
- );
72
- const CELL_HEIGHT = calcCellHeight(height, hours.length);
73
- const MINUTE_HEIGHT = calcMinuteHeight(CELL_HEIGHT, step);
74
- const hFormat = getHourFormat(hourFormat);
75
-
76
- const fetchEvents = useCallback(async () => {
77
- try {
78
- triggerLoading(true);
79
- const start = addDays(START_TIME, -1);
80
- const end = addDays(END_TIME, 1);
81
- const events = await getRemoteEvents!({
82
- start,
83
- end,
84
- view: "day",
85
- });
86
- if (events && events?.length) {
87
- handleState(events, "events");
88
- }
89
- } catch (error) {
90
- throw error;
91
- } finally {
92
- triggerLoading(false);
93
- }
94
- }, [getRemoteEvents, _refetchToken, selectedDate]);
95
-
96
- useEffect(() => {
97
- if (getRemoteEvents instanceof Function) {
98
- fetchEvents();
99
- }
100
- }, [fetchEvents, getRemoteEvents, _refetchToken]);
101
-
102
- const renderMultiDayEvents = useCallback(
103
- (events: ProcessedEvent[]) => {
104
- const todayMulti = filterMultiDaySlot(
105
- events,
106
- selectedDate,
107
- timeZone,
108
- undefined,
109
- forceInlineMultiDay
110
- );
111
- return (
112
- <div
113
- className="rs__block_col"
114
- style={{ height: MULTI_DAY_EVENT_HEIGHT * todayMulti.length }}
115
- >
116
- {todayMulti.map((event, i) => {
117
- const hasPrev = isBefore(event.start, startOfDay(selectedDate));
118
- const hasNext = isAfter(event.end, endOfDay(selectedDate));
119
- return (
120
- <div
121
- key={event.event_id}
122
- className="rs__multi_day"
123
- style={{
124
- top: i * MULTI_DAY_EVENT_HEIGHT,
125
- width: "99.9%",
126
- overflowX: "hidden",
127
- }}
128
- >
129
- <EventItem event={event} multiday hasPrev={hasPrev} hasNext={hasNext} />
130
- </div>
131
- );
132
- })}
133
- </div>
134
- );
135
- },
136
- [selectedDate, timeZone]
137
- );
138
-
139
- const renderTable = useCallback(
140
- (resource?: DefaultResource) => {
141
- let resourcedEvents = events;
142
- if (resource) {
143
- resourcedEvents = getResourcedEvents(events, resource, resourceFields, fields);
144
- }
145
-
146
- if (agenda) {
147
- return <DayAgenda resource={resource} events={resourcedEvents} />;
148
- }
149
-
150
- // Equalizing multi-day section height
151
- const shouldEqualize = resources.length && resourceViewMode === "default";
152
- const allWeekMulti = filterMultiDaySlot(
153
- shouldEqualize ? events : resourcedEvents,
154
- selectedDate,
155
- timeZone,
156
- undefined,
157
- forceInlineMultiDay
158
- );
159
- const headerHeight = MULTI_DAY_EVENT_HEIGHT * allWeekMulti.length + 45;
160
- return (
161
- <>
162
- {/* Header */}
163
- <TableGrid
164
- days={1}
165
- sticky="1"
166
- stickyNavigation={stickyNavigation}
167
- stickyOffset={stickyNavigationOffset}
168
- stickyHeight={stickyNavigationHeight}
169
- >
170
- <span className="rs__cell"></span>
171
- <span
172
- className={`rs__cell rs__header ${isToday(selectedDate) ? "rs__today_cell" : ""}`}
173
- style={{ height: headerHeight }}
174
- >
175
- {typeof headRenderer === "function" ? (
176
- <div>{headRenderer({ day: selectedDate, events: resourcedEvents, resource })}</div>
177
- ) : (
178
- <TodayTypo date={selectedDate} locale={locale} />
179
- )}
180
- {renderMultiDayEvents(resourcedEvents)}
181
- </span>
182
- </TableGrid>
183
- <TableGrid days={1}>
184
- {/* Body */}
185
- {hours.map((h, i) => {
186
- const start = new Date(`${format(selectedDate, "yyyy/MM/dd")} ${format(h, hFormat)}`);
187
- const end = addMinutes(start, step);
188
- const field = resourceFields.idField;
189
- return (
190
- <Fragment key={i}>
191
- {/* Time Cells */}
192
- <span className="rs__cell rs__header rs__time" style={{ height: CELL_HEIGHT }}>
193
- {typeof hourRenderer === "function" ? (
194
- <div>{hourRenderer(format(h, hFormat, { locale }))}</div>
195
- ) : (
196
- <Typography variant="caption">{format(h, hFormat, { locale })}</Typography>
197
- )}
198
- </span>
199
- <span className={`rs__cell ${isToday(selectedDate) ? "rs__today_cell" : ""}`}>
200
- {/* Events of this day - run once on the top hour column */}
201
- {i === 0 && (
202
- <TodayEvents
203
- todayEvents={filterTodayEvents(
204
- resourcedEvents,
205
- selectedDate,
206
- timeZone,
207
- forceInlineMultiDay
208
- )}
209
- today={START_TIME}
210
- minuteHeight={MINUTE_HEIGHT}
211
- startHour={startHour}
212
- endHour={endHour}
213
- step={step}
214
- direction={direction}
215
- timeZone={timeZone}
216
- currentTime={currentTime}
217
- showCurrentTimeBar={showCurrentTimeBar}
218
- currentTimeBarColor={currentTimeBarColor}
219
- />
220
- )}
221
- {/* Cell */}
222
- <Cell
223
- start={start}
224
- end={end}
225
- day={selectedDate}
226
- height={CELL_HEIGHT}
227
- resourceKey={field}
228
- resourceVal={resource ? resource[field] : null}
229
- cellRenderer={cellRenderer}
230
- />
231
- </span>
232
- </Fragment>
233
- );
234
- })}
235
- </TableGrid>
236
- </>
237
- );
238
- },
239
- [
240
- CELL_HEIGHT,
241
- MINUTE_HEIGHT,
242
- START_TIME,
243
- agenda,
244
- cellRenderer,
245
- direction,
246
- endHour,
247
- events,
248
- fields,
249
- hFormat,
250
- headRenderer,
251
- hourRenderer,
252
- hours,
253
- locale,
254
- renderMultiDayEvents,
255
- resourceFields,
256
- resourceViewMode,
257
- resources.length,
258
- selectedDate,
259
- startHour,
260
- step,
261
- stickyNavigation,
262
- timeZone,
263
- currentTime,
264
- showCurrentTimeBar,
265
- currentTimeBarColor,
266
- ]
267
- );
268
-
269
- return resources.length ? <WithResources renderChildren={renderTable} /> : renderTable();
270
- };
271
-
272
- export { Day };
@@ -1,57 +0,0 @@
1
- import { useMemo } from "react";
2
- import { format } from "date-fns";
3
- import { AgendaDiv } from "../styles/styles";
4
- import { DefaultResource, ProcessedEvent } from "../types";
5
- import useStore from "../hooks/useStore";
6
- import { Typography } from "@mui/material";
7
- import { filterTodayAgendaEvents } from "../helpers/generals";
8
- import AgendaEventsList from "../components/events/AgendaEventsList";
9
- import EmptyAgenda from "../components/events/EmptyAgenda";
10
-
11
- type Props = {
12
- events: ProcessedEvent[];
13
- resource?: DefaultResource;
14
- };
15
- const DayAgenda = ({ events, resource }: Props) => {
16
- const {
17
- day,
18
- locale,
19
- selectedDate,
20
- translations,
21
- alwaysShowAgendaDays,
22
- stickyNavigationOffset,
23
- stickyNavigationHeight,
24
- } = useStore();
25
- const { headRenderer } = day!;
26
-
27
- const dayEvents = useMemo(() => {
28
- return filterTodayAgendaEvents(events, selectedDate);
29
- }, [events, selectedDate]);
30
-
31
- if (!alwaysShowAgendaDays && !dayEvents.length) {
32
- return <EmptyAgenda />;
33
- }
34
-
35
- return (
36
- <AgendaDiv stickyOffset={stickyNavigationOffset} stickyHeight={stickyNavigationHeight}>
37
- <div className="rs__agenda_row rs__today_cell">
38
- <div className="rs__cell rs__agenda__cell">
39
- {typeof headRenderer === "function" ? (
40
- <div>{headRenderer({ day: selectedDate, events, resource })}</div>
41
- ) : (
42
- <Typography variant="body2">{format(selectedDate, "dd E", { locale })}</Typography>
43
- )}
44
- </div>
45
- <div className="rs__cell rs__agenda_items">
46
- {dayEvents.length > 0 ? (
47
- <AgendaEventsList day={selectedDate} events={dayEvents} />
48
- ) : (
49
- <Typography sx={{ padding: 1 }}>{translations.noDataToDisplay}</Typography>
50
- )}
51
- </div>
52
- </div>
53
- </AgendaDiv>
54
- );
55
- };
56
-
57
- export { DayAgenda };
@@ -1,258 +0,0 @@
1
- import {
2
- Button,
3
- Dialog,
4
- DialogActions,
5
- DialogContent,
6
- DialogTitle,
7
- Grid,
8
- useMediaQuery,
9
- useTheme,
10
- } from "@mui/material";
11
- import { addMinutes, differenceInMinutes } from "date-fns";
12
- import { Fragment, useState } from "react";
13
- import { EditorDatePicker } from "../components/inputs/DatePicker";
14
- import { EditorInput } from "../components/inputs/Input";
15
- import { EditorSelect } from "../components/inputs/SelectInput";
16
- import { arraytizeFieldVal, revertTimeZonedDate } from "../helpers/generals";
17
- import useStore from "../hooks/useStore";
18
- import { SelectedRange } from "../store/types";
19
- import {
20
- EventActions,
21
- FieldInputProps,
22
- FieldProps,
23
- InputTypes,
24
- ProcessedEvent,
25
- SchedulerHelpers,
26
- } from "../types";
27
-
28
- export type StateItem = {
29
- value: any;
30
- validity: boolean;
31
- type: InputTypes;
32
- config?: FieldInputProps;
33
- };
34
-
35
- export type StateEvent = (ProcessedEvent & SelectedRange) | Record<string, any>;
36
-
37
- const initialState = (fields: FieldProps[], event?: StateEvent): Record<string, StateItem> => {
38
- const customFields = {} as Record<string, StateItem>;
39
- for (const field of fields) {
40
- const defVal = arraytizeFieldVal(field, field.default, event);
41
- const eveVal = arraytizeFieldVal(field, event?.[field.name], event);
42
-
43
- customFields[field.name] = {
44
- value: eveVal.value || defVal.value || "",
45
- validity: field.config?.required ? !!eveVal.validity || !!defVal.validity : true,
46
- type: field.type,
47
- config: field.config,
48
- };
49
- }
50
-
51
- return {
52
- event_id: {
53
- value: event?.event_id || null,
54
- validity: true,
55
- type: "hidden",
56
- },
57
- title: {
58
- value: event?.title || "",
59
- validity: !!event?.title,
60
- type: "input",
61
- config: { label: "Title", required: true, min: 3 },
62
- },
63
- subtitle: {
64
- value: event?.subtitle || "",
65
- validity: true,
66
- type: "input",
67
- config: { label: "Subtitle", required: false },
68
- },
69
- start: {
70
- value: event?._originalStart || event?.start || new Date(),
71
- validity: true,
72
- type: "date",
73
- config: { label: "Start", sm: 6 },
74
- },
75
- end: {
76
- value: event?._originalEnd || event?.end || new Date(),
77
- validity: true,
78
- type: "date",
79
- config: { label: "End", sm: 6 },
80
- },
81
- ...customFields,
82
- };
83
- };
84
-
85
- const Editor = () => {
86
- const {
87
- fields,
88
- dialog,
89
- triggerDialog,
90
- selectedRange,
91
- selectedEvent,
92
- resourceFields,
93
- selectedResource,
94
- triggerLoading,
95
- onConfirm,
96
- customEditor,
97
- confirmEvent,
98
- dialogMaxWidth,
99
- translations,
100
- timeZone,
101
- } = useStore();
102
- const [state, setState] = useState(initialState(fields, selectedEvent || selectedRange));
103
- const [touched, setTouched] = useState(false);
104
- const theme = useTheme();
105
- const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
106
-
107
- const handleEditorState = (name: string, value: any, validity: boolean) => {
108
- setState((prev) => {
109
- return {
110
- ...prev,
111
- [name]: { ...prev[name], value, validity },
112
- };
113
- });
114
- };
115
-
116
- const handleClose = (clearState?: boolean) => {
117
- if (clearState) {
118
- setState(initialState(fields));
119
- }
120
- triggerDialog(false);
121
- };
122
-
123
- const handleConfirm = async () => {
124
- let body = {} as ProcessedEvent;
125
- for (const key in state) {
126
- body[key] = state[key].value;
127
- if (!customEditor && !state[key].validity) {
128
- return setTouched(true);
129
- }
130
- }
131
- try {
132
- triggerLoading(true);
133
- // Auto fix date
134
- body.end =
135
- body.start >= body.end
136
- ? addMinutes(body.start, differenceInMinutes(selectedRange?.end!, selectedRange?.start!))
137
- : body.end;
138
- // Specify action
139
- const action: EventActions = selectedEvent?.event_id ? "edit" : "create";
140
- // Trigger custom/remote when provided
141
- if (onConfirm) {
142
- body = await onConfirm(body, action);
143
- } else {
144
- // Create/Edit local data
145
- body.event_id =
146
- selectedEvent?.event_id || Date.now().toString(36) + Math.random().toString(36).slice(2);
147
- }
148
-
149
- body.start = revertTimeZonedDate(body.start, timeZone);
150
- body.end = revertTimeZonedDate(body.end, timeZone);
151
-
152
- confirmEvent(body, action);
153
- handleClose(true);
154
- } catch (error) {
155
- console.error(error);
156
- } finally {
157
- triggerLoading(false);
158
- }
159
- };
160
- const renderInputs = (key: string) => {
161
- const stateItem = state[key];
162
- switch (stateItem.type) {
163
- case "input":
164
- return (
165
- <EditorInput
166
- value={stateItem.value}
167
- name={key}
168
- onChange={handleEditorState}
169
- touched={touched}
170
- {...stateItem.config}
171
- label={translations.event[key] || stateItem.config?.label}
172
- />
173
- );
174
- case "date":
175
- return (
176
- <EditorDatePicker
177
- value={stateItem.value}
178
- name={key}
179
- onChange={(...args) => handleEditorState(...args, true)}
180
- touched={touched}
181
- {...stateItem.config}
182
- label={translations.event[key] || stateItem.config?.label}
183
- />
184
- );
185
- case "select":
186
- const field = fields.find((f) => f.name === key);
187
- return (
188
- <EditorSelect
189
- value={stateItem.value}
190
- name={key}
191
- options={field?.options || []}
192
- onChange={handleEditorState}
193
- touched={touched}
194
- {...stateItem.config}
195
- label={translations.event[key] || stateItem.config?.label}
196
- />
197
- );
198
- default:
199
- return "";
200
- }
201
- };
202
-
203
- const renderEditor = () => {
204
- if (customEditor) {
205
- const schedulerHelpers: SchedulerHelpers = {
206
- state,
207
- close: () => triggerDialog(false),
208
- loading: (load) => triggerLoading(load),
209
- edited: selectedEvent,
210
- onConfirm: confirmEvent,
211
- [resourceFields.idField]: selectedResource,
212
- };
213
- return customEditor(schedulerHelpers);
214
- }
215
- return (
216
- <Fragment>
217
- <DialogTitle>
218
- {selectedEvent ? translations.form.editTitle : translations.form.addTitle}
219
- </DialogTitle>
220
- <DialogContent style={{ overflowX: "hidden" }}>
221
- <Grid container spacing={2}>
222
- {Object.keys(state).map((key) => {
223
- const item = state[key];
224
- return (
225
- <Grid key={key} size={{ sm: item.config?.sm, xs: 12 }}>
226
- {renderInputs(key)}
227
- </Grid>
228
- );
229
- })}
230
- </Grid>
231
- </DialogContent>
232
- <DialogActions>
233
- <Button color="inherit" fullWidth onClick={() => handleClose()}>
234
- {translations.form.cancel}
235
- </Button>
236
- <Button color="primary" fullWidth onClick={handleConfirm}>
237
- {translations.form.confirm}
238
- </Button>
239
- </DialogActions>
240
- </Fragment>
241
- );
242
- };
243
-
244
- return (
245
- <Dialog
246
- open={dialog}
247
- fullScreen={isMobile}
248
- maxWidth={dialogMaxWidth}
249
- onClose={() => {
250
- triggerDialog(false);
251
- }}
252
- >
253
- {renderEditor()}
254
- </Dialog>
255
- );
256
- };
257
-
258
- export default Editor;
@@ -1,82 +0,0 @@
1
- import { useEffect, useCallback } from "react";
2
- import { addDays, eachWeekOfInterval, endOfMonth, startOfMonth } from "date-fns";
3
- import { DefaultResource } from "../types";
4
- import { getResourcedEvents, sortEventsByTheEarliest } from "../helpers/generals";
5
- import { WithResources } from "../components/common/WithResources";
6
- import useStore from "../hooks/useStore";
7
- import { MonthAgenda } from "./MonthAgenda";
8
- import MonthTable from "../components/month/MonthTable";
9
-
10
- const Month = () => {
11
- const {
12
- month,
13
- selectedDate,
14
- events,
15
- getRemoteEvents,
16
- triggerLoading,
17
- handleState,
18
- resources,
19
- resourceFields,
20
- fields,
21
- agenda,
22
- } = useStore();
23
-
24
- const { weekStartOn, weekDays } = month!;
25
- const monthStart = startOfMonth(selectedDate);
26
- const monthEnd = endOfMonth(selectedDate);
27
- const eachWeekStart = eachWeekOfInterval(
28
- {
29
- start: monthStart,
30
- end: monthEnd,
31
- },
32
- { weekStartsOn: weekStartOn }
33
- );
34
- const daysList = weekDays.map((d) => addDays(eachWeekStart[0], d));
35
-
36
- const fetchEvents = useCallback(async () => {
37
- try {
38
- triggerLoading(true);
39
- const start = eachWeekStart[0];
40
- const end = addDays(eachWeekStart[eachWeekStart.length - 1], daysList.length);
41
- const events = await getRemoteEvents!({
42
- start,
43
- end,
44
- view: "month",
45
- });
46
- if (events && events?.length) {
47
- handleState(events, "events");
48
- }
49
- } catch (error) {
50
- throw error;
51
- } finally {
52
- triggerLoading(false);
53
- }
54
- // eslint-disable-next-line react-hooks/exhaustive-deps
55
- }, [daysList.length, getRemoteEvents]);
56
-
57
- useEffect(() => {
58
- if (getRemoteEvents instanceof Function) {
59
- fetchEvents();
60
- }
61
- }, [fetchEvents, getRemoteEvents]);
62
-
63
- const renderTable = useCallback(
64
- (resource?: DefaultResource) => {
65
- if (agenda) {
66
- let resourcedEvents = sortEventsByTheEarliest(events);
67
- if (resource) {
68
- resourcedEvents = getResourcedEvents(events, resource, resourceFields, fields);
69
- }
70
-
71
- return <MonthAgenda resource={resource} events={resourcedEvents} />;
72
- }
73
-
74
- return <MonthTable daysList={daysList} eachWeekStart={eachWeekStart} resource={resource} />;
75
- },
76
- [agenda, daysList, eachWeekStart, events, fields, resourceFields]
77
- );
78
-
79
- return resources.length ? <WithResources renderChildren={renderTable} /> : renderTable();
80
- };
81
-
82
- export { Month };