File size: 1,422 Bytes
43024e4
 
4e485bb
43024e4
4e485bb
43024e4
4e485bb
 
43024e4
 
 
4e485bb
43024e4
 
 
 
4e485bb
 
 
 
43024e4
 
 
4e485bb
 
43024e4
 
 
 
 
 
 
 
 
 
 
 
 
4e485bb
43024e4
 
 
 
 
 
 
 
4e485bb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import React, { useEffect } from 'react';
import './App.css';
import Toolbar   from './components/Toolbar';
import LeftPanel from './components/LeftPanel';
import Viewport  from './components/Viewport';
import RightPanel from './components/RightPanel';
import AIPanel   from './components/AIPanel';
import Timeline  from './components/Timeline';
import { useStudioStore } from './store/useStudioStore';

function App() {
  const { addError, mode } = useStudioStore();

  useEffect(() => {
    const handler = (event: ErrorEvent) => {
      if (
        event.message.includes('THREE')   ||
        event.message.includes('WebGL')   ||
        event.message.includes('fiber')   ||
        event.message.includes('drei')    ||
        event.message.includes('Cannot read') ||
        event.message.includes('undefined')
      ) {
        addError(event.message +
          (event.filename ? ` (${event.filename}:${event.lineno})` : ''));
      }
    };
    window.addEventListener('error', handler);
    return () => window.removeEventListener('error', handler);
  }, [addError]);

  return (
    <div className="studio-root">
      <Toolbar />
      <div className="studio-body">
        <LeftPanel />
        <div className="studio-center">
          <Viewport />
          {mode === 'animate' && <Timeline />}
          <AIPanel />
        </div>
        <RightPanel />
      </div>
    </div>
  );
}

export default App;