Skip to content

Commit e666148

Browse files
committed
feat : update canvas
1 parent 7c6f43f commit e666148

14 files changed

+1529
-121
lines changed

package-lock.json

+1,205-33
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"react-cookie": "^7.2.2",
1919
"react-dom": "^18.3.1",
2020
"react-router-dom": "^7.1.1",
21+
"tldraw": "^3.7.2",
2122
"zustand": "^5.0.3"
2223
},
2324
"devDependencies": {

src/common/Header/AuthHeader.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default function AuthHeader() {
2626
</li>
2727
<li>
2828
<Link
29-
to="/share"
29+
to="/tale/share"
3030
className="text-gray-700 hover:text-blue-600 text-xl">
3131
Share
3232
</Link>

src/common/Header/DefaultHeader.jsx

+3-8
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,8 @@ import React from 'react';
22

33
export default function DefaultHeader() {
44
return (
5-
<div>
6-
<nav className="flex">
7-
<div>
8-
<span className="">Logo</span>
9-
</div>
10-
<div className=""></div>
11-
</nav>
12-
</div>
5+
<header>
6+
<nav></nav>
7+
</header>
138
);
149
}

src/common/MainLayout.jsx src/common/layout/MainLayout.jsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import Footer from './Footer';
21
import { Outlet } from 'react-router-dom';
3-
import AuthHeader from './Header/AuthHeader';
4-
import DefaultHeader from './Header/DefaultHeader';
52
import { useAuth } from '@/store/useStore';
3+
import Footer from '../Footer';
4+
import AuthHeader from '../Header/AuthHeader';
5+
import DefaultHeader from '../Header/DefaultHeader';
66

77
export default function MainLayout() {
88
const { isAuthenticated } = useAuth();

src/common/layout/TaleLayout.jsx

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import React from 'react';
2+
import { Outlet } from 'react-router-dom';
3+
4+
export default function TaleLayout() {
5+
return (
6+
<div>
7+
<Outlet />
8+
</div>
9+
);
10+
}

src/components/Share/FriendCanvas.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import React from 'react';
22

3-
export default function FriendCanvas() {
3+
export default function FriendCanvas({ streamManager, userType }) {
44
return (
55
<div className="h-1/3 bg-white rounded-lg shadow-md flex items-center justify-center border border-gray-300">
6-
<span className="text-gray-500">참가자 </span>
6+
<span className="text-gray-500">{userType} </span>
77
</div>
88
);
99
}

src/components/Share/MyCanvas.jsx

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import React from 'react';
22
import StreamCanvas from './StreamCanvas';
33

4-
export default function MyCanvas({ streamManager }) {
4+
export default function MyCanvas({ streamManager, userType }) {
5+
const streamCanvas = `streamManager ? ( <StreamCanvas streamManager={streamManager} /> ) : null`;
6+
57
const getNicknameTag = () => {
68
return JSON.parse(streamManager.stream.connection.data).clientData;
79
};
@@ -11,14 +13,12 @@ export default function MyCanvas({ streamManager }) {
1113
<div className="h-full w-full border border-gray-300 rounded-lg flex items-center justify-center">
1214
<span className="text-gray-500">
1315
내 화면
14-
{streamManager ? (
15-
<div className="">
16-
<StreamCanvas streamManager={streamManager} />
17-
<div>
18-
<p className="">{getNicknameTag()}</p>
19-
</div>
16+
<div className="border-gray-300 rounded-lg">
17+
<StreamCanvas streamManager={streamManager} />
18+
<div>
19+
<p className="">{getNicknameTag()}</p>
2020
</div>
21-
) : null}
21+
</div>
2222
</span>
2323
</div>
2424
</div>

src/components/Share/StreamCanvas.jsx

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import React, { useEffect } from 'react';
1+
import React, { useEffect, useRef } from 'react';
2+
import { Tldraw } from 'tldraw';
23

34
export default function StreamCanvas({ streamManager }) {
45
const canvasRef = useRef(null);
6+
const tldrawRef = useRef(null);
57

68
useEffect(() => {
79
if (streamManager && canvasRef.current) {
@@ -10,8 +12,11 @@ export default function StreamCanvas({ streamManager }) {
1012
}, [streamManager]);
1113

1214
return (
13-
<video
14-
autoPlay
15-
ref={canvasRef}></video>
15+
<div className="fixed inset-0">
16+
<Tldraw ref={canvasRef} />
17+
{/* <video
18+
autoPlay
19+
ref={canvasRef}></video> */}
20+
</div>
1621
);
1722
}

src/main.jsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Login from './pages/Login';
66
import AppRouter from './routes/AppRouter';
77

88
createRoot(document.getElementById('root')).render(
9-
<StrictMode>
10-
<App />
11-
</StrictMode>
9+
// <StrictMode>
10+
<App />
11+
// </StrictMode>
1212
);

src/pages/Share.jsx

+14-58
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import FriendCanvas from '@/components/Share/FriendCanvas';
22
import MyCanvas from '@/components/Share/MyCanvas';
33
import React, { useEffect, useRef, useState } from 'react';
4+
import { OpenVidu } from 'openvidu-browser';
5+
import axios from 'axios';
46

57
const APPLICATION_SERVER_URL =
6-
process.env.NODE_ENV === 'dev'
7-
? 'http://localhost:5000'
8+
process.env.NODE_ENV === 'development'
9+
? 'http://localhost:5000/'
810
: 'https://demos.openvidu.io/';
911

1012
export default function Share() {
@@ -16,20 +18,19 @@ export default function Share() {
1618
const [mainStreamManager, setMainStreamManager] = useState(undefined);
1719
const [publisher, setPublisher] = useState(undefined);
1820
const [subscribers, setSubscribers] = useState([]);
19-
const [currentVideoDevice, setCurrentVideoDevice] = useState(undefined);
2021

2122
const OV = useRef(null);
2223

2324
useEffect(() => {
2425
window.addEventListener('beforeunload', leaveSession);
26+
joinSession({ preventDefault: () => {} });
2527
return () => {
2628
window.removeEventListener('beforeunload', leaveSession);
2729
};
2830
}, []);
2931

3032
const handleChangeSessionId = (e) => setMySessionId(e.target.value);
3133
const handleChangeUserName = (e) => setMyUserName(e.target.value);
32-
const handleMainVideoStream = (stream) => setMainStreamManager(stream);
3334

3435
const deleteSubscriber = (streamManager) => {
3536
setSubscribers((prev) => prev.filter((sub) => sub !== streamManager));
@@ -58,28 +59,14 @@ export default function Share() {
5859
await newSession.connect(token, { clientData: myUserName });
5960

6061
const newPublisher = await OV.current.initPublisherAsync(undefined, {
61-
audioSource: undefined,
62-
videoSource: undefined,
63-
publishAudio: true,
62+
audioSource: false,
63+
videoSource: undefined, // undefined
64+
publishAudio: false,
6465
publishVideo: true, //false
65-
resolution: '640x480',
66-
frameRate: 30,
67-
insertMode: 'APPEND',
6866
mirror: false,
6967
});
7068

71-
newSession.publish(newPublisher);
72-
const devices = await OV.current.getDevices();
73-
const videoDevices = devices.filter(
74-
(device) => device.kind === 'videoinput'
75-
);
76-
const currentVideoDeviceId = newPublisher.stream
77-
.getMediaStream()
78-
.getVideoTracks()[0]
79-
.getSettings().deviceId;
80-
const currentVideoDevice = videoDevices.find(
81-
(device) => device.deviceId === currentVideoDeviceId
82-
);
69+
await newSession.publish(newPublisher);
8370

8471
setSession(newSession);
8572
setPublisher(newPublisher);
@@ -98,6 +85,7 @@ export default function Share() {
9885
if (session) {
9986
session.disconnect();
10087
}
88+
10189
OV.current = null;
10290
setSession(undefined);
10391
setSubscribers([]);
@@ -107,38 +95,6 @@ export default function Share() {
10795
setPublisher(undefined);
10896
};
10997

110-
const switchCamera = async () => {
111-
try {
112-
const devices = await OV.current.getDevices();
113-
const videoDevices = devices.filter(
114-
(device) => device.kind === 'videoinput'
115-
);
116-
117-
if (videoDevices.length > 1) {
118-
const newVideoDevice = videoDevices.find(
119-
(device) => device.deviceId !== currentVideoDevice.deviceId
120-
);
121-
if (newVideoDevice) {
122-
const newPublisher = OV.current.initPublisher(undefined, {
123-
videoSource: newVideoDevice.deviceId,
124-
publishAudio: true,
125-
publishVideo: true,
126-
mirror: true,
127-
});
128-
129-
await session.unpublish(mainStreamManager);
130-
await session.publish(newPublisher);
131-
132-
setCurrentVideoDevice(newVideoDevice);
133-
setMainStreamManager(newPublisher);
134-
setPublisher(newPublisher);
135-
}
136-
}
137-
} catch (e) {
138-
console.error(e);
139-
}
140-
};
141-
14298
const getToken = async () => {
14399
const sessionId = await createSession(mySessionId);
144100
return await createToken(sessionId);
@@ -167,13 +123,13 @@ export default function Share() {
167123
};
168124

169125
return (
170-
<div className="flex h-screen w-[90%] bg-gray-100 p-4">
171-
<MyCanvas />
172-
<div className="w-1/4 flex flex-col gap-2 ml-4">
126+
<div className="flex h-screen w-[100%] bg-gray-100 p-4">
127+
{mainStreamManager && <MyCanvas streamManager={mainStreamManager} />}
128+
{/* <div className="w-1/4 flex flex-col gap-2 ml-4">
173129
{[...Array(parseInt(3))].map((friend, index) => (
174130
<FriendCanvas key={index} />
175131
))}
176-
</div>
132+
</div> */}
177133
</div>
178134
);
179135
}

0 commit comments

Comments
 (0)