diff --git a/app/(app)/(tabs)/profile/_layout.tsx b/app/(app)/(tabs)/profile/_layout.tsx
index 6246b78..a0c90d3 100644
--- a/app/(app)/(tabs)/profile/_layout.tsx
+++ b/app/(app)/(tabs)/profile/_layout.tsx
@@ -17,6 +17,7 @@ export default function ProfileStackLayout() {
+
diff --git a/app/(app)/(tabs)/profile/help.tsx b/app/(app)/(tabs)/profile/help.tsx
new file mode 100644
index 0000000..f11d8f1
--- /dev/null
+++ b/app/(app)/(tabs)/profile/help.tsx
@@ -0,0 +1,5 @@
+import { HelpScreen } from '../../../../src/screens/profile';
+
+export default function HelpRoute() {
+ return ;
+}
diff --git a/package-lock.json b/package-lock.json
index 54b1856..a02534f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
"name": "with_you",
"version": "1.0.1",
"dependencies": {
- "@expo/ui": "~56.0.17",
+ "@expo/ui": "~56.0.18",
"@expo/vector-icons": "^15.1.1",
"@livekit/react-native": "^2.11.0",
"@livekit/react-native-webrtc": "^144.1.0",
@@ -18,31 +18,31 @@
"@types/react": "~19.2.14",
"axios": "^1.16.1",
"date-fns": "^4.4.0",
- "expo": "~56.0.11",
- "expo-background-task": "~56.0.18",
+ "expo": "~56.0.12",
+ "expo-background-task": "~56.0.19",
"expo-callkit-telecom": "^0.3.9",
"expo-camera": "~56.0.8",
"expo-constants": "~56.0.18",
"expo-dev-client": "~56.0.20",
"expo-document-picker": "~56.0.4",
"expo-file-system": "~56.0.8",
- "expo-font": "~56.0.6",
+ "expo-font": "~56.0.7",
"expo-haptics": "~56.0.3",
"expo-image": "~56.0.6",
- "expo-image-picker": "~56.0.17",
+ "expo-image-picker": "~56.0.18",
"expo-intent-launcher": "~56.0.4",
"expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.14",
"expo-media-library": "~56.0.7",
- "expo-notifications": "~56.0.17",
- "expo-router": "~56.2.10",
+ "expo-notifications": "~56.0.18",
+ "expo-router": "~56.2.11",
"expo-splash-screen": "~56.0.10",
"expo-sqlite": "~56.0.5",
"expo-status-bar": "~56.0.4",
"expo-system-ui": "~56.0.5",
- "expo-task-manager": "~56.0.18",
+ "expo-task-manager": "~56.0.19",
"expo-updates": "~56.0.19",
- "expo-video": "~56.1.3",
+ "expo-video": "~56.1.4",
"jcore-react-native": "^2.3.6",
"jpush-react-native": "^3.2.7",
"katex": "^0.17.0",
@@ -1427,12 +1427,12 @@
}
},
"node_modules/@expo/config-plugins": {
- "version": "56.0.8",
- "resolved": "https://registry.npmmirror.com/@expo/config-plugins/-/config-plugins-56.0.8.tgz",
- "integrity": "sha512-phTuyBhgVLfqUHMjQkAfRtbyoY6yTxoKja1awtpVnEkoJDxPJuXx1KX5uvq1eZtt4bJQ08OBJ6P95INqRSHpRg==",
+ "version": "56.0.9",
+ "resolved": "https://registry.npmmirror.com/@expo/config-plugins/-/config-plugins-56.0.9.tgz",
+ "integrity": "sha512-/6a/S9USwx8OC9tGjHxbviLFiBHyueN3aoNWMLvWDEJoZ1CIVW800ZBzwXq/FYNK2qzcN1LxFmQtzD1zeFQKNA==",
"license": "MIT",
"dependencies": {
- "@expo/config-types": "^56.0.5",
+ "@expo/config-types": "^56.0.6",
"@expo/json-file": "~10.2.0",
"@expo/plist": "^0.7.0",
"@expo/require-utils": "^56.1.3",
@@ -1460,9 +1460,9 @@
}
},
"node_modules/@expo/config-types": {
- "version": "56.0.5",
- "resolved": "https://registry.npmmirror.com/@expo/config-types/-/config-types-56.0.5.tgz",
- "integrity": "sha512-GsAHO/MwW9ZRdgnmyfRXqVGLCP/zejD6rWnp5OROp8mBGRObKm4HfrjlUyT1skjMwCj1OrURx9ZfIc6yeBAkIA==",
+ "version": "56.0.6",
+ "resolved": "https://registry.npmmirror.com/@expo/config-types/-/config-types-56.0.6.tgz",
+ "integrity": "sha512-4Y6Aum5J4Re5NnxGVofRNe1aDwUBOmWhQYkynZsqzRtX/zEA1ADUeyHXuEckv9YD9djiyT7bKtLt5gKL3mA6VQ==",
"license": "MIT"
},
"node_modules/@expo/config/node_modules/semver": {
@@ -1610,12 +1610,12 @@
}
},
"node_modules/@expo/inline-modules": {
- "version": "0.0.11",
- "resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.11.tgz",
- "integrity": "sha512-ZlIfKL61DPnW8YUTdMEjMA31xrDDV6p7Xi8rWYyhd5qXBV8MwGwjuJ7vKeaVaMjRqxJk1N9lv7zlfyvQpRCNNw==",
+ "version": "0.0.12",
+ "resolved": "https://registry.npmmirror.com/@expo/inline-modules/-/inline-modules-0.0.12.tgz",
+ "integrity": "sha512-SNIZr/HWfIQPTZBwmukItxpc7ws1SgMUywYq1dnQvDknQDjJcuWAasIRFUjsK15yQ1xb4G5CP7VHtbN3V4lENg==",
"license": "MIT",
"dependencies": {
- "@expo/config-plugins": "~56.0.8"
+ "@expo/config-plugins": "~56.0.9"
}
},
"node_modules/@expo/json-file": {
@@ -1953,27 +1953,27 @@
}
},
"node_modules/@expo/prebuild-config": {
- "version": "56.0.15",
- "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.15.tgz",
- "integrity": "sha512-6GC+QjdCkzp/5wjsqgfu/B2+2yf5MyZMtzf9szIPrLt9uKhzV2PdyM0vU0kvbj1YT8weHCtO7bsrzimman0sjA==",
+ "version": "56.0.16",
+ "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-56.0.16.tgz",
+ "integrity": "sha512-ce9ENfPWO4WUWUVQz0OaqL3KYZ7YofP8O35ncnn7CHCaKwQ7BqxcCGJbh+qvP1UjlWeNB3CjHPrXXJ3bnZwlJw==",
"license": "MIT",
"dependencies": {
"@expo/config": "~56.0.9",
- "@expo/config-plugins": "~56.0.8",
- "@expo/config-types": "^56.0.5",
+ "@expo/config-plugins": "~56.0.9",
+ "@expo/config-types": "^56.0.6",
"@expo/image-utils": "^0.10.1",
"@expo/json-file": "^10.2.0",
"@react-native/normalize-colors": "0.85.3",
"debug": "^4.3.1",
- "expo-modules-autolinking": "~56.0.15",
+ "expo-modules-autolinking": "~56.0.16",
"resolve-from": "^5.0.0",
"semver": "^7.6.0"
}
},
"node_modules/@expo/prebuild-config/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2032,9 +2032,9 @@
"license": "MIT"
},
"node_modules/@expo/ui": {
- "version": "56.0.17",
- "resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.17.tgz",
- "integrity": "sha512-Jos9oGzurMDngrSWJesX3LSykPRvkUdANxtq2sPKBc6bAjadtZJCkthAYMaE3P9L5xrzbNRFo+2O76cRP0iYPw==",
+ "version": "56.0.18",
+ "resolved": "https://registry.npmmirror.com/@expo/ui/-/ui-56.0.18.tgz",
+ "integrity": "sha512-2XgH5obigGtXm8zlb/V3g87NSiIcBcJ1xoQOEQYPoExL1DCNsHzaIecTh1XG/f/45ardo4OZNJwpbfYJ9X3qrQ==",
"license": "MIT",
"dependencies": {
"sf-symbols-typescript": "^2.1.0",
@@ -6400,15 +6400,15 @@
}
},
"node_modules/expo": {
- "version": "56.0.11",
- "resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.11.tgz",
- "integrity": "sha512-YqF+q+JqfobDU5yFym3h1vQqzbl7rFiDB4wAJEyK6NK+KLeyf4pfzydQcNTyqLXQKcQBG1reBJExfDShoAYTzw==",
+ "version": "56.0.12",
+ "resolved": "https://registry.npmmirror.com/expo/-/expo-56.0.12.tgz",
+ "integrity": "sha512-FxgdI/Yqva6iJOThZIHfvxlKPxs4EC4uScUnEswwSArR/Fj9k430O13R590LcOQTsdNsjIs+GBHwjfoAY6vmAQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.20.0",
- "@expo/cli": "^56.1.15",
+ "@expo/cli": "^56.1.16",
"@expo/config": "~56.0.9",
- "@expo/config-plugins": "~56.0.8",
+ "@expo/config-plugins": "~56.0.9",
"@expo/devtools": "~56.0.2",
"@expo/dom-webview": "~56.0.5",
"@expo/fingerprint": "^0.19.4",
@@ -6421,10 +6421,10 @@
"expo-asset": "~56.0.17",
"expo-constants": "~56.0.18",
"expo-file-system": "~56.0.8",
- "expo-font": "~56.0.6",
+ "expo-font": "~56.0.7",
"expo-keep-awake": "~56.0.3",
- "expo-modules-autolinking": "~56.0.15",
- "expo-modules-core": "~56.0.16",
+ "expo-modules-autolinking": "~56.0.16",
+ "expo-modules-core": "~56.0.17",
"pretty-format": "^29.7.0",
"react-refresh": "^0.14.2",
"whatwg-url-minimum": "^0.1.2"
@@ -6486,12 +6486,12 @@
}
},
"node_modules/expo-background-task": {
- "version": "56.0.18",
- "resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.18.tgz",
- "integrity": "sha512-jfEvLq/hZUWkef+lOt0sbe/Jd8wnK0fMgqsZhD1ulWk1IKB0AWsjmJ0iCTDMD9L9MDztpvKf2g/ygzljmo2eGA==",
+ "version": "56.0.19",
+ "resolved": "https://registry.npmmirror.com/expo-background-task/-/expo-background-task-56.0.19.tgz",
+ "integrity": "sha512-TuFqorlz4HXtWAwQGcg+/URXpBwjwNsAxdis/6m5mhtgBIVbX2gYYv/s6eIf8lh2cAI1zFkb+/bHHuC2aOAGGA==",
"license": "MIT",
"dependencies": {
- "expo-task-manager": "~56.0.18"
+ "expo-task-manager": "~56.0.19"
},
"peerDependencies": {
"expo": "*"
@@ -6622,9 +6622,9 @@
}
},
"node_modules/expo-font": {
- "version": "56.0.6",
- "resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.6.tgz",
- "integrity": "sha512-D4s72Aei844C2s8Vy61qMr6wLEjv6BMrXA1oyRQ0x8LJBbpm5gyogUohc0lABUURVLCqsnBIDdztegl3hktmmg==",
+ "version": "56.0.7",
+ "resolved": "https://registry.npmmirror.com/expo-font/-/expo-font-56.0.7.tgz",
+ "integrity": "sha512-hpU/vRwPzsby9lPGkA4blDqLIIXYzoWnCZHr6PxvcWbY/uPObAiyhh6q+e0WYsB65SthK+PLH95jEnVag7fwEg==",
"license": "MIT",
"dependencies": {
"fontfaceobserver": "^2.1.0"
@@ -6685,9 +6685,9 @@
}
},
"node_modules/expo-image-picker": {
- "version": "56.0.17",
- "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.17.tgz",
- "integrity": "sha512-/RojW1ptyQNV89hEeDdaoHCkn38+546MqakMyB0acFf0HLh5ZI7wxQCHkxr16qjuQMy11M+96GlX9Z6vgXF7Nw==",
+ "version": "56.0.18",
+ "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-56.0.18.tgz",
+ "integrity": "sha512-sCjQ8M27bhGUv2vUavIE+uWdYo79b2D7Q5h9B66BSDZ+Rd8YyLVSf7vYGfIzQ7nMVoENZ6c4xo/JiDkEeQ9iTg==",
"license": "MIT",
"dependencies": {
"expo-image-loader": "~56.0.3"
@@ -6769,9 +6769,9 @@
}
},
"node_modules/expo-modules-autolinking": {
- "version": "56.0.15",
- "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.15.tgz",
- "integrity": "sha512-WqpBFwLzn7DsrUkWltIjVmAjwuI1VdQ2jRMlvk1nh2kVadwdJBkSjUBQWRifsEePNhiMT/rFOovBolUU/ARt5w==",
+ "version": "56.0.16",
+ "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-56.0.16.tgz",
+ "integrity": "sha512-9JnL4N46P8ubDpDIfWolDn7nxU2j1rY67xY/dNVuyH0m+HG+r/JI16VYtjIf4COpZtEuFo4D3h3MBeFzGucMnw==",
"license": "MIT",
"dependencies": {
"@expo/require-utils": "^56.1.3",
@@ -6793,13 +6793,13 @@
}
},
"node_modules/expo-modules-core": {
- "version": "56.0.16",
- "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.16.tgz",
- "integrity": "sha512-IVdT0CnqOpQCPdemA5rb50CPbbhWeJePnvuH0yUmOmyMkNky8WVOdRQtVicoIv4CCG5hDrzPIxULD4YOHZ5CHg==",
+ "version": "56.0.17",
+ "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-56.0.17.tgz",
+ "integrity": "sha512-5J8whnT7Ccp+BrFClLmpF76omBqn95VZExroTm01Dgjm4vpty1Rb7U3we+ZUceNHtRd07Lw30u7FNfDgIhEbRQ==",
"license": "MIT",
"dependencies": {
"@expo/expo-modules-macros-plugin": "0.2.2",
- "expo-modules-jsi": "~56.0.9",
+ "expo-modules-jsi": "~56.0.10",
"invariant": "^2.2.4"
},
"peerDependencies": {
@@ -6814,18 +6814,18 @@
}
},
"node_modules/expo-modules-jsi": {
- "version": "56.0.9",
- "resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.9.tgz",
- "integrity": "sha512-2lfDkRcsP/Qh2upS+nu0MS0tfGsghc6ehTivzbgM5nJz0MGYhAJxCJSeendWM+aOQutQAwzsoxrNT0nW8lRAwA==",
+ "version": "56.0.10",
+ "resolved": "https://registry.npmmirror.com/expo-modules-jsi/-/expo-modules-jsi-56.0.10.tgz",
+ "integrity": "sha512-fHZcFpYO/o62GYa6fJyAQJZcAShzhoN0iMMDzbr7vD3ewET6e1vAlTonbEakN9F0VHEgBFJ4NREy87uwVcpCuA==",
"license": "MIT",
"peerDependencies": {
"react-native": "*"
}
},
"node_modules/expo-notifications": {
- "version": "56.0.17",
- "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.17.tgz",
- "integrity": "sha512-Yn6JUKmoBDkQeznbuUn4cHF2u44r1ErJTneW65MBFt7NLG8U8/VGQ4bBVwswm5nPH1/V92UoXPgvCssScPFRDg==",
+ "version": "56.0.18",
+ "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-56.0.18.tgz",
+ "integrity": "sha512-HHnrwyCLC5srFojcHYS2KskbNroy9o2fwPKdyhjrdjjrBu4sNRKm4LepcuZjDy98cZKEm89WIPW8O45vut8Rgw==",
"license": "MIT",
"dependencies": {
"@expo/image-utils": "^0.10.1",
@@ -6841,15 +6841,15 @@
}
},
"node_modules/expo-router": {
- "version": "56.2.10",
- "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.10.tgz",
- "integrity": "sha512-u7WcdsFAjSrQS7Bdb1VbNPE3xNcd/BZ6qXSS31UAJKhaYIb+ik3jJSy/W5kY3qKipwbwlo3CSb1WnZ2XYs7F+Q==",
+ "version": "56.2.11",
+ "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-56.2.11.tgz",
+ "integrity": "sha512-08DBTrKv3QanOc9u1JNxSEChW9c/qNFbQ0dO28OLvufWWfdSRkSdHmh365D2FgoZg1qaOzZPCDuL3tM6nGSfkQ==",
"license": "MIT",
"dependencies": {
"@expo/log-box": "^56.0.13",
"@expo/metro-runtime": "^56.0.15",
"@expo/schema-utils": "^56.0.0",
- "@expo/ui": "^56.0.17",
+ "@expo/ui": "^56.0.18",
"@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.12",
"@react-native-masked-view/masked-view": "^0.3.2",
@@ -7005,9 +7005,9 @@
}
},
"node_modules/expo-task-manager": {
- "version": "56.0.18",
- "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.18.tgz",
- "integrity": "sha512-abTKDhlZ572wSwNuZ9HkDw6rl+kKLq0TkqheIEbGoRkMQVEGV3D5GYYY0gg84TO/HvAqiipdcBFQH8+9uHj70Q==",
+ "version": "56.0.19",
+ "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-56.0.19.tgz",
+ "integrity": "sha512-eDeBR8vXlOAXBck29AzPl+tv4QlJus+cgkQ0TGOBqAlgRPWPWd7ebhqrhb0KRieUZIvzlycfcxjHR/+AiEiMHA==",
"license": "MIT",
"dependencies": {
"unimodules-app-loader": "~56.0.0"
@@ -7070,9 +7070,9 @@
"license": "MIT"
},
"node_modules/expo-video": {
- "version": "56.1.3",
- "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.3.tgz",
- "integrity": "sha512-Ht2BMdx11RnGKxILL/P4t/hl4kqWXq1vLaoOrLZlDed+IXgf8hdDI9jmtEEgsIHwf3jaHFXblJCRVuS9mIxKAw==",
+ "version": "56.1.4",
+ "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-56.1.4.tgz",
+ "integrity": "sha512-8mXZOnb7ZsWneDlcnRf0M2Ox9eb5dGnNiGiCkj9bwLPY+3jM2Pc1t5ymNUuhw8lSpT/rOnE0J0/81Y3+0k2Zcw==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7081,18 +7081,18 @@
}
},
"node_modules/expo/node_modules/@expo/cli": {
- "version": "56.1.15",
- "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.15.tgz",
- "integrity": "sha512-ik6++YzURB2d/mSEfYwbuNa19uOWZwVHy9THCQ/pPr6mzplKl4w9I4nlYF9lx7oluNC3NvxsSZ8/rgpVKEOJTA==",
+ "version": "56.1.16",
+ "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-56.1.16.tgz",
+ "integrity": "sha512-VBQn0mqAwc67b9Cn0RVXyeodghomAx5xGRhA/bXaQzuxDjMQk0zIOb6pXMZX7yiIwJW66UZt/zQiJNSv6aWJYw==",
"license": "MIT",
"dependencies": {
"@expo/code-signing-certificates": "^0.0.6",
"@expo/config": "~56.0.9",
- "@expo/config-plugins": "~56.0.8",
+ "@expo/config-plugins": "~56.0.9",
"@expo/devcert": "^1.2.1",
"@expo/env": "~2.3.0",
"@expo/image-utils": "^0.10.1",
- "@expo/inline-modules": "^0.0.11",
+ "@expo/inline-modules": "^0.0.12",
"@expo/json-file": "^10.2.0",
"@expo/log-box": "^56.0.13",
"@expo/metro": "~56.0.0",
@@ -7101,9 +7101,9 @@
"@expo/osascript": "^2.6.0",
"@expo/package-manager": "^1.12.1",
"@expo/plist": "^0.7.0",
- "@expo/prebuild-config": "^56.0.15",
+ "@expo/prebuild-config": "^56.0.16",
"@expo/require-utils": "^56.1.3",
- "@expo/router-server": "^56.0.13",
+ "@expo/router-server": "^56.0.14",
"@expo/schema-utils": "^56.0.0",
"@expo/spawn-async": "^1.8.0",
"@expo/ws-tunnel": "^2.0.0",
@@ -7368,9 +7368,9 @@
}
},
"node_modules/expo/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -11318,9 +11318,9 @@
}
},
"node_modules/npm-package-arg/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
diff --git a/package.json b/package.json
index d04aadc..4435e39 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
"test:watch": "jest --watch"
},
"dependencies": {
- "@expo/ui": "~56.0.17",
+ "@expo/ui": "~56.0.18",
"@expo/vector-icons": "^15.1.1",
"@livekit/react-native": "^2.11.0",
"@livekit/react-native-webrtc": "^144.1.0",
@@ -26,31 +26,31 @@
"@types/react": "~19.2.14",
"axios": "^1.16.1",
"date-fns": "^4.4.0",
- "expo": "~56.0.11",
- "expo-background-task": "~56.0.18",
+ "expo": "~56.0.12",
+ "expo-background-task": "~56.0.19",
"expo-callkit-telecom": "^0.3.9",
"expo-camera": "~56.0.8",
"expo-constants": "~56.0.18",
"expo-dev-client": "~56.0.20",
"expo-document-picker": "~56.0.4",
"expo-file-system": "~56.0.8",
- "expo-font": "~56.0.6",
+ "expo-font": "~56.0.7",
"expo-haptics": "~56.0.3",
"expo-image": "~56.0.6",
- "expo-image-picker": "~56.0.17",
+ "expo-image-picker": "~56.0.18",
"expo-intent-launcher": "~56.0.4",
"expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.14",
"expo-media-library": "~56.0.7",
- "expo-notifications": "~56.0.17",
- "expo-router": "~56.2.10",
+ "expo-notifications": "~56.0.18",
+ "expo-router": "~56.2.11",
"expo-splash-screen": "~56.0.10",
"expo-sqlite": "~56.0.5",
"expo-status-bar": "~56.0.4",
"expo-system-ui": "~56.0.5",
- "expo-task-manager": "~56.0.18",
+ "expo-task-manager": "~56.0.19",
"expo-updates": "~56.0.19",
- "expo-video": "~56.1.3",
+ "expo-video": "~56.1.4",
"jcore-react-native": "^2.3.6",
"jpush-react-native": "^3.2.7",
"katex": "^0.17.0",
@@ -89,7 +89,12 @@
"expo": {
"install": {
"exclude": [
- "expo-image"
+ "expo-image",
+ "@react-native-async-storage/async-storage",
+ "@shopify/flash-list",
+ "react-native-pager-view",
+ "react-native-gesture-handler",
+ "react-native-safe-area-context"
]
}
}
diff --git a/src/navigation/hrefs.ts b/src/navigation/hrefs.ts
index 342e6eb..3025065 100644
--- a/src/navigation/hrefs.ts
+++ b/src/navigation/hrefs.ts
@@ -202,6 +202,10 @@ export function hrefProfileAbout(): string {
return '/profile/about';
}
+export function hrefProfileHelp(): string {
+ return '/profile/help';
+}
+
export function hrefProfileTerms(): string {
return '/terms';
}
diff --git a/src/screens/profile/HelpScreen.tsx b/src/screens/profile/HelpScreen.tsx
new file mode 100644
index 0000000..250e390
--- /dev/null
+++ b/src/screens/profile/HelpScreen.tsx
@@ -0,0 +1,397 @@
+/**
+ * 帮助与反馈页面 HelpScreen
+ * 威友 - 常见问题、官方联系方式
+ * 扁平化设计风格,可折叠问答,参考关于我们、设置页面
+ */
+
+import React, { useMemo, useState, useCallback } from 'react';
+import {
+ View,
+ StyleSheet,
+ TouchableOpacity,
+ ScrollView,
+ Linking,
+ Alert,
+} from 'react-native';
+import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
+import { MaterialCommunityIcons } from '@expo/vector-icons';
+import { StatusBar } from 'expo-status-bar';
+import { useRouter } from 'expo-router';
+import {
+ useAppColors,
+ spacing,
+ fontSizes,
+ borderRadius,
+ type AppColors,
+} from '../../theme';
+import { Text, SimpleHeader } from '../../components/common';
+import { useResponsive, useResponsiveSpacing } from '../../hooks';
+
+const CONTENT_MAX_WIDTH = 720;
+
+// 威友橙主题色
+const THEME_COLORS = {
+ primary: '#FF6B35',
+ primaryLight: '#FFF1EA',
+};
+
+// 官方联系邮箱
+const CONTACT_EMAIL = 'system@qczlit.cn';
+
+interface FAQItem {
+ q: string;
+ a: string;
+ /** 补充提示(如注意事项),与正文区分展示 */
+ note?: string;
+}
+
+interface FAQSection {
+ key: string;
+ title: string;
+ icon: string;
+ items: FAQItem[];
+}
+
+// 常见问题内容
+const FAQ_SECTIONS: FAQSection[] = [
+ {
+ key: 'account',
+ title: '账号与认证',
+ icon: 'account-check-outline',
+ items: [
+ {
+ q: '如何通过身份认证?',
+ a: '进入「我的」页面,点击右上角齿轮状设置图标,选择「身份认证」。按提示填写学号/工号、真实姓名,并上传有效佐证材料。提交后通常等待 1-2 小时即可完成审核。',
+ },
+ {
+ q: '忘记密码怎么找回?',
+ a: '在登录页点击「忘记密码」,通过已绑定的手机号或校内邮箱进行重置。若均未绑定,请联系客服人工处理。',
+ },
+ {
+ q: '如何绑定手机号?',
+ a: '进入「我的」页面,点击「编辑资料」,选择「手机号」,输入手机号码并完成验证即可绑定。',
+ },
+ ],
+ },
+ {
+ key: 'campus',
+ title: '校园工具',
+ icon: 'school-outline',
+ items: [
+ {
+ q: '如何查看课表?',
+ a: '进入「应用」页面,点击「课表」,点击左上角齿轮状设置图标,选择「同步教务系统」。输入学号/工号及教务系统密码即可同步。',
+ note: '该密码与统一身份认证密码不同。如遗忘,可登录新教务系统,进入「个人中心」→「修改密码」进行重置,默认密码为身份证号码后 6 位。',
+ },
+ {
+ q: '如何查找学习资料?',
+ a: '进入「应用」页面,点击「学习资料」,可按学科分类浏览,也可点击右上角搜索图标快速查找所需资料。',
+ },
+ ],
+ },
+ {
+ key: 'notification',
+ title: '消息与通知',
+ icon: 'bell-outline',
+ items: [
+ {
+ q: '如何及时收到消息通知?',
+ a: '请先在手机系统「设置」→「通知管理」或「应用管理」中,找到本 App,开启通知权限及自启动/后台运行权限;然后进入 App 内「我的」页面,点击右上角齿轮状设置图标,进入「通知管理」,确认所需消息提醒均已开启。设置完成后重启 App 即可生效。',
+ },
+ ],
+ },
+];
+
+function createHelpStyles(colors: AppColors) {
+ return StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: colors.background.paper,
+ },
+ scrollContent: {
+ paddingVertical: spacing.lg,
+ },
+ content: {
+ maxWidth: CONTENT_MAX_WIDTH,
+ alignSelf: 'center',
+ width: '100%',
+ },
+
+ // 分组
+ section: {
+ marginBottom: spacing.xl,
+ },
+ sectionHeader: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ paddingHorizontal: spacing['2xl'],
+ marginBottom: spacing.sm,
+ marginTop: spacing.sm,
+ },
+ sectionIcon: {
+ width: 22,
+ height: 22,
+ borderRadius: borderRadius.sm,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginRight: spacing.sm,
+ },
+ sectionTitle: {
+ fontWeight: '600',
+ fontSize: fontSizes.sm,
+ color: colors.text.secondary,
+ textTransform: 'uppercase',
+ letterSpacing: 0.5,
+ },
+
+ // 问答卡片
+ faqList: {
+ backgroundColor: colors.background.paper,
+ borderTopWidth: StyleSheet.hairlineWidth,
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ borderColor: colors.divider,
+ overflow: 'hidden',
+ },
+ faqItem: {
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ borderBottomColor: colors.divider,
+ },
+ faqItemLast: {
+ borderBottomWidth: 0,
+ },
+ faqQuestion: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ paddingVertical: 16,
+ paddingHorizontal: spacing['2xl'],
+ },
+ questionText: {
+ flex: 1,
+ fontSize: fontSizes.lg,
+ fontWeight: '500',
+ color: colors.text.primary,
+ lineHeight: fontSizes.lg * 1.4,
+ },
+ faqAnswer: {
+ paddingHorizontal: spacing['2xl'],
+ paddingBottom: 16,
+ },
+ answerText: {
+ fontSize: fontSizes.md,
+ lineHeight: fontSizes.md * 1.7,
+ color: colors.text.secondary,
+ },
+
+ // 补充提示
+ noteContainer: {
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ marginTop: spacing.md,
+ padding: spacing.md,
+ backgroundColor: THEME_COLORS.primaryLight,
+ borderRadius: borderRadius.md,
+ gap: spacing.sm,
+ },
+ noteText: {
+ flex: 1,
+ fontSize: fontSizes.sm,
+ lineHeight: fontSizes.sm * 1.6,
+ color: colors.text.secondary,
+ },
+
+ // 联系我们
+ contactCard: {
+ marginHorizontal: spacing['2xl'],
+ marginTop: spacing.sm,
+ padding: spacing.xl,
+ borderRadius: borderRadius.xl,
+ backgroundColor: colors.background.default,
+ alignItems: 'center',
+ },
+ contactIconWrap: {
+ width: 52,
+ height: 52,
+ borderRadius: borderRadius.full,
+ backgroundColor: THEME_COLORS.primary,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginBottom: spacing.md,
+ },
+ contactTitle: {
+ fontSize: fontSizes.xl,
+ fontWeight: '600',
+ color: colors.text.primary,
+ marginBottom: spacing.xs,
+ },
+ contactDesc: {
+ fontSize: fontSizes.md,
+ color: colors.text.secondary,
+ textAlign: 'center',
+ marginBottom: spacing.lg,
+ lineHeight: fontSizes.md * 1.6,
+ },
+ contactButton: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingVertical: spacing.md,
+ paddingHorizontal: spacing.xl,
+ borderRadius: borderRadius.full,
+ backgroundColor: THEME_COLORS.primary,
+ gap: spacing.sm,
+ },
+ contactButtonText: {
+ fontSize: fontSizes.md,
+ fontWeight: '600',
+ color: '#fff',
+ },
+
+ // 底部版权
+ footer: {
+ alignItems: 'center',
+ marginTop: spacing.xl,
+ paddingBottom: spacing.xl,
+ },
+ footerText: {
+ fontSize: fontSizes.sm,
+ color: colors.text.hint,
+ textAlign: 'center',
+ },
+ });
+}
+
+export const HelpScreen: React.FC = () => {
+ const colors = useAppColors();
+ const styles = useMemo(() => createHelpStyles(colors), [colors]);
+ const insets = useSafeAreaInsets();
+ const router = useRouter();
+ const { isMobile } = useResponsive();
+ const responsivePadding = useResponsiveSpacing({ xs: 8, sm: 12, md: 16, lg: 24, xl: 32 });
+
+ // 当前展开的问题 key(同一时刻仅展开一个)
+ const [expandedKey, setExpandedKey] = useState(
+ `${FAQ_SECTIONS[0].key}-0`,
+ );
+
+ const scrollBottomInset = isMobile ? 64 + 24 + insets.bottom + spacing.md : spacing.md;
+
+ const toggleItem = useCallback((key: string) => {
+ setExpandedKey((prev) => (prev === key ? null : key));
+ }, []);
+
+ const handleContactEmail = useCallback(async () => {
+ const url = `mailto:${CONTACT_EMAIL}`;
+ try {
+ const canOpen = await Linking.canOpenURL(url);
+ if (canOpen) {
+ await Linking.openURL(url);
+ } else {
+ Alert.alert('联系我们', `请发送邮件至:${CONTACT_EMAIL}`);
+ }
+ } catch {
+ Alert.alert('联系我们', `请发送邮件至:${CONTACT_EMAIL}`);
+ }
+ }, []);
+
+ const renderFAQItem = (
+ section: FAQSection,
+ item: FAQItem,
+ index: number,
+ ) => {
+ const key = `${section.key}-${index}`;
+ const isExpanded = expandedKey === key;
+ const isLast = index === section.items.length - 1;
+
+ return (
+
+ toggleItem(key)}
+ activeOpacity={0.7}
+ >
+ {item.q}
+
+
+ {isExpanded && (
+
+ {item.a}
+ {item.note && (
+
+
+ {item.note}
+
+ )}
+
+ )}
+
+ );
+ };
+
+ const renderSection = (section: FAQSection) => (
+
+
+
+
+
+ {section.title}
+
+
+ {section.items.map((item, index) => renderFAQItem(section, item, index))}
+
+
+ );
+
+ return (
+
+
+ router.back()} />
+
+
+ {FAQ_SECTIONS.map(renderSection)}
+
+ {/* 联系我们 */}
+
+
+
+
+ 没有找到答案?
+
+ 如果以上内容未能解决您的问题,欢迎通过邮件与官方团队联系,我们会尽快为您处理。
+
+
+
+ {CONTACT_EMAIL}
+
+
+
+
+ © 2026 青春之旅电子信息科技(威海)有限公司
+
+
+
+
+ );
+};
+
+export default HelpScreen;
diff --git a/src/screens/profile/SettingsScreen.tsx b/src/screens/profile/SettingsScreen.tsx
index eca8ae2..3908ce4 100644
--- a/src/screens/profile/SettingsScreen.tsx
+++ b/src/screens/profile/SettingsScreen.tsx
@@ -271,7 +271,7 @@ export const SettingsScreen: React.FC = () => {
router.push(hrefs.hrefProfileAbout());
break;
case 'help':
- Alert.alert('帮助与反馈', '帮助中心即将上线!');
+ router.push(hrefs.hrefProfileHelp());
break;
case 'edit_profile':
diff --git a/src/screens/profile/index.ts b/src/screens/profile/index.ts
index b99a146..d17ced8 100644
--- a/src/screens/profile/index.ts
+++ b/src/screens/profile/index.ts
@@ -15,6 +15,7 @@ export { NotificationSettingsScreen } from './NotificationSettingsScreen';
export { BlockedUsersScreen } from './BlockedUsersScreen';
export { AccountSecurityScreen } from './AccountSecurityScreen';
export { AboutScreen } from './AboutScreen';
+export { HelpScreen } from './HelpScreen';
export { TermsOfServiceScreen } from './TermsOfServiceScreen';
export { PrivacyPolicyScreen } from './PrivacyPolicyScreen';
export { VerificationSettingsScreen } from './VerificationSettingsScreen';
diff --git a/src/services/core/api.ts b/src/services/core/api.ts
index f22209c..8747c41 100644
--- a/src/services/core/api.ts
+++ b/src/services/core/api.ts
@@ -505,6 +505,10 @@ class ApiClient {
let data: ApiResponse;
+ // 根据请求路径决定 form 字段名:
+ // 后端 UploadFile handler 期望字段名为 "file",其余(图片/头像/封面)为 "image"
+ const fieldName = path === '/uploads/files' ? 'file' : 'image';
+
if (Platform.OS === 'web') {
// Web 端:fetch + Blob/File + FormData
const formData = new FormData();
@@ -513,7 +517,7 @@ class ApiClient {
const uploadFile = new File([blob], file.name, {
type: file.type || blob.type || 'application/octet-stream',
});
- formData.append('image', uploadFile);
+ formData.append(fieldName, uploadFile);
if (additionalData) {
Object.keys(additionalData).forEach(key => {
@@ -534,7 +538,7 @@ class ApiClient {
const result = await fsFile.upload(`${this.baseUrl}${path}`, {
httpMethod: 'POST',
uploadType: UploadType.MULTIPART,
- fieldName: 'image',
+ fieldName,
mimeType: file.type,
headers,
parameters: additionalData,