68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
"use client"
|
||
|
||
import { useEffect, useState } from 'react'
|
||
import { tokenManager } from '@/lib/auth/token'
|
||
|
||
export function MockProvider({ children }: { children: React.ReactNode }) {
|
||
const [mockEnabled, setMockEnabled] = useState(false)
|
||
|
||
useEffect(() => {
|
||
async function initMocking() {
|
||
// 首先初始化设备ID(确保用户第一次访问就有设备ID)
|
||
tokenManager.initializeDeviceId()
|
||
|
||
// 只在开发环境和浏览器环境中启用
|
||
if (process.env.NODE_ENV !== 'development' || typeof window === 'undefined') {
|
||
setMockEnabled(true)
|
||
return
|
||
}
|
||
|
||
// 检查是否启用 mock
|
||
const shouldMock = process.env.NEXT_PUBLIC_ENABLE_MOCK === 'true'
|
||
console.log('🔧 Mock enabled:', shouldMock)
|
||
|
||
if (!shouldMock) {
|
||
console.log('🚫 MSW 已禁用')
|
||
setMockEnabled(true)
|
||
return
|
||
}
|
||
|
||
try {
|
||
// 动态导入 MSW
|
||
const { worker } = await import('../mocks/browser')
|
||
|
||
// 启动 Service Worker
|
||
await worker.start({
|
||
onUnhandledRequest: 'bypass',
|
||
serviceWorker: {
|
||
url: '/mockServiceWorker.js'
|
||
},
|
||
// 添加选项以避免拦截页面导航
|
||
quiet: false
|
||
})
|
||
|
||
console.log('🎭 MSW Worker started successfully')
|
||
setMockEnabled(true)
|
||
} catch (error) {
|
||
console.error('❌ Failed to start MSW:', error)
|
||
setMockEnabled(true) // 即使失败也继续渲染
|
||
}
|
||
}
|
||
|
||
initMocking()
|
||
}, [])
|
||
|
||
// 在 mock 初始化完成前显示加载状态
|
||
if (!mockEnabled) {
|
||
return (
|
||
<div className="flex items-center justify-center min-h-screen">
|
||
<div className="text-center">
|
||
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-4"></div>
|
||
<p className="text-gray-600">Initializing development environment...</p>
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|
||
|
||
return <>{children}</>
|
||
}
|