@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.
Files changed (268) hide show
  1. package/components/AppBar/index.js +84 -0
  2. package/components/AppBar/styles.js +27 -0
  3. package/components/BookDetail/index.js +268 -0
  4. package/components/BookDetail/styles.js +124 -0
  5. package/components/ComponentJobsFilter/index.js +188 -0
  6. package/components/ComponentJobsFilter/styles.js +12 -0
  7. package/components/ConnectivityWarning/index.js +65 -0
  8. package/components/ConnectivityWarning/styles.js +19 -0
  9. package/components/ContactDetail/index.js +232 -0
  10. package/components/ContactDetail/styles.js +32 -0
  11. package/components/CourseDetail/index.js +357 -0
  12. package/components/CourseDetail/styles.js +59 -0
  13. package/components/CourseDetailDialog/index.js +169 -0
  14. package/components/CourseDetailDialog/styles.js +116 -0
  15. package/components/CourseInfo/index.js +219 -0
  16. package/components/CourseInfo/styles.js +40 -0
  17. package/components/DevelopmentDialog/index.js +214 -0
  18. package/components/DevelopmentDialog/styles.js +10 -0
  19. package/components/EventCodeInput/index.js +149 -0
  20. package/components/EventCodeInput/styles.js +108 -0
  21. package/components/FlexMenuEntry/index.js +84 -0
  22. package/components/FlexMenuEntry/styles.js +27 -0
  23. package/components/MainMenuEntry/index.js +88 -0
  24. package/components/MainMenuEntry/styles.js +28 -0
  25. package/components/MealItem/index.js +87 -0
  26. package/components/MealItem/styles.js +84 -0
  27. package/components/MensaMenu/index.js +305 -0
  28. package/components/MensaMenu/styles.js +94 -0
  29. package/components/MensaSlider/index.js +188 -0
  30. package/components/MensaSlider/styles.js +53 -0
  31. package/components/Modal/index.js +106 -0
  32. package/components/Modal/styles.js +8 -0
  33. package/components/NewsDetail/index.js +377 -0
  34. package/components/NewsDetail/styles.js +77 -0
  35. package/components/NewsList/index.js +120 -0
  36. package/components/NewsList/styles.js +19 -0
  37. package/components/NewsListItem/index.js +89 -0
  38. package/components/NewsListItem/styles.js +32 -0
  39. package/components/OtherCourses/index.js +152 -0
  40. package/components/OtherCourses/styles.js +10 -0
  41. package/components/PtsDeparture/index.js +140 -0
  42. package/components/PtsDeparture/styles.js +7 -0
  43. package/components/PtsStation/index.js +186 -0
  44. package/components/PtsStation/styles.js +47 -0
  45. package/components/QuickLinks/index.js +127 -0
  46. package/components/QuickLinks/styles.js +45 -0
  47. package/components/RoomDetail/index.js +281 -0
  48. package/components/RoomDetail/styles.js +56 -0
  49. package/components/ScaledImage/index.js +92 -0
  50. package/components/SearchResults/index.js +362 -0
  51. package/components/SearchResults/styles.js +59 -0
  52. package/components/SettingSection/index.js +54 -0
  53. package/components/SettingSection/styles.js +15 -0
  54. package/components/SettingsDialog/index.js +52 -0
  55. package/components/SettingsDialog/styles.js +12 -0
  56. package/components/SettingsDialogRadio/index.js +66 -0
  57. package/components/SettingsDialogRadio/styles.js +7 -0
  58. package/components/SettingsDialogSelect/index.js +73 -0
  59. package/components/SettingsDialogSelect/styles.js +7 -0
  60. package/components/TimetableCodeInput/index.js +205 -0
  61. package/components/TimetableCodeInput/styles.js +28 -0
  62. package/components/TimetableDay/index.js +252 -0
  63. package/components/TimetableDay/styles.js +103 -0
  64. package/components/TimetableEvent/index.js +163 -0
  65. package/components/TimetableEvent/styles.js +108 -0
  66. package/components/TimetableList/index.js +180 -0
  67. package/components/TimetableList/styles.js +106 -0
  68. package/components/TimetableMonth/index.js +156 -0
  69. package/components/TimetableMonth/styles.js +29 -0
  70. package/components/TimetableWeek/index.js +230 -0
  71. package/components/TimetableWeek/styles.js +58 -0
  72. package/components/TopNews/index.js +282 -0
  73. package/components/TopNews/styles.js +125 -0
  74. package/components/TopNewsHtwk/index.js +279 -0
  75. package/components/TopNewsHtwk/styles.js +142 -0
  76. package/components/WebView/index.js +108 -0
  77. package/components/WebView/styles.js +11 -0
  78. package/context/context-callmanager/TucCallManager.js +74 -0
  79. package/context/context-callmanager/index.js +128 -0
  80. package/context/context-canteen/AsistServerApiProvider.js +126 -0
  81. package/context/context-canteen/CollektorVersion2ApiProvider.js +100 -0
  82. package/context/context-canteen/index.js +692 -0
  83. package/context/context-connectivity/index.js +85 -0
  84. package/context/context-event/AsistServerClient.js +82 -0
  85. package/context/context-event/index.js +205 -0
  86. package/context/context-flex-menu/AsistServerApiProvider.js +0 -0
  87. package/context/context-flex-menu/CollectorVersion2ApiProvider.js +32 -0
  88. package/context/context-flex-menu/index.js +160 -0
  89. package/context/context-info-dialog/CollektorVersion2ApiProvider.js +53 -0
  90. package/context/context-info-dialog/ProviderErrors.js +22 -0
  91. package/context/context-info-dialog/index.js +190 -0
  92. package/context/context-mails/MailService.js +147 -0
  93. package/context/context-mails/TucUnseenApiProvider.js +65 -0
  94. package/context/context-mails/index.js +131 -0
  95. package/context/context-news/CollektorVersion2ApiProvider.js +68 -0
  96. package/context/context-news/index.js +155 -0
  97. package/context/context-public-transport-ticket/CollektorVersion2ApiProvider.js +45 -0
  98. package/context/context-public-transport-ticket/ProviderErrors.js +11 -0
  99. package/context/context-public-transport-ticket/index.js +175 -0
  100. package/context/context-timetable/CollectorVersion2ApiProvider.js +102 -0
  101. package/context/context-timetable/ProviderErrors.js +22 -0
  102. package/context/context-timetable/TimetableService.js +357 -0
  103. package/context/context-timetable/index.js +215 -0
  104. package/context/context-user/index.js +586 -0
  105. package/index.js +178 -0
  106. package/libraries/base-api-provider/hooks.js +24 -0
  107. package/libraries/base-api-provider/http-api-provider.js +168 -0
  108. package/libraries/base-api-provider/index.js +20 -0
  109. package/libraries/core/api/canteens.js +88 -0
  110. package/libraries/core/api/corona.js +45 -0
  111. package/libraries/core/api/courses.js +54 -0
  112. package/libraries/core/api/device.js +98 -0
  113. package/libraries/core/api/feed.js +144 -0
  114. package/libraries/core/api/feedback.js +123 -0
  115. package/libraries/core/api/jobs.js +48 -0
  116. package/libraries/core/api/library.js +67 -0
  117. package/libraries/core/api/lostfound.js +77 -0
  118. package/libraries/core/api/occupancy.js +44 -0
  119. package/libraries/core/api/officehours.js +25 -0
  120. package/libraries/core/api/poi.js +25 -0
  121. package/libraries/core/api/pts.js +68 -0
  122. package/libraries/core/api/rooms.js +31 -0
  123. package/libraries/core/api/survey.js +121 -0
  124. package/libraries/core/api/telephone.js +32 -0
  125. package/libraries/core/api/tucrooms.js +31 -0
  126. package/libraries/core/constants/actions.js +75 -0
  127. package/libraries/core/constants/api.js +146 -0
  128. package/libraries/core/constants/enums.js +5 -0
  129. package/libraries/core/helper/date.js +9 -0
  130. package/libraries/core/helper/format.helper.js +2 -0
  131. package/libraries/core/index.js +60 -0
  132. package/libraries/core/redux/actions/notifications.js +6 -0
  133. package/libraries/core/redux/actions/setting.js +75 -0
  134. package/libraries/core/redux/actions/state.js +74 -0
  135. package/libraries/core/redux/asyncDispatch.js +27 -0
  136. package/libraries/core/redux/reducers/api.js +190 -0
  137. package/libraries/core/redux/reducers/index.js +32 -0
  138. package/libraries/core/redux/reducers/notifications.js +16 -0
  139. package/libraries/core/redux/reducers/setting.js +99 -0
  140. package/libraries/core/redux/reducers/state.js +122 -0
  141. package/libraries/core/redux/selectors.js +123 -0
  142. package/libraries/core/redux/store.js +40 -0
  143. package/libraries/core/services/data.js +96 -0
  144. package/libraries/core/services/root-navigation.js +36 -0
  145. package/libraries/core/services/search.js +175 -0
  146. package/libraries/core-plugins/enums/replaceTypes.js +53 -0
  147. package/libraries/core-plugins/index.js +21 -0
  148. package/libraries/core-plugins/redux/actions/plugin.js +13 -0
  149. package/libraries/core-plugins/redux/reducers/plugin.js +210 -0
  150. package/libraries/icons-openasist/index.js +143 -0
  151. package/libraries/notifications/index.js +268 -0
  152. package/libraries/notifications/services/subscriber.service.js +123 -0
  153. package/libraries/react-native-webview-autoheight/README.md +47 -0
  154. package/libraries/react-native-webview-autoheight/index.js +140 -0
  155. package/libraries/react-native-webview-autoheight/package.json +37 -0
  156. package/libraries/react-native-webview-autoheight/utils.js +268 -0
  157. package/libraries/redux-offline/.eslintignore +1 -0
  158. package/libraries/redux-offline/.github/ISSUE_TEMPLATE/redux-offline-core-issues-template.md +25 -0
  159. package/libraries/redux-offline/.prettierrc +6 -0
  160. package/libraries/redux-offline/LICENSE +21 -0
  161. package/libraries/redux-offline/README.md +133 -0
  162. package/libraries/redux-offline/flow-typed/npm/redux-logger_vx.x.x.js +109 -0
  163. package/libraries/redux-offline/flow-typed/npm/redux_v4.x.x.js +100 -0
  164. package/libraries/redux-offline/lib/actions.js +46 -0
  165. package/libraries/redux-offline/lib/config.js +15 -0
  166. package/libraries/redux-offline/lib/constants.js +17 -0
  167. package/libraries/redux-offline/lib/defaults/defaultCommit.js +11 -0
  168. package/libraries/redux-offline/lib/defaults/defaultRollback.js +11 -0
  169. package/libraries/redux-offline/lib/defaults/detectNetwork.js +33 -0
  170. package/libraries/redux-offline/lib/defaults/detectNetwork.native.js +211 -0
  171. package/libraries/redux-offline/lib/defaults/discard.js +18 -0
  172. package/libraries/redux-offline/lib/defaults/effect.js +87 -0
  173. package/libraries/redux-offline/lib/defaults/index.js +32 -0
  174. package/libraries/redux-offline/lib/defaults/offlineStateLens.js +24 -0
  175. package/libraries/redux-offline/lib/defaults/persist.js +9 -0
  176. package/libraries/redux-offline/lib/defaults/persist.native.js +17 -0
  177. package/libraries/redux-offline/lib/defaults/persistAutoRehydrate.js +8 -0
  178. package/libraries/redux-offline/lib/defaults/queue.js +27 -0
  179. package/libraries/redux-offline/lib/defaults/retry.js +29 -0
  180. package/libraries/redux-offline/lib/index.js +115 -0
  181. package/libraries/redux-offline/lib/middleware.js +56 -0
  182. package/libraries/redux-offline/lib/offlineActionTracker.js +43 -0
  183. package/libraries/redux-offline/lib/send.js +112 -0
  184. package/libraries/redux-offline/lib/types.js +3 -0
  185. package/libraries/redux-offline/lib/updater.js +111 -0
  186. package/libraries/redux-offline/package.json +69 -0
  187. package/libraries/redux-offline/src/__tests__/defaults/discard.js +22 -0
  188. package/libraries/redux-offline/src/__tests__/defaults/effect.js +118 -0
  189. package/libraries/redux-offline/src/__tests__/index.js +116 -0
  190. package/libraries/redux-offline/src/__tests__/middleware.js +185 -0
  191. package/libraries/redux-offline/src/__tests__/offlineActionTracker.js +54 -0
  192. package/libraries/redux-offline/src/__tests__/send.js +208 -0
  193. package/libraries/redux-offline/src/actions.js +36 -0
  194. package/libraries/redux-offline/src/config.js +9 -0
  195. package/libraries/redux-offline/src/constants.js +18 -0
  196. package/libraries/redux-offline/src/defaults/defaultCommit.js +7 -0
  197. package/libraries/redux-offline/src/defaults/defaultRollback.js +7 -0
  198. package/libraries/redux-offline/src/defaults/detectNetwork.js +16 -0
  199. package/libraries/redux-offline/src/defaults/detectNetwork.native.js +148 -0
  200. package/libraries/redux-offline/src/defaults/discard.js +19 -0
  201. package/libraries/redux-offline/src/defaults/effect.js +86 -0
  202. package/libraries/redux-offline/src/defaults/index.js +25 -0
  203. package/libraries/redux-offline/src/defaults/offlineStateLens.js +11 -0
  204. package/libraries/redux-offline/src/defaults/persist.js +4 -0
  205. package/libraries/redux-offline/src/defaults/persist.native.js +9 -0
  206. package/libraries/redux-offline/src/defaults/persistAutoRehydrate.js +4 -0
  207. package/libraries/redux-offline/src/defaults/queue.js +20 -0
  208. package/libraries/redux-offline/src/defaults/retry.js +18 -0
  209. package/libraries/redux-offline/src/index.js +138 -0
  210. package/libraries/redux-offline/src/middleware.js +52 -0
  211. package/libraries/redux-offline/src/offlineActionTracker.js +40 -0
  212. package/libraries/redux-offline/src/send.js +111 -0
  213. package/libraries/redux-offline/src/types.js +127 -0
  214. package/libraries/redux-offline/src/updater.js +141 -0
  215. package/libraries/redux-offline/typings.d.ts +150 -0
  216. package/libraries/redux-offline/yarn.lock +6460 -0
  217. package/libraries/stored-state/index.js +155 -0
  218. package/package.json +68 -0
  219. package/views/Callmanager/index.js +148 -0
  220. package/views/Callmanager/styles.js +62 -0
  221. package/views/Canteens/index.js +383 -0
  222. package/views/Canteens/styles.js +89 -0
  223. package/views/Dashboard/index.js +176 -0
  224. package/views/Dashboard/styles.js +16 -0
  225. package/views/DashboardHtwk/index.js +197 -0
  226. package/views/DashboardHtwk/styles.js +24 -0
  227. package/views/Event/index.js +373 -0
  228. package/views/Event/styles.js +63 -0
  229. package/views/FeedList/index.js +165 -0
  230. package/views/FeedList/styles.js +15 -0
  231. package/views/FeedNews/index.js +243 -0
  232. package/views/FeedNews/styles.js +32 -0
  233. package/views/Flexmenu/index.js +185 -0
  234. package/views/Flexmenu/styles.js +62 -0
  235. package/views/FlexmenuWebview/index.js +167 -0
  236. package/views/FlexmenuWebview/styles.js +16 -0
  237. package/views/Howhy/index.js +151 -0
  238. package/views/Howhy/styles.js +11 -0
  239. package/views/Jobs/index.js +217 -0
  240. package/views/Jobs/styles.js +41 -0
  241. package/views/MainMenu/index.js +283 -0
  242. package/views/MainMenu/styles.js +36 -0
  243. package/views/NewsTabbar/index.js +164 -0
  244. package/views/NewsTabbar/styles.js +27 -0
  245. package/views/Opal/index.js +136 -0
  246. package/views/Opal/styles.js +11 -0
  247. package/views/PublicTransportTicket/index.js +173 -0
  248. package/views/PublicTransportTicket/styles.js +17 -0
  249. package/views/Search/index.js +186 -0
  250. package/views/Search/styles.js +67 -0
  251. package/views/SettingsAccessibility/index.js +148 -0
  252. package/views/SettingsAccessibility/styles.js +13 -0
  253. package/views/SettingsAppInfo/index.js +86 -0
  254. package/views/SettingsAppInfo/styles.js +18 -0
  255. package/views/SettingsCanteens/index.js +249 -0
  256. package/views/SettingsCanteens/styles.js +33 -0
  257. package/views/SettingsGeneral/index.js +173 -0
  258. package/views/SettingsGeneral/styles.js +28 -0
  259. package/views/SettingsNotifications/index.js +204 -0
  260. package/views/SettingsNotifications/styles.js +38 -0
  261. package/views/SettingsUser/index.js +170 -0
  262. package/views/SettingsUser/styles.js +17 -0
  263. package/views/TimetableCalendar/index.js +387 -0
  264. package/views/TimetableCalendar/styles.js +121 -0
  265. package/views/TimetableList/index.js +402 -0
  266. package/views/TimetableList/styles.js +55 -0
  267. package/views/Webviews/index.js +158 -0
  268. 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);