# (2) ビデオチャットの追加
このチュートリアルは、テキストチャットを設置するチュートリアル の続きです。まだテキストチャットのチュートリアルを終えていない場合は、先にそちらに取り組んでください。
# 1. ビデオチャットの UI をレンダリングする
テキストチャットと同様に、ビデオチャットも プレビルド UI を利用することもできますが、チュートリアルでは自前で UI を構築する方法を見ていきます。
<div id="video-chat"></div>
<div id="streams"></div>
const data = {
messages: [],
streams: {},
isVideoStarted: false,
}
const render = (props) => {
const { messages, streams, isVideoStarted } = props
renderTextChat({ messages })
renderVideoChat({ streams, isVideoStarted })
}
const renderVideoChat = (props) => {
let html = `
<button type="button" onclick="startVideoChat()">
ビデオチャットを開始
</button>
`
if (props.isVideoStarted) {
html = `
<button type="button" onclick="finishVideoChat()">
ビデオチャットを終了
</button>
`
}
document.getElementById('video-chat').innerHTML = html
const streams = document.getElementById('streams')
// <video>要素を設置して通話相手のビデオを表示
for (const [id, stream] of Object.entries(props.streams)) {
if (!streams.querySelector(`[data-user-id="${id}"]`)) {
const video = document.createElement('video')
video.srcObject = stream
video.play()
video.setAttribute('data-user-id', id)
streams.appendChild(video)
}
}
// 通話が終了した<video>を削除
const ids = Object.keys(props.streams)
for (const node of stream.querySelectorAll('video')) {
const id = node.getAttribute('data-user-id')
if (!ids.includes(id)) {
stream.removeChild(node)
}
}
}
# 2. ビデオチャットを開始/終了する
room.video
でビデオチャットの API にアクセスできます。以下のコードを記述します。
const startVideoChat = async () => {
const media = await room.video.requestMedia({ video: true, audio: true })
await room.video.call(media)
}
const finishVideoChat = async () => {
await room.video.hangup()
}
room.video.onCall((user, stream) => {
data.streams[user.id] = stream
render(data)
})
room.video.onHangup((user) => {
delete data.streams[user.id]
render(data)
})
これでビデオチャットの設置は完了です! ここまでのコード全文は GitHub にあります。
# 3. 動作を確認する
作成したページを2つのタブ(もしくは2つのブラウザ)で開きます。
// TODO: スクショ等を貼る
# 次のステップ
プレビルド UI を利用してリッチな UI をすばやく構築します。