@@ -21,6 +21,7 @@ import type {
2121 TaskRecord ,
2222} from '@features/tasks/types' ;
2323import { getCurrentAppPath , navigate , subscribeNavigation } from '@shared/navigation' ;
24+ import { shouldPrefer2D , supportsWebGL } from '@shared/platform' ;
2425
2526const taskStyles = `
2627:root {
@@ -1367,7 +1368,8 @@ async function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {
13671368}
13681369
13691370export default function TasksPage ( ) {
1370- const [ interiorViewMode , setInteriorViewMode ] = useState < '3d' | '2d' > ( '3d' ) ;
1371+ const disable3D = useMemo ( ( ) => shouldPrefer2D ( ) || ! supportsWebGL ( ) , [ ] ) ;
1372+ const [ interiorViewMode , setInteriorViewMode ] = useState < '3d' | '2d' > ( ( ) => ( disable3D ? '2d' : '3d' ) ) ;
13711373 const pathname = useSyncExternalStore ( subscribeNavigation , getCurrentAppPath , ( ) => '/tasks' ) ;
13721374 const selectedTaskId = parseSelectedTaskId ( pathname ) ;
13731375 const detailMode = Boolean ( selectedTaskId ) ;
@@ -1392,6 +1394,12 @@ export default function TasksPage() {
13921394 const [ edgeBusy , setEdgeBusy ] = useState ( false ) ;
13931395 const [ edgeError , setEdgeError ] = useState < string | null > ( null ) ;
13941396
1397+ useEffect ( ( ) => {
1398+ if ( disable3D && interiorViewMode === '3d' ) {
1399+ setInteriorViewMode ( '2d' ) ;
1400+ }
1401+ } , [ disable3D , interiorViewMode ] ) ;
1402+
13951403 async function refreshUniverse ( ) : Promise < void > {
13961404 try {
13971405 const planetData = await fetchJson < PlanetListResponse > ( '/api/planets?limit=50' ) ;
@@ -1775,7 +1783,7 @@ export default function TasksPage() {
17751783
17761784 const interiorContent = selectedTask && selectedPlanet ? (
17771785 interior && interiorTaskId === selectedTask . id && ! interiorError ? (
1778- interiorViewMode === '3d' ? (
1786+ interiorViewMode === '3d' && ! disable3D ? (
17791787 < PlanetInteriorScene3D
17801788 planet = { selectedPlanet }
17811789 interior = { interior }
@@ -1855,19 +1863,21 @@ export default function TasksPage() {
18551863
18561864 < div className = "task-detail-grid" >
18571865 < main className = "task-shell task-detail-main" >
1858- < div className = "task-main-head" >
1859- < div style = { { display : 'flex' , alignItems : 'flex-start' , justifyContent : 'space-between' , gap : 16 } } >
1860- < div >
1861- < h1 style = { { margin : 0 , fontSize : 18 } } > Task detail</ h1 >
1866+ < div className = "task-main-head" >
1867+ < div style = { { display : 'flex' , alignItems : 'flex-start' , justifyContent : 'space-between' , gap : 16 } } >
1868+ < div >
1869+ < h1 style = { { margin : 0 , fontSize : 18 } } > Task detail</ h1 >
18621870 < div style = { { marginTop : 6 , color : 'var(--task-dim)' , fontSize : 13 } } >
18631871 This page is optimized for the Feishu progress card and focuses on one task.
18641872 </ div >
18651873 </ div >
18661874 < div className = "task-view-switch" >
18671875 < button
18681876 type = "button"
1869- className = { `task-tool-btn ${ interiorViewMode === '3d' ? 'active' : '' } ` }
1877+ className = { `task-tool-btn ${ interiorViewMode === '3d' && ! disable3D ? 'active' : '' } ` }
18701878 onClick = { ( ) => setInteriorViewMode ( '3d' ) }
1879+ disabled = { disable3D }
1880+ title = { disable3D ? '3D 视图在当前设备/内置浏览器环境下容易白屏,已默认切换到 2D。' : undefined }
18711881 >
18721882 Workspace
18731883 </ button >
@@ -2243,8 +2253,10 @@ export default function TasksPage() {
22432253 < div className = "task-view-switch" >
22442254 < button
22452255 type = "button"
2246- className = { `task-tool-btn ${ interiorViewMode === '3d' ? 'active' : '' } ` }
2256+ className = { `task-tool-btn ${ interiorViewMode === '3d' && ! disable3D ? 'active' : '' } ` }
22472257 onClick = { ( ) => setInteriorViewMode ( '3d' ) }
2258+ disabled = { disable3D }
2259+ title = { disable3D ? '3D 视图在当前设备/内置浏览器环境下容易白屏,已默认切换到 2D。' : undefined }
22482260 >
22492261 像素办公室
22502262 </ button >
@@ -2265,7 +2277,7 @@ export default function TasksPage() {
22652277 < div className = "task-main-body" >
22662278 { selectedTask && selectedPlanet ? (
22672279 interior && interiorTaskId === selectedTask . id && ! interiorError ? (
2268- interiorViewMode === '3d' ? (
2280+ interiorViewMode === '3d' && ! disable3D ? (
22692281 < PlanetInteriorScene3D
22702282 planet = { selectedPlanet }
22712283 interior = { interior }
0 commit comments