Commit 87199471 by Liu

feat: 优化 token 初始化逻辑并添加 SSO 登录调试日志

parent 0ace2d9a
// 问答功能独立首页 // 问答功能独立首页
import type React from 'react' import type React from 'react'
import { useCallback, useEffect, useMemo } from 'react' import { useCallback, useEffect, useMemo, useRef } from 'react'
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import { useLocation, useNavigate, useSearchParams } from 'react-router-dom'
import { useLocalStorageState } from 'ahooks' import { useLocalStorageState } from 'ahooks'
import styles from '../Home/Home.module.less' import styles from '../Home/Home.module.less'
...@@ -8,7 +8,7 @@ import { TacticsWelcome } from './components/TacticsWelcome' ...@@ -8,7 +8,7 @@ import { TacticsWelcome } from './components/TacticsWelcome'
import { clearTacticsNavigationFlag, createTacticsConversation, fetchTacticsConversations } from '@/store/tacticsSlice' import { clearTacticsNavigationFlag, createTacticsConversation, fetchTacticsConversations } from '@/store/tacticsSlice'
import { useAppDispatch, useAppSelector } from '@/store/hook' import { useAppDispatch, useAppSelector } from '@/store/hook'
import type { RootState } from '@/store' import type { RootState } from '@/store'
import { getUserRolesFromRoute } from '@/lib/utils' import { getUserRolesFromRoute, safeLocalStorageGetItem } from '@/lib/utils'
import { TacticsChatEditor } from '@/components/TacticsChatEditor' import { TacticsChatEditor } from '@/components/TacticsChatEditor'
export const TacticsHome: React.FC = () => { export const TacticsHome: React.FC = () => {
...@@ -21,6 +21,7 @@ export const TacticsHome: React.FC = () => { ...@@ -21,6 +21,7 @@ export const TacticsHome: React.FC = () => {
const [token] = useLocalStorageState<string | undefined>('__TOKEN__', { const [token] = useLocalStorageState<string | undefined>('__TOKEN__', {
defaultValue: '', defaultValue: '',
}) })
const hasInitialized = useRef(false)
// from=tactics 时读取额外参数,用于新建会话(直接从 query 读取,不再使用 sessionStorage) // from=tactics 时读取额外参数,用于新建会话(直接从 query 读取,不再使用 sessionStorage)
const tacticsMeta = useMemo(() => { const tacticsMeta = useMemo(() => {
...@@ -172,12 +173,71 @@ export const TacticsHome: React.FC = () => { ...@@ -172,12 +173,71 @@ export const TacticsHome: React.FC = () => {
// 当 token 存在时,初始化会话和获取会话列表 // 当 token 存在时,初始化会话和获取会话列表
useEffect(() => { useEffect(() => {
if (token) { // 防止重复执行
if (hasInitialized.current) {
return
}
// 直接从 localStorage 读取 token,避免 state 更新延迟的问题
const getTokenFromStorage = () => {
const tokenFromStorage = safeLocalStorageGetItem('__TOKEN__')
if (!tokenFromStorage) {
return null
}
try {
// useLocalStorageState 会将值序列化为 JSON,需要解析
const parsed = JSON.parse(tokenFromStorage)
return parsed || tokenFromStorage
}
catch {
// 如果不是 JSON 格式,直接使用原始值
return tokenFromStorage
}
}
const actualToken = getTokenFromStorage() || token
// 确保 token 存在后再执行业务逻辑
if (actualToken) {
hasInitialized.current = true
initTacticsConversation() initTacticsConversation()
dispatch(fetchTacticsConversations()) dispatch(fetchTacticsConversations())
} }
}, [token, dispatch]) }, [token, dispatch])
// 监听 localStorage 中 token 的变化(处理跨组件 token 更新的情况)
useEffect(() => {
const handleStorageChange = (e: StorageEvent) => {
// 防止重复执行(如果已经初始化过,不再执行)
if (hasInitialized.current) {
return
}
if (e.key === '__TOKEN__' && e.newValue) {
// token 更新后,重新执行业务逻辑
let actualToken = null
try {
const parsed = JSON.parse(e.newValue)
actualToken = parsed || e.newValue
}
catch {
actualToken = e.newValue
}
if (actualToken) {
hasInitialized.current = true
initTacticsConversation()
dispatch(fetchTacticsConversations())
}
}
}
window.addEventListener('storage', handleStorageChange)
return () => {
window.removeEventListener('storage', handleStorageChange)
}
}, [dispatch])
return ( return (
<div <div
className={styles.homePage} className={styles.homePage}
......
...@@ -246,10 +246,12 @@ export const Home: React.FC = () => { ...@@ -246,10 +246,12 @@ export const Home: React.FC = () => {
const login = useCallback(async () => { const login = useCallback(async () => {
// 防止重复调用(使用 sessionStorage,跨组件共享) // 防止重复调用(使用 sessionStorage,跨组件共享)
if (sessionStorage.getItem(SSO_LOGIN_FLAG) === 'true') { if (sessionStorage.getItem(SSO_LOGIN_FLAG) === 'true') {
console.log('homeNew sso111111')
return return
} }
// 防止重复调用(组件级别保护) // 防止重复调用(组件级别保护)
if (hasFetched.current) { if (hasFetched.current) {
console.log('homeNew sso222222')
return return
} }
const url = new URL(window.location.href) const url = new URL(window.location.href)
...@@ -260,6 +262,7 @@ export const Home: React.FC = () => { ...@@ -260,6 +262,7 @@ export const Home: React.FC = () => {
// 如果有 loginCode,执行 SSO 登录(包括 from=tactics 的情况) // 如果有 loginCode,执行 SSO 登录(包括 from=tactics 的情况)
if (_loginCode && viteOutputObj === 'inner') { if (_loginCode && viteOutputObj === 'inner') {
console.log('homeNew sso333333')
// 立即设置标志,防止重复执行 // 立即设置标志,防止重复执行
sessionStorage.setItem(SSO_LOGIN_FLAG, 'true') sessionStorage.setItem(SSO_LOGIN_FLAG, 'true')
hasFetched.current = true hasFetched.current = true
...@@ -269,6 +272,7 @@ export const Home: React.FC = () => { ...@@ -269,6 +272,7 @@ export const Home: React.FC = () => {
try { try {
const res = await fetchLoginByToken(_loginCode) const res = await fetchLoginByToken(_loginCode)
if (res.data) { if (res.data) {
console.log('homeNew sso444444')
// 登录成功后先清理旧状态,避免沿用上一次的工具模式 // 登录成功后先清理旧状态,避免沿用上一次的工具模式
dispatch(clearCurrentToolId()) dispatch(clearCurrentToolId())
safeSessionStorageRemoveItem('currentToolId') safeSessionStorageRemoveItem('currentToolId')
...@@ -291,6 +295,7 @@ export const Home: React.FC = () => { ...@@ -291,6 +295,7 @@ export const Home: React.FC = () => {
) )
// 如果是 from=tactics,只执行登录,不执行其他业务逻辑(由 TacticsHome 处理) // 如果是 from=tactics,只执行登录,不执行其他业务逻辑(由 TacticsHome 处理)
if (from !== 'tactics') { if (from !== 'tactics') {
console.log('homeNew sso555555')
// 触发自定义事件,通知 ChatEditor 强制重置为制度活化 // 触发自定义事件,通知 ChatEditor 强制重置为制度活化
window.dispatchEvent(new CustomEvent('forceResetToGeneralMode')) window.dispatchEvent(new CustomEvent('forceResetToGeneralMode'))
getSessionConversationId() getSessionConversationId()
...@@ -311,6 +316,7 @@ export const Home: React.FC = () => { ...@@ -311,6 +316,7 @@ export const Home: React.FC = () => {
// 如果没有 loginCode,执行其他逻辑(非 from=tactics 的情况) // 如果没有 loginCode,执行其他逻辑(非 from=tactics 的情况)
if (from !== 'tactics') { if (from !== 'tactics') {
console.log('homeNew sso666666')
hasFetched.current = true hasFetched.current = true
if (viteOutputObj === 'inner') { if (viteOutputObj === 'inner') {
getSessionConversationId() getSessionConversationId()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment