diff --git a/frontend/index.html b/frontend/index.html index fbd9950..56e00a4 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -5,49 +5,9 @@ frontend - + - - +
diff --git a/frontend/src/pages/login/index.tsx b/frontend/src/pages/login/index.tsx index e38af2e..f24d405 100644 --- a/frontend/src/pages/login/index.tsx +++ b/frontend/src/pages/login/index.tsx @@ -79,6 +79,18 @@ export default function Login() { console.log('在飞书中:', isInFeishu) console.log('window.tt:', window.tt) + // 检查所有可能的飞书相关全局对象 + const feishuObjects = {} + for (const key in window) { + if (key.toLowerCase().includes('tt') || + key.toLowerCase().includes('lark') || + key.toLowerCase().includes('feishu') || + key.toLowerCase().includes('bridge')) { + feishuObjects[key] = typeof window[key] + } + } + console.log('🔍 飞书相关全局对象:', feishuObjects) + // 检查 URL 中是否来自飞书消息通知 const urlParams = new URLSearchParams(window.location.search) const authCode = urlParams.get('auth_code') @@ -110,20 +122,32 @@ export default function Login() { setEnvironment('feishu') handleFeishuAutoLogin() } else if (isInFeishu) { - // 飞书内环境,等待 tt 对象加载后尝试免登 - console.log('⏳ 在飞书内环境,等待 tt 对象加载...') + // 飞书内环境,tt 对象由飞书客户端自动注入 + // 使用轮询等待 tt 对象可用(最多 10 秒) + console.log('⏳ 在飞书内环境,等待飞书客户端注入 tt 对象...') setEnvironment('feishu') - setLoading(false) - // 给 tt 对象一些时间来加载(最多 2 秒) - setTimeout(() => { - if (window.tt) { - console.log('✅ tt 对象已加载,开始免登') + + let attempts = 0 + const maxAttempts = 100 // 100 * 100ms = 10秒 + + const checkInterval = setInterval(() => { + attempts++ + console.log(`🔍 检查 tt 对象 (${attempts}/${maxAttempts}):`, !!window.tt, typeof window.tt) + + if (window.tt && typeof window.tt === 'object') { + clearInterval(checkInterval) + console.log('✅ tt 对象已由飞书客户端注入,开始免登') handleFeishuAutoLogin() - } else { - console.log('⚠️ tt 对象仍未加载,显示二维码登录') + } else if (attempts >= maxAttempts) { + clearInterval(checkInterval) + console.error('❌ 等待 tt 对象超时,最后状态 window.tt:', window.tt, typeof window.tt) + console.error('❌ 请检查:1) 飞书开放平台是否正确配置 H5 应用地址 2) 页面是否从飞书应用入口进入') + + // 不自动弹错误,而是显示飞书内登录界面 + setLoading(false) setShowQRCode(true) } - }, 2000) + }, 100) } else { // 飞书外:显示登录选项 console.log('📱 飞书外环境,显示登录选项') @@ -135,8 +159,6 @@ export default function Login() { // 飞书内静默授权 const handleFeishuAutoLogin = () => { console.log('🚀 开始飞书免登') - console.log('🔍 window.tt:', window.tt) - console.log('🔍 window.tt 类型:', typeof window.tt) // 从 URL 获取 company 参数(可能来自当前 URL 或 redirect URL) const urlParams = new URLSearchParams(window.location.search) @@ -153,60 +175,37 @@ export default function Login() { } } - // 详细检查 tt 对象 - if (window.tt) { - console.log('✅ tt 对象存在') - console.log('🔍 tt 的所有属性:', Object.keys(window.tt)) - console.log('🔍 tt.requestAuthCode 类型:', typeof window.tt.requestAuthCode) + console.log('🔍 window.tt:', window.tt) + console.log('🔍 tt 的属性:', Object.keys(window.tt || {})) - // 检查 requestAuthCode 是否存在 - if ('requestAuthCode' in window.tt) { - console.log('✅ requestAuthCode 属性存在') - console.log('🔍 类型:', typeof window.tt.requestAuthCode) - } else { - console.log('❌ requestAuthCode 属性不存在') - } - } else { - console.log('❌ tt 对象不存在') + if (!window.tt) { + console.error('❌ tt 对象不存在') setLoading(false) - Toast.show('飞书 API 未加载,请刷新重试') + Toast.show('飞书环境异常,请刷新重试') return } - // 等待一小段时间,确保 tt 完全初始化 - setTimeout(() => { - console.log('⏰ 延迟后再次检查 tt:', !!window.tt) + // 调用 tt.requestAuthCode 获取授权码 + try { + console.log('🔧 调用 tt.requestAuthCode') - if (!window.tt) { - setLoading(false) - Toast.show('飞书 API 加载失败') - return - } - - // 尝试调用 requestAuthCode - try { - console.log('🔧 调用 tt.requestAuthCode,company:', companyParam) - - // 不传 appId,让飞书自动选择(后端会根据 company 参数处理) - window.tt.requestAuthCode({ - success: (res: any) => { - console.log('✅ 成功获取授权码:', res) - console.log('✅ code:', res.code?.substring(0, 30)) - handleFeishuLogin(res.code) - }, - fail: (error: any) => { - console.error('❌ requestAuthCode 失败:', error) - console.error('❌ 错误详情:', JSON.stringify(error)) - setLoading(false) - Toast.show('免登失败:' + (error.errorMessage || error.errMsg || JSON.stringify(error))) - }, - }) - } catch (e) { - console.error('❌ 调用异常:', e) - setLoading(false) - Toast.show('免登失败,请使用其他方式登录') - } - }, 500) + // 不传 appId,让飞书自动选择(后端会根据 company 参数处理) + window.tt.requestAuthCode({ + success: (res: any) => { + console.log('✅ 成功获取授权码:', res.code?.substring(0, 30)) + handleFeishuLogin(res.code) + }, + fail: (error: any) => { + console.error('❌ requestAuthCode 失败:', error) + setLoading(false) + Toast.show('免登失败:' + (error.errorMessage || error.errMsg || JSON.stringify(error))) + }, + }) + } catch (e) { + console.error('❌ 调用异常:', e) + setLoading(false) + Toast.show('免登失败,请重试') + } } // 跳转到飞书授权页面(飞书外扫码登录)