修改用户授权调用位置和逻辑

This commit is contained in:
张成
2025-11-18 08:00:38 +08:00
parent 4568e758a7
commit 988f57aa5e
12 changed files with 343 additions and 81 deletions

View File

@@ -9,7 +9,6 @@ import { View, Image, Text, ScrollView } from "@tarojs/components";
import ListContainer from "@/container/listContainer";
import DistanceQuickFilter from "@/components/DistanceQuickFilter";
import { updateUserLocation } from "@/services/userService";
import { useUserActions } from "@/store/userStore";
import { useDictionaryStore } from "@/store/dictionaryStore";
import { saveImage, navigateTo } from "@/utils";
@@ -35,7 +34,6 @@ const ListPageContent: React.FC<ListPageContentProps> = ({
onFilterPopupVisibleChange,
}) => {
const store = useListStore() || {};
const { fetchUserInfo } = useUserActions();
const { statusNavbarHeightInfo, getCurrentLocationInfo } =
useGlobalState() || {};
const { totalHeight = 98 } = statusNavbarHeightInfo || {};
@@ -196,12 +194,8 @@ const ListPageContent: React.FC<ListPageContentProps> = ({
getCities();
getCityQrCode();
// 2. 延迟执行:获取用户信息(不阻塞渲染)
requestAnimationFrame(() => {
fetchUserInfo().catch((error) => {
console.error('获取用户信息失败:', error);
});
});
// 2. 移除 fetchUserInfo 调用,因为父组件 main_pages/index.tsx 已经在授权成功后调用了
// 这里直接使用 store 中的用户信息即可
// 3. 延迟执行:获取位置信息(可能较慢,不阻塞首屏)
requestAnimationFrame(() => {

View File

@@ -1,8 +1,9 @@
import React, { useState, useEffect, useCallback } from "react";
import { View } from "@tarojs/components";
import Taro from "@tarojs/taro";
import { check_login_status, silentLogin } from "@/services/loginService";
import { wechat_auth_login, save_login_state } from "@/services/loginService";
import { useUserActions } from "@/store/userStore";
import tokenManager from "@/utils/tokenManager";
import GuideBar from "@/components/GuideBar";
import { GeneralNavbar } from "@/components";
import HomeNavbar from "@/components/HomeNavbar";
@@ -24,41 +25,66 @@ const MainPage: React.FC = () => {
const [isShowInputCustomerNavBar, setIsShowInputCustomerNavBar] = useState(false);
const [listPageScrollToTopTrigger, setListPageScrollToTopTrigger] = useState(0);
const [showGuideBar, setShowGuideBar] = useState(true);
const [showAuthError, setShowAuthError] = useState(false);
const [authErrorMessage, setAuthErrorMessage] = useState('');
const { fetchUserInfo } = useUserActions();
// 初始化:尝试静默登录并获取用户信息
// 初始化:自动微信授权并获取用户信息
useEffect(() => {
const init = async () => {
// 先检查是否已登录
const login_status = check_login_status();
if (login_status) {
// 已登录,获取用户信息
const hasValidToken = tokenManager.hasValidToken();
if (!hasValidToken) {
try {
console.log('开始微信授权...');
const loginRes = await wechat_auth_login();
if (loginRes.success && loginRes.token) {
save_login_state(loginRes.token, loginRes.user_info);
console.log('微信授权成功');
} else {
// 显示错误提示
setAuthErrorMessage(loginRes.message || '微信授权失败');
setShowAuthError(true);
return;
}
} catch (error) {
console.error('微信授权异常:', error);
setAuthErrorMessage('微信授权失败,请重试');
setShowAuthError(true);
return;
}
}
// 如果有有效token获取用户详细信息
if (tokenManager.hasValidToken()) {
try {
await fetchUserInfo();
} catch (error) {
console.error('获取用户信息失败:', error);
}
} else {
// 未登录,尝试静默登录
try {
const loginResult = await silentLogin();
if (loginResult.success) {
// 静默登录成功,获取用户信息
fetchUserInfo().catch((error) => {
console.error('获取用户信息失败:', error);
});
}
} catch (error) {
console.error('静默登录失败:', error);
// 静默登录失败不影响使用
}
}
};
init();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []); // fetchUserInfo 是稳定的函数引用,不需要加入依赖项
// 显示授权错误提示
useEffect(() => {
if (showAuthError) {
Taro.showModal({
title: '授权失败',
content: `${authErrorMessage}\n\n请重启小程序后重试`,
showCancel: false,
confirmText: '我知道了',
success: () => {
setShowAuthError(false);
}
});
}
}, [showAuthError, authErrorMessage]);
// 处理标签切换
const handleTabChange = useCallback((code: string) => {
if (code === currentTab) {