jitsi-meet/react/features/toolbox/hooks.native.ts
theluyuan 38ba663466
Some checks failed
Close stale issues and PRs / stale (push) Has been cancelled
init
2025-09-02 14:49:16 +08:00

182 lines
4.4 KiB
TypeScript

import { useSelector } from 'react-redux';
import ChatButton from '../chat/components/native/ChatButton';
import RaiseHandContainerButtons from '../reactions/components/native/RaiseHandContainerButtons';
import TileViewButton from '../video-layout/components/TileViewButton';
import { iAmVisitor } from '../visitors/functions';
import AudioMuteButton from './components/native/AudioMuteButton';
import CustomOptionButton from './components/native/CustomOptionButton';
import HangupContainerButtons from './components/native/HangupContainerButtons';
import OverflowMenuButton from './components/native/OverflowMenuButton';
import ScreenSharingButton from './components/native/ScreenSharingButton';
import VideoMuteButton from './components/native/VideoMuteButton';
import { isDesktopShareButtonDisabled } from './functions.native';
import { ICustomToolbarButton, IToolboxNativeButton, NativeToolbarButton } from './types';
const microphone = {
key: 'microphone',
Content: AudioMuteButton,
group: 0
};
const camera = {
key: 'camera',
Content: VideoMuteButton,
group: 0
};
const chat = {
key: 'chat',
Content: ChatButton,
group: 1
};
const screensharing = {
key: 'desktop',
Content: ScreenSharingButton,
group: 1
};
const raisehand = {
key: 'raisehand',
Content: RaiseHandContainerButtons,
group: 2
};
const tileview = {
key: 'tileview',
Content: TileViewButton,
group: 2
};
const overflowmenu = {
key: 'overflowmenu',
Content: OverflowMenuButton,
group: 3
};
const hangup = {
key: 'hangup',
Content: HangupContainerButtons,
group: 3
};
/**
* A hook that returns the audio mute button.
*
* @returns {Object | undefined}
*/
function getAudioMuteButton() {
const _iAmVisitor = useSelector(iAmVisitor);
if (!_iAmVisitor) {
return microphone;
}
}
/**
* A hook that returns the video mute button.
*
* @returns {Object | undefined}
*/
function getVideoMuteButton() {
const _iAmVisitor = useSelector(iAmVisitor);
if (!_iAmVisitor) {
return camera;
}
}
/**
* A hook that returns the chat button.
*
* @returns {Object | undefined}
*/
function getChatButton() {
return chat;
}
/**
* A hook that returns the screen sharing button.
*
* @returns {Object | undefined}
*/
function getScreenSharingButton() {
const _iAmVisitor = useSelector(iAmVisitor);
const _isScreenShareButtonDisabled = useSelector(isDesktopShareButtonDisabled);
if (!_isScreenShareButtonDisabled && !_iAmVisitor) {
return screensharing;
}
}
/**
* A hook that returns the tile view button.
*
* @returns {Object | undefined}
*/
function getTileViewButton() {
return tileview;
}
/**
* A hook that returns the overflow menu button.
*
* @returns {Object | undefined}
*/
function getOverflowMenuButton() {
return overflowmenu;
}
/**
* Returns all buttons that could be rendered.
*
* @param {Object} _customToolbarButtons - An array containing custom buttons objects.
* @returns {Object} The button maps mainMenuButtons and overflowMenuButtons.
*/
export function useNativeToolboxButtons(
_customToolbarButtons?: ICustomToolbarButton[]): { [key: string]: IToolboxNativeButton; } {
const audioMuteButton = getAudioMuteButton();
const videoMuteButton = getVideoMuteButton();
const chatButton = getChatButton();
const screenSharingButton = getScreenSharingButton();
const tileViewButton = getTileViewButton();
const overflowMenuButton = getOverflowMenuButton();
const buttons: { [key in NativeToolbarButton]?: IToolboxNativeButton; } = {
microphone: audioMuteButton,
camera: videoMuteButton,
chat: chatButton,
desktop: screenSharingButton,
raisehand,
tileview: tileViewButton,
overflowmenu: overflowMenuButton,
hangup
};
const buttonKeys = Object.keys(buttons) as NativeToolbarButton[];
buttonKeys.forEach(
key => typeof buttons[key] === 'undefined' && delete buttons[key]);
const customButtons = _customToolbarButtons?.reduce((prev, { backgroundColor, icon, id, text }) => {
prev[id] = {
backgroundColor,
key: id,
id,
Content: CustomOptionButton,
group: 4,
icon,
text
};
return prev;
}, {} as { [key: string]: ICustomToolbarButton; });
return {
...buttons,
...customButtons
};
}