@azure/communication-react 1.5.1-alpha-202302070015 → 1.5.1-alpha-202302090014
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist-cjs/communication-react/index.js +62 -46
- package/dist/dist-cjs/communication-react/index.js.map +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +0 -4
- package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js +53 -33
- package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +3 -2
- package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoTile.js +5 -6
- package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
- package/package.json +8 -8
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"StreamUtils.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StreamUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n CreateViewOptions,\n LocalVideoStream,\n VideoStreamRenderer,\n VideoStreamRendererView\n} from '@azure/communication-calling';\nimport { CommunicationIdentifierKind } from '@azure/communication-common';\nimport { LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport {\n convertSdkLocalStreamToDeclarativeLocalStream,\n convertSdkRemoteStreamToDeclarativeRemoteStream,\n convertFromSDKToDeclarativeVideoStreamRendererView\n} from './Converter';\nimport { InternalCallContext } from './InternalCallContext';\nimport { toFlatCommunicationIdentifier, _logEvent } from '@internal/acs-ui-common';\nimport { callingStatefulLogger, EventNames } from './Logger';\n\n/**\n * Return result from {@link StatefulCallClient.createView}.\n *\n * @public\n */\nexport type CreateViewResult = {\n renderer: VideoStreamRenderer;\n view: VideoStreamRendererView;\n};\n\nasync function createViewRemoteVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n participantId: CommunicationIdentifierKind | string,\n stream: RemoteVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n // Render RemoteVideoStream that is part of a Call\n const streamId = stream.id;\n let participantKey;\n if (typeof participantId === 'string') {\n participantKey = participantId;\n } else {\n participantKey = toFlatCommunicationIdentifier(participantId);\n }\n const streamLogInfo = { callId, participantKey, streamId };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATING_REMOTE_VIEW,\n level: 'info',\n message: 'Start creating view for remote video.',\n data: streamLogInfo\n });\n const renderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_NOT_FOUND,\n level: 'error',\n message: 'RemoteVideoStream not found in state.',\n data: streamLogInfo\n });\n console.warn('RemoteVideoStream not found in state');\n return;\n }\n\n if (renderInfo.status === 'Rendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_ALREADY_RENDERED,\n level: 'warning',\n message: 'RemoteVideoStream is already rendered.',\n data: streamLogInfo\n });\n console.warn('RemoteVideoStream is already rendered');\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_RENDERING,\n level: 'warning',\n message: 'RemoteVideoStream is rendering.',\n data: streamLogInfo\n });\n return;\n }\n\n // \"Stopping\" only happens if the stream was in \"rendering\" but `disposeView` was called.\n // Now that `createView` has been re-called, we can flip the state back to \"rendering\".\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'warning',\n message: 'RemoteVideoStream was marked as stopping by dispose view. Resetting state to \"Rendering\".'\n });\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n renderInfo.stream,\n 'Rendering',\n renderInfo.renderer\n );\n return;\n }\n\n const renderer = new VideoStreamRenderer(renderInfo.stream);\n\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Rendering', undefined);\n\n let view;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_REMOTE_STREAM_FAIL,\n level: 'error',\n message: 'Failed to create remote view',\n data: streamLogInfo\n });\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n if (!refreshedRenderInfo) {\n // RenderInfo was removed. This should not happen unless stream was removed from the call so dispose the renderer\n // and clean up state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_RENDER_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find remote render info after create the view.',\n data: streamLogInfo\n });\n renderer.dispose();\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_CREATED_STREAM_STOPPING,\n level: 'warning',\n message: 'Render info status is stopping, dispose renderer.',\n data: streamLogInfo\n });\n renderer.dispose();\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n refreshedRenderInfo.stream,\n 'NotRendered',\n undefined\n );\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n return;\n }\n\n // Else the stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n refreshedRenderInfo.stream,\n 'Rendered',\n renderer\n );\n context.setRemoteVideoStreamRendererView(\n callId,\n participantKey,\n streamId,\n convertFromSDKToDeclarativeVideoStreamRendererView(view)\n );\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_VIEW_RENDER_SUCCEED,\n level: 'info',\n message: `Successfully render the remote view.`,\n data: {\n streamLogInfo\n }\n });\n\n return {\n renderer,\n view\n };\n}\n\nasync function createViewLocalVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_LOCAL_STREAM_RENDERING,\n level: 'info',\n message: 'Start creating view for local video.'\n });\n // Render LocalVideoStream that is part of a Call\n const renderInfo = internalContext.getLocalRenderInfo(callId);\n\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_NOT_FOUND,\n level: 'error',\n message: 'LocalVideoStream not found in state.'\n });\n console.warn('LocalVideoStream not found in state');\n return;\n }\n\n if (renderInfo.status === 'Rendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_ALREADY_RENDERED,\n level: 'warning',\n message: 'LocalVideoStream is already rendered.'\n });\n console.warn('LocalVideoStream is already rendered');\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_RENDERING,\n level: 'warning',\n message: 'LocalVideoStream is rendering.'\n });\n return;\n }\n\n // \"Stopping\" only happens if the stream was in \"rendering\" but `disposeView` was called.\n // Now that `createView` has been re-called, we can flip the state back to \"rendering\".\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'warning',\n message: 'LocalVideoStream was marked as stopping by dispose view. Resetting state to \"Rendering\".'\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Rendering', renderInfo.renderer);\n return;\n }\n\n const renderer = new VideoStreamRenderer(renderInfo.stream);\n\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Rendering', renderer);\n\n let view;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_LOCAL_STREAM_FAIL,\n level: 'error',\n message: 'Failed to create view.',\n data: {\n error: e\n }\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'NotRendered', undefined);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getLocalRenderInfo(callId);\n if (!refreshedRenderInfo) {\n // RenderInfo was removed. This should not happen unless stream was removed from the call so dispose the renderer\n // and clean up the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDER_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find local render info after create the view. ',\n data: {\n callId\n }\n });\n renderer.dispose();\n context.setLocalVideoStreamRendererView(callId, undefined);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_CREATED_STREAM_STOPPING,\n level: 'warning',\n message: 'Render info status is stopping, dispose renderer.',\n data: {\n callId\n }\n });\n renderer.dispose();\n internalContext.setLocalRenderInfo(callId, refreshedRenderInfo.stream, 'NotRendered', undefined);\n context.setLocalVideoStreamRendererView(callId, undefined);\n return;\n }\n\n // Else The stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setLocalRenderInfo(callId, refreshedRenderInfo.stream, 'Rendered', renderer);\n context.setLocalVideoStreamRendererView(callId, convertFromSDKToDeclarativeVideoStreamRendererView(view));\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_VIEW_RENDER_SUCCEED,\n level: 'info',\n message: `Successfully render the local view.`,\n data: {\n callId\n }\n });\n\n return {\n renderer,\n view\n };\n}\n\nasync function createViewUnparentedVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n stream: LocalVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n const renderInfo = internalContext.getUnparentedRenderInfo(stream);\n\n if (renderInfo && renderInfo.status === 'Rendered') {\n console.warn('Unparented LocalVideoStream is already rendered');\n return;\n }\n\n if (renderInfo && renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n return;\n }\n\n if (renderInfo && renderInfo.status === 'Stopping') {\n console.warn('Unparented LocalVideoStream is in the middle of stopping');\n return;\n }\n\n const localVideoStream = new LocalVideoStream(stream.source);\n const renderer = new VideoStreamRenderer(localVideoStream);\n\n internalContext.setUnparentedRenderInfo(stream, localVideoStream, 'Rendering', undefined);\n\n let view: VideoStreamRendererView;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n // Special case for unparented views. Since they are not tied to anything and created by us based on the calls to\n // this function we'll delete it to clean up the data since keeping it around doesn't help us and if developer wants\n // to create a new view they can check that the view is not rendered and call this function again.\n internalContext.deleteUnparentedRenderInfo(stream);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getUnparentedRenderInfo(stream);\n if (!refreshedRenderInfo) {\n // Unparented stream's RenderInfo was deleted. Currently this shouldn't happen but if it does we'll just dispose the\n // renderer and clean up state. If developer wanted the stream they could call this function again and that should\n // generate new working state via this function.\n renderer.dispose();\n context.deleteDeviceManagerUnparentedView(stream);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state. Special case for unparented views, delete them from state when stopped to free up\n // the memory since we were the ones generating this and not tied to any Call state.\n internalContext.deleteUnparentedRenderInfo(stream);\n context.deleteDeviceManagerUnparentedView(stream);\n return;\n }\n\n // Else the stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setUnparentedRenderInfo(stream, localVideoStream, 'Rendered', renderer);\n context.setDeviceManagerUnparentedView(stream, convertFromSDKToDeclarativeVideoStreamRendererView(view));\n\n return {\n renderer,\n view\n };\n}\n\nfunction disposeViewRemoteVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n participantId: CommunicationIdentifierKind | string,\n stream: RemoteVideoStreamState\n): void {\n const streamId = stream.id;\n\n let participantKey;\n if (typeof participantId === 'string') {\n participantKey = participantId;\n } else {\n participantKey = toFlatCommunicationIdentifier(participantId);\n }\n\n const streamLogInfo = { callId, participantKey, streamId };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_REMOTE_STREAM,\n level: 'info',\n message: 'Start disposing remote stream.',\n data: streamLogInfo\n });\n\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n\n const renderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing remote stream.',\n data: streamLogInfo\n });\n return;\n }\n\n // Nothing to dispose of or clean up -- we can safely exit early here.\n if (renderInfo.status === 'NotRendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_ALREADY_DISPOSED,\n level: 'info',\n message: 'RemoteVideoStream is already disposed.',\n data: streamLogInfo\n });\n return;\n }\n\n // Status is already marked as \"stopping\" so we can exit early here. This is because stopping only occurs\n // when the stream is being created in createView but hasn't been completed being created yet. The createView\n // method will see the \"stopping\" status and perform the cleanup\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is already stopping.',\n data: streamLogInfo\n });\n return;\n }\n\n // If the stream is in the middle of being rendered (i.e. has state \"Rendering\"), we need the status as\n // \"stopping\" without performing any cleanup. This will tell the `createView` method that it should stop\n // rendering and clean up the state once the view has finished being created.\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is still rendering. Changing status to stopping.',\n data: streamLogInfo\n });\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Stopping', undefined);\n return;\n }\n\n // Else the state must be in the \"Rendered\" state, so we can dispose the renderer and clean up the state.\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_REMOTE_RENDERER,\n level: 'info',\n message: 'Disposing remote view renderer.',\n data: streamLogInfo\n });\n renderInfo.renderer.dispose();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find remote view renderer.',\n data: streamLogInfo\n });\n }\n}\n\nfunction disposeViewLocalVideo(context: CallContext, internalContext: InternalCallContext, callId: string): void {\n const streamLogInfo = { callId };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_LOCAL_STREAM,\n level: 'info',\n message: 'Start disposing local stream.',\n data: streamLogInfo\n });\n\n context.setLocalVideoStreamRendererView(callId, undefined);\n\n const renderInfo = internalContext.getLocalRenderInfo(callId);\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing local stream.',\n data: streamLogInfo\n });\n return;\n }\n\n // Nothing to dispose of or clean up -- we can safely exit early here.\n if (renderInfo.status === 'NotRendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_ALREADY_DISPOSED,\n level: 'info',\n message: 'LocalVideoStream is already disposed.'\n });\n return;\n }\n\n // Status is already marked as \"stopping\" so we can exit early here. This is because stopping only occurs\n // when the stream is being created in createView but hasn't been completed being created yet. The createView\n // method will see the \"stopping\" status and perform the cleanup\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'info',\n message: 'Local stream is already stopping.',\n data: streamLogInfo\n });\n return;\n }\n\n // If the stream is in the middle of being rendered (i.e. has state \"Rendering\"), we need the status as\n // \"stopping\" without performing any cleanup. This will tell the `createView` method that it should stop\n // rendering and clean up the state once the view has finished being created.\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is still rendering. Changing status to stopping.',\n data: streamLogInfo\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Stopping', renderInfo.renderer);\n return;\n }\n\n // Else the state must be in the \"Rendered\" state, so we can dispose the renderer and clean up the state.\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'NotRendered', undefined);\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_LOCAL_RENDERER,\n level: 'info',\n message: 'Disposing local view renderer.',\n data: streamLogInfo\n });\n renderInfo.renderer.dispose();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find renderer when disposing local stream.',\n data: streamLogInfo\n });\n }\n}\n\nfunction disposeViewUnparentedVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n stream: LocalVideoStreamState\n): void {\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_LOCAL_STREAM,\n level: 'info',\n message: 'Start disposing unparented local stream.'\n });\n\n context.deleteDeviceManagerUnparentedView(stream);\n\n const renderInfo = internalContext.getUnparentedRenderInfo(stream);\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing unparented local stream.'\n });\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'info',\n message: 'Unparented local stream is still rendering. Changing status to stopping.'\n });\n internalContext.setUnparentedRenderInfo(stream, renderInfo.stream, 'Stopping', undefined);\n } else {\n internalContext.deleteUnparentedRenderInfo(stream);\n }\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_LOCAL_RENDERER,\n level: 'info',\n message: 'Disposing unparented local view renderer.'\n });\n renderInfo.renderer.dispose();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find renderer when disposing unparented local stream.'\n });\n }\n}\n\n/**\n * @private\n */\nexport function createView(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string | undefined,\n participantId: CommunicationIdentifierKind | string | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n if ('id' in stream && callId && participantId) {\n // Render RemoteVideoStream that is part of a Call\n return createViewRemoteVideo(context, internalContext, callId, participantId, stream, options);\n } else if (!('id' in stream) && callId) {\n // Render LocalVideoStream that is part of a Call\n return createViewLocalVideo(context, internalContext, callId, options);\n } else if (!('id' in stream) && !callId) {\n // Render LocalVideoStream that is not part of a Call\n // Because it is not part of the call we don't tee errors to state naturally (e.g. via a Call Client function such as startVideo).\n // We do not have a startLocalPreviewVideo function, so as a workaround we ensure any errors are propagated here.\n return context.withAsyncErrorTeedToState(\n async () => await createViewUnparentedVideo(context, internalContext, stream, options),\n 'Call.startVideo'\n )();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_STREAM_INVALID_PARAMS,\n level: 'warning',\n message: 'Create View invalid combination of parameters.'\n });\n return Promise.resolve(undefined);\n }\n}\n\n/**\n * @private\n */\nexport function disposeView(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string | undefined,\n participantId: CommunicationIdentifierKind | string | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n): void {\n if ('id' in stream && callId && participantId) {\n // Stop rendering RemoteVideoStream that is part of a Call\n disposeViewRemoteVideo(context, internalContext, callId, participantId, stream);\n } else if (!('id' in stream) && callId) {\n // Stop rendering LocalVideoStream that is part of a Call\n disposeViewLocalVideo(context, internalContext, callId);\n } else if (!('id' in stream) && !callId) {\n // Stop rendering LocalVideoStream that is not part of a Call\n // Because it is not part of the call we don't tee errors to state naturally (e.g. via a Call Client function such as startVideo).\n // We do not have a stopLocalPreviewVideo function, so as a workaround we ensure any errors are propagated here.\n context.withErrorTeedToState(\n () => disposeViewUnparentedVideo(context, internalContext, stream),\n 'Call.stopVideo'\n )();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSE_STREAM_INVALID_PARAMS,\n level: 'warning',\n message: 'Dispose View invalid combination of parameters.'\n });\n return;\n }\n}\n\n/**\n * @private\n * Only stops videos that are tied to a Call.\n */\nexport function disposeAllViewsFromCall(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string\n): void {\n const callStreams = internalContext.getRemoteRenderInfoForCall(callId);\n if (callStreams) {\n for (const [participantKey, participantStreams] of callStreams.entries()) {\n for (const [_, remoteStreamAndRenderer] of participantStreams.entries()) {\n // We don't want to accept SDK stream as parameter but we also don't cache the declarative stream so we have to\n // convert the SDK stream to declarative stream which is not pretty so this could use some further refactoring.\n disposeView(\n context,\n internalContext,\n callId,\n participantKey,\n convertSdkRemoteStreamToDeclarativeRemoteStream(remoteStreamAndRenderer.stream)\n );\n }\n }\n }\n const localStreamAndRenderer = internalContext.getLocalRenderInfo(callId);\n if (localStreamAndRenderer && localStreamAndRenderer.renderer) {\n // We don't want to accept SDK stream as parameter but we also don't cache the declarative stream so we have to\n // convert the SDK stream to declarative stream which is not pretty so this could use some further refactoring.\n disposeView(\n context,\n internalContext,\n callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(localStreamAndRenderer.stream)\n );\n }\n}\n\n/**\n * @private\n */\nexport function disposeAllViews(context: CallContext, internalContext: InternalCallContext): void {\n const callIds = internalContext.getCallIds();\n for (const callId of callIds) {\n disposeAllViewsFromCall(context, internalContext, callId);\n }\n}\n\"../../acs-ui-common/src\""]}
|
1
|
+
{"version":3,"file":"StreamUtils.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StreamUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n CreateViewOptions,\n LocalVideoStream,\n VideoStreamRenderer,\n VideoStreamRendererView\n} from '@azure/communication-calling';\nimport { CommunicationIdentifierKind } from '@azure/communication-common';\nimport { LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport {\n convertSdkLocalStreamToDeclarativeLocalStream,\n convertSdkRemoteStreamToDeclarativeRemoteStream,\n convertFromSDKToDeclarativeVideoStreamRendererView\n} from './Converter';\nimport { InternalCallContext } from './InternalCallContext';\nimport { toFlatCommunicationIdentifier, _logEvent } from '@internal/acs-ui-common';\nimport { callingStatefulLogger, EventNames } from './Logger';\n\n/**\n * Return result from {@link StatefulCallClient.createView}.\n *\n * @public\n */\nexport type CreateViewResult = {\n renderer: VideoStreamRenderer;\n view: VideoStreamRendererView;\n};\n\nasync function createViewRemoteVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n participantId: CommunicationIdentifierKind | string,\n stream: RemoteVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n // Render RemoteVideoStream that is part of a Call\n const streamId = stream.id;\n const streamType = stream.mediaStreamType;\n let participantKey;\n if (typeof participantId === 'string') {\n participantKey = participantId;\n } else {\n participantKey = toFlatCommunicationIdentifier(participantId);\n }\n const streamLogInfo = { callId, participantKey, streamId, streamType };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATING_REMOTE_VIEW,\n level: 'info',\n message: 'Start creating view for remote video.',\n data: streamLogInfo\n });\n const renderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_NOT_FOUND,\n level: 'error',\n message: 'RemoteVideoStream not found in state.',\n data: streamLogInfo\n });\n console.warn('RemoteVideoStream not found in state');\n return;\n }\n\n if (renderInfo.status === 'Rendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_ALREADY_RENDERED,\n level: 'warning',\n message: 'RemoteVideoStream is already rendered.',\n data: streamLogInfo\n });\n console.warn('RemoteVideoStream is already rendered');\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_RENDERING,\n level: 'warning',\n message: 'RemoteVideoStream is rendering.',\n data: streamLogInfo\n });\n return;\n }\n\n // \"Stopping\" only happens if the stream was in \"rendering\" but `disposeView` was called.\n // Now that `createView` has been re-called, we can flip the state back to \"rendering\".\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'warning',\n message: 'RemoteVideoStream was marked as stopping by dispose view. Resetting state to \"Rendering\".',\n data: streamLogInfo\n });\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n renderInfo.stream,\n 'Rendering',\n renderInfo.renderer\n );\n return;\n }\n\n const renderer = new VideoStreamRenderer(renderInfo.stream);\n\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Rendering', undefined);\n\n let view;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_REMOTE_STREAM_FAIL,\n level: 'error',\n message: 'Failed to create remote view',\n data: streamLogInfo\n });\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n if (!refreshedRenderInfo) {\n // RenderInfo was removed. This should not happen unless stream was removed from the call so dispose the renderer\n // and clean up state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_RENDER_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find remote render info after create the view.',\n data: streamLogInfo\n });\n renderer.dispose();\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_CREATED_STREAM_STOPPING,\n level: 'warning',\n message: 'Render info status is stopping, dispose renderer.',\n data: streamLogInfo\n });\n renderer.dispose();\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n refreshedRenderInfo.stream,\n 'NotRendered',\n undefined\n );\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n return;\n }\n\n // Else the stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setRemoteRenderInfo(\n callId,\n participantKey,\n streamId,\n refreshedRenderInfo.stream,\n 'Rendered',\n renderer\n );\n context.setRemoteVideoStreamRendererView(\n callId,\n participantKey,\n streamId,\n convertFromSDKToDeclarativeVideoStreamRendererView(view)\n );\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_VIEW_RENDER_SUCCEED,\n level: 'info',\n message: `Successfully render the remote view.`,\n data: {\n streamLogInfo\n }\n });\n\n return {\n renderer,\n view\n };\n}\n\nasync function createViewLocalVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n // Render LocalVideoStream that is part of a Call\n const renderInfo = internalContext.getLocalRenderInfo(callId);\n\n const streamType = renderInfo?.stream.mediaStreamType;\n\n const streamLogInfo = { callId, streamType };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_LOCAL_STREAM_RENDERING,\n level: 'info',\n message: 'Start creating view for local video.',\n data: streamLogInfo\n });\n\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_NOT_FOUND,\n level: 'error',\n message: 'LocalVideoStream not found in state.',\n data: { callId }\n });\n console.warn('LocalVideoStream not found in state');\n return;\n }\n\n if (renderInfo.status === 'Rendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_ALREADY_RENDERED,\n level: 'warning',\n message: 'LocalVideoStream is already rendered.',\n data: streamLogInfo\n });\n console.warn('LocalVideoStream is already rendered');\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_RENDERING,\n level: 'warning',\n message: 'LocalVideoStream is rendering.',\n data: streamLogInfo\n });\n return;\n }\n\n // \"Stopping\" only happens if the stream was in \"rendering\" but `disposeView` was called.\n // Now that `createView` has been re-called, we can flip the state back to \"rendering\".\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'warning',\n message: 'LocalVideoStream was marked as stopping by dispose view. Resetting state to \"Rendering\".',\n data: streamLogInfo\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Rendering', renderInfo.renderer);\n return;\n }\n\n const renderer = new VideoStreamRenderer(renderInfo.stream);\n\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Rendering', renderer);\n\n let view;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_LOCAL_STREAM_FAIL,\n level: 'error',\n message: 'Failed to create view.',\n data: {\n error: e,\n streamType,\n callId\n }\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'NotRendered', undefined);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getLocalRenderInfo(callId);\n if (!refreshedRenderInfo) {\n // RenderInfo was removed. This should not happen unless stream was removed from the call so dispose the renderer\n // and clean up the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDER_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find local render info after create the view. ',\n data: streamLogInfo\n });\n renderer.dispose();\n context.setLocalVideoStreamRendererView(callId, undefined);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state.\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_CREATED_STREAM_STOPPING,\n level: 'warning',\n message: 'Render info status is stopping, dispose renderer.',\n data: streamLogInfo\n });\n renderer.dispose();\n internalContext.setLocalRenderInfo(callId, refreshedRenderInfo.stream, 'NotRendered', undefined);\n context.setLocalVideoStreamRendererView(callId, undefined);\n return;\n }\n\n // Else The stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setLocalRenderInfo(callId, refreshedRenderInfo.stream, 'Rendered', renderer);\n context.setLocalVideoStreamRendererView(callId, convertFromSDKToDeclarativeVideoStreamRendererView(view));\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_VIEW_RENDER_SUCCEED,\n level: 'info',\n message: `Successfully render the local view.`,\n data: streamLogInfo\n });\n\n return {\n renderer,\n view\n };\n}\n\nasync function createViewUnparentedVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n stream: LocalVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n const renderInfo = internalContext.getUnparentedRenderInfo(stream);\n\n if (renderInfo && renderInfo.status === 'Rendered') {\n console.warn('Unparented LocalVideoStream is already rendered');\n return;\n }\n\n if (renderInfo && renderInfo.status === 'Rendering') {\n // Do not log to console here as this is a very common situation due to UI rerenders while\n // the video rendering is in progress.\n return;\n }\n\n if (renderInfo && renderInfo.status === 'Stopping') {\n console.warn('Unparented LocalVideoStream is in the middle of stopping');\n return;\n }\n\n const localVideoStream = new LocalVideoStream(stream.source);\n const renderer = new VideoStreamRenderer(localVideoStream);\n\n internalContext.setUnparentedRenderInfo(stream, localVideoStream, 'Rendering', undefined);\n\n let view: VideoStreamRendererView;\n try {\n view = await renderer.createView(options);\n } catch (e) {\n // Special case for unparented views. Since they are not tied to anything and created by us based on the calls to\n // this function we'll delete it to clean up the data since keeping it around doesn't help us and if developer wants\n // to create a new view they can check that the view is not rendered and call this function again.\n internalContext.deleteUnparentedRenderInfo(stream);\n throw e;\n }\n\n // Since render could take some time, we need to check if the stream is still valid and if we received a signal to\n // stop rendering.\n const refreshedRenderInfo = internalContext.getUnparentedRenderInfo(stream);\n if (!refreshedRenderInfo) {\n // Unparented stream's RenderInfo was deleted. Currently this shouldn't happen but if it does we'll just dispose the\n // renderer and clean up state. If developer wanted the stream they could call this function again and that should\n // generate new working state via this function.\n renderer.dispose();\n context.deleteDeviceManagerUnparentedView(stream);\n return;\n }\n\n if (refreshedRenderInfo.status === 'Stopping') {\n // Stop render was called on this stream after we had started rendering. We will dispose this view and do not\n // put the view into the state. Special case for unparented views, delete them from state when stopped to free up\n // the memory since we were the ones generating this and not tied to any Call state.\n internalContext.deleteUnparentedRenderInfo(stream);\n context.deleteDeviceManagerUnparentedView(stream);\n return;\n }\n\n // Else the stream still exists and status is not telling us to stop rendering. Complete the render process by\n // updating the state.\n internalContext.setUnparentedRenderInfo(stream, localVideoStream, 'Rendered', renderer);\n context.setDeviceManagerUnparentedView(stream, convertFromSDKToDeclarativeVideoStreamRendererView(view));\n\n return {\n renderer,\n view\n };\n}\n\nfunction disposeViewRemoteVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string,\n participantId: CommunicationIdentifierKind | string,\n stream: RemoteVideoStreamState\n): void {\n const streamId = stream.id;\n const streamType = stream.mediaStreamType;\n let participantKey;\n if (typeof participantId === 'string') {\n participantKey = participantId;\n } else {\n participantKey = toFlatCommunicationIdentifier(participantId);\n }\n\n const streamLogInfo = { callId, participantKey, streamId, streamType };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_REMOTE_STREAM,\n level: 'info',\n message: 'Start disposing remote stream.',\n data: streamLogInfo\n });\n\n context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);\n\n const renderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing remote stream.',\n data: streamLogInfo\n });\n return;\n }\n\n // Nothing to dispose of or clean up -- we can safely exit early here.\n if (renderInfo.status === 'NotRendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_ALREADY_DISPOSED,\n level: 'info',\n message: 'RemoteVideoStream is already disposed.',\n data: streamLogInfo\n });\n return;\n }\n\n // Status is already marked as \"stopping\" so we can exit early here. This is because stopping only occurs\n // when the stream is being created in createView but hasn't been completed being created yet. The createView\n // method will see the \"stopping\" status and perform the cleanup\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is already stopping.',\n data: streamLogInfo\n });\n return;\n }\n\n // If the stream is in the middle of being rendered (i.e. has state \"Rendering\"), we need the status as\n // \"stopping\" without performing any cleanup. This will tell the `createView` method that it should stop\n // rendering and clean up the state once the view has finished being created.\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is still rendering. Changing status to stopping.',\n data: streamLogInfo\n });\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Stopping', undefined);\n return;\n }\n\n // Else the state must be in the \"Rendered\" state, so we can dispose the renderer and clean up the state.\n internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_REMOTE_RENDERER,\n level: 'info',\n message: 'Disposing remote view renderer.',\n data: streamLogInfo\n });\n renderInfo.renderer.dispose();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find remote view renderer.',\n data: streamLogInfo\n });\n }\n}\n\nfunction disposeViewLocalVideo(context: CallContext, internalContext: InternalCallContext, callId: string): void {\n const renderInfo = internalContext.getLocalRenderInfo(callId);\n const streamType = renderInfo?.stream.mediaStreamType;\n const streamLogInfo = { callId, streamType };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_LOCAL_STREAM,\n level: 'info',\n message: 'Start disposing local stream.',\n data: streamLogInfo\n });\n\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing local stream.',\n data: streamLogInfo\n });\n return;\n }\n\n // Nothing to dispose of or clean up -- we can safely exit early here.\n if (renderInfo.status === 'NotRendered') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_ALREADY_DISPOSED,\n level: 'info',\n message: 'LocalVideoStream is already disposed.',\n data: streamLogInfo\n });\n return;\n }\n\n // Status is already marked as \"stopping\" so we can exit early here. This is because stopping only occurs\n // when the stream is being created in createView but hasn't been completed being created yet. The createView\n // method will see the \"stopping\" status and perform the cleanup\n if (renderInfo.status === 'Stopping') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'info',\n message: 'Local stream is already stopping.',\n data: streamLogInfo\n });\n return;\n }\n\n // If the stream is in the middle of being rendered (i.e. has state \"Rendering\"), we need the status as\n // \"stopping\" without performing any cleanup. This will tell the `createView` method that it should stop\n // rendering and clean up the state once the view has finished being created.\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.REMOTE_STREAM_STOPPING,\n level: 'info',\n message: 'Remote stream is still rendering. Changing status to stopping.',\n data: streamLogInfo\n });\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'Stopping', renderInfo.renderer);\n return;\n }\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_LOCAL_RENDERER,\n level: 'info',\n message: 'Disposing local view renderer.',\n data: streamLogInfo\n });\n renderInfo.renderer.dispose();\n\n // We will after disposing of the renderer tell the internal context and context that the\n // local view is gone so we need to update their states.\n internalContext.setLocalRenderInfo(callId, renderInfo.stream, 'NotRendered', undefined);\n context.setLocalVideoStreamRendererView(callId, undefined);\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find renderer when disposing local stream.',\n data: streamLogInfo\n });\n }\n}\n\nfunction disposeViewUnparentedVideo(\n context: CallContext,\n internalContext: InternalCallContext,\n stream: LocalVideoStreamState\n): void {\n const streamType = stream.mediaStreamType;\n const streamLogInfo = { streamType };\n\n _logEvent(callingStatefulLogger, {\n name: EventNames.START_DISPOSE_LOCAL_STREAM,\n level: 'info',\n message: 'Start disposing unparented local stream.',\n data: streamLogInfo\n });\n\n context.deleteDeviceManagerUnparentedView(stream);\n\n const renderInfo = internalContext.getUnparentedRenderInfo(stream);\n if (!renderInfo) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_DISPOSE_INFO_NOT_FOUND,\n level: 'error',\n message: 'Cannot find render info when disposing unparented local stream.',\n data: streamLogInfo\n });\n return;\n }\n\n if (renderInfo.status === 'Rendering') {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_STREAM_STOPPING,\n level: 'info',\n message: 'Unparented local stream is still rendering. Changing status to stopping.',\n data: streamLogInfo\n });\n internalContext.setUnparentedRenderInfo(stream, renderInfo.stream, 'Stopping', undefined);\n } else {\n internalContext.deleteUnparentedRenderInfo(stream);\n }\n\n if (renderInfo.renderer) {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSING_LOCAL_RENDERER,\n level: 'info',\n message: 'Disposing unparented local view renderer.',\n data: streamLogInfo\n });\n renderInfo.renderer.dispose();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.LOCAL_RENDERER_NOT_FOUND,\n level: 'error',\n message: 'Cannot find renderer when disposing unparented local stream.',\n data: streamLogInfo\n });\n }\n}\n\n/**\n * @private\n */\nexport function createView(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string | undefined,\n participantId: CommunicationIdentifierKind | string | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n): Promise<CreateViewResult | undefined> {\n const streamType = stream.mediaStreamType;\n\n if ('id' in stream && callId && participantId) {\n // Render RemoteVideoStream that is part of a Call\n return createViewRemoteVideo(context, internalContext, callId, participantId, stream, options);\n } else if (!('id' in stream) && callId) {\n // Render LocalVideoStream that is part of a Call\n return createViewLocalVideo(context, internalContext, callId, options);\n } else if (!('id' in stream) && !callId) {\n // Render LocalVideoStream that is not part of a Call\n // Because it is not part of the call we don't tee errors to state naturally (e.g. via a Call Client function such as startVideo).\n // We do not have a startLocalPreviewVideo function, so as a workaround we ensure any errors are propagated here.\n return context.withAsyncErrorTeedToState(\n async () => await createViewUnparentedVideo(context, internalContext, stream, options),\n 'Call.startVideo'\n )();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.CREATE_STREAM_INVALID_PARAMS,\n level: 'warning',\n message: 'Create View invalid combination of parameters.',\n data: { streamType }\n });\n return Promise.resolve(undefined);\n }\n}\n\n/**\n * @private\n */\nexport function disposeView(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string | undefined,\n participantId: CommunicationIdentifierKind | string | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n): void {\n const streamType = stream.mediaStreamType;\n if ('id' in stream && callId && participantId) {\n // Stop rendering RemoteVideoStream that is part of a Call\n disposeViewRemoteVideo(context, internalContext, callId, participantId, stream);\n } else if (!('id' in stream) && callId) {\n // Stop rendering LocalVideoStream that is part of a Call\n disposeViewLocalVideo(context, internalContext, callId);\n } else if (!('id' in stream) && !callId) {\n // Stop rendering LocalVideoStream that is not part of a Call\n // Because it is not part of the call we don't tee errors to state naturally (e.g. via a Call Client function such as startVideo).\n // We do not have a stopLocalPreviewVideo function, so as a workaround we ensure any errors are propagated here.\n context.withErrorTeedToState(\n () => disposeViewUnparentedVideo(context, internalContext, stream),\n 'Call.stopVideo'\n )();\n } else {\n _logEvent(callingStatefulLogger, {\n name: EventNames.DISPOSE_STREAM_INVALID_PARAMS,\n level: 'warning',\n message: 'Dispose View invalid combination of parameters.',\n data: { streamType }\n });\n return;\n }\n}\n\n/**\n * @private\n * Only stops videos that are tied to a Call.\n */\nexport function disposeAllViewsFromCall(\n context: CallContext,\n internalContext: InternalCallContext,\n callId: string\n): void {\n const callStreams = internalContext.getRemoteRenderInfoForCall(callId);\n if (callStreams) {\n for (const [participantKey, participantStreams] of callStreams.entries()) {\n for (const [_, remoteStreamAndRenderer] of participantStreams.entries()) {\n // We don't want to accept SDK stream as parameter but we also don't cache the declarative stream so we have to\n // convert the SDK stream to declarative stream which is not pretty so this could use some further refactoring.\n disposeView(\n context,\n internalContext,\n callId,\n participantKey,\n convertSdkRemoteStreamToDeclarativeRemoteStream(remoteStreamAndRenderer.stream)\n );\n }\n }\n }\n const localStreamAndRenderer = internalContext.getLocalRenderInfo(callId);\n if (localStreamAndRenderer && localStreamAndRenderer.renderer) {\n // We don't want to accept SDK stream as parameter but we also don't cache the declarative stream so we have to\n // convert the SDK stream to declarative stream which is not pretty so this could use some further refactoring.\n disposeView(\n context,\n internalContext,\n callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(localStreamAndRenderer.stream)\n );\n }\n}\n\n/**\n * @private\n */\nexport function disposeAllViews(context: CallContext, internalContext: InternalCallContext): void {\n const callIds = internalContext.getCallIds();\n for (const callId of callIds) {\n disposeAllViewsFromCall(context, internalContext, callId);\n }\n}\n\"../../acs-ui-common/src\""]}
|
@@ -18,8 +18,9 @@ import { VideoTile } from './VideoTile';
|
|
18
18
|
* @internal
|
19
19
|
*/
|
20
20
|
export const _RemoteVideoTile = React.memo((props) => {
|
21
|
+
var _a;
|
21
22
|
const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
|
22
|
-
isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString } = props;
|
23
|
+
isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString, strings } = props;
|
23
24
|
const remoteVideoStreamProps = useMemo(() => ({
|
24
25
|
isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
|
25
26
|
isScreenSharingOn,
|
@@ -84,7 +85,7 @@ export const _RemoteVideoTile = React.memo((props) => {
|
|
84
85
|
tabIndex: menuKind === 'drawer' ? 0 : undefined,
|
85
86
|
/* @conditional-compile-remove(pinned-participants) */
|
86
87
|
onKeyDown: menuKind === 'drawer' ? onKeyDown : undefined, style: remoteVideoTileWrapperStyle },
|
87
|
-
React.createElement(VideoTile, Object.assign({ key: userId, userId: userId, renderElement: renderVideoStreamElement, displayName: remoteParticipant.displayName, onRenderPlaceholder: onRenderAvatar, isMuted: remoteParticipant.isMuted, isSpeaking: remoteParticipant.isSpeaking, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize, showLabel: props.showLabel,
|
88
|
+
React.createElement(VideoTile, Object.assign({ key: userId, userId: userId, initialsName: (_a = remoteParticipant.displayName) !== null && _a !== void 0 ? _a : '', renderElement: renderVideoStreamElement, displayName: remoteParticipant.displayName || (strings === null || strings === void 0 ? void 0 : strings.displayNamePlaceholder), onRenderPlaceholder: onRenderAvatar, isMuted: remoteParticipant.isMuted, isSpeaking: remoteParticipant.isSpeaking, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize, showLabel: props.showLabel,
|
88
89
|
/* @conditional-compile-remove(one-to-n-calling) */
|
89
90
|
/* @conditional-compile-remove(PSTN-calls) */
|
90
91
|
participantState: participantState }, videoTileContextualMenuProps, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RemoteVideoTile.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/RemoteVideoTile.tsx"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAwB,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,sDAAsD;AACtD,OAAO,EAAiB,WAAW,EAAE,MAAM,OAAO,CAAC;AAQnD,OAAO,EAAE,WAAW,EAAwB,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AACpH,OAAO,EAEL,uCAAuC,EACxC,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACxC,CAAC,KA0BA,EAAE,EAAE;IACH,MAAM,EACJ,WAAW,EACX,WAAW,GAAG,IAAI,EAAE,iDAAiD;IACrE,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,EACb,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACtB,GAAG,KAAK,CAAC;IAEV,MAAM,sBAAsB,GAA8C,OAAO,CAC/E,GAAG,EAAE,CAAC,CAAC;QACL,UAAU,EAAE,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,UAAU;QAC9C,iBAAiB;QACjB,iBAAiB,EAAE,WAAW;QAC9B,iBAAiB,EAAE,WAAW;QAC9B,wBAAwB;QACxB,yBAAyB;QACzB,mBAAmB,EAAE,MAAM;QAC3B,mBAAmB,EAAE,CAAC,CAAC,aAAa;QACpC,WAAW,EAAE,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,WAAW;KACjD,CAAC,EACF;QACE,WAAW;QACX,WAAW;QACX,iBAAiB;QACjB,wBAAwB;QACxB,yBAAyB;QACzB,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,UAAU;QAClC,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,WAAW;QACnC,aAAa;QACb,MAAM;KACP,CACF,CAAC;IAEF,yEAAyE;IACzE,MAAM,uBAAuB,GAAG,uCAAuC,CAAC,sBAAsB,CAAC,CAAC;IAEhG,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;QAC1D,iBAAiB;QACjB,IAAI,EAAE,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,IAAI;QACnC,sDAAsD;QACtD,OAAO,oBAAO,KAAK,CAAC,OAAO,CAAE;QAC7B,QAAQ;QACR,gBAAgB;QAChB,kBAAkB;QAClB,kBAAkB;QAClB,qBAAqB;KACtB,CAAC,CAAC;IAEH,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAChD,IAAI,QAAQ,KAAK,YAAY,EAAE;YAC7B,OAAO,EAAE,CAAC;SACX;QACD,OAAO,sCAAsC,CAAC,mBAAmB,CAAC,CAAC;IACrE,CAAC,EAAE,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpC,MAAM,oBAAoB,GAAG,WAAW,IAAI,WAAW,KAAK,KAAK,IAAI,gBAAgB,KAAK,cAAc,CAAC;IAEzG,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAyB,EAAE,CAAC,CAAC;IAEjG,MAAM,wBAAwB,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5C,iHAAiH;QACjH,+EAA+E;QAC/E,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE;YACtD,2EAA2E;YAC3E,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,CACL,oBAAC,WAAW,IAAC,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GAAI,CAC5G,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE1C,sDAAsD;IACtD,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,CAAgB,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;YACrB,sBAAsB,CACpB,+CAA+C,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CACvG,CAAC;SACH;IACH,CAAC,EACD,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAC9C,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK;IACJ,sDAAsD;;QAAtD,sDAAsD;QACtD,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/C,sDAAsD;QACtD,SAAS,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACxD,KAAK,EAAE,2BAA2B;QAElC,oBAAC,SAAS,kBACR,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,wBAAwB,EACvC,WAAW,EAAE,iBAAiB,CAAC,WAAW,EAC1C,mBAAmB,EAAE,cAAc,EACnC,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAClC,UAAU,EAAE,iBAAiB,CAAC,UAAU,EACxC,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,mDAAmD;YACnD,6CAA6C;YAC7C,gBAAgB,EAAE,gBAAgB,IAC9B,4BAA4B;YAChC,sDAAsD;YACtD,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,sDAAsD;YACtD,WAAW,EAAE,GAAG,EAAE,CAChB,sBAAsB,CACpB,+CAA+C,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CACvG,IAEH;QACD,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,CACjC,oBAAC,KAAK,IAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB;YACnC,oBAAC,KAAK,IAAC,MAAM,EAAE,uBAAuB;gBACpC,oBAAC,WAAW,IACV,cAAc,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAChD,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,iBAAiB,CAAC,WAAW,GACtC,CACI,CACF,CACT,CACK,CACT,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,sCAAsC,GAAG,CAC7C,mBAA0C,EACC,EAAE;IAC7C,IAAI,CAAC,mBAAmB,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IACD,sDAAsD;IACtD,OAAO;QACL,cAAc,EAAE,mBAAmB;KACpC,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,sDAAsD;AACtD,MAAM,+CAA+C,GAAG,CACtD,mBAA0C,EAC1C,cAA2B,EACH,EAAE;IAC1B,IAAI,CAAC,mBAAmB,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5C,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,GAAG;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,GAAG,EAAE;;gBAChB,MAAA,IAAI,CAAC,OAAO,+CAAZ,IAAI,CAAY,CAAC;gBACjB,cAAc,aAAd,cAAc,uBAAd,cAAc,EAAI,CAAC;YACrB,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { IContextualMenuProps, Layer, Stack } from '@fluentui/react';\nimport React, { useMemo } from 'react';\n/* @conditional-compile-remove(pinned-participants) */\nimport { KeyboardEvent, useCallback } from 'react';\nimport {\n CreateVideoStreamViewResult,\n OnRenderAvatarCallback,\n ParticipantState,\n VideoGalleryRemoteParticipant,\n VideoStreamOptions\n} from '../types';\nimport { _DrawerMenu, _DrawerMenuItemProps } from './Drawer';\nimport { StreamMedia } from './StreamMedia';\nimport { VideoGalleryStrings } from './VideoGallery';\nimport { drawerMenuWrapperStyles, remoteVideoTileWrapperStyle } from './VideoGallery/styles/RemoteVideoTile.styles';\nimport {\n RemoteVideoStreamLifecycleMaintainerProps,\n useRemoteVideoStreamLifecycleMaintainer\n} from './VideoGallery/useVideoStreamLifecycleMaintainer';\nimport { useVideoTileContextualMenuProps } from './VideoGallery/useVideoTileContextualMenuProps';\nimport { VideoTile } from './VideoTile';\n\n/**\n * A memoized version of VideoTile for rendering remote participants. React.memo is used for a performance\n * boost by memoizing the same rendered component to avoid rerendering a VideoTile when its position in the\n * array changes causing a rerender in the parent component. https://reactjs.org/docs/react-api.html#reactmemo\n *\n * @internal\n */\nexport const _RemoteVideoTile = React.memo(\n (props: {\n userId: string;\n remoteParticipant: VideoGalleryRemoteParticipant;\n onCreateRemoteStreamView?: (\n userId: string,\n options?: VideoStreamOptions\n ) => Promise<void | CreateVideoStreamViewResult>;\n onDisposeRemoteStreamView?: (userId: string) => Promise<void>;\n isAvailable?: boolean;\n isReceiving?: boolean;\n isScreenSharingOn?: boolean; // TODO: Remove this once onDisposeRemoteStreamView no longer disposes of screen share stream\n renderElement?: HTMLElement;\n remoteVideoViewOptions?: VideoStreamOptions;\n onRenderAvatar?: OnRenderAvatarCallback;\n showMuteIndicator?: boolean;\n showLabel?: boolean;\n personaMinSize?: number;\n strings?: VideoGalleryStrings;\n participantState?: ParticipantState;\n menuKind?: 'contextual' | 'drawer';\n drawerMenuHostId?: string;\n onPinParticipant?: (userId: string) => void;\n onUnpinParticipant?: (userId: string) => void;\n isPinned?: boolean;\n disablePinMenuItem?: boolean;\n toggleAnnouncerString?: (announcerString: string) => void;\n }) => {\n const {\n isAvailable,\n isReceiving = true, // default to true to prevent any breaking change\n isScreenSharingOn,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions,\n renderElement,\n userId,\n onRenderAvatar,\n showMuteIndicator,\n remoteParticipant,\n participantState,\n menuKind,\n isPinned,\n onPinParticipant,\n onUnpinParticipant,\n disablePinMenuItem,\n toggleAnnouncerString\n } = props;\n\n const remoteVideoStreamProps: RemoteVideoStreamLifecycleMaintainerProps = useMemo(\n () => ({\n isMirrored: remoteVideoViewOptions?.isMirrored,\n isScreenSharingOn,\n isStreamAvailable: isAvailable,\n isStreamReceiving: isReceiving,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteParticipantId: userId,\n renderElementExists: !!renderElement,\n scalingMode: remoteVideoViewOptions?.scalingMode\n }),\n [\n isAvailable,\n isReceiving,\n isScreenSharingOn,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions?.isMirrored,\n remoteVideoViewOptions?.scalingMode,\n renderElement,\n userId\n ]\n );\n\n // Handle creating, destroying and updating the video stream as necessary\n const createVideoStreamResult = useRemoteVideoStreamLifecycleMaintainer(remoteVideoStreamProps);\n\n const contextualMenuProps = useVideoTileContextualMenuProps({\n remoteParticipant,\n view: createVideoStreamResult?.view,\n /* @conditional-compile-remove(pinned-participants) */\n strings: { ...props.strings },\n isPinned,\n onPinParticipant,\n onUnpinParticipant,\n disablePinMenuItem,\n toggleAnnouncerString\n });\n\n const videoTileContextualMenuProps = useMemo(() => {\n if (menuKind !== 'contextual') {\n return {};\n }\n return videoTileContextualMenuPropsTrampoline(contextualMenuProps);\n }, [contextualMenuProps, menuKind]);\n\n const showLoadingIndicator = isAvailable && isReceiving === false && participantState !== 'Disconnected';\n\n const [drawerMenuItemProps, setDrawerMenuItemProps] = React.useState<_DrawerMenuItemProps[]>([]);\n\n const renderVideoStreamElement = useMemo(() => {\n // Checking if renderElement is well defined or not as calling SDK has a number of video streams limitation which\n // implies that, after their threshold, all streams have no child (blank video)\n if (!renderElement || !renderElement.childElementCount) {\n // Returning `undefined` results in the placeholder with avatar being shown\n return undefined;\n }\n\n return (\n <StreamMedia videoStreamElement={renderElement} loadingState={showLoadingIndicator ? 'loading' : 'none'} />\n );\n }, [renderElement, showLoadingIndicator]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n setDrawerMenuItemProps(\n convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))\n );\n }\n },\n [setDrawerMenuItemProps, contextualMenuProps]\n );\n\n return (\n <Stack\n /* @conditional-compile-remove(pinned-participants) */\n tabIndex={menuKind === 'drawer' ? 0 : undefined}\n /* @conditional-compile-remove(pinned-participants) */\n onKeyDown={menuKind === 'drawer' ? onKeyDown : undefined}\n style={remoteVideoTileWrapperStyle}\n >\n <VideoTile\n key={userId}\n userId={userId}\n renderElement={renderVideoStreamElement}\n displayName={remoteParticipant.displayName}\n onRenderPlaceholder={onRenderAvatar}\n isMuted={remoteParticipant.isMuted}\n isSpeaking={remoteParticipant.isSpeaking}\n showMuteIndicator={showMuteIndicator}\n personaMinSize={props.personaMinSize}\n showLabel={props.showLabel}\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n participantState={participantState}\n {...videoTileContextualMenuProps}\n /* @conditional-compile-remove(pinned-participants) */\n isPinned={props.isPinned}\n /* @conditional-compile-remove(pinned-participants) */\n onLongTouch={() =>\n setDrawerMenuItemProps(\n convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))\n )\n }\n />\n {drawerMenuItemProps.length > 0 && (\n <Layer hostId={props.drawerMenuHostId}>\n <Stack styles={drawerMenuWrapperStyles}>\n <_DrawerMenu\n onLightDismiss={() => setDrawerMenuItemProps([])}\n items={drawerMenuItemProps}\n heading={remoteParticipant.displayName}\n />\n </Stack>\n </Layer>\n )}\n </Stack>\n );\n }\n);\n\nconst videoTileContextualMenuPropsTrampoline = (\n contextualMenuProps?: IContextualMenuProps\n): { contextualMenu?: IContextualMenuProps } => {\n if (!contextualMenuProps) {\n return {};\n }\n /* @conditional-compile-remove(pinned-participants) */\n return {\n contextualMenu: contextualMenuProps\n };\n\n return {};\n};\n\n/* @conditional-compile-remove(pinned-participants) */\nconst convertContextualMenuItemsToDrawerMenuItemProps = (\n contextualMenuProps?: IContextualMenuProps,\n onLightDismiss?: () => void\n): _DrawerMenuItemProps[] => {\n if (!contextualMenuProps) {\n return [];\n }\n return contextualMenuProps.items.map((item) => {\n return {\n itemKey: item.key,\n text: item.text,\n iconProps: item.iconProps,\n disabled: item.disabled,\n onItemClick: () => {\n item.onClick?.();\n onLightDismiss?.();\n }\n };\n });\n};\n"]}
|
1
|
+
{"version":3,"file":"RemoteVideoTile.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/RemoteVideoTile.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { IContextualMenuProps, Layer, Stack } from '@fluentui/react';\nimport React, { useMemo } from 'react';\n/* @conditional-compile-remove(pinned-participants) */\nimport { KeyboardEvent, useCallback } from 'react';\nimport {\n CreateVideoStreamViewResult,\n OnRenderAvatarCallback,\n ParticipantState,\n VideoGalleryRemoteParticipant,\n VideoStreamOptions\n} from '../types';\nimport { _DrawerMenu, _DrawerMenuItemProps } from './Drawer';\nimport { StreamMedia } from './StreamMedia';\nimport { VideoGalleryStrings } from './VideoGallery';\nimport { drawerMenuWrapperStyles, remoteVideoTileWrapperStyle } from './VideoGallery/styles/RemoteVideoTile.styles';\nimport {\n RemoteVideoStreamLifecycleMaintainerProps,\n useRemoteVideoStreamLifecycleMaintainer\n} from './VideoGallery/useVideoStreamLifecycleMaintainer';\nimport { useVideoTileContextualMenuProps } from './VideoGallery/useVideoTileContextualMenuProps';\nimport { VideoTile } from './VideoTile';\n\n/**\n * A memoized version of VideoTile for rendering remote participants. React.memo is used for a performance\n * boost by memoizing the same rendered component to avoid rerendering a VideoTile when its position in the\n * array changes causing a rerender in the parent component. https://reactjs.org/docs/react-api.html#reactmemo\n *\n * @internal\n */\nexport const _RemoteVideoTile = React.memo(\n (props: {\n userId: string;\n remoteParticipant: VideoGalleryRemoteParticipant;\n onCreateRemoteStreamView?: (\n userId: string,\n options?: VideoStreamOptions\n ) => Promise<void | CreateVideoStreamViewResult>;\n onDisposeRemoteStreamView?: (userId: string) => Promise<void>;\n isAvailable?: boolean;\n isReceiving?: boolean;\n isScreenSharingOn?: boolean; // TODO: Remove this once onDisposeRemoteStreamView no longer disposes of screen share stream\n renderElement?: HTMLElement;\n remoteVideoViewOptions?: VideoStreamOptions;\n onRenderAvatar?: OnRenderAvatarCallback;\n showMuteIndicator?: boolean;\n showLabel?: boolean;\n personaMinSize?: number;\n strings?: VideoGalleryStrings;\n participantState?: ParticipantState;\n menuKind?: 'contextual' | 'drawer';\n drawerMenuHostId?: string;\n onPinParticipant?: (userId: string) => void;\n onUnpinParticipant?: (userId: string) => void;\n isPinned?: boolean;\n disablePinMenuItem?: boolean;\n toggleAnnouncerString?: (announcerString: string) => void;\n }) => {\n const {\n isAvailable,\n isReceiving = true, // default to true to prevent any breaking change\n isScreenSharingOn,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions,\n renderElement,\n userId,\n onRenderAvatar,\n showMuteIndicator,\n remoteParticipant,\n participantState,\n menuKind,\n isPinned,\n onPinParticipant,\n onUnpinParticipant,\n disablePinMenuItem,\n toggleAnnouncerString,\n strings\n } = props;\n\n const remoteVideoStreamProps: RemoteVideoStreamLifecycleMaintainerProps = useMemo(\n () => ({\n isMirrored: remoteVideoViewOptions?.isMirrored,\n isScreenSharingOn,\n isStreamAvailable: isAvailable,\n isStreamReceiving: isReceiving,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteParticipantId: userId,\n renderElementExists: !!renderElement,\n scalingMode: remoteVideoViewOptions?.scalingMode\n }),\n [\n isAvailable,\n isReceiving,\n isScreenSharingOn,\n onCreateRemoteStreamView,\n onDisposeRemoteStreamView,\n remoteVideoViewOptions?.isMirrored,\n remoteVideoViewOptions?.scalingMode,\n renderElement,\n userId\n ]\n );\n\n // Handle creating, destroying and updating the video stream as necessary\n const createVideoStreamResult = useRemoteVideoStreamLifecycleMaintainer(remoteVideoStreamProps);\n\n const contextualMenuProps = useVideoTileContextualMenuProps({\n remoteParticipant,\n view: createVideoStreamResult?.view,\n /* @conditional-compile-remove(pinned-participants) */\n strings: { ...props.strings },\n isPinned,\n onPinParticipant,\n onUnpinParticipant,\n disablePinMenuItem,\n toggleAnnouncerString\n });\n\n const videoTileContextualMenuProps = useMemo(() => {\n if (menuKind !== 'contextual') {\n return {};\n }\n return videoTileContextualMenuPropsTrampoline(contextualMenuProps);\n }, [contextualMenuProps, menuKind]);\n\n const showLoadingIndicator = isAvailable && isReceiving === false && participantState !== 'Disconnected';\n\n const [drawerMenuItemProps, setDrawerMenuItemProps] = React.useState<_DrawerMenuItemProps[]>([]);\n\n const renderVideoStreamElement = useMemo(() => {\n // Checking if renderElement is well defined or not as calling SDK has a number of video streams limitation which\n // implies that, after their threshold, all streams have no child (blank video)\n if (!renderElement || !renderElement.childElementCount) {\n // Returning `undefined` results in the placeholder with avatar being shown\n return undefined;\n }\n\n return (\n <StreamMedia videoStreamElement={renderElement} loadingState={showLoadingIndicator ? 'loading' : 'none'} />\n );\n }, [renderElement, showLoadingIndicator]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n setDrawerMenuItemProps(\n convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))\n );\n }\n },\n [setDrawerMenuItemProps, contextualMenuProps]\n );\n\n return (\n <Stack\n /* @conditional-compile-remove(pinned-participants) */\n tabIndex={menuKind === 'drawer' ? 0 : undefined}\n /* @conditional-compile-remove(pinned-participants) */\n onKeyDown={menuKind === 'drawer' ? onKeyDown : undefined}\n style={remoteVideoTileWrapperStyle}\n >\n <VideoTile\n key={userId}\n userId={userId}\n initialsName={remoteParticipant.displayName ?? ''}\n renderElement={renderVideoStreamElement}\n displayName={remoteParticipant.displayName || strings?.displayNamePlaceholder}\n onRenderPlaceholder={onRenderAvatar}\n isMuted={remoteParticipant.isMuted}\n isSpeaking={remoteParticipant.isSpeaking}\n showMuteIndicator={showMuteIndicator}\n personaMinSize={props.personaMinSize}\n showLabel={props.showLabel}\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n participantState={participantState}\n {...videoTileContextualMenuProps}\n /* @conditional-compile-remove(pinned-participants) */\n isPinned={props.isPinned}\n /* @conditional-compile-remove(pinned-participants) */\n onLongTouch={() =>\n setDrawerMenuItemProps(\n convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))\n )\n }\n />\n {drawerMenuItemProps.length > 0 && (\n <Layer hostId={props.drawerMenuHostId}>\n <Stack styles={drawerMenuWrapperStyles}>\n <_DrawerMenu\n onLightDismiss={() => setDrawerMenuItemProps([])}\n items={drawerMenuItemProps}\n heading={remoteParticipant.displayName}\n />\n </Stack>\n </Layer>\n )}\n </Stack>\n );\n }\n);\n\nconst videoTileContextualMenuPropsTrampoline = (\n contextualMenuProps?: IContextualMenuProps\n): { contextualMenu?: IContextualMenuProps } => {\n if (!contextualMenuProps) {\n return {};\n }\n /* @conditional-compile-remove(pinned-participants) */\n return {\n contextualMenu: contextualMenuProps\n };\n\n return {};\n};\n\n/* @conditional-compile-remove(pinned-participants) */\nconst convertContextualMenuItemsToDrawerMenuItemProps = (\n contextualMenuProps?: IContextualMenuProps,\n onLightDismiss?: () => void\n): _DrawerMenuItemProps[] => {\n if (!contextualMenuProps) {\n return [];\n }\n return contextualMenuProps.items.map((item) => {\n return {\n itemKey: item.key,\n text: item.text,\n iconProps: item.iconProps,\n disabled: item.disabled,\n onItemClick: () => {\n item.onClick?.();\n onLightDismiss?.();\n }\n };\n });\n};\n"]}
|
@@ -29,8 +29,6 @@ const DefaultPlaceholder = (props) => {
|
|
29
29
|
};
|
30
30
|
const defaultPersonaStyles = { root: { margin: 'auto', maxHeight: '100%' } };
|
31
31
|
/* @conditional-compile-remove(pinned-participants) */
|
32
|
-
const videoTileMoreIconProps = { iconName: 'VideoTileMoreOptions' };
|
33
|
-
/* @conditional-compile-remove(pinned-participants) */
|
34
32
|
const videoTileMoreMenuIconProps = { iconName: undefined, style: { display: 'none' } };
|
35
33
|
/* @conditional-compile-remove(pinned-participants) */
|
36
34
|
const videoTileMoreMenuProps = {
|
@@ -40,11 +38,12 @@ const videoTileMoreMenuProps = {
|
|
40
38
|
};
|
41
39
|
/* @conditional-compile-remove(pinned-participants) */
|
42
40
|
const VideoTileMoreOptionsButton = (props) => {
|
43
|
-
const { contextualMenu } = props;
|
41
|
+
const { contextualMenu, canShowContextMenuButton } = props;
|
44
42
|
if (!contextualMenu) {
|
45
43
|
return React.createElement(React.Fragment, null);
|
46
44
|
}
|
47
|
-
|
45
|
+
const optionsIcon = canShowContextMenuButton ? 'VideoTileMoreOptions' : undefined;
|
46
|
+
return (React.createElement(IconButton, { "data-ui-id": "video-tile-more-options-button", styles: moreButtonStyles, menuIconProps: videoTileMoreMenuIconProps, menuProps: Object.assign(Object.assign({}, videoTileMoreMenuProps), contextualMenu), iconProps: { iconName: optionsIcon } }));
|
48
47
|
};
|
49
48
|
/**
|
50
49
|
* A component to render the video stream for a single call participant.
|
@@ -142,7 +141,7 @@ export const VideoTile = (props) => {
|
|
142
141
|
height: '100%'
|
143
142
|
}
|
144
143
|
}, styles === null || styles === void 0 ? void 0 : styles.root) }, longPressHandlersTrampoline),
|
145
|
-
React.createElement("div", Object.assign({ ref: videoTileRef, style: { width: '100%', height: '100%' } }, hoverHandlers),
|
144
|
+
React.createElement("div", Object.assign({ ref: videoTileRef, style: { width: '100%', height: '100%' } }, hoverHandlers, { "data-is-focusable": true }),
|
146
145
|
isVideoRendered ? (React.createElement(Stack, { className: mergeStyles(videoContainerStyles, isMirrored && { transform: 'scaleX(-1)' }, styles === null || styles === void 0 ? void 0 : styles.videoContainer) }, renderElement)) : (React.createElement(Stack, { className: mergeStyles(videoContainerStyles, {
|
147
146
|
opacity: participantStateString ||
|
148
147
|
/* @conditional-compile-remove(PSTN-calls) */ props.participantState === 'Idle'
|
@@ -156,7 +155,7 @@ export const VideoTile = (props) => {
|
|
156
155
|
showMuteIndicator && isMuted && (React.createElement(Stack, { className: mergeStyles(iconContainerStyle) },
|
157
156
|
React.createElement(Icon, { iconName: "VideoTileMicOff" }))),
|
158
157
|
/* @conditional-compile-remove(pinned-participants) */
|
159
|
-
|
158
|
+
React.createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu, canShowContextMenuButton: canShowContextMenuButton }),
|
160
159
|
/* @conditional-compile-remove(pinned-participants) */
|
161
160
|
isPinned && (React.createElement(Stack, { className: mergeStyles(iconContainerStyle) },
|
162
161
|
React.createElement(Icon, { iconName: "VideoTilePinned", className: mergeStyles(pinIconStyle) })))))),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"VideoTile.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/VideoTile.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Icon, IStyle, mergeStyles, Persona, Stack, Text } from '@fluentui/react';\n/* @conditional-compile-remove(pinned-participants) */\nimport { IconButton } from '@fluentui/react';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useIdentifiers } from '../identifiers';\nimport { ComponentLocale, useLocale } from '../localization';\nimport { useTheme } from '../theming';\nimport { BaseCustomStyles, CustomAvatarOptions, OnRenderAvatarCallback } from '../types';\n/* @conditional-compile-remove(one-to-n-calling) */\n/* @conditional-compile-remove(PSTN-calls) */\nimport { ParticipantState } from '../types';\nimport {\n disabledVideoHint,\n displayNameStyle,\n iconContainerStyle,\n overlayContainerStyles,\n rootStyles,\n videoContainerStyles,\n videoHint,\n tileInfoContainerStyle,\n participantStateStringStyles\n} from './styles/VideoTile.styles';\nimport { getVideoTileOverrideColor } from './utils/videoTileStylesUtils';\n/* @conditional-compile-remove(pinned-participants) */\nimport { pinIconStyle } from './styles/VideoTile.styles';\n/* @conditional-compile-remove(pinned-participants) */\nimport { DirectionalHint, IContextualMenuProps } from '@fluentui/react';\n/* @conditional-compile-remove(pinned-participants) */\nimport useLongPress from './utils/useLongPress';\n/* @conditional-compile-remove(pinned-participants) */\nimport { moreButtonStyles } from './styles/VideoTile.styles';\n\n/**\n * Strings of {@link VideoTile} that can be overridden.\n * @beta\n */\nexport interface VideoTileStrings {\n participantStateRinging: string;\n participantStateHold: string;\n}\n\n/**\n * Fluent styles for {@link VideoTile}.\n *\n * @public\n */\nexport interface VideoTileStylesProps extends BaseCustomStyles {\n /** Styles for video container. */\n videoContainer?: IStyle;\n /** Styles for container overlayed on the video container. */\n overlayContainer?: IStyle;\n /** Styles for displayName on the video container. */\n displayNameContainer?: IStyle;\n}\n\n/**\n * Props for {@link VideoTile}.\n *\n * @public\n */\nexport interface VideoTileProps {\n /** React Child components. Child Components will show as overlay component in the VideoTile. */\n children?: React.ReactNode;\n /**\n * Allows users to pass in an object contains custom CSS styles.\n * @Example\n * ```\n * <VideoTile styles={{ root: { background: 'blue' } }} />\n * ```\n */\n styles?: VideoTileStylesProps;\n /** user id for the VideoTile placeholder. */\n userId?: string;\n /** Component with the video stream. */\n renderElement?: JSX.Element | null;\n /** Determines if the video is mirrored or not. */\n isMirrored?: boolean;\n /** Custom render Component function for no video is available. Render a Persona Icon if undefined. */\n onRenderPlaceholder?: OnRenderAvatarCallback;\n /**\n * Show label on the VideoTile\n * @defaultValue true\n */\n showLabel?: boolean;\n /**\n * Whether to display a mute icon beside the user's display name.\n * @defaultValue true\n */\n showMuteIndicator?: boolean;\n /**\n * Whether the video is muted or not.\n */\n isMuted?: boolean;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * If true, the video tile will show the pin icon.\n */\n isPinned?: boolean;\n /**\n * Display Name of the Participant to be shown in the label.\n * @remarks `displayName` is used to generate avatar initials if `initialsName` is not provided.\n */\n displayName?: string;\n /**\n * Name of the participant used to generate initials. For example, a name `John Doe` will display `JD` as initials.\n * @remarks `displayName` is used if this property is not specified.\n */\n initialsName?: string;\n /**\n * Minimum size of the persona avatar in px.\n * The persona avatar is the default placeholder shown when no video stream is available.\n * For more information see https://developer.microsoft.com/en-us/fluentui#/controls/web/persona\n * @defaultValue 32px\n */\n personaMinSize?: number;\n /**\n * Maximum size of the personal avatar in px.\n * The persona avatar is the default placeholder shown when no video stream is available.\n * For more information see https://developer.microsoft.com/en-us/fluentui#/controls/web/persona\n * @defaultValue 100px\n */\n personaMaxSize?: number;\n /** Optional property to set the aria label of the video tile if there is no available stream. */\n noVideoAvailableAriaLabel?: string;\n /** Whether the participant in the videoTile is speaking. Shows a speaking indicator (border). */\n isSpeaking?: boolean;\n\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * The call connection state of the participant.\n * For example, `Hold` means the participant is on hold.\n */\n participantState?: ParticipantState;\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n strings?: VideoTileStrings;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Display custom menu items in the VideoTile's contextual menu.\n * Uses Fluent UI ContextualMenu.\n * An ellipses icon will be displayed to open the contextual menu if this prop is defined.\n */\n contextualMenu?: IContextualMenuProps;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Callback triggered by video tile on touch and hold.\n */\n onLongTouch?: () => void;\n}\n\n// Coin max size is set to PersonaSize.size100\nconst DEFAULT_PERSONA_MAX_SIZE_PX = 100;\n// Coin min size is set PersonaSize.size32\nconst DEFAULT_PERSONA_MIN_SIZE_PX = 32;\n\nconst DefaultPlaceholder = (props: CustomAvatarOptions): JSX.Element => {\n const { text, noVideoAvailableAriaLabel, coinSize, hidePersonaDetails } = props;\n\n return (\n <Stack className={mergeStyles({ position: 'absolute', height: '100%', width: '100%' })}>\n <Stack styles={defaultPersonaStyles}>\n <Persona\n coinSize={coinSize}\n hidePersonaDetails={hidePersonaDetails}\n text={text ?? ''}\n initialsTextColor=\"white\"\n aria-label={noVideoAvailableAriaLabel ?? ''}\n showOverflowTooltip={false}\n />\n </Stack>\n </Stack>\n );\n};\n\nconst defaultPersonaStyles = { root: { margin: 'auto', maxHeight: '100%' } };\n\n/* @conditional-compile-remove(pinned-participants) */\nconst videoTileMoreIconProps = { iconName: 'VideoTileMoreOptions' };\n/* @conditional-compile-remove(pinned-participants) */\nconst videoTileMoreMenuIconProps = { iconName: undefined, style: { display: 'none' } };\n/* @conditional-compile-remove(pinned-participants) */\nconst videoTileMoreMenuProps = {\n directionalHint: DirectionalHint.topLeftEdge,\n isBeakVisible: false,\n styles: { container: { maxWidth: '8rem' } }\n};\n/* @conditional-compile-remove(pinned-participants) */\nconst VideoTileMoreOptionsButton = (props: { contextualMenu?: IContextualMenuProps }): JSX.Element => {\n const { contextualMenu } = props;\n if (!contextualMenu) {\n return <></>;\n }\n return (\n <IconButton\n data-ui-id=\"video-tile-more-options-button\"\n styles={moreButtonStyles}\n iconProps={videoTileMoreIconProps}\n menuIconProps={videoTileMoreMenuIconProps}\n menuProps={{ ...videoTileMoreMenuProps, ...contextualMenu }}\n />\n );\n};\n\n/**\n * A component to render the video stream for a single call participant.\n *\n * Use with {@link GridLayout} in a {@link VideoGallery}.\n *\n * @public\n */\nexport const VideoTile = (props: VideoTileProps): JSX.Element => {\n const {\n children,\n displayName,\n initialsName,\n isMirrored,\n isMuted,\n /* @conditional-compile-remove(pinned-participants) */\n isPinned,\n onRenderPlaceholder,\n renderElement,\n showLabel = true,\n showMuteIndicator = true,\n styles,\n userId,\n noVideoAvailableAriaLabel,\n isSpeaking,\n personaMinSize = DEFAULT_PERSONA_MIN_SIZE_PX,\n personaMaxSize = DEFAULT_PERSONA_MAX_SIZE_PX,\n /* @conditional-compile-remove(pinned-participants) */\n contextualMenu\n } = props;\n\n /* @conditional-compile-remove(pinned-participants) */\n const [isHovered, setIsHovered] = useState<boolean>(false);\n /* @conditional-compile-remove(pinned-participants) */\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [personaSize, setPersonaSize] = useState(100);\n const videoTileRef = useRef<HTMLDivElement>(null);\n\n const locale = useLocale();\n const theme = useTheme();\n\n const isVideoRendered = !!renderElement;\n\n const observer = useRef(\n new ResizeObserver((entries): void => {\n const { width, height } = entries[0].contentRect;\n const personaSize = Math.min(width, height) / 3;\n setPersonaSize(Math.max(Math.min(personaSize, personaMaxSize), personaMinSize));\n })\n );\n\n useLayoutEffect(() => {\n if (videoTileRef.current) {\n observer.current.observe(videoTileRef.current);\n }\n const currentObserver = observer.current;\n return () => currentObserver.disconnect();\n }, [observer, videoTileRef]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const useLongPressProps = useMemo(() => {\n return {\n onLongPress: () => {\n props.onLongTouch?.();\n },\n touchEventsOnly: true\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.onLongTouch]);\n /* @conditional-compile-remove(pinned-participants) */\n const longPressHandlers = useLongPress(useLongPressProps);\n const longPressHandlersTrampoline = useMemo(() => {\n /* @conditional-compile-remove(pinned-participants) */\n return longPressHandlers;\n return {};\n }, [\n /* @conditional-compile-remove(pinned-participants) */\n longPressHandlers\n ]);\n\n const hoverHandlers = useMemo(() => {\n /* @conditional-compile-remove(pinned-participants) */\n return {\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false),\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false)\n };\n return {};\n }, []);\n\n const placeholderOptions = {\n userId,\n text: initialsName ?? displayName,\n noVideoAvailableAriaLabel,\n coinSize: personaSize,\n styles: defaultPersonaStyles,\n hidePersonaDetails: true\n };\n\n const videoHintWithBorderRadius = mergeStyles(videoHint, { borderRadius: theme.effects.roundedCorner4 });\n\n const tileInfoStyle = useMemo(\n () =>\n mergeStyles(\n isVideoRendered ? videoHintWithBorderRadius : disabledVideoHint,\n getVideoTileOverrideColor(isVideoRendered, theme, 'neutralPrimary'),\n styles?.displayNameContainer\n ),\n [isVideoRendered, videoHintWithBorderRadius, theme, styles?.displayNameContainer]\n );\n\n const ids = useIdentifiers();\n\n const canShowLabel = showLabel && (displayName || (showMuteIndicator && isMuted));\n const participantStateString = participantStateStringTrampoline(props, locale);\n /* @conditional-compile-remove(pinned-participants) */\n const canShowContextMenuButton = isHovered || isFocused;\n return (\n <Stack\n data-ui-id={ids.videoTile}\n className={mergeStyles(\n rootStyles,\n {\n background: theme.palette.neutralLighter,\n borderRadius: theme.effects.roundedCorner4,\n // To ensure that the video tile is focusable when there is a floating video tile\n zIndex: 1\n },\n isSpeaking && {\n '&::before': {\n content: `''`,\n position: 'absolute',\n zIndex: 1,\n border: `0.25rem solid ${theme.palette.themePrimary}`,\n borderRadius: theme.effects.roundedCorner4,\n width: '100%',\n height: '100%'\n }\n },\n styles?.root\n )}\n {...longPressHandlersTrampoline}\n >\n <div ref={videoTileRef} style={{ width: '100%', height: '100%' }} {...hoverHandlers}>\n {isVideoRendered ? (\n <Stack\n className={mergeStyles(\n videoContainerStyles,\n isMirrored && { transform: 'scaleX(-1)' },\n styles?.videoContainer\n )}\n >\n {renderElement}\n </Stack>\n ) : (\n <Stack\n className={mergeStyles(videoContainerStyles, {\n opacity:\n participantStateString ||\n /* @conditional-compile-remove(PSTN-calls) */ props.participantState === 'Idle'\n ? 0.4\n : 1\n })}\n >\n {onRenderPlaceholder ? (\n onRenderPlaceholder(userId ?? '', placeholderOptions, DefaultPlaceholder)\n ) : (\n <DefaultPlaceholder {...placeholderOptions} />\n )}\n </Stack>\n )}\n\n {(canShowLabel || participantStateString) && (\n <Stack horizontal className={tileInfoContainerStyle} tokens={tileInfoContainerTokens}>\n <Stack horizontal className={tileInfoStyle}>\n {canShowLabel && (\n <Text\n className={mergeStyles(displayNameStyle)}\n title={displayName}\n style={{ color: participantStateString ? theme.palette.neutralSecondary : 'inherit' }}\n >\n {displayName}\n </Text>\n )}\n {participantStateString && (\n <Text className={mergeStyles(participantStateStringStyles(theme))}>\n {bracketedParticipantString(participantStateString, !!canShowLabel)}\n </Text>\n )}\n {showMuteIndicator && isMuted && (\n <Stack className={mergeStyles(iconContainerStyle)}>\n <Icon iconName=\"VideoTileMicOff\" />\n </Stack>\n )}\n {\n /* @conditional-compile-remove(pinned-participants) */\n canShowContextMenuButton && <VideoTileMoreOptionsButton contextualMenu={contextualMenu} />\n }\n {\n /* @conditional-compile-remove(pinned-participants) */\n isPinned && (\n <Stack className={mergeStyles(iconContainerStyle)}>\n <Icon iconName=\"VideoTilePinned\" className={mergeStyles(pinIconStyle)} />\n </Stack>\n )\n }\n </Stack>\n </Stack>\n )}\n\n {children && (\n <Stack className={mergeStyles(overlayContainerStyles, styles?.overlayContainer)}>{children}</Stack>\n )}\n </div>\n </Stack>\n );\n};\n\nconst participantStateStringTrampoline = (props: VideoTileProps, locale: ComponentLocale): string | undefined => {\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n const strings = { ...locale.strings.videoTile, ...props.strings };\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n return props.participantState === 'EarlyMedia' || props.participantState === 'Ringing'\n ? strings?.participantStateRinging\n : props.participantState === 'Hold'\n ? strings?.participantStateHold\n : undefined;\n\n return undefined;\n};\n\nconst tileInfoContainerTokens = {\n // A horizontal Stack sets the left margin to 0 for all it's children.\n // We need to allow the children to set their own margins\n childrenGap: 'none'\n};\n\nconst bracketedParticipantString = (participantString: string, withBrackets: boolean): string => {\n return withBrackets ? `(${participantString})` : participantString;\n};\n"]}
|
1
|
+
{"version":3,"file":"VideoTile.js","sourceRoot":"","sources":["../../../../../../react-components/src/components/VideoTile.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Icon, IStyle, mergeStyles, Persona, Stack, Text } from '@fluentui/react';\n/* @conditional-compile-remove(pinned-participants) */\nimport { IconButton } from '@fluentui/react';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useIdentifiers } from '../identifiers';\nimport { ComponentLocale, useLocale } from '../localization';\nimport { useTheme } from '../theming';\nimport { BaseCustomStyles, CustomAvatarOptions, OnRenderAvatarCallback } from '../types';\n/* @conditional-compile-remove(one-to-n-calling) */\n/* @conditional-compile-remove(PSTN-calls) */\nimport { ParticipantState } from '../types';\nimport {\n disabledVideoHint,\n displayNameStyle,\n iconContainerStyle,\n overlayContainerStyles,\n rootStyles,\n videoContainerStyles,\n videoHint,\n tileInfoContainerStyle,\n participantStateStringStyles\n} from './styles/VideoTile.styles';\nimport { getVideoTileOverrideColor } from './utils/videoTileStylesUtils';\n/* @conditional-compile-remove(pinned-participants) */\nimport { pinIconStyle } from './styles/VideoTile.styles';\n/* @conditional-compile-remove(pinned-participants) */\nimport { DirectionalHint, IContextualMenuProps } from '@fluentui/react';\n/* @conditional-compile-remove(pinned-participants) */\nimport useLongPress from './utils/useLongPress';\n/* @conditional-compile-remove(pinned-participants) */\nimport { moreButtonStyles } from './styles/VideoTile.styles';\n\n/**\n * Strings of {@link VideoTile} that can be overridden.\n * @beta\n */\nexport interface VideoTileStrings {\n participantStateRinging: string;\n participantStateHold: string;\n}\n\n/**\n * Fluent styles for {@link VideoTile}.\n *\n * @public\n */\nexport interface VideoTileStylesProps extends BaseCustomStyles {\n /** Styles for video container. */\n videoContainer?: IStyle;\n /** Styles for container overlayed on the video container. */\n overlayContainer?: IStyle;\n /** Styles for displayName on the video container. */\n displayNameContainer?: IStyle;\n}\n\n/**\n * Props for {@link VideoTile}.\n *\n * @public\n */\nexport interface VideoTileProps {\n /** React Child components. Child Components will show as overlay component in the VideoTile. */\n children?: React.ReactNode;\n /**\n * Allows users to pass in an object contains custom CSS styles.\n * @Example\n * ```\n * <VideoTile styles={{ root: { background: 'blue' } }} />\n * ```\n */\n styles?: VideoTileStylesProps;\n /** user id for the VideoTile placeholder. */\n userId?: string;\n /** Component with the video stream. */\n renderElement?: JSX.Element | null;\n /** Determines if the video is mirrored or not. */\n isMirrored?: boolean;\n /** Custom render Component function for no video is available. Render a Persona Icon if undefined. */\n onRenderPlaceholder?: OnRenderAvatarCallback;\n /**\n * Show label on the VideoTile\n * @defaultValue true\n */\n showLabel?: boolean;\n /**\n * Whether to display a mute icon beside the user's display name.\n * @defaultValue true\n */\n showMuteIndicator?: boolean;\n /**\n * Whether the video is muted or not.\n */\n isMuted?: boolean;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * If true, the video tile will show the pin icon.\n */\n isPinned?: boolean;\n /**\n * Display Name of the Participant to be shown in the label.\n * @remarks `displayName` is used to generate avatar initials if `initialsName` is not provided.\n */\n displayName?: string;\n /**\n * Name of the participant used to generate initials. For example, a name `John Doe` will display `JD` as initials.\n * @remarks `displayName` is used if this property is not specified.\n */\n initialsName?: string;\n /**\n * Minimum size of the persona avatar in px.\n * The persona avatar is the default placeholder shown when no video stream is available.\n * For more information see https://developer.microsoft.com/en-us/fluentui#/controls/web/persona\n * @defaultValue 32px\n */\n personaMinSize?: number;\n /**\n * Maximum size of the personal avatar in px.\n * The persona avatar is the default placeholder shown when no video stream is available.\n * For more information see https://developer.microsoft.com/en-us/fluentui#/controls/web/persona\n * @defaultValue 100px\n */\n personaMaxSize?: number;\n /** Optional property to set the aria label of the video tile if there is no available stream. */\n noVideoAvailableAriaLabel?: string;\n /** Whether the participant in the videoTile is speaking. Shows a speaking indicator (border). */\n isSpeaking?: boolean;\n\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * The call connection state of the participant.\n * For example, `Hold` means the participant is on hold.\n */\n participantState?: ParticipantState;\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n strings?: VideoTileStrings;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Display custom menu items in the VideoTile's contextual menu.\n * Uses Fluent UI ContextualMenu.\n * An ellipses icon will be displayed to open the contextual menu if this prop is defined.\n */\n contextualMenu?: IContextualMenuProps;\n /* @conditional-compile-remove(pinned-participants) */\n /**\n * Callback triggered by video tile on touch and hold.\n */\n onLongTouch?: () => void;\n}\n\n// Coin max size is set to PersonaSize.size100\nconst DEFAULT_PERSONA_MAX_SIZE_PX = 100;\n// Coin min size is set PersonaSize.size32\nconst DEFAULT_PERSONA_MIN_SIZE_PX = 32;\n\nconst DefaultPlaceholder = (props: CustomAvatarOptions): JSX.Element => {\n const { text, noVideoAvailableAriaLabel, coinSize, hidePersonaDetails } = props;\n\n return (\n <Stack className={mergeStyles({ position: 'absolute', height: '100%', width: '100%' })}>\n <Stack styles={defaultPersonaStyles}>\n <Persona\n coinSize={coinSize}\n hidePersonaDetails={hidePersonaDetails}\n text={text ?? ''}\n initialsTextColor=\"white\"\n aria-label={noVideoAvailableAriaLabel ?? ''}\n showOverflowTooltip={false}\n />\n </Stack>\n </Stack>\n );\n};\n\nconst defaultPersonaStyles = { root: { margin: 'auto', maxHeight: '100%' } };\n\n/* @conditional-compile-remove(pinned-participants) */\nconst videoTileMoreMenuIconProps = { iconName: undefined, style: { display: 'none' } };\n/* @conditional-compile-remove(pinned-participants) */\nconst videoTileMoreMenuProps = {\n directionalHint: DirectionalHint.topLeftEdge,\n isBeakVisible: false,\n styles: { container: { maxWidth: '8rem' } }\n};\n/* @conditional-compile-remove(pinned-participants) */\nconst VideoTileMoreOptionsButton = (props: {\n contextualMenu?: IContextualMenuProps;\n canShowContextMenuButton: boolean;\n}): JSX.Element => {\n const { contextualMenu, canShowContextMenuButton } = props;\n if (!contextualMenu) {\n return <></>;\n }\n\n const optionsIcon = canShowContextMenuButton ? 'VideoTileMoreOptions' : undefined;\n\n return (\n <IconButton\n data-ui-id=\"video-tile-more-options-button\"\n styles={moreButtonStyles}\n menuIconProps={videoTileMoreMenuIconProps}\n menuProps={{ ...videoTileMoreMenuProps, ...contextualMenu }}\n iconProps={{ iconName: optionsIcon }}\n />\n );\n};\n\n/**\n * A component to render the video stream for a single call participant.\n *\n * Use with {@link GridLayout} in a {@link VideoGallery}.\n *\n * @public\n */\nexport const VideoTile = (props: VideoTileProps): JSX.Element => {\n const {\n children,\n displayName,\n initialsName,\n isMirrored,\n isMuted,\n /* @conditional-compile-remove(pinned-participants) */\n isPinned,\n onRenderPlaceholder,\n renderElement,\n showLabel = true,\n showMuteIndicator = true,\n styles,\n userId,\n noVideoAvailableAriaLabel,\n isSpeaking,\n personaMinSize = DEFAULT_PERSONA_MIN_SIZE_PX,\n personaMaxSize = DEFAULT_PERSONA_MAX_SIZE_PX,\n /* @conditional-compile-remove(pinned-participants) */\n contextualMenu\n } = props;\n\n /* @conditional-compile-remove(pinned-participants) */\n const [isHovered, setIsHovered] = useState<boolean>(false);\n /* @conditional-compile-remove(pinned-participants) */\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [personaSize, setPersonaSize] = useState(100);\n const videoTileRef = useRef<HTMLDivElement>(null);\n\n const locale = useLocale();\n const theme = useTheme();\n\n const isVideoRendered = !!renderElement;\n\n const observer = useRef(\n new ResizeObserver((entries): void => {\n const { width, height } = entries[0].contentRect;\n const personaSize = Math.min(width, height) / 3;\n setPersonaSize(Math.max(Math.min(personaSize, personaMaxSize), personaMinSize));\n })\n );\n\n useLayoutEffect(() => {\n if (videoTileRef.current) {\n observer.current.observe(videoTileRef.current);\n }\n const currentObserver = observer.current;\n return () => currentObserver.disconnect();\n }, [observer, videoTileRef]);\n\n /* @conditional-compile-remove(pinned-participants) */\n const useLongPressProps = useMemo(() => {\n return {\n onLongPress: () => {\n props.onLongTouch?.();\n },\n touchEventsOnly: true\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.onLongTouch]);\n /* @conditional-compile-remove(pinned-participants) */\n const longPressHandlers = useLongPress(useLongPressProps);\n const longPressHandlersTrampoline = useMemo(() => {\n /* @conditional-compile-remove(pinned-participants) */\n return longPressHandlers;\n return {};\n }, [\n /* @conditional-compile-remove(pinned-participants) */\n longPressHandlers\n ]);\n\n const hoverHandlers = useMemo(() => {\n /* @conditional-compile-remove(pinned-participants) */\n return {\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false),\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false)\n };\n return {};\n }, []);\n\n const placeholderOptions = {\n userId,\n text: initialsName ?? displayName,\n noVideoAvailableAriaLabel,\n coinSize: personaSize,\n styles: defaultPersonaStyles,\n hidePersonaDetails: true\n };\n\n const videoHintWithBorderRadius = mergeStyles(videoHint, { borderRadius: theme.effects.roundedCorner4 });\n\n const tileInfoStyle = useMemo(\n () =>\n mergeStyles(\n isVideoRendered ? videoHintWithBorderRadius : disabledVideoHint,\n getVideoTileOverrideColor(isVideoRendered, theme, 'neutralPrimary'),\n styles?.displayNameContainer\n ),\n [isVideoRendered, videoHintWithBorderRadius, theme, styles?.displayNameContainer]\n );\n\n const ids = useIdentifiers();\n\n const canShowLabel = showLabel && (displayName || (showMuteIndicator && isMuted));\n const participantStateString = participantStateStringTrampoline(props, locale);\n /* @conditional-compile-remove(pinned-participants) */\n const canShowContextMenuButton = isHovered || isFocused;\n return (\n <Stack\n data-ui-id={ids.videoTile}\n className={mergeStyles(\n rootStyles,\n {\n background: theme.palette.neutralLighter,\n borderRadius: theme.effects.roundedCorner4,\n // To ensure that the video tile is focusable when there is a floating video tile\n zIndex: 1\n },\n isSpeaking && {\n '&::before': {\n content: `''`,\n position: 'absolute',\n zIndex: 1,\n border: `0.25rem solid ${theme.palette.themePrimary}`,\n borderRadius: theme.effects.roundedCorner4,\n width: '100%',\n height: '100%'\n }\n },\n styles?.root\n )}\n {...longPressHandlersTrampoline}\n >\n <div ref={videoTileRef} style={{ width: '100%', height: '100%' }} {...hoverHandlers} data-is-focusable={true}>\n {isVideoRendered ? (\n <Stack\n className={mergeStyles(\n videoContainerStyles,\n isMirrored && { transform: 'scaleX(-1)' },\n styles?.videoContainer\n )}\n >\n {renderElement}\n </Stack>\n ) : (\n <Stack\n className={mergeStyles(videoContainerStyles, {\n opacity:\n participantStateString ||\n /* @conditional-compile-remove(PSTN-calls) */ props.participantState === 'Idle'\n ? 0.4\n : 1\n })}\n >\n {onRenderPlaceholder ? (\n onRenderPlaceholder(userId ?? '', placeholderOptions, DefaultPlaceholder)\n ) : (\n <DefaultPlaceholder {...placeholderOptions} />\n )}\n </Stack>\n )}\n\n {(canShowLabel || participantStateString) && (\n <Stack horizontal className={tileInfoContainerStyle} tokens={tileInfoContainerTokens}>\n <Stack horizontal className={tileInfoStyle}>\n {canShowLabel && (\n <Text\n className={mergeStyles(displayNameStyle)}\n title={displayName}\n style={{ color: participantStateString ? theme.palette.neutralSecondary : 'inherit' }}\n >\n {displayName}\n </Text>\n )}\n {participantStateString && (\n <Text className={mergeStyles(participantStateStringStyles(theme))}>\n {bracketedParticipantString(participantStateString, !!canShowLabel)}\n </Text>\n )}\n {showMuteIndicator && isMuted && (\n <Stack className={mergeStyles(iconContainerStyle)}>\n <Icon iconName=\"VideoTileMicOff\" />\n </Stack>\n )}\n {\n /* @conditional-compile-remove(pinned-participants) */\n <VideoTileMoreOptionsButton\n contextualMenu={contextualMenu}\n canShowContextMenuButton={canShowContextMenuButton}\n />\n }\n {\n /* @conditional-compile-remove(pinned-participants) */\n isPinned && (\n <Stack className={mergeStyles(iconContainerStyle)}>\n <Icon iconName=\"VideoTilePinned\" className={mergeStyles(pinIconStyle)} />\n </Stack>\n )\n }\n </Stack>\n </Stack>\n )}\n\n {children && (\n <Stack className={mergeStyles(overlayContainerStyles, styles?.overlayContainer)}>{children}</Stack>\n )}\n </div>\n </Stack>\n );\n};\n\nconst participantStateStringTrampoline = (props: VideoTileProps, locale: ComponentLocale): string | undefined => {\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n const strings = { ...locale.strings.videoTile, ...props.strings };\n /* @conditional-compile-remove(one-to-n-calling) */\n /* @conditional-compile-remove(PSTN-calls) */\n return props.participantState === 'EarlyMedia' || props.participantState === 'Ringing'\n ? strings?.participantStateRinging\n : props.participantState === 'Hold'\n ? strings?.participantStateHold\n : undefined;\n\n return undefined;\n};\n\nconst tileInfoContainerTokens = {\n // A horizontal Stack sets the left margin to 0 for all it's children.\n // We need to allow the children to set their own margins\n childrenGap: 'none'\n};\n\nconst bracketedParticipantString = (participantString: string, withBrackets: boolean): string => {\n return withBrackets ? `(${participantString})` : participantString;\n};\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@azure/communication-react",
|
3
|
-
"version": "1.5.1-alpha-
|
3
|
+
"version": "1.5.1-alpha-202302090014",
|
4
4
|
"sideEffects": false,
|
5
5
|
"description": "React library for building modern communication user experiences utilizing Azure Communication Services",
|
6
6
|
"keywords": [
|
@@ -89,13 +89,13 @@
|
|
89
89
|
"@azure/core-auth": "1.3.2",
|
90
90
|
"@babel/cli": "~7.16.0",
|
91
91
|
"@babel/core": "~7.16.0",
|
92
|
-
"@internal/calling-component-bindings": "1.5.1-alpha-
|
93
|
-
"@internal/calling-stateful-client": "1.5.1-alpha-
|
94
|
-
"@internal/chat-component-bindings": "1.5.1-alpha-
|
95
|
-
"@internal/chat-stateful-client": "1.5.1-alpha-
|
96
|
-
"@internal/fake-backends": "1.5.1-alpha-
|
97
|
-
"@internal/react-components": "1.5.1-alpha-
|
98
|
-
"@internal/react-composites": "1.5.1-alpha-
|
92
|
+
"@internal/calling-component-bindings": "1.5.1-alpha-202302090014",
|
93
|
+
"@internal/calling-stateful-client": "1.5.1-alpha-202302090014",
|
94
|
+
"@internal/chat-component-bindings": "1.5.1-alpha-202302090014",
|
95
|
+
"@internal/chat-stateful-client": "1.5.1-alpha-202302090014",
|
96
|
+
"@internal/fake-backends": "1.5.1-alpha-202302090014",
|
97
|
+
"@internal/react-components": "1.5.1-alpha-202302090014",
|
98
|
+
"@internal/react-composites": "1.5.1-alpha-202302090014",
|
99
99
|
"@microsoft/api-documenter": "~7.12.11",
|
100
100
|
"@microsoft/api-extractor": "~7.18.0",
|
101
101
|
"@rollup/plugin-json": "~4.1.0",
|