テンプレート詳細
metatellのプラグインは、企業ごとに2D UIを差し替えるための機能です。
このページでは、各テンプレートの役割と開発方法をまとめています。
📦 GitHubテンプレートリポジトリ: https://github.com/urth-inc/metatell-plugin-template
プラグインの役割と適用ポイント
metatell本体では、次の順序でModule Federationプラグインを読み込みます。
- ルームのプラグイン情報を取得し、
init({ remotes })でリモートを登録 - 各プラグインを
src = "{versionId}/{type}"形式に変換 - 画面ごとの差し込みポイントで
loadRemote(src)し、module.CustomXXXを描画
適用ルール(重要)
AdditionalToolbarButton と CustomOverlay は複数適用可能です。
上記以外は単一適用です。
テンプレート一覧
| type | 置き換えるUI | 表示タイミング | 複数適用 | 公開コンポーネント名 |
|---|---|---|---|---|
AdditionalToolbarButton | ツールバー追加ボタン | 入室後 | 可 | AdditionalToolbarButton |
CustomOverlay | 画面固定オーバーレイ | 入室後 | 可 | CustomOverlay |
CustomEntryPanel | 入室前パネル | 入室前 | 不可 | CustomEntryPanel |
CustomProfileModal | プロフィール編集モーダル | プロフィール編集時 | 不可 | CustomProfileModal |
CustomLeaveButton | 退出ボタン・退出モーダル導線 | 入室後 | 不可 | CustomLeaveButton |
CustomChatButton | チャットボタン・チャットUI | 入室後 | 不可 | CustomChatButton |
CustomMegaphoneButton | メガホンボタン | 入室後 | 不可 | CustomMegaphoneButton |
CustomWebCameraButton | Webカメラボタン | 入室後 | 不可 | CustomWebCameraButton |
CustomTutorial | チュートリアル表示 | 入室後 | 不可 | CustomTutorial |
CustomNearestUserProfile | 最寄り利用者表示 | 入室後 | 不可 | CustomNearestUserProfile |
CustomExitScreen | 退室/エラー画面 | ルーム離脱時 | 不可 | CustomExitScreen |
共通開発フロー
1. テンプレートを選ぶ
git clone https://github.com/urth-inc/metatell-plugin-template.git
cd metatell-plugin-template/<テンプレート名>
2. 依存関係をインストール
npm install
3. 開発用ローカル環境を起動
npm run dev
- Webpack系テンプレート:
http://localhost:3004 CustomExitScreen(Vite):http://localhost:5173
4. package.jsonのメタデータを設定
{
"name": "my-plugin",
"version": "0.1.0",
"description": "My metatell plugin"
}
5. ビルド
npm run build
dist/plugin.zipを管理画面に登録します。
npm run dev/npm run build実行時にVERSION_IDは再生成されます(同一ID固定ではありません)。
各テンプレート詳細
AdditionalToolbarButton
何を置き換えるか
標準ツールバーに、追加ボタンを挿入します。
差し込み位置
入室後のツールバー追加領域です。
受け取るProps
type AdditionalToolbarButtonProps = {}
開発時の注意点
複数適用可能です。
- エクスポート名は
AdditionalToolbarButtonにしてください。
CustomOverlay
何を置き換えるか
画面固定のカスタムオーバーレイUIを描画します。
差し込み位置
入室後の画面固定オーバーレイ領域です。
受け取るProps
type CustomOverlayProps = {}
開発時の注意点
複数適用可能です。
- エクスポート名は
CustomOverlayにしてください。
CustomEntryPanel
何を置き換えるか
入室前のエントリーパネル全体を置き換えます。
差し込み位置
入室前のエントリーパネル領域です。
受け取るProps
type CustomEntryPanelProps = {
roomName: string | undefined
logoUrl: string | undefined
showJoinRoom: boolean
isRoomFull: boolean
onJoinRoom: () => void
showEnterOnDevice: boolean
onEnterOnDevice: () => void
showSpectate: boolean
onSpectate: () => void
showOptions: boolean
onOptions: () => void
leftImage: React.ReactNode
rightImage: React.ReactNode
leftMessage: string
rightMessage: string
termsOfServiceUrl: string | undefined
privacyPolicyUrl: string | undefined
audioSetupContainer: React.ReactNode
}
開発時の注意点
- エクスポート名は
CustomEntryPanelにしてください。 音声デバイス設定UIとしてaudioSetupContainerが渡されます。
CustomProfileModal
何を置き換えるか
プロフィール編集モーダルのUIを置き換えます。
差し込み位置
プロフィール編集モーダル領域です。
受け取るProps
type CustomProfileModalProps = {
isOpen: boolean
onClose: () => void
displayName: string
bio: string
avatarId: string | undefined
avatarThumbnailUrl: string | undefined
selectedAvatarId: string | undefined
selectedAvatarThumbnailUrl: string | undefined
openAvatarSelectModal: () => void
saveProfile: (arg: { displayName?: string; bio?: string; avatarId?: string }) => void
}
開発時の注意点
- エクスポート名は
CustomProfileModalにしてください。 - 既存の保存処理は
saveProfile経由で呼び出してください。
CustomLeaveButton
何を置き換えるか
退出ボタンと退出モーダル表示導線を置き換えます。
差し込み位置
入室後の右側ツールバー(退出導線) です。
受け取るProps
type CustomLeaveButtonProps = {
destinationUrl: string
showDefaultModal: () => void
}
開発時の注意点
- エクスポート名は
CustomLeaveButtonにしてください。 - 既定モーダルを使う場合は
showDefaultModalを呼び出してください。
CustomChatButton
何を置き換えるか
チャットボタンとチャットUI(モーダル)を置き換えます。
差し込み位置
入室後の中央ツールバー(チャット導線)です。
受け取るProps
type MessageGroup = {
id: number
type: "chat" | "join" | "entered" | "leave" | "display_name_changed" | "hub_name_changed"
timestamp: number
sender?: string
senderSessionId?: string
messages?: { id: number; body: string; timestamp: number }[]
name?: string
hubName?: string
oldName?: string
newName?: string
}
type CustomChatButtonProps = {
toggleDefaultModal: () => void
canSpawnMessages: boolean
onUploadFiles: (event: React.ChangeEvent<HTMLInputElement>) => void
sendMessage: (message: string) => void
messageGroups: MessageGroup[]
}
開発時の注意点
- エクスポート名は
CustomChatButtonにしてください。 spawnChatMessageは渡されません。
CustomMegaphoneButton
何を置き換えるか
メガホン機能のボタンUIを置き換えます。
差し込み位置
入室後の中央ツールバー(メガホン導線)です。
受け取るProps
type CustomMegaphoneButtonProps = {
canMegaphone: boolean
isActiveMegaphone: boolean
muteMegaphone: () => Promise<void>
unmuteMegaphone: () => Promise<void>
mySessionId: string | undefined
messageDispatch: EventTarget
temporalMegaphone: boolean
requestMegaphone: () => void
grantMegaphone: () => Promise<void>
revokeMegaphone: () => Promise<void>
approveMegaphoneRequest: (sessionId: string) => void
denyMegaphoneRequest: (sessionId: string) => void
}
開発時の注意点
- エクスポート名は
CustomMegaphoneButtonにしてください。 - 承認/却下フローの両方に対応してください。