@growsober/sdk 1.0.4 → 1.0.6
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/dist/api/client.js +10 -3
- package/dist/api/mutations/user-pins.js +1 -1
- package/dist/api/queries/events.d.ts +10 -0
- package/dist/api/utils/eventGrouping.d.ts +104 -0
- package/dist/api/utils/eventGrouping.js +155 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/package.json +1 -1
- package/src/api/client.ts +9 -2
- package/src/api/mutations/user-pins.ts +1 -1
- package/src/api/utils/eventGrouping.ts +181 -0
- package/src/index.ts +6 -0
package/dist/api/client.js
CHANGED
|
@@ -35,8 +35,15 @@ function createApiClient(sdkConfig) {
|
|
|
35
35
|
}
|
|
36
36
|
return requestConfig;
|
|
37
37
|
}, (error) => Promise.reject(error));
|
|
38
|
-
// Response interceptor - handle 401
|
|
39
|
-
client.interceptors.response.use((response) =>
|
|
38
|
+
// Response interceptor - unwrap API response and handle 401
|
|
39
|
+
client.interceptors.response.use((response) => {
|
|
40
|
+
// API wraps all responses in {data: ..., meta: {...}}
|
|
41
|
+
// Unwrap to return just the data portion
|
|
42
|
+
if (response.data && typeof response.data === 'object' && 'data' in response.data) {
|
|
43
|
+
response.data = response.data.data;
|
|
44
|
+
}
|
|
45
|
+
return response;
|
|
46
|
+
}, async (error) => {
|
|
40
47
|
if (error.response?.status === 401) {
|
|
41
48
|
if (sdkConfig.refreshAccessToken) {
|
|
42
49
|
try {
|
|
@@ -58,4 +65,4 @@ function createApiClient(sdkConfig) {
|
|
|
58
65
|
});
|
|
59
66
|
return client;
|
|
60
67
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBWUEsb0NBR0M7QUFFRCxvQ0FLQztBQXRCRCxrREFBcUY7QUFTckYsSUFBSSxNQUFNLEdBQXFCLElBQUksQ0FBQztBQUNwQyxJQUFJLFNBQVMsR0FBeUIsSUFBSSxDQUFDO0FBbUVsQyw4QkFBUztBQWpFbEIsU0FBZ0IsWUFBWSxDQUFDLFNBQW9CO0lBQy9DLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkIsb0JBQUEsU0FBUyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBZ0IsWUFBWTtJQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxTQUFvQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztRQUMxQixPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsdUNBQXVDO0lBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDN0IsS0FBSyxFQUFFLGFBQXlDLEVBQUUsRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUNqQyxDQUFDO0lBRUYsNERBQTREO0lBQzVELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDOUIsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNYLHNEQUFzRDtRQUN0RCx5Q0FBeUM7UUFDekMsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRixRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLEVBQ0QsS0FBSyxFQUFFLEtBQWlCLEVBQUUsRUFBRTtRQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQztvQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUN0RCxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxDQUFDO3dCQUMxRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvc0luc3RhbmNlLCBBeGlvc0Vycm9yLCBJbnRlcm5hbEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcblxuZXhwb3J0IGludGVyZmFjZSBTREtDb25maWcge1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIGdldEFjY2Vzc1Rva2VuOiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuPzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBvblVuYXV0aG9yaXplZD86ICgpID0+IHZvaWQ7XG59XG5cbmxldCBjb25maWc6IFNES0NvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGFwaUNsaWVudDogQXhpb3NJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlU0RLKHNka0NvbmZpZzogU0RLQ29uZmlnKTogdm9pZCB7XG4gIGNvbmZpZyA9IHNka0NvbmZpZztcbiAgYXBpQ2xpZW50ID0gY3JlYXRlQXBpQ2xpZW50KHNka0NvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlDbGllbnQoKTogQXhpb3NJbnN0YW5jZSB7XG4gIGlmICghYXBpQ2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTREsgbm90IGNvbmZpZ3VyZWQuIENhbGwgY29uZmlndXJlU0RLKCkgZmlyc3QuJyk7XG4gIH1cbiAgcmV0dXJuIGFwaUNsaWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBpQ2xpZW50KHNka0NvbmZpZzogU0RLQ29uZmlnKTogQXhpb3NJbnN0YW5jZSB7XG4gIGNvbnN0IGNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogc2RrQ29uZmlnLmJhc2VVUkwsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICB9KTtcblxuICAvLyBSZXF1ZXN0IGludGVyY2VwdG9yIC0gYWRkIGF1dGggdG9rZW5cbiAgY2xpZW50LmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShcbiAgICBhc3luYyAocmVxdWVzdENvbmZpZzogSW50ZXJuYWxBeGlvc1JlcXVlc3RDb25maWcpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgc2RrQ29uZmlnLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdENvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0Q29uZmlnO1xuICAgIH0sXG4gICAgKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcilcbiAgKTtcblxuICAvLyBSZXNwb25zZSBpbnRlcmNlcHRvciAtIHVud3JhcCBBUEkgcmVzcG9uc2UgYW5kIGhhbmRsZSA0MDFcbiAgY2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG4gICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBBUEkgd3JhcHMgYWxsIHJlc3BvbnNlcyBpbiB7ZGF0YTogLi4uLCBtZXRhOiB7Li4ufX1cbiAgICAgIC8vIFVud3JhcCB0byByZXR1cm4ganVzdCB0aGUgZGF0YSBwb3J0aW9uXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YSAmJiB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YSA9IHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9LFxuICAgIGFzeW5jIChlcnJvcjogQXhpb3NFcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICBpZiAoc2RrQ29uZmlnLnJlZnJlc2hBY2Nlc3NUb2tlbikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IGF3YWl0IHNka0NvbmZpZy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIGlmIChuZXdUb2tlbiAmJiBlcnJvci5jb25maWcpIHtcbiAgICAgICAgICAgICAgZXJyb3IuY29uZmlnLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gO1xuICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnJlcXVlc3QoZXJyb3IuY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHNka0NvbmZpZy5vblVuYXV0aG9yaXplZD8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNka0NvbmZpZy5vblVuYXV0aG9yaXplZD8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICApO1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG5cbmV4cG9ydCB7IGFwaUNsaWVudCB9O1xuIl19
|
|
@@ -155,4 +155,4 @@ function useDeleteUserPin(options) {
|
|
|
155
155
|
...options,
|
|
156
156
|
});
|
|
157
157
|
}
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1waW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9tdXRhdGlvbnMvdXNlci1waW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7QUFzR0gsNENBb0JDO0FBdUNELDRDQWdCQztBQS9LRCx1REFLK0I7QUFDL0Isc0NBQXlDO0FBQ3pDLG9EQUE2RTtBQWlCN0UsK0VBQStFO0FBQy9FLGlCQUFpQjtBQUNqQiwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLE9BR0M7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQXNCLEVBQTRCLEVBQUU7WUFDckUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFrQixtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDZCw0Q0FBNEM7WUFDNUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHVCQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsT0FBcUU7SUFFckUsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFhLEVBQWlCLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLHFCQUFxQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQ2QsNkNBQTZDO1lBQzdDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSx1QkFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZXIgUGlucyBNdXRhdGlvbiBIb29rc1xuICpcbiAqIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIGhvb2tzIGZvciB1c2VyIHBpbiBvcGVyYXRpb25zLlxuICogVGhlc2UgaG9va3MgaGFuZGxlIGNyZWF0aW5nIGFuZCBkZWxldGluZyB1c2VyIHBpbnNcbiAqIChcIkknbSBoZXJlIG5vd1wiIC8gXCJJJ2xsIGJlIHRoZXJlXCIpLlxuICpcbiAqIEBtb2R1bGUgYXBpL211dGF0aW9ucy91c2VyLXBpbnNcbiAqL1xuXG5pbXBvcnQge1xuICB1c2VNdXRhdGlvbixcbiAgVXNlTXV0YXRpb25PcHRpb25zLFxuICBVc2VNdXRhdGlvblJlc3VsdCxcbiAgdXNlUXVlcnlDbGllbnQsXG59IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHsgdXNlclBpbktleXMsIFVzZXJQaW5SZXNwb25zZSwgUGluVHlwZSB9IGZyb20gJy4uL3F1ZXJpZXMvdXNlci1waW5zJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVRVUVTVCBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBpblJlcXVlc3Qge1xuICB0eXBlOiBQaW5UeXBlO1xuICBsYXRpdHVkZTogbnVtYmVyO1xuICBsb25naXR1ZGU6IG51bWJlcjtcbiAgbG9jYXRpb25OYW1lPzogc3RyaW5nO1xuICBhY3Rpdml0eTogc3RyaW5nO1xuICB2ZW51ZUlkPzogc3RyaW5nO1xuICBzY2hlZHVsZWRUaW1lPzogc3RyaW5nOyAvLyBJU08gZGF0ZSBzdHJpbmcsIHJlcXVpcmVkIGZvciBTQ0hFRFVMRUQgdHlwZVxuICBkdXJhdGlvbj86IG51bWJlcjsgLy8gaG91cnMgKDEtOCksIGRlZmF1bHQgMiBmb3IgSEVSRV9OT1csIDIgZm9yIFNDSEVEVUxFRFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNVVRBVElPTiBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyB1c2VyIHBpblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIG5ldyBwaW4gc2hvd2luZyB3aGVyZSB0aGUgdXNlciBpcyBvciB3aWxsIGJlLlxuICogQW55IGV4aXN0aW5nIGFjdGl2ZSBwaW4gaXMgYXV0b21hdGljYWxseSBkZWFjdGl2YXRlZC5cbiAqXG4gKiBUd28gdHlwZXMgb2YgcGluczpcbiAqIC0gSEVSRV9OT1c6IFVzZXIgaXMgY3VycmVudGx5IGF0IHRoaXMgbG9jYXRpb24gKGRlZmF1bHQgMSBob3VyIGR1cmF0aW9uKVxuICogLSBTQ0hFRFVMRUQ6IFVzZXIgd2lsbCBiZSBhdCB0aGlzIGxvY2F0aW9uIGF0IGEgc3BlY2lmaWMgdGltZSAoZGVmYXVsdCAyIGhvdXIgZHVyYXRpb24pXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2FwaS92MS91c2VyLXBpbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogRHJvcCBhIFwiSSdtIGhlcmUgbm93XCIgcGluOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VDcmVhdGVVc2VyUGluIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGZ1bmN0aW9uIERyb3BQaW5CdXR0b24oeyBsb2NhdGlvbiB9KSB7XG4gKiAgIGNvbnN0IGNyZWF0ZVBpbiA9IHVzZUNyZWF0ZVVzZXJQaW4oKTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZURyb3BQaW4gPSAoKSA9PiB7XG4gKiAgICAgY3JlYXRlUGluLm11dGF0ZSh7XG4gKiAgICAgICB0eXBlOiAnSEVSRV9OT1cnLFxuICogICAgICAgbGF0aXR1ZGU6IGxvY2F0aW9uLmxhdCxcbiAqICAgICAgIGxvbmdpdHVkZTogbG9jYXRpb24ubG5nLFxuICogICAgICAgbG9jYXRpb25OYW1lOiAnRmFicmljYSBDb2ZmZWUnLFxuICogICAgICAgYWN0aXZpdHk6ICdXb3JraW5nIHJlbW90ZWx5JyxcbiAqICAgICAgIGR1cmF0aW9uOiAxMjAsIC8vIDIgaG91cnNcbiAqICAgICB9KTtcbiAqICAgfTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJ1dHRvbiBvblByZXNzPXtoYW5kbGVEcm9wUGlufSBsb2FkaW5nPXtjcmVhdGVQaW4uaXNQZW5kaW5nfT5cbiAqICAgICAgIERyb3AgUGluXG4gKiAgICAgPC9CdXR0b24+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2NoZWR1bGUgYSBwaW4gZm9yIGxhdGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VDcmVhdGVVc2VyUGluIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGZ1bmN0aW9uIFNjaGVkdWxlUGluRm9ybSgpIHtcbiAqICAgY29uc3QgY3JlYXRlUGluID0gdXNlQ3JlYXRlVXNlclBpbih7XG4gKiAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gKiAgICAgICB0b2FzdC5zaG93KCdQaW4gc2NoZWR1bGVkIScpO1xuICogICAgIH0sXG4gKiAgIH0pO1xuICpcbiAqICAgY29uc3QgaGFuZGxlU2NoZWR1bGUgPSAoZGF0YSkgPT4ge1xuICogICAgIGNyZWF0ZVBpbi5tdXRhdGUoe1xuICogICAgICAgdHlwZTogJ1NDSEVEVUxFRCcsXG4gKiAgICAgICBsYXRpdHVkZTogZGF0YS52ZW51ZS5sYXQsXG4gKiAgICAgICBsb25naXR1ZGU6IGRhdGEudmVudWUubG5nLFxuICogICAgICAgbG9jYXRpb25OYW1lOiBkYXRhLnZlbnVlLm5hbWUsXG4gKiAgICAgICB2ZW51ZUlkOiBkYXRhLnZlbnVlLmlkLFxuICogICAgICAgYWN0aXZpdHk6ICdDb2ZmZWUgbWVldHVwJyxcbiAqICAgICAgIHNjaGVkdWxlZFRpbWU6IGRhdGEudGltZS50b0lTT1N0cmluZygpLFxuICogICAgICAgZHVyYXRpb246IDkwLFxuICogICAgIH0pO1xuICogICB9O1xuICpcbiAqICAgcmV0dXJuIDxTY2hlZHVsZUZvcm0gb25TdWJtaXQ9e2hhbmRsZVNjaGVkdWxlfSAvPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVVc2VyUGluKFxuICBvcHRpb25zPzogT21pdDxcbiAgICBVc2VNdXRhdGlvbk9wdGlvbnM8VXNlclBpblJlc3BvbnNlLCBFcnJvciwgQ3JlYXRlUGluUmVxdWVzdD4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PFVzZXJQaW5SZXNwb25zZSwgRXJyb3IsIENyZWF0ZVBpblJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IENyZWF0ZVBpblJlcXVlc3QpOiBQcm9taXNlPFVzZXJQaW5SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PFVzZXJQaW5SZXNwb25zZT4oJy9hcGkvdjEvdXNlci1waW5zJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBwaW4gcXVlcmllcyB0byByZWZsZWN0IG5ldyBwaW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJQaW5LZXlzLmFsbCB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZSBhIHVzZXIgcGluXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZWFjdGl2YXRlcyBhIHVzZXIgcGluLiBVc2VycyBjYW4gb25seSBkZWxldGUgdGhlaXIgb3duIHBpbnMuXG4gKlxuICogQGVuZHBvaW50IERFTEVURSAvYXBpL3YxL3VzZXItcGlucy86aWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VEZWxldGVVc2VyUGluIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGZ1bmN0aW9uIE15UGluQ2FyZCh7IHBpbiB9KSB7XG4gKiAgIGNvbnN0IGRlbGV0ZVBpbiA9IHVzZURlbGV0ZVVzZXJQaW4oe1xuICogICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICogICAgICAgdG9hc3Quc2hvdygnUGluIHJlbW92ZWQnKTtcbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPENhcmQ+XG4gKiAgICAgICA8VGV4dD57cGluLmFjdGl2aXR5fTwvVGV4dD5cbiAqICAgICAgIDxUZXh0PkF0IHtwaW4ubG9jYXRpb25OYW1lfTwvVGV4dD5cbiAqICAgICAgIDxCdXR0b25cbiAqICAgICAgICAgb25QcmVzcz17KCkgPT4gZGVsZXRlUGluLm11dGF0ZShwaW4uaWQpfVxuICogICAgICAgICBsb2FkaW5nPXtkZWxldGVQaW4uaXNQZW5kaW5nfVxuICogICAgICAgPlxuICogICAgICAgICBSZW1vdmUgUGluXG4gKiAgICAgICA8L0J1dHRvbj5cbiAqICAgICA8L0NhcmQ+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGVsZXRlVXNlclBpbihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPHZvaWQsIEVycm9yLCBzdHJpbmc+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDx2b2lkLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChwaW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5kZWxldGUoYC9hcGkvdjEvdXNlci1waW5zLyR7cGluSWR9YCk7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgcGluIHF1ZXJpZXMgdG8gcmVmbGVjdCBkZWxldGlvblxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogdXNlclBpbktleXMuYWxsIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -97,6 +97,8 @@ export declare function useEvent(id: string, options?: Omit<UseQueryOptions<Even
|
|
|
97
97
|
isCancelled: boolean;
|
|
98
98
|
isAmbient: boolean;
|
|
99
99
|
ambientCategory?: Record<string, never>;
|
|
100
|
+
vibe?: "CHILL" | "ACTIVE" | "SOCIAL" | "CREATIVE" | "DEEP_TALK" | "ADVENTURE";
|
|
101
|
+
city?: import("@growsober/types/dist/generated").components["schemas"]["EventCityDto"];
|
|
100
102
|
bookingCount: number;
|
|
101
103
|
checkinCount: number;
|
|
102
104
|
createdAt: string;
|
|
@@ -147,6 +149,8 @@ export declare function useEventBySlug(slug: string, options?: Omit<UseQueryOpti
|
|
|
147
149
|
isCancelled: boolean;
|
|
148
150
|
isAmbient: boolean;
|
|
149
151
|
ambientCategory?: Record<string, never>;
|
|
152
|
+
vibe?: "CHILL" | "ACTIVE" | "SOCIAL" | "CREATIVE" | "DEEP_TALK" | "ADVENTURE";
|
|
153
|
+
city?: import("@growsober/types/dist/generated").components["schemas"]["EventCityDto"];
|
|
150
154
|
bookingCount: number;
|
|
151
155
|
checkinCount: number;
|
|
152
156
|
createdAt: string;
|
|
@@ -197,6 +201,8 @@ export declare function useUpcomingEvents(limit?: number, options?: Omit<UseQuer
|
|
|
197
201
|
isCancelled: boolean;
|
|
198
202
|
isAmbient: boolean;
|
|
199
203
|
ambientCategory?: Record<string, never>;
|
|
204
|
+
vibe?: "CHILL" | "ACTIVE" | "SOCIAL" | "CREATIVE" | "DEEP_TALK" | "ADVENTURE";
|
|
205
|
+
city?: import("@growsober/types/dist/generated").components["schemas"]["EventCityDto"];
|
|
200
206
|
bookingCount: number;
|
|
201
207
|
checkinCount: number;
|
|
202
208
|
createdAt: string;
|
|
@@ -249,6 +255,8 @@ export declare function useFeaturedEvents(limit?: number, options?: Omit<UseQuer
|
|
|
249
255
|
isCancelled: boolean;
|
|
250
256
|
isAmbient: boolean;
|
|
251
257
|
ambientCategory?: Record<string, never>;
|
|
258
|
+
vibe?: "CHILL" | "ACTIVE" | "SOCIAL" | "CREATIVE" | "DEEP_TALK" | "ADVENTURE";
|
|
259
|
+
city?: import("@growsober/types/dist/generated").components["schemas"]["EventCityDto"];
|
|
252
260
|
bookingCount: number;
|
|
253
261
|
checkinCount: number;
|
|
254
262
|
createdAt: string;
|
|
@@ -299,6 +307,8 @@ export declare function useAmbientEvents(filters?: AmbientEventFilters, options?
|
|
|
299
307
|
isCancelled: boolean;
|
|
300
308
|
isAmbient: boolean;
|
|
301
309
|
ambientCategory?: Record<string, never>;
|
|
310
|
+
vibe?: "CHILL" | "ACTIVE" | "SOCIAL" | "CREATIVE" | "DEEP_TALK" | "ADVENTURE";
|
|
311
|
+
city?: import("@growsober/types/dist/generated").components["schemas"]["EventCityDto"];
|
|
302
312
|
bookingCount: number;
|
|
303
313
|
checkinCount: number;
|
|
304
314
|
createdAt: string;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Grouping Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for organizing events by time of day.
|
|
5
|
+
* Used in the Gatherings screen to show events grouped by
|
|
6
|
+
* Morning, Afternoon, and Evening.
|
|
7
|
+
*
|
|
8
|
+
* @module api/utils/eventGrouping
|
|
9
|
+
*/
|
|
10
|
+
import { EventResponse } from '../types';
|
|
11
|
+
export type TimeOfDay = 'MORNING' | 'AFTERNOON' | 'EVENING';
|
|
12
|
+
export interface GroupedEvents {
|
|
13
|
+
morning: EventResponse[];
|
|
14
|
+
afternoon: EventResponse[];
|
|
15
|
+
evening: EventResponse[];
|
|
16
|
+
}
|
|
17
|
+
export interface TimeOfDayInfo {
|
|
18
|
+
key: TimeOfDay;
|
|
19
|
+
label: string;
|
|
20
|
+
emoji: string;
|
|
21
|
+
hours: {
|
|
22
|
+
start: number;
|
|
23
|
+
end: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare const TIME_OF_DAY_CONFIG: Record<TimeOfDay, TimeOfDayInfo>;
|
|
27
|
+
/**
|
|
28
|
+
* Get time of day for a given date
|
|
29
|
+
*
|
|
30
|
+
* @param date - Date string or Date object
|
|
31
|
+
* @returns TimeOfDay - MORNING, AFTERNOON, or EVENING
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* const timeOfDay = getTimeOfDay('2024-03-15T10:00:00Z');
|
|
36
|
+
* console.log(timeOfDay); // 'MORNING'
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function getTimeOfDay(date: Date | string): TimeOfDay;
|
|
40
|
+
/**
|
|
41
|
+
* Get label for time of day
|
|
42
|
+
*
|
|
43
|
+
* @param timeOfDay - TimeOfDay enum value
|
|
44
|
+
* @returns Human-readable label
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```tsx
|
|
48
|
+
* const label = getTimeOfDayLabel('MORNING');
|
|
49
|
+
* console.log(label); // 'Morning'
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function getTimeOfDayLabel(timeOfDay: TimeOfDay): string;
|
|
53
|
+
/**
|
|
54
|
+
* Group events by time of day
|
|
55
|
+
*
|
|
56
|
+
* @param events - Array of events to group
|
|
57
|
+
* @returns GroupedEvents object with morning, afternoon, and evening arrays
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```tsx
|
|
61
|
+
* import { useUpcomingEvents, groupEventsByTimeOfDay } from '@growsober/sdk';
|
|
62
|
+
*
|
|
63
|
+
* function GatheringsList() {
|
|
64
|
+
* const { data: events } = useUpcomingEvents(30);
|
|
65
|
+
* const grouped = useMemo(() => {
|
|
66
|
+
* if (!events) return null;
|
|
67
|
+
* return groupEventsByTimeOfDay(events);
|
|
68
|
+
* }, [events]);
|
|
69
|
+
*
|
|
70
|
+
* return (
|
|
71
|
+
* <SectionList
|
|
72
|
+
* sections={[
|
|
73
|
+
* { title: 'Morning', data: grouped?.morning || [] },
|
|
74
|
+
* { title: 'Afternoon', data: grouped?.afternoon || [] },
|
|
75
|
+
* { title: 'Evening', data: grouped?.evening || [] },
|
|
76
|
+
* ]}
|
|
77
|
+
* ...
|
|
78
|
+
* />
|
|
79
|
+
* );
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function groupEventsByTimeOfDay(events: EventResponse[]): GroupedEvents;
|
|
84
|
+
/**
|
|
85
|
+
* Convert grouped events to section list data format
|
|
86
|
+
*
|
|
87
|
+
* @param events - Array of events to group
|
|
88
|
+
* @returns Array of sections with title and data
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* const sections = getEventSections(events);
|
|
93
|
+
* // [
|
|
94
|
+
* // { title: 'Morning', data: [...] },
|
|
95
|
+
* // { title: 'Afternoon', data: [...] },
|
|
96
|
+
* // { title: 'Evening', data: [...] },
|
|
97
|
+
* // ]
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export declare function getEventSections(events: EventResponse[]): Array<{
|
|
101
|
+
title: string;
|
|
102
|
+
timeOfDay: TimeOfDay;
|
|
103
|
+
data: EventResponse[];
|
|
104
|
+
}>;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event Grouping Utilities
|
|
4
|
+
*
|
|
5
|
+
* Utilities for organizing events by time of day.
|
|
6
|
+
* Used in the Gatherings screen to show events grouped by
|
|
7
|
+
* Morning, Afternoon, and Evening.
|
|
8
|
+
*
|
|
9
|
+
* @module api/utils/eventGrouping
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TIME_OF_DAY_CONFIG = void 0;
|
|
13
|
+
exports.getTimeOfDay = getTimeOfDay;
|
|
14
|
+
exports.getTimeOfDayLabel = getTimeOfDayLabel;
|
|
15
|
+
exports.groupEventsByTimeOfDay = groupEventsByTimeOfDay;
|
|
16
|
+
exports.getEventSections = getEventSections;
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// CONSTANTS
|
|
19
|
+
// ============================================================================
|
|
20
|
+
exports.TIME_OF_DAY_CONFIG = {
|
|
21
|
+
MORNING: {
|
|
22
|
+
key: 'MORNING',
|
|
23
|
+
label: 'Morning',
|
|
24
|
+
emoji: '',
|
|
25
|
+
hours: { start: 5, end: 11 }, // 5:00 AM - 11:59 AM
|
|
26
|
+
},
|
|
27
|
+
AFTERNOON: {
|
|
28
|
+
key: 'AFTERNOON',
|
|
29
|
+
label: 'Afternoon',
|
|
30
|
+
emoji: '',
|
|
31
|
+
hours: { start: 12, end: 16 }, // 12:00 PM - 4:59 PM
|
|
32
|
+
},
|
|
33
|
+
EVENING: {
|
|
34
|
+
key: 'EVENING',
|
|
35
|
+
label: 'Evening',
|
|
36
|
+
emoji: '',
|
|
37
|
+
hours: { start: 17, end: 4 }, // 5:00 PM - 4:59 AM (next day)
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// FUNCTIONS
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Get time of day for a given date
|
|
45
|
+
*
|
|
46
|
+
* @param date - Date string or Date object
|
|
47
|
+
* @returns TimeOfDay - MORNING, AFTERNOON, or EVENING
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* const timeOfDay = getTimeOfDay('2024-03-15T10:00:00Z');
|
|
52
|
+
* console.log(timeOfDay); // 'MORNING'
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
function getTimeOfDay(date) {
|
|
56
|
+
const d = typeof date === 'string' ? new Date(date) : date;
|
|
57
|
+
const hour = d.getHours();
|
|
58
|
+
if (hour >= 5 && hour < 12)
|
|
59
|
+
return 'MORNING';
|
|
60
|
+
if (hour >= 12 && hour < 17)
|
|
61
|
+
return 'AFTERNOON';
|
|
62
|
+
return 'EVENING';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get label for time of day
|
|
66
|
+
*
|
|
67
|
+
* @param timeOfDay - TimeOfDay enum value
|
|
68
|
+
* @returns Human-readable label
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```tsx
|
|
72
|
+
* const label = getTimeOfDayLabel('MORNING');
|
|
73
|
+
* console.log(label); // 'Morning'
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
function getTimeOfDayLabel(timeOfDay) {
|
|
77
|
+
return exports.TIME_OF_DAY_CONFIG[timeOfDay].label;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Group events by time of day
|
|
81
|
+
*
|
|
82
|
+
* @param events - Array of events to group
|
|
83
|
+
* @returns GroupedEvents object with morning, afternoon, and evening arrays
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```tsx
|
|
87
|
+
* import { useUpcomingEvents, groupEventsByTimeOfDay } from '@growsober/sdk';
|
|
88
|
+
*
|
|
89
|
+
* function GatheringsList() {
|
|
90
|
+
* const { data: events } = useUpcomingEvents(30);
|
|
91
|
+
* const grouped = useMemo(() => {
|
|
92
|
+
* if (!events) return null;
|
|
93
|
+
* return groupEventsByTimeOfDay(events);
|
|
94
|
+
* }, [events]);
|
|
95
|
+
*
|
|
96
|
+
* return (
|
|
97
|
+
* <SectionList
|
|
98
|
+
* sections={[
|
|
99
|
+
* { title: 'Morning', data: grouped?.morning || [] },
|
|
100
|
+
* { title: 'Afternoon', data: grouped?.afternoon || [] },
|
|
101
|
+
* { title: 'Evening', data: grouped?.evening || [] },
|
|
102
|
+
* ]}
|
|
103
|
+
* ...
|
|
104
|
+
* />
|
|
105
|
+
* );
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
function groupEventsByTimeOfDay(events) {
|
|
110
|
+
const grouped = {
|
|
111
|
+
morning: [],
|
|
112
|
+
afternoon: [],
|
|
113
|
+
evening: [],
|
|
114
|
+
};
|
|
115
|
+
for (const event of events) {
|
|
116
|
+
const timeOfDay = getTimeOfDay(event.startDate);
|
|
117
|
+
switch (timeOfDay) {
|
|
118
|
+
case 'MORNING':
|
|
119
|
+
grouped.morning.push(event);
|
|
120
|
+
break;
|
|
121
|
+
case 'AFTERNOON':
|
|
122
|
+
grouped.afternoon.push(event);
|
|
123
|
+
break;
|
|
124
|
+
case 'EVENING':
|
|
125
|
+
grouped.evening.push(event);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return grouped;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Convert grouped events to section list data format
|
|
133
|
+
*
|
|
134
|
+
* @param events - Array of events to group
|
|
135
|
+
* @returns Array of sections with title and data
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```tsx
|
|
139
|
+
* const sections = getEventSections(events);
|
|
140
|
+
* // [
|
|
141
|
+
* // { title: 'Morning', data: [...] },
|
|
142
|
+
* // { title: 'Afternoon', data: [...] },
|
|
143
|
+
* // { title: 'Evening', data: [...] },
|
|
144
|
+
* // ]
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
function getEventSections(events) {
|
|
148
|
+
const grouped = groupEventsByTimeOfDay(events);
|
|
149
|
+
return [
|
|
150
|
+
{ title: 'Morning', timeOfDay: 'MORNING', data: grouped.morning },
|
|
151
|
+
{ title: 'Afternoon', timeOfDay: 'AFTERNOON', data: grouped.afternoon },
|
|
152
|
+
{ title: 'Evening', timeOfDay: 'EVENING', data: grouped.evening },
|
|
153
|
+
].filter(section => section.data.length > 0);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRHcm91cGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvdXRpbHMvZXZlbnRHcm91cGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQWdFSCxvQ0FPQztBQWNELDhDQUVDO0FBZ0NELHdEQXVCQztBQWtCRCw0Q0FZQztBQXJKRCwrRUFBK0U7QUFDL0UsWUFBWTtBQUNaLCtFQUErRTtBQUVsRSxRQUFBLGtCQUFrQixHQUFxQztJQUNsRSxPQUFPLEVBQUU7UUFDUCxHQUFHLEVBQUUsU0FBUztRQUNkLEtBQUssRUFBRSxTQUFTO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUscUJBQXFCO0tBQ3BEO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsR0FBRyxFQUFFLFdBQVc7UUFDaEIsS0FBSyxFQUFFLFdBQVc7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxxQkFBcUI7S0FDckQ7SUFDRCxPQUFPLEVBQUU7UUFDUCxHQUFHLEVBQUUsU0FBUztRQUNkLEtBQUssRUFBRSxTQUFTO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsK0JBQStCO0tBQzlEO0NBQ0YsQ0FBQztBQUVGLCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLElBQW1CO0lBQzlDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFMUIsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0MsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDaEQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsU0FBb0I7SUFDcEQsT0FBTywwQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLE1BQXVCO0lBQzVELE1BQU0sT0FBTyxHQUFrQjtRQUM3QixPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxFQUFFO1FBQ2IsT0FBTyxFQUFFLEVBQUU7S0FDWixDQUFDO0lBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixNQUFNO1lBQ1IsS0FBSyxTQUFTO2dCQUNaLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBdUI7SUFLdEQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBc0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtRQUM5RSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQXdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUU7UUFDcEYsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFzQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO0tBQy9FLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXZlbnQgR3JvdXBpbmcgVXRpbGl0aWVzXG4gKlxuICogVXRpbGl0aWVzIGZvciBvcmdhbml6aW5nIGV2ZW50cyBieSB0aW1lIG9mIGRheS5cbiAqIFVzZWQgaW4gdGhlIEdhdGhlcmluZ3Mgc2NyZWVuIHRvIHNob3cgZXZlbnRzIGdyb3VwZWQgYnlcbiAqIE1vcm5pbmcsIEFmdGVybm9vbiwgYW5kIEV2ZW5pbmcuXG4gKlxuICogQG1vZHVsZSBhcGkvdXRpbHMvZXZlbnRHcm91cGluZ1xuICovXG5cbmltcG9ydCB7IEV2ZW50UmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIFRpbWVPZkRheSA9ICdNT1JOSU5HJyB8ICdBRlRFUk5PT04nIHwgJ0VWRU5JTkcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwZWRFdmVudHMge1xuICBtb3JuaW5nOiBFdmVudFJlc3BvbnNlW107XG4gIGFmdGVybm9vbjogRXZlbnRSZXNwb25zZVtdO1xuICBldmVuaW5nOiBFdmVudFJlc3BvbnNlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZU9mRGF5SW5mbyB7XG4gIGtleTogVGltZU9mRGF5O1xuICBsYWJlbDogc3RyaW5nO1xuICBlbW9qaTogc3RyaW5nO1xuICBob3VyczogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT05TVEFOVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFRJTUVfT0ZfREFZX0NPTkZJRzogUmVjb3JkPFRpbWVPZkRheSwgVGltZU9mRGF5SW5mbz4gPSB7XG4gIE1PUk5JTkc6IHtcbiAgICBrZXk6ICdNT1JOSU5HJyxcbiAgICBsYWJlbDogJ01vcm5pbmcnLFxuICAgIGVtb2ppOiAnJyxcbiAgICBob3VyczogeyBzdGFydDogNSwgZW5kOiAxMSB9LCAvLyA1OjAwIEFNIC0gMTE6NTkgQU1cbiAgfSxcbiAgQUZURVJOT09OOiB7XG4gICAga2V5OiAnQUZURVJOT09OJyxcbiAgICBsYWJlbDogJ0FmdGVybm9vbicsXG4gICAgZW1vamk6ICcnLFxuICAgIGhvdXJzOiB7IHN0YXJ0OiAxMiwgZW5kOiAxNiB9LCAvLyAxMjowMCBQTSAtIDQ6NTkgUE1cbiAgfSxcbiAgRVZFTklORzoge1xuICAgIGtleTogJ0VWRU5JTkcnLFxuICAgIGxhYmVsOiAnRXZlbmluZycsXG4gICAgZW1vamk6ICcnLFxuICAgIGhvdXJzOiB7IHN0YXJ0OiAxNywgZW5kOiA0IH0sIC8vIDU6MDAgUE0gLSA0OjU5IEFNIChuZXh0IGRheSlcbiAgfSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCB0aW1lIG9mIGRheSBmb3IgYSBnaXZlbiBkYXRlXG4gKlxuICogQHBhcmFtIGRhdGUgLSBEYXRlIHN0cmluZyBvciBEYXRlIG9iamVjdFxuICogQHJldHVybnMgVGltZU9mRGF5IC0gTU9STklORywgQUZURVJOT09OLCBvciBFVkVOSU5HXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgdGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5KCcyMDI0LTAzLTE1VDEwOjAwOjAwWicpO1xuICogY29uc29sZS5sb2codGltZU9mRGF5KTsgLy8gJ01PUk5JTkcnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVPZkRheShkYXRlOiBEYXRlIHwgc3RyaW5nKTogVGltZU9mRGF5IHtcbiAgY29uc3QgZCA9IHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZTtcbiAgY29uc3QgaG91ciA9IGQuZ2V0SG91cnMoKTtcblxuICBpZiAoaG91ciA+PSA1ICYmIGhvdXIgPCAxMikgcmV0dXJuICdNT1JOSU5HJztcbiAgaWYgKGhvdXIgPj0gMTIgJiYgaG91ciA8IDE3KSByZXR1cm4gJ0FGVEVSTk9PTic7XG4gIHJldHVybiAnRVZFTklORyc7XG59XG5cbi8qKlxuICogR2V0IGxhYmVsIGZvciB0aW1lIG9mIGRheVxuICpcbiAqIEBwYXJhbSB0aW1lT2ZEYXkgLSBUaW1lT2ZEYXkgZW51bSB2YWx1ZVxuICogQHJldHVybnMgSHVtYW4tcmVhZGFibGUgbGFiZWxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCBsYWJlbCA9IGdldFRpbWVPZkRheUxhYmVsKCdNT1JOSU5HJyk7XG4gKiBjb25zb2xlLmxvZyhsYWJlbCk7IC8vICdNb3JuaW5nJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lT2ZEYXlMYWJlbCh0aW1lT2ZEYXk6IFRpbWVPZkRheSk6IHN0cmluZyB7XG4gIHJldHVybiBUSU1FX09GX0RBWV9DT05GSUdbdGltZU9mRGF5XS5sYWJlbDtcbn1cblxuLyoqXG4gKiBHcm91cCBldmVudHMgYnkgdGltZSBvZiBkYXlcbiAqXG4gKiBAcGFyYW0gZXZlbnRzIC0gQXJyYXkgb2YgZXZlbnRzIHRvIGdyb3VwXG4gKiBAcmV0dXJucyBHcm91cGVkRXZlbnRzIG9iamVjdCB3aXRoIG1vcm5pbmcsIGFmdGVybm9vbiwgYW5kIGV2ZW5pbmcgYXJyYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlVXBjb21pbmdFdmVudHMsIGdyb3VwRXZlbnRzQnlUaW1lT2ZEYXkgfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gR2F0aGVyaW5nc0xpc3QoKSB7XG4gKiAgIGNvbnN0IHsgZGF0YTogZXZlbnRzIH0gPSB1c2VVcGNvbWluZ0V2ZW50cygzMCk7XG4gKiAgIGNvbnN0IGdyb3VwZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAqICAgICBpZiAoIWV2ZW50cykgcmV0dXJuIG51bGw7XG4gKiAgICAgcmV0dXJuIGdyb3VwRXZlbnRzQnlUaW1lT2ZEYXkoZXZlbnRzKTtcbiAqICAgfSwgW2V2ZW50c10pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8U2VjdGlvbkxpc3RcbiAqICAgICAgIHNlY3Rpb25zPXtbXG4gKiAgICAgICAgIHsgdGl0bGU6ICdNb3JuaW5nJywgZGF0YTogZ3JvdXBlZD8ubW9ybmluZyB8fCBbXSB9LFxuICogICAgICAgICB7IHRpdGxlOiAnQWZ0ZXJub29uJywgZGF0YTogZ3JvdXBlZD8uYWZ0ZXJub29uIHx8IFtdIH0sXG4gKiAgICAgICAgIHsgdGl0bGU6ICdFdmVuaW5nJywgZGF0YTogZ3JvdXBlZD8uZXZlbmluZyB8fCBbXSB9LFxuICogICAgICAgXX1cbiAqICAgICAgIC4uLlxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlUaW1lT2ZEYXkoZXZlbnRzOiBFdmVudFJlc3BvbnNlW10pOiBHcm91cGVkRXZlbnRzIHtcbiAgY29uc3QgZ3JvdXBlZDogR3JvdXBlZEV2ZW50cyA9IHtcbiAgICBtb3JuaW5nOiBbXSxcbiAgICBhZnRlcm5vb246IFtdLFxuICAgIGV2ZW5pbmc6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgdGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5KGV2ZW50LnN0YXJ0RGF0ZSk7XG4gICAgc3dpdGNoICh0aW1lT2ZEYXkpIHtcbiAgICAgIGNhc2UgJ01PUk5JTkcnOlxuICAgICAgICBncm91cGVkLm1vcm5pbmcucHVzaChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQUZURVJOT09OJzpcbiAgICAgICAgZ3JvdXBlZC5hZnRlcm5vb24ucHVzaChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVZFTklORyc6XG4gICAgICAgIGdyb3VwZWQuZXZlbmluZy5wdXNoKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3VwZWQ7XG59XG5cbi8qKlxuICogQ29udmVydCBncm91cGVkIGV2ZW50cyB0byBzZWN0aW9uIGxpc3QgZGF0YSBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gZXZlbnRzIC0gQXJyYXkgb2YgZXZlbnRzIHRvIGdyb3VwXG4gKiBAcmV0dXJucyBBcnJheSBvZiBzZWN0aW9ucyB3aXRoIHRpdGxlIGFuZCBkYXRhXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3Qgc2VjdGlvbnMgPSBnZXRFdmVudFNlY3Rpb25zKGV2ZW50cyk7XG4gKiAvLyBbXG4gKiAvLyAgIHsgdGl0bGU6ICdNb3JuaW5nJywgZGF0YTogWy4uLl0gfSxcbiAqIC8vICAgeyB0aXRsZTogJ0FmdGVybm9vbicsIGRhdGE6IFsuLi5dIH0sXG4gKiAvLyAgIHsgdGl0bGU6ICdFdmVuaW5nJywgZGF0YTogWy4uLl0gfSxcbiAqIC8vIF1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRTZWN0aW9ucyhldmVudHM6IEV2ZW50UmVzcG9uc2VbXSk6IEFycmF5PHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdGltZU9mRGF5OiBUaW1lT2ZEYXk7XG4gIGRhdGE6IEV2ZW50UmVzcG9uc2VbXTtcbn0+IHtcbiAgY29uc3QgZ3JvdXBlZCA9IGdyb3VwRXZlbnRzQnlUaW1lT2ZEYXkoZXZlbnRzKTtcblxuICByZXR1cm4gW1xuICAgIHsgdGl0bGU6ICdNb3JuaW5nJywgdGltZU9mRGF5OiAnTU9STklORycgYXMgVGltZU9mRGF5LCBkYXRhOiBncm91cGVkLm1vcm5pbmcgfSxcbiAgICB7IHRpdGxlOiAnQWZ0ZXJub29uJywgdGltZU9mRGF5OiAnQUZURVJOT09OJyBhcyBUaW1lT2ZEYXksIGRhdGE6IGdyb3VwZWQuYWZ0ZXJub29uIH0sXG4gICAgeyB0aXRsZTogJ0V2ZW5pbmcnLCB0aW1lT2ZEYXk6ICdFVkVOSU5HJyBhcyBUaW1lT2ZEYXksIGRhdGE6IGdyb3VwZWQuZXZlbmluZyB9LFxuICBdLmZpbHRlcihzZWN0aW9uID0+IHNlY3Rpb24uZGF0YS5sZW5ndGggPiAwKTtcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -64,4 +64,8 @@ __exportStar(require("./api/queries"), exports);
|
|
|
64
64
|
// MUTATION HOOKS
|
|
65
65
|
// ============================================================================
|
|
66
66
|
__exportStar(require("./api/mutations"), exports);
|
|
67
|
-
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// UTILITIES
|
|
69
|
+
// ============================================================================
|
|
70
|
+
__exportStar(require("./api/utils/eventGrouping"), exports);
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0VBQStFO0FBQy9FLGFBQWE7QUFDYiwrRUFBK0U7QUFFL0UsdUNBQTBEO0FBQWpELHNHQUFBLFlBQVksT0FBQTtBQUFFLHNHQUFBLFlBQVksT0FBQTtBQUduQywrRUFBK0U7QUFDL0UsUUFBUTtBQUNSLCtFQUErRTtBQUUvRSw4Q0FBNEI7QUFFNUIsK0VBQStFO0FBQy9FLGNBQWM7QUFDZCwrRUFBK0U7QUFFL0UsZ0RBQThCO0FBRTlCLCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsK0VBQStFO0FBRS9FLGtEQUFnQztBQUVoQywrRUFBK0U7QUFDL0UsWUFBWTtBQUNaLCtFQUErRTtBQUUvRSw0REFBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3dTb2JlciBTREtcbiAqXG4gKiBUeXBlU2NyaXB0IFNESyBmb3IgdGhlIEdyb3dTb2JlciBBUEkgd2l0aCBUYW5TdGFjayBRdWVyeSBob29rcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyBjb25maWd1cmVTREssIHVzZUN1cnJlbnRVc2VyLCB1c2VMb2dpbiB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiAvLyBDb25maWd1cmUgU0RLIHdpdGggeW91ciBBUEkgYmFzZSBVUkwgYW5kIHRva2VuIG1hbmFnZW1lbnRcbiAqIGNvbmZpZ3VyZVNESyh7XG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5ncm93c29iZXIuYXBwJyxcbiAqICAgZ2V0QWNjZXNzVG9rZW46ICgpID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhY2Nlc3NUb2tlbicpLFxuICogICByZWZyZXNoQWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICAvLyBZb3VyIHRva2VuIHJlZnJlc2ggbG9naWNcbiAqICAgICByZXR1cm4gbmV3QWNjZXNzVG9rZW47XG4gKiAgIH0sXG4gKiAgIG9uVW5hdXRob3JpemVkOiAoKSA9PiB7XG4gKiAgICAgLy8gSGFuZGxlIHVuYXV0aG9yaXplZCBhY2Nlc3NcbiAqICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICogICB9LFxuICogfSk7XG4gKlxuICogLy8gVXNlIGhvb2tzIGluIHlvdXIgY29tcG9uZW50c1xuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IGRhdGE6IHVzZXIgfSA9IHVzZUN1cnJlbnRVc2VyKCk7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiBsb2dpbiB9ID0gdXNlTG9naW4oKTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBUEkgQ0xJRU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB7IGNvbmZpZ3VyZVNESywgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi9hcGkvY2xpZW50JztcbmV4cG9ydCB0eXBlIHsgU0RLQ29uZmlnIH0gZnJvbSAnLi9hcGkvY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0ICogZnJvbSAnLi9hcGkvdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgKiBmcm9tICcuL2FwaS9xdWVyaWVzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTVVUQVRJT04gSE9PS1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0ICogZnJvbSAnLi9hcGkvbXV0YXRpb25zJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCAqIGZyb20gJy4vYXBpL3V0aWxzL2V2ZW50R3JvdXBpbmcnO1xuXG4iXX0=
|
package/package.json
CHANGED
package/src/api/client.ts
CHANGED
|
@@ -42,9 +42,16 @@ function createApiClient(sdkConfig: SDKConfig): AxiosInstance {
|
|
|
42
42
|
(error) => Promise.reject(error)
|
|
43
43
|
);
|
|
44
44
|
|
|
45
|
-
// Response interceptor - handle 401
|
|
45
|
+
// Response interceptor - unwrap API response and handle 401
|
|
46
46
|
client.interceptors.response.use(
|
|
47
|
-
(response) =>
|
|
47
|
+
(response) => {
|
|
48
|
+
// API wraps all responses in {data: ..., meta: {...}}
|
|
49
|
+
// Unwrap to return just the data portion
|
|
50
|
+
if (response.data && typeof response.data === 'object' && 'data' in response.data) {
|
|
51
|
+
response.data = response.data.data;
|
|
52
|
+
}
|
|
53
|
+
return response;
|
|
54
|
+
},
|
|
48
55
|
async (error: AxiosError) => {
|
|
49
56
|
if (error.response?.status === 401) {
|
|
50
57
|
if (sdkConfig.refreshAccessToken) {
|
|
@@ -29,7 +29,7 @@ export interface CreatePinRequest {
|
|
|
29
29
|
activity: string;
|
|
30
30
|
venueId?: string;
|
|
31
31
|
scheduledTime?: string; // ISO date string, required for SCHEDULED type
|
|
32
|
-
duration?: number; //
|
|
32
|
+
duration?: number; // hours (1-8), default 2 for HERE_NOW, 2 for SCHEDULED
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// ============================================================================
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Grouping Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for organizing events by time of day.
|
|
5
|
+
* Used in the Gatherings screen to show events grouped by
|
|
6
|
+
* Morning, Afternoon, and Evening.
|
|
7
|
+
*
|
|
8
|
+
* @module api/utils/eventGrouping
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { EventResponse } from '../types';
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// TYPES
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
export type TimeOfDay = 'MORNING' | 'AFTERNOON' | 'EVENING';
|
|
18
|
+
|
|
19
|
+
export interface GroupedEvents {
|
|
20
|
+
morning: EventResponse[];
|
|
21
|
+
afternoon: EventResponse[];
|
|
22
|
+
evening: EventResponse[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface TimeOfDayInfo {
|
|
26
|
+
key: TimeOfDay;
|
|
27
|
+
label: string;
|
|
28
|
+
emoji: string;
|
|
29
|
+
hours: { start: number; end: number };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// CONSTANTS
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
export const TIME_OF_DAY_CONFIG: Record<TimeOfDay, TimeOfDayInfo> = {
|
|
37
|
+
MORNING: {
|
|
38
|
+
key: 'MORNING',
|
|
39
|
+
label: 'Morning',
|
|
40
|
+
emoji: '',
|
|
41
|
+
hours: { start: 5, end: 11 }, // 5:00 AM - 11:59 AM
|
|
42
|
+
},
|
|
43
|
+
AFTERNOON: {
|
|
44
|
+
key: 'AFTERNOON',
|
|
45
|
+
label: 'Afternoon',
|
|
46
|
+
emoji: '',
|
|
47
|
+
hours: { start: 12, end: 16 }, // 12:00 PM - 4:59 PM
|
|
48
|
+
},
|
|
49
|
+
EVENING: {
|
|
50
|
+
key: 'EVENING',
|
|
51
|
+
label: 'Evening',
|
|
52
|
+
emoji: '',
|
|
53
|
+
hours: { start: 17, end: 4 }, // 5:00 PM - 4:59 AM (next day)
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// FUNCTIONS
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get time of day for a given date
|
|
63
|
+
*
|
|
64
|
+
* @param date - Date string or Date object
|
|
65
|
+
* @returns TimeOfDay - MORNING, AFTERNOON, or EVENING
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```tsx
|
|
69
|
+
* const timeOfDay = getTimeOfDay('2024-03-15T10:00:00Z');
|
|
70
|
+
* console.log(timeOfDay); // 'MORNING'
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export function getTimeOfDay(date: Date | string): TimeOfDay {
|
|
74
|
+
const d = typeof date === 'string' ? new Date(date) : date;
|
|
75
|
+
const hour = d.getHours();
|
|
76
|
+
|
|
77
|
+
if (hour >= 5 && hour < 12) return 'MORNING';
|
|
78
|
+
if (hour >= 12 && hour < 17) return 'AFTERNOON';
|
|
79
|
+
return 'EVENING';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get label for time of day
|
|
84
|
+
*
|
|
85
|
+
* @param timeOfDay - TimeOfDay enum value
|
|
86
|
+
* @returns Human-readable label
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* const label = getTimeOfDayLabel('MORNING');
|
|
91
|
+
* console.log(label); // 'Morning'
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function getTimeOfDayLabel(timeOfDay: TimeOfDay): string {
|
|
95
|
+
return TIME_OF_DAY_CONFIG[timeOfDay].label;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Group events by time of day
|
|
100
|
+
*
|
|
101
|
+
* @param events - Array of events to group
|
|
102
|
+
* @returns GroupedEvents object with morning, afternoon, and evening arrays
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```tsx
|
|
106
|
+
* import { useUpcomingEvents, groupEventsByTimeOfDay } from '@growsober/sdk';
|
|
107
|
+
*
|
|
108
|
+
* function GatheringsList() {
|
|
109
|
+
* const { data: events } = useUpcomingEvents(30);
|
|
110
|
+
* const grouped = useMemo(() => {
|
|
111
|
+
* if (!events) return null;
|
|
112
|
+
* return groupEventsByTimeOfDay(events);
|
|
113
|
+
* }, [events]);
|
|
114
|
+
*
|
|
115
|
+
* return (
|
|
116
|
+
* <SectionList
|
|
117
|
+
* sections={[
|
|
118
|
+
* { title: 'Morning', data: grouped?.morning || [] },
|
|
119
|
+
* { title: 'Afternoon', data: grouped?.afternoon || [] },
|
|
120
|
+
* { title: 'Evening', data: grouped?.evening || [] },
|
|
121
|
+
* ]}
|
|
122
|
+
* ...
|
|
123
|
+
* />
|
|
124
|
+
* );
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export function groupEventsByTimeOfDay(events: EventResponse[]): GroupedEvents {
|
|
129
|
+
const grouped: GroupedEvents = {
|
|
130
|
+
morning: [],
|
|
131
|
+
afternoon: [],
|
|
132
|
+
evening: [],
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
for (const event of events) {
|
|
136
|
+
const timeOfDay = getTimeOfDay(event.startDate);
|
|
137
|
+
switch (timeOfDay) {
|
|
138
|
+
case 'MORNING':
|
|
139
|
+
grouped.morning.push(event);
|
|
140
|
+
break;
|
|
141
|
+
case 'AFTERNOON':
|
|
142
|
+
grouped.afternoon.push(event);
|
|
143
|
+
break;
|
|
144
|
+
case 'EVENING':
|
|
145
|
+
grouped.evening.push(event);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return grouped;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Convert grouped events to section list data format
|
|
155
|
+
*
|
|
156
|
+
* @param events - Array of events to group
|
|
157
|
+
* @returns Array of sections with title and data
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```tsx
|
|
161
|
+
* const sections = getEventSections(events);
|
|
162
|
+
* // [
|
|
163
|
+
* // { title: 'Morning', data: [...] },
|
|
164
|
+
* // { title: 'Afternoon', data: [...] },
|
|
165
|
+
* // { title: 'Evening', data: [...] },
|
|
166
|
+
* // ]
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export function getEventSections(events: EventResponse[]): Array<{
|
|
170
|
+
title: string;
|
|
171
|
+
timeOfDay: TimeOfDay;
|
|
172
|
+
data: EventResponse[];
|
|
173
|
+
}> {
|
|
174
|
+
const grouped = groupEventsByTimeOfDay(events);
|
|
175
|
+
|
|
176
|
+
return [
|
|
177
|
+
{ title: 'Morning', timeOfDay: 'MORNING' as TimeOfDay, data: grouped.morning },
|
|
178
|
+
{ title: 'Afternoon', timeOfDay: 'AFTERNOON' as TimeOfDay, data: grouped.afternoon },
|
|
179
|
+
{ title: 'Evening', timeOfDay: 'EVENING' as TimeOfDay, data: grouped.evening },
|
|
180
|
+
].filter(section => section.data.length > 0);
|
|
181
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -55,3 +55,9 @@ export * from './api/queries';
|
|
|
55
55
|
|
|
56
56
|
export * from './api/mutations';
|
|
57
57
|
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// UTILITIES
|
|
60
|
+
// ============================================================================
|
|
61
|
+
|
|
62
|
+
export * from './api/utils/eventGrouping';
|
|
63
|
+
|