@olea-bps/base 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.
- package/components/AppBar/index.js +84 -0
- package/components/AppBar/styles.js +27 -0
- package/components/BookDetail/index.js +268 -0
- package/components/BookDetail/styles.js +124 -0
- package/components/ComponentJobsFilter/index.js +188 -0
- package/components/ComponentJobsFilter/styles.js +12 -0
- package/components/ConnectivityWarning/index.js +65 -0
- package/components/ConnectivityWarning/styles.js +19 -0
- package/components/ContactDetail/index.js +232 -0
- package/components/ContactDetail/styles.js +32 -0
- package/components/CourseDetail/index.js +357 -0
- package/components/CourseDetail/styles.js +59 -0
- package/components/CourseDetailDialog/index.js +169 -0
- package/components/CourseDetailDialog/styles.js +116 -0
- package/components/CourseInfo/index.js +219 -0
- package/components/CourseInfo/styles.js +40 -0
- package/components/DevelopmentDialog/index.js +214 -0
- package/components/DevelopmentDialog/styles.js +10 -0
- package/components/EventCodeInput/index.js +149 -0
- package/components/EventCodeInput/styles.js +108 -0
- package/components/FlexMenuEntry/index.js +84 -0
- package/components/FlexMenuEntry/styles.js +27 -0
- package/components/MainMenuEntry/index.js +88 -0
- package/components/MainMenuEntry/styles.js +28 -0
- package/components/MealItem/index.js +87 -0
- package/components/MealItem/styles.js +84 -0
- package/components/MensaMenu/index.js +305 -0
- package/components/MensaMenu/styles.js +94 -0
- package/components/MensaSlider/index.js +188 -0
- package/components/MensaSlider/styles.js +53 -0
- package/components/Modal/index.js +106 -0
- package/components/Modal/styles.js +8 -0
- package/components/NewsDetail/index.js +377 -0
- package/components/NewsDetail/styles.js +77 -0
- package/components/NewsList/index.js +120 -0
- package/components/NewsList/styles.js +19 -0
- package/components/NewsListItem/index.js +89 -0
- package/components/NewsListItem/styles.js +32 -0
- package/components/OtherCourses/index.js +152 -0
- package/components/OtherCourses/styles.js +10 -0
- package/components/PtsDeparture/index.js +140 -0
- package/components/PtsDeparture/styles.js +7 -0
- package/components/PtsStation/index.js +186 -0
- package/components/PtsStation/styles.js +47 -0
- package/components/QuickLinks/index.js +127 -0
- package/components/QuickLinks/styles.js +45 -0
- package/components/RoomDetail/index.js +281 -0
- package/components/RoomDetail/styles.js +56 -0
- package/components/ScaledImage/index.js +92 -0
- package/components/SearchResults/index.js +362 -0
- package/components/SearchResults/styles.js +59 -0
- package/components/SettingSection/index.js +54 -0
- package/components/SettingSection/styles.js +15 -0
- package/components/SettingsDialog/index.js +52 -0
- package/components/SettingsDialog/styles.js +12 -0
- package/components/SettingsDialogRadio/index.js +66 -0
- package/components/SettingsDialogRadio/styles.js +7 -0
- package/components/SettingsDialogSelect/index.js +73 -0
- package/components/SettingsDialogSelect/styles.js +7 -0
- package/components/TimetableCodeInput/index.js +205 -0
- package/components/TimetableCodeInput/styles.js +28 -0
- package/components/TimetableDay/index.js +252 -0
- package/components/TimetableDay/styles.js +103 -0
- package/components/TimetableEvent/index.js +163 -0
- package/components/TimetableEvent/styles.js +108 -0
- package/components/TimetableList/index.js +180 -0
- package/components/TimetableList/styles.js +106 -0
- package/components/TimetableMonth/index.js +156 -0
- package/components/TimetableMonth/styles.js +29 -0
- package/components/TimetableWeek/index.js +230 -0
- package/components/TimetableWeek/styles.js +58 -0
- package/components/TopNews/index.js +282 -0
- package/components/TopNews/styles.js +125 -0
- package/components/TopNewsHtwk/index.js +279 -0
- package/components/TopNewsHtwk/styles.js +142 -0
- package/components/WebView/index.js +108 -0
- package/components/WebView/styles.js +11 -0
- package/context/context-callmanager/TucCallManager.js +74 -0
- package/context/context-callmanager/index.js +128 -0
- package/context/context-canteen/AsistServerApiProvider.js +126 -0
- package/context/context-canteen/CollektorVersion2ApiProvider.js +100 -0
- package/context/context-canteen/index.js +692 -0
- package/context/context-connectivity/index.js +85 -0
- package/context/context-event/AsistServerClient.js +82 -0
- package/context/context-event/index.js +205 -0
- package/context/context-flex-menu/AsistServerApiProvider.js +0 -0
- package/context/context-flex-menu/CollectorVersion2ApiProvider.js +32 -0
- package/context/context-flex-menu/index.js +160 -0
- package/context/context-info-dialog/CollektorVersion2ApiProvider.js +53 -0
- package/context/context-info-dialog/ProviderErrors.js +22 -0
- package/context/context-info-dialog/index.js +190 -0
- package/context/context-mails/MailService.js +147 -0
- package/context/context-mails/TucUnseenApiProvider.js +65 -0
- package/context/context-mails/index.js +131 -0
- package/context/context-news/CollektorVersion2ApiProvider.js +68 -0
- package/context/context-news/index.js +155 -0
- package/context/context-public-transport-ticket/CollektorVersion2ApiProvider.js +45 -0
- package/context/context-public-transport-ticket/ProviderErrors.js +11 -0
- package/context/context-public-transport-ticket/index.js +175 -0
- package/context/context-timetable/CollectorVersion2ApiProvider.js +102 -0
- package/context/context-timetable/ProviderErrors.js +22 -0
- package/context/context-timetable/TimetableService.js +357 -0
- package/context/context-timetable/index.js +215 -0
- package/context/context-user/index.js +586 -0
- package/index.js +178 -0
- package/libraries/base-api-provider/hooks.js +24 -0
- package/libraries/base-api-provider/http-api-provider.js +168 -0
- package/libraries/base-api-provider/index.js +20 -0
- package/libraries/core/api/canteens.js +88 -0
- package/libraries/core/api/corona.js +45 -0
- package/libraries/core/api/courses.js +54 -0
- package/libraries/core/api/device.js +98 -0
- package/libraries/core/api/feed.js +144 -0
- package/libraries/core/api/feedback.js +123 -0
- package/libraries/core/api/jobs.js +48 -0
- package/libraries/core/api/library.js +67 -0
- package/libraries/core/api/lostfound.js +77 -0
- package/libraries/core/api/occupancy.js +44 -0
- package/libraries/core/api/officehours.js +25 -0
- package/libraries/core/api/poi.js +25 -0
- package/libraries/core/api/pts.js +68 -0
- package/libraries/core/api/rooms.js +31 -0
- package/libraries/core/api/survey.js +121 -0
- package/libraries/core/api/telephone.js +32 -0
- package/libraries/core/api/tucrooms.js +31 -0
- package/libraries/core/constants/actions.js +75 -0
- package/libraries/core/constants/api.js +146 -0
- package/libraries/core/constants/enums.js +5 -0
- package/libraries/core/helper/date.js +9 -0
- package/libraries/core/helper/format.helper.js +2 -0
- package/libraries/core/index.js +60 -0
- package/libraries/core/redux/actions/notifications.js +6 -0
- package/libraries/core/redux/actions/setting.js +75 -0
- package/libraries/core/redux/actions/state.js +74 -0
- package/libraries/core/redux/asyncDispatch.js +27 -0
- package/libraries/core/redux/reducers/api.js +190 -0
- package/libraries/core/redux/reducers/index.js +32 -0
- package/libraries/core/redux/reducers/notifications.js +16 -0
- package/libraries/core/redux/reducers/setting.js +99 -0
- package/libraries/core/redux/reducers/state.js +122 -0
- package/libraries/core/redux/selectors.js +123 -0
- package/libraries/core/redux/store.js +40 -0
- package/libraries/core/services/data.js +96 -0
- package/libraries/core/services/root-navigation.js +36 -0
- package/libraries/core/services/search.js +175 -0
- package/libraries/core-plugins/enums/replaceTypes.js +53 -0
- package/libraries/core-plugins/index.js +21 -0
- package/libraries/core-plugins/redux/actions/plugin.js +13 -0
- package/libraries/core-plugins/redux/reducers/plugin.js +210 -0
- package/libraries/icons-openasist/index.js +143 -0
- package/libraries/notifications/index.js +268 -0
- package/libraries/notifications/services/subscriber.service.js +123 -0
- package/libraries/react-native-webview-autoheight/README.md +47 -0
- package/libraries/react-native-webview-autoheight/index.js +140 -0
- package/libraries/react-native-webview-autoheight/package.json +37 -0
- package/libraries/react-native-webview-autoheight/utils.js +268 -0
- package/libraries/redux-offline/.eslintignore +1 -0
- package/libraries/redux-offline/.github/ISSUE_TEMPLATE/redux-offline-core-issues-template.md +25 -0
- package/libraries/redux-offline/.prettierrc +6 -0
- package/libraries/redux-offline/LICENSE +21 -0
- package/libraries/redux-offline/README.md +133 -0
- package/libraries/redux-offline/flow-typed/npm/redux-logger_vx.x.x.js +109 -0
- package/libraries/redux-offline/flow-typed/npm/redux_v4.x.x.js +100 -0
- package/libraries/redux-offline/lib/actions.js +46 -0
- package/libraries/redux-offline/lib/config.js +15 -0
- package/libraries/redux-offline/lib/constants.js +17 -0
- package/libraries/redux-offline/lib/defaults/defaultCommit.js +11 -0
- package/libraries/redux-offline/lib/defaults/defaultRollback.js +11 -0
- package/libraries/redux-offline/lib/defaults/detectNetwork.js +33 -0
- package/libraries/redux-offline/lib/defaults/detectNetwork.native.js +211 -0
- package/libraries/redux-offline/lib/defaults/discard.js +18 -0
- package/libraries/redux-offline/lib/defaults/effect.js +87 -0
- package/libraries/redux-offline/lib/defaults/index.js +32 -0
- package/libraries/redux-offline/lib/defaults/offlineStateLens.js +24 -0
- package/libraries/redux-offline/lib/defaults/persist.js +9 -0
- package/libraries/redux-offline/lib/defaults/persist.native.js +17 -0
- package/libraries/redux-offline/lib/defaults/persistAutoRehydrate.js +8 -0
- package/libraries/redux-offline/lib/defaults/queue.js +27 -0
- package/libraries/redux-offline/lib/defaults/retry.js +29 -0
- package/libraries/redux-offline/lib/index.js +115 -0
- package/libraries/redux-offline/lib/middleware.js +56 -0
- package/libraries/redux-offline/lib/offlineActionTracker.js +43 -0
- package/libraries/redux-offline/lib/send.js +112 -0
- package/libraries/redux-offline/lib/types.js +3 -0
- package/libraries/redux-offline/lib/updater.js +111 -0
- package/libraries/redux-offline/package.json +69 -0
- package/libraries/redux-offline/src/__tests__/defaults/discard.js +22 -0
- package/libraries/redux-offline/src/__tests__/defaults/effect.js +118 -0
- package/libraries/redux-offline/src/__tests__/index.js +116 -0
- package/libraries/redux-offline/src/__tests__/middleware.js +185 -0
- package/libraries/redux-offline/src/__tests__/offlineActionTracker.js +54 -0
- package/libraries/redux-offline/src/__tests__/send.js +208 -0
- package/libraries/redux-offline/src/actions.js +36 -0
- package/libraries/redux-offline/src/config.js +9 -0
- package/libraries/redux-offline/src/constants.js +18 -0
- package/libraries/redux-offline/src/defaults/defaultCommit.js +7 -0
- package/libraries/redux-offline/src/defaults/defaultRollback.js +7 -0
- package/libraries/redux-offline/src/defaults/detectNetwork.js +16 -0
- package/libraries/redux-offline/src/defaults/detectNetwork.native.js +148 -0
- package/libraries/redux-offline/src/defaults/discard.js +19 -0
- package/libraries/redux-offline/src/defaults/effect.js +86 -0
- package/libraries/redux-offline/src/defaults/index.js +25 -0
- package/libraries/redux-offline/src/defaults/offlineStateLens.js +11 -0
- package/libraries/redux-offline/src/defaults/persist.js +4 -0
- package/libraries/redux-offline/src/defaults/persist.native.js +9 -0
- package/libraries/redux-offline/src/defaults/persistAutoRehydrate.js +4 -0
- package/libraries/redux-offline/src/defaults/queue.js +20 -0
- package/libraries/redux-offline/src/defaults/retry.js +18 -0
- package/libraries/redux-offline/src/index.js +138 -0
- package/libraries/redux-offline/src/middleware.js +52 -0
- package/libraries/redux-offline/src/offlineActionTracker.js +40 -0
- package/libraries/redux-offline/src/send.js +111 -0
- package/libraries/redux-offline/src/types.js +127 -0
- package/libraries/redux-offline/src/updater.js +141 -0
- package/libraries/redux-offline/typings.d.ts +150 -0
- package/libraries/redux-offline/yarn.lock +6460 -0
- package/libraries/stored-state/index.js +155 -0
- package/package.json +68 -0
- package/views/Callmanager/index.js +148 -0
- package/views/Callmanager/styles.js +62 -0
- package/views/Canteens/index.js +383 -0
- package/views/Canteens/styles.js +89 -0
- package/views/Dashboard/index.js +176 -0
- package/views/Dashboard/styles.js +16 -0
- package/views/DashboardHtwk/index.js +197 -0
- package/views/DashboardHtwk/styles.js +24 -0
- package/views/Event/index.js +373 -0
- package/views/Event/styles.js +63 -0
- package/views/FeedList/index.js +165 -0
- package/views/FeedList/styles.js +15 -0
- package/views/FeedNews/index.js +243 -0
- package/views/FeedNews/styles.js +32 -0
- package/views/Flexmenu/index.js +185 -0
- package/views/Flexmenu/styles.js +62 -0
- package/views/FlexmenuWebview/index.js +167 -0
- package/views/FlexmenuWebview/styles.js +16 -0
- package/views/Howhy/index.js +151 -0
- package/views/Howhy/styles.js +11 -0
- package/views/Jobs/index.js +217 -0
- package/views/Jobs/styles.js +41 -0
- package/views/MainMenu/index.js +283 -0
- package/views/MainMenu/styles.js +36 -0
- package/views/NewsTabbar/index.js +164 -0
- package/views/NewsTabbar/styles.js +27 -0
- package/views/Opal/index.js +136 -0
- package/views/Opal/styles.js +11 -0
- package/views/PublicTransportTicket/index.js +173 -0
- package/views/PublicTransportTicket/styles.js +17 -0
- package/views/Search/index.js +186 -0
- package/views/Search/styles.js +67 -0
- package/views/SettingsAccessibility/index.js +148 -0
- package/views/SettingsAccessibility/styles.js +13 -0
- package/views/SettingsAppInfo/index.js +86 -0
- package/views/SettingsAppInfo/styles.js +18 -0
- package/views/SettingsCanteens/index.js +249 -0
- package/views/SettingsCanteens/styles.js +33 -0
- package/views/SettingsGeneral/index.js +173 -0
- package/views/SettingsGeneral/styles.js +28 -0
- package/views/SettingsNotifications/index.js +204 -0
- package/views/SettingsNotifications/styles.js +38 -0
- package/views/SettingsUser/index.js +170 -0
- package/views/SettingsUser/styles.js +17 -0
- package/views/TimetableCalendar/index.js +387 -0
- package/views/TimetableCalendar/styles.js +121 -0
- package/views/TimetableList/index.js +402 -0
- package/views/TimetableList/styles.js +55 -0
- package/views/Webviews/index.js +158 -0
- package/views/Webviews/styles.js +11 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { action, commitAction, rollbackAction } from '../../constants/actions';
|
|
2
|
+
import { onUpdateRefreshing } from '../../redux/actions/state';
|
|
3
|
+
import { CourseStatusEnum } from '../../constants/enums';
|
|
4
|
+
import { toIsoDateString } from '../../helper/date';
|
|
5
|
+
|
|
6
|
+
const selectFeeds = state => state.apiReducer.feeds;
|
|
7
|
+
|
|
8
|
+
const selectFeedById = (state, feedId) => state.apiReducer.feeds.find(feed => feed.feedid === feedId);
|
|
9
|
+
|
|
10
|
+
const initialState = {
|
|
11
|
+
feeds: [],
|
|
12
|
+
feedItems: [],
|
|
13
|
+
topNews: [],
|
|
14
|
+
weather: null,
|
|
15
|
+
canteens: [],
|
|
16
|
+
courses: [],
|
|
17
|
+
coursesStatus: CourseStatusEnum.notImportedYet,
|
|
18
|
+
jobs: [],
|
|
19
|
+
menuEntries: []
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const apiReducer = (state = initialState, reducerAction) => {
|
|
23
|
+
switch(reducerAction.type) {
|
|
24
|
+
case action.feedV3.getFeeds + commitAction:
|
|
25
|
+
setTimeout(() => {
|
|
26
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
27
|
+
}, 2000);
|
|
28
|
+
return {
|
|
29
|
+
...state,
|
|
30
|
+
feeds: Array.isArray(reducerAction.payload.feeds) ? reducerAction.payload.feeds : []
|
|
31
|
+
};
|
|
32
|
+
case action.feedV3.getTopNews + commitAction:
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
35
|
+
}, 2000);
|
|
36
|
+
return {
|
|
37
|
+
...state,
|
|
38
|
+
topNews: Array.isArray(reducerAction.payload.items) ? reducerAction.payload.items : []
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
case action.corona.getCoronaMenu + commitAction:
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
44
|
+
}, 2000);
|
|
45
|
+
return {
|
|
46
|
+
...state,
|
|
47
|
+
menuEntries: Array.isArray(reducerAction.payload) ? reducerAction.payload : [],
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
case action.canteen.getAll + commitAction:
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
53
|
+
}, 2000);
|
|
54
|
+
|
|
55
|
+
// Transform API payload in cache format
|
|
56
|
+
let newCanteens = reducerAction?.payload?.canteens
|
|
57
|
+
// Create list of canteens
|
|
58
|
+
?.map(apiCanteen => ({
|
|
59
|
+
id: apiCanteen.id,
|
|
60
|
+
title: apiCanteen.title,
|
|
61
|
+
type: apiCanteen.type,
|
|
62
|
+
// Create json-object with key as date string and value as meal list
|
|
63
|
+
meals: apiCanteen?.menuItems?.reduce((mealMapObject, meal) => {
|
|
64
|
+
let meals = mealMapObject[meal.date] ?? []; // Get already grouped meals of current meal date. Is date unkown, create empty array
|
|
65
|
+
meals.push(meal);
|
|
66
|
+
mealMapObject[meal.date] = meals;
|
|
67
|
+
return mealMapObject;
|
|
68
|
+
}, {}) ?? {},
|
|
69
|
+
}))
|
|
70
|
+
// Create object with key of canteen id and value of canteen
|
|
71
|
+
?.reduce((canteensMapObject, apiCanteen) => {
|
|
72
|
+
canteensMapObject[apiCanteen.id] = apiCanteen;
|
|
73
|
+
return canteensMapObject;
|
|
74
|
+
}, {});
|
|
75
|
+
|
|
76
|
+
// merge cached/old canteen information into new canteens
|
|
77
|
+
currentDateTime = new Date();
|
|
78
|
+
lowerCacheAllowDate = new Date(
|
|
79
|
+
currentDateTime.getFullYear(),
|
|
80
|
+
currentDateTime.getMonth()+1,
|
|
81
|
+
currentDateTime.getDate() - 14, // Create datetime 2 weeks in passt
|
|
82
|
+
currentDateTime.getHours(),
|
|
83
|
+
currentDateTime.getMinutes(),
|
|
84
|
+
currentDateTime.getSeconds(),
|
|
85
|
+
currentDateTime.getMilliseconds()
|
|
86
|
+
)
|
|
87
|
+
lowerCacheAllowDate = toIsoDateString(lowerCacheAllowDate);
|
|
88
|
+
cachedCanteens = state.canteens;
|
|
89
|
+
// Is canteen cache in old array format?
|
|
90
|
+
if (!Array.isArray(cachedCanteens)) {
|
|
91
|
+
for (const [cachedCanteenId, cachedCanteen] of Object.entries(cachedCanteens)) {
|
|
92
|
+
// If cached canteen id is not in new canteens, do not merge. Cause this canteen do not exist anymore.
|
|
93
|
+
newCanteen = newCanteens?.[cachedCanteenId];
|
|
94
|
+
if (newCanteen) {
|
|
95
|
+
for (const [cachedCanteenMealsDate, cachedCanteenMeals] of Object.entries(cachedCanteen.meals).filter(([cachedCanteenMealsDate]) => cachedCanteenMealsDate >= lowerCacheAllowDate)) {
|
|
96
|
+
// if date is not in new canteen meals, add the cached one to new canteen
|
|
97
|
+
if (!newCanteen.meals.hasOwnProperty(cachedCanteenMealsDate)) {
|
|
98
|
+
newCanteen.meals[cachedCanteenMealsDate] = cachedCanteenMeals;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
...state,
|
|
107
|
+
canteens: newCanteens,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
case action.device.postRegisterDevice + commitAction:
|
|
111
|
+
return state;
|
|
112
|
+
|
|
113
|
+
case 'RESET_COURSES':
|
|
114
|
+
return {
|
|
115
|
+
...state,
|
|
116
|
+
courses: [],
|
|
117
|
+
coursesStatus: CourseStatusEnum.notImportedYet
|
|
118
|
+
};
|
|
119
|
+
case action.coursesV2.getCourses + commitAction:
|
|
120
|
+
setTimeout(() => {
|
|
121
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
122
|
+
}, 2000);
|
|
123
|
+
if(reducerAction.payload) {
|
|
124
|
+
return {
|
|
125
|
+
...state,
|
|
126
|
+
courses: Array.isArray(reducerAction.payload) ? reducerAction.payload : [],
|
|
127
|
+
coursesStatus: CourseStatusEnum.importSuccessful
|
|
128
|
+
};
|
|
129
|
+
} else {
|
|
130
|
+
return {
|
|
131
|
+
...state,
|
|
132
|
+
courses: [],
|
|
133
|
+
coursesStatus: CourseStatusEnum.importSuccessful
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
case action.job.getJobCategories + commitAction:
|
|
138
|
+
return state;
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
case action.coursesV2.getCourses + rollbackAction:
|
|
142
|
+
if(!reducerAction.hideErrors) {
|
|
143
|
+
if(reducerAction.payload.response && reducerAction.payload.response.message) {
|
|
144
|
+
alert(reducerAction.payload.response.message);
|
|
145
|
+
} else {
|
|
146
|
+
alert('Zu diesem Code wurde kein gültiger Stundenplan gefunden!');
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
...state,
|
|
150
|
+
courses: [],
|
|
151
|
+
coursesStatus: CourseStatusEnum.error
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
156
|
+
}, 2000);
|
|
157
|
+
return state;
|
|
158
|
+
|
|
159
|
+
case action.feedV3.getFeeds + rollbackAction:
|
|
160
|
+
case action.feedV3.getTopNews + rollbackAction:
|
|
161
|
+
case action.corona.getCoronaMenu + rollbackAction:
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
164
|
+
}, 2000);
|
|
165
|
+
return state;
|
|
166
|
+
|
|
167
|
+
case action.canteen.getAll + rollbackAction:
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
reducerAction.asyncDispatch(onUpdateRefreshing(false));
|
|
170
|
+
}, 2000);
|
|
171
|
+
return state;
|
|
172
|
+
|
|
173
|
+
case action.job.getJobCategories + rollbackAction:
|
|
174
|
+
|
|
175
|
+
default:
|
|
176
|
+
return state;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const getSortOrderPrices = (title) => {
|
|
181
|
+
switch (title) {
|
|
182
|
+
case 'S': return 0;
|
|
183
|
+
case 'E': return 1;
|
|
184
|
+
case 'G': return 2;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
export {selectFeeds, selectFeedById, apiReducer as reducer};
|
|
189
|
+
|
|
190
|
+
export default apiReducer;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* You may obtain a copy of the License at
|
|
5
|
+
*
|
|
6
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
*
|
|
8
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
* See the License for the specific language governing permissions and
|
|
12
|
+
* limitations under the License.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// @ts-check
|
|
16
|
+
|
|
17
|
+
import { combineReducers } from 'redux'
|
|
18
|
+
|
|
19
|
+
import stateReducer from './state'
|
|
20
|
+
import apiReducer from './api'
|
|
21
|
+
import notificationsReducer from './notifications'
|
|
22
|
+
import settingReducer from './setting'
|
|
23
|
+
import { pluginReducer } from '../../../core-plugins';
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
export default combineReducers({
|
|
27
|
+
apiReducer,
|
|
28
|
+
notificationsReducer,
|
|
29
|
+
stateReducer,
|
|
30
|
+
settingReducer,
|
|
31
|
+
pluginReducer
|
|
32
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const initialState = {
|
|
2
|
+
subscriberId: '',
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
export default (state = initialState, action) => {
|
|
6
|
+
switch (action.type) {
|
|
7
|
+
case 'NOTIFICATIONS_SUBSCRIBER_UPDATE':
|
|
8
|
+
return {
|
|
9
|
+
...state,
|
|
10
|
+
subscriberId: action.subscriberId
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return state;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { getLocales } from 'expo-localization';
|
|
2
|
+
|
|
3
|
+
// Derzeitige Hauptsprache des Handys ermitteln
|
|
4
|
+
// Expo garantiert, dass getLocales mindestens ein Element enthält
|
|
5
|
+
const locale = getLocales()[0];
|
|
6
|
+
const lang = locale.languageCode;
|
|
7
|
+
const supportedLanguages = ['de', 'en'];
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const initialSetting = {
|
|
11
|
+
favorites: [],
|
|
12
|
+
favoritesPtsStation: [],
|
|
13
|
+
settingsGeneral: {language: supportedLanguages.includes(lang) ? lang : 'en'},
|
|
14
|
+
settingsWeather: {location: 'uni'},
|
|
15
|
+
settingsCanteens: {favoritePrice: ''},
|
|
16
|
+
settingsAccessibility: {
|
|
17
|
+
highContrast: false,
|
|
18
|
+
increaseFontSize: false
|
|
19
|
+
},
|
|
20
|
+
settingsNotifications: {
|
|
21
|
+
enablePushNotifications: false,
|
|
22
|
+
enableAllNotifications: false, // Allow all types of notifications, ignores the allowedTypes setting
|
|
23
|
+
enabledFeedNotifications: [] // Allow only these selected types
|
|
24
|
+
},
|
|
25
|
+
settingsDevelop: {
|
|
26
|
+
useStaging: false,
|
|
27
|
+
showDeeplinkAlert: false,
|
|
28
|
+
activeStagingMenuItems: [],
|
|
29
|
+
},
|
|
30
|
+
api: {
|
|
31
|
+
university: 'tuc',
|
|
32
|
+
rootUrl: 'https://urz-asist.hrz.tu-chemnitz.de/asist-cc/rest'
|
|
33
|
+
// rootUrl: 'https://asist.hrz.tu-chemnitz.de/asist/rest'
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
import merge from 'lodash/merge';
|
|
37
|
+
|
|
38
|
+
export default (setting = initialSetting, action) => {
|
|
39
|
+
if (action.payload) {
|
|
40
|
+
switch (action.type) {
|
|
41
|
+
case 'SETTING_UPDATE':
|
|
42
|
+
return merge({}, setting, action.payload);
|
|
43
|
+
case 'SETTING_OVERRIDE':
|
|
44
|
+
return {
|
|
45
|
+
...setting,
|
|
46
|
+
favorites: action.payload
|
|
47
|
+
};
|
|
48
|
+
case 'SETTING_PTS_STATION_OVERRIDE':
|
|
49
|
+
return {
|
|
50
|
+
...setting,
|
|
51
|
+
favoritesPtsStation: action.payload
|
|
52
|
+
};
|
|
53
|
+
case 'SETTING_GENERAL_OVERRIDE':
|
|
54
|
+
return {
|
|
55
|
+
...setting,
|
|
56
|
+
settingsGeneral: action.payload
|
|
57
|
+
};
|
|
58
|
+
case 'SETTING_CANTEENS_OVERRIDE':
|
|
59
|
+
return {
|
|
60
|
+
...setting,
|
|
61
|
+
settingsCanteens: action.payload
|
|
62
|
+
};
|
|
63
|
+
case 'SETTING_CANTEENS_MERGE':
|
|
64
|
+
const currentSettingsCanteens = setting?.settingsCanteens ?? {};
|
|
65
|
+
return {
|
|
66
|
+
...setting,
|
|
67
|
+
settingsCanteens: {
|
|
68
|
+
...currentSettingsCanteens,
|
|
69
|
+
...action.payload
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
case 'SETTING_ACCESSIBILITY_OVERRIDE':
|
|
73
|
+
return {
|
|
74
|
+
...setting,
|
|
75
|
+
settingsAccessibility: action.payload
|
|
76
|
+
};
|
|
77
|
+
case 'SETTING_NOTIFICATIONS_OVERRIDE':
|
|
78
|
+
return {
|
|
79
|
+
...setting,
|
|
80
|
+
settingsNotifications: action.payload
|
|
81
|
+
};
|
|
82
|
+
case 'SETTING_DEVELOP_OVERRIDE':
|
|
83
|
+
return {
|
|
84
|
+
...setting,
|
|
85
|
+
settingsDevelop: action.payload
|
|
86
|
+
};
|
|
87
|
+
case 'SETTING_API':
|
|
88
|
+
return {
|
|
89
|
+
...setting,
|
|
90
|
+
api: action.payload
|
|
91
|
+
};
|
|
92
|
+
case 'SETTING_CLEAR':
|
|
93
|
+
return initialSetting;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return setting;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const initialState = {
|
|
2
|
+
view: 'home',
|
|
3
|
+
refreshing: false,
|
|
4
|
+
searchTopic: '',
|
|
5
|
+
searchResults: {
|
|
6
|
+
books: [],
|
|
7
|
+
contacts: [],
|
|
8
|
+
rooms: [],
|
|
9
|
+
news: []
|
|
10
|
+
},
|
|
11
|
+
modalContent: '',
|
|
12
|
+
newPushMessageShown: false
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default (state = initialState, action) => {
|
|
16
|
+
switch(action.type) {
|
|
17
|
+
case 'VIEW_UPDATE':
|
|
18
|
+
return {
|
|
19
|
+
...state,
|
|
20
|
+
view: action.view
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
case 'UPDATE_REFRESHING_FLAG':
|
|
24
|
+
return {
|
|
25
|
+
...state,
|
|
26
|
+
refreshing: action.refreshing
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @deprecated
|
|
31
|
+
*
|
|
32
|
+
|
|
33
|
+
case 'UPDATE_FEED_ITEMS':
|
|
34
|
+
const feedItems = state.feedItems.map(feedItem => {
|
|
35
|
+
if(feedItem.id === action.feedItems.id) {
|
|
36
|
+
return { ...feedItem, ...action.feedItems.items}
|
|
37
|
+
}
|
|
38
|
+
return feedItem;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
if(feedItems.length === 0 || !feedItems.find(item => item.id === action.feedItems.id)) {
|
|
42
|
+
feedItems.push(action.feedItems);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
...state,
|
|
47
|
+
feedItems: feedItems
|
|
48
|
+
};
|
|
49
|
+
*/
|
|
50
|
+
case 'UPDATE_SEARCH_TOPIC':
|
|
51
|
+
return {
|
|
52
|
+
...state,
|
|
53
|
+
searchTopic: action.searchTopic
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
case 'UPDATE_SEARCH_RESULTS_BOOKS':
|
|
57
|
+
return {
|
|
58
|
+
...state,
|
|
59
|
+
searchResults: {
|
|
60
|
+
...state.searchResults,
|
|
61
|
+
books: action.books
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
case 'UPDATE_SEARCH_RESULTS_CONTACTS':
|
|
66
|
+
return {
|
|
67
|
+
...state,
|
|
68
|
+
searchResults: {
|
|
69
|
+
...state.searchResults,
|
|
70
|
+
contacts: action.contacts
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
case 'UPDATE_SEARCH_RESULTS_ROOMS':
|
|
75
|
+
return {
|
|
76
|
+
...state,
|
|
77
|
+
searchResults: {
|
|
78
|
+
...state.searchResults,
|
|
79
|
+
rooms: action.rooms
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
case 'UPDATE_SEARCH_RESULTS_NEWS':
|
|
84
|
+
return {
|
|
85
|
+
...state,
|
|
86
|
+
searchResults: {
|
|
87
|
+
...state.searchResults,
|
|
88
|
+
news: action.news
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
case 'UPDATE_MODAL_CONTENT':
|
|
93
|
+
return {
|
|
94
|
+
...state,
|
|
95
|
+
modalContent: action.modalContent
|
|
96
|
+
};
|
|
97
|
+
case 'UPDATE_PUSH_MESSAGE_SHOWN':
|
|
98
|
+
return {
|
|
99
|
+
...state,
|
|
100
|
+
newPushMessageShown: action.newPushMessageShown
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
default:
|
|
104
|
+
return state;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
const updateObjectInArray = (array, action) => {
|
|
110
|
+
return array.map((item, index) => {
|
|
111
|
+
if (index !== action.index) {
|
|
112
|
+
// This isn't the item we care about - keep it as-is
|
|
113
|
+
return item
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Otherwise, this is the one we want - return an updated value
|
|
117
|
+
return {
|
|
118
|
+
...item,
|
|
119
|
+
...action.item
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { useSelector } from 'react-redux';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Selector für Wert, der anzeigt ob die Staging-Server genutzt werden sollen.
|
|
5
|
+
* @param {Object} reduxState
|
|
6
|
+
* @returns {boolean} true, wenn die Staging-Server verwendet werden sollen, ansonsten false
|
|
7
|
+
*/
|
|
8
|
+
function selectUseStagingServer(reduxState) {
|
|
9
|
+
return reduxState?.settingReducer?.settingsDevelop?.useStaging ?? false;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Hook, welcher anzeigt ob die Staging-Server genutzt werden sollen.
|
|
14
|
+
*
|
|
15
|
+
* @returns {boolean} true, wenn die Staging-Server verwendet werden sollen, ansonsten false
|
|
16
|
+
* @example
|
|
17
|
+
* const isStagingServerActive = useStagingServer();
|
|
18
|
+
*
|
|
19
|
+
* console.log('isStagingServerActive' ? 'Staging server active' : 'Productiv server active');
|
|
20
|
+
*/
|
|
21
|
+
export function useStagingServer() {
|
|
22
|
+
return useSelector(selectUseStagingServer);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Redux-Selector für die in den Einstellungen eingestellte Sprache.
|
|
27
|
+
* @param {Object} reduxState Der State im Redux
|
|
28
|
+
* @returns {string|undefined} Spracheinstellung
|
|
29
|
+
*/
|
|
30
|
+
export function selectLanguage(reduxState) {
|
|
31
|
+
return reduxState?.settingReducer?.settingsGeneral?.language;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Hook, welcher die vom Nutzer eingestellte Sprache zurückliefert.
|
|
36
|
+
* Die Sprache wird als Zweizeichencode, also `de` für Deutsch und `en` für Englisch, zurückgeliefert.
|
|
37
|
+
* Konnte die Spracheinstellung nicht abgerufen werden oder ist diese nicht gesetzt, wird `undefined` zurückgeben.
|
|
38
|
+
*
|
|
39
|
+
* @returns {string|undefined} Die Sprache als Zweizeichencode. `undefined`, falls keine Sprache eingestellt ist.
|
|
40
|
+
* @example
|
|
41
|
+
* const language = useLanguage();
|
|
42
|
+
*
|
|
43
|
+
* console.log('Selected language', language);
|
|
44
|
+
*/
|
|
45
|
+
export function useLanguage() {
|
|
46
|
+
return useSelector(selectLanguage);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function selectIncreaseFontSize(reduxState) {
|
|
50
|
+
return reduxState?.settingReducer?.settingsAccessibility?.increaseFontSize ?? false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export function useIncreaseFontSize() {
|
|
55
|
+
return useSelector(selectIncreaseFontSize);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Redux-Selector für die Subscriber ID
|
|
60
|
+
* @param {Object} reduxState Der State im Redux
|
|
61
|
+
* @returns {string|undefined}
|
|
62
|
+
*/
|
|
63
|
+
export function selectSubscriberId(reduxState) {
|
|
64
|
+
return reduxState?.notificationsReducer?.subscriberId;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Hook, welcher die Subscriber ID vom zurückliefert.
|
|
69
|
+
* Konnte die Subscriber ID nicht abgerufen werden oder ist diese nicht gesetzt, wird `undefined` zurückgeben.
|
|
70
|
+
*
|
|
71
|
+
* @returns {string|undefined} Die Subscriber ID oder `undefined`, falls nicht vorhanden.
|
|
72
|
+
* @example
|
|
73
|
+
* const subscriberId = useSubscriberId();
|
|
74
|
+
*
|
|
75
|
+
* console.log('Subscriber ID:', subscriberId);
|
|
76
|
+
*/
|
|
77
|
+
export function useSubscriberId() {
|
|
78
|
+
return useSelector(selectSubscriberId);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Redux-Selector für die Einstellung ob Deeplink-Alarme angezeigt werden sollen.
|
|
83
|
+
* @param {Object} reduxState Der State im Redux
|
|
84
|
+
* @returns {boolean}
|
|
85
|
+
*/
|
|
86
|
+
export function selectshowDeeplinkAlert(reduxState) {
|
|
87
|
+
return reduxState?.settingReducer?.settingsDevelop?.showDeeplinkAlert ?? false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Hook, welcher die Einstellung, ob Deeplink-Alarme angezeigt werden sollen, zurückliefert.
|
|
92
|
+
*
|
|
93
|
+
* @returns {boolean} Sollen Deeplink-Alarme angezeigt werden?
|
|
94
|
+
* @example
|
|
95
|
+
* const showDeeplinkAlert = useShowDeeplinkAlert();
|
|
96
|
+
*
|
|
97
|
+
* console.log('Show deeplink alarms:', showDeeplinkAlert);
|
|
98
|
+
*/
|
|
99
|
+
export function useShowDeeplinkAlert() {
|
|
100
|
+
return useSelector(selectshowDeeplinkAlert);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Redux-Selector für die IDs der aktiv geschalteten Menüeinträge, die sonst deaktivert sind.
|
|
105
|
+
* @param {Object} reduxState Der State im Redux
|
|
106
|
+
* @returns {string[]}
|
|
107
|
+
*/
|
|
108
|
+
export function selectActiveStagingMenuItems(reduxState) {
|
|
109
|
+
return reduxState?.settingReducer?.settingsDevelop?.activeStagingMenuItems ?? [];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Hook, welcher die IDs der aktiv geschalteten Menüeinträge, die sonst deaktivert sind, zurückliefert.
|
|
114
|
+
*
|
|
115
|
+
* @returns {string[]} Sollen Deeplink-Alarme angezeigt werden?
|
|
116
|
+
* @example
|
|
117
|
+
* const activeStagingMenuItems = useActiveStagingMenuItems();
|
|
118
|
+
*
|
|
119
|
+
* console.log('Keys of active menu entries:', activeStagingMenuItems);
|
|
120
|
+
*/
|
|
121
|
+
export function useActiveStagingMenuItems() {
|
|
122
|
+
return useSelector(selectActiveStagingMenuItems);
|
|
123
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createStore, applyMiddleware, compose } from 'redux';
|
|
2
|
+
import { offline } from '../../redux-offline';
|
|
3
|
+
import offlineConfig from '../..//redux-offline/lib/defaults';
|
|
4
|
+
import { persistStore, persistReducer } from 'redux-persist';
|
|
5
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
6
|
+
|
|
7
|
+
import asyncDispatchMiddleware from './asyncDispatch';
|
|
8
|
+
import rootReducer from './reducers';
|
|
9
|
+
|
|
10
|
+
// Create persist config for redux-persist v6
|
|
11
|
+
// This will handle persisting the entire root state
|
|
12
|
+
const persistConfig = {
|
|
13
|
+
key: 'root',
|
|
14
|
+
storage: AsyncStorage,
|
|
15
|
+
version: 1,
|
|
16
|
+
// Persist all state except api which might contain temporary data
|
|
17
|
+
blacklist: ['apiReducer']
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Wrap the root reducer with persistReducer to enable persistence
|
|
21
|
+
const persistedReducer = persistReducer(persistConfig, rootReducer);
|
|
22
|
+
|
|
23
|
+
// Custom persist function that works with redux-persist v6
|
|
24
|
+
// This replaces redux-offline's internal persistence
|
|
25
|
+
const customPersist = (store, options, callback) => {
|
|
26
|
+
// Since we're using persistReducer, we just need to call persistStore
|
|
27
|
+
// without any additional configuration
|
|
28
|
+
const persistor = persistStore(store, callback);
|
|
29
|
+
return persistor;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Create custom offline config that uses our custom persist function
|
|
33
|
+
const customOfflineConfig = {
|
|
34
|
+
...offlineConfig,
|
|
35
|
+
persist: customPersist,
|
|
36
|
+
persistOptions: {} // Empty since we handle persistence through persistReducer
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const store = createStore(persistedReducer, compose(offline(customOfflineConfig), applyMiddleware(asyncDispatchMiddleware)));
|
|
40
|
+
export const persistor = persistStore(store);
|