Commit 87199471 by Liu

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

parent 0ace2d9a
// 问答功能独立首页
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 { useLocalStorageState } from 'ahooks'
import styles from '../Home/Home.module.less'
......@@ -8,7 +8,7 @@ import { TacticsWelcome } from './components/TacticsWelcome'
import { clearTacticsNavigationFlag, createTacticsConversation, fetchTacticsConversations } from '@/store/tacticsSlice'
import { useAppDispatch, useAppSelector } from '@/store/hook'
import type { RootState } from '@/store'
import { getUserRolesFromRoute } from '@/lib/utils'
import { getUserRolesFromRoute, safeLocalStorageGetItem } from '@/lib/utils'
import { TacticsChatEditor } from '@/components/TacticsChatEditor'
export const TacticsHome: React.FC = () => {
......@@ -21,6 +21,7 @@ export const TacticsHome: React.FC = () => {
const [token] = useLocalStorageState<string | undefined>('__TOKEN__', {
defaultValue: '',
})
const hasInitialized = useRef(false)
// from=tactics 时读取额外参数,用于新建会话(直接从 query 读取,不再使用 sessionStorage)
const tacticsMeta = useMemo(() => {
......@@ -172,12 +173,71 @@ export const TacticsHome: React.FC = () => {
// 当 token 存在时,初始化会话和获取会话列表
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()
dispatch(fetchTacticsConversations())
}
}, [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 (
<div
className={styles.homePage}
......
......@@ -246,10 +246,12 @@ export const Home: React.FC = () => {
const login = useCallback(async () => {
// 防止重复调用(使用 sessionStorage,跨组件共享)
if (sessionStorage.getItem(SSO_LOGIN_FLAG) === 'true') {
console.log('homeNew sso111111')
return
}
// 防止重复调用(组件级别保护)
if (hasFetched.current) {
console.log('homeNew sso222222')
return
}
const url = new URL(window.location.href)
......@@ -260,6 +262,7 @@ export const Home: React.FC = () => {
// 如果有 loginCode,执行 SSO 登录(包括 from=tactics 的情况)
if (_loginCode && viteOutputObj === 'inner') {
console.log('homeNew sso333333')
// 立即设置标志,防止重复执行
sessionStorage.setItem(SSO_LOGIN_FLAG, 'true')
hasFetched.current = true
......@@ -269,6 +272,7 @@ export const Home: React.FC = () => {
try {
const res = await fetchLoginByToken(_loginCode)
if (res.data) {
console.log('homeNew sso444444')
// 登录成功后先清理旧状态,避免沿用上一次的工具模式
dispatch(clearCurrentToolId())
safeSessionStorageRemoveItem('currentToolId')
......@@ -291,6 +295,7 @@ export const Home: React.FC = () => {
)
// 如果是 from=tactics,只执行登录,不执行其他业务逻辑(由 TacticsHome 处理)
if (from !== 'tactics') {
console.log('homeNew sso555555')
// 触发自定义事件,通知 ChatEditor 强制重置为制度活化
window.dispatchEvent(new CustomEvent('forceResetToGeneralMode'))
getSessionConversationId()
......@@ -311,6 +316,7 @@ export const Home: React.FC = () => {
// 如果没有 loginCode,执行其他逻辑(非 from=tactics 的情况)
if (from !== 'tactics') {
console.log('homeNew sso666666')
hasFetched.current = true
if (viteOutputObj === 'inner') {
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