From b3772017da33ef405278c89427e819f5fff0e8ad Mon Sep 17 00:00:00 2001 From: Robert Eggl Date: Tue, 14 Nov 2023 23:45:48 +0100 Subject: [PATCH] Updates project structure and adds news page (#57) Co-authored-by: Philipp Opheys --- README.md | 2 +- app.config.ts | 2 +- app/javascript/locales.json | 1 - package.json | 199 +++++++------- src/api/asset-api.ts | 2 +- src/api/authenticated-api.ts | 11 +- src/app/(flow)/onboarding.tsx | 2 +- src/app/(flow)/whatsnew.tsx | 6 +- src/app/(food)/details.tsx | 13 +- src/app/(food)/preferences.tsx | 9 +- src/app/(map)/advanced.tsx | 4 +- src/app/(pages)/calendar.tsx | 30 ++- src/app/(pages)/events.tsx | 14 +- src/app/(pages)/exam.tsx | 32 +-- src/app/(pages)/lecturer.tsx | 20 +- src/app/(pages)/lecturers.tsx | 19 +- src/app/(pages)/mobility.tsx | 16 +- src/app/(pages)/news.tsx | 251 ++++++++++++++++++ src/app/(tabs)/_layout.tsx | 4 +- src/app/(tabs)/food.tsx | 22 +- src/app/(tabs)/index.tsx | 24 +- src/app/(tabs)/map.tsx | 8 +- src/app/(tabs)/timetable.tsx | 11 +- src/app/(timetable)/details.tsx | 11 +- src/app/(timetable)/webView.tsx | 2 +- src/app/(user)/about.tsx | 7 +- src/app/(user)/changelog.tsx | 6 +- src/app/(user)/dashboard.tsx | 7 +- src/app/(user)/grades.tsx | 13 +- src/app/(user)/login.tsx | 2 +- src/app/(user)/profile.tsx | 11 +- src/app/(user)/settings.tsx | 10 +- src/app/(user)/theme.tsx | 4 +- src/app/_layout.tsx | 18 +- src/components/Cards/BaseCard.tsx | 17 +- src/components/Cards/CalendarCard.tsx | 6 +- src/components/Cards/EventsCard.tsx | 4 +- src/components/Cards/FoodCard.tsx | 6 +- .../Elements/Flow/OnboardingBox.tsx | 5 +- src/components/Elements/Flow/WhatsnewBox.tsx | 2 +- src/components/Elements/Flow/svgs/logo.tsx | 2 +- .../Elements/Food/FoodLanguageSection.tsx | 4 +- .../Elements/Food/ItemsPickerScreen.tsx | 4 +- src/components/Elements/Food/MealDay.tsx | 26 +- src/components/Elements/Food/MealEntry.tsx | 9 +- src/components/Elements/Map/FreeRoomsList.tsx | 17 +- src/components/Elements/Map/leaflet.ts | 4 +- src/components/Elements/Pages/CalendarRow.tsx | 9 +- src/components/Elements/Pages/EventRow.tsx | 5 +- src/components/Elements/Pages/GradesRow.tsx | 7 +- src/components/Elements/Pages/LecturerRow.tsx | 9 +- src/components/Elements/Pages/MobilityRow.tsx | 7 +- .../Elements/Settings/LoginAlert.tsx | 2 +- src/components/Elements/Settings/NameBox.tsx | 2 +- .../Elements/Timetable/Separator.tsx | 2 +- .../Elements/Timetable/ShareCard.tsx | 4 +- .../Elements/Universal/Dropdown.tsx | 2 +- .../Elements/Universal/FormList.tsx | 4 +- .../Elements/Universal/LoginForm.tsx | 11 +- .../Elements/Universal/MultiSectionPicker.tsx | 2 +- .../Elements/Universal/RowEntry.tsx | 5 +- .../Elements/Universal/SectionsView.tsx | 5 +- .../Elements/Universal/ShareButton.tsx | 2 +- .../Universal/SingleSectionPicker.tsx | 2 +- .../Elements/Universal/ToggleRow.tsx | 24 +- src/components/allCards.tsx | 8 +- src/{stores => components}/colors.ts | 15 +- src/{stores => components}/provider.tsx | 10 +- src/{stores => }/hooks/dashboard.ts | 0 src/{stores => }/hooks/flow.ts | 2 +- src/{stores => }/hooks/foodFilter.ts | 0 src/{stores => }/hooks/index.ts | 0 src/{stores => }/hooks/mobility.ts | 0 src/{stores => }/hooks/routing.ts | 0 src/{stores => }/hooks/theme.ts | 0 src/{stores => }/hooks/userKind.ts | 0 src/localization/de/api.ts | 3 + src/localization/de/common.ts | 1 + src/localization/de/navigation.ts | 3 +- src/localization/de/settings.ts | 2 +- src/localization/en/api.ts | 7 + src/localization/en/common.ts | 1 + src/localization/en/navigation.ts | 3 +- src/{stores => }/types/asset-api.ts | 0 src/{stores => }/types/components.ts | 0 src/{stores => }/types/data.ts | 0 src/{stores => }/types/neuland-api.ts | 0 src/{stores => }/types/thi-api.ts | 0 src/{stores => }/types/utils.ts | 1 + src/utils/calendar-utils.ts | 4 +- src/utils/date-utils.ts | 2 +- src/utils/food-utils.ts | 12 +- src/utils/grades-utils.ts | 4 +- src/utils/lecturers-utils.ts | 4 +- src/utils/room-utils.ts | 28 +- src/utils/style-utils.ts | 5 + src/utils/timetable-utils.ts | 2 +- tsconfig.json | 1 - yarn.lock | 65 ++++- 99 files changed, 784 insertions(+), 402 deletions(-) delete mode 100644 app/javascript/locales.json create mode 100644 src/app/(pages)/news.tsx rename src/{stores => components}/colors.ts (86%) rename src/{stores => components}/provider.tsx (97%) rename src/{stores => }/hooks/dashboard.ts (100%) rename src/{stores => }/hooks/flow.ts (97%) rename src/{stores => }/hooks/foodFilter.ts (100%) rename src/{stores => }/hooks/index.ts (100%) rename src/{stores => }/hooks/mobility.ts (100%) rename src/{stores => }/hooks/routing.ts (100%) rename src/{stores => }/hooks/theme.ts (100%) rename src/{stores => }/hooks/userKind.ts (100%) rename src/{stores => }/types/asset-api.ts (100%) rename src/{stores => }/types/components.ts (100%) rename src/{stores => }/types/data.ts (100%) rename src/{stores => }/types/neuland-api.ts (100%) rename src/{stores => }/types/thi-api.ts (100%) rename src/{stores => }/types/utils.ts (98%) create mode 100644 src/utils/style-utils.ts diff --git a/README.md b/README.md index 949b05bd..938f7d07 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI](https://github.com/neuland-ingolstadt/neuland.app-native/actions/workflows/lint.yml/badge.svg)](https://github.com/neuland-ingolstadt/neuland.app-native/actions/workflows/lint.yml) [![update](https://github.com/neuland-ingolstadt/neuland.app-native/actions/workflows/update.yml/badge.svg)](https://github.com/neuland-ingolstadt/neuland.app-native/actions/workflows/update.yml) -# neuland.app - native +# Neuland Next - native version of neuland.app An open source, mobile app developed using React Native and Expo, serving as a replacement for the official Technische Hochschule Ingolstadt (THI) app. It features a modern user interface and utilizes the Expo framework for easy development and deployment. diff --git a/app.config.ts b/app.config.ts index d9722d74..608df5c2 100644 --- a/app.config.ts +++ b/app.config.ts @@ -38,7 +38,7 @@ module.exports = { android: { package: 'app.neuland', userInterfaceStyle: 'automatic', - versionCode: 45, + versionCode: 46, }, extra: { eas: { diff --git a/app/javascript/locales.json b/app/javascript/locales.json deleted file mode 100644 index 0967ef42..00000000 --- a/app/javascript/locales.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/package.json b/package.json index 3f80fd2f..f6ed94e9 100644 --- a/package.json +++ b/package.json @@ -1,101 +1,102 @@ { - "version": "0.4.2", - "name": "neuland", - "main": "expo-router/entry", - "homepage": "https://github.com/neuland-ingolstadt/neuland.app-native", - "private": true, - "packageManager": "yarn@4.0.1", - "scripts": { - "start": "expo start -c", - "tunnel": "expo start -c --tunnel", - "android": "expo run:android", - "ios": "expo run:ios", - "web": "expo start --web", - "build:android": "eas build --platform android --local", - "build:ios": "expo prebuild --platform ios && xcodebuild archive -workspace ios/NeulandNext.xcworkspace -scheme NeulandNext", - "build:all": "yarn build:ios && yarn build:android", - "format": "prettier --write .", - "lint": "eslint .", - "lint:fix": "eslint --fix .", - "postinstall": "husky install" - }, - "dependencies": { - "@expo/vector-icons": "^13.0.0", - "@react-native-async-storage/async-storage": "1.18.2", - "@react-native-community/datetimepicker": "7.2.0", - "@react-navigation/native-stack": "6.9.13", - "@types/color": "^3.0.5", - "color": "^4.2.3", - "expo": "^49.0.16", - "expo-blur": "~12.4.1", - "expo-clipboard": "~4.3.0", - "expo-constants": "~14.4.2", - "expo-haptics": "~12.4.0", - "expo-linear-gradient": "~12.3.0", - "expo-linking": "~5.0.2", - "expo-local-authentication": "~13.4.1", - "expo-localization": "~14.3.0", - "expo-router": "^3.1.2", - "expo-secure-store": "~12.3.1", - "expo-sharing": "11.7.0", - "expo-splash-screen": "~0.20.5", - "expo-status-bar": "^1.6.0", - "i18next": "^23.6.0", - "moment": "^2.29.4", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-i18next": "^13.3.1", - "react-native": "0.72.6", - "react-native-big-calendar": "^4.7.0", - "react-native-collapsible": "^1.6.1", - "react-native-draggable-flatlist": "^4.0.1", - "react-native-gesture-handler": "~2.12.0", - "react-native-maps": "1.7.1", - "react-native-onboarding-swiper": "https://github.com/neuland-ingolstadt/react-native-onboarding-swiper.git", - "react-native-reanimated": "3.3.0", - "react-native-root-toast": "^3.4.1", - "react-native-safe-area-context": "4.6.3", - "react-native-screens": "~3.22.0", - "react-native-select-dropdown": "^3.3.4", - "react-native-shimmer-placeholder": "^2.0.9", - "react-native-svg": "^13.14.0", - "react-native-view-shot": "^3.8.0", - "react-native-webview": "13.2.2", - "sanitize-html": "^2.11.0" - }, - "devDependencies": { - "@babel/core": "^7.0.0-0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@expo/ngrok": "^4.1.0", - "@trivago/prettier-plugin-sort-imports": "^4.2.1", - "@types/react": "~18.2.14", - "@types/sanitize-html": "^2", - "@typescript-eslint/eslint-plugin": "^6.6.0", - "@typescript-eslint/parser": "^6.10.0", - "babel-plugin-formatjs": "^10.5.7", - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", - "eslint-config-standard-with-typescript": "^39.1.1", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-n": "^16.3.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "latest", - "eslint-plugin-react-native": "^4.1.0", - "husky": "^8.0.3", - "lint-staged": ">=15", - "prettier": "3.0.3", - "typescript": "^5.2.2" - }, - "lint-staged": { - "**/*.{js,jsx,ts,tsx,json,yml}": [ - "npx prettier --write" - ], - "*.{js,jsx,ts,tsx}": [ - "npx eslint --fix" - ] - } + "version": "0.4.3", + "name": "neuland", + "main": "expo-router/entry", + "homepage": "https://github.com/neuland-ingolstadt/neuland.app-native", + "private": true, + "packageManager": "yarn@4.0.1", + "scripts": { + "start": "expo start -c", + "tunnel": "expo start -c --tunnel", + "android": "expo run:android", + "ios": "expo run:ios", + "web": "expo start --web", + "build:android": "eas build --platform android --local", + "build:ios": "expo prebuild --platform ios && xcodebuild archive -workspace ios/NeulandNext.xcworkspace -scheme NeulandNext", + "build:all": "yarn build:ios && yarn build:android", + "format": "prettier --write .", + "lint": "eslint .", + "lint:fix": "eslint --fix .", + "postinstall": "husky install" + }, + "dependencies": { + "@expo/vector-icons": "^13.0.0", + "@react-native-async-storage/async-storage": "1.18.2", + "@react-native-community/datetimepicker": "7.2.0", + "@react-navigation/native-stack": "6.9.13", + "@types/color": "^3.0.5", + "color": "^4.2.3", + "expo": "^49.0.16", + "expo-blur": "~12.4.1", + "expo-clipboard": "~4.3.0", + "expo-constants": "~14.4.2", + "expo-haptics": "~12.4.0", + "expo-linear-gradient": "~12.3.0", + "expo-linking": "~5.0.2", + "expo-local-authentication": "~13.4.1", + "expo-localization": "~14.3.0", + "expo-router": "^3.1.2", + "expo-secure-store": "~12.3.1", + "expo-sharing": "11.7.0", + "expo-splash-screen": "~0.20.5", + "expo-status-bar": "^1.6.0", + "expo-updates": "~0.18.17", + "i18next": "^23.6.0", + "moment": "^2.29.4", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-i18next": "^13.3.1", + "react-native": "0.72.6", + "react-native-big-calendar": "^4.7.0", + "react-native-collapsible": "^1.6.1", + "react-native-draggable-flatlist": "^4.0.1", + "react-native-gesture-handler": "~2.12.0", + "react-native-maps": "1.7.1", + "react-native-onboarding-swiper": "https://github.com/neuland-ingolstadt/react-native-onboarding-swiper.git", + "react-native-reanimated": "3.3.0", + "react-native-root-toast": "^3.4.1", + "react-native-safe-area-context": "4.6.3", + "react-native-screens": "~3.22.0", + "react-native-select-dropdown": "^3.3.4", + "react-native-shimmer-placeholder": "^2.0.9", + "react-native-svg": "^13.14.0", + "react-native-view-shot": "^3.8.0", + "react-native-webview": "13.2.2", + "sanitize-html": "^2.11.0" + }, + "devDependencies": { + "@babel/core": "^7.0.0-0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@expo/ngrok": "^4.1.0", + "@trivago/prettier-plugin-sort-imports": "^4.2.1", + "@types/react": "~18.2.14", + "@types/sanitize-html": "^2", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.10.0", + "babel-plugin-formatjs": "^10.5.7", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^39.1.1", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "latest", + "eslint-plugin-react-native": "^4.1.0", + "husky": "^8.0.3", + "lint-staged": ">=15", + "prettier": "3.0.3", + "typescript": "^5.2.2" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json,yml}": [ + "npx prettier --write" + ], + "*.{js,jsx,ts,tsx}": [ + "npx eslint --fix" + ] + } } diff --git a/src/api/asset-api.ts b/src/api/asset-api.ts index 63190ab1..648c9369 100644 --- a/src/api/asset-api.ts +++ b/src/api/asset-api.ts @@ -1,5 +1,5 @@ import LocalStorageCache from '@/api/cache' -import { type RoomDistances, type SpoWeights } from '@customTypes/asset-api' +import { type RoomDistances, type SpoWeights } from '@/types/asset-api' import packageInfo from '../../package.json' diff --git a/src/api/authenticated-api.ts b/src/api/authenticated-api.ts index e9161137..9aded661 100644 --- a/src/api/authenticated-api.ts +++ b/src/api/authenticated-api.ts @@ -1,13 +1,14 @@ import courseShortNames from '@/data/course-short-names.json' -import { type CourseShortNames } from '@/stores/types/data' +import { type CourseShortNames } from '@/types/data' import { type Exams, type Grade, type Lecturers, type PersData, type Rooms, + type ThiNews, type TimetableResponse, -} from '@/stores/types/thi-api' +} from '@/types/thi-api' import { APIError, AnonymousAPIClient } from './anonymous-api' import { callWithSession } from './thi-session-handler' @@ -425,16 +426,16 @@ export class AuthenticatedAPIClient extends AnonymousAPIClient { /** * Fetches the latest thi news - * @returns {Promise} Promise that resolves with the news + * @returns {Promise} Promise that resolves with the news */ - async getThiNews(): Promise { + async getThiNews(): Promise { const res = await this.requestAuthenticated({ service: 'thiapp', method: 'thinews', format: 'json', }) - return res[1] + return res } } diff --git a/src/app/(flow)/onboarding.tsx b/src/app/(flow)/onboarding.tsx index 4d7dd006..29cd9382 100644 --- a/src/app/(flow)/onboarding.tsx +++ b/src/app/(flow)/onboarding.tsx @@ -3,7 +3,7 @@ import EverythingSVG from '@/components/Elements/Flow/svgs/everything' import LogoSVG from '@/components/Elements/Flow/svgs/logo' import SecureSVG from '@/components/Elements/Flow/svgs/secure' import LoginForm from '@/components/Elements/Universal/LoginForm' -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' import { useTheme } from '@react-navigation/native' import React, { useRef } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/app/(flow)/whatsnew.tsx b/src/app/(flow)/whatsnew.tsx index 3aee4d08..8ab04843 100644 --- a/src/app/(flow)/whatsnew.tsx +++ b/src/app/(flow)/whatsnew.tsx @@ -1,11 +1,11 @@ import WhatsNewBox from '@/components/Elements/Flow/WhatsnewBox' +import { type Colors } from '@/components/colors' +import { FlowContext } from '@/components/provider' import changelogData from '@/data/changelog.json' import { type LanguageKey } from '@/localization/i18n' -import { type Colors } from '@/stores/colors' -import { FlowContext } from '@/stores/provider' +import { type Changelog } from '@/types/data' import { convertToMajorMinorPatch } from '@/utils/app-utils' import { getContrastColor, getStatusBarStyle } from '@/utils/ui-utils' -import { type Changelog } from '@customTypes/data' import { useTheme } from '@react-navigation/native' import { router } from 'expo-router' import { StatusBar } from 'expo-status-bar' diff --git a/src/app/(food)/details.tsx b/src/app/(food)/details.tsx index 93930d52..891b9539 100644 --- a/src/app/(food)/details.tsx +++ b/src/app/(food)/details.tsx @@ -1,14 +1,15 @@ import FormList from '@/components/Elements/Universal/FormList' import ShareButton from '@/components/Elements/Universal/ShareButton' +import { type Colors } from '@/components/colors' +import { FoodFilterContext, UserKindContext } from '@/components/provider' import allergenMap from '@/data/allergens.json' import flagMap from '@/data/mensa-flags.json' +import { type UserKindContextType } from '@/hooks/userKind' import { type LanguageKey } from '@/localization/i18n' -import { type Colors } from '@/stores/colors' -import { type UserKindContextType } from '@/stores/hooks/userKind' -import { FoodFilterContext, UserKindContext } from '@/stores/provider' -import { type FormListSections } from '@/stores/types/components' -import { type Meal } from '@/stores/types/neuland-api' +import { type FormListSections } from '@/types/components' +import { type Meal } from '@/types/neuland-api' import { formatPrice, mealName } from '@/utils/food-utils' +import { PAGE_PADDING } from '@/utils/style-utils' import { getStatusBarStyle } from '@/utils/ui-utils' import { useTheme } from '@react-navigation/native' import { useLocalSearchParams } from 'expo-router' @@ -257,7 +258,7 @@ const styles = StyleSheet.create({ marginVertical: 16, width: '100%', alignSelf: 'center', - paddingHorizontal: 16, + paddingHorizontal: PAGE_PADDING, }, titleContainer: { alignSelf: 'center', diff --git a/src/app/(food)/preferences.tsx b/src/app/(food)/preferences.tsx index 19a54bb9..ef812bcc 100644 --- a/src/app/(food)/preferences.tsx +++ b/src/app/(food)/preferences.tsx @@ -5,9 +5,10 @@ import FormList from '@/components/Elements/Universal/FormList' import MultiSectionPicker from '@/components/Elements/Universal/MultiSectionPicker' import SectionView from '@/components/Elements/Universal/SectionsView' import SingleSectionPicker from '@/components/Elements/Universal/SingleSectionPicker' -import { type Colors } from '@/stores/colors' -import { FoodFilterContext } from '@/stores/provider' -import { type FormListSections } from '@customTypes/components' +import { type Colors } from '@/components/colors' +import { FoodFilterContext } from '@/components/provider' +import { type FormListSections } from '@/types/components' +import { PAGE_PADDING } from '@/utils/style-utils' import { useTheme } from '@react-navigation/native' import { useRouter } from 'expo-router' import React, { useContext } from 'react' @@ -122,7 +123,7 @@ const styles = StyleSheet.create({ marginBottom: 4, }, sectionContainer: { - paddingHorizontal: 16, + paddingHorizontal: PAGE_PADDING, width: '100%', alignSelf: 'center', }, diff --git a/src/app/(map)/advanced.tsx b/src/app/(map)/advanced.tsx index 5e1f15f8..e22f632b 100644 --- a/src/app/(map)/advanced.tsx +++ b/src/app/(map)/advanced.tsx @@ -7,7 +7,8 @@ import Divider from '@/components/Elements/Universal/Divider' import Dropdown, { DropdownButton, } from '@/components/Elements/Universal/Dropdown' -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' +import { type AvailableRoom } from '@/types/utils' import { formatISODate, formatISOTime } from '@/utils/date-utils' import { BUILDINGS, @@ -16,7 +17,6 @@ import { filterRooms, getNextValidDate, } from '@/utils/room-utils' -import { type AvailableRoom } from '@customTypes/utils' import DateTimePicker from '@react-native-community/datetimepicker' import { useTheme } from '@react-navigation/native' import { useRouter } from 'expo-router' diff --git a/src/app/(pages)/calendar.tsx b/src/app/(pages)/calendar.tsx index 9bd78af7..f8c308e7 100644 --- a/src/app/(pages)/calendar.tsx +++ b/src/app/(pages)/calendar.tsx @@ -2,11 +2,12 @@ import { NoSessionError } from '@/api/thi-session-handler' import { CalendarRow, ExamRow } from '@/components/Elements/Pages/CalendarRow' import Divider from '@/components/Elements/Universal/Divider' import ToggleRow from '@/components/Elements/Universal/ToggleRow' -import { type Colors } from '@/stores/colors' -import { UserKindContext } from '@/stores/provider' +import { type Colors } from '@/components/colors' +import { UserKindContext } from '@/components/provider' +import { type Calendar } from '@/types/data' +import { type Exam } from '@/types/utils' import { calendar, loadExamList } from '@/utils/calendar-utils' -import { type Calendar } from '@customTypes/data' -import { type Exam } from '@customTypes/utils' +import { MODAL_BOTTOM_MARGIN, PAGE_PADDING } from '@/utils/style-utils' import { useTheme } from '@react-navigation/native' import { useRouter } from 'expo-router' import React, { useEffect, useState } from 'react' @@ -88,6 +89,8 @@ export default function CalendarPage(): JSX.Element { const data = selectedData === 'Events' ? calendar : exams return ( )} - + + diff --git a/src/components/Elements/Map/leaflet.ts b/src/components/Elements/Map/leaflet.ts index 58caa85d..2f00a4c8 100644 --- a/src/components/Elements/Map/leaflet.ts +++ b/src/components/Elements/Map/leaflet.ts @@ -1,7 +1,7 @@ +import { type Colors } from '@/components/colors' import { type LanguageKey } from '@/localization/i18n' -import { type Colors } from '@/stores/colors' +import { type AvailableRoom, type RoomEntry } from '@/types/utils' import { formatFriendlyTime } from '@/utils/date-utils' -import { type AvailableRoom, type RoomEntry } from '@customTypes/utils' import type WebView from 'react-native-webview' /** diff --git a/src/components/Elements/Pages/CalendarRow.tsx b/src/components/Elements/Pages/CalendarRow.tsx index 9830ba3f..0378d593 100644 --- a/src/components/Elements/Pages/CalendarRow.tsx +++ b/src/components/Elements/Pages/CalendarRow.tsx @@ -1,12 +1,13 @@ +import { type Colors } from '@/components/colors' import { type LanguageKey } from '@/localization/i18n' -import { type Colors } from '@/stores/colors' +import { type Calendar } from '@/types/data' import { formatFriendlyDateRange, formatFriendlyDateTime, formatFriendlyDateTimeRange, formatFriendlyRelativeTime, } from '@/utils/date-utils' -import { type Calendar } from '@customTypes/data' +import { ROW_PADDING } from '@/utils/style-utils' import { router } from 'expo-router' import React from 'react' import { useTranslation } from 'react-i18next' @@ -44,7 +45,9 @@ const CalendarRow = ({ } rightChildren={ - + @@ -96,7 +97,7 @@ const MobilityRow = ({ flexDirection: 'column', alignItems: 'flex-end', justifyContent: 'center', - padding: 5, + padding: ROW_PADDING, }} > { try { setLoading(true) const userKind = await createSession(username, password, true) - const userFullName = await API.getFullName() + if (userKind) { + updateUserFullName(await API.getFullName()) + } else { + updateUserFullName(username) + } toggleUserKind(userKind) - updateUserFullName(userFullName) toggleUpdated() toggleOnboarded() Haptics.notificationAsync( diff --git a/src/components/Elements/Universal/MultiSectionPicker.tsx b/src/components/Elements/Universal/MultiSectionPicker.tsx index fcb8017f..d621027c 100644 --- a/src/components/Elements/Universal/MultiSectionPicker.tsx +++ b/src/components/Elements/Universal/MultiSectionPicker.tsx @@ -1,5 +1,5 @@ import Divider from '@/components/Elements/Universal/Divider' -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' import { Ionicons } from '@expo/vector-icons' import { useTheme } from '@react-navigation/native' import React from 'react' diff --git a/src/components/Elements/Universal/RowEntry.tsx b/src/components/Elements/Universal/RowEntry.tsx index 50f15c07..173787d6 100644 --- a/src/components/Elements/Universal/RowEntry.tsx +++ b/src/components/Elements/Universal/RowEntry.tsx @@ -1,4 +1,5 @@ -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' +import { ROW_PADDING } from '@/utils/style-utils' import React from 'react' import { type DimensionValue, @@ -65,7 +66,7 @@ const styles = StyleSheet.create({ flexDirection: 'column', alignItems: 'flex-start', - padding: 5, + padding: ROW_PADDING, maxWidth: '70%', }, }) diff --git a/src/components/Elements/Universal/SectionsView.tsx b/src/components/Elements/Universal/SectionsView.tsx index 24ac325d..c753d81d 100644 --- a/src/components/Elements/Universal/SectionsView.tsx +++ b/src/components/Elements/Universal/SectionsView.tsx @@ -1,4 +1,5 @@ -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' +import { PAGE_PADDING } from '@/utils/style-utils' import { useTheme } from '@react-navigation/native' import React from 'react' import { StyleSheet, Text, View } from 'react-native' @@ -46,7 +47,7 @@ const styles = StyleSheet.create({ marginBottom: 4, }, sectionContainer: { - paddingHorizontal: 16, + paddingHorizontal: PAGE_PADDING, width: '100%', alignSelf: 'center', }, diff --git a/src/components/Elements/Universal/ShareButton.tsx b/src/components/Elements/Universal/ShareButton.tsx index b6328390..c32452be 100644 --- a/src/components/Elements/Universal/ShareButton.tsx +++ b/src/components/Elements/Universal/ShareButton.tsx @@ -1,4 +1,4 @@ -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' import { Ionicons } from '@expo/vector-icons' import { useTheme } from '@react-navigation/native' import React from 'react' diff --git a/src/components/Elements/Universal/SingleSectionPicker.tsx b/src/components/Elements/Universal/SingleSectionPicker.tsx index 86543de1..c7ccd7f0 100644 --- a/src/components/Elements/Universal/SingleSectionPicker.tsx +++ b/src/components/Elements/Universal/SingleSectionPicker.tsx @@ -1,4 +1,4 @@ -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' import { Ionicons } from '@expo/vector-icons' import { useTheme } from '@react-navigation/native' import React from 'react' diff --git a/src/components/Elements/Universal/ToggleRow.tsx b/src/components/Elements/Universal/ToggleRow.tsx index 97592cd8..bf7baa1b 100644 --- a/src/components/Elements/Universal/ToggleRow.tsx +++ b/src/components/Elements/Universal/ToggleRow.tsx @@ -1,4 +1,5 @@ -import { type Colors } from '@/stores/colors' +import { type Colors } from '@/components/colors' +import { PAGE_PADDING } from '@/utils/style-utils' import { useTheme } from '@react-navigation/native' import React from 'react' import { Pressable, StyleSheet, Text, View } from 'react-native' @@ -13,21 +14,12 @@ const ToggleRow = ({ setSelectedElement: (element: string) => void }): JSX.Element => { const colors = useTheme().colors as Colors // Make sure to replace `Colors` with the actual type of your colors - const itemCnt = items.length return ( {items.map((item, index) => { - const isFirstDay = index === 0 - const isLastDay = index === itemCnt - 1 - const buttonStyle = [ - { flex: 1, marginHorizontal: 4 }, - isFirstDay ? { marginLeft: 0 } : null, - isLastDay ? { marginRight: 0 } : null, - ] - return ( - + { setSelectedElement(item as 'Events' | 'Exams') @@ -70,10 +62,12 @@ const styles = StyleSheet.create({ buttonRow: { flexDirection: 'row', justifyContent: 'space-between', - width: '95%', + width: '100%', alignSelf: 'center', - paddingTop: 16, - paddingBottom: 6, + gap: 12, + }, + buttonView: { + flex: 1, }, buttonContainer: { width: '100%', @@ -87,7 +81,7 @@ const styles = StyleSheet.create({ shadowRadius: 1, alignItems: 'center', - paddingHorizontal: 16, + paddingHorizontal: PAGE_PADDING, paddingVertical: 10, }, }) diff --git a/src/components/allCards.tsx b/src/components/allCards.tsx index d8fa41a5..80678cf8 100644 --- a/src/components/allCards.tsx +++ b/src/components/allCards.tsx @@ -1,8 +1,4 @@ -import { - USER_EMPLOYEE, - USER_GUEST, - USER_STUDENT, -} from '@/stores/hooks/userKind' +import { USER_EMPLOYEE, USER_GUEST, USER_STUDENT } from '@/hooks/userKind' import { useRouter } from 'expo-router' import React from 'react' @@ -88,7 +84,7 @@ export const AllCards: Card[] = [ { key: 'news', removable: true, - default: [], + default: [USER_STUDENT, USER_EMPLOYEE], card: () => ( interface StaticThemeColors { - labelTertiaryColor: ColorValue - labelSecondaryColor: ColorValue - labelColor: ColorValue - labelBackground: ColorValue - success: ColorValue - datePickerBackground: ColorValue - card: ColorValue + labelTertiaryColor: string + labelSecondaryColor: string + labelColor: string + labelBackground: string + success: string + datePickerBackground: string + card: string } export interface Colors extends StaticThemeColors { diff --git a/src/stores/provider.tsx b/src/components/provider.tsx similarity index 97% rename from src/stores/provider.tsx rename to src/components/provider.tsx index 5f0c4d9c..7f2c0375 100644 --- a/src/stores/provider.tsx +++ b/src/components/provider.tsx @@ -8,7 +8,6 @@ import { Platform, useColorScheme } from 'react-native' import { GestureHandlerRootView } from 'react-native-gesture-handler' import { RootSiblingParent } from 'react-native-root-siblings' -import { type AppTheme, accentColors, darkColors, lightColors } from './colors' import { useDashboard, useFlow, @@ -17,10 +16,11 @@ import { useRouteParams, useTheme, useUserKind, -} from './hooks' -import { type Dashboard } from './hooks/dashboard' -import { type FoodFilter } from './hooks/foodFilter' -import { type RouteParams } from './hooks/routing' +} from '../hooks' +import { type Dashboard } from '../hooks/dashboard' +import { type FoodFilter } from '../hooks/foodFilter' +import { type RouteParams } from '../hooks/routing' +import { type AppTheme, accentColors, darkColors, lightColors } from './colors' interface ProviderProps { children: React.ReactNode diff --git a/src/stores/hooks/dashboard.ts b/src/hooks/dashboard.ts similarity index 100% rename from src/stores/hooks/dashboard.ts rename to src/hooks/dashboard.ts diff --git a/src/stores/hooks/flow.ts b/src/hooks/flow.ts similarity index 97% rename from src/stores/hooks/flow.ts rename to src/hooks/flow.ts index 304309aa..668a2832 100644 --- a/src/stores/hooks/flow.ts +++ b/src/hooks/flow.ts @@ -2,7 +2,7 @@ import { convertToMajorMinorPatch } from '@/utils/app-utils' import AsyncStorage from '@react-native-async-storage/async-storage' import { useEffect, useState } from 'react' -import packageInfo from '../../../package.json' +import packageInfo from '../../package.json' export interface FlowHook { isOnboarded: boolean | null diff --git a/src/stores/hooks/foodFilter.ts b/src/hooks/foodFilter.ts similarity index 100% rename from src/stores/hooks/foodFilter.ts rename to src/hooks/foodFilter.ts diff --git a/src/stores/hooks/index.ts b/src/hooks/index.ts similarity index 100% rename from src/stores/hooks/index.ts rename to src/hooks/index.ts diff --git a/src/stores/hooks/mobility.ts b/src/hooks/mobility.ts similarity index 100% rename from src/stores/hooks/mobility.ts rename to src/hooks/mobility.ts diff --git a/src/stores/hooks/routing.ts b/src/hooks/routing.ts similarity index 100% rename from src/stores/hooks/routing.ts rename to src/hooks/routing.ts diff --git a/src/stores/hooks/theme.ts b/src/hooks/theme.ts similarity index 100% rename from src/stores/hooks/theme.ts rename to src/hooks/theme.ts diff --git a/src/stores/hooks/userKind.ts b/src/hooks/userKind.ts similarity index 100% rename from src/stores/hooks/userKind.ts rename to src/hooks/userKind.ts diff --git a/src/localization/de/api.ts b/src/localization/de/api.ts index be7912cd..150b23c0 100644 --- a/src/localization/de/api.ts +++ b/src/localization/de/api.ts @@ -5,4 +5,7 @@ export default { lecturerOrganizations: { // no translation needed -> using the default value from the API }, + roomTypes: { + // no translation needed -> using the default value from the API + }, } diff --git a/src/localization/de/common.ts b/src/localization/de/common.ts index 9e6344a8..bdcc5ebf 100644 --- a/src/localization/de/common.ts +++ b/src/localization/de/common.ts @@ -82,6 +82,7 @@ export default { date: 'Datum', time: 'Zeit', duration: 'Dauer', + seats: 'Plätze', }, results: 'Verfügbare Räume', }, diff --git a/src/localization/de/navigation.ts b/src/localization/de/navigation.ts index 88ecae18..90d70096 100644 --- a/src/localization/de/navigation.ts +++ b/src/localization/de/navigation.ts @@ -24,6 +24,7 @@ export default { lecturer: 'Dozenten-Details', mobility: 'Mobilität', grades: 'Noten', + news: 'THI Neuigkeiten', }, cards: { titles: { @@ -32,7 +33,7 @@ export default { calendar: 'Kalender', rooms: 'Räume', lecturers: 'Dozenten', - news: 'Nachrichten', + news: 'THI Neuigkeiten', library: 'Bibliothek', events: 'Veranstaltungen', reimanns: 'Reimanns', diff --git a/src/localization/de/settings.ts b/src/localization/de/settings.ts index 3655bc75..2b62f35a 100644 --- a/src/localization/de/settings.ts +++ b/src/localization/de/settings.ts @@ -6,7 +6,7 @@ export default { 'Melde dich an, um alle Funktionen der App freizuschalten.', }, employee: { - subtitle: 'Mitarbeitenden Account', + subtitle1: 'Mitarbeitenden Account', subtitle2: 'Tippe zum Abmelden', }, error: { diff --git a/src/localization/en/api.ts b/src/localization/en/api.ts index 935066e4..e2e0e1e8 100644 --- a/src/localization/en/api.ts +++ b/src/localization/en/api.ts @@ -23,4 +23,11 @@ export default { Verwaltung: 'Management', 'Zentrum für Angewandte Forschung': 'Center for Applied Research', }, + roomTypes: { + 'PC-Pool': 'PC-Pool', + Seminarraum: 'Seminar room', + Labor: 'Laboratory', + 'Kleiner Hörsaal': 'Small lecture hall', + 'Großer Hörsaal': 'Large Llecture hall', + }, } diff --git a/src/localization/en/common.ts b/src/localization/en/common.ts index 3646e9c5..824235e2 100644 --- a/src/localization/en/common.ts +++ b/src/localization/en/common.ts @@ -81,6 +81,7 @@ export default { date: 'Date', time: 'Time', duration: 'Duration', + seats: 'seats', }, results: 'Available rooms', }, diff --git a/src/localization/en/navigation.ts b/src/localization/en/navigation.ts index 6a7aa734..63a7dd6f 100644 --- a/src/localization/en/navigation.ts +++ b/src/localization/en/navigation.ts @@ -24,6 +24,7 @@ export default { lecturer: 'Lecturer Details', mobility: 'Mobility', grades: 'Grades', + news: 'THI News', }, cards: { titles: { @@ -32,7 +33,7 @@ export default { calendar: 'Calendar', rooms: 'Rooms', lecturers: 'Lecturers', - news: 'News', + news: 'THI News', library: 'Library', events: 'Events', reimanns: 'Reimanns', diff --git a/src/stores/types/asset-api.ts b/src/types/asset-api.ts similarity index 100% rename from src/stores/types/asset-api.ts rename to src/types/asset-api.ts diff --git a/src/stores/types/components.ts b/src/types/components.ts similarity index 100% rename from src/stores/types/components.ts rename to src/types/components.ts diff --git a/src/stores/types/data.ts b/src/types/data.ts similarity index 100% rename from src/stores/types/data.ts rename to src/types/data.ts diff --git a/src/stores/types/neuland-api.ts b/src/types/neuland-api.ts similarity index 100% rename from src/stores/types/neuland-api.ts rename to src/types/neuland-api.ts diff --git a/src/stores/types/thi-api.ts b/src/types/thi-api.ts similarity index 100% rename from src/stores/types/thi-api.ts rename to src/types/thi-api.ts diff --git a/src/stores/types/utils.ts b/src/types/utils.ts similarity index 98% rename from src/stores/types/utils.ts rename to src/types/utils.ts index 0528479f..bcd94d37 100644 --- a/src/stores/types/utils.ts +++ b/src/types/utils.ts @@ -53,6 +53,7 @@ export interface AvailableRoom { until: Date room: string type: string + capacity: number } export interface RoomEntry { diff --git a/src/utils/calendar-utils.ts b/src/utils/calendar-utils.ts index 26286737..ebf6943f 100644 --- a/src/utils/calendar-utils.ts +++ b/src/utils/calendar-utils.ts @@ -1,7 +1,7 @@ import API from '@/api/authenticated-api' import rawCalendar from '@/data/calendar.json' -import { type Calendar } from '@customTypes/data' -import { type Exam } from '@customTypes/utils' +import { type Calendar } from '@/types/data' +import { type Exam } from '@/types/utils' export const compileTime = new Date() export const calendar: Calendar[] = rawCalendar diff --git a/src/utils/date-utils.ts b/src/utils/date-utils.ts index 162dd592..ada00b2f 100644 --- a/src/utils/date-utils.ts +++ b/src/utils/date-utils.ts @@ -1,5 +1,5 @@ import i18n from '@/localization/i18n' -import { type FriendlyDateOptions } from '@customTypes/utils' +import { type FriendlyDateOptions } from '@/types/utils' import type dayjs from 'dayjs' // required by react-native-big-calendar (thats why we have moment and dayjs) import moment from 'moment' diff --git a/src/utils/food-utils.ts b/src/utils/food-utils.ts index 121a5dd4..02edd392 100644 --- a/src/utils/food-utils.ts +++ b/src/utils/food-utils.ts @@ -1,15 +1,11 @@ import NeulandAPI from '@/api/neuland-api' import allergenMap from '@/data/allergens.json' import flapMap from '@/data/mensa-flags.json' +import { type FoodLanguage } from '@/hooks/foodFilter' +import { USER_EMPLOYEE, USER_GUEST, USER_STUDENT } from '@/hooks/userKind' import { type LanguageKey } from '@/localization/i18n' -import { type FoodLanguage } from '@/stores/hooks/foodFilter' -import { - USER_EMPLOYEE, - USER_GUEST, - USER_STUDENT, -} from '@/stores/hooks/userKind' -import { type Food, type Meal, type Name } from '@/stores/types/neuland-api' -import { type Labels, type Prices } from '@customTypes/utils' +import { type Food, type Meal, type Name } from '@/types/neuland-api' +import { type Labels, type Prices } from '@/types/utils' import { type TFunction } from 'i18next' import { formatISODate, getAdjustedDay, getMonday } from './date-utils' diff --git a/src/utils/grades-utils.ts b/src/utils/grades-utils.ts index 9614433f..bd32d77a 100644 --- a/src/utils/grades-utils.ts +++ b/src/utils/grades-utils.ts @@ -1,7 +1,7 @@ import AssetAPI from '@/api/asset-api' import API from '@/api/authenticated-api' -import { type Grade } from '@customTypes/thi-api' -import { type GradeAverage } from '@customTypes/utils' +import { type Grade } from '@/types/thi-api' +import { type GradeAverage } from '@/types/utils' function simplifyName(x: string): string { return x.replace(/\W|und|u\./g, '').toLowerCase() diff --git a/src/utils/lecturers-utils.ts b/src/utils/lecturers-utils.ts index 08a2d0fc..12b9afba 100644 --- a/src/utils/lecturers-utils.ts +++ b/src/utils/lecturers-utils.ts @@ -1,5 +1,5 @@ -import { type Lecturers } from '@customTypes/thi-api' -import { type NormalizedLecturer } from '@customTypes/utils' +import { type Lecturers } from '@/types/thi-api' +import { type NormalizedLecturer } from '@/types/utils' /** * Normalizes lecturer data. diff --git a/src/utils/room-utils.ts b/src/utils/room-utils.ts index 33215b4b..e41912d9 100644 --- a/src/utils/room-utils.ts +++ b/src/utils/room-utils.ts @@ -1,6 +1,6 @@ import API from '@/api/authenticated-api' -import { type Rooms } from '@customTypes/thi-api' -import { type AvailableRoom } from '@customTypes/utils' +import { type Rooms } from '@/types/thi-api' +import { type AvailableRoom } from '@/types/utils' import { formatISODate } from './date-utils' @@ -90,6 +90,7 @@ type RoomOpenings = Record< type: string from: Date until: Date + capacity: number }> > @@ -116,16 +117,19 @@ export function getRoomOpenings(rooms: Rooms[], date: Date): RoomOpenings { ) // flatten room list .flatMap((stunde: any) => - stunde.raeume.map(([, , room]: [string, string, number]) => ({ - // 0 indicates that every room is free - room: room === 0 ? ROOMS_ALL : room.toString(), - type: stunde.type, - from: new Date(stunde.von), - until: new Date(stunde.bis), - })) + stunde.raeume.map( + ([, , room, capacity]: [string, string, number, number]) => ({ + // 0 indicates that every room is free + room: room === 0 ? ROOMS_ALL : room.toString(), + type: stunde.type.replace(/ \(.*\)$/, '').trim() ?? '', + from: new Date(stunde.von), + until: new Date(stunde.bis), + capacity, + }) + ) ) // iterate over every room - .forEach(({ room, type, from, until }) => { + .forEach(({ room, type, from, until, capacity }) => { // initialize room const roomOpenings = openings[room] ?? (openings[room] = []) // find overlapping opening @@ -141,7 +145,7 @@ export function getRoomOpenings(rooms: Rooms[], date: Date): RoomOpenings { opening.until = maxDate(until, opening.until) } else { // create new opening - roomOpenings.push({ type, from, until }) + roomOpenings.push({ type, from, until, capacity }) } }) return openings @@ -201,7 +205,6 @@ export async function filterRooms( beginDate.getSeconds(), beginDate.getMilliseconds() ) - return await searchRooms(beginDate, endDate, building) } @@ -226,6 +229,7 @@ export async function searchRooms( type: opening.type, from: opening.from, until: opening.until, + capacity: opening.capacity, })) ) .filter( diff --git a/src/utils/style-utils.ts b/src/utils/style-utils.ts new file mode 100644 index 00000000..7b220c01 --- /dev/null +++ b/src/utils/style-utils.ts @@ -0,0 +1,5 @@ +export const PAGE_PADDING = 12 +export const PAGE_BOTTOM_SAFE_AREA = 70 +export const MODAL_BOTTOM_MARGIN = 32 +export const CARD_PADDING = 16 +export const ROW_PADDING = 5 diff --git a/src/utils/timetable-utils.ts b/src/utils/timetable-utils.ts index c9604d7b..62e4f869 100644 --- a/src/utils/timetable-utils.ts +++ b/src/utils/timetable-utils.ts @@ -1,5 +1,5 @@ import API from '@/api/authenticated-api' -import { type FriendlyTimetableEntry } from '@customTypes/utils' +import { type FriendlyTimetableEntry } from '@/types/utils' import { combineDateTime } from './date-utils' diff --git a/tsconfig.json b/tsconfig.json index 2363e9cc..44cc06f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "baseUrl": ".", "compilerOptions": { "paths": { - "@customTypes/*": ["./src/stores/types/*"], "@/*": ["./src/*"] }, diff --git a/yarn.lock b/yarn.lock index cd74f934..547df636 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6271,6 +6271,13 @@ __metadata: languageName: node linkType: hard +"expo-eas-client@npm:~0.6.0": + version: 0.6.0 + resolution: "expo-eas-client@npm:0.6.0" + checksum: 74251254f3ee8f1b291b26a7e7c4f30fa89b7425d150a4c980860ab5b96eedd85b474d6860b0024c6e02d9dc8aa7c5740602548f8506b352d9becb38dcdc2b55 + languageName: node + linkType: hard + "expo-file-system@npm:~15.4.0, expo-file-system@npm:~15.4.4": version: 15.4.4 resolution: "expo-file-system@npm:15.4.4" @@ -6302,6 +6309,13 @@ __metadata: languageName: node linkType: hard +"expo-json-utils@npm:~0.7.0": + version: 0.7.1 + resolution: "expo-json-utils@npm:0.7.1" + checksum: 8fc4986fa9c4abec9b519f13d4c16f567c5014edba54a37accc24aa2c8262b329bd3befef30c4a6c9fad72d2c6994f8eef4dcb3d38383cc77955ba450beba373 + languageName: node + linkType: hard + "expo-keep-awake@npm:~12.3.0": version: 12.3.0 resolution: "expo-keep-awake@npm:12.3.0" @@ -6355,6 +6369,15 @@ __metadata: languageName: node linkType: hard +"expo-manifests@npm:~0.7.0": + version: 0.7.2 + resolution: "expo-manifests@npm:0.7.2" + dependencies: + expo-json-utils: "npm:~0.7.0" + checksum: e665d6cbce13aa2e856389b1291b8c5846850b173db28a7076e8390818e830846bfd8c6bbbcaffea43c07cd705a5c51845759eb2ff6215b56486b5b99f0f6488 + languageName: node + linkType: hard + "expo-modules-autolinking@npm:1.5.1": version: 1.5.1 resolution: "expo-modules-autolinking@npm:1.5.1" @@ -6464,6 +6487,45 @@ __metadata: languageName: node linkType: hard +"expo-structured-headers@npm:~3.3.0": + version: 3.3.0 + resolution: "expo-structured-headers@npm:3.3.0" + checksum: a03193cb1ed48ec63a3ac95052ab9512d5e61bad9aed3efc9d0af1d631b264a92d6ed69c8ead580fc03d9db2f95d93ef846510b25a34ca2d3b74077f1c919a38 + languageName: node + linkType: hard + +"expo-updates-interface@npm:~0.10.0": + version: 0.10.1 + resolution: "expo-updates-interface@npm:0.10.1" + peerDependencies: + expo: "*" + checksum: ddf0292a5c25d5e235240a6a1342dcfc3b31a3f4940e3e984c16e261049d56e64e284496e46427a8c538df7a5588e245fc87ab9eb76c2f70519875c8e5da0b7d + languageName: node + linkType: hard + +"expo-updates@npm:~0.18.17": + version: 0.18.17 + resolution: "expo-updates@npm:0.18.17" + dependencies: + "@expo/code-signing-certificates": "npm:0.0.5" + "@expo/config": "npm:~8.1.0" + "@expo/config-plugins": "npm:~7.2.0" + arg: "npm:4.1.0" + chalk: "npm:^4.1.2" + expo-eas-client: "npm:~0.6.0" + expo-manifests: "npm:~0.7.0" + expo-structured-headers: "npm:~3.3.0" + expo-updates-interface: "npm:~0.10.0" + fbemitter: "npm:^3.0.0" + resolve-from: "npm:^5.0.0" + peerDependencies: + expo: "*" + bin: + expo-updates: bin/cli.js + checksum: c89636a93b1771fbd38988464c5c45ab5001490482305664385737304c5454c87fcab13cebae5fbe05ca47447089ed8a58c8fb3b9f9926136691ee65f99f44b5 + languageName: node + linkType: hard + "expo@npm:^49.0.16": version: 49.0.16 resolution: "expo@npm:49.0.16" @@ -9531,6 +9593,7 @@ __metadata: expo-sharing: "npm:11.7.0" expo-splash-screen: "npm:~0.20.5" expo-status-bar: "npm:^1.6.0" + expo-updates: "npm:~0.18.17" husky: "npm:^8.0.3" i18next: "npm:^23.6.0" lint-staged: "npm:>=15" @@ -10680,7 +10743,7 @@ __metadata: prop-types: "*" react: "*" react-native: "*" - checksum: 1176e28f118875027d96a751157ef5b6b5bdb827f6aae41a45d9482bbdddb4206bec10ba945f3e0ec3d0bac502185417d8fe00cbcd0b28e8354eb543c61c7555 + checksum: cb81a1eb47fb8431a298974e310096f1d16112f7de5c901ad3f1603cd1a2657aeacbbaeec8ebf63b242cce5b103d780e4d3cc61a4105266168589cb77f785f07 languageName: node linkType: hard