Просмотр исходного кода

fix: handle anonymous activity sharing safely

Developer 1 неделя назад
Родитель
Сommit
131a15a2d8
2 измененных файлов с 25 добавлено и 4 удалено
  1. 13 2
      pagesHome/activityDetail.vue
  2. 12 2
      tests/activity-detail-login-gate.test.js

+ 13 - 2
pagesHome/activityDetail.vue

@@ -371,9 +371,20 @@
 			})
 		}) 
 	}
+
+	const getStoredUserId = () => {
+		const storedUser = uni.getStorageSync('userInfo')
+		if(!storedUser) return ''
+		if(typeof storedUser === 'object') return storedUser?.id || ''
+		try {
+			return JSON.parse(storedUser)?.id || ''
+		} catch (error) {
+			return ''
+		}
+	}
 	
 	onShareAppMessage((res) => {
-		const sharerId = JSON.parse(uni.getStorageSync('userInfo'))?.id;
+		const sharerId = getStoredUserId();
 		// 如果是点击海报菜单的“发送给朋友”按钮
 		if (res.from === 'button' && res.target.id === 'posterShareBtn') {
 			return {
@@ -391,7 +402,7 @@
 	})
 	
 	onShareTimeline((res) => {
-		const sharerId = JSON.parse(uni.getStorageSync('userInfo'))?.id;
+		const sharerId = getStoredUserId();
 		return {
 		  title: activityInfo.value?.activityName || '发现一个好物,分享给你!',
 		  query: `shareADId=${activityInfo.value?.id}&shareUserId=${sharerId}`,

+ 12 - 2
tests/activity-detail-login-gate.test.js

@@ -45,8 +45,8 @@ function mountActivityDetail ({ loggedIn = false, storage = {} } = {}) {
     nextTick: callback => callback(),
     watch: (getter, callback) => { lifecycle.watchToken = callback },
     onLoad: callback => { lifecycle.load = callback },
-    onShareAppMessage: () => {},
-    onShareTimeline: () => {},
+    onShareAppMessage: callback => { lifecycle.shareApp = callback },
+    onShareTimeline: callback => { lifecycle.shareTimeline = callback },
     getCurrentInstance: () => ({
       proxy: {
         $api: {
@@ -154,6 +154,16 @@ test('登录完成后重新获取当前活动详情', () => {
   ])
 })
 
+test('未登录浏览详情时原生分享回调不会因缺少用户信息报错', () => {
+  const { lifecycle } = mountActivityDetail()
+
+  const appShare = lifecycle.shareApp({ from: 'menu' })
+  const timelineShare = lifecycle.shareTimeline()
+
+  assert.match(appShare.path, /^\/pagesHome\/activityDetail\?shareADId=/)
+  assert.match(timelineShare.query, /^shareADId=/)
+})
+
 test('登录态同时校验 token 和过期时间', async () => {
   const { hasValidSession } = await loadAuthSession()
   const now = 1000