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