From 466ff647f0ce09d2f31446a147211617032fbd36 Mon Sep 17 00:00:00 2001 From: "Rookie, LIN" <1049825685@qq.com> Date: Wed, 24 Apr 2024 13:49:08 +0800 Subject: [PATCH 01/29] =?UTF-8?q?:sparkles:=20=E6=9B=B4=E6=96=B004-23?= =?UTF-8?q?=E9=A0=90=E9=81=B8=E8=AA=B2=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/static/UMCourses/offerCourses.json | 77 +++++++++++++++----------- 1 file changed, 45 insertions(+), 32 deletions(-) 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期間的數據", From 039d244bdbfe5f789f49ce5f54a1a95905a6cd39 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:44:16 +0800 Subject: [PATCH 02/29] =?UTF-8?q?:pencil:=20=E6=9B=B4=E6=96=B0README?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=93=BA=E6=94=BE=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- debugging_doc.md => README/debugging_doc.md | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename debugging_doc.md => README/debugging_doc.md (100%) diff --git a/README.md b/README.md index dc0c2c8d..ee2f7642 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) --- 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 From d421f7d2c070a9050721c88de176e5389c22f5d2 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:44:37 +0800 Subject: [PATCH 03/29] =?UTF-8?q?:rocket:=20=E6=9B=B4=E6=96=B0=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :rocket: 更新第三方庫 :rocket: 更新babel庫 --- package-lock.json | 586 +++++++++++++++++++++++++--------------------- package.json | 42 ++-- 2 files changed, 346 insertions(+), 282 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46c7a5e6..71599ed3 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/material-top-tabs": "^6.6.13", "@react-navigation/native": "^6.1.15", "@react-navigation/native-stack": "^6.9.24", "@react-navigation/stack": "^6.3.27", "@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": { @@ -4238,9 +4284,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" @@ -5207,11 +5254,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" } @@ -8242,15 +8290,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 +8863,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 +8880,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 +13242,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 +13277,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" }, @@ -14157,9 +14210,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" }, @@ -14289,9 +14343,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 +14468,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 +14521,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 +14729,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 +14833,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 +14857,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 +14878,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 +14996,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 +15050,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" @@ -17069,9 +17132,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..ac3b71fc 100644 --- a/package.json +++ b/package.json @@ -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/material-top-tabs": "^6.6.13", "@react-navigation/native": "^6.1.15", "@react-navigation/native-stack": "^6.9.24", "@react-navigation/stack": "^6.3.27", "@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", From 04420d66bb898ec6db7dfe9bc4cef6c8b98cf38d Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:45:49 +0800 Subject: [PATCH 04/29] =?UTF-8?q?:art:=20=E7=B5=84=E7=B9=94=E7=99=BB?= =?UTF-8?q?=E9=8C=84=E6=93=8D=E4=BD=9C=E6=B8=9B=E5=B0=91=E4=B8=80=E7=B4=9A?= =?UTF-8?q?=E9=A0=81=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ClubSystem/login/ClubLogin.js | 100 +++++++++++++++++++++-- src/pages/TabbarPages/info/home/index.js | 6 +- 2 files changed, 100 insertions(+), 6 deletions(-) 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 + + + {/* 登錄按鈕 */} { trigger(); - this.props.navigation.navigate('LoginIndex'); + if (this.state.showUpdateInfo) { + Alert.alert(`重要提示!`, `請使用最新版APP進行登錄!\n快更新APP吧!`); + } else { + this.props.navigation.navigate('ClubLogin'); + } }, }, ], From bf7e70c59e3b792c869d8458030102a301d17413 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:58:12 +0800 Subject: [PATCH 05/29] =?UTF-8?q?:rocket:=20=E6=9B=B4=E6=96=B0navigation?= =?UTF-8?q?=E5=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 55 ++++++++++++++++++++++++++++------------------- package.json | 6 +++--- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71599ed3..9ac4ee2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,9 +19,9 @@ "@react-native-menu/menu": "^0.9.1", "@react-native/gradle-plugin": "^0.73.4", "@react-navigation/material-top-tabs": "^6.6.13", - "@react-navigation/native": "^6.1.15", - "@react-navigation/native-stack": "^6.9.24", - "@react-navigation/stack": "^6.3.27", + "@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.7.2", @@ -4257,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": "*", @@ -4301,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" @@ -4316,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": { @@ -4335,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" }, @@ -8099,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" } @@ -13336,6 +13343,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14228,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", @@ -16141,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" } @@ -16326,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" } diff --git a/package.json b/package.json index ac3b71fc..b4f4052c 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "@react-native-menu/menu": "^0.9.1", "@react-native/gradle-plugin": "^0.73.4", "@react-navigation/material-top-tabs": "^6.6.13", - "@react-navigation/native": "^6.1.15", - "@react-navigation/native-stack": "^6.9.24", - "@react-navigation/stack": "^6.3.27", + "@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.7.2", From 85e44454b1699ebeb1221efc2f853ca742e48ed2 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Fri, 5 Jul 2024 23:34:03 +0800 Subject: [PATCH 06/29] =?UTF-8?q?:sparkles:=20=E9=81=B8=E8=AA=B2=E9=A0=81?= =?UTF-8?q?=E7=9A=84offerCourses=E6=95=B8=E6=93=9A=E6=94=B9=E7=82=BA?= =?UTF-8?q?=E5=BE=9E=E6=9C=AC=E5=9C=B0=E7=B7=A9=E5=AD=98=E4=B8=AD=E7=8D=B2?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/what2Reg/index.js | 96 ++++++++++++++----------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/src/pages/TabbarPages/what2Reg/index.js b/src/pages/TabbarPages/what2Reg/index.js index 4eaa3108..a807cd25 100644 --- a/src/pages/TabbarPages/what2Reg/index.js +++ b/src/pages/TabbarPages/what2Reg/index.js @@ -40,9 +40,6 @@ const iconSize = scale(25); // preEnroll let COURSE_MODE = 'ad'; -const coursePlanList = coursePlanTime.Courses; -// const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : offerCourses.Courses; - // ***** 需到getClassifyCourse函數處運行 ***** // Excel開課數據按首字母排序,複製一份排序後的數據到offerCourses.json,節省安卓端性能 // offerCourseList.sort((a, b) => a['Course Code'].substring(4, 8).localeCompare(b['Course Code'].substring(4, 8), 'es', { sensitivity: 'base' })); @@ -153,42 +150,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 +173,9 @@ export default class index extends Component { offerGEList: [], filterCourseList: [], scrollData: {}, + + s_offerCourses: offerCourses, + coursePlanList: coursePlanTime.Courses, }; this.textInputRef = React.createRef(); @@ -222,6 +186,18 @@ export default class index extends Component { logToFirebase('openPage', { page: 'chooseCourses' }); try { + // 優先使用本地緩存的offerCourses數據展示,後台對比雲端數據版本,提示更新 + const strOfferCourses = await AsyncStorage.getItem('Offer_Courses'); + const storageOfferCourses = strOfferCourses ? JSON.parse(strOfferCourses) : undefined; + if (storageOfferCourses) { + this.setState({ s_offerCourses: storageOfferCourses }); + } else { + console.log('首次存入緩存a'); + const strOfferCourses = JSON.stringify(offerCourses); + await AsyncStorage.setItem('Offer_Courses', strOfferCourses) + .catch(e => console.log('AsyncStorage Error', e)); + } + const strFilterOptions = await AsyncStorage.getItem('ARK_Courses_filterOptions'); const filterOptions = strFilterOptions ? JSON.parse(strFilterOptions) : undefined; if (filterOptions) { @@ -283,7 +259,8 @@ export default class index extends Component { // 對開課數據進行分類 getClassifyCourse = () => { - const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : offerCourses.Courses; + const { s_offerCourses } = this.state; + const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : s_offerCourses.Courses; let { filterOptions } = this.state; // 開設課程的學院名列表 @@ -957,6 +934,43 @@ export default class index extends Component { } } + // 返回搜索候選所需的課程列表 + handleSearchFilterCourse = (inputText) => { + const { coursePlanList, s_offerCourses, } = this.state; + const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : s_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 + } + render() { const { isLoading, @@ -1079,7 +1093,7 @@ export default class index extends Component { {`${COURSE_MODE == 'ad' ? '開設' : '預選'}課程:`} - 數據更新日期: {COURSE_MODE == 'ad' ? coursePlan.updateTime : offerCourses.updateTime} + 數據更新日期: {COURSE_MODE == 'ad' ? coursePlan.updateTime : this.state.s_offerCourses.updateTime} 記得更新APP以獲得最新數據~ From cf637b14435a0804b8d8b850700c0f3dc887ca35 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 24 Jul 2024 21:28:19 +0800 Subject: [PATCH 07/29] =?UTF-8?q?:art:=20=E5=AE=9A=E7=BE=A9=E7=B7=A9?= =?UTF-8?q?=E5=AD=98=E5=AF=AB=E5=85=A5/=E8=AE=80=E5=8F=96=E7=9A=84?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E5=87=BD=E6=95=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/what2Reg/index.js | 16 +++++++++------ src/utils/storageKits.js | 27 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/pages/TabbarPages/what2Reg/index.js b/src/pages/TabbarPages/what2Reg/index.js index a807cd25..89fd7c0b 100644 --- a/src/pages/TabbarPages/what2Reg/index.js +++ b/src/pages/TabbarPages/what2Reg/index.js @@ -23,6 +23,7 @@ import coursePlanTime from '../../../static/UMCourses/coursePlanTime'; import Loading from '../../../components/Loading'; import CourseCard from './component/CourseCard'; import { openLink } from '../../../utils/browser'; +import { getLocalStorage, setLocalStorage } from '../../../utils/storageKits'; import axios from "axios"; import { scale } from "react-native-size-matters"; @@ -187,15 +188,18 @@ export default class index extends Component { try { // 優先使用本地緩存的offerCourses數據展示,後台對比雲端數據版本,提示更新 - const strOfferCourses = await AsyncStorage.getItem('Offer_Courses'); - const storageOfferCourses = strOfferCourses ? JSON.parse(strOfferCourses) : undefined; + const storageOfferCourses = await getLocalStorage('Offer_Courses'); if (storageOfferCourses) { this.setState({ s_offerCourses: storageOfferCourses }); } else { - console.log('首次存入緩存a'); - const strOfferCourses = JSON.stringify(offerCourses); - await AsyncStorage.setItem('Offer_Courses', strOfferCourses) - .catch(e => console.log('AsyncStorage Error', e)); + // const strOfferCourses = JSON.stringify(offerCourses); + // await AsyncStorage.setItem('Offer_Courses', strOfferCourses).catch(e => console.log('AsyncStorage Error', e)); + const saveResult = await setLocalStorage('Offer_Courses', offerCourses); + if (saveResult === 'ok') { + console.log('課程數據首次存入緩存'); + } else { + Alert.alert('Error', JSON.stringify(saveResult)); + } } const strFilterOptions = await AsyncStorage.getItem('ARK_Courses_filterOptions'); diff --git a/src/utils/storageKits.js b/src/utils/storageKits.js index aad9a67b..0af7765d 100644 --- a/src/utils/storageKits.js +++ b/src/utils/storageKits.js @@ -58,3 +58,30 @@ 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'; + } +} From 70e1752269d2e8536013cd0d9092aea55ed4ace2 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 24 Jul 2024 21:54:19 +0800 Subject: [PATCH 08/29] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9Elog?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E7=B7=A9=E5=AD=98=E7=9A=84=E5=87=BD=E6=95=B8?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/storageKits.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/utils/storageKits.js b/src/utils/storageKits.js index 0af7765d..4e20f734 100644 --- a/src/utils/storageKits.js +++ b/src/utils/storageKits.js @@ -85,3 +85,15 @@ export async function setLocalStorage(itemName, data) { 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 From 55f89b70f74200a0c337e2cd94ea99df1c07aee2 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 24 Jul 2024 22:22:46 +0800 Subject: [PATCH 09/29] =?UTF-8?q?:sparkles:=20=E6=94=AF=E6=8C=81=E6=89=8B?= =?UTF-8?q?=E5=8B=95=E6=9B=B4=E6=96=B0ARK=E6=90=B5=E8=AA=B2=E6=95=B8?= =?UTF-8?q?=E6=93=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :art: 修改選課頁coursePlanTime優先使用緩存數據 :art: 修改選課頁coursePlan優先使用緩存數據 :sparkles: 嘗試將課表數據改為在GitHub請求的方式 --- src/pages/TabbarPages/what2Reg/index.js | 222 ++++++++++++++++-------- 1 file changed, 145 insertions(+), 77 deletions(-) diff --git a/src/pages/TabbarPages/what2Reg/index.js b/src/pages/TabbarPages/what2Reg/index.js index 89fd7c0b..435f08cb 100644 --- a/src/pages/TabbarPages/what2Reg/index.js +++ b/src/pages/TabbarPages/what2Reg/index.js @@ -23,10 +23,10 @@ import coursePlanTime from '../../../static/UMCourses/coursePlanTime'; import Loading from '../../../components/Loading'; import CourseCard from './component/CourseCard'; import { openLink } from '../../../utils/browser'; -import { getLocalStorage, setLocalStorage } from '../../../utils/storageKits'; +import { getLocalStorage, setLocalStorage, logAllStorage } from '../../../utils/storageKits'; import axios from "axios"; -import { scale } from "react-native-size-matters"; +import { scale, verticalScale } from "react-native-size-matters"; import { Header } from '@rneui/themed'; import Ionicons from 'react-native-vector-icons/Ionicons'; import FastImage from 'react-native-fast-image'; @@ -34,33 +34,15 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import TouchableScale from "react-native-touchable-scale"; import { SafeAreaInsetsContext } from "react-native-safe-area-context"; import { MenuView } from '@react-native-menu/menu'; +import moment from 'moment'; const { themeColor, themeColorUltraLight, black, white, viewShadow, disabled } = COLOR_DIY; const iconSize = scale(25); +// TODO: BUG:用PreEnroll模式搜索時,會將屬於AddDrop課搜索出來並打上PreEnroll標籤 // preEnroll let COURSE_MODE = 'ad'; -// ***** 需到getClassifyCourse函數處運行 ***** -// Excel開課數據按首字母排序,複製一份排序後的數據到offerCourses.json,節省安卓端性能 -// offerCourseList.sort((a, b) => 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', @@ -176,7 +158,8 @@ export default class index extends Component { scrollData: {}, s_offerCourses: offerCourses, - coursePlanList: coursePlanTime.Courses, + s_coursePlan: coursePlan, + s_coursePlanTime: coursePlanTime, }; this.textInputRef = React.createRef(); @@ -185,23 +168,36 @@ export default class index extends Component { async componentDidMount() { logToFirebase('openPage', { page: 'chooseCourses' }); + // logAllStorage(); + // await AsyncStorage.removeItem('course_file_check_date'); try { - // 優先使用本地緩存的offerCourses數據展示,後台對比雲端數據版本,提示更新 - const storageOfferCourses = await getLocalStorage('Offer_Courses'); + // 3.0開始,優先使用本地緩存的offerCourses數據展示,後台對比雲端數據版本,提示更新 + const storageOfferCourses = await getLocalStorage('offer_courses'); if (storageOfferCourses) { this.setState({ s_offerCourses: storageOfferCourses }); } else { - // const strOfferCourses = JSON.stringify(offerCourses); - // await AsyncStorage.setItem('Offer_Courses', strOfferCourses).catch(e => console.log('AsyncStorage Error', e)); - const saveResult = await setLocalStorage('Offer_Courses', offerCourses); - if (saveResult === 'ok') { - console.log('課程數據首次存入緩存'); - } else { - Alert.alert('Error', JSON.stringify(saveResult)); - } + 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) { @@ -211,47 +207,65 @@ 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/jsonUpdateTest/src/static/UMCourses/${fileNameMap[type]}.json`) + if (res.status == 200) { + const { data } = res; + // console.log('Github data', data); + this.setState({ [stateMap[type]]: data }); + const saveResult = await setLocalStorage(storageMap[type], data); + if (saveResult != 'ok') { Alert.alert('Error', JSON.stringify(saveResult)); } + } } 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(); } } @@ -263,8 +277,8 @@ export default class index extends Component { // 對開課數據進行分類 getClassifyCourse = () => { - const { s_offerCourses } = this.state; - const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : s_offerCourses.Courses; + const { s_offerCourses, s_coursePlan } = this.state; + const offerCourseList = COURSE_MODE == 'ad' ? s_coursePlan.Courses : s_offerCourses.Courses; let { filterOptions } = this.state; // 開設課程的學院名列表 @@ -940,8 +954,9 @@ export default class index extends Component { // 返回搜索候選所需的課程列表 handleSearchFilterCourse = (inputText) => { - const { coursePlanList, s_offerCourses, } = this.state; - const offerCourseList = COURSE_MODE == 'ad' ? coursePlan.Courses : s_offerCourses.Courses; + 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 => { @@ -1022,6 +1037,54 @@ export default class index extends Component { > {/* 頁面標題欄 */} + {/* TODO: 提示按鈕,包括更新數據 */} + { + trigger(); + Alert.alert('ARK搵課提示', + `APP內Add Drop課表數據更新日期:${this.state.s_coursePlan.updateTime}\n\nAPP內選課表數據更新日期:${this.state.s_offerCourses.updateTime}\n\n如作者已上傳最新課表數據,可直接點擊下方按鈕更新!\n可附件最新的課表Excel,Email提醒作者更新!`, + [ + { + text: "更新Pre Enroll數據", + onPress: () => { + 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')} + > + 更新課表時間 + + + this.updateLocalCourseData('offerCourses')} > - {`點我更新${'01-02'}課表`} + 更新預選課 - )} + } <> @@ -1097,7 +1165,7 @@ export default class index extends Component { {`${COURSE_MODE == 'ad' ? '開設' : '預選'}課程:`} - 數據更新日期: {COURSE_MODE == 'ad' ? coursePlan.updateTime : this.state.s_offerCourses.updateTime} + 數據更新日期: {COURSE_MODE == 'ad' ? this.state.s_coursePlan.updateTime : this.state.s_offerCourses.updateTime} 記得更新APP以獲得最新數據~ From 0b728d34d2fac42710f372d07643add75eb3879e Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Mon, 29 Jul 2024 23:20:24 +0800 Subject: [PATCH 10/29] =?UTF-8?q?:art:=20=E8=AA=BF=E6=95=B4=E8=AA=B2?= =?UTF-8?q?=E7=A8=8B=E8=A9=B3=E6=83=85=E9=A0=81=E6=95=B8=E6=93=9A=E4=BE=86?= =?UTF-8?q?=E6=BA=90=E7=82=BA=E7=B7=A9=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TabbarPages/what2Reg/pages/LocalCourse.js | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js b/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js index ca99108f..e9602c0c 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 From 56d51f0e85a3539f98fc91e12b3ad89b01f49b21 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Mon, 29 Jul 2024 23:31:03 +0800 Subject: [PATCH 11/29] =?UTF-8?q?:art:=20=E8=AA=B2=E8=A1=A8=E6=A8=A1?= =?UTF-8?q?=E6=93=AC=E9=A0=81=E6=95=B8=E6=93=9A=E8=AA=BF=E6=95=B4=E7=82=BA?= =?UTF-8?q?=E7=B7=A9=E5=AD=98=E5=84=AA=E5=85=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/courseSim/index.js | 57 ++++++++++++++++-------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/src/pages/TabbarPages/courseSim/index.js b/src/pages/TabbarPages/courseSim/index.js index 9e3da05a..21e022bd 100644 --- a/src/pages/TabbarPages/courseSim/index.js +++ b/src/pages/TabbarPages/courseSim/index.js @@ -24,6 +24,7 @@ import Toast from 'react-native-simple-toast'; import { SafeAreaInsetsContext } from "react-native-safe-area-context"; import { t } from "i18next"; +import { getLocalStorage } from '../../../utils/storageKits'; import { COLOR_DIY, uiStyle, TIME_TABLE_COLOR, } from '../../../utils/uiMap'; import coursePlanTimeFile from '../../../static/UMCourses/coursePlanTime'; import coursePlanFile from '../../../static/UMCourses/coursePlan'; @@ -34,9 +35,6 @@ import { trigger } from "../../../utils/trigger"; const { themeColor, themeColorUltraLight, black, white, bg_color, unread, } = COLOR_DIY; const iconSize = scale(25); -const courseTimeList = coursePlanTimeFile.Courses; -const coursePlanList = coursePlanFile.Courses; - const dayList = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']; // 設置本地緩存 @@ -88,21 +86,6 @@ function parseImportData(inputText) { } } -// 返回搜索候選所需的課程列表 -handleSearchFilterCourse = (inputText) => { - 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,24 @@ 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' }); + 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 }); + } + const strCourseCodeList = await AsyncStorage.getItem('ARK_Timetable_Storage'); const courseCodeList = strCourseCodeList ? JSON.parse(strCourseCodeList) : null; @@ -161,6 +157,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 +755,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 ( From e1350470532862361e23612ded6f358f5a3ec766 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:09:50 +0800 Subject: [PATCH 12/29] =?UTF-8?q?:art:=20=E8=A8=AD=E5=AE=9A=E9=81=B8?= =?UTF-8?q?=E8=AA=B2=E9=A0=81=E6=9B=B4=E6=96=B0=E6=95=B8=E6=93=9A=E6=BA=90?= =?UTF-8?q?=E7=82=BAmaster=E5=88=86=E6=94=AF=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=B5=90=E6=9D=9FToast=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/what2Reg/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/TabbarPages/what2Reg/index.js b/src/pages/TabbarPages/what2Reg/index.js index 435f08cb..bd3ffd03 100644 --- a/src/pages/TabbarPages/what2Reg/index.js +++ b/src/pages/TabbarPages/what2Reg/index.js @@ -35,6 +35,7 @@ import TouchableScale from "react-native-touchable-scale"; import { SafeAreaInsetsContext } from "react-native-safe-area-context"; import { MenuView } from '@react-native-menu/menu'; import moment from 'moment'; +import Toast from 'react-native-simple-toast'; const { themeColor, themeColorUltraLight, black, white, viewShadow, disabled } = COLOR_DIY; const iconSize = scale(25); @@ -248,7 +249,7 @@ export default class index extends Component { }; try { - const res = await axios.get(`https://raw.githubusercontent.com/UM-ARK/UM-All-Frontend/jsonUpdateTest/src/static/UMCourses/${fileNameMap[type]}.json`) + 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; // console.log('Github data', data); @@ -261,6 +262,7 @@ export default class index extends Component { '自動連線至Github更新課程數據失敗,\n請檢查網絡再試!\n如果你正連接中國內地網絡,\n你可能需要一個梯子,\n請等待軟件更新數據或與作者反饋\nQAQ...' , null, { cancelable: true }) } finally { + Toast.show(`已拉取更新!`); // TODO: 每日任務的最後寫入更新日期到緩存 // const strToday = moment().format("YYYY-MM-DD"); // const saveResult = await setLocalStorage('course_file_check_date', strToday); From 3c03f01259b23e3df89ddd862e572e151b71608a Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:26:07 +0800 Subject: [PATCH 13/29] =?UTF-8?q?:art:=20=E5=88=AA=E9=99=A4=E4=B8=BB?= =?UTF-8?q?=E9=A0=81=E5=BF=AB=E6=8D=B7=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=B5=84?= =?UTF-8?q?=E7=B9=94=E7=99=BB=E5=85=A5=E7=A7=BB=E5=8B=95=E5=88=B0=E6=9C=8D?= =?UTF-8?q?=E5=8B=99=E9=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/features/index.js | 23 +++++++++++++++++- src/pages/TabbarPages/info/home/index.js | 30 +++++++++++++----------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/pages/TabbarPages/features/index.js b/src/pages/TabbarPages/features/index.js index 6a79e39f..5955031e 100644 --- a/src/pages/TabbarPages/features/index.js +++ b/src/pages/TabbarPages/features/index.js @@ -67,7 +67,7 @@ const iconTypes = { img: 'img', }; -const { themeColor } = COLOR_DIY; +const { themeColor, white } = COLOR_DIY; const iconSize = scale(25); @@ -801,6 +801,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/home/index.js b/src/pages/TabbarPages/info/home/index.js index c4e2db32..24c3622b 100644 --- a/src/pages/TabbarPages/info/home/index.js +++ b/src/pages/TabbarPages/info/home/index.js @@ -752,20 +752,22 @@ class HomeScreen extends Component { } {/* 快捷功能圖標 */} - this.GetFunctionIcon(item)} - showsVerticalScrollIndicator={false} - scrollEnabled={false} - /> + {false && + this.GetFunctionIcon(item)} + showsVerticalScrollIndicator={false} + scrollEnabled={false} + /> + } {/* 更新提示 */} { From 541fcba028fd9e5b9969b3a6b2c69f8e836e704b Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:51:45 +0800 Subject: [PATCH 14/29] =?UTF-8?q?:sparkles:=20=E6=9B=B4=E6=96=B02425?= =?UTF-8?q?=E5=AD=B8=E5=B9=B4=E6=A0=A1=E6=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/static/UMCalendar/UMCalendar.js | 662 ++++++++++++++-------------- 2 files changed, 335 insertions(+), 329 deletions(-) diff --git a/README.md b/README.md index ee2f7642..d2113acb 100644 --- a/README.md +++ b/README.md @@ -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/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": "夏季學期的最後一天" } From a471e5a1a2da1f25fba717875f45b65587623278 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 01:28:28 +0800 Subject: [PATCH 15/29] =?UTF-8?q?:art:=20=E5=88=AA=E9=99=A4=E8=AA=B2?= =?UTF-8?q?=E7=A8=8B=E5=8D=A1=E7=89=87PreEnroll=E6=A8=99=E8=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../what2Reg/component/CourseCard.js | 6 +++--- src/pages/TabbarPages/what2Reg/index.js | 18 +++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) 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} */} { trigger(); @@ -999,8 +999,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) => ヾ(o・ω・)ノ 拿走不謝~ - + ) : (<> {/* 篩選列表 */} @@ -1154,9 +1152,7 @@ export default class index extends Component { {/* 渲染篩選出的課程 */} {filterCourseList && filterCourseList.length > 0 ? ( - + ) : null} )} @@ -1170,7 +1166,7 @@ export default class index extends Component { 數據更新日期: {COURSE_MODE == 'ad' ? this.state.s_coursePlan.updateTime : this.state.s_offerCourses.updateTime} - 記得更新APP以獲得最新數據~ + 記得更新APP或右上角手動更新以獲得最新數據~ 遇到BUG可聯繫umacark@gmail.com From d487c4f0d526125e954cbd6ef71dbebd41184138 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 01:34:35 +0800 Subject: [PATCH 16/29] =?UTF-8?q?:sparkles:=20=E6=9B=B4=E6=96=B0=E5=AE=98?= =?UTF-8?q?=E6=96=B9=E6=9F=A5=E8=AA=B2URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/pathMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/pathMap.js b/src/utils/pathMap.js index 8dc97d2f..7c5128a6 100644 --- a/src/utils/pathMap.js +++ b/src/utils/pathMap.js @@ -31,7 +31,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) { From dbc3f0731b508c497b4b3e08b4e66c54cb424fe6 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 01:46:08 +0800 Subject: [PATCH 17/29] =?UTF-8?q?:art:=20=E4=BF=AE=E6=94=B9Token=E7=82=BA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=BC=95=E7=94=A8=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E5=86=8D=E4=B9=9F=E4=B8=8D=E7=94=A8=E9=A1=8D=E5=A4=96discard?= =?UTF-8?q?=20pathmap=E6=96=87=E4=BB=B6=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++++- src/utils/pathMap.js | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) 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/src/utils/pathMap.js b/src/utils/pathMap.js index 7c5128a6..4377035c 100644 --- a/src/utils/pathMap.js +++ b/src/utils/pathMap.js @@ -1,3 +1,5 @@ +import UMAPITOKEN from "../../umAPIToken.json"; + // 網站地址映射 // 服務器基地址,其他分地址可以直接寫'/bus'、'/login' @@ -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 // 澳大 - 環校巴士報站 From 1cd99ed4ac88de61136038a14085d1f90dec94ab Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:25:12 +0800 Subject: [PATCH 18/29] =?UTF-8?q?:sparkles:=20=E9=A6=96=E9=A0=81=E7=A4=BE?= =?UTF-8?q?=E5=9C=98=E6=B4=BB=E5=8B=95=E4=B8=8B=E6=BB=91=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E5=8A=A0=E8=BC=89=E6=96=B0=E4=B8=80=E9=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/info/home/EventPage.js | 24 ++++---------------- src/pages/TabbarPages/info/home/index.js | 24 +++++++++++++++++++- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/pages/TabbarPages/info/home/EventPage.js b/src/pages/TabbarPages/info/home/EventPage.js index 186fd013..e93e4cc8 100644 --- a/src/pages/TabbarPages/info/home/EventPage.js +++ b/src/pages/TabbarPages/info/home/EventPage.js @@ -250,25 +250,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 24c3622b..b43b3b1e 100644 --- a/src/pages/TabbarPages/info/home/index.js +++ b/src/pages/TabbarPages/info/home/index.js @@ -139,6 +139,8 @@ const toastKaomojiArr = [ const calItemWidth = scale(44.5); +let isLoadMore = false; + class HomeScreen extends Component { toastTimer = null; calScrollRef = React.createRef(null); @@ -619,6 +621,25 @@ 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) { + // console.log('已到底'); + const thisFunc = this.eventPage.current; + if (!thisFunc.state.noMoreData) { + isLoadMore = true; + thisFunc.loadMoreData(); + // 延時鎖,避免到底觸發過多次 + setTimeout(() => { + isLoadMore = false; + }, 1000); + } + } + }; + render() { const { selectDay, isLoading } = this.state; return ( @@ -650,7 +671,8 @@ class HomeScreen extends Component { } alwaysBounceHorizontal={false} ref={this.scrollView} - showsVerticalScrollIndicator={false} + showsVerticalScrollIndicator={true} + onScroll={this.handleScroll} > {/* 校曆列表 */} From 31344b729cc60fb8f18eb846c63c6b62c0bdf0c0 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:10:01 +0800 Subject: [PATCH 19/29] =?UTF-8?q?:art:=20=E9=A6=96=E9=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0ARK=20ALL=E5=A4=A7=E6=A8=99=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/info/home/index.js | 32 +++++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/pages/TabbarPages/info/home/index.js b/src/pages/TabbarPages/info/home/index.js index b43b3b1e..eb09fcb8 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為當前渲染到的下標 @@ -674,10 +675,31 @@ class HomeScreen extends Component { showsVerticalScrollIndicator={true} onScroll={this.handleScroll} > + + {/* ARK Logo */} + + ARK ALL 澳大方舟 + {/* 校曆列表 */} {cal && cal.length > 0 ? ( - + 網絡錯誤,請手動刷新! - ) : (<> - 各組織可自行操作發佈活動! 立即進駐ARK! - )} + ) : null + // (<> + // 各組織可自行操作發佈活動! 立即進駐ARK! + // ) + } From be8d28fce885d9bc7eab57539043f5cf6e8e0677 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:13:32 +0800 Subject: [PATCH 20/29] =?UTF-8?q?:art:=20=E5=A4=B1=E7=89=A9=E8=AA=8D?= =?UTF-8?q?=E9=A0=98=E5=8A=9F=E8=83=BD=E6=94=B9=E7=82=BAWebview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/features/index.js | 15 ++++++++++++++- src/utils/pathMap.js | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pages/TabbarPages/features/index.js b/src/pages/TabbarPages/features/index.js index 5955031e..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"; @@ -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的鏈接進行跳轉 diff --git a/src/utils/pathMap.js b/src/utils/pathMap.js index 4377035c..49d80147 100644 --- a/src/utils/pathMap.js +++ b/src/utils/pathMap.js @@ -212,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'; // 澳大 - 職位空缺系統 From 7982ca656602c30401a1be0be40fc580a6439e55 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:00:36 +0800 Subject: [PATCH 21/29] =?UTF-8?q?:sparkles:=20=E8=AA=BF=E6=95=B4=E5=AE=89?= =?UTF-8?q?=E5=8D=93build=E7=9B=AE=E6=A8=99API=E7=82=BA34?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From e8b157f9dc0b743329a6f77921787a6b64734313 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:01:05 +0800 Subject: [PATCH 22/29] =?UTF-8?q?:art:=20=E4=BD=BF=E6=BE=B3=E5=A4=A7?= =?UTF-8?q?=E6=B4=BB=E5=8B=95=E9=A0=81=E5=81=B4=E9=82=8A=E6=BB=BE=E5=8B=95?= =?UTF-8?q?=E6=A2=9D=E5=8F=AF=E8=A6=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/info/UMEventPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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()} Date: Tue, 30 Jul 2024 16:11:21 +0800 Subject: [PATCH 23/29] =?UTF-8?q?:apple:=20=E4=BF=AE=E5=BE=A9=E9=A6=96?= =?UTF-8?q?=E9=A0=81=E8=87=AA=E5=8B=95=E5=8A=A0=E8=BC=89=E6=96=B0=E4=B8=80?= =?UTF-8?q?=E9=A0=81=E5=9C=A8iOS=E4=B8=8A=E7=9A=84=E8=A7=B8=E5=BA=95BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/info/home/EventPage.js | 34 +++++++++++--------- src/pages/TabbarPages/info/home/index.js | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/pages/TabbarPages/info/home/EventPage.js b/src/pages/TabbarPages/info/home/EventPage.js index e93e4cc8..0204cafb 100644 --- a/src/pages/TabbarPages/info/home/EventPage.js +++ b/src/pages/TabbarPages/info/home/EventPage.js @@ -23,26 +23,23 @@ import { scale } from 'react-native-size-matters'; const { black, white, themeColor, viewShadow, bg_color } = COLOR_DIY; -// 返回數據的頁數 -let dataPage = 1; let eventDataList = []; class EventPage extends Component { state = { + // 返回數據的頁數 + dataPage: 1, leftDataList: [], rightDataList: [], isLoading: true, noMoreData: false, }; - componentDidMount() { - this.getData(); - } - - componentWillUnmount() { - dataPage = 1; + async componentDidMount() { + await this.getData(); } getData = async () => { + 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 = () => { diff --git a/src/pages/TabbarPages/info/home/index.js b/src/pages/TabbarPages/info/home/index.js index eb09fcb8..383c0e9d 100644 --- a/src/pages/TabbarPages/info/home/index.js +++ b/src/pages/TabbarPages/info/home/index.js @@ -628,7 +628,6 @@ class HomeScreen extends Component { // 接近底部時,獲取更多數據 if (isCloseToBottom && !isLoadMore) { - // console.log('已到底'); const thisFunc = this.eventPage.current; if (!thisFunc.state.noMoreData) { isLoadMore = true; @@ -674,6 +673,7 @@ class HomeScreen extends Component { ref={this.scrollView} showsVerticalScrollIndicator={true} onScroll={this.handleScroll} + scrollEventThrottle={400} > Date: Tue, 30 Jul 2024 16:11:43 +0800 Subject: [PATCH 24/29] =?UTF-8?q?:apple:=20=E5=AE=89=E8=A3=9DiOS=E7=9A=84p?= =?UTF-8?q?od=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Podfile.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) 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 From 5a8c0b16ce7a712b883acc86492ae7daf669acde Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:38:05 +0800 Subject: [PATCH 25/29] =?UTF-8?q?:art:=20=E8=AA=B2=E8=A1=A8=E6=89=8B?= =?UTF-8?q?=E5=8B=95=E6=9B=B4=E6=96=B0=E5=BE=8C=E6=8F=90=E7=A4=BA=E9=87=8D?= =?UTF-8?q?=E5=95=9FAPP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/courseSim/index.js | 31 +++++++++++++++++------- src/pages/TabbarPages/what2Reg/index.js | 24 ++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/pages/TabbarPages/courseSim/index.js b/src/pages/TabbarPages/courseSim/index.js index 21e022bd..52df4670 100644 --- a/src/pages/TabbarPages/courseSim/index.js +++ b/src/pages/TabbarPages/courseSim/index.js @@ -118,15 +118,7 @@ export default class courseSim extends Component { async componentDidMount() { logToFirebase('openPage', { page: 'courseSim' }); - 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 }); - } + await this.readLocalCourseData(); const strCourseCodeList = await AsyncStorage.getItem('ARK_Timetable_Storage'); const courseCodeList = strCourseCodeList ? JSON.parse(strCourseCodeList) : null; @@ -145,6 +137,27 @@ export default class courseSim extends Component { this.keyboardDidHideListener.remove(); } + // 讀取本地緩存的課表數據 + 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 () => { // 使输入框失去焦点 diff --git a/src/pages/TabbarPages/what2Reg/index.js b/src/pages/TabbarPages/what2Reg/index.js index 3b58c967..5611426f 100644 --- a/src/pages/TabbarPages/what2Reg/index.js +++ b/src/pages/TabbarPages/what2Reg/index.js @@ -36,6 +36,7 @@ import { SafeAreaInsetsContext } from "react-native-safe-area-context"; import { MenuView } from '@react-native-menu/menu'; import moment from 'moment'; import Toast from 'react-native-simple-toast'; +import RNRestart from 'react-native-restart'; const { themeColor, themeColorUltraLight, black, white, viewShadow, disabled, secondThemeColor } = COLOR_DIY; const iconSize = scale(25); @@ -252,17 +253,26 @@ export default class index extends Component { 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; - // console.log('Github data', data); 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...' , null, { cancelable: true }) } finally { - Toast.show(`已拉取更新!`); // TODO: 每日任務的最後寫入更新日期到緩存 // const strToday = moment().format("YYYY-MM-DD"); // const saveResult = await setLocalStorage('course_file_check_date', strToday); @@ -1052,23 +1062,23 @@ export default class index extends Component { onPress={() => { trigger(); Alert.alert('ARK搵課提示', - `APP內Add Drop課表數據更新日期:${this.state.s_coursePlan.updateTime}\n\nAPP內選課表數據更新日期:${this.state.s_offerCourses.updateTime}\n\n如作者已上傳最新課表數據,可直接點擊下方按鈕更新!\n可附件最新的課表Excel,Email提醒作者更新!`, + `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: () => { - this.updateLocalCourseData('offerCourses'); + onPress: async () => { + await this.updateLocalCourseData('offerCourses'); }, }, { text: "更新Add Drop數據", onPress: async () => { try { - await this.updateLocalCourseData('coursePlan') + await this.updateLocalCourseData('coursePlan'); } catch (error) { alert(JSON.stringify(error)); } finally { - await this.updateLocalCourseData('coursePlanTime') + await this.updateLocalCourseData('coursePlanTime'); } }, }, From 3a2a36f60611241154d4f42b3eed2cfb14cdcd70 Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:38:50 +0800 Subject: [PATCH 26/29] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9E=E9=81=B8?= =?UTF-8?q?=E8=AA=B2=E9=A0=81=E4=B8=80=E9=8D=B5=E6=B7=BB=E5=8A=A0=E8=AA=B2?= =?UTF-8?q?=E7=A8=8B=E5=88=B0=E8=AA=B2=E8=A1=A8=E6=A8=A1=E6=93=AC=E9=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/courseSim/index.js | 17 +++++++++++++++++ .../TabbarPages/what2Reg/pages/LocalCourse.js | 19 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/pages/TabbarPages/courseSim/index.js b/src/pages/TabbarPages/courseSim/index.js index 52df4670..6002dbad 100644 --- a/src/pages/TabbarPages/courseSim/index.js +++ b/src/pages/TabbarPages/courseSim/index.js @@ -127,16 +127,33 @@ 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'); diff --git a/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js b/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js index e9602c0c..f7fbb11c 100644 --- a/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js +++ b/src/pages/TabbarPages/what2Reg/pages/LocalCourse.js @@ -137,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; } @@ -152,6 +166,11 @@ export default class LocalCourse extends Component { title: '查 選咩課', titleColor: black.third, }, + { + id: 'add', + title: '添加至模擬課表', + titleColor: black.third, + }, ]} shouldOpenOnLongPress={false} > From b4d234f61d859e4cc3a6f855cf3b16b7f0aea11e Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:44:24 +0800 Subject: [PATCH 27/29] =?UTF-8?q?:art:=20=E8=AA=BF=E6=95=B4=E9=97=9C?= =?UTF-8?q?=E6=96=BC=E9=A0=81=E8=AA=B2=E8=A1=A8=E6=97=A5=E6=9C=9F=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E7=82=BA=E5=84=AA=E5=85=88=E7=B7=A9=E5=AD=98=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TabbarPages/info/AboutPage.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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} From d1b5edf2c2c4b63775133356cb307c85b51579cf Mon Sep 17 00:00:00 2001 From: yyyyyyounger <55580370+yyyyyyounger@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:52:38 +0800 Subject: [PATCH 28/29] =?UTF-8?q?:rocket:=20=E6=9B=B4=E6=96=B0package?= =?UTF-8?q?=E5=92=8C=E5=AE=89=E5=8D=93=E7=89=88=E6=9C=AC=E8=99=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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/package.json b/package.json index b4f4052c..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", From 7d7ca8c0cb87bf08030c6b1b4dcaa8762710e130 Mon Sep 17 00:00:00 2001 From: "Rookie, LIN" <1049825685@qq.com> Date: Wed, 31 Jul 2024 12:21:11 +0800 Subject: [PATCH 29/29] =?UTF-8?q?:rocket:=20=E6=9B=B4=E6=96=B0iOS=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E8=99=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/UMALL.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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",