@olea-bps/base 1.1.7 → 1.1.9

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.
@@ -158,15 +158,15 @@ export default function ContactDetailComponent({ contact, ...restProps }) {
158
158
  {
159
159
  contact?.email
160
160
  ? <TouchableOpacity
161
- key="email"
161
+ key='mail'
162
162
  onPress={() => Linking.openURL('mailto:' + contact.email)}
163
163
  >
164
- <List.Item
164
+ <IconListItem
165
165
  title={t('contact:email')}
166
166
  description={contact.email}
167
167
  descriptionStyle={themeStyles.textLighter}
168
168
  titleStyle={themeStyles.searchDetailTitle}
169
- right={props => <List.Icon {...props} icon="email" />}
169
+ icon={'mail'}
170
170
  />
171
171
  </TouchableOpacity>
172
172
  : null
@@ -1,77 +1,77 @@
1
- import {Dimensions} from "react-native";
1
+ import { Dimensions } from 'react-native'
2
2
 
3
- export default function(theme) {
4
- const height = Dimensions.get('window').height;
5
- const width = Dimensions.get('window').width;
6
- return {
7
- overflow: {
8
- backgroundColor: theme.colors.overlayColor,
9
- },
10
- image: {
11
- position: 'absolute',
12
- top: 0,
13
- left: 0,
14
- right: 0,
15
- width: null,
16
- resizeMode: 'cover',
17
- },
18
- container: {
19
- flex: 1,
20
- overflow: 'hidden'
21
- },
22
- containerInner: {
23
- flex: 1
24
- },
25
- containerContent: {
26
- backgroundColor: theme.colors.contentBackground,
27
- flex: 1,
28
- paddingHorizontal: 5,
29
- paddingVertical: 20,
30
- minHeight: height * 1.25 // To make sure the animation won't break / stop
31
- },
32
- activity: {
33
- marginTop: 20
34
- },
35
- badges: {
36
- flexDirection: 'row',
37
- flexWrap: 'wrap',
38
- paddingHorizontal: 10
39
- },
40
- badge: {
41
- marginRight: 5,
42
- marginBottom: 5
43
- },
44
- title: {
45
- paddingLeft: 10,
46
- fontSize: theme.fontSizes.title,
47
- lineHeight: theme.lineHeights.titleBig
48
- },
49
- bar: {
50
- alignItems: 'flex-start',
51
- justifyContent: 'center',
52
- position: 'absolute',
53
- top: 5,
54
- left: 0,
55
- right: 0,
56
- },
57
- barText: {
58
- color: theme.colors.primaryText,
59
- ...theme.fonts.bold,
60
- },
61
- newsContent : {
62
- marginVertical: theme.paddings.default,
63
- marginHorizontal: theme.paddings.small,
64
- width: width - (2 * theme.paddings.small)
65
- },
66
- newsContentText: {
67
- fontSize: theme.fontSizes.m
68
- },
69
- imageDesc: {
70
- backgroundColor: theme.colors.overlayColor,
71
- color: theme.colors.primaryText,
72
- paddingVertical: 2,
73
- paddingHorizontal: theme.paddings.small,
74
- fontSize: theme.fontSizes.xs
75
- }
76
- };
3
+ export default function (theme) {
4
+ const height = Dimensions.get('window').height
5
+ const width = Dimensions.get('window').width
6
+ return {
7
+ overflow: {
8
+ backgroundColor: theme.colors.overlayColor
9
+ },
10
+ image: {
11
+ position: 'absolute',
12
+ top: 0,
13
+ left: 0,
14
+ right: 0,
15
+ width: null,
16
+ resizeMode: 'cover'
17
+ },
18
+ container: {
19
+ flex: 1,
20
+ overflow: 'hidden'
21
+ },
22
+ containerInner: {
23
+ flex: 1
24
+ },
25
+ containerContent: {
26
+ backgroundColor: theme.colors.contentBackground,
27
+ flex: 1,
28
+ paddingHorizontal: 5,
29
+ paddingVertical: 20,
30
+ minHeight: height // enough space for short news without excessive whitespace
31
+ },
32
+ activity: {
33
+ marginTop: 20
34
+ },
35
+ badges: {
36
+ flexDirection: 'row',
37
+ flexWrap: 'wrap',
38
+ paddingHorizontal: 10
39
+ },
40
+ badge: {
41
+ marginRight: 5,
42
+ marginBottom: 5
43
+ },
44
+ title: {
45
+ paddingLeft: 10,
46
+ fontSize: theme.fontSizes.title,
47
+ lineHeight: theme.lineHeights.titleBig
48
+ },
49
+ bar: {
50
+ alignItems: 'flex-start',
51
+ justifyContent: 'center',
52
+ position: 'absolute',
53
+ top: 5,
54
+ left: 0,
55
+ right: 0
56
+ },
57
+ barText: {
58
+ color: theme.colors.primaryText,
59
+ ...theme.fonts.bold
60
+ },
61
+ newsContent: {
62
+ marginVertical: theme.paddings.default,
63
+ marginHorizontal: theme.paddings.small,
64
+ width: width - (2 * theme.paddings.small)
65
+ },
66
+ newsContentText: {
67
+ fontSize: theme.fontSizes.m
68
+ },
69
+ imageDesc: {
70
+ backgroundColor: theme.colors.overlayColor,
71
+ color: theme.colors.primaryText,
72
+ paddingVertical: 2,
73
+ paddingHorizontal: theme.paddings.small,
74
+ fontSize: theme.fontSizes.xs
75
+ }
76
+ }
77
77
  }
@@ -1,11 +1,12 @@
1
- import { useSyncExternalStore } from 'react';
1
+ import { useSyncExternalStore } from 'react'
2
2
 
3
- import * as SecureStore from 'expo-secure-store';
3
+ import * as SecureStore from 'expo-secure-store'
4
+ import { getSecureItem, secureStoreOptions } from '../../libraries/stored-state'
4
5
 
5
- import { groupBy } from 'lodash';
6
- import { DateTime, Duration } from 'luxon';
6
+ import { groupBy } from 'lodash'
7
+ import { DateTime, Duration } from 'luxon'
7
8
 
8
- import CollectorVersion2ApiProvider from './CollectorVersion2ApiProvider';
9
+ import CollectorVersion2ApiProvider from './CollectorVersion2ApiProvider'
9
10
 
10
11
  /**
11
12
  * @typedef TimetableProvider
@@ -44,21 +45,21 @@ import CollectorVersion2ApiProvider from './CollectorVersion2ApiProvider';
44
45
  * @property {CourseTime[]} times
45
46
  */
46
47
 
47
- const TimetableCodeStoreKey = 'timetable.code';
48
- const TimetableCoursesStoreKey = 'timetable.courses';
48
+ const TimetableCodeStoreKey = 'timetable.code'
49
+ const TimetableCoursesStoreKey = 'timetable.courses'
49
50
 
50
51
  export class ApiProviderNotInitializedError extends Error {
51
- constructor(message) {
52
- super(message);
53
- this.name = this.constructor.name;
54
- }
52
+ constructor (message) {
53
+ super(message)
54
+ this.name = this.constructor.name
55
+ }
55
56
  }
56
57
 
57
58
  export class TimetableCodeNotInitializedError extends Error {
58
- constructor(message) {
59
- super(message);
60
- this.name = this.constructor.name;
61
- }
59
+ constructor (message) {
60
+ super(message)
61
+ this.name = this.constructor.name
62
+ }
62
63
  }
63
64
 
64
65
  /**
@@ -71,13 +72,12 @@ export class TimetableCodeNotInitializedError extends Error {
71
72
  * Der Service sollte über {@linkcode TimetableService.fromProviderSettingsObject} initialisert werden.
72
73
  */
73
74
  export default class TimetableService {
74
-
75
- /**
75
+ /**
76
76
  * @type {TimetableProvider}
77
77
  */
78
- #provider;
78
+ #provider
79
79
 
80
- /**
80
+ /**
81
81
  * Konstruktor des Stundenplan-Services.
82
82
  * Es muss ein Provider Übergeben werden, damit der Stundenplan-Service Daten über den Provider abrufen kann.
83
83
  * Es wird empfohlen {@linkcode TimetableService.fromProviderSettingsObject} zu verwenden.
@@ -92,199 +92,194 @@ export default class TimetableService {
92
92
  *
93
93
  * const timetableService = TimetableService.fromProviderSettingsObject(providerSettings, language);
94
94
  */
95
- constructor(provider) {
96
- this.#provider = provider;
95
+ constructor (provider) {
96
+ this.#provider = provider
97
97
 
98
- this.#code = SecureStore.getItem(TimetableCodeStoreKey);
99
- this.#courses = JSON.parse(SecureStore.getItem(TimetableCoursesStoreKey));
100
- }
98
+ this.#code = getSecureItem(TimetableCodeStoreKey)
99
+ this.#courses = JSON.parse(getSecureItem(TimetableCoursesStoreKey))
100
+ }
101
101
 
102
+ #code = undefined
103
+ #codeSubscribers = new Set()
102
104
 
105
+ code () {
106
+ return this.#code
107
+ }
103
108
 
104
- #code = undefined;
105
- #codeSubscribers = new Set();
109
+ codeCallback = () => this.code()
106
110
 
107
- code() {
108
- return this.#code;
109
- }
110
- codeCallback = () => this.code();
111
+ #setCode (code) {
112
+ this.#code = code
113
+ this.#codeSubscribers.forEach(subscriber => subscriber(code))
114
+ }
111
115
 
112
- #setCode(code) {
113
- this.#code = code;
114
- this.#codeSubscribers.forEach(subscriber => subscriber(code));
115
- }
116
- async setCode(code) {
117
- await SecureStore.setItemAsync(TimetableCodeStoreKey, code);
118
- this.#setCode(code);
119
- }
120
- setCodeCallback = async (code) => this.setCode(code);
116
+ async setCode (code) {
117
+ await SecureStore.setItemAsync(TimetableCodeStoreKey, code, secureStoreOptions)
118
+ this.#setCode(code)
119
+ }
121
120
 
122
- async deleteCode() {
121
+ setCodeCallback = async (code) => this.setCode(code)
123
122
 
124
- await Promise.all([
125
- SecureStore.deleteItemAsync(TimetableCodeStoreKey),
126
- SecureStore.deleteItemAsync(TimetableCoursesStoreKey),
127
- ]);
123
+ async deleteCode () {
124
+ await Promise.all([
125
+ SecureStore.deleteItemAsync(TimetableCodeStoreKey),
126
+ SecureStore.deleteItemAsync(TimetableCoursesStoreKey)
127
+ ])
128
128
 
129
- this.#setCode(null);
130
- this.#setCourses(null);
131
- }
132
- deleteCodeCallback = () => this.deleteCode();
129
+ this.#setCode(null)
130
+ this.#setCourses(null)
131
+ }
133
132
 
134
- codeSubscribe(subscriber) {
135
- this.#codeSubscribers.add(subscriber);
133
+ deleteCodeCallback = () => this.deleteCode()
136
134
 
137
- return () => this.codeUnsubscribe(subscriber);
138
- }
139
- codeSubscribeCallback = (subscriber) => this.codeSubscribe(subscriber);
135
+ codeSubscribe (subscriber) {
136
+ this.#codeSubscribers.add(subscriber)
140
137
 
141
- codeUnsubscribe(subscriber) {
142
- return this.#codeSubscribers.delete(subscriber);
143
- }
138
+ return () => this.codeUnsubscribe(subscriber)
139
+ }
144
140
 
141
+ codeSubscribeCallback = (subscriber) => this.codeSubscribe(subscriber)
145
142
 
143
+ codeUnsubscribe (subscriber) {
144
+ return this.#codeSubscribers.delete(subscriber)
145
+ }
146
146
 
147
- /**
147
+ /**
148
148
  * @type {Object.<string, Course[]>}
149
149
  */
150
- #courses = undefined;
151
- #coursesSubscribers = new Set();
150
+ #courses = undefined
151
+ #coursesSubscribers = new Set()
152
152
 
153
- /**
153
+ /**
154
154
  * Liefert die Vorlesungen, die von dem Service respeichert werden zurück.
155
155
  * Dabei werden die Vorlesungen nach Vorlesungstagen gruppiert.
156
156
  * Somit wird ein Object zurückgegeben, bei dem die Schlüssel ISO-Datums der Vorlesungstage sind und die Werte sind Listen mit Vorlesungen
157
157
  *
158
158
  * @returns {Object.<string, Course[]>} Vorlesungen gruppiert nach Vorlesungstagen
159
159
  */
160
- courses() {
161
- return this.#courses;
162
- }
160
+ courses () {
161
+ return this.#courses
162
+ }
163
163
 
164
- #setCourses(courses) {
165
- // Neue Vorlesungsdaten im Service hinterlegen
166
- this.#courses = courses;
164
+ #setCourses (courses) {
165
+ // Neue Vorlesungsdaten im Service hinterlegen
166
+ this.#courses = courses
167
167
 
168
- // Jedem Subscriber werden die neuen Vorlesungstage bekannt gemacht
169
- this.#coursesSubscribers.forEach(subscriber => subscriber(this.#courses));
170
- }
168
+ // Jedem Subscriber werden die neuen Vorlesungstage bekannt gemacht
169
+ this.#coursesSubscribers.forEach(subscriber => subscriber(this.#courses))
170
+ }
171
171
 
