packages/storybook8/stories/Concepts/MediaAccess/snippets/MediaAccessMicCameraCapabilities.snippet.tsx (73 lines of code) (raw):
import { CapabilitiesChangeInfo } from '@azure/communication-calling';
import { AzureCommunicationTokenCredential, CommunicationUserIdentifier } from '@azure/communication-common';
import {
CallAdapter,
CallComposite,
CallCompositeOptions,
CompositeLocale,
useAzureCommunicationCallAdapter
} from '@azure/communication-react';
import { PartialTheme, Theme } from '@fluentui/react';
import React, { useCallback, useMemo } from 'react';
export type ContainerProps = {
userId: CommunicationUserIdentifier;
token: string;
formFactor?: 'desktop' | 'mobile';
fluentTheme?: PartialTheme | Theme;
locale?: CompositeLocale;
options?: CallCompositeOptions;
meetingLink?: string;
};
export const ContosoCallContainer = (props: ContainerProps): JSX.Element => {
const credential = useMemo(() => {
try {
return new AzureCommunicationTokenCredential(props.token);
} catch {
console.error('Failed to construct token credential');
return undefined;
}
}, [props.token]);
const callAdapterArgs = useMemo(
() => ({
userId: props.userId,
credential,
locator: props.meetingLink
? {
meetingLink: props.meetingLink
}
: undefined
}),
[props.userId, credential, props.meetingLink]
);
/**
* Logging local participants' Media access state with capabilitiesChanged event
* unmuteMic: true if the user can unmute the microphone, false otherwise
* turnVideoOn: true if the user can turn on the video, false otherwise
*/
const afterCallAdapterCreate = useCallback(async (adapter: CallAdapter): Promise<CallAdapter> => {
adapter.on('capabilitiesChanged', (capabilitiesChangeInfo: CapabilitiesChangeInfo) => {
if (capabilitiesChangeInfo.newValue.unmuteMic !== undefined) {
console.log('unmuteMic capabilities changed info: ', capabilitiesChangeInfo);
}
if (capabilitiesChangeInfo.newValue.turnVideoOn !== undefined) {
console.log('turnVideoOn capabilities changed info: ', capabilitiesChangeInfo);
}
});
return adapter;
}, []);
const adapter = useAzureCommunicationCallAdapter(callAdapterArgs, afterCallAdapterCreate);
if (!props.meetingLink) {
return <>Teams meeting link is not provided.</>;
}
if (adapter) {
return (
<div style={{ height: '90vh', width: '90vw' }}>
<CallComposite
adapter={adapter}
formFactor={props.formFactor}
fluentTheme={props.fluentTheme}
locale={props?.locale}
options={props?.options}
/>
</div>
);
}
if (credential === undefined) {
return <>Failed to construct credential. Provided token is malformed.</>;
}
return <>Initializing...</>;
};