@olea-bps/context-event 1.0.0

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 (2) hide show
  1. package/index.js +194 -0
  2. package/package.json +26 -0
package/index.js ADDED
@@ -0,0 +1,194 @@
1
+ import { useContext, createContext, useMemo, useCallback, useEffect } from 'react';
2
+
3
+ import { useTheme } from 'react-native-paper';
4
+
5
+ import { useSecureStoredState } from '@olea-bps/stored-state';
6
+
7
+ import AsistServerClient from './AsistServerClient';
8
+
9
+ const EventCodeStoreKey = 'event.eventCode';
10
+ const EventsStoreKey = 'event.events';
11
+ const PersonalEventsStoreKey = 'event.personelEvents';
12
+
13
+ /**
14
+ * Context for event api
15
+ */
16
+ export const EventContext = createContext(null);
17
+
18
+ /**
19
+ * Extendet context provider for EventAPIContext.
20
+ * Use settings in Settings.js to generate context values and event api client.
21
+ * currently only supports event api client for asist server rest api.
22
+ * But can be extendet to support more event services.
23
+ * @param {props} properties of provider
24
+ */
25
+ export default function EventContextProvider({ children }) {
26
+ const { appSettings } = useTheme();
27
+ const eventAPIProvider = appSettings?.modules?.event?.api?.provider;
28
+ const eventAPIBaseUrl = appSettings?.modules?.event?.api?.baseUrl;
29
+ const university = appSettings?.api?.university ?? null;
30
+
31
+ const [events, setEvents] = useSecureStoredState(EventsStoreKey);
32
+ const [personalEventsCode, setPersonalEventsCode, deletePersonalEventsCode] = useSecureStoredState(EventCodeStoreKey, null, true);
33
+ const [personalEvents, setPersonalEvents, deletePersonalEvents] = useSecureStoredState(PersonalEventsStoreKey,)
34
+
35
+ const sortedEvents = useMemo(
36
+ () => {
37
+ if (Array.isArray(events)) {
38
+ const sortingEvents = [...events];
39
+ sortingEvents
40
+ // Berechnen der Sortierung
41
+ // Zuerst wird nach Startzeit sortier, ist diese gleich wird nach dem Enddatum sortiert
42
+ .sort(
43
+ (first, second) => {
44
+ const sortOrder = moment(first.begin) - moment(second.begin);
45
+
46
+ return sortOrder === 0
47
+ ? moment(first.end) - moment(second.end)
48
+ : sortOrder
49
+ }
50
+ );
51
+
52
+ return sortingEvents;
53
+ } else {
54
+ return null;
55
+ }
56
+ },
57
+ [events]
58
+ )
59
+
60
+ const eventAPIClient = useMemo(
61
+
62
+ () => {
63
+ switch (eventAPIProvider?.toLowerCase()) {
64
+ case 'asist-server':
65
+ return new AsistServerClient(eventAPIBaseUrl, university);
66
+ default:
67
+ return null;
68
+ }
69
+ },
70
+ [eventAPIProvider, eventAPIBaseUrl, university]
71
+ )
72
+
73
+ const refreshEvents = useCallback(
74
+ () => eventAPIClient.getAll()
75
+ .then(setEvents),
76
+ [eventAPIClient]
77
+ )
78
+
79
+ const refreshPersonalEvents = useCallback(
80
+ () => eventAPIClient.getByPersonalCode(personalEventsCode)
81
+ .then(setPersonalEvents),
82
+ [eventAPIClient, personalEventsCode]
83
+ )
84
+
85
+ function deletePersonalEventsCodeAndPersonalEvents() {
86
+ deletePersonalEventsCode();
87
+ deletePersonalEvents();
88
+ }
89
+
90
+ useEffect(
91
+ () => {
92
+ refreshEvents();
93
+ },
94
+ [refreshEvents]
95
+ )
96
+
97
+ useEffect(
98
+ () => {
99
+ if (personalEventsCode) {
100
+ refreshPersonalEvents();
101
+ }
102
+ },
103
+ [eventAPIClient, personalEventsCode, refreshPersonalEvents]
104
+ )
105
+
106
+ return (
107
+ <EventContext.Provider
108
+ value={
109
+ {
110
+ events: sortedEvents,
111
+ refreshEvents: refreshEvents,
112
+
113
+ personalEvents: personalEvents,
114
+ refreshPersonalEvents: refreshPersonalEvents,
115
+
116
+ personalEventsCode: personalEventsCode,
117
+ setPersonalEventsCode: setPersonalEventsCode,
118
+ deletePersonalEventsCode: deletePersonalEventsCodeAndPersonalEvents,
119
+
120
+ apiClient: eventAPIClient,
121
+ }
122
+ }
123
+ >
124
+ {children}
125
+ </EventContext.Provider>
126
+ )
127
+ }
128
+
129
+ /**
130
+ * Dieser Hook stellt den EventContext bereit.
131
+ *
132
+ * Dieser Hook sollte grundsätlich nur von anderen Hooks verwendet werden.
133
+ * @returns {object} Eventkontext
134
+ */
135
+ export function useEventContext() {
136
+ return useContext(EventContext);
137
+ }
138
+
139
+ /**
140
+ * Über diesen Hook gelangt man an die persönlichen Veranstaltungen.
141
+ * Dafür wird der persönliche Veranstaltungscode (siehe {@link usePersonalEventsCode }) verwendet.
142
+ *
143
+ * @returns {[Array, () => Promise]} Liste der persönlichen Veranstalltungen entsprechnd des persönlichen Codes
144
+ * @example
145
+ * const [personalEvents, refreshPersonalEvents] = usePersonalEvents();
146
+ */
147
+ export function usePersonalEvents() {
148
+ const eventContext = useEventContext();
149
+
150
+ return [eventContext.personalEvents, eventContext.refreshPersonalEvents];
151
+ }
152
+
153
+ /**
154
+ *
155
+ * @returns {[Array, () => void]}
156
+ * @example
157
+ * const [events, refreshEvents] = useEvents();
158
+ *
159
+ * useEffect(
160
+ * () => {
161
+ * refreshEvents();
162
+ * },
163
+ * []
164
+ * );
165
+ *
166
+ * return (
167
+ * events.map(
168
+ * event => JSON.stringify(event);
169
+ * )
170
+ * )
171
+ */
172
+ export function useEvents() {
173
+ const eventContext = useEventContext();
174
+ return [eventContext.events, eventContext.refreshEvents];
175
+ }
176
+
177
+ /**
178
+ * Hook to get and set personal code.
179
+ * Please use hook like: const [personalCode, setPersonalCode] = usePersonalCode();
180
+ * currently not in use.
181
+ * @returns {[string, () => void, () => void]} First element is the value of the personal code and the second element a update function for the personal code.
182
+ */
183
+ export function usePersonalEventsCode() {
184
+ const eventContext = useEventContext();
185
+ return [eventContext.personalEventsCode, eventContext.setPersonalEventsCode, eventContext.deletePersonalEventsCode];
186
+ }
187
+
188
+ /**
189
+ * Hook to get event api client from context.
190
+ * @returns {Object}
191
+ */
192
+ export function useEventApiClient() {
193
+ return useEventContext().apiClient;
194
+ }
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@olea-bps/context-event",
3
+ "version": "1.0.0",
4
+ "description": "Context for event",
5
+ "main": "index.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/tuc-urz/olea.git",
13
+ "directory": "packages/context/context-event"
14
+ },
15
+ "keywords": [
16
+ "context",
17
+ "event"
18
+ ],
19
+ "license": "Apache-2.0",
20
+ "files": [
21
+ "index.js",
22
+ "package.json",
23
+ "LICENSE",
24
+ "README.md"
25
+ ]
26
+ }