@koine/react 1.0.13 → 1.0.16
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.
- package/Details/Details.d.ts +6 -12
- package/hooks/useScrollPosition.d.ts +1 -1
- package/node/Alert/Alert.js +14 -0
- package/node/Alert/index.js +4 -0
- package/node/Animations/Reveal.js +21 -0
- package/node/Animations/Underline.js +8 -0
- package/node/Animations/index.js +6 -0
- package/node/Animations/useReveal.js +75 -0
- package/node/Autocomplete/AutocompleteDownshift.js +161 -0
- package/node/Autocomplete/AutocompleteDownshiftMultiselect.js +356 -0
- package/node/Autocomplete/AutocompleteMui.js +180 -0
- package/node/Autocomplete/AutocompleteReach.js +115 -0
- package/node/Autocomplete/components.js +37 -0
- package/node/Autocomplete/helpers.js +32 -0
- package/node/Autocomplete/index.js +7 -0
- package/node/Bg/BgColor.js +25 -0
- package/node/Bg/BgPhoto.js +20 -0
- package/node/Bg/BgSvg.js +16 -0
- package/node/Bg/index.js +6 -0
- package/node/Breadcrumbs/Breadcrumbs.js +31 -0
- package/node/Breadcrumbs/index.js +4 -0
- package/node/Buttons/Button.js +17 -0
- package/node/Buttons/ButtonComposite.js +32 -0
- package/node/Buttons/ButtonFab.js +9 -0
- package/node/Buttons/ButtonLink.js +15 -0
- package/node/Buttons/IconButton.js +10 -0
- package/node/Buttons/index.js +8 -0
- package/node/Calendar/CalendarDaygridCell.js +61 -0
- package/node/Calendar/CalendarDaygridNav.js +28 -0
- package/node/Calendar/CalendarDaygridTable.js +61 -0
- package/node/Calendar/CalendarLegend.js +20 -0
- package/node/Calendar/calendar-api-google.js +131 -0
- package/node/Calendar/index.js +9 -0
- package/node/Calendar/types.js +2 -0
- package/node/Calendar/useCalendar.js +187 -0
- package/node/Calendar/utils.js +215 -0
- package/node/Carousel/Carousel.js +381 -0
- package/node/Carousel/CarouselCss.js +27 -0
- package/node/Carousel/index.js +4 -0
- package/node/Collapsable/Collapsable.js +4 -0
- package/node/Collapsable/CollapsableReach.js +253 -0
- package/node/Collapsable/index.js +5 -0
- package/node/Debug/Debug.js +13 -0
- package/node/Debug/index.js +4 -0
- package/node/Details/Details.js +67 -0
- package/node/Details/index.js +4 -0
- package/node/Dialog/DialogMui.js +83 -0
- package/node/Dialog/css/bare.js +24 -0
- package/node/Dialog/index.js +5 -0
- package/node/Dialog/m/bare.js +55 -0
- package/node/Dialog/m/basic.js +35 -0
- package/node/Dialog/m/index.js +8 -0
- package/node/Dialog/sc/bare.js +46 -0
- package/node/Dialog/sc/framer.js +19 -0
- package/node/Dialog/sc/framerMaterial.js +19 -0
- package/node/Dialog/sc/material.js +24 -0
- package/node/Dialog/tw/bare.js +45 -0
- package/node/Dialog/tw/elegant.js +23 -0
- package/node/Dialog/tw/framer.js +19 -0
- package/node/Dialog/tw/framerMaterial.js +19 -0
- package/node/Dialog/tw/material.js +23 -0
- package/node/Editor/Editor--tiptap.js +31 -0
- package/node/Editor/components.js +15 -0
- package/node/Editor/index.js +4 -0
- package/node/Favicon/FaviconTags.js +19 -0
- package/node/Favicon/index.js +4 -0
- package/node/Form/Form.js +65 -0
- package/node/Form/index.js +4 -0
- package/node/Form/sc/bare.js +23 -0
- package/node/Forms/Checkbox/Checkbox.js +21 -0
- package/node/Forms/Checkbox/index.js +4 -0
- package/node/Forms/Feedback/Feedback.js +13 -0
- package/node/Forms/Feedback/index.js +4 -0
- package/node/Forms/Field/Field.js +52 -0
- package/node/Forms/Field/FieldControl.js +51 -0
- package/node/Forms/Field/FieldHint.js +7 -0
- package/node/Forms/Field/index.js +5 -0
- package/node/Forms/Input/Input.js +20 -0
- package/node/Forms/Input/index.js +4 -0
- package/node/Forms/InputGroup/InputGroup.js +19 -0
- package/node/Forms/InputGroup/index.js +4 -0
- package/node/Forms/Label/Label.js +9 -0
- package/node/Forms/Label/index.js +4 -0
- package/node/Forms/Password/Password.js +20 -0
- package/node/Forms/Password/index.js +4 -0
- package/node/Forms/Radio/Radio.js +28 -0
- package/node/Forms/Radio/index.js +4 -0
- package/node/Forms/Switch/Switch.js +23 -0
- package/node/Forms/Switch/index.js +4 -0
- package/node/Forms/Textarea/Textarea.js +15 -0
- package/node/Forms/Textarea/TextareaRich.js +31 -0
- package/node/Forms/Textarea/index.js +5 -0
- package/node/Forms/Toggle/Toggle.js +37 -0
- package/node/Forms/Toggle/index.js +4 -0
- package/node/Forms/Toggle/useToggle.js +149 -0
- package/node/Forms/antispam.js +61 -0
- package/node/Forms/helpers.js +52 -0
- package/node/Forms/index.js +19 -0
- package/node/Forms/styles.js +32 -0
- package/node/Gauge/Gauge.js +106 -0
- package/node/Grid/Grid.js +56 -0
- package/node/Grid/index.js +4 -0
- package/node/Hamburger/Hamburger.js +56 -0
- package/node/Hamburger/index.js +4 -0
- package/node/Header/index.js +4 -0
- package/node/Header/useHeader.js +34 -0
- package/node/Hidden/Hidden.js +13 -0
- package/node/Hidden/index.js +4 -0
- package/node/Img/index.js +4 -0
- package/node/Img/sc/bare.js +42 -0
- package/node/Img/types.js +2 -0
- package/node/Link/Link.js +7 -0
- package/node/Link/LinkBlank.js +21 -0
- package/node/Link/index.js +5 -0
- package/node/Menu/Menu.js +7 -0
- package/node/Menu/index.js +4 -0
- package/node/MenuItem/MenuItem.js +7 -0
- package/node/MenuItem/index.js +4 -0
- package/node/Meta/Meta.js +9 -0
- package/node/Meta/index.js +4 -0
- package/node/NoJs/NoJs.js +10 -0
- package/node/NoJs/index.js +4 -0
- package/node/Pagination/PaginationNav.js +65 -0
- package/node/Pagination/PaginationResults.js +15 -0
- package/node/Pagination/index.js +5 -0
- package/node/Pill/Pill.js +10 -0
- package/node/Pill/index.js +4 -0
- package/node/Progress/ProgressCircular.js +19 -0
- package/node/Progress/ProgressLinear.js +28 -0
- package/node/Progress/ProgressOverlay.js +28 -0
- package/node/Progress/index.js +6 -0
- package/node/Rating/Rating.js +76 -0
- package/node/Rating/index.js +57 -0
- package/node/Select/SelectDownshift.js +41 -0
- package/node/Select/components.js +15 -0
- package/node/Select/index.js +7 -0
- package/node/Sidebar/Sidebar.js +27 -0
- package/node/Sidebar/index.js +4 -0
- package/node/Spacing/Spacing.js +49 -0
- package/node/Spacing/index.js +4 -0
- package/node/Sticky/Sticky.js +222 -0
- package/node/Sticky/StickyCss.js +10 -0
- package/node/Sticky/index.js +4 -0
- package/node/Tabs/TabsMui.js +49 -0
- package/node/Tabs/index.js +4 -0
- package/node/Tabs/sc/bare.js +87 -0
- package/node/Tabs/tw/bare.js +20 -0
- package/node/Tabs/tw/material.js +21 -0
- package/node/Tabs/useTabs.js +48 -0
- package/node/Typography/CopyPasteVisible.js +7 -0
- package/node/Typography/Native.js +17 -0
- package/node/Typography/ReadMore.js +47 -0
- package/node/Typography/TextLoop.js +51 -0
- package/node/Typography/TypeStairs.js +53 -0
- package/node/Typography/index.js +8 -0
- package/node/css/index.js +36 -0
- package/node/helpers/classed.js +72 -0
- package/node/helpers/extend-component.js +16 -0
- package/node/helpers/index.js +5 -0
- package/node/hooks/index.js +18 -0
- package/node/hooks/types.js +2 -0
- package/node/hooks/useAsyncFn.js +40 -0
- package/node/hooks/useDateLocale.js +42 -0
- package/node/hooks/useEffectOnce.js +12 -0
- package/node/hooks/useFirstMountState.js +16 -0
- package/node/hooks/useFocus.js +15 -0
- package/node/hooks/useId.js +12 -0
- package/node/hooks/useIsomorphicLayoutEffect.js +11 -0
- package/node/hooks/useMount.js +13 -0
- package/node/hooks/useMountedState.js +19 -0
- package/node/hooks/usePrevious.js +12 -0
- package/node/hooks/useScrollPosition.js +84 -0
- package/node/hooks/useScrollTo.js +25 -0
- package/node/hooks/useTraceUpdate.js +25 -0
- package/node/hooks/useUpdateEffect.js +18 -0
- package/node/hooks/useWindowSize.js +17 -0
- package/node/index.js +8 -0
- package/node/m/MotionProvider.js +43 -0
- package/node/m/index.js +9 -0
- package/node/m/lite.js +4 -0
- package/node/m/max.js +4 -0
- package/node/sc/index.js +37 -0
- package/node/scm/index.js +36 -0
- package/node/shared/index.js +11 -0
- package/node/styles/Body.js +16 -0
- package/node/styles/Global.js +21 -0
- package/node/styles/index.js +10 -0
- package/node/styles/media.js +160 -0
- package/node/styles/spacing.js +52 -0
- package/node/styles/styled.js +17 -0
- package/node/styles/theme--vanilla.js +61 -0
- package/node/styles/theme.js +45 -0
- package/node/tw/index.js +36 -0
- package/node/twm/index.js +36 -0
- package/node/types.js +2 -0
- package/package.json +2 -1
- package/styles/theme--vanilla.d.ts +1 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCalendarsEventsFromGoogle = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var utils_1 = require("@koine/utils");
|
|
6
|
+
var differenceInDays_1 = tslib_1.__importDefault(require("date-fns/differenceInDays"));
|
|
7
|
+
var subDays_1 = tslib_1.__importDefault(require("date-fns/subDays"));
|
|
8
|
+
var utils_2 = require("./utils");
|
|
9
|
+
var baseURL = "https://www.googleapis.com/calendar/v3/calendars/";
|
|
10
|
+
function getCalendarsEventsFromGoogle(_a) {
|
|
11
|
+
var calendars = _a.calendars, options = tslib_1.__rest(_a, ["calendars"]);
|
|
12
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
13
|
+
var allEvents;
|
|
14
|
+
var _this = this;
|
|
15
|
+
return tslib_1.__generator(this, function (_b) {
|
|
16
|
+
switch (_b.label) {
|
|
17
|
+
case 0:
|
|
18
|
+
allEvents = {};
|
|
19
|
+
return [4 /*yield*/, Promise.all(calendars.map(function (calendar) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
20
|
+
var events;
|
|
21
|
+
return tslib_1.__generator(this, function (_a) {
|
|
22
|
+
switch (_a.label) {
|
|
23
|
+
case 0: return [4 /*yield*/, getCalendarEventsFromGoogle(tslib_1.__assign({ calendar: calendar }, options))];
|
|
24
|
+
case 1:
|
|
25
|
+
events = _a.sent();
|
|
26
|
+
(0, utils_2.addCalendarEvents)(events, allEvents);
|
|
27
|
+
return [2 /*return*/];
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}); }))];
|
|
31
|
+
case 1:
|
|
32
|
+
_b.sent();
|
|
33
|
+
return [2 /*return*/, allEvents];
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
exports.getCalendarsEventsFromGoogle = getCalendarsEventsFromGoogle;
|
|
39
|
+
function getCalendarEventsFromGoogle(_a) {
|
|
40
|
+
var apiKey = _a.apiKey, calendar = _a.calendar, _b = _a.timeZone, timeZone = _b === void 0 ? "" : _b, start = _a.start, end = _a.end;
|
|
41
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
42
|
+
var events, params, url, response, data, e_1;
|
|
43
|
+
return tslib_1.__generator(this, function (_c) {
|
|
44
|
+
switch (_c.label) {
|
|
45
|
+
case 0:
|
|
46
|
+
events = {};
|
|
47
|
+
params = new URLSearchParams({
|
|
48
|
+
calendarId: calendar.id,
|
|
49
|
+
timeZone: timeZone,
|
|
50
|
+
singleEvents: "true",
|
|
51
|
+
maxAttendees: "1",
|
|
52
|
+
maxResults: "9999",
|
|
53
|
+
sanitizeHtml: "true",
|
|
54
|
+
timeMin: start.toISOString(),
|
|
55
|
+
timeMax: end.toISOString(),
|
|
56
|
+
key: apiKey || process.env["GOOGLE_CALENDAR_API_KEY"] || "",
|
|
57
|
+
}).toString();
|
|
58
|
+
url = baseURL + calendar.id + "/events?" + params;
|
|
59
|
+
_c.label = 1;
|
|
60
|
+
case 1:
|
|
61
|
+
_c.trys.push([1, 4, , 5]);
|
|
62
|
+
return [4 /*yield*/, fetch(url, { method: "GET" })];
|
|
63
|
+
case 2:
|
|
64
|
+
response = _c.sent();
|
|
65
|
+
return [4 /*yield*/, response.json()];
|
|
66
|
+
case 3:
|
|
67
|
+
data = (_c.sent());
|
|
68
|
+
calendar.name = calendar.name || data.summary;
|
|
69
|
+
data.items.forEach(function (googleEvent) {
|
|
70
|
+
var event = transformCalendarEventFromGoogle(googleEvent, calendar);
|
|
71
|
+
events[event.uid] = event;
|
|
72
|
+
});
|
|
73
|
+
return [3 /*break*/, 5];
|
|
74
|
+
case 4:
|
|
75
|
+
e_1 = _c.sent();
|
|
76
|
+
return [3 /*break*/, 5];
|
|
77
|
+
case 5: return [2 /*return*/, events];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function transformCalendarEventFromGoogle(event, calendar) {
|
|
83
|
+
var created = new Date(event.created);
|
|
84
|
+
var link = event.htmlLink;
|
|
85
|
+
var title = event.summary;
|
|
86
|
+
var status = event.status;
|
|
87
|
+
var start = new Date(event.start.date || event.start.dateTime);
|
|
88
|
+
var end = new Date(event.end.date || event.end.dateTime);
|
|
89
|
+
var color = calendar.color;
|
|
90
|
+
var allDay = (0, utils_1.isUndefined)(event.end.dateTime) && (0, utils_1.isString)(event.end.date);
|
|
91
|
+
var location = event.location || "";
|
|
92
|
+
var description = event.description || ""; // FIXME: he.decode(event.description || '');
|
|
93
|
+
var uid = created.getTime() + "" + start.getTime();
|
|
94
|
+
// multi-days all day events has as end date the date after to what we actually
|
|
95
|
+
// mean, hence we subtract one day. @see https://support.google.com/calendar/thread/10074544/google-calendar-all-day-events-are-showing-up-as-a-24-hr-event-across-time-zones?hl=en
|
|
96
|
+
if (allDay && end > start) {
|
|
97
|
+
end = (0, subDays_1.default)(end, 1);
|
|
98
|
+
end.setHours(23, 59, 59);
|
|
99
|
+
}
|
|
100
|
+
var days = getDays();
|
|
101
|
+
var daysMap = (0, utils_1.arrayToLookup)(days);
|
|
102
|
+
var multi = days.length > 1;
|
|
103
|
+
function getDays() {
|
|
104
|
+
var from = new Date(start);
|
|
105
|
+
var to = new Date(end);
|
|
106
|
+
var days = [(0, utils_2.getEventTimestamp)(from)];
|
|
107
|
+
while ((0, differenceInDays_1.default)(to, from)) {
|
|
108
|
+
// console.log(title, differenceInDays(to, from))
|
|
109
|
+
from.setDate(from.getDate() + 1);
|
|
110
|
+
days.push((0, utils_2.getEventTimestamp)(from));
|
|
111
|
+
}
|
|
112
|
+
return days;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
calendar: calendar,
|
|
116
|
+
created: created,
|
|
117
|
+
link: link,
|
|
118
|
+
title: title,
|
|
119
|
+
status: status,
|
|
120
|
+
start: start,
|
|
121
|
+
end: end,
|
|
122
|
+
days: days,
|
|
123
|
+
daysMap: daysMap,
|
|
124
|
+
multi: multi,
|
|
125
|
+
color: color,
|
|
126
|
+
allDay: allDay,
|
|
127
|
+
location: location,
|
|
128
|
+
description: description,
|
|
129
|
+
uid: uid,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./CalendarDaygridCell"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./CalendarDaygridNav"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./CalendarDaygridTable"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./CalendarLegend"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./useCalendar"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCalendar = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = require("react");
|
|
6
|
+
var calendar_api_google_1 = require("./calendar-api-google");
|
|
7
|
+
var utils_1 = require("./utils");
|
|
8
|
+
function useCalendar(_a) {
|
|
9
|
+
var _this = this;
|
|
10
|
+
var locale = _a.locale, apiKey = _a.apiKey, calendars = _a.calendars, initialEvents = _a.events, initialStart = _a.start, initialEnd = _a.end, _b = _a.view, initialView = _b === void 0 ? "month" : _b, _c = _a.timeZone, timeZone = _c === void 0 ? "" : _c, onError = _a.onError;
|
|
11
|
+
var _d = (0, react_1.useState)(initialView), view = _d[0], setView = _d[1];
|
|
12
|
+
var start = initialStart || (0, utils_1.getStartDate)(new Date(), view);
|
|
13
|
+
var end = initialEnd || (0, utils_1.getEndDate)(start, view);
|
|
14
|
+
var _e = (0, react_1.useState)([start, end]), range = _e[0], setRange = _e[1];
|
|
15
|
+
var _f = (0, react_1.useState)((0, utils_1.isTodayInView)(start, end)), todayInView = _f[0], setTodayInView = _f[1];
|
|
16
|
+
var _g = (0, react_1.useState)(initialEvents || {}), events = _g[0], setEvents = _g[1];
|
|
17
|
+
var _h = (0, react_1.useState)(null), eventHovered = _h[0], setEventHovered = _h[1];
|
|
18
|
+
var _j = (0, react_1.useState)(null), eventClicked = _j[0], setEventClicked = _j[1];
|
|
19
|
+
var _k = (0, react_1.useReducer)(function (state, action) {
|
|
20
|
+
var _a;
|
|
21
|
+
var type = action.type;
|
|
22
|
+
switch (type) {
|
|
23
|
+
case "events": {
|
|
24
|
+
var events_1 = action.payload;
|
|
25
|
+
return Object.entries(state).reduce(function (map, _a) {
|
|
26
|
+
var id = _a[0], calendar = _a[1];
|
|
27
|
+
map[id] = tslib_1.__assign(tslib_1.__assign({}, calendar), { events: events_1[id] || 0 });
|
|
28
|
+
return map;
|
|
29
|
+
}, {});
|
|
30
|
+
}
|
|
31
|
+
case "visibility": {
|
|
32
|
+
var visible_1 = action.payload;
|
|
33
|
+
if (typeof visible_1 === "string") {
|
|
34
|
+
return tslib_1.__assign(tslib_1.__assign({}, state), (_a = {}, _a[visible_1] = tslib_1.__assign(tslib_1.__assign({}, state[visible_1]), { on: !state[visible_1].on }), _a));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return Object.entries(state).reduce(function (map, _a) {
|
|
38
|
+
var id = _a[0], calendar = _a[1];
|
|
39
|
+
map[id] = tslib_1.__assign(tslib_1.__assign({}, calendar), { on: visible_1.indexOf(id) > -1 });
|
|
40
|
+
return map;
|
|
41
|
+
}, {});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
default:
|
|
45
|
+
return state;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
// initial state
|
|
49
|
+
calendars.reduce(function (map, calendar) {
|
|
50
|
+
map[calendar.id] = tslib_1.__assign(tslib_1.__assign({}, calendar), { name: calendar.name || "", on: true, events: 0 });
|
|
51
|
+
return map;
|
|
52
|
+
}, {})), calendarsMap = _k[0], updateCalendars = _k[1];
|
|
53
|
+
var toggleCalendarVisibility = (0, react_1.useCallback)(function (idOrIds) {
|
|
54
|
+
updateCalendars({ type: "visibility", payload: idOrIds });
|
|
55
|
+
}, [updateCalendars]);
|
|
56
|
+
var updateCalendarsBasedOnEvents = (0, react_1.useCallback)(function (events) {
|
|
57
|
+
var payload = {};
|
|
58
|
+
for (var uid in events) {
|
|
59
|
+
var id = events[uid].calendar.id;
|
|
60
|
+
payload[id] = payload[id] || 0;
|
|
61
|
+
payload[id]++;
|
|
62
|
+
}
|
|
63
|
+
updateCalendars({ type: "events", payload: payload });
|
|
64
|
+
}, []);
|
|
65
|
+
var loadCalendars = (0, react_1.useCallback)(function (calendars, start, end) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
66
|
+
var newEvents, e_1;
|
|
67
|
+
return tslib_1.__generator(this, function (_a) {
|
|
68
|
+
switch (_a.label) {
|
|
69
|
+
case 0:
|
|
70
|
+
_a.trys.push([0, 2, , 3]);
|
|
71
|
+
return [4 /*yield*/, (0, calendar_api_google_1.getCalendarsEventsFromGoogle)({
|
|
72
|
+
apiKey: apiKey,
|
|
73
|
+
calendars: calendars,
|
|
74
|
+
timeZone: timeZone,
|
|
75
|
+
start: start,
|
|
76
|
+
end: end,
|
|
77
|
+
})];
|
|
78
|
+
case 1:
|
|
79
|
+
newEvents = _a.sent();
|
|
80
|
+
// setEvents(mergeCalendarEvents(events, newEvents));
|
|
81
|
+
setEvents(newEvents);
|
|
82
|
+
return [3 /*break*/, 3];
|
|
83
|
+
case 2:
|
|
84
|
+
e_1 = _a.sent();
|
|
85
|
+
if (onError)
|
|
86
|
+
onError(e_1);
|
|
87
|
+
return [3 /*break*/, 3];
|
|
88
|
+
case 3: return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}); }, [setEvents, apiKey, timeZone, onError]);
|
|
92
|
+
var handleToday = (0, react_1.useCallback)(function () {
|
|
93
|
+
var start = range[0], end = range[1];
|
|
94
|
+
var newStart = (0, utils_1.getStartDate)(new Date(), view);
|
|
95
|
+
var newEnd = (0, utils_1.getEndDate)(newStart, view);
|
|
96
|
+
setRange([newStart, newEnd]);
|
|
97
|
+
// reset event only if we are not on the current view already
|
|
98
|
+
if (start.getTime() !== newStart.getTime() ||
|
|
99
|
+
end.getTime() !== newEnd.getTime()) {
|
|
100
|
+
setEventClicked(null);
|
|
101
|
+
setEventHovered(null);
|
|
102
|
+
}
|
|
103
|
+
}, [view, range]);
|
|
104
|
+
var handlePrev = (0, react_1.useCallback)(function () {
|
|
105
|
+
setRange(function (_a) {
|
|
106
|
+
var start = _a[0];
|
|
107
|
+
var newStart = (0, utils_1.getPrevDate)(start, view);
|
|
108
|
+
var newEnd = (0, utils_1.getEndDate)(newStart, view);
|
|
109
|
+
return [newStart, newEnd];
|
|
110
|
+
});
|
|
111
|
+
setEventClicked(null);
|
|
112
|
+
setEventHovered(null);
|
|
113
|
+
}, [view]);
|
|
114
|
+
var handleNext = (0, react_1.useCallback)(function () {
|
|
115
|
+
setRange(function (_a) {
|
|
116
|
+
var start = _a[0];
|
|
117
|
+
var newStart = (0, utils_1.getNextDate)(start, view);
|
|
118
|
+
var newEnd = (0, utils_1.getEndDate)(newStart, view);
|
|
119
|
+
return [newStart, newEnd];
|
|
120
|
+
});
|
|
121
|
+
setEventClicked(null);
|
|
122
|
+
setEventHovered(null);
|
|
123
|
+
}, [view]);
|
|
124
|
+
var handleView = (0, react_1.useCallback)(function (newView) {
|
|
125
|
+
var newStart = (0, utils_1.getStartDate)(start, newView);
|
|
126
|
+
var newEnd = (0, utils_1.getEndDate)(newStart, newView);
|
|
127
|
+
setRange([newStart, newEnd]);
|
|
128
|
+
setView(newView);
|
|
129
|
+
setEventClicked(null);
|
|
130
|
+
setEventHovered(null);
|
|
131
|
+
}, [start]);
|
|
132
|
+
(0, react_1.useEffect)(function () {
|
|
133
|
+
var start = range[0], end = range[1];
|
|
134
|
+
loadCalendars(calendars, start, end);
|
|
135
|
+
setTodayInView((0, utils_1.isTodayInView)(start, end));
|
|
136
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
137
|
+
}, [range]);
|
|
138
|
+
(0, react_1.useEffect)(function () {
|
|
139
|
+
if (events) {
|
|
140
|
+
updateCalendarsBasedOnEvents(events);
|
|
141
|
+
}
|
|
142
|
+
}, [events, updateCalendarsBasedOnEvents]);
|
|
143
|
+
// when toggling a calendar we also remove the clicked event if that belongs
|
|
144
|
+
// to a now hidden calendar
|
|
145
|
+
(0, react_1.useEffect)(function () {
|
|
146
|
+
if (eventClicked) {
|
|
147
|
+
if (!calendarsMap[eventClicked.calendar.id].on) {
|
|
148
|
+
setEventClicked(null);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}, [calendarsMap, eventClicked, setEventClicked]);
|
|
152
|
+
return {
|
|
153
|
+
view: view,
|
|
154
|
+
eventClicked: eventClicked,
|
|
155
|
+
setEventClicked: setEventClicked,
|
|
156
|
+
eventHovered: eventHovered,
|
|
157
|
+
setEventHovered: setEventHovered,
|
|
158
|
+
getDaygridNavProps: function () { return ({
|
|
159
|
+
locale: locale,
|
|
160
|
+
handlePrev: handlePrev,
|
|
161
|
+
handleNext: handleNext,
|
|
162
|
+
handleToday: handleToday,
|
|
163
|
+
handleView: handleView,
|
|
164
|
+
todayInView: todayInView,
|
|
165
|
+
range: range,
|
|
166
|
+
view: view,
|
|
167
|
+
}); },
|
|
168
|
+
getDaygridTableProps: function () { return ({
|
|
169
|
+
locale: locale,
|
|
170
|
+
events: events,
|
|
171
|
+
eventClicked: eventClicked,
|
|
172
|
+
setEventClicked: setEventClicked,
|
|
173
|
+
eventHovered: eventHovered,
|
|
174
|
+
setEventHovered: setEventHovered,
|
|
175
|
+
handlePrev: handlePrev,
|
|
176
|
+
handleNext: handleNext,
|
|
177
|
+
calendarsMap: calendarsMap,
|
|
178
|
+
range: range,
|
|
179
|
+
view: view,
|
|
180
|
+
}); },
|
|
181
|
+
getLegendProps: function () { return ({
|
|
182
|
+
calendarsMap: calendarsMap,
|
|
183
|
+
toggleCalendarVisibility: toggleCalendarVisibility,
|
|
184
|
+
}); },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
exports.useCalendar = useCalendar;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processEventsInView = exports.addCalendarEvents = exports.mergeCalendarEvents = exports.isTodayInView = exports.getNextDate = exports.getPrevDate = exports.getEndDate = exports.getStartDate = exports.getDisplayTime = exports.getEventTimestamp = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var isWithinInterval_1 = tslib_1.__importDefault(require("date-fns/isWithinInterval"));
|
|
6
|
+
var endOfMonth_1 = tslib_1.__importDefault(require("date-fns/endOfMonth"));
|
|
7
|
+
var startOfWeek_1 = tslib_1.__importDefault(require("date-fns/startOfWeek"));
|
|
8
|
+
var endOfWeek_1 = tslib_1.__importDefault(require("date-fns/endOfWeek"));
|
|
9
|
+
var subMonths_1 = tslib_1.__importDefault(require("date-fns/subMonths"));
|
|
10
|
+
var addMonths_1 = tslib_1.__importDefault(require("date-fns/addMonths"));
|
|
11
|
+
var subWeeks_1 = tslib_1.__importDefault(require("date-fns/subWeeks"));
|
|
12
|
+
var addWeeks_1 = tslib_1.__importDefault(require("date-fns/addWeeks"));
|
|
13
|
+
var addDays_1 = tslib_1.__importDefault(require("date-fns/addDays"));
|
|
14
|
+
function getEventTimestamp(dateLike) {
|
|
15
|
+
var date = new Date(dateLike);
|
|
16
|
+
date.setHours(0, 0, 0, 0);
|
|
17
|
+
return date.valueOf() / 1000;
|
|
18
|
+
}
|
|
19
|
+
exports.getEventTimestamp = getEventTimestamp;
|
|
20
|
+
function getDisplayTime(date) {
|
|
21
|
+
return (date.getHours() +
|
|
22
|
+
":" +
|
|
23
|
+
"0".repeat(2 - date.getMinutes().toString().length) +
|
|
24
|
+
date.getMinutes());
|
|
25
|
+
}
|
|
26
|
+
exports.getDisplayTime = getDisplayTime;
|
|
27
|
+
function getStartDate(date, view) {
|
|
28
|
+
date.setHours(0, 0, 0);
|
|
29
|
+
if (view === "month") {
|
|
30
|
+
date.setDate(1);
|
|
31
|
+
}
|
|
32
|
+
else if (view === "week") {
|
|
33
|
+
date = (0, startOfWeek_1.default)(date, { weekStartsOn: 1 });
|
|
34
|
+
}
|
|
35
|
+
return date;
|
|
36
|
+
}
|
|
37
|
+
exports.getStartDate = getStartDate;
|
|
38
|
+
function getEndDate(start, view) {
|
|
39
|
+
var end = start;
|
|
40
|
+
if (view === "month") {
|
|
41
|
+
end = (0, endOfMonth_1.default)(start);
|
|
42
|
+
}
|
|
43
|
+
else if (view === "week") {
|
|
44
|
+
end = (0, endOfWeek_1.default)(start, { weekStartsOn: 1 });
|
|
45
|
+
}
|
|
46
|
+
end.setHours(23, 59, 59);
|
|
47
|
+
return end;
|
|
48
|
+
}
|
|
49
|
+
exports.getEndDate = getEndDate;
|
|
50
|
+
function getPrevDate(date, view) {
|
|
51
|
+
if (view === "month") {
|
|
52
|
+
return (0, subMonths_1.default)(date, 1);
|
|
53
|
+
}
|
|
54
|
+
return (0, subWeeks_1.default)(date, 1);
|
|
55
|
+
}
|
|
56
|
+
exports.getPrevDate = getPrevDate;
|
|
57
|
+
function getNextDate(date, view) {
|
|
58
|
+
if (view === "month") {
|
|
59
|
+
return (0, addMonths_1.default)(date, 1);
|
|
60
|
+
}
|
|
61
|
+
return (0, addWeeks_1.default)(date, 1);
|
|
62
|
+
}
|
|
63
|
+
exports.getNextDate = getNextDate;
|
|
64
|
+
function isTodayInView(start, end) {
|
|
65
|
+
return (0, isWithinInterval_1.default)(new Date(), { start: start, end: end });
|
|
66
|
+
}
|
|
67
|
+
exports.isTodayInView = isTodayInView;
|
|
68
|
+
function mergeCalendarEvents(first, second) {
|
|
69
|
+
var all = {};
|
|
70
|
+
addCalendarEvents(first, all);
|
|
71
|
+
addCalendarEvents(second, all);
|
|
72
|
+
return all;
|
|
73
|
+
}
|
|
74
|
+
exports.mergeCalendarEvents = mergeCalendarEvents;
|
|
75
|
+
function addCalendarEvents(toAdd, toExtend) {
|
|
76
|
+
for (var id in toAdd) {
|
|
77
|
+
var event_1 = toAdd[id];
|
|
78
|
+
toExtend[id] = event_1;
|
|
79
|
+
}
|
|
80
|
+
return toExtend;
|
|
81
|
+
}
|
|
82
|
+
exports.addCalendarEvents = addCalendarEvents;
|
|
83
|
+
function getEventsByTimestamp(events) {
|
|
84
|
+
var output = {};
|
|
85
|
+
var _loop_1 = function (uid) {
|
|
86
|
+
var event_2 = events[uid];
|
|
87
|
+
event_2.days.forEach(function (timestamp) {
|
|
88
|
+
output[timestamp] = (output[timestamp] || {});
|
|
89
|
+
output[timestamp][uid] = event_2;
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
for (var uid in events) {
|
|
93
|
+
_loop_1(uid);
|
|
94
|
+
}
|
|
95
|
+
return output;
|
|
96
|
+
}
|
|
97
|
+
function getSortedEvents(events) {
|
|
98
|
+
var output = [];
|
|
99
|
+
for (var uid in events) {
|
|
100
|
+
output.push(events[uid]);
|
|
101
|
+
}
|
|
102
|
+
// sort events first multi, then all day then by start then by created date
|
|
103
|
+
output.sort(function (a, b) {
|
|
104
|
+
var multi = Number(b.multi) - Number(a.multi);
|
|
105
|
+
var allDay = Number(b.allDay) - Number(a.allDay);
|
|
106
|
+
var start = a.start.getTime() - b.start.getTime();
|
|
107
|
+
var created = a.created.getTime() - b.created.getTime();
|
|
108
|
+
return multi || allDay || start || created;
|
|
109
|
+
});
|
|
110
|
+
return output;
|
|
111
|
+
}
|
|
112
|
+
var FREE_SLOT = 0;
|
|
113
|
+
var BUSY_SLOT = 1;
|
|
114
|
+
function processEventsInView(eventsMap, calendarView, month, weeks) {
|
|
115
|
+
var eventsByTimestamp = getEventsByTimestamp(eventsMap);
|
|
116
|
+
var eventsList = getSortedEvents(eventsMap);
|
|
117
|
+
var todayDate = new Date();
|
|
118
|
+
var todayTimestamp = getEventTimestamp(todayDate);
|
|
119
|
+
var startedAtTopMap = {};
|
|
120
|
+
var viewWeeks = [];
|
|
121
|
+
var _loop_2 = function (weekIdx) {
|
|
122
|
+
var viewWeek = {
|
|
123
|
+
props: { key: "week.".concat(weekIdx) },
|
|
124
|
+
days: [],
|
|
125
|
+
};
|
|
126
|
+
var weekStartDate = weeks[weekIdx];
|
|
127
|
+
var weekStartDay = weekStartDate.getDate();
|
|
128
|
+
var weekStartTimestamp = getEventTimestamp(new Date(weekStartDate));
|
|
129
|
+
var weekEndTimestamp = getEventTimestamp((0, addDays_1.default)(new Date(weekStartDate), 6));
|
|
130
|
+
for (var dayNumber = 0; dayNumber < 7; dayNumber++) {
|
|
131
|
+
var dayDate = new Date(new Date(weekStartDate).setDate(weekStartDay + dayNumber));
|
|
132
|
+
var dayTimestamp = getEventTimestamp(dayDate);
|
|
133
|
+
var $isToday = todayTimestamp === dayTimestamp;
|
|
134
|
+
var $isOutOfRange = calendarView === "month" && dayDate.getMonth() !== month;
|
|
135
|
+
var contextualProps = {
|
|
136
|
+
$isToday: $isToday,
|
|
137
|
+
$isOutOfRange: $isOutOfRange,
|
|
138
|
+
};
|
|
139
|
+
var viewDay = {
|
|
140
|
+
props: tslib_1.__assign({ key: "day.".concat(dayTimestamp) }, contextualProps),
|
|
141
|
+
timestamp: dayTimestamp + "",
|
|
142
|
+
label: dayDate.getDate() + "",
|
|
143
|
+
events: [],
|
|
144
|
+
};
|
|
145
|
+
// check that we have events in this day
|
|
146
|
+
if (eventsByTimestamp === null || eventsByTimestamp === void 0 ? void 0 : eventsByTimestamp[dayTimestamp]) {
|
|
147
|
+
var verticalSlots = Object.keys(eventsByTimestamp[dayTimestamp]).map(function () { return FREE_SLOT; });
|
|
148
|
+
for (var eventIdx = 0; eventIdx < eventsList.length; eventIdx++) {
|
|
149
|
+
var event_3 = eventsList[eventIdx];
|
|
150
|
+
var width = 1;
|
|
151
|
+
var top_1 = 0;
|
|
152
|
+
var firstOfMulti = void 0;
|
|
153
|
+
if (!event_3.daysMap[dayTimestamp]) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
// only for multi days events:
|
|
157
|
+
if (event_3.multi) {
|
|
158
|
+
// filter out the days outside of the current week view to avoid
|
|
159
|
+
// making a multi-days event chip wider than the week row or shorter
|
|
160
|
+
// than it should be (when event spans across weeks)
|
|
161
|
+
width = event_3.days.filter(function (t) { return t >= weekStartTimestamp && t <= weekEndTimestamp; }).length;
|
|
162
|
+
// flag the first day of multi-days events, consider that an event
|
|
163
|
+
// might start in a day earlier (hence outside) of the current
|
|
164
|
+
// week/month view, so we always check for Mondays (dayNumber === 0)
|
|
165
|
+
if (event_3.days.indexOf(dayTimestamp) === 0 || dayNumber === 0) {
|
|
166
|
+
firstOfMulti = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// if we already have the information on when the event has been
|
|
170
|
+
// vertically positioned use that index
|
|
171
|
+
if (startedAtTopMap[event_3.uid]) {
|
|
172
|
+
top_1 = startedAtTopMap[event_3.uid];
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// now look for a free slot and use its index as `top`
|
|
176
|
+
for (var verticalIdx = 0; verticalIdx < verticalSlots.length; verticalIdx++) {
|
|
177
|
+
var freeOrBusy = verticalSlots[verticalIdx];
|
|
178
|
+
if (freeOrBusy !== BUSY_SLOT) {
|
|
179
|
+
top_1 = verticalIdx;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// now mark the slot as busy
|
|
185
|
+
verticalSlots[top_1] = BUSY_SLOT;
|
|
186
|
+
// store the slot vertical position consistently for multi-days events
|
|
187
|
+
if (firstOfMulti) {
|
|
188
|
+
startedAtTopMap[event_3.uid] = top_1;
|
|
189
|
+
}
|
|
190
|
+
// push the event, they will be sorted later
|
|
191
|
+
viewDay.events.push(tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({ key: "event.".concat(dayTimestamp, "-").concat(top_1) }, contextualProps), event_3), { isPast: todayDate > event_3.end, firstOfMulti: firstOfMulti, top: top_1, width: width }));
|
|
192
|
+
}
|
|
193
|
+
// fill the empty slots with events' placeholders
|
|
194
|
+
for (var i = 0; i < verticalSlots.length; i++) {
|
|
195
|
+
if (verticalSlots[i] !== BUSY_SLOT) {
|
|
196
|
+
viewDay.events.push({
|
|
197
|
+
key: "event.".concat(dayTimestamp, "-").concat(i, "}"),
|
|
198
|
+
placeholder: true,
|
|
199
|
+
top: i,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// sort events and events placeholders by top position
|
|
204
|
+
viewDay.events.sort(function (a, b) { return a.top - b.top; });
|
|
205
|
+
}
|
|
206
|
+
viewWeek.days.push(viewDay);
|
|
207
|
+
}
|
|
208
|
+
viewWeeks.push(viewWeek);
|
|
209
|
+
};
|
|
210
|
+
for (var weekIdx = 0; weekIdx < weeks.length; weekIdx++) {
|
|
211
|
+
_loop_2(weekIdx);
|
|
212
|
+
}
|
|
213
|
+
return viewWeeks;
|
|
214
|
+
}
|
|
215
|
+
exports.processEventsInView = processEventsInView;
|