优化获取昵称修改状态的时机
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 9999 !important;
|
z-index: 9999 !important;
|
||||||
&:global(.nut-popup-bottom.nut-popup-round) {
|
&:global(.nut-popup-bottom.nut-popup-round) {
|
||||||
border-radius: 20px 20px 0 0!important;
|
border-radius: 20px 20px 0 0 !important;
|
||||||
}
|
}
|
||||||
.common-popup__drag-handle-container {
|
.common-popup__drag-handle-container {
|
||||||
position: position;
|
position: position;
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
&::before{
|
&::before {
|
||||||
content: '';
|
content: "";
|
||||||
width: 32px;
|
width: 32px;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
background-color: rgba(22, 24, 35, 0.2);
|
background-color: rgba(22, 24, 35, 0.2);
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
padding: 8px 10px 0 10px;
|
padding: 8px 10px 0 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
background: #fff;
|
background: #fafafa;
|
||||||
padding-bottom: max(10px, env(safe-area-inset-bottom));
|
padding-bottom: max(10px, env(safe-area-inset-bottom));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ interface EditModalProps {
|
|||||||
placeholder: string;
|
placeholder: string;
|
||||||
initialValue: string;
|
initialValue: string;
|
||||||
maxLength: number;
|
maxLength: number;
|
||||||
invalidCharacters: string;
|
invalidCharacters: RegExp | null;
|
||||||
onSave: (value: string) => void;
|
onSave: (value: string) => void;
|
||||||
onCancel: () => void;
|
onCancel: () => void;
|
||||||
validationMessage?: string;
|
validationMessage?: string;
|
||||||
@@ -24,7 +24,7 @@ const EditModal: React.FC<EditModalProps> = ({
|
|||||||
placeholder,
|
placeholder,
|
||||||
initialValue,
|
initialValue,
|
||||||
maxLength,
|
maxLength,
|
||||||
invalidCharacters = "",
|
invalidCharacters = null,
|
||||||
onSave,
|
onSave,
|
||||||
onCancel,
|
onCancel,
|
||||||
validationMessage,
|
validationMessage,
|
||||||
@@ -63,18 +63,13 @@ const EditModal: React.FC<EditModalProps> = ({
|
|||||||
}
|
}
|
||||||
}, [visible, initialValue]);
|
}, [visible, initialValue]);
|
||||||
|
|
||||||
const createExcludeRegex = (chars: string) => {
|
|
||||||
const escapedChars = chars.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
||||||
const pattern = `[${escapedChars}]`;
|
|
||||||
return new RegExp(pattern);
|
|
||||||
};
|
|
||||||
const handle_input_change = (e: any) => {
|
const handle_input_change = (e: any) => {
|
||||||
const new_value = e.detail.value;
|
const new_value = e.detail.value;
|
||||||
setValue(new_value);
|
setValue(new_value);
|
||||||
let ishasIllegal = false;
|
let ishasIllegal = false;
|
||||||
if (type === "nickname") {
|
if (type === "nickname" && invalidCharacters) {
|
||||||
ishasIllegal = createExcludeRegex(invalidCharacters).test(new_value);
|
ishasIllegal = invalidCharacters.test(new_value);
|
||||||
setHasIllegal(ishasIllegal);
|
setHasIllegal(!ishasIllegal);
|
||||||
}
|
}
|
||||||
const illegal =
|
const illegal =
|
||||||
/\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|DECLARE)\b|('|--|\/\*|\*\/|;|#)|(=|'|"|`|\\|\|\|&&)|\bOR\s+['"]?[\w]+['"]?\s*=\s*['"]?[\w]+['"]?|\bUNION\s+SELECT\b|\bDROP\s+TABLE\b|\bINSERT\s+INTO\b|\bUPDATE\s+[\w]+\s+SET\b|\bDELETE\s+FROM\b/i.test(
|
/\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|DECLARE)\b|('|--|\/\*|\*\/|;|#)|(=|'|"|`|\\|\|\|&&)|\bOR\s+['"]?[\w]+['"]?\s*=\s*['"]?[\w]+['"]?|\bUNION\s+SELECT\b|\bDROP\s+TABLE\b|\bINSERT\s+INTO\b|\bUPDATE\s+[\w]+\s+SET\b|\bDELETE\s+FROM\b/i.test(
|
||||||
|
|||||||
@@ -610,7 +610,11 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
|||||||
}
|
}
|
||||||
initialValue={form_data[editing_field as keyof typeof form_data] || ""}
|
initialValue={form_data[editing_field as keyof typeof form_data] || ""}
|
||||||
maxLength={editing_field === "nickname" ? 20 : 100}
|
maxLength={editing_field === "nickname" ? 20 : 100}
|
||||||
invalidCharacters={editing_field === "nickname" ? "@<>/" : ""}
|
invalidCharacters={
|
||||||
|
editing_field === "nickname"
|
||||||
|
? /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\(\)\s]*$/
|
||||||
|
: null
|
||||||
|
}
|
||||||
onSave={handle_edit_modal_save}
|
onSave={handle_edit_modal_save}
|
||||||
onCancel={handle_edit_modal_cancel}
|
onCancel={handle_edit_modal_cancel}
|
||||||
validationMessage={
|
validationMessage={
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const LoginPage: React.FC = () => {
|
|||||||
const {
|
const {
|
||||||
params: { redirect },
|
params: { redirect },
|
||||||
} = useRouter();
|
} = useRouter();
|
||||||
const { fetchUserInfo } = useUserActions();
|
const { fetchUserInfo, checkNicknameChangeStatus } = useUserActions();
|
||||||
|
|
||||||
// 执行微信登录的核心逻辑
|
// 执行微信登录的核心逻辑
|
||||||
const execute_wechat_login = async (e: any) => {
|
const execute_wechat_login = async (e: any) => {
|
||||||
@@ -41,6 +41,7 @@ const LoginPage: React.FC = () => {
|
|||||||
if (response.success) {
|
if (response.success) {
|
||||||
save_login_state(response.token!, response.user_info!);
|
save_login_state(response.token!, response.user_info!);
|
||||||
fetchUserInfo();
|
fetchUserInfo();
|
||||||
|
checkNicknameChangeStatus();
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (redirect) {
|
if (redirect) {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import ListPageContent from "./components/ListPageContent";
|
|||||||
import MessagePageContent from "./components/MessagePageContent";
|
import MessagePageContent from "./components/MessagePageContent";
|
||||||
import MyselfPageContent from "./components/MyselfPageContent";
|
import MyselfPageContent from "./components/MyselfPageContent";
|
||||||
import "./index.scss";
|
import "./index.scss";
|
||||||
import FamilyContext from '@/context';
|
import FamilyContext from "@/context";
|
||||||
|
|
||||||
type TabType = "list" | "message" | "personal";
|
type TabType = "list" | "message" | "personal";
|
||||||
|
|
||||||
@@ -22,14 +22,17 @@ const MainPage: React.FC = () => {
|
|||||||
const [isDistanceFilterVisible, setIsDistanceFilterVisible] = useState(false);
|
const [isDistanceFilterVisible, setIsDistanceFilterVisible] = useState(false);
|
||||||
const [isCityPickerVisible, setIsCityPickerVisible] = useState(false);
|
const [isCityPickerVisible, setIsCityPickerVisible] = useState(false);
|
||||||
const [isFilterPopupVisible, setIsFilterPopupVisible] = useState(false);
|
const [isFilterPopupVisible, setIsFilterPopupVisible] = useState(false);
|
||||||
const [isShowInputCustomerNavBar, setIsShowInputCustomerNavBar] = useState(false);
|
const [isShowInputCustomerNavBar, setIsShowInputCustomerNavBar] =
|
||||||
const [listPageScrollToTopTrigger, setListPageScrollToTopTrigger] = useState(0);
|
useState(false);
|
||||||
|
const [listPageScrollToTopTrigger, setListPageScrollToTopTrigger] =
|
||||||
|
useState(0);
|
||||||
const [showAuthError, setShowAuthError] = useState(false);
|
const [showAuthError, setShowAuthError] = useState(false);
|
||||||
const [authErrorMessage, setAuthErrorMessage] = useState('');
|
const [authErrorMessage, setAuthErrorMessage] = useState("");
|
||||||
|
|
||||||
const { fetchUserInfo } = useUserActions();
|
const { fetchUserInfo, checkNicknameChangeStatus } = useUserActions();
|
||||||
// 从 store 获取 GuideBar 相关状态和方法
|
// 从 store 获取 GuideBar 相关状态和方法
|
||||||
const { showGuideBar, guideBarZIndex, setShowGuideBar, setGuideBarZIndex } = useGlobalState();
|
const { showGuideBar, guideBarZIndex, setShowGuideBar, setGuideBarZIndex } =
|
||||||
|
useGlobalState();
|
||||||
|
|
||||||
// 初始化:自动微信授权并获取用户信息
|
// 初始化:自动微信授权并获取用户信息
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -38,21 +41,21 @@ const MainPage: React.FC = () => {
|
|||||||
|
|
||||||
if (!hasValidToken) {
|
if (!hasValidToken) {
|
||||||
try {
|
try {
|
||||||
console.log('开始微信授权...');
|
console.log("开始微信授权...");
|
||||||
const loginRes = await wechat_auth_login();
|
const loginRes = await wechat_auth_login();
|
||||||
|
|
||||||
if (loginRes.success && loginRes.token) {
|
if (loginRes.success && loginRes.token) {
|
||||||
save_login_state(loginRes.token, loginRes.user_info);
|
save_login_state(loginRes.token, loginRes.user_info);
|
||||||
console.log('微信授权成功');
|
console.log("微信授权成功");
|
||||||
} else {
|
} else {
|
||||||
// 显示错误提示
|
// 显示错误提示
|
||||||
setAuthErrorMessage(loginRes.message || '微信授权失败');
|
setAuthErrorMessage(loginRes.message || "微信授权失败");
|
||||||
setShowAuthError(true);
|
setShowAuthError(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('微信授权异常:', error);
|
console.error("微信授权异常:", error);
|
||||||
setAuthErrorMessage('微信授权失败,请重试');
|
setAuthErrorMessage("微信授权失败,请重试");
|
||||||
setShowAuthError(true);
|
setShowAuthError(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -62,8 +65,9 @@ const MainPage: React.FC = () => {
|
|||||||
if (tokenManager.hasValidToken()) {
|
if (tokenManager.hasValidToken()) {
|
||||||
try {
|
try {
|
||||||
await fetchUserInfo();
|
await fetchUserInfo();
|
||||||
|
await checkNicknameChangeStatus();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取用户信息失败:', error);
|
console.error("获取用户信息失败:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -75,19 +79,20 @@ const MainPage: React.FC = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (showAuthError) {
|
if (showAuthError) {
|
||||||
Taro.showModal({
|
Taro.showModal({
|
||||||
title: '授权失败',
|
title: "授权失败",
|
||||||
content: `${authErrorMessage}\n\n请重启小程序后重试`,
|
content: `${authErrorMessage}\n\n请重启小程序后重试`,
|
||||||
showCancel: false,
|
showCancel: false,
|
||||||
confirmText: '我知道了',
|
confirmText: "我知道了",
|
||||||
success: () => {
|
success: () => {
|
||||||
setShowAuthError(false);
|
setShowAuthError(false);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [showAuthError, authErrorMessage]);
|
}, [showAuthError, authErrorMessage]);
|
||||||
|
|
||||||
// 处理标签切换
|
// 处理标签切换
|
||||||
const handleTabChange = useCallback((code: string) => {
|
const handleTabChange = useCallback(
|
||||||
|
(code: string) => {
|
||||||
if (code === currentTab) {
|
if (code === currentTab) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -97,7 +102,9 @@ const MainPage: React.FC = () => {
|
|||||||
scrollTop: 0,
|
scrollTop: 0,
|
||||||
duration: 300,
|
duration: 300,
|
||||||
});
|
});
|
||||||
}, [currentTab]);
|
},
|
||||||
|
[currentTab]
|
||||||
|
);
|
||||||
|
|
||||||
// 处理发布菜单显示/隐藏
|
// 处理发布菜单显示/隐藏
|
||||||
const handlePublishMenuVisibleChange = useCallback((visible: boolean) => {
|
const handlePublishMenuVisibleChange = useCallback((visible: boolean) => {
|
||||||
@@ -120,7 +127,8 @@ const MainPage: React.FC = () => {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// 处理列表页导航状态变化
|
// 处理列表页导航状态变化
|
||||||
const handleListNavStateChange = useCallback((state: {
|
const handleListNavStateChange = useCallback(
|
||||||
|
(state: {
|
||||||
isShowInputCustomerNavBar?: boolean;
|
isShowInputCustomerNavBar?: boolean;
|
||||||
isDistanceFilterVisible?: boolean;
|
isDistanceFilterVisible?: boolean;
|
||||||
isCityPickerVisible?: boolean;
|
isCityPickerVisible?: boolean;
|
||||||
@@ -134,14 +142,16 @@ const MainPage: React.FC = () => {
|
|||||||
if (state.isCityPickerVisible !== undefined) {
|
if (state.isCityPickerVisible !== undefined) {
|
||||||
setIsCityPickerVisible(state.isCityPickerVisible);
|
setIsCityPickerVisible(state.isCityPickerVisible);
|
||||||
}
|
}
|
||||||
}, []);
|
},
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
// 滚动到顶部
|
// 滚动到顶部
|
||||||
const scrollToTop = useCallback(() => {
|
const scrollToTop = useCallback(() => {
|
||||||
// 如果当前是列表页,触发列表页内部滚动
|
// 如果当前是列表页,触发列表页内部滚动
|
||||||
if (currentTab === "list") {
|
if (currentTab === "list") {
|
||||||
// 通过状态变化触发 ListPageContent 内部滚动
|
// 通过状态变化触发 ListPageContent 内部滚动
|
||||||
setListPageScrollToTopTrigger(prev => prev + 1);
|
setListPageScrollToTopTrigger((prev) => prev + 1);
|
||||||
} else {
|
} else {
|
||||||
// 其他页面使用 pageScrollTo
|
// 其他页面使用 pageScrollTo
|
||||||
(Taro as any).pageScrollTo({
|
(Taro as any).pageScrollTo({
|
||||||
@@ -154,13 +164,22 @@ const MainPage: React.FC = () => {
|
|||||||
// 动态控制 GuideBar 的 z-index
|
// 动态控制 GuideBar 的 z-index
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isPublishMenuVisible) {
|
if (isPublishMenuVisible) {
|
||||||
setGuideBarZIndex('high');
|
setGuideBarZIndex("high");
|
||||||
} else if (isDistanceFilterVisible || isCityPickerVisible || isFilterPopupVisible) {
|
} else if (
|
||||||
setGuideBarZIndex('low');
|
isDistanceFilterVisible ||
|
||||||
|
isCityPickerVisible ||
|
||||||
|
isFilterPopupVisible
|
||||||
|
) {
|
||||||
|
setGuideBarZIndex("low");
|
||||||
} else {
|
} else {
|
||||||
setGuideBarZIndex('high');
|
setGuideBarZIndex("high");
|
||||||
}
|
}
|
||||||
}, [isPublishMenuVisible, isDistanceFilterVisible, isCityPickerVisible, isFilterPopupVisible]);
|
}, [
|
||||||
|
isPublishMenuVisible,
|
||||||
|
isDistanceFilterVisible,
|
||||||
|
isCityPickerVisible,
|
||||||
|
isFilterPopupVisible,
|
||||||
|
]);
|
||||||
|
|
||||||
// 渲染自定义导航栏(参考原始页面的实现)
|
// 渲染自定义导航栏(参考原始页面的实现)
|
||||||
const renderCustomNavbar = () => {
|
const renderCustomNavbar = () => {
|
||||||
@@ -190,21 +209,15 @@ const MainPage: React.FC = () => {
|
|||||||
);
|
);
|
||||||
} else if (currentTab === "personal") {
|
} else if (currentTab === "personal") {
|
||||||
// 我的页:使用 GeneralNavbar 显示标题
|
// 我的页:使用 GeneralNavbar 显示标题
|
||||||
return (
|
return <GeneralNavbar title="" titlePosition="left" showBack={false} />;
|
||||||
<GeneralNavbar
|
|
||||||
title=""
|
|
||||||
titlePosition="left"
|
|
||||||
showBack={false}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleGrandchildTrigger = (value) => {
|
const handleGrandchildTrigger = (value) => {
|
||||||
console.log('[MainPage] handleGrandchildTrigger called with:', value);
|
console.log("[MainPage] handleGrandchildTrigger called with:", value);
|
||||||
setShowGuideBar(!value);
|
setShowGuideBar(!value);
|
||||||
}
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FamilyContext.Provider value={{ handleGrandchildTrigger }}>
|
<FamilyContext.Provider value={{ handleGrandchildTrigger }}>
|
||||||
@@ -241,21 +254,21 @@ const MainPage: React.FC = () => {
|
|||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* 底部导航栏 */}
|
{/* 底部导航栏 */}
|
||||||
{
|
{showGuideBar ? (
|
||||||
showGuideBar ?
|
|
||||||
<GuideBar
|
<GuideBar
|
||||||
currentPage={currentTab}
|
currentPage={currentTab}
|
||||||
guideBarClassName={guideBarZIndex === 'low' ? 'guide-bar-low-z-index' : 'guide-bar-high-z-index'}
|
guideBarClassName={
|
||||||
|
guideBarZIndex === "low"
|
||||||
|
? "guide-bar-low-z-index"
|
||||||
|
: "guide-bar-high-z-index"
|
||||||
|
}
|
||||||
onTabChange={handleTabChange}
|
onTabChange={handleTabChange}
|
||||||
onPublishMenuVisibleChange={handlePublishMenuVisibleChange}
|
onPublishMenuVisibleChange={handlePublishMenuVisibleChange}
|
||||||
/> :
|
/>
|
||||||
null
|
) : null}
|
||||||
}
|
|
||||||
|
|
||||||
</View>
|
</View>
|
||||||
</FamilyContext.Provider>
|
</FamilyContext.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default MainPage;
|
export default MainPage;
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export interface UserInfoType {
|
|||||||
// 微信授权登录
|
// 微信授权登录
|
||||||
// phone_code: 可选参数,如果提供则绑定手机号,否则只进行微信授权
|
// phone_code: 可选参数,如果提供则绑定手机号,否则只进行微信授权
|
||||||
export const wechat_auth_login = async (
|
export const wechat_auth_login = async (
|
||||||
phone_code?: string,
|
phone_code?: string
|
||||||
): Promise<LoginResponse> => {
|
): Promise<LoginResponse> => {
|
||||||
try {
|
try {
|
||||||
// 先进行微信登录获取code
|
// 先进行微信登录获取code
|
||||||
@@ -144,7 +144,7 @@ export interface ChangePhoneParams {
|
|||||||
|
|
||||||
// 手机号验证码登录
|
// 手机号验证码登录
|
||||||
export const phone_auth_login = async (
|
export const phone_auth_login = async (
|
||||||
params: PhoneLoginParams,
|
params: PhoneLoginParams
|
||||||
): Promise<LoginResponse> => {
|
): Promise<LoginResponse> => {
|
||||||
try {
|
try {
|
||||||
// 使用 httpService 调用验证验证码接口
|
// 使用 httpService 调用验证验证码接口
|
||||||
@@ -158,6 +158,7 @@ export const phone_auth_login = async (
|
|||||||
// 登录成功后,更新用户信息到 store
|
// 登录成功后,更新用户信息到 store
|
||||||
try {
|
try {
|
||||||
await useUser.getState().fetchUserInfo();
|
await useUser.getState().fetchUserInfo();
|
||||||
|
await useUser.getState().checkNicknameChangeStatus();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("更新用户信息到 store 失败:", error);
|
console.error("更新用户信息到 store 失败:", error);
|
||||||
}
|
}
|
||||||
@@ -216,7 +217,7 @@ export const send_sms_code = async (phone: string): Promise<SmsResponse> => {
|
|||||||
// 验证短信验证码
|
// 验证短信验证码
|
||||||
export const verify_sms_code = async (
|
export const verify_sms_code = async (
|
||||||
phone: string,
|
phone: string,
|
||||||
code: string,
|
code: string
|
||||||
): Promise<VerifyCodeResponse> => {
|
): Promise<VerifyCodeResponse> => {
|
||||||
try {
|
try {
|
||||||
const response = await httpService.post("user/sms/verify", {
|
const response = await httpService.post("user/sms/verify", {
|
||||||
@@ -378,8 +379,6 @@ export const refresh_login_status = async (): Promise<boolean> => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 更新用户手机号
|
// 更新用户手机号
|
||||||
export const updateUserPhone = async (payload: ChangePhoneParams) => {
|
export const updateUserPhone = async (payload: ChangePhoneParams) => {
|
||||||
try {
|
try {
|
||||||
@@ -389,13 +388,17 @@ export const updateUserPhone = async (payload: ChangePhoneParams) => {
|
|||||||
console.error("更新用户手机号失败:", error);
|
console.error("更新用户手机号失败:", error);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
// 获取指定用户信息
|
// 获取指定用户信息
|
||||||
export const getUserInfoById = async (id) => {
|
export const getUserInfoById = async (id) => {
|
||||||
try {
|
try {
|
||||||
const response = await httpService.post("/user/detail_by_id", { id }, {
|
const response = await httpService.post(
|
||||||
|
"/user/detail_by_id",
|
||||||
|
{ id },
|
||||||
|
{
|
||||||
showLoading: false,
|
showLoading: false,
|
||||||
},);
|
}
|
||||||
|
);
|
||||||
return response;
|
return response;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("获取用户信息失败:", error);
|
console.error("获取用户信息失败:", error);
|
||||||
@@ -436,13 +439,13 @@ let silentLoginPromise: Promise<LoginResponse> | null = null;
|
|||||||
export const silentLogin = async (): Promise<LoginResponse> => {
|
export const silentLogin = async (): Promise<LoginResponse> => {
|
||||||
// 如果已经有正在进行的静默登录,直接返回该 Promise
|
// 如果已经有正在进行的静默登录,直接返回该 Promise
|
||||||
if (silentLoginPromise) {
|
if (silentLoginPromise) {
|
||||||
console.log('静默登录正在进行中,等待结果...');
|
console.log("静默登录正在进行中,等待结果...");
|
||||||
return silentLoginPromise;
|
return silentLoginPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 先检查是否已经登录
|
// 先检查是否已经登录
|
||||||
if (check_login_status()) {
|
if (check_login_status()) {
|
||||||
console.log('已登录,跳过静默登录');
|
console.log("已登录,跳过静默登录");
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
message: "已登录",
|
message: "已登录",
|
||||||
@@ -454,13 +457,13 @@ export const silentLogin = async (): Promise<LoginResponse> => {
|
|||||||
// 创建静默登录 Promise
|
// 创建静默登录 Promise
|
||||||
silentLoginPromise = (async (): Promise<LoginResponse> => {
|
silentLoginPromise = (async (): Promise<LoginResponse> => {
|
||||||
try {
|
try {
|
||||||
console.log('开始执行静默登录...');
|
console.log("开始执行静默登录...");
|
||||||
// 调用微信登录获取code
|
// 调用微信登录获取code
|
||||||
const login_result = await Taro.login();
|
const login_result = await Taro.login();
|
||||||
console.log('微信登录结果:', login_result);
|
console.log("微信登录结果:", login_result);
|
||||||
|
|
||||||
if (!login_result.code) {
|
if (!login_result.code) {
|
||||||
console.error('微信登录失败:未获取到code');
|
console.error("微信登录失败:未获取到code");
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
message: "微信登录失败",
|
message: "微信登录失败",
|
||||||
@@ -468,15 +471,19 @@ export const silentLogin = async (): Promise<LoginResponse> => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 调用微信授权接口,不传 phone_code(静默登录)
|
// 调用微信授权接口,不传 phone_code(静默登录)
|
||||||
console.log('调用后端接口进行静默登录...');
|
console.log("调用后端接口进行静默登录...");
|
||||||
const auth_response = await httpService.post("user/wx_auth", {
|
const auth_response = await httpService.post(
|
||||||
|
"user/wx_auth",
|
||||||
|
{
|
||||||
code: login_result.code,
|
code: login_result.code,
|
||||||
// 不传 phone_code,实现静默登录
|
// 不传 phone_code,实现静默登录
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
showLoading: false, // 静默登录不显示loading
|
showLoading: false, // 静默登录不显示loading
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
console.log('后端接口响应:', auth_response);
|
console.log("后端接口响应:", auth_response);
|
||||||
|
|
||||||
if (auth_response.code === 0) {
|
if (auth_response.code === 0) {
|
||||||
const token = auth_response.data?.token || "";
|
const token = auth_response.data?.token || "";
|
||||||
@@ -484,11 +491,11 @@ export const silentLogin = async (): Promise<LoginResponse> => {
|
|||||||
|
|
||||||
// 保存登录状态
|
// 保存登录状态
|
||||||
if (token && user_info) {
|
if (token && user_info) {
|
||||||
console.log('保存登录状态...');
|
console.log("保存登录状态...");
|
||||||
save_login_state(token, user_info);
|
save_login_state(token, user_info);
|
||||||
console.log('静默登录成功,已保存登录状态');
|
console.log("静默登录成功,已保存登录状态");
|
||||||
} else {
|
} else {
|
||||||
console.warn('静默登录成功,但token或user_info为空');
|
console.warn("静默登录成功,但token或user_info为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -498,7 +505,7 @@ export const silentLogin = async (): Promise<LoginResponse> => {
|
|||||||
user_info,
|
user_info,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
console.error('静默登录失败:', auth_response.message);
|
console.error("静默登录失败:", auth_response.message);
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
message: auth_response.message || "静默登录失败",
|
message: auth_response.message || "静默登录失败",
|
||||||
|
|||||||
@@ -819,7 +819,11 @@ const EditProfilePage: React.FC = () => {
|
|||||||
}
|
}
|
||||||
initialValue={form_data[editing_field as keyof typeof form_data] || ""}
|
initialValue={form_data[editing_field as keyof typeof form_data] || ""}
|
||||||
maxLength={editing_field === "nickname" ? 24 : 100}
|
maxLength={editing_field === "nickname" ? 24 : 100}
|
||||||
invalidCharacters={editing_field === "nickname" ? "@<>/" : ""}
|
invalidCharacters={
|
||||||
|
editing_field === "nickname"
|
||||||
|
? /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\(\)\s]*$/
|
||||||
|
: null
|
||||||
|
}
|
||||||
onSave={handle_edit_modal_save}
|
onSave={handle_edit_modal_save}
|
||||||
onCancel={handle_edit_modal_cancel}
|
onCancel={handle_edit_modal_cancel}
|
||||||
validationMessage={
|
validationMessage={
|
||||||
|
|||||||
@@ -156,12 +156,11 @@
|
|||||||
|
|
||||||
.popup_text {
|
.popup_text {
|
||||||
font-family: DingTalk JinBuTi;
|
font-family: DingTalk JinBuTi;
|
||||||
font-weight: 400;
|
font-weight: 600;
|
||||||
font-style: Regular;
|
font-style: Regular;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 20px 0;
|
margin: 20px 0;
|
||||||
font-style: italic;
|
|
||||||
.integer {
|
.integer {
|
||||||
font-size: 36px;
|
font-size: 36px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
import { check_login_status, get_user_token, silentLogin } from "@/services/loginService";
|
import {
|
||||||
|
check_login_status,
|
||||||
|
get_user_token,
|
||||||
|
silentLogin,
|
||||||
|
} from "@/services/loginService";
|
||||||
import { useUser } from "@/store/userStore";
|
import { useUser } from "@/store/userStore";
|
||||||
import tokenManager from "@/utils/tokenManager";
|
import tokenManager from "@/utils/tokenManager";
|
||||||
|
|
||||||
@@ -15,7 +19,7 @@ const initUserAuthCore = async (): Promise<void> => {
|
|||||||
|
|
||||||
// 如果已经登录且有用户信息,跳过
|
// 如果已经登录且有用户信息,跳过
|
||||||
const login_status = check_login_status();
|
const login_status = check_login_status();
|
||||||
const { user, fetchUserInfo } = useUser.getState();
|
const { user, fetchUserInfo, checkNicknameChangeStatus } = useUser.getState();
|
||||||
if (login_status && user && Object.keys(user).length > 0) {
|
if (login_status && user && Object.keys(user).length > 0) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
@@ -27,8 +31,9 @@ const initUserAuthCore = async (): Promise<void> => {
|
|||||||
// 已登录,获取用户信息
|
// 已登录,获取用户信息
|
||||||
try {
|
try {
|
||||||
await fetchUserInfo();
|
await fetchUserInfo();
|
||||||
|
await checkNicknameChangeStatus();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取用户信息失败:', error);
|
console.error("获取用户信息失败:", error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 未登录,尝试静默登录
|
// 未登录,尝试静默登录
|
||||||
@@ -37,14 +42,15 @@ const initUserAuthCore = async (): Promise<void> => {
|
|||||||
if (loginResult.success) {
|
if (loginResult.success) {
|
||||||
// 静默登录成功,获取用户信息
|
// 静默登录成功,获取用户信息
|
||||||
await fetchUserInfo();
|
await fetchUserInfo();
|
||||||
|
await checkNicknameChangeStatus();
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('静默登录失败:', error);
|
console.error("静默登录失败:", error);
|
||||||
// 静默登录失败不影响使用
|
// 静默登录失败不影响使用
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('初始化用户授权失败:', error);
|
console.error("初始化用户授权失败:", error);
|
||||||
} finally {
|
} finally {
|
||||||
isInitializingAuth = false;
|
isInitializingAuth = false;
|
||||||
authInitPromise = null;
|
authInitPromise = null;
|
||||||
@@ -87,14 +93,18 @@ export const waitForAuthInit = async (): Promise<void> => {
|
|||||||
// 等待 token 真正存在(最多等待 2 秒)
|
// 等待 token 真正存在(最多等待 2 秒)
|
||||||
let retryCount = 0;
|
let retryCount = 0;
|
||||||
const maxRetries = 20; // 20 * 100ms = 2秒
|
const maxRetries = 20; // 20 * 100ms = 2秒
|
||||||
while (retryCount < maxRetries && !tokenManager.hasValidToken() && !get_user_token()) {
|
while (
|
||||||
await new Promise(resolve => setTimeout(resolve, 100));
|
retryCount < maxRetries &&
|
||||||
|
!tokenManager.hasValidToken() &&
|
||||||
|
!get_user_token()
|
||||||
|
) {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||||
retryCount++;
|
retryCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果还是没有 token,记录警告但继续执行
|
// 如果还是没有 token,记录警告但继续执行
|
||||||
if (!tokenManager.hasValidToken() && !get_user_token()) {
|
if (!tokenManager.hasValidToken() && !get_user_token()) {
|
||||||
console.warn('等待静默登录完成,但未获取到 token');
|
console.warn("等待静默登录完成,但未获取到 token");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -102,4 +112,3 @@ export const waitForAuthInit = async (): Promise<void> => {
|
|||||||
export const initUserAuth = () => {
|
export const initUserAuth = () => {
|
||||||
return initUserAuthCore();
|
return initUserAuthCore();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user