Rocket.Chat.ReactNative/app/lib/hooks/useVideoConf/index.tsx

78 lines
2.5 KiB
TypeScript

import { Camera } from 'expo-camera';
import React, { useMemo } from 'react';
import { useActionSheet } from '../../../containers/ActionSheet';
import i18n from '../../../i18n';
import { getUserSelector } from '../../../selectors/login';
import { compareServerVersion, showErrorAlert } from '../../methods/helpers';
import log from '../../methods/helpers/log';
import { handleAndroidBltPermission } from '../../methods/videoConf';
import { Services } from '../../services';
import { useAppSelector } from '../useAppSelector';
import StartACallActionSheet from './StartACallActionSheet';
import { useVideoConfCall } from './useVideoConfCall';
const availabilityErrors = {
NOT_CONFIGURED: 'video-conf-provider-not-configured',
NOT_ACTIVE: 'no-active-video-conf-provider',
NO_APP: 'no-videoconf-provider-app'
} as const;
const handleErrors = (isAdmin: boolean, error: keyof typeof availabilityErrors) => {
const key = isAdmin ? `admin-${error}` : error;
const body = `${key}-body`;
const header = `${key}-header`;
if (i18n.isTranslated(body) && i18n.isTranslated(header)) showErrorAlert(i18n.t(body), i18n.t(header));
};
export const useVideoConf = (
rid: string
): { showInitCallActionSheet: () => Promise<void>; callEnabled: boolean; disabledTooltip?: boolean } => {
const user = useAppSelector(state => getUserSelector(state));
const serverVersion = useAppSelector(state => state.server.version);
const { callEnabled, disabledTooltip } = useVideoConfCall(rid);
const [permission, requestPermission] = Camera.useCameraPermissions();
const { showActionSheet } = useActionSheet();
const isServer5OrNewer = useMemo(() => compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '5.0.0'), [serverVersion]);
const canInitAnCall = async (): Promise<boolean> => {
if (!callEnabled) return false;
if (isServer5OrNewer) {
try {
await Services.videoConferenceGetCapabilities();
return true;
} catch (error: any) {
const isAdmin = !!user.roles?.includes('admin');
handleErrors(isAdmin, error?.data?.error || availabilityErrors.NOT_CONFIGURED);
return false;
}
}
return true;
};
const showInitCallActionSheet = async () => {
try {
const canInit = await canInitAnCall();
if (canInit) {
showActionSheet({
children: <StartACallActionSheet rid={rid} />,
snaps: [480]
});
if (!permission?.granted) {
requestPermission();
handleAndroidBltPermission();
}
}
} catch (error) {
log(error);
}
};
return { showInitCallActionSheet, callEnabled, disabledTooltip };
};