172
- coursesCallback = () => this.courses();
172
+ coursesCallback = () => this.courses()
173
173
 
174
- async refreshCourses(startDate, endDate) {
174
+ async refreshCourses (startDate, endDate) {
175
+ if (this.#provider === null) {
176
+ throw new ApiProviderNotInitializedError('Api Provider is not initilized')
177
+ }
175
178
 
176
- if (this.#provider === null) {
177
- throw new ApiProviderNotInitializedError('Api Provider is not initilized');
178
- }
179
+ if (this.#code === null) {
180
+ throw new TimetableCodeNotInitializedError('Timetable code is not initilized')
181
+ }
179
182
 
180
- if (this.#code === null) {
181
- throw new TimetableCodeNotInitializedError('Timetable code is not initilized');
183
+ const courses = await this.#provider.getByCode(this.#code, startDate, endDate)
184
+ const transformedCourses = courses.map(
185
+ course => {
186
+ // Erstes Time-Element aus dem times-Array nehmen, da im neuen Format nur noch eine Zeit enthalten ist
187
+ const courseTime = course?.times?.[0]
188
+ if (courseTime) {
189
+ const courseDate = DateTime.fromISO(courseTime?.date)
190
+ // Startzeit und Endzeit der Vorlesung in ein DateTime umwandeln
191
+ const courseStartTime = Duration.fromISOTime(courseTime.start)
192
+ const courseStartDateTime = courseDate.plus(courseStartTime)
193
+ const courseEndTime = Duration.fromISOTime(courseTime.end)
194
+ const courseEndDateTime = courseDate.plus(courseEndTime)
195
+
196
+ return {
197
+ ...course,
198
+ startDateTime: courseStartDateTime.toISO(),
199
+ endDateTime: courseEndDateTime.toISO()
200
+ }
201
+ } else {
202
+ return course
182
203
  }
183
-
184
- const courses = await this.#provider.getByCode(this.#code, startDate, endDate);
185
- const transformedCourses = courses.map(
186
- course => {
187
- // Erstes Time-Element aus dem times-Array nehmen, da im neuen Format nur noch eine Zeit enthalten ist
188
- const courseTime = course?.times?.[0];
189
- if (courseTime) {
190
- const courseDate = DateTime.fromISO(courseTime?.date);
191
- // Startzeit und Endzeit der Vorlesung in ein DateTime umwandeln
192
- const courseStartTime = Duration.fromISOTime(courseTime.start);
193
- const courseStartDateTime = courseDate.plus(courseStartTime);
194
- const courseEndTime = Duration.fromISOTime(courseTime.end);
195
- const courseEndDateTime = courseDate.plus(courseEndTime);
196
-
197
- return {
198
- ...course,
199
- startDateTime: courseStartDateTime.toISO(),
200
- endDateTime: courseEndDateTime.toISO(),
201
- }
202
- } else {
203
- return course;
204
- }
205
- }
206
- )
207
-
208
- // Gruppieren der vom Provider abgeholten Vorlesungen
209
- // Es wird nach dem Datum der Vorlesungen gruppiert
210
- // Vorlesungen, die keinem Tag zugeordnet werden können, werden untder dem Schlüssel `undefined` zusammengefasst
211
- const addingCourses = groupBy(
212
- transformedCourses,
213
- course => {
214
- // Datum der Vorlesung aus der Vorlesung holen
215
- const courseDate = course?.times?.[0]?.date;
216
-
217
- // Prüfen ob die Vorlesung einen Wert als Datum vorweist
218
- return courseDate
219
- // Ist ein Wert vorhanden, wird dieser für die Gruppierung verwendet
220
- ? courseDate
221
- // Ansonsten wird undefined zurückgeben (lerrer String, null, undefined, ...)
222
- : undefined;
223
- }
224
- );
225
-
226
- //Entfernen der Vorlesungstage zwischen Startdatum und Enddatum
227
- const rangeRemovedCourses = Object.fromEntries(
228
- Object.entries(this.#courses ?? {})
229
- .filter(([coursesDate,]) => startDate >= coursesDate && coursesDate <= endDate)
230
- );
231
-
232
- // Zusammenführen der neuen Vorlesungstagen der Vorlesungen des Providers und der schon vorhandenen Vorlesungstagen
233
- const newCourses = {
234
- ...rangeRemovedCourses,
235
- ...addingCourses,
236
- };
237
-
238
- // Neue Vorlesungsdaten in den Cache ablegen
239
- SecureStore.setItem(TimetableCoursesStoreKey, JSON.stringify(newCourses));
240
-
241
- // Neue Vorlesungen hin Service hinterlegen und Äanderun bekannt geben
242
- this.#setCourses(newCourses);
204
+ }
205
+ )
206
+
207
+ // Gruppieren der vom Provider abgeholten Vorlesungen
208
+ // Es wird nach dem Datum der Vorlesungen gruppiert
209
+ // Vorlesungen, die keinem Tag zugeordnet werden können, werden untder dem Schlüssel `undefined` zusammengefasst
210
+ const addingCourses = groupBy(
211
+ transformedCourses,
212
+ course => {
213
+ // Datum der Vorlesung aus der Vorlesung holen
214
+ const courseDate = course?.times?.[0]?.date
215
+
216
+ // Prüfen ob die Vorlesung einen Wert als Datum vorweist
217
+ return courseDate || undefined
218
+ }
219
+ )
220
+
221
+ // Entfernen der Vorlesungstage zwischen Startdatum und Enddatum
222
+ const rangeRemovedCourses = Object.fromEntries(
223
+ Object.entries(this.#courses ?? {})
224
+ .filter(([coursesDate]) => startDate >= coursesDate && coursesDate <= endDate)
225
+ )
226
+
227
+ // Zusammenführen der neuen Vorlesungstagen der Vorlesungen des Providers und der schon vorhandenen Vorlesungstagen
228
+ const newCourses = {
229
+ ...rangeRemovedCourses,
230
+ ...addingCourses
243
231
  }
244
- refreshCoursesCallback = (startDate, endDate) => this.refreshCourses(startDate, endDate);
245
232
 
246
- coursesSubscribe(subscriber) {
247
- this.#coursesSubscribers.add(subscriber);
233
+ // Neue Vorlesungsdaten in den Cache ablegen
234
+ SecureStore.setItem(TimetableCoursesStoreKey, JSON.stringify(newCourses), secureStoreOptions)
248
235
 
249
- return () => this.coursesUnsubscribe(subscriber);
250
- }
251
- coursesSubscribeCallback = (subscriber) => this.coursesSubscribe(subscriber);
236
+ // Neue Vorlesungen hin Service hinterlegen und Äanderun bekannt geben
237
+ this.#setCourses(newCourses)
238
+ }
252
239
 
253
- coursesUnsubscribe(subscriber) {
254
- return this.#coursesSubscribers.delete(subscriber);
255
- }
240
+ refreshCoursesCallback = (startDate, endDate) => this.refreshCourses(startDate, endDate)
241
+
242
+ coursesSubscribe (subscriber) {
243
+ this.#coursesSubscribers.add(subscriber)
244
+
245
+ return () => this.coursesUnsubscribe(subscriber)
246
+ }
256
247
 
248
+ coursesSubscribeCallback = (subscriber) => this.coursesSubscribe(subscriber)
257
249
 
250
+ coursesUnsubscribe (subscriber) {
251
+ return this.#coursesSubscribers.delete(subscriber)
252
+ }
258
253
 
259
- /**
254
+ /**
260
255
  * Erstellen eines Stundenplanservices mit Hilfe der Provider-Einstellungen und Sprache
261
256
  *
262
257
  * @param {ProviderSetting} providerSettingsObject
263
258
  * @param {string} language
264
259
  * @returns
265
260
  */
266
- static fromProviderSettingsObject(providerSettingsObject, language) {
267
- const provider = TimetableService.#createProvider(providerSettingsObject, language);
261
+ static fromProviderSettingsObject (providerSettingsObject, language) {
262
+ const provider = TimetableService.#createProvider(providerSettingsObject, language)
268
263
 
269
- return new TimetableService(provider);
270
- }
264
+ return new TimetableService(provider)
265
+ }
271
266
 
272
- /**
267
+ /**
273
268
  * Erstellen des Providers mit Hilfe eines Provider-Einstellungen-Objektes und einer Sprache
274
269
  *
275
270
  * @param {ProviderSetting} providerSettingsObject Einstellungen welche zum auswählen und Initialisieren des Provider verwendet werden
276
271
  * @param {string} language Sprachcode welcher für den Datenabruf verwendet werden soll
277
272
  */
278
- static #createProvider(providerSettingsObject, language) {
279
- const { provider } = providerSettingsObject;
280
-
281
- switch (provider) {
282
- case CollectorVersion2ApiProvider.name:
283
- return CollectorVersion2ApiProvider.fromSettingsObject(providerSettingsObject, language);
284
- default:
285
- return null;
286
- }
273
+ static #createProvider (providerSettingsObject, language) {
274
+ const { provider } = providerSettingsObject
275
+
276
+ switch (provider) {
277
+ case CollectorVersion2ApiProvider.name:
278
+ return CollectorVersion2ApiProvider.fromSettingsObject(providerSettingsObject, language)
279
+ default:
280
+ return null
287
281
  }
282
+ }
288
283
  }
289
284
 
290
285
  /**
@@ -311,13 +306,13 @@ export default class TimetableService {
311
306
  * </Text>
312
307
  * );
313
308
  */
314
- export function useSyncTimetableCode(timetableService) {
315
- const timetableCode = useSyncExternalStore(
316
- timetableService.codeSubscribeCallback,
317
- timetableService.codeCallback,
318
- );
309
+ export function useSyncTimetableCode (timetableService) {
310
+ const timetableCode = useSyncExternalStore(
311
+ timetableService.codeSubscribeCallback,
312
+ timetableService.codeCallback
313
+ )
319
314
 
320
- return [timetableCode, timetableService.setCodeCallback, timetableService.deleteCodeCallback];
315
+ return [timetableCode, timetableService.setCodeCallback, timetableService.deleteCodeCallback]
321
316
  }
322
317
 
323
318
  /**
@@ -347,11 +342,11 @@ export function useSyncTimetableCode(timetableService) {
347
342
  * return (
348
343
  * );
349
344
  */
350
- export function useSyncCourses(timetableService) {
351
- const courses = useSyncExternalStore(
352
- timetableService.coursesSubscribeCallback,
353
- timetableService.coursesCallback,
354
- );
345
+ export function useSyncCourses (timetableService) {
346
+ const courses = useSyncExternalStore(
347
+ timetableService.coursesSubscribeCallback,
348
+ timetableService.coursesCallback
349
+ )
355
350
 
356
- return [courses, timetableService.refreshCoursesCallback];
351
+ return [courses, timetableService.refreshCoursesCallback]
357
352
  }
@@ -28,7 +28,7 @@
28
28
  "README.md"
29
29
  ],
30
30
  "dependencies": {
31
- "react-native-webview": "13.16.0"
31
+ "react-native-webview": "13.16.1"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "react": "^19.0.0",