diff --git a/.gitignore b/.gitignore index 6189344c..1306fd97 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,7 @@ ios/UMAllWhite.xcodeproj/project.pbxproj ios/UMAllWhite.xcodeproj/project.pbxproj # Google Firebase -# google-services.json \ No newline at end of file +# google-services.json + +# UM API Token +umAPIToken.json \ No newline at end of file diff --git a/README.md b/README.md index dc0c2c8d..d2113acb 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ ## 🎉 首次運行該項目 -在此查看[已知 BUG](https://github.com/UM-ARK/UM-All-Frontend/blob/master/debugging_doc.md#android%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83) +在此查看[已知 BUG](./README/debugging_doc.md#android%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83) ### 🤖 Android 環境 [Setup](https://reactnative.dev/docs/environment-setup) @@ -162,7 +162,7 @@ yarn ios --simulator="iPhone 15" ### 🐛 故障排除 -在此查看[Android 解決方案](https://github.com/UM-ARK/UM-All-Frontend/blob/master/debugging_doc.md#android)與[iOS 解決方案](https://github.com/UM-ARK/UM-All-Frontend/blob/master/debugging_doc.md#ios) +在此查看[Android 解決方案](./README/debugging_doc.md#android)與[iOS 解決方案](./README/debugging_doc.md#ios) --- @@ -171,7 +171,7 @@ yarn ios --simulator="iPhone 15" ## ⛵ 維護須知 -1. 澳大日曆更新。從 `https://reg.um.edu.mo/university-almanac/?lang=zh-hant` 獲取 ics 文件;使用任何工具將 ics 轉為 json,例如 `https://ical-to-json.herokuapp.com/`。**務必注意最終 json 中的 key 必須為小寫**。覆蓋 `src/static/UMCalendar/UMCalendar.json` 中的內容即可。 +1. 澳大日曆更新。從 `https://reg.um.edu.mo/university-almanac/?lang=zh-hant` 獲取 ics 文件;使用任何工具將 ics 轉為 json(course-data-parse倉庫內也有icsToJSON工具),例如 `https://ical-to-json.herokuapp.com/`。**務必注意最終 json 中的 key 必須為小寫**。覆蓋 `src/static/UMCalendar/UMCalendar.json` 中的內容即可。 * 按照程序注釋增加校曆的繁體中文翻譯內容。 2. 澳大課程更新。使用預選課Excel,使用Excel to JSON工具獲得JSON數據,放入`src/static/UMCourses/offer courses.json`。 * 按照程序注釋增加開設課程的繁體中文翻譯內容。 diff --git a/debugging_doc.md b/README/debugging_doc.md similarity index 100% rename from debugging_doc.md rename to README/debugging_doc.md diff --git a/android/app/build.gradle b/android/app/build.gradle index defeda40..95dd23fc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,8 +139,8 @@ android { applicationId "one.umall" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 57 - versionName "2.8.6" + versionCode 58 + versionName "3.0.0" buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() if (isNewArchitectureEnabled()) { diff --git a/android/build.gradle b/android/build.gradle index 3912afd8..b3ee0aa1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,7 @@ buildscript { buildToolsVersion = "31.0.0" minSdkVersion = 21 compileSdkVersion = 33 - targetSdkVersion = 33 + targetSdkVersion = 34 if (System.properties['os.arch'] == "aarch64") { // For M1 Users we need to use the NDK 24 which added support for aarch64 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2f01c566..334bfd13 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -326,7 +326,7 @@ PODS: - glog - react-native-cameraroll (5.6.0): - React-Core - - react-native-compressor (1.8.23): + - react-native-compressor (1.8.25): - React-Core - react-native-cookies (6.2.1): - React-Core @@ -334,16 +334,16 @@ PODS: - React-Core - react-native-menu (0.9.1): - React - - react-native-pager-view (6.2.3): + - react-native-pager-view (6.3.3): - React-Core - react-native-restart (0.0.24): - React-Core - - react-native-safe-area-context (4.9.0): + - react-native-safe-area-context (4.10.7): - React-Core - - react-native-simple-toast (3.3.0): + - react-native-simple-toast (3.3.1): - React-Core - Toast (~> 4) - - react-native-webview (13.8.1): + - react-native-webview (13.10.4): - React-Core - React-perflogger (0.68.7) - React-RCTActionSheet (0.68.7): @@ -414,9 +414,9 @@ PODS: - React - rn-fetch-blob (0.12.0): - React-Core - - RNCAsyncStorage (1.21.0): + - RNCAsyncStorage (1.23.1): - React-Core - - RNCClipboard (1.13.2): + - RNCClipboard (1.14.1): - React-Core - RNDateTimePicker (6.7.5): - React-Core @@ -433,7 +433,7 @@ PODS: - React-Core - RNFS (2.20.0): - React-Core - - RNGestureHandler (2.14.1): + - RNGestureHandler (2.17.1): - React-Core - RNInAppBrowser (3.7.0): - React-Core @@ -468,7 +468,7 @@ PODS: - React-RCTText - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.29.0): + - RNScreens (3.32.0): - React-Core - React-RCTImage - RNSVG (12.5.1): @@ -715,15 +715,15 @@ SPEC CHECKSUMS: React-jsinspector: cab4d37ebde480f84c79ac89568abbf76b916c3e React-logger: b75b80500ea80457b2cf169427d66de986cdcb29 react-native-cameraroll: 755bcc628148a90a7c9cf3f817a252be3a601bc5 - react-native-compressor: 83d346f200b8618e890eb17a9cd486b1cd10dedc + react-native-compressor: c8a35e0e7b80b041804a7bed0cc97d647e487294 react-native-cookies: f54fcded06bb0cda05c11d86788020b43528a26c react-native-image-picker: 60f4246eb5bb7187fc15638a8c1f13abd3820695 react-native-menu: 9728f90160c36b9a75481fc76e05354b99d54c59 - react-native-pager-view: c29d484f19c49ff19525a94105e4ab2c4d4ae273 + react-native-pager-view: 73a454fe1b01c275a6a11a99cccd659f6899bfdd react-native-restart: 45c8dca02491980f2958595333cbccd6877cb57e - react-native-safe-area-context: b97eb6f9e3b7f437806c2ce5983f479f8eb5de4b - react-native-simple-toast: 6148335d096ab63dc852535ec64c82527315d575 - react-native-webview: bef49fb935d75e1ca83aed3ac74eecf5b78764ac + react-native-safe-area-context: 422017db8bcabbada9ad607d010996c56713234c + react-native-simple-toast: 1f1cc551d419bc0ab05dcb0136554006c274789d + react-native-webview: 625925488f70034d18162509da93c320a8a56325 React-perflogger: 44436b315d757100a53dfb1ab6b77c58cb646d7d React-RCTActionSheet: 1888a229684762c40cc96c7ff4716f809655dc09 React-RCTAnimation: f05da175751867521d14b02ab4d3994a7b96f131 @@ -738,19 +738,19 @@ SPEC CHECKSUMS: ReactCommon: 29bb6fad3242e30e9d049bc9d592736fa3da9e50 ReactNativeUiLib: 8d3804947431a465a69f09c5e785c988314612a9 rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNCAsyncStorage: 618d03a5f52fbccb3d7010076bc54712844c18ef - RNCClipboard: 60fed4b71560d7bfe40e9d35dea9762b024da86d + RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c + RNCClipboard: 0a720adef5ec193aa0e3de24c3977222c7e52a37 RNDateTimePicker: 65e1d202799460b286ff5e741d8baf54695e8abd RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8 RNFBAnalytics: ec290267aac57446c10b491293373ac86357f575 RNFBApp: 9b25191f7a5e72c185b7e43fffb0d906869c4659 RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 - RNGestureHandler: e98441928705d9d1184b599d7c1c6df2dd4f7724 + RNGestureHandler: 30704285c8ef803f7705f92dd9428261ed756e24 RNInAppBrowser: e36d6935517101ccba0e875bac8ad7b0cb655364 RNPermissions: b8968413f8aba5d451e59f269277583d36eb2b6d RNReactNativeHapticFeedback: ec56a5f81c3941206fd85625fa669ffc7b4545f9 RNReanimated: 1f117be601c59177816351a965bc57320b766c15 - RNScreens: fa9b582d85ae5d62c91c66003b5278458fed7aaa + RNScreens: afdbd43bcd6c81559917054da18ad101b4395000 RNSVG: d7d7bc8229af3842c9cfc3a723c815a52cdd1105 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d diff --git a/ios/UMALL.xcodeproj/project.pbxproj b/ios/UMALL.xcodeproj/project.pbxproj index 41ffdb7a..26b7309f 100644 --- a/ios/UMALL.xcodeproj/project.pbxproj +++ b/ios/UMALL.xcodeproj/project.pbxproj @@ -623,18 +623,18 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = UMALL/UMALL.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - CURRENT_PROJECT_VERSION = 2.8.6; + CURRENT_PROJECT_VERSION = 3.0.0; DEVELOPMENT_TEAM = UVSHNJYJWU; ENABLE_BITCODE = NO; INFOPLIST_FILE = UMALL/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = 2.8.6; + INFOPLIST_KEY_CFBundleDisplayName = 3.0.0; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.8.6; + MARKETING_VERSION = 3.0.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -661,17 +661,17 @@ CODE_SIGN_ENTITLEMENTS = UMALL/UMALL.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; - CURRENT_PROJECT_VERSION = 2.8.6; + CURRENT_PROJECT_VERSION = 3.0.0; DEVELOPMENT_TEAM = UVSHNJYJWU; INFOPLIST_FILE = UMALL/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = 2.8.6; + INFOPLIST_KEY_CFBundleDisplayName = 3.0.0; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.8.6; + MARKETING_VERSION = 3.0.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/package-lock.json b/package-lock.json index 46c7a5e6..9ac4ee2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,42 +8,42 @@ "name": "umall", "version": "2.8.6", "dependencies": { - "@babel/plugin-proposal-decorators": "^7.24.0", - "@react-native-async-storage/async-storage": "^1.21.0", + "@babel/plugin-proposal-decorators": "^7.24.7", + "@react-native-async-storage/async-storage": "^1.23.1", "@react-native-camera-roll/camera-roll": "5.6.0", - "@react-native-clipboard/clipboard": "^1.13.2", + "@react-native-clipboard/clipboard": "^1.14.1", "@react-native-community/datetimepicker": "^6.7.5", "@react-native-cookies/cookies": "^6.2.1", "@react-native-firebase/analytics": "^18.9.0", "@react-native-firebase/app": "^18.9.0", "@react-native-menu/menu": "^0.9.1", "@react-native/gradle-plugin": "^0.73.4", - "@react-navigation/material-top-tabs": "^6.6.11", - "@react-navigation/native": "^6.1.15", - "@react-navigation/native-stack": "^6.9.24", - "@react-navigation/stack": "^6.3.27", + "@react-navigation/material-top-tabs": "^6.6.13", + "@react-navigation/native": "^6.1.17", + "@react-navigation/native-stack": "^6.10.0", + "@react-navigation/stack": "^6.4.0", "@rneui/base": "^4.0.0-rc.5", "@rneui/themed": "^4.0.0-rc.5", - "axios": "^1.6.7", + "axios": "^1.7.2", "fbjs": "^3.0.5", - "i18next": "^23.10.1", - "mobx": "^6.12.0", - "mobx-react": "^9.1.0", + "i18next": "^23.11.5", + "mobx": "^6.13.0", + "mobx-react": "^9.1.1", "moment": "^2.30.1", "moment-timezone": "^0.5.45", - "qs": "^6.12.0", + "qs": "^6.12.2", "react": "17.0.2", "react-content-loader": "^6.2.1", - "react-i18next": "^14.1.0", + "react-i18next": "^14.1.2", "react-native": "0.68.7", "react-native-actionsheet": "^2.4.2", "react-native-animated-nav-tab-bar": "^3.1.10", "react-native-animated-splash-screen": "^2.0.5", - "react-native-compressor": "^1.8.23", + "react-native-compressor": "^1.8.25", "react-native-easy-toast": "^2.3.0", "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", - "react-native-gesture-handler": "^2.14.1", + "react-native-gesture-handler": "^2.17.1", "react-native-haptic-feedback": "^2.2.0", "react-native-html-parser": "^0.1.0", "react-native-htmlview": "^0.17.0", @@ -59,30 +59,30 @@ "react-native-modal": "^13.0.1", "react-native-modal-datetime-picker": "^13.1.2", "react-native-modal-dropdown": "^1.0.2", - "react-native-pager-view": "^6.2.3", + "react-native-pager-view": "^6.3.3", "react-native-permissions": "^4.1.5", "react-native-progress": "^5.0.1", "react-native-reanimated": "^2.17.0", "react-native-reanimated-carousel": "^3.5.1", "react-native-restart": "^0.0.24", - "react-native-safe-area-context": "^4.9.0", - "react-native-screens": "^3.29.0", - "react-native-simple-toast": "^3.3.0", + "react-native-safe-area-context": "^4.10.7", + "react-native-screens": "^3.32.0", + "react-native-simple-toast": "^3.3.1", "react-native-size-matters": "^0.4.2", - "react-native-super-grid": "^5.0.0", + "react-native-super-grid": "^5.1.0", "react-native-svg": "^12.5.1", "react-native-tab-view": "^3.5.2", "react-native-toast-message": "^2.2.0", "react-native-touchable-scale": "^2.2.0", "react-native-ui-lib": "^6.31.0", - "react-native-vector-icons": "^10.0.3", - "react-native-webview": "^13.8.1", + "react-native-vector-icons": "^10.1.0", + "react-native-webview": "^13.10.4", "rn-fetch-blob": "^0.12.0", "styled-components": "^5.3.11" }, "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/runtime": "^7.24.0", + "@babel/core": "^7.24.7", + "@babel/runtime": "^7.24.7", "@react-native-community/eslint-config": "^3.2.0", "babel-jest": "^29.7.0", "eslint": "^8.57.0", @@ -114,40 +114,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -181,13 +184,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -195,25 +199,26 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -231,12 +236,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -246,18 +252,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", - "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -320,68 +327,79 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -391,20 +409,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -426,13 +446,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -442,58 +463,66 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -512,35 +541,38 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -584,13 +616,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.0.tgz", - "integrity": "sha512-LiT1RqZWeij7X+wGxCoYh3/3b8nVOX6/7BZ9wiQgAIyjoeQWdROaodJCgT+dwtbjHaz0r7bEbHJzjSbVfcOyjQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", + "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-decorators": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -739,11 +772,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.0.tgz", - "integrity": "sha512-MXW3pQCu9gUiVGzqkGqsgiINDVYXoAnrY8FYF/rmb+OfufNF0zHMpHPN4ulRrinxYT8Vk/aZJxYqOKsDECjKAw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", + "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1517,9 +1551,10 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1528,31 +1563,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1561,12 +1598,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2623,9 +2661,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -2638,9 +2676,10 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2691,9 +2730,10 @@ } }, "node_modules/@react-native-async-storage/async-storage": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.21.0.tgz", - "integrity": "sha512-JL0w36KuFHFCvnbOXRekqVAUplmOyT/OuCQkogo6X98MtpSaJOKEAeZnYO8JB0U/RIEixZaGI5px73YbRm/oag==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz", + "integrity": "sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==", + "license": "MIT", "dependencies": { "merge-options": "^3.0.4" }, @@ -2710,12 +2750,18 @@ } }, "node_modules/@react-native-clipboard/clipboard": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.13.2.tgz", - "integrity": "sha512-uVM55oEGc6a6ZmSATDeTcMm55A/C1km5X47g0xaoF0Zagv7N/8RGvLceA5L/izPwflIy78t7XQeJUcnGSib0nA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.14.1.tgz", + "integrity": "sha512-SM3el0A28SwoeJljVNhF217o0nI4E7RfalLmuRQcT1/7tGcxUjgFa3jyrEndYUct8/uxxK5EUNGUu1YEDqzxqw==", + "license": "MIT", + "workspaces": [ + "example" + ], "peerDependencies": { - "react": ">=16.0", - "react-native": ">=0.57.0" + "react": "16.9.0 || 16.11.0 || 16.13.1 || 17.0.1 || 17.0.2 || 18.0.0 || 18.1.0 || 18.2.0", + "react-native": "^0.61.5 || ^0.62.3 || ^0.63.2 || ^0.64.2 || ^0.65.0 || ^0.66.0 || ^0.67.0 || ^0.68.0 || ^0.69.0 || ^0.70.0 || ^0.71.0 || ^0.72.0 || ^0.73.0", + "react-native-macos": "^0.61.0 || ^0.62.0 || ^0.63.0 || ^0.64.0 || ^0.65.0 || ^0.66.0 || ^0.67.0 || ^0.68.0 || ^0.69.0 || ^0.70.0 || ^0.71.0 || ^0.72.0 || ^0.73.0", + "react-native-windows": "^0.61.0 || ^0.62.0 || ^0.63.0 || ^0.64.0 || ^0.65.0 || ^0.66.0 || ^0.67.0 || ^0.68.0 || ^0.69.0 || ^0.70.0 || ^0.71.0 || ^0.72.0 || ^0.73.0" } }, "node_modules/@react-native-community/cli": { @@ -4211,25 +4257,27 @@ "license": "MIT" }, "node_modules/@react-navigation/core": { - "version": "6.4.14", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.14.tgz", - "integrity": "sha512-9DemQVmztRspTH4CRexLNfbJSOhiv6DHumH8enqiXUTgUEYfQUu2qCsEuc/ui08kuYLtoRTdH9P1ovE2xTScbg==", + "version": "6.4.16", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.16.tgz", + "integrity": "sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ==", + "license": "MIT", "dependencies": { "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", "nanoid": "^3.1.23", "query-string": "^7.1.3", "react-is": "^16.13.0", - "use-latest-callback": "^0.1.7" + "use-latest-callback": "^0.1.9" }, "peerDependencies": { "react": "*" } }, "node_modules/@react-navigation/elements": { - "version": "1.3.28", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.28.tgz", - "integrity": "sha512-pLKI8RsCuBAXaeTVjJo/ZeOFdZLiJXsnT5DoSpRUCq+B10b53kAI+F1sHhMShB8ALaNPD6RvB45zL8aCBwpuyA==", + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.30.tgz", + "integrity": "sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ==", + "license": "MIT", "peerDependencies": { "@react-navigation/native": "^6.0.0", "react": "*", @@ -4238,9 +4286,10 @@ } }, "node_modules/@react-navigation/material-top-tabs": { - "version": "6.6.11", - "resolved": "https://registry.npmjs.org/@react-navigation/material-top-tabs/-/material-top-tabs-6.6.11.tgz", - "integrity": "sha512-hGOf0g/WHwFfr23tDH/AzTtY6jme0X8Nsgb/LykTRE9PyCPRA2tyyci11GMMTeZtIZaAH/LbzC5KxjenSobKQg==", + "version": "6.6.13", + "resolved": "https://registry.npmjs.org/@react-navigation/material-top-tabs/-/material-top-tabs-6.6.13.tgz", + "integrity": "sha512-utwS0SLl/dq6+PHWGOz4rNNkYzveqvbffXJ6TIrUdaWDDysjBa4btHUOVvXfNADIK4LafmbuRi0xA/zd6HoCPQ==", + "license": "MIT", "dependencies": { "color": "^4.2.3", "warn-once": "^0.1.0" @@ -4254,11 +4303,12 @@ } }, "node_modules/@react-navigation/native": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.15.tgz", - "integrity": "sha512-NOZH+uCZk3l+Uiy5/RKMyl+JI+OVBrrQ2SAK2Br8o2MsElPqe96TtvzeKzOAoiHfoHnwCyjdD7D66ODNYPSwDw==", + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.17.tgz", + "integrity": "sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ==", + "license": "MIT", "dependencies": { - "@react-navigation/core": "^6.4.14", + "@react-navigation/core": "^6.4.16", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.1.23" @@ -4269,11 +4319,12 @@ } }, "node_modules/@react-navigation/native-stack": { - "version": "6.9.24", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.24.tgz", - "integrity": "sha512-+UpruwDcaELmd8cGk8XUDVKFrTMN0x+FbtwNQ7if/hJKbaMg6c43rPtjtiMFX/ycYW7J3owwJ8rcCmU4M7S4Aw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.10.0.tgz", + "integrity": "sha512-AmuixgGJylFMhWs2FwxlfqGdRAuaUc3CTWbUBC0Pf54YFz617YuWJZ82/u948ja/NMhn+hXTO0s/orCpBwnMqw==", + "license": "MIT", "dependencies": { - "@react-navigation/elements": "^1.3.28", + "@react-navigation/elements": "^1.3.30", "warn-once": "^0.1.0" }, "peerDependencies": { @@ -4288,16 +4339,18 @@ "version": "6.1.9", "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==", + "license": "MIT", "dependencies": { "nanoid": "^3.1.23" } }, "node_modules/@react-navigation/stack": { - "version": "6.3.27", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.3.27.tgz", - "integrity": "sha512-lRjY7REngYIiRLe588baH2vRYnma3NFHaqPdJZbdPSw6X5vUgqejur4IQK4lb+7G7LRnde4uM/3+q0cD5k4x3g==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.4.0.tgz", + "integrity": "sha512-Jx7fm8x7zSUC6ggUb0VnvPuaIXkVPHckiY+e50mjrIRK4xAgnaLp6crHWYGmXjfi7ahaKL00o76ZgpgkwKw6zg==", + "license": "MIT", "dependencies": { - "@react-navigation/elements": "^1.3.28", + "@react-navigation/elements": "^1.3.30", "color": "^4.2.3", "warn-once": "^0.1.0" }, @@ -5207,11 +5260,12 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -8051,6 +8105,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8242,15 +8297,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8814,9 +8870,9 @@ } }, "node_modules/i18next": { - "version": "23.10.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", - "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "version": "23.11.5", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz", + "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==", "funding": [ { "type": "individual", @@ -8831,6 +8887,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -13192,20 +13249,22 @@ } }, "node_modules/mobx": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.12.0.tgz", - "integrity": "sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.0.tgz", + "integrity": "sha512-1laWODrBWmB7mDJ8EClCjUQTyLwJ0ydJgE4FtK7t9r3JnjXgc9OhmYs2P4RtHrY1co5+4T6cKP2UswX2SU29mA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" } }, "node_modules/mobx-react": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.0.tgz", - "integrity": "sha512-DeDRTYw4AlgHw8xEXtiZdKKEnp+c5/jeUgTbTQXEqnAzfkrgYRWP3p3Nv3Whc2CEcM/mDycbDWGjxKokQdlffg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz", + "integrity": "sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==", + "license": "MIT", "dependencies": { - "mobx-react-lite": "^4.0.4" + "mobx-react-lite": "^4.0.7" }, "funding": { "type": "opencollective", @@ -13225,9 +13284,10 @@ } }, "node_modules/mobx-react-lite": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.5.tgz", - "integrity": "sha512-StfB2wxE8imKj1f6T8WWPf4lVMx3cYH9Iy60bbKXEs21+HQ4tvvfIBZfSmMXgQAefi8xYEwQIz4GN9s0d2h7dg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz", + "integrity": "sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==", + "license": "MIT", "dependencies": { "use-sync-external-store": "^1.2.0" }, @@ -13283,6 +13343,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14157,9 +14218,10 @@ ] }, "node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -14174,6 +14236,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -14289,9 +14352,10 @@ } }, "node_modules/react-i18next": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz", - "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.2.tgz", + "integrity": "sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "html-parse-stringify": "^3.0.1" @@ -14413,9 +14477,10 @@ } }, "node_modules/react-native-compressor": { - "version": "1.8.23", - "resolved": "https://registry.npmjs.org/react-native-compressor/-/react-native-compressor-1.8.23.tgz", - "integrity": "sha512-llqV+BRgRL8xdUDFpYfaP/HSo9sUcqewlzXa6obgoXCTJT8ZmT0zUFYgGTtb0Urz2o2T15PqTij5f2Sg8phPjw==", + "version": "1.8.25", + "resolved": "https://registry.npmjs.org/react-native-compressor/-/react-native-compressor-1.8.25.tgz", + "integrity": "sha512-ldQvBEFJpGa9FlBF6ijBoOGg5e/vRYJOZ97ElEERwC9tO9qmt87Nj80LAuASaY0JDFfYDJi8mFSWM/uUaXaMsA==", + "license": "MIT", "engines": { "node": ">= 16.0.0" }, @@ -14465,14 +14530,14 @@ } }, "node_modules/react-native-gesture-handler": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.14.1.tgz", - "integrity": "sha512-YiM1BApV4aKeuwsM6O4C2ufwewYEKk6VMXOt0YqEZFMwABBFWhXLySFZYjBSNRU2USGppJbfHP1q1DfFQpKhdA==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.17.1.tgz", + "integrity": "sha512-pWfniN6NuVKUq40KACuD3NCMe+bWNQCpD3cmxL6aLSCTwPKYmf7l4Lp0/E/almpjvxhybJZtFLU0w4tmxnIKaA==", + "license": "MIT", "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4", - "lodash": "^4.17.21", "prop-types": "^15.7.2" }, "peerDependencies": { @@ -14673,9 +14738,10 @@ } }, "node_modules/react-native-pager-view": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.2.3.tgz", - "integrity": "sha512-dqVpXWFtPNfD3D2QQQr8BP+ullS5MhjRJuF8Z/qml4QTILcrWaW8F5iAxKkQR3Jl0ikcEryG/+SQlNcwlo0Ggg==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.3.3.tgz", + "integrity": "sha512-HViKBlfN/kBJUSu5mRL/V9Bkf1j7uDZozGAjbzh4o9XYo11qVcIK7IwvfzqrkNerVSDy/cAmZcXbcyWnII8xMA==", + "license": "MIT", "peerDependencies": { "react": "*", "react-native": "*" @@ -14776,18 +14842,20 @@ } }, "node_modules/react-native-safe-area-context": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.9.0.tgz", - "integrity": "sha512-/OJD9Pb8IURyvn+1tWTszWPJqsbZ4hyHBU9P0xhOmk7h5owSuqL0zkfagU0pg7Vh0G2NKQkaPpUKUMMCUMDh/w==", + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.10.7.tgz", + "integrity": "sha512-Lq+gtuIF28mMtBacFchGpO1KHMTvzeb3ji1HAVnMTPe3qWR46Tb4AlztZTvTwUnpZ8JVaC9sKXnJHKmuaIQwXA==", + "license": "MIT", "peerDependencies": { "react": "*", "react-native": "*" } }, "node_modules/react-native-screens": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.29.0.tgz", - "integrity": "sha512-yB1GoAMamFAcYf4ku94uBPn0/ani9QG7NdI98beJ5cet2YFESYYzuEIuU+kt+CNRcO8qqKeugxlfgAa3HyTqlg==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.32.0.tgz", + "integrity": "sha512-wybqZAHX7v8ipOXhh90CqGLkBHw5JYqKNRBX7R/b0c2WQisTOgu0M0yGwBMM6LyXRBT+4k3NTGHdDbpJVpq0yQ==", + "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" @@ -14798,9 +14866,10 @@ } }, "node_modules/react-native-simple-toast": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-native-simple-toast/-/react-native-simple-toast-3.3.0.tgz", - "integrity": "sha512-qFx2hI99yfY5YReLg3lCUQdIcWxjYjxBwSW766c+nVRlXQQg01POg59XQ8aM5aSNwa/S8u8HH3qInXlWXBIt5g==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-native-simple-toast/-/react-native-simple-toast-3.3.1.tgz", + "integrity": "sha512-5SbAvZpzjSHNkMGbO1cr/7kg/oHZEVZbgeqC+6FtYTtvBbkRMbEaUIfiD1rvghbxZrJB783Y/mHRDUab2ogTqA==", + "license": "MIT", "engines": { "node": ">= 16.0.0" }, @@ -14818,14 +14887,15 @@ } }, "node_modules/react-native-super-grid": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-native-super-grid/-/react-native-super-grid-5.0.0.tgz", - "integrity": "sha512-iivBlleD7ufDtKSd74w1w86bvIzUXHaLjKwRuqMOUQwXxm5hoIGT8YtJiWtS5/bkH38xLw/T0eEn0NHFgzmYiA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-native-super-grid/-/react-native-super-grid-5.1.0.tgz", + "integrity": "sha512-pKzkjdc9pgrAIEJDr5k4HH5i9RSmUZ3mw21QEcZr2ECulg2HYrUV5FAdi8NMOmBeenXY4NNP3zVLckHBd2rBqA==", + "license": "MIT", "dependencies": { - "prop-types": "^15.6.0" + "prop-types": "^15.6.2" }, "peerDependencies": { - "react": ">=16.8.0", + "react": ">=16.8.6", "react-native": ">=0.59.0" } }, @@ -14935,9 +15005,10 @@ } }, "node_modules/react-native-vector-icons": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.0.3.tgz", - "integrity": "sha512-ZgVlV5AdQgnPHHvBEihGf2xwyziT1acpXV1U+WfCgCv3lcEeCRsmwAsBU+kUSNsU+8TcWVsX04kdI6qUaS8D7w==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.1.0.tgz", + "integrity": "sha512-fdQjCHIdoXmRoTZ5gvN1FmT4sGLQ2wmQiNZHKJQUYnE2tkIwjGnxNch+6Nd4lHAACvMWO7LOzBNot2u/zlOmkw==", + "license": "MIT", "dependencies": { "prop-types": "^15.7.2", "yargs": "^16.1.1" @@ -14988,9 +15059,10 @@ } }, "node_modules/react-native-webview": { - "version": "13.8.1", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.8.1.tgz", - "integrity": "sha512-7Jqm1WzWJrOWraBAXQfKtr/Uo5Jw/IJHzC40jYLwgV/eVGmLJ9BpGKw6QVw7wpRkjmTZ2Typ4B1aHJLJJQFslA==", + "version": "13.10.4", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.10.4.tgz", + "integrity": "sha512-kRn70M7vyBS3IDaX2KqyF66ovUkrBS6LiHOgrEmRdZFO0i3hYY0wldEv1fJuKvgQIPMfo7GtGAjozFrk2vQdBw==", + "license": "MIT", "dependencies": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" @@ -16078,6 +16150,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16263,6 +16336,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -17069,9 +17143,10 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } diff --git a/package.json b/package.json index af46e46d..9e3adb2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umall", - "version": "2.8.6", + "version": "3.0.0", "private": true, "scripts": { "android": "react-native run-android", @@ -11,42 +11,42 @@ "lint": "eslint ." }, "dependencies": { - "@babel/plugin-proposal-decorators": "^7.24.0", - "@react-native-async-storage/async-storage": "^1.21.0", + "@babel/plugin-proposal-decorators": "^7.24.7", + "@react-native-async-storage/async-storage": "^1.23.1", "@react-native-camera-roll/camera-roll": "5.6.0", - "@react-native-clipboard/clipboard": "^1.13.2", + "@react-native-clipboard/clipboard": "^1.14.1", "@react-native-community/datetimepicker": "^6.7.5", "@react-native-cookies/cookies": "^6.2.1", "@react-native-firebase/analytics": "^18.9.0", "@react-native-firebase/app": "^18.9.0", "@react-native-menu/menu": "^0.9.1", "@react-native/gradle-plugin": "^0.73.4", - "@react-navigation/material-top-tabs": "^6.6.11", - "@react-navigation/native": "^6.1.15", - "@react-navigation/native-stack": "^6.9.24", - "@react-navigation/stack": "^6.3.27", + "@react-navigation/material-top-tabs": "^6.6.13", + "@react-navigation/native": "^6.1.17", + "@react-navigation/native-stack": "^6.10.0", + "@react-navigation/stack": "^6.4.0", "@rneui/base": "^4.0.0-rc.5", "@rneui/themed": "^4.0.0-rc.5", - "axios": "^1.6.7", + "axios": "^1.7.2", "fbjs": "^3.0.5", - "i18next": "^23.10.1", - "mobx": "^6.12.0", - "mobx-react": "^9.1.0", + "i18next": "^23.11.5", + "mobx": "^6.13.0", + "mobx-react": "^9.1.1", "moment": "^2.30.1", "moment-timezone": "^0.5.45", - "qs": "^6.12.0", + "qs": "^6.12.2", "react": "17.0.2", "react-content-loader": "^6.2.1", - "react-i18next": "^14.1.0", + "react-i18next": "^14.1.2", "react-native": "0.68.7", "react-native-actionsheet": "^2.4.2", "react-native-animated-nav-tab-bar": "^3.1.10", "react-native-animated-splash-screen": "^2.0.5", - "react-native-compressor": "^1.8.23", + "react-native-compressor": "^1.8.25", "react-native-easy-toast": "^2.3.0", "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", - "react-native-gesture-handler": "^2.14.1", + "react-native-gesture-handler": "^2.17.1", "react-native-haptic-feedback": "^2.2.0", "react-native-html-parser": "^0.1.0", "react-native-htmlview": "^0.17.0", @@ -62,30 +62,30 @@ "react-native-modal": "^13.0.1", "react-native-modal-datetime-picker": "^13.1.2", "react-native-modal-dropdown": "^1.0.2", - "react-native-pager-view": "^6.2.3", + "react-native-pager-view": "^6.3.3", "react-native-permissions": "^4.1.5", "react-native-progress": "^5.0.1", "react-native-reanimated": "^2.17.0", "react-native-reanimated-carousel": "^3.5.1", "react-native-restart": "^0.0.24", - "react-native-safe-area-context": "^4.9.0", - "react-native-screens": "^3.29.0", - "react-native-simple-toast": "^3.3.0", + "react-native-safe-area-context": "^4.10.7", + "react-native-screens": "^3.32.0", + "react-native-simple-toast": "^3.3.1", "react-native-size-matters": "^0.4.2", - "react-native-super-grid": "^5.0.0", + "react-native-super-grid": "^5.1.0", "react-native-svg": "^12.5.1", "react-native-tab-view": "^3.5.2", "react-native-toast-message": "^2.2.0", "react-native-touchable-scale": "^2.2.0", "react-native-ui-lib": "^6.31.0", - "react-native-vector-icons": "^10.0.3", - "react-native-webview": "^13.8.1", + "react-native-vector-icons": "^10.1.0", + "react-native-webview": "^13.10.4", "rn-fetch-blob": "^0.12.0", "styled-components": "^5.3.11" }, "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/runtime": "^7.24.0", + "@babel/core": "^7.24.7", + "@babel/runtime": "^7.24.7", "@react-native-community/eslint-config": "^3.2.0", "babel-jest": "^29.7.0", "eslint": "^8.57.0", diff --git a/src/pages/ClubSystem/login/ClubLogin.js b/src/pages/ClubSystem/login/ClubLogin.js index f699c711..576ecdbd 100644 --- a/src/pages/ClubSystem/login/ClubLogin.js +++ b/src/pages/ClubSystem/login/ClubLogin.js @@ -11,14 +11,16 @@ import { import { COLOR_DIY, uiStyle, } from '../../../utils/uiMap'; import Header from '../../../components/Header'; import { handleLogin } from '../../../utils/storageKits'; -import { BASE_URI, GET } from '../../../utils/pathMap'; +import { BASE_URI, GET, USER_AGREE, USUAL_Q, } from '../../../utils/pathMap'; import { trigger } from '../../../utils/trigger'; +import { openLink } from '../../../utils/browser'; import { Input } from '@rneui/themed'; import axios from 'axios'; import qs from 'qs'; -import { scale } from 'react-native-size-matters'; +import { scale, verticalScale } from 'react-native-size-matters'; import Toast from "react-native-toast-message"; +import { CheckBox } from '@rneui/themed'; const { white, black, themeColor, } = COLOR_DIY; @@ -29,6 +31,10 @@ let accountPassword = { }; class ClubLogin extends Component { + state = { + ruleChoice: false, + }; + handleLoginPress = () => { trigger(); // 賬戶輸入未完成 @@ -40,7 +46,16 @@ class ClubLogin extends Component { onPress: () => Toast.hide(), }); } else { - this.clubSignIn(); + if (!this.state.ruleChoice) { + Toast.show({ + type: 'warning', + text1: '請先閱讀和同意相關協議!', + topOffset: scale(100), + onPress: () => Toast.hide(), + }); + } else { + this.clubSignIn(); + } } }; @@ -111,13 +126,88 @@ class ClubLogin extends Component { style={{ color: themeColor, }} /> + {/* 登錄提示 */} + + + {/* 選中圖標 */} + { + trigger(); + this.setState({ + ruleChoice: !this.state.ruleChoice, + }); + }} + /> + { + trigger(); + this.setState({ + ruleChoice: !this.state.ruleChoice, + }); + }}> + + 我已閱讀且同意遵守 + + + {/* 查看用戶協議 */} + + { + openLink(USER_AGREE); + }}> + 《隱私政策與用戶協議》 + + + + + + {/* 註冊、進駐提示 */} + openLink(USUAL_Q)} + style={{ + alignSelf: 'center', + backgroundColor: COLOR_DIY.themeColorLight, + padding: scale(5), + borderRadius: scale(5), + marginTop: verticalScale(10), + }}> + + 註冊/進駐ARK ALL + + + {/* 登錄按鈕 */} { - let filterCourseList = []; - - filterCourseList = coursePlanList.filter(itm => { - return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title Chi'].indexOf(inputText) != -1 - || itm['Teacher Information'].indexOf(inputText) != -1 - || (itm['Offering Department'] && itm['Offering Department'].indexOf(inputText) != -1) - }); - - return filterCourseList -} - // TODO: 查看某時間段可選的CourseCode、Section export default class courseSim extends Component { constructor() { @@ -127,11 +110,16 @@ export default class courseSim extends Component { // timeFilterTo: '22:00', // showTimePickerFrom: false, // showTimePickerTo: false, + + s_coursePlanFile: coursePlanFile, + s_coursePlanTimeFile: coursePlanTimeFile, } async componentDidMount() { logToFirebase('openPage', { page: 'courseSim' }); + await this.readLocalCourseData(); + const strCourseCodeList = await AsyncStorage.getItem('ARK_Timetable_Storage'); const courseCodeList = strCourseCodeList ? JSON.parse(strCourseCodeList) : null; @@ -139,16 +127,54 @@ export default class courseSim extends Component { this.handleCourseList(courseCodeList); } + if (this.props.route.params) { + this.readParams(); + } + this.keyboardDidHideListener = Keyboard.addListener( 'keyboardDidHide', this._keyboardDidHide, ); + + // 頁面聚焦時觸發 + this.focusListener = this.props.navigation.addListener('focus', () => { + this.handleFocus(); + }); } componentWillUnmount() { this.keyboardDidHideListener.remove(); } + // 頁面聚焦時觸發 + handleFocus = () => { + // this.readLocalCourseData(); + if (this.props.route.params) { + this.readParams(); + } + } + + // 讀取本地緩存的課表數據 + readLocalCourseData = async () => { + const storageCoursePlan = await getLocalStorage('course_plan'); + if (storageCoursePlan) { + this.setState({ s_coursePlanFile: storageCoursePlan }); + } + + const storageCoursePlanList = await getLocalStorage('course_plan_time'); + if (storageCoursePlanList) { + this.setState({ s_coursePlanTimeFile: storageCoursePlanList }); + } + } + + // 讀取另一頁面的傳參,新增課程 + readParams = () => { + if ('add' in this.props.route.params) { + const { add } = this.props.route.params; + this.addCourse(add); + } + } + // 鍵盤收起,使輸入框失焦 _keyboardDidHide = async () => { // 使输入框失去焦点 @@ -161,6 +187,8 @@ export default class courseSim extends Component { // 處理課表數據,分析出用於render的數據 handleCourseList = (courseCodeList) => { + const { s_coursePlanTimeFile } = this.state; + const courseTimeList = s_coursePlanTimeFile.Courses; let courseScheduleByCode = {}; courseCodeList.map(i => { let tempArr = []; @@ -757,9 +785,12 @@ E11-0000 } renderCourseSearch = () => { - const filterCourseList = handleSearchFilterCourse(this.state.searchText); + const filterCourseList = this.handleSearchFilterCourse(this.state.searchText); // 是否有搜索結果 const haveSearchResult = this.state.searchText && filterCourseList.length > 0; + + const { s_coursePlanTimeFile } = this.state; + const courseTimeList = s_coursePlanTimeFile.Courses; return ( { + const { s_coursePlanFile } = this.state; + const coursePlanList = s_coursePlanFile.Courses; + + let filterCourseList = []; + + filterCourseList = coursePlanList.filter(itm => { + return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title Chi'].indexOf(inputText) != -1 + || itm['Teacher Information'].indexOf(inputText) != -1 + || (itm['Offering Department'] && itm['Offering Department'].indexOf(inputText) != -1) + }); + + return filterCourseList + } + render() { const { allCourseAllTime, } = this.state; return ( diff --git a/src/pages/TabbarPages/features/index.js b/src/pages/TabbarPages/features/index.js index 6a79e39f..3e1152a7 100644 --- a/src/pages/TabbarPages/features/index.js +++ b/src/pages/TabbarPages/features/index.js @@ -41,6 +41,7 @@ import { UM_IMPORTANT_DATE, UM_BULLETIN, UM_RC_MENU, + UM_LOST_FOUND, } from '../../../utils/pathMap'; import DialogDIY from '../../../components/DialogDIY'; import { logToFirebase } from "../../../utils/firebaseAnalytics"; @@ -67,7 +68,7 @@ const iconTypes = { img: 'img', }; -const { themeColor } = COLOR_DIY; +const { themeColor, white } = COLOR_DIY; const iconSize = scale(25); @@ -507,7 +508,19 @@ class Index extends Component { icon_name: 'text-box-check', fn_name: t('失物認領', { ns: 'features' }), needLogin: false, - go_where: 'LostAndFound', + go_where: 'Linking', + webview_param: { + // import pathMap的鏈接進行跳轉 + url: UM_LOST_FOUND, + title: '失物認領', + // 標題顏色,默認為black.main + text_color: '#fff', + // 標題背景顏色,默認為bg_color + bg_color_diy: '#005f96', + // 狀態欄字體是否黑色,默認true + isBarStyleBlack: false, + }, + // go_where: 'LostAndFound', // go_where: 'Webview', // webview_param: { // // import pathMap的鏈接進行跳轉 @@ -801,6 +814,27 @@ class Index extends Component { {t('服務一覽', { ns: 'features' })} + + {/* 組織登入按鈕 */} + { + trigger(); + // TODO: 跳轉組織登入 + this.props.navigation.navigate('ClubLogin'); + }} + > + 組織登入 + {this.state.functionArr.map(fn_card => { diff --git a/src/pages/TabbarPages/info/AboutPage.js b/src/pages/TabbarPages/info/AboutPage.js index d08f4782..1f39acdd 100644 --- a/src/pages/TabbarPages/info/AboutPage.js +++ b/src/pages/TabbarPages/info/AboutPage.js @@ -26,6 +26,7 @@ import { GITHUB_ACTIVITY, } from '../../../utils/pathMap'; import { trigger } from '../../../utils/trigger'; +import { getLocalStorage } from '../../../utils/storageKits'; import packageInfo from '../../../../package.json'; import coursePlanFile from "../../../static/UMCourses/coursePlan"; import offerCourseFile from "../../../static/UMCourses/offerCourses"; @@ -42,6 +43,22 @@ const IMG_WIDTH = scale(160); const iconSize = verticalScale(25); export default class AboutPage extends Component { + state = { + s_offerCourses: offerCourseFile, + s_coursePlan: coursePlanFile, + } + + async componentDidMount() { + const storageOfferCourses = await getLocalStorage('offer_courses'); + if (storageOfferCourses) { + this.setState({ s_offerCourses: storageOfferCourses }); + } + + const storageCoursePlan = await getLocalStorage('course_plan'); + if (storageCoursePlan) { + this.setState({ s_coursePlan: storageCoursePlan }); + } + } render() { return ( @@ -82,11 +99,11 @@ export default class AboutPage extends Component { {/* 課表數據版本號 */} {t('Add Drop Data Version', { ns: 'about' })} - {coursePlanFile.updateTime} + {this.state.s_coursePlan.updateTime} {t('PreEnroll Data Version', { ns: 'about' })} - {offerCourseFile.updateTime} + {this.state.s_offerCourses.updateTime} diff --git a/src/pages/TabbarPages/info/UMEventPage.js b/src/pages/TabbarPages/info/UMEventPage.js index 141207c0..f08b2ec4 100644 --- a/src/pages/TabbarPages/info/UMEventPage.js +++ b/src/pages/TabbarPages/info/UMEventPage.js @@ -229,7 +229,7 @@ class UMEventPage extends Component { {/* 懸浮可拖動按鈕 */} {isLoading ? null : this.renderGoTopButton()} { + const { dataPage } = this.state; let URL = BASE_URI + GET.EVENT_INFO_ALL; let num_of_item = 10; let noMoreData = true; @@ -154,8 +151,8 @@ class EventPage extends Component { }; loadMoreData = () => { - const { noMoreData } = this.state; - dataPage++; + const { noMoreData, dataPage } = this.state; + this.setState({ dataPage: dataPage + 1 }); if (!noMoreData) { Toast.show('數據加載中...') this.getData(); @@ -163,12 +160,19 @@ class EventPage extends Component { trigger(); }; - onRefresh = () => { - if (dataPage > 1) { - dataPage = 1; + onRefresh = async () => { + try { + this.setState({ + dataPage: 1, + leftDataList: [], + rightDataList: [], + isLoading: true, + }); + } catch (error) { + alert(JSON.stringify(error)); + } finally { + await this.getData(); } - this.setState({ isLoading: true }); - this.getData(); }; renderLoadMoreView = () => { @@ -250,25 +254,11 @@ class EventPage extends Component { {this.state.isLoading ? ( ) : (leftDataList.length > 0 || rightDataList.length > 0 ? - - } - directionalLockEnabled - alwaysBounceHorizontal={false}> - - {/* 瀑布流渲染主要內容 */} - {this.renderPage()} - - {this.renderLoadMoreView()} - - : null + + {/* 瀑布流渲染主要內容 */} + {this.renderPage()} + {this.renderLoadMoreView()} + : null )} ); diff --git a/src/pages/TabbarPages/info/home/index.js b/src/pages/TabbarPages/info/home/index.js index fbb22089..383c0e9d 100644 --- a/src/pages/TabbarPages/info/home/index.js +++ b/src/pages/TabbarPages/info/home/index.js @@ -49,6 +49,7 @@ import TouchableScale from "react-native-touchable-scale"; import { t } from "i18next"; const { white, bg_color, black, themeColor, themeColorLight, themeColorUltraLight, viewShadow } = COLOR_DIY; +const iconSize = verticalScale(25); const getItem = (data, index) => { // data為VirtualizedList設置的data,index為當前渲染到的下標 @@ -139,6 +140,8 @@ const toastKaomojiArr = [ const calItemWidth = scale(44.5); +let isLoadMore = false; + class HomeScreen extends Component { toastTimer = null; calScrollRef = React.createRef(null); @@ -204,7 +207,11 @@ class HomeScreen extends Component { function_name: t('組織登入', { ns: 'home' }), func: () => { trigger(); - this.props.navigation.navigate('LoginIndex'); + if (this.state.showUpdateInfo) { + Alert.alert(`重要提示!`, `請使用最新版APP進行登錄!\n快更新APP吧!`); + } else { + this.props.navigation.navigate('ClubLogin'); + } }, }, ], @@ -615,6 +622,24 @@ class HomeScreen extends Component { ); }; + handleScroll = (event) => { + const { layoutMeasurement, contentOffset, contentSize } = event.nativeEvent; + const isCloseToBottom = layoutMeasurement.height + contentOffset.y >= contentSize.height - verticalScale(100); + + // 接近底部時,獲取更多數據 + if (isCloseToBottom && !isLoadMore) { + const thisFunc = this.eventPage.current; + if (!thisFunc.state.noMoreData) { + isLoadMore = true; + thisFunc.loadMoreData(); + // 延時鎖,避免到底觸發過多次 + setTimeout(() => { + isLoadMore = false; + }, 1000); + } + } + }; + render() { const { selectDay, isLoading } = this.state; return ( @@ -646,12 +671,35 @@ class HomeScreen extends Component { } alwaysBounceHorizontal={false} ref={this.scrollView} - showsVerticalScrollIndicator={false} + showsVerticalScrollIndicator={true} + onScroll={this.handleScroll} + scrollEventThrottle={400} > + + {/* ARK Logo */} + + ARK ALL 澳大方舟 + {/* 校曆列表 */} {cal && cal.length > 0 ? ( - + this.GetFunctionIcon(item)} - showsVerticalScrollIndicator={false} - scrollEnabled={false} - /> + {false && + this.GetFunctionIcon(item)} + showsVerticalScrollIndicator={false} + scrollEnabled={false} + /> + } {/* 更新提示 */} { @@ -852,9 +902,11 @@ class HomeScreen extends Component { {/* 活動頁 */} {this.state.networkError ? ( 網絡錯誤,請手動刷新! - ) : (<> - 各組織可自行操作發佈活動! 立即進駐ARK! - )} + ) : null + // (<> + // 各組織可自行操作發佈活動! 立即進駐ARK! + // ) + } diff --git a/src/pages/TabbarPages/what2Reg/component/CourseCard.js b/src/pages/TabbarPages/what2Reg/component/CourseCard.js index 109f91b5..9800bab9 100644 --- a/src/pages/TabbarPages/what2Reg/component/CourseCard.js +++ b/src/pages/TabbarPages/what2Reg/component/CourseCard.js @@ -65,7 +65,7 @@ export default class CourseCard extends Component { } render() { - const { data, mode, preEnroll } = this.props; + const { data, mode } = this.props; return ( {this.renderCourseCode(courseCode)} {/* Pre Enroll標記 */} - {preEnroll ? ( + {/* {preEnroll ? ( PreEnroll - ) : null} + ) : null} */} a['Course Code'].substring(4, 8).localeCompare(b['Course Code'].substring(4, 8), 'es', { sensitivity: 'base' })); -// offerCourseList.sort((a, b) => a['Course Code'].substring(0, 3).localeCompare(b['Course Code'].substring(0, 3), 'es', { sensitivity: 'base' })); - -// 複製替換原課程列表為排序後列表 -// const courseListStr = JSON.stringify(offerCourseList); -// console.log(courseListStr); - -// 預選課程加入Pre 鍵值 -// offerCourseList.map((itm,idx)=>{ -// itm['Pre'] = 'true'; -// }) -// console.log(JSON.stringify(offerCourseList)); - -// 加入課表時間Excel數據,去重 -// offerCourseList = offerCourseList.concat(xxxList); -// offerCourseList = offerCourseList.filter((item, index) => offerCourseList.findIndex(i => i['Course Code'] === item['Course Code']) === index); -// console.log(JSON.stringify(offerCourseList)); - // 學院名中文參考 const unitMap = { 'FAH': '人文學院 - Arts and Humanities', @@ -153,42 +135,6 @@ async function setLocalOpitons(filterOptions) { } } -// 返回搜索候選所需的課程列表 -handleSearchFilterCourse = (inputText) => { - const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : offerCourses.Courses; - - // 篩選所需課程 - let filterCourseList = offerCourseList.filter(itm => { - return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title Chi'].indexOf(inputText) != -1 - }); - - // 篩選課表時間Excel的數據 - if (coursePlanList.length > 0) { - let coursePlanSearchList = coursePlanList.filter(itm => { - return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 - || itm['Teacher Information'].toUpperCase().indexOf(inputText) != -1 - || (itm['Day'] && itm['Day'].toUpperCase().indexOf(inputText) != -1) - || (itm['Offering Department'] && itm['Offering Department'].toUpperCase().indexOf(inputText) != -1) - || itm['Offering Unit'].toUpperCase().indexOf(inputText) != -1 - || itm['Course Title Chi'].indexOf(inputText) != -1 - }); - - // 搜索合併 - filterCourseList = filterCourseList.concat(coursePlanSearchList) - // 搜索去重 - filterCourseList = filterCourseList.filter((item, index) => filterCourseList.findIndex(i => i['Course Code'] === item['Course Code']) === index); - } - - // 搜索結果排序 - filterCourseList.sort((a, b) => a['Course Code'].substring(4, 8).localeCompare(b['Course Code'].substring(4, 8), 'es', { sensitivity: 'base' })); - filterCourseList.sort((a, b) => a['Course Code'].substring(0, 3).localeCompare(b['Course Code'].substring(0, 3), 'es', { sensitivity: 'base' })); - - return filterCourseList -} - export default class index extends Component { constructor() { super(); @@ -212,6 +158,10 @@ export default class index extends Component { offerGEList: [], filterCourseList: [], scrollData: {}, + + s_offerCourses: offerCourses, + s_coursePlan: coursePlan, + s_coursePlanTime: coursePlanTime, }; this.textInputRef = React.createRef(); @@ -220,8 +170,36 @@ export default class index extends Component { async componentDidMount() { logToFirebase('openPage', { page: 'chooseCourses' }); + // logAllStorage(); + // await AsyncStorage.removeItem('course_file_check_date'); try { + // 3.0開始,優先使用本地緩存的offerCourses數據展示,後台對比雲端數據版本,提示更新 + const storageOfferCourses = await getLocalStorage('offer_courses'); + if (storageOfferCourses) { + this.setState({ s_offerCourses: storageOfferCourses }); + } else { + const saveResult = await setLocalStorage('offer_courses', offerCourses); + if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + } + + const storageCoursePlan = await getLocalStorage('course_plan'); + if (storageCoursePlan) { + this.setState({ s_coursePlan: storageCoursePlan }); + } else { + const saveResult = await setLocalStorage('course_plan', coursePlan); + if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + } + + const storageCoursePlanList = await getLocalStorage('course_plan_time'); + if (storageCoursePlanList) { + this.setState({ s_coursePlanList: storageCoursePlanList }); + } else { + const saveResult = await setLocalStorage('course_plan_time', coursePlanTime); + if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + } + + // 讀取課程類別選擇器的本地緩存 const strFilterOptions = await AsyncStorage.getItem('ARK_Courses_filterOptions'); const filterOptions = strFilterOptions ? JSON.parse(strFilterOptions) : undefined; if (filterOptions) { @@ -231,47 +209,75 @@ export default class index extends Component { setLocalOpitons(this.state.filterOptions); } } catch (e) { + // console.log('err', e); Alert.alert('ARK Courses error, 請聯繫開發者!', e) } finally { + // TODO: 需不需要每天自動更新課表數據? + // const storageFileCheckDate = await getLocalStorage('course_file_check_date'); + // if (moment(storageFileCheckDate).isBefore(moment().format("YYYY-MM-DD")) || storageFileCheckDate == undefined) { + // await this.updateLocalCourseData('coursePlanTime'); + // } this.getClassifyCourse(); } - - // 軟鍵盤監聽是否隱藏,隱藏時使輸入框失焦 - this.keyboardDidHideListener = Keyboard.addListener( - 'keyboardDidHide', - this._keyboardDidHide, - ); }; + // 軟鍵盤監聽是否隱藏,隱藏時使輸入框失焦 + keyboardDidHideListener = Keyboard.addListener( + 'keyboardDidHide', + this._keyboardDidHide, + ); + componentWillUnmount() { this.keyboardDidHideListener.remove(); } - // TODO: 在線更新課表數據 - getCourseJSON = async (type) => { - typeObj = { - 'plan': 'COURSE_PLAN', - 'planTime': 'COURSE_PLAN_TIME', - 'offer': 'OFFER_COURSE', - } - const URI = GET[typeObj[type]]; + // 更新Add Drop課表的數據 + updateLocalCourseData = async (type) => { + const storageMap = { + 'coursePlan': 'course_plan', + 'coursePlanTime': 'course_plan_time', + 'offerCourses': 'offer_courses', + }; + const fileNameMap = { + 'coursePlan': 'coursePlan', + 'coursePlanTime': 'coursePlanTime', + 'offerCourses': 'offerCourses', + }; + const stateMap = { + 'coursePlan': 's_coursePlan', + 'coursePlanTime': 's_coursePlanTime', + 'offerCourses': 's_offerCourses', + }; + try { - let res = await axios.get(URI) - return res.data + const res = await axios.get(`https://raw.githubusercontent.com/UM-ARK/UM-All-Frontend/master/src/static/UMCourses/${fileNameMap[type]}.json`) + if (res.status == 200) { + const { data } = res; + this.setState({ [stateMap[type]]: data }); + const saveResult = await setLocalStorage(storageMap[type], data); + if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + Toast.show(`已拉取更新!`); + if (type === 'coursePlanTime') { + Alert.alert(`ARK搵課提示`, `現在重啟APP以適配最新課表數據嗎?`, [ + { + text: 'Yes', onPress: () => { + RNRestart.Restart(); + } + }, + { text: 'No', }, + ]); + } + } } catch (error) { Alert.alert(``, - '連接Github更新數據失敗,\n請檢查網絡再試!\n如果你正連接中國內地網絡,\n你可能需要一個梯子,\n請等待軟件更新數據或發郵件催促一下作者\nQAQ...' + '自動連線至Github更新課程數據失敗,\n請檢查網絡再試!\n如果你正連接中國內地網絡,\n你可能需要一個梯子,\n請等待軟件更新數據或與作者反饋\nQAQ...' , null, { cancelable: true }) - } - } - - // TODO: 在線更新課表數據 - updateCourseJSON = async () => { - try { - let PLAN_JSON = await this.getCourseJSON('plan'); - console.log('PLAN_JSON', PLAN_JSON); - } catch (error) { - console.log('error', error); + } finally { + // TODO: 每日任務的最後寫入更新日期到緩存 + // const strToday = moment().format("YYYY-MM-DD"); + // const saveResult = await setLocalStorage('course_file_check_date', strToday); + // if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + this.getClassifyCourse(); } } @@ -283,7 +289,8 @@ export default class index extends Component { // 對開課數據進行分類 getClassifyCourse = () => { - const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : offerCourses.Courses; + const { s_offerCourses, s_coursePlan } = this.state; + const offerCourseList = COURSE_MODE == 'ad' ? s_coursePlan.Courses : s_offerCourses.Courses; let { filterOptions } = this.state; // 開設課程的學院名列表 @@ -398,7 +405,7 @@ export default class index extends Component { style={{ ...s.classItm, paddingHorizontal: scale(5), paddingVertical: scale(2), - backgroundColor: filterOptions.mode === itm ? themeColor : null, + backgroundColor: filterOptions.mode === itm ? (filterOptions.mode === 'ad' ? themeColor : secondThemeColor) : null, }} onPress={async () => { trigger(); @@ -957,6 +964,44 @@ export default class index extends Component { } } + // 返回搜索候選所需的課程列表 + handleSearchFilterCourse = (inputText) => { + const { s_offerCourses, s_coursePlan, s_coursePlanTime } = this.state; + const offerCourseList = COURSE_MODE == 'ad' ? s_coursePlan.Courses : s_offerCourses.Courses; + const coursePlanList = s_coursePlanTime.Courses; + + // 篩選所需課程 + let filterCourseList = offerCourseList.filter(itm => { + return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title Chi'].indexOf(inputText) != -1 + }); + + // 篩選課表時間Excel的數據 + if (coursePlanList.length > 0) { + let coursePlanSearchList = coursePlanList.filter(itm => { + return itm['Course Code'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title'].toUpperCase().indexOf(inputText) != -1 + || itm['Teacher Information'].toUpperCase().indexOf(inputText) != -1 + || (itm['Day'] && itm['Day'].toUpperCase().indexOf(inputText) != -1) + || (itm['Offering Department'] && itm['Offering Department'].toUpperCase().indexOf(inputText) != -1) + || itm['Offering Unit'].toUpperCase().indexOf(inputText) != -1 + || itm['Course Title Chi'].indexOf(inputText) != -1 + }); + + // 搜索合併 + filterCourseList = filterCourseList.concat(coursePlanSearchList) + // 搜索去重 + filterCourseList = filterCourseList.filter((item, index) => filterCourseList.findIndex(i => i['Course Code'] === item['Course Code']) === index); + } + + // 搜索結果排序 + filterCourseList.sort((a, b) => a['Course Code'].substring(4, 8).localeCompare(b['Course Code'].substring(4, 8), 'es', { sensitivity: 'base' })); + filterCourseList.sort((a, b) => a['Course Code'].substring(0, 3).localeCompare(b['Course Code'].substring(0, 3), 'es', { sensitivity: 'base' })); + + return filterCourseList + } + render() { const { isLoading, @@ -964,8 +1009,8 @@ export default class index extends Component { inputText, } = this.state; const searchFilterCourse = hasChinese(inputText) ? - (inputText.length > 0 ? handleSearchFilterCourse(inputText) : null) : - inputText.length > 2 ? handleSearchFilterCourse(inputText) : null; + (inputText.length > 0 ? this.handleSearchFilterCourse(inputText) : null) : + inputText.length > 2 ? this.handleSearchFilterCourse(inputText) : null; return ( {(insets) => {/* 頁面標題欄 */} + {/* TODO: 提示按鈕,包括更新數據 */} + { + trigger(); + Alert.alert('ARK搵課提示', + `APP內Add Drop課數據更新日期:${this.state.s_coursePlan.updateTime}\n\nAPP內Pre Enroll數據更新日期:${this.state.s_offerCourses.updateTime}\n\n如作者已上傳最新課表數據,可直接點擊下方按鈕更新!\n或可附件最新的課表Excel,Email提醒作者更新!\n\n如日期已更新,課表數據未更新,可重啟APP再試~`, + [ + { + text: "更新Pre Enroll數據", + onPress: async () => { + await this.updateLocalCourseData('offerCourses'); + }, + }, + { + text: "更新Add Drop數據", + onPress: async () => { + try { + await this.updateLocalCourseData('coursePlan'); + } catch (error) { + alert(JSON.stringify(error)); + } finally { + await this.updateLocalCourseData('coursePlanTime'); + } + }, + }, + { + text: "GOT IT", + }, + ] + ); + }} + > + + 更新 + + {/* ARK Logo */} {/* TODO: 更新數據按鈕 */} - {false && ( - + this.updateLocalCourseData('coursePlan')} + > + 更新課表 + + + this.updateLocalCourseData('coursePlanTime')} > - {`點我更新${'01-02'}課表`} + 更新課表時間 - )} + + this.updateLocalCourseData('offerCourses')} + > + 更新預選課 + + } <> @@ -1045,9 +1143,7 @@ export default class index extends Component { ヾ(o・ω・)ノ 拿走不謝~ - + ) : (<> {/* 篩選列表 */} @@ -1066,9 +1162,7 @@ export default class index extends Component { {/* 渲染篩選出的課程 */} {filterCourseList && filterCourseList.length > 0 ? ( - + ) : null} )} @@ -1079,10 +1173,10 @@ export default class index extends Component { {`${COURSE_MODE == 'ad' ? '開設' : '預選'}課程:`} - 數據更新日期: {COURSE_MODE == 'ad' ? coursePlan.updateTime : offerCourses.updateTime} + 數據更新日期: {COURSE_MODE == 'ad' ? this.state.s_coursePlan.updateTime : this.state.s_offerCourses.updateTime} - 記得更新APP以獲得最新數據~ + 記得更新APP或右上角手動更新以獲得最新數據~ 遇到BUG可聯繫umacark@gmail.com diff --git a/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js b/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js index ca99108f..f7fbb11c 100644 --- a/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js +++ b/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js @@ -5,6 +5,7 @@ import { ScrollView, TouchableOpacity, FlatList, + Alert, } from 'react-native' import { COLOR_DIY, uiStyle, } from '../../../../utils/uiMap'; @@ -14,6 +15,7 @@ import Loading from '../../../../components/Loading'; import { WHAT_2_REG, ARK_WIKI_SEARCH } from "../../../../utils/pathMap"; import { openLink } from "../../../../utils/browser"; import { logToFirebase } from "../../../../utils/firebaseAnalytics"; +import { getLocalStorage } from "../../../../utils/storageKits"; import coursePlanTime from "../../../../static/UMCourses/coursePlanTime"; import { scale } from "react-native-size-matters"; @@ -21,7 +23,6 @@ import { NavigationContext } from '@react-navigation/native'; import { MenuView } from '@react-native-menu/menu'; const { themeColor, secondThemeColor, black, white, viewShadow } = COLOR_DIY; -const coursePlanList = coursePlanTime.Courses; const daySorter = { 'MON': 1, @@ -47,10 +48,25 @@ export default class LocalCourse extends Component { state = { courseCode: this.props.route.params, isLoading: true, + s_coursePlanTime: coursePlanTime, } - componentDidMount() { - const { courseCode } = this.state; + async componentDidMount() { + try { + const storageCoursePlanList = await getLocalStorage('course_plan_time'); + if (storageCoursePlanList) { + this.setState({ s_coursePlanTime: storageCoursePlanList }); + } + } catch (error) { + Alert.alert(JSON.stringify(error)) + } finally { + this.searchCourse(); + } + } + + searchCourse = () => { + const { courseCode, s_coursePlanTime } = this.state; + const coursePlanList = s_coursePlanTime.Courses; let relateCourseList = coursePlanList.filter(itm => { return itm['Course Code'].toUpperCase().indexOf(courseCode) != -1 @@ -121,6 +137,20 @@ export default class LocalCourse extends Component { openLink(URI); break; + case 'add': + trigger(); + Alert.alert(`ARK搵課提示`, `確定添加此課程到模擬課表嗎?`, [ + { + text: 'Yes', onPress: () => { + trigger(); + this.props.navigation.navigate('CourseSimTab', { + add: courseInfo + }); + } + }, + { text: 'No', }, + ]); + default: break; } @@ -136,6 +166,11 @@ export default class LocalCourse extends Component { title: '查 選咩課', titleColor: black.third, }, + { + id: 'add', + title: '添加至模擬課表', + titleColor: black.third, + }, ]} shouldOpenOnLongPress={false} > diff --git a/src/static/UMCalendar/UMCalendar.js b/src/static/UMCalendar/UMCalendar.js index ce6745d6..36e84315 100644 --- a/src/static/UMCalendar/UMCalendar.js +++ b/src/static/UMCalendar/UMCalendar.js @@ -2,686 +2,692 @@ import moment from "moment"; export const UMCalendar = [ { - "startDate": "2023-08-03T00:00:00", - "endDate": "2023-08-04T00:00:00", + "startDate": "2024-08-05T00:00:00+08:00", + "endDate": "2024-08-06T00:00:00+08:00", "summary": "Last day of Student Summer Recess", "summary_cn": "學生暑假的最後一天" }, { - "startDate": "2023-08-17T00:00:00", - "endDate": "2023-08-18T00:00:00", + "startDate": "2024-08-19T00:00:00+08:00", + "endDate": "2024-08-20T00:00:00+08:00", "summary": "First day of 1st semester's classes", "summary_cn": "第一學期課程的第一天" }, { - "startDate": "2023-09-30T00:00:00", - "endDate": "2023-10-01T00:00:00", + "startDate": "2024-09-18T00:00:00+08:00", + "endDate": "2024-09-19T00:00:00+08:00", "summary": "The day following Mid-Autumn Festival", "summary_cn": "中秋節第二天" }, { - "startDate": "2023-10-01T00:00:00", - "endDate": "2023-10-02T00:00:00", + "startDate": "2024-10-01T00:00:00+08:00", + "endDate": "2024-10-02T00:00:00+08:00", "summary": "National Day of the People's Republic of China", - "summary_cn": "中華人民共和國國慶節" + "summary_cn": "中華人民共和國國慶日" }, { - "startDate": "2023-10-02T00:00:00", - "endDate": "2023-10-03T00:00:00", + "startDate": "2024-10-02T00:00:00+08:00", + "endDate": "2024-10-03T00:00:00+08:00", "summary": "The day following National Day of the People's Republic of China", - "summary_cn": "中華人民共和國國慶節次日" + "summary_cn": "中華人民共和國國慶日" }, { - "startDate": "2023-10-03T00:00:00", - "endDate": "2023-10-05T00:00:00", - "summary": "Compensatory rest day set forth in No.4 of Article 79 of the ETAPM", - "summary_cn": "ETAPM第79條第4款規定的補休日" - }, - { - "startDate": "2023-10-04T00:00:00+00:00", - "endDate": "2023-10-05T00:00:00", - "summary": "Compensatory rest day set forth in No.4 of Article 79 of the ETAPM", - "summary_cn": "ETAPM第79條第4款規定的補休日" - }, - { - "startDate": "2023-10-23T00:00:00", - "endDate": "2023-10-24T00:00:00", - "summary": "Chong Yeung Festival", + "startDate": "2024-10-11T00:00:00+08:00", + "endDate": "2024-10-12T00:00:00+08:00", + "summary": "Chong Yeong Festival", "summary_cn": "重陽節" }, { - "startDate": "2023-11-02T00:00:00", - "endDate": "2023-11-03T00:00:00", + "startDate": "2024-11-02T00:00:00+08:00", + "endDate": "2024-11-03T00:00:00+08:00", "summary": "All Souls' Day", "summary_cn": "萬靈節" }, { - "startDate": "2023-11-30T00:00:00", - "endDate": "2023-12-01T00:00:00", + "startDate": "2024-11-04T00:00:00+08:00", + "endDate": "2024-11-05T00:00:00+08:00", + "summary": "Compensatory rest day set forth in No.4 of Article 79 of the ETAPM", + "summary_cn": "ETAPM第79條第4款規定的補休日" + }, + { + "startDate": "2024-11-30T00:00:00+08:00", + "endDate": "2024-12-01T00:00:00+08:00", "summary": "Last day of 1st semester's classes", "summary_cn": "第一學期課程的最後一天" }, { - "startDate": "2023-12-01T00:00:00", - "endDate": "2023-12-04T00:00:00", + "startDate": "2024-12-01T00:00:00+08:00", + "endDate": "2024-12-05T00:00:00+08:00", + "summary": "Examination Study Period", + "summary_cn": "考試學習期" + }, + { + "startDate": "2024-12-02T00:00:00+08:00", + "endDate": "2024-12-05T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2023-12-02T00:00:00+00:00", - "endDate": "2023-12-04T00:00:00", + "startDate": "2024-12-03T00:00:00+08:00", + "endDate": "2024-12-05T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2023-12-03T00:00:00+00:00", - "endDate": "2023-12-04T00:00:00", + "startDate": "2024-12-04T00:00:00+08:00", + "endDate": "2024-12-05T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2023-12-04T00:00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-05T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-05T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-06T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-06T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-07T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-07T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-08T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-08T00:00:00", - "endDate": "2023-12-09T00:00:00", + "startDate": "2024-12-08T00:00:00+08:00", + "endDate": "2024-12-09T00:00:00+08:00", + "summary": "Contingency plan for final examinations", + "summary_cn": "期末考緊急應變計畫" + }, + { + "startDate": "2024-12-08T00:00:00+08:00", + "endDate": "2024-12-09T00:00:00+08:00", "summary": "Feast of Immaculate Conception", "summary_cn": "聖母無染原罪節" }, { - "startDate": "2023-12-08T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-09T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" + }, + { + "startDate": "2024-12-09T00:00:00+08:00", + "endDate": "2024-12-10T00:00:00+08:00", + "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", + "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" }, { - "startDate": "2023-12-09T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-10T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-10T00:00:00", - "endDate": "2023-12-11T00:00:00", - "summary": "Contingency plan for final examinations", - "summary_cn": "期末考試應急預案" + "startDate": "2024-12-11T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", + "summary": "1st semester's final examinations", + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-10T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-12T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-11T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-13T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-12T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-14T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-13T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-15T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" + }, + { + "startDate": "2024-12-15T00:00:00+08:00", + "endDate": "2024-12-16T00:00:00+08:00", + "summary": "Contingency plan for final examinations", + "summary_cn": "期末考緊急應變計畫" }, { - "startDate": "2023-12-14T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-16T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-15T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-17T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-16T00:00:00+00:00", - "endDate": "2023-12-17T00:00:00", + "startDate": "2024-12-18T00:00:00+08:00", + "endDate": "2024-12-19T00:00:00+08:00", "summary": "1st semester's final examinations", - "summary_cn": "第一學期期末考試" + "summary_cn": "第一學期期末考" }, { - "startDate": "2023-12-17T00:00:00", - "endDate": "2023-12-18T00:00:00", + "startDate": "2024-12-19T00:00:00+08:00", + "endDate": "2024-12-20T00:00:00+08:00", "summary": "Contingency plan for final examinations", - "summary_cn": "期末考試應急預案" + "summary_cn": "期末考緊急應變計畫" }, { - "startDate": "2023-12-17T00:00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-19T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-18T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-20T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-19T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-20T00:00:00+08:00", + "endDate": "2024-12-21T00:00:00+08:00", + "summary": "Macao S.A.R. Establishment Day", + "summary_cn": "澳門特別行政區成立日" + }, + { + "startDate": "2024-12-21T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-20T00:00:00", - "endDate": "2023-12-21T00:00:00", - "summary": "Macao S.A.R. Establishment Day", - "summary_cn": "澳門特別行政區成立紀念日" + "startDate": "2024-12-21T00:00:00+08:00", + "endDate": "2024-12-22T00:00:00+08:00", + "summary": "Winter Solstice", + "summary_cn": "冬至" }, { - "startDate": "2023-12-20T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-22T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-21T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-23T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-22T00:00:00", - "endDate": "2023-12-23T00:00:00", - "summary": "Winter Solstice", - "summary_cn": "冬至" - }, - { - "startDate": "2023-12-22T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", - "summary": "Christmas/New Year Recess for students", - "summary_cn": "學生聖誕節/新年休息" + "startDate": "2024-12-23T00:00:00+08:00", + "endDate": "2024-12-24T00:00:00+08:00", + "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", + "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" }, { - "startDate": "2023-12-23T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-24T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-24T00:00:00", - "endDate": "2023-12-25T00:00:00", + "startDate": "2024-12-24T00:00:00+08:00", + "endDate": "2024-12-25T00:00:00+08:00", "summary": "Christmas Eve", "summary_cn": "聖誕節前夕" }, { - "startDate": "2023-12-24T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-25T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-25T00:00:00", - "endDate": "2023-12-26T00:00:00", + "startDate": "2024-12-25T00:00:00+08:00", + "endDate": "2024-12-26T00:00:00+08:00", "summary": "Christmas Day", "summary_cn": "聖誕節" }, { - "startDate": "2023-12-25T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-26T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-26T00:00:00", - "endDate": "2023-12-27T00:00:00", - "summary": "Compensatory rest days set forth in No. 4 of Article 79 of the ETAPM", - "summary_cn": "ETAPM 第 79 條第 4 款規定的補償休息日" - }, - { - "startDate": "2023-12-26T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-27T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-27T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-28T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-28T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-29T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-29T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-30T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-30T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-31T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2023-12-31T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2024-12-31T00:00:00+08:00", + "endDate": "2025-01-01T00:00:00+08:00", + "summary": "Exemption from work in the afternoon by the Chief Executive", + "summary_cn": "行政長官免除下午工作" + }, + { + "startDate": "2025-01-01T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "Christmas/New Year Recess for students", "summary_cn": "學生聖誕節/新年休息" }, { - "startDate": "2024-01-01T00:00:00", - "endDate": "2024-01-02T00:00:00", + "startDate": "2025-01-01T00:00:00+08:00", + "endDate": "2025-01-02T00:00:00+08:00", "summary": "New Year's Day", "summary_cn": "元旦" }, { - "startDate": "2024-01-01T00:00:00+00:00", - "endDate": "2024-01-02T00:00:00", - "summary": "Christmas/New Year Recess for students", - "summary_cn": "學生聖誕節/新年休息" - }, - { - "startDate": "2024-01-02T00:00:00", - "endDate": "2024-01-03T00:00:00", + "startDate": "2025-01-02T00:00:00+08:00", + "endDate": "2025-01-03T00:00:00+08:00", "summary": "Release of Academic Reports of Undergraduate Programmes", "summary_cn": "本科生學術報告發布" }, { - "startDate": "2024-01-02T00:00:00", - "endDate": "2024-01-04T00:00:00", + "startDate": "2025-01-02T00:00:00+08:00", + "endDate": "2025-01-06T00:00:00+08:00", + "summary": "Semester Break", + "summary_cn": "學期休息" + }, + { + "startDate": "2025-01-03T00:00:00+08:00", + "endDate": "2025-01-06T00:00:00+08:00", "summary": "Semester Break", "summary_cn": "學期休息" }, { - "startDate": "2024-01-03T00:00:00+00:00", - "endDate": "2024-01-04T00:00:00", + "startDate": "2025-01-04T00:00:00+08:00", + "endDate": "2025-01-06T00:00:00+08:00", "summary": "Semester Break", "summary_cn": "學期休息" }, { - "startDate": "2024-01-04T00:00:00", - "endDate": "2024-01-05T00:00:00", + "startDate": "2025-01-05T00:00:00+08:00", + "endDate": "2025-01-06T00:00:00+08:00", + "summary": "Semester Break", + "summary_cn": "學期休息" + }, + { + "startDate": "2025-01-06T00:00:00+08:00", + "endDate": "2025-01-07T00:00:00+08:00", "summary": "First day of 2nd semester's classes", "summary_cn": "第二學期課程的第一天" }, { - "startDate": "2024-02-04T00:00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-23T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", + "summary": "Lunar New Year Recess for students", + "summary_cn": "學生農曆新年假期" + }, + { + "startDate": "2025-01-24T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-05T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-25T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-06T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-26T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-07T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-27T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-08T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-28T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-09T00:00:00", - "endDate": "2024-02-10T00:00:00", + "startDate": "2025-01-28T00:00:00+08:00", + "endDate": "2025-01-29T00:00:00+08:00", "summary": "Exemption from work in the afternoon by the Chief Executive", "summary_cn": "行政長官免除下午工作" }, { - "startDate": "2024-02-09T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-29T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-10T00:00:00", - "endDate": "2024-02-13T00:00:00", + "startDate": "2025-01-29T00:00:00+08:00", + "endDate": "2025-02-01T00:00:00+08:00", "summary": "Lunar New Year", "summary_cn": "農曆新年" }, { - "startDate": "2024-02-10T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-30T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-11T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", - "summary": "Lunar New Year Recess for students", - "summary_cn": "學生農曆新年假期" - }, - { - "startDate": "2024-02-11T00:00:00+00:00", - "endDate": "2024-02-13T00:00:00", + "startDate": "2025-01-30T00:00:00+08:00", + "endDate": "2025-02-01T00:00:00+08:00", "summary": "Lunar New Year", "summary_cn": "農曆新年" }, { - "startDate": "2024-02-12T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-01-31T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-12T00:00:00+00:00", - "endDate": "2024-02-13T00:00:00", + "startDate": "2025-01-31T00:00:00+08:00", + "endDate": "2025-02-01T00:00:00+08:00", "summary": "Lunar New Year", "summary_cn": "農曆新年" }, { - "startDate": "2024-02-13T00:00:00", - "endDate": "2024-02-15T00:00:00", - "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", - "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" - }, - { - "startDate": "2024-02-13T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-02-01T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-14T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", - "summary": "Lunar New Year Recess for students", - "summary_cn": "學生農曆新年假期" - }, - { - "startDate": "2024-02-14T00:00:00+00:00", - "endDate": "2024-02-15T00:00:00", - "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", - "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" - }, - { - "startDate": "2024-02-15T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-02-02T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-16T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-02-03T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-17T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-02-04T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-02-18T00:00:00+00:00", - "endDate": "2024-02-19T00:00:00", + "startDate": "2025-02-05T00:00:00+08:00", + "endDate": "2025-02-06T00:00:00+08:00", "summary": "Lunar New Year Recess for students", "summary_cn": "學生農曆新年假期" }, { - "startDate": "2024-03-16T00:00:00", - "endDate": "2024-03-18T00:00:00", + "startDate": "2025-03-15T00:00:00+08:00", + "endDate": "2025-03-17T00:00:00+08:00", "summary": "UM Admission Examination and Joint Admission Examination for Macao Four Higher Education Institutions", "summary_cn": "澳大入學考試及澳門四校聯合入學考試" }, { - "startDate": "2024-03-17T00:00:00+00:00", - "endDate": "2024-03-18T00:00:00", + "startDate": "2025-03-16T00:00:00+08:00", + "endDate": "2025-03-17T00:00:00+08:00", "summary": "UM Admission Examination and Joint Admission Examination for Macao Four Higher Education Institutions", "summary_cn": "澳大入學考試及澳門四校聯合入學考試" }, { - "startDate": "2024-03-29T00:00:00", - "endDate": "2024-03-30T00:00:00", + "startDate": "2025-04-04T00:00:00+08:00", + "endDate": "2025-04-05T00:00:00+08:00", + "summary": "Cheng Ming Festival", + "summary_cn": "承明節" + }, + { + "startDate": "2025-04-18T00:00:00+08:00", + "endDate": "2025-04-19T00:00:00+08:00", "summary": "Good Friday", "summary_cn": "耶穌受難日" }, { - "startDate": "2024-03-29T00:00:00", - "endDate": "2024-04-02T00:00:00", + "startDate": "2025-04-18T00:00:00+08:00", + "endDate": "2025-04-22T00:00:00+08:00", + "summary": "Easter Recess for students", + "summary_cn": "學生復活節休息" + }, + { + "startDate": "2025-04-19T00:00:00+08:00", + "endDate": "2025-04-22T00:00:00+08:00", "summary": "Easter Recess for students", "summary_cn": "學生復活節休息" }, { - "startDate": "2024-03-30T00:00:00", - "endDate": "2024-03-31T00:00:00", + "startDate": "2025-04-19T00:00:00+08:00", + "endDate": "2025-04-20T00:00:00+08:00", "summary": "The Day before Easter", "summary_cn": "復活節前一天" }, { - "startDate": "2024-03-30T00:00:00+00:00", - "endDate": "2024-04-02T00:00:00", + "startDate": "2025-04-20T00:00:00+08:00", + "endDate": "2025-04-22T00:00:00+08:00", "summary": "Easter Recess for students", "summary_cn": "學生復活節休息" }, { - "startDate": "2024-03-31T00:00:00+00:00", - "endDate": "2024-04-02T00:00:00", + "startDate": "2025-04-21T00:00:00+08:00", + "endDate": "2025-04-22T00:00:00+08:00", "summary": "Easter Recess for students", "summary_cn": "學生復活節休息" }, { - "startDate": "2024-04-01T00:00:00", - "endDate": "2024-04-02T00:00:00", + "startDate": "2025-04-21T00:00:00+08:00", + "endDate": "2025-04-22T00:00:00+08:00", "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" }, { - "startDate": "2024-04-01T00:00:00+00:00", - "endDate": "2024-04-02T00:00:00", - "summary": "Easter Recess for students", - "summary_cn": "學生復活節休息" - }, - { - "startDate": "2024-04-04T00:00:00", - "endDate": "2024-04-05T00:00:00", - "summary": "Cheng Ming Festival", - "summary_cn": "清明節" + "startDate": "2025-05-01T00:00:00+08:00", + "endDate": "2025-05-02T00:00:00+08:00", + "summary": "Labour Day", + "summary_cn": "勞動節" }, { - "startDate": "2024-04-30T00:00:00", - "endDate": "2024-05-01T00:00:00", + "startDate": "2025-05-03T00:00:00+08:00", + "endDate": "2025-05-04T00:00:00+08:00", "summary": "Last day of 2nd semester's classes", "summary_cn": "第二學期課程的最後一天" }, { - "startDate": "2024-05-01T00:00:00", - "endDate": "2024-05-04T00:00:00", + "startDate": "2025-05-04T00:00:00+08:00", + "endDate": "2025-05-07T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2024-05-01T00:00:00", - "endDate": "2024-05-02T00:00:00", - "summary": "Labour Day", - "summary_cn": "勞動節" - }, - { - "startDate": "2024-05-02T00:00:00+00:00", - "endDate": "2024-05-04T00:00:00", + "startDate": "2025-05-05T00:00:00+08:00", + "endDate": "2025-05-07T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2024-05-03T00:00:00+00:00", - "endDate": "2024-05-04T00:00:00", + "startDate": "2025-05-05T00:00:00+08:00", + "endDate": "2025-05-06T00:00:00+08:00", + "summary": "The Buddha's Birthday", + "summary_cn": "佛誕日" + }, + { + "startDate": "2025-05-06T00:00:00+08:00", + "endDate": "2025-05-07T00:00:00+08:00", "summary": "Examination Study Period", "summary_cn": "考試學習期" }, { - "startDate": "2024-05-04T00:00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-07T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-05T00:00:00", - "endDate": "2024-05-06T00:00:00", - "summary": "Contingency plan for final examinations", - "summary_cn": "期末考試應急預案" + "startDate": "2025-05-08T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", + "summary": "2nd semester's final examinations", + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-05T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-09T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-06T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-10T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-07T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-11T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-08T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", - "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "startDate": "2025-05-11T00:00:00+08:00", + "endDate": "2025-05-12T00:00:00+08:00", + "summary": "Contingency plan for final examinations", + "summary_cn": "期末考緊急應變計畫" }, { - "startDate": "2024-05-09T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-12T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-10T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-13T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-11T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-14T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-12T00:00:00", - "endDate": "2024-05-13T00:00:00", - "summary": "Contingency plan for final examinations", - "summary_cn": "期末考試應急預案" + "startDate": "2025-05-15T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", + "summary": "2nd semester's final examinations", + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-12T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-16T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-13T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-17T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-14T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-18T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-15T00:00:00", - "endDate": "2024-05-16T00:00:00", - "summary": "The Buddha's Birthday", - "summary_cn": "佛誕日" + "startDate": "2025-05-18T00:00:00+08:00", + "endDate": "2025-05-19T00:00:00+08:00", + "summary": "Contingency plan for final examinations", + "summary_cn": "期末考緊急應變計畫" }, { - "startDate": "2024-05-15T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", + "startDate": "2025-05-19T00:00:00+08:00", + "endDate": "2025-05-20T00:00:00+08:00", "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "summary_cn": "第二學期期末考" }, { - "startDate": "2024-05-16T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", - "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "startDate": "2025-05-20T00:00:00+08:00", + "endDate": "2025-05-21T00:00:00+08:00", + "summary": "Contingency plan for final examinations", + "summary_cn": "期末考緊急應變計畫" }, { - "startDate": "2024-05-17T00:00:00+00:00", - "endDate": "2024-05-18T00:00:00", - "summary": "2nd semester's final examinations", - "summary_cn": "第二學期期末考試" + "startDate": "2025-05-31T00:00:00+08:00", + "endDate": "2025-06-01T00:00:00+08:00", + "summary": "Tuen Ng Festival", + "summary_cn": "端午節" }, { - "startDate": "2024-05-18T00:00:00", - "endDate": "2024-05-19T00:00:00", - "summary": "Contingency plan for final examinations", - "summary_cn": "期末考試應急預案" + "startDate": "2025-06-02T00:00:00+08:00", + "endDate": "2025-06-03T00:00:00+08:00", + "summary": "Compensatory rest day set forth in No. 4 of Article 79 of the ETAPM", + "summary_cn": "ETAPM 第 79 條第 4 款規定的補休日" }, { - "startDate": "2024-05-31T00:00:00", - "endDate": "2024-06-01T00:00:00", + "startDate": "2025-06-03T00:00:00+08:00", + "endDate": "2025-06-04T00:00:00+08:00", "summary": "Release of Academic Reports of Undergraduate Programmes", "summary_cn": "本科生學術報告發布" }, { - "startDate": "2024-06-03T00:00:00", - "endDate": "2024-06-04T00:00:00", - "summary": "First day of Summer Term", - "summary_cn": "夏季學期的第一天" - }, - { - "startDate": "2024-06-07T00:00:00", - "endDate": "2024-06-08T00:00:00", + "startDate": "2025-06-09T00:00:00+08:00", + "endDate": "2025-06-10T00:00:00+08:00", "summary": "First day of Student Summer Recess", "summary_cn": "學生暑假第一天" }, { - "startDate": "2024-06-10T00:00:00", - "endDate": "2024-06-11T00:00:00", - "summary": "Tuen Ng Festival", - "summary_cn": "端午節" + "startDate": "2025-06-09T00:00:00+08:00", + "endDate": "2025-06-10T00:00:00+08:00", + "summary": "First day of Summer Term", + "summary_cn": "夏季學期的第一天" }, { - "startDate": "2024-07-31T00:00:00", - "endDate": "2024-08-01T00:00:00", + "startDate": "2025-07-31T00:00:00+08:00", + "endDate": "2025-08-01T00:00:00+08:00", "summary": "Last day of Summer Term", "summary_cn": "夏季學期的最後一天" } diff --git a/src/static/UMCourses/offerCourses.json b/src/static/UMCourses/offerCourses.json index ea7c86d7..b6a590f5 100644 --- a/src/static/UMCourses/offerCourses.json +++ b/src/static/UMCourses/offerCourses.json @@ -7,7 +7,7 @@ "Course Title": "Principles of Financial Accounting", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA\n - FBA - GBS22-SECOND YEAR / IIR20 / SECOND YEAR / THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA\n - FBA - GBS22 / IIR20 \n - FBA - SECOND YEAR / THIRD YEAR / FOURTH YEAR", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "財務會計原理" }, @@ -18,7 +18,7 @@ "Course Title": "Management Accounting I", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA\n - FBA - ACC19 / ACC21 / FIC20\n", + "Course For Info": "Course for :\n - FBA\n - FBA - ACC19 / ACC21 / FIC20 / GBS20\n - FBA - THIRD YEAR / FOURTH YEAR \n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "管理會計一" }, @@ -218,6 +218,7 @@ "Course Code": "APAC3000", "Course Title": "Materials Physics and Chemistry", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FED\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "材料物理與化學" @@ -228,6 +229,7 @@ "Course Code": "APAC3001", "Course Title": "Solid State Physics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FED\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "固體物理" @@ -238,6 +240,7 @@ "Course Code": "APAC3002", "Course Title": "Thermodynamics and Statistical Physics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FED\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "熱力學和統計物理學" @@ -248,6 +251,7 @@ "Course Code": "APAC3007", "Course Title": "Low-Dimensional Physics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "低維物理" }, @@ -267,6 +271,7 @@ "Course Code": "APAC4002", "Course Title": "Electrodynamics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "電動力學" @@ -277,6 +282,7 @@ "Course Code": "APAC4003", "Course Title": "Magnetic Properties of Materials", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "材料的磁性" @@ -287,6 +293,7 @@ "Course Code": "APAC4005", "Course Title": "Micro-/Nano-Systems", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "微/奈米系統" @@ -381,7 +388,7 @@ "Credit Units": 3, "Course For Info": "Course for:\n - 2017/2018 curriculum (major code >=XXX17)", "Enrolled Year Level (on or above)": 1, - "Course Title Chi": "大學文" + "Course Title Chi": "大學語文" }, { "Offering Unit": "FAH", @@ -924,6 +931,7 @@ "Course Code": "CIVL4005", "Course Title": "Advanced Structural Analysis", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST - CVE17\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "高級結構分析" @@ -934,6 +942,7 @@ "Course Code": "CIVL4007", "Course Title": "Advanced Reinforced Concrete Design", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST - CVE17\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "先進鋼筋混凝土設計" @@ -944,6 +953,7 @@ "Course Code": "CIVL4013", "Course Title": "Engineering Economics and Ethics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST - CVE17\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "工程經濟學與倫理學" @@ -954,6 +964,7 @@ "Course Code": "CIVL4019", "Course Title": "Traffic Engineering", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST - CVE17\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "交通工程" @@ -1327,7 +1338,6 @@ "Course Code": "ECEN3024", "Course Title": "Fundamentals of Internet of Things", "Credit Units": 3, - "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "物聯網基礎" @@ -1338,7 +1348,7 @@ "Course Code": "ECEN4000", "Course Title": "Graduation Project I", "Credit Units": 3, - "Course For Info": "Course for :\n - FST - ECE19\n", + "Course For Info": "Course for :\n - FST - ECE19 / ECE21\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "畢業設計一" }, @@ -1914,7 +1924,7 @@ "Credit Units": 3, "For Incoming Exchange Students": "Y", "Enrolled Year Level (on or above)": 3, - "Course Title Chi": "以學科為基礎的教學方法(中學數學)II" + "Course Title Chi": "基於學科的教學方法(中學數學)II" }, { "Offering Unit": "FED", @@ -2301,7 +2311,7 @@ "Credit Units": 3, "For Incoming Exchange Students": "Y", "Enrolled Year Level (on or above)": 1, - "Course Title Chi": "翻譯理論與實踐概論" + "Course Title Chi": "翻譯理論與實務概論" }, { "Offering Unit": "FAH", @@ -3251,22 +3261,22 @@ { "Offering Unit": "FAH", "Offering Department": "DHIST", - "Course Code": "HIST2018", - "Course Title": "Medical Identities in East and West", + "Course Code": "HIST3000", + "Course Title": "Asian Maritime History", "Credit Units": 3, "For Incoming Exchange Students": "Y", "Enrolled Year Level (on or above)": 1, - "Course Title Chi": "東西方的醫學身分" + "Course Title Chi": "亞洲航海史" }, { "Offering Unit": "FAH", "Offering Department": "DHIST", - "Course Code": "HIST3000", - "Course Title": "Asian Maritime History", + "Course Code": "HIST3015", + "Course Title": "Jesuits in Ming-Qing China", "Credit Units": 3, "For Incoming Exchange Students": "Y", "Enrolled Year Level (on or above)": 1, - "Course Title Chi": "亞洲航海史" + "Course Title Chi": "明清中國的耶穌會士" }, { "Offering Unit": "FAH", @@ -3672,7 +3682,7 @@ "Course Code": "ISOM1005", "Course Title": "Introduction to Business Intelligence and Information", "Credit Units": 3, - "Course For Info": "Course for :\n - FBA - BAM22 / GBS22-SECOND YEAR / GBS22-THIRD YEAR\n", + "Course For Info": "Course for :\n - FBA - BAM22 / GBS22\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "商業智慧與資訊導論" }, @@ -3682,7 +3692,7 @@ "Course Code": "ISOM2002", "Course Title": "Statistics and Data Analysis", "Credit Units": 3, - "Course For Info": "Course for :\n - FBA - ACC21-SECOND YEAR / ACC21-THIRD YEAR / BIA19-SECOND YEAR / BIA19-THIRD YEAR / FNC20-SECOND YEAR / FNC20-THIRD YEAR / GBS20-THIRD YEAR / GBS20-FOURTH YEAR / GBS22-THIRD YEAR / GBS22-FOURTH YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - ACC21-SECOND YEAR / ACC21-THIRD YEAR / BIA19-SECOND YEAR / BIA19-THIRD YEAR / FNC20-SECOND YEAR / FNC20-THIRD YEAR / GBS20-SECOND YEAR / GBS20-THIRD YEAR / GBS20-FOURTH YEAR / GBS22-THIRD YEAR / GBS22-FOURTH YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "統計和數據分析" }, @@ -3692,7 +3702,7 @@ "Course Code": "ISOM2005", "Course Title": "Linear Algebra", "Credit Units": 3, - "Course For Info": "Course for :\n - FBA - FNC17 / FNC20-SECOND YEAR / FNC20-THIRD YEAR / FNM19-SECOND YEAR\n", + "Course For Info": "Course for :\n - FBA - FNC17 / FNC20-SECOND YEAR / FNC20-THIRD YEAR / FNM19\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "線性代數" }, @@ -3866,7 +3876,7 @@ "Credit Units": 3, "Course For Info": "Course for :\n - FAH - JSM19\n - FAH - JAP19\n", "Enrolled Year Level (on or above)": 1, - "Course Title Chi": "綜合日文Ⅰ" + "Course Title Chi": "綜合日文I" }, { "Offering Unit": "FAH", @@ -4144,7 +4154,7 @@ "Course Title": "Discrete Mathematics", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FST\n", + "Course For Info": "Course for :\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "離散數學" }, @@ -4155,7 +4165,7 @@ "Course Title": "Linear Algebra I", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FHS\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FHS\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "線性代數I" }, @@ -4166,7 +4176,7 @@ "Course Title": "Intermediate Calculus", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "中級微積分" }, @@ -4199,7 +4209,7 @@ "Course Title": "Multivariable Calculus", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "多元微積分" }, @@ -4210,7 +4220,7 @@ "Course Title": "Mathematical Analysis I", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "數學分析Ⅰ" }, @@ -4221,7 +4231,7 @@ "Course Title": "Probability", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "可能性" }, @@ -4265,7 +4275,7 @@ "Course Title": "Ordinary Differential Equations", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FED - MAS19\n - FST\n", + "Course For Info": "Course for :\n - FED - MAS19\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "常微分方程" }, @@ -4287,7 +4297,7 @@ "Course Title": "Introduction to Stochastic Process", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FST\n", + "Course For Info": "Course for :\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "隨機過程簡介" }, @@ -4298,7 +4308,7 @@ "Course Title": "Numerical Matrix Analysis", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FST\n", + "Course For Info": "Course for :\n - FST - AMM19\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "數值矩陣分析" }, @@ -4351,6 +4361,7 @@ "Course Code": "MATH4001", "Course Title": "Introduction to Real Analysis and Hilbert Spaces", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "實分析與希爾伯特空間簡介" @@ -4361,6 +4372,7 @@ "Course Code": "MATH4003", "Course Title": "Nonparametric Statistics", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "非參數統計" @@ -4380,7 +4392,7 @@ "Course Code": "MGMT2000", "Course Title": "Business Communications", "Credit Units": 3, - "Course For Info": "Course for :\n - FBA - GBS22-SECOND YEAR / THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - GBS22 / THIRD YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "商務通訊" }, @@ -4435,7 +4447,7 @@ "Course Title": "Strategic Management", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA - FIC22-THIRD YEAR / FNC20-THIRD YEAR / GBM22-THIRD YEAR / MKG22-THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - FIC22-THIRD YEAR / FNC20-THIRD YEAR / GBM22-THIRD YEAR / GBS20 / MKG22-THIRD YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "策略管理" }, @@ -4446,7 +4458,7 @@ "Course Title": "Research Methods", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA - GBM22-THIRD YEAR / HRM22-THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - GBM22-THIRD YEAR / GBS20 / HRM22-THIRD YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "研究方法" }, @@ -4478,7 +4490,7 @@ "Course Title": "Business Ethics and Corporate Social Responsibility", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA - BEC22-THIRD YEAR / GBM20-FOURTH YEAR / HRM22-THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - ACC21-THIRD YEAR / BEC22-THIRD YEAR / GBM20-FOURTH YEAR / HRM22-THIRD YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "商業道德與企業社會責任" }, @@ -4532,7 +4544,7 @@ "Course Title": "Principles of Marketing", "Credit Units": 3, "For Incoming Exchange Students": "Y", - "Course For Info": "Course for :\n - FBA - GBS22-SECOND YEAR / THIRD YEAR / FOURTH YEAR\n", + "Course For Info": "Course for :\n - FBA - GBS22 / THIRD YEAR / FOURTH YEAR\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "行銷原理" }, @@ -5244,6 +5256,7 @@ "Course Code": "STGC1001", "Course Title": "General Chemistry", "Credit Units": 3, + "For Incoming Exchange Students": "Y", "Course For Info": "Course for :\n - FST - CVE17\n", "Enrolled Year Level (on or above)": 1, "Course Title Chi": "普通化學" @@ -5547,7 +5560,7 @@ "Course Title Chi": "民事訴訟法一(法律實務)(中文進行)" } ], - "updateTime": "2024-04-19", + "updateTime": "2024-04-23", "academicYear": "24/25", "sem": "1", "remark": "用於Pre Enrollment期間的數據", diff --git a/src/utils/pathMap.js b/src/utils/pathMap.js index 8dc97d2f..49d80147 100644 --- a/src/utils/pathMap.js +++ b/src/utils/pathMap.js @@ -1,3 +1,5 @@ +import UMAPITOKEN from "../../umAPIToken.json"; + // 網站地址映射 // 服務器基地址,其他分地址可以直接寫'/bus'、'/login' @@ -31,7 +33,7 @@ export const ARK_WIKI_RANDOM_PAGE = ARK_WIKI + '/wiki/Special:Random'; export const ARK_WIKI_RANDOM_TITLE = ARK_WIKI + '/api.php?action=query&format=json&list=random&rnlimit=1&rnnamespace=0'; -export const OFFICIAL_COURSE_SEARCH = 'https://isw.umac.mo/siwci/faces/courseDetailUG?courseCode='; +export const OFFICIAL_COURSE_SEARCH = 'https://isw.um.edu.mo/siwci/faces/courseDetailUG?courseCode='; export function addHost(itm) { if (itm.length > 0) { @@ -146,7 +148,7 @@ export const UM_API_EVENT = export const UM_API_NEWS = 'https://api.data.um.edu.mo/service/media/news/v1.0.0/all'; // 澳大 - API token -export const UM_API_TOKEN = ''; +export const UM_API_TOKEN = UMAPITOKEN.token; // 澳大 Webview // 澳大 - 環校巴士報站 @@ -210,7 +212,7 @@ export const UM_PRE_ENROLMENT_EXCEL = 'https://reg.um.edu.mo/current-students/en export const UM_IMPORTANT_DATE = 'https://reg.um.edu.mo/current-students/enrolment-and-examinations/important-dates/?lang=zh-hant'; // 澳大 - 失物認領 -export const UM_LOST_FOUND = 'https://um2.umac.mo/apps/com/umlostfound.nsf'; +export const UM_LOST_FOUND = 'https://lostandfound.cmdo.um.edu.mo'; // 澳大 - 泊車月票 export const UM_PARK_APPLY = 'https://isw.um.edu.mo/parkmpapp/application'; // 澳大 - 職位空缺系統 diff --git a/src/utils/storageKits.js b/src/utils/storageKits.js index aad9a67b..4e20f734 100644 --- a/src/utils/storageKits.js +++ b/src/utils/storageKits.js @@ -58,3 +58,42 @@ export async function setAPPInfo(appInfo) { alert(e); } } + +// 獲取本地緩存 +export async function getLocalStorage(itemName) { + let localItem = null; + try { + const strLocalItem = await AsyncStorage.getItem(itemName); + localItem = strLocalItem ? JSON.parse(strLocalItem) : undefined; + } catch (error) { + localItem = error; + } finally { + return localItem; + } +} + +// 存入本地緩存 +export async function setLocalStorage(itemName, data) { + try { + const strData = JSON.stringify(data); + await AsyncStorage.setItem(itemName, strData); + } catch (error) { + console.log('AsyncStorage Error', error) + return error; + } finally { + console.log(itemName, '已存入緩存'); + return 'ok'; + } +} + +// log出當前所有的緩存資料 +export function logAllStorage() { + AsyncStorage.getAllKeys((err, keys) => { + AsyncStorage.multiGet(keys, (error, stores) => { + stores.map((result, i, store) => { + console.log({ [store[i][0]]: JSON.parse(store[i][1]) }); + return true; + }); + }); + }); +} \ No newline at end of file