Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
fface3a
Upgrade calling beta to 1.16.2-beta.1
mgamis-msft Aug 17, 2023
86e1bc2
Change files
mgamis-msft Aug 17, 2023
191b430
Duplicate change files for beta release
mgamis-msft Aug 17, 2023
10f57d1
fix test fixture
mgamis-msft Aug 17, 2023
09c8a2a
Merge branch 'main' into upgrade-calling-beta-to-1.16.2-beta.1
mgamis-msft Aug 18, 2023
d2c3d6c
pull in PR approved changes from carocao/GA_Captions and upgrade to 1…
mgamis-msft Aug 19, 2023
1bdda6f
Merge branch 'main' into upgrade-calling-beta-to-1.16.3-beta.1
mgamis-msft Aug 19, 2023
ff56168
Undo changes to common/config/env/.env
mgamis-msft Aug 19, 2023
ba68c90
Undo @public annotation of CaptionsOptions
mgamis-msft Aug 19, 2023
95b04e9
CapabilitiesChangeInfo state added
mgamis-msft Aug 14, 2023
47880f4
CapabilitiesNotificationBar copying ErrorBar
mgamis-msft Aug 14, 2023
8b4588f
capabilities notification strings added
mgamis-msft Aug 14, 2023
49f51ab
Show notification bar when camera, mic and screen share capabilities …
mgamis-msft Aug 17, 2023
95c9767
rename to CapabilitiesChangeNotificationBar
mgamis-msft Aug 18, 2023
26d3cf7
Change files
mgamis-msft Aug 18, 2023
22d6d2b
Duplicate change files for beta release
mgamis-msft Aug 18, 2023
4505844
fix conditional compilation statement
mgamis-msft Aug 21, 2023
64791e4
Show notification bar when camera, mic and screen share capabilities …
mgamis-msft Aug 22, 2023
935e259
using hook to track dismissed capabilities change notifications
mgamis-msft Aug 23, 2023
7e6d0ff
working
mgamis-msft Aug 23, 2023
fe6a470
big refactor
mgamis-msft Aug 23, 2023
a60746d
more refactoring
mgamis-msft Aug 23, 2023
1116d6d
move notification tracking logic to hook in CallPage
mgamis-msft Aug 24, 2023
1309e58
Fix hook argument
mgamis-msft Aug 24, 2023
4c3229d
refactor
mgamis-msft Aug 24, 2023
8cd5b99
Merge branch 'main' into mgamis/capabilities-notification
mgamis-msft Aug 24, 2023
b31fb08
pause
mgamis-msft Aug 24, 2023
d807b9a
refactor
mgamis-msft Aug 24, 2023
6b07c21
fix test fixture
mgamis-msft Aug 24, 2023
f367f40
CallState.capabilitiesState -> CallState.capabilitiesFeature
mgamis-msft Aug 24, 2023
32f3513
move capability notification tracking in call composite and fix initi…
mgamis-msft Aug 25, 2023
201dcd9
not showing notifications for capabilities with the reasons RoleChanged
mgamis-msft Aug 25, 2023
d7353d4
remove unnecessary optionals
mgamis-msft Aug 25, 2023
2fa8c0a
skip the first notification if it is role related to be like Teams
mgamis-msft Aug 25, 2023
cb4c61e
filter out shareScreen capability notifications if on mobile
mgamis-msft Aug 25, 2023
c31f379
fix conditional compilation
mgamis-msft Aug 25, 2023
c6acb14
Merge branch 'main' into mgamis/capabilities-notification
mgamis-msft Aug 25, 2023
31a1c03
Merge branch 'main' into mgamis/capabilities-notification
mgamis-msft Aug 28, 2023
0b78c1a
remove console log
mgamis-msft Aug 29, 2023
e14c1fd
restructure strings for capability changed notifications
mgamis-msft Aug 29, 2023
275ee59
Merge branch 'main' into mgamis/capabilities-notification
mgamis-msft Aug 29, 2023
a3d8d3b
Merge branch 'main' into mgamis/capabilities-notification
mgamis-msft Aug 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"type": "none",
"area": "feature",
"workstream": "Capabilities",
"comment": "Show notification bar when camera, mic and screen share capabilities changes",
"packageName": "@azure/communication-react",
"email": "79475487+mgamis-msft@users.noreply.github.com",
"dependentChangeType": "none"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"type": "none",
"area": "feature",
"workstream": "Capabilities",
"comment": "Show notification bar when camera, mic and screen share capabilities changes",
"packageName": "@azure/communication-react",
"email": "79475487+mgamis-msft@users.noreply.github.com",
"dependentChangeType": "none"
}
2 changes: 1 addition & 1 deletion packages/calling-component-bindings/src/baseSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const getRole = (state: CallClientState, props: CallingBaseSelectorProps)
export const getCapabilites = (
state: CallClientState,
props: CallingBaseSelectorProps
): ParticipantCapabilities | undefined => state.calls[props.callId]?.capabilities?.capabilities;
): ParticipantCapabilities | undefined => state.calls[props.callId]?.capabilitiesFeature?.capabilities;

/**
* @private
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { CallEndReason } from '@azure/communication-calling';
import { CallerInfo } from '@azure/communication-calling';
import { CallKind } from '@azure/communication-calling';
import { CallState as CallState_2 } from '@azure/communication-calling';
import { CapabilitiesChangeInfo } from '@azure/communication-calling';
import { CaptionsResultType } from '@azure/communication-calling';
import { CommunicationIdentifier } from '@azure/communication-common';
import { CommunicationIdentifierKind } from '@azure/communication-common';
Expand Down Expand Up @@ -107,7 +108,7 @@ export type CallErrorTarget = 'Call.addParticipant' | 'Call.dispose' | 'Call.fea
export interface CallState {
callEndReason?: CallEndReason;
callerInfo: CallerInfo;
capabilities?: CapabilitiesCallFeature;
capabilitiesFeature?: CapabilitiesFeatureState;
captionsFeature: CaptionsCallFeatureState;
diagnostics: DiagnosticsCallFeatureState;
direction: CallDirection;
Expand Down Expand Up @@ -137,8 +138,9 @@ export interface CallState {
}

// @beta
export interface CapabilitiesCallFeature {
export interface CapabilitiesFeatureState {
capabilities: ParticipantCapabilities;
latestCapabilitiesChangeInfo: CapabilitiesChangeInfo;
}

// @beta (undocumented)
Expand Down
8 changes: 6 additions & 2 deletions packages/calling-stateful-client/src/CallClientState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {
VideoDeviceInfo
} from '@azure/communication-calling';
/* @conditional-compile-remove(capabilities) */
import { ParticipantCapabilities } from '@azure/communication-calling';
import { CapabilitiesChangeInfo, ParticipantCapabilities } from '@azure/communication-calling';
/* @conditional-compile-remove(close-captions) */
import { CaptionsResultType } from '@azure/communication-calling';
/* @conditional-compile-remove(video-background-effects) */
Expand Down Expand Up @@ -148,6 +148,10 @@ export interface CapabilitiesFeatureState {
* Proxy of {@link @azure/communication-calling#CapabilitiesFeature.capabilities}.
*/
capabilities: ParticipantCapabilities;
/**
* Proxy of the latest {@link @azure/communication-calling#CapabilitiesChangeInfo}
*/
latestCapabilitiesChangeInfo: CapabilitiesChangeInfo;
}

/**
Expand Down Expand Up @@ -485,7 +489,7 @@ export interface CallState {
/**
* Proxy of {@link @azure/communication-calling#CapabilitiesFeature}.
*/
capabilities?: CapabilitiesFeatureState;
capabilitiesFeature?: CapabilitiesFeatureState;
}

/* @conditional-compile-remove(call-transfer) */
Expand Down
10 changes: 7 additions & 3 deletions packages/calling-stateful-client/src/CallContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
/* @conditional-compile-remove(raise-hand) */
import { RaisedHand } from '@azure/communication-calling';
/* @conditional-compile-remove(capabilities) */
import { ParticipantCapabilities } from '@azure/communication-calling';
import { CapabilitiesChangeInfo, ParticipantCapabilities } from '@azure/communication-calling';
/* @conditional-compile-remove(close-captions) */
import { TeamsCaptionsInfo } from '@azure/communication-calling';
/* @conditional-compile-remove(unsupported-browser) */
Expand Down Expand Up @@ -392,11 +392,15 @@ export class CallContext {
}

/* @conditional-compile-remove(capabilities) */
public setCapabilities(callId: string, capabilities: ParticipantCapabilities): void {
public setCapabilities(
callId: string,
capabilities: ParticipantCapabilities,
capabilitiesChangeInfo: CapabilitiesChangeInfo
): void {
this.modifyState((draft: CallClientState) => {
const call = draft.calls[this._callIdHistory.latestCallId(callId)];
if (call) {
call.capabilities = { capabilities: capabilities };
call.capabilitiesFeature = { capabilities, latestCapabilitiesChangeInfo: capabilitiesChangeInfo };
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Licensed under the MIT license.

/* @conditional-compile-remove(capabilities) */
import { CapabilitiesFeature } from '@azure/communication-calling';
import { CapabilitiesChangeInfo, CapabilitiesFeature } from '@azure/communication-calling';
/* @conditional-compile-remove(capabilities) */
import { CallContext } from './CallContext';
/* @conditional-compile-remove(capabilities) */
Expand Down Expand Up @@ -33,7 +33,7 @@ export class CapabilitiesSubscriber {
this._capabilitiesFeature.off('capabilitiesChanged', this.capabilitiesChanged);
};

private capabilitiesChanged = (): void => {
this._context.setCapabilities(this._callIdRef.callId, this._capabilitiesFeature.capabilities);
private capabilitiesChanged = (data: CapabilitiesChangeInfo): void => {
this._context.setCapabilities(this._callIdRef.callId, this._capabilitiesFeature.capabilities, data);
};
}
2 changes: 1 addition & 1 deletion packages/calling-stateful-client/src/index-public.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export type { DeclarativeIncomingCall } from './IncomingCallDeclarative';
/* @conditional-compile-remove(video-background-effects) */
export type { LocalVideoStreamVideoEffectsState } from './CallClientState';
/* @conditional-compile-remove(capabilities) */
export type { CapabilitiesFeatureState as CapabilitiesCallFeature } from './CallClientState';
export type { CapabilitiesFeatureState } from './CallClientState';
/* @conditional-compile-remove(close-captions) */
export type { CaptionsCallFeatureState, CaptionsInfo } from './CallClientState';
/* @conditional-compile-remove(call-transfer) */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { CallEndReason } from '@azure/communication-calling';
import { CallerInfo } from '@azure/communication-calling';
import { CallKind } from '@azure/communication-calling';
import { CallState as CallState_2 } from '@azure/communication-calling';
import type { CapabilitiesChangeInfo } from '@azure/communication-calling';
import { CapabilitiesChangeInfo } from '@azure/communication-calling';
import { CaptionsResultType } from '@azure/communication-calling';
import { ChatClient } from '@azure/communication-chat';
import { ChatClientOptions } from '@azure/communication-chat';
Expand Down Expand Up @@ -617,6 +617,7 @@ export interface CallCompositeStrings {
cameraOffBackgroundEffectWarningText?: string;
cameraPermissionDenied: string;
cameraTurnedOff: string;
capabilityChangedNotification?: CapabilityChangedNotificationStrings;
captionLanguageStrings?: CaptionLanguageStrings;
captionsBannerMoreButtonCallingLabel?: string;
captionsBannerMoreButtonTooltip?: string;
Expand Down Expand Up @@ -849,7 +850,7 @@ export interface CallProviderProps {
export interface CallState {
callEndReason?: CallEndReason;
callerInfo: CallerInfo;
capabilities?: CapabilitiesCallFeature;
capabilitiesFeature?: CapabilitiesFeatureState;
captionsFeature: CaptionsCallFeatureState;
diagnostics: DiagnosticsCallFeatureState;
direction: CallDirection;
Expand Down Expand Up @@ -1318,12 +1319,29 @@ export type CameraSitePermissionsStrings = SitePermissionsStrings;
export type CancelEditCallback = (messageId: string) => void;

// @beta
export interface CapabilitiesCallFeature {
export type CapabilitiesChangedListener = (data: CapabilitiesChangeInfo) => void;

// @beta
export interface CapabilitiesFeatureState {
capabilities: ParticipantCapabilities;
latestCapabilitiesChangeInfo: CapabilitiesChangeInfo;
}

// @beta
export type CapabilitiesChangedListener = (data: CapabilitiesChangeInfo) => void;
export interface CapabilityChangedNotificationStrings {
shareScreen?: {
lostDueToRoleChangeToAttendee?: string;
grantedDueToRoleChangeToPresenter?: string;
};
turnVideoOn?: {
lostDueToMeetingOption?: string;
grantedDueToMeetingOption?: string;
};
unmuteMic?: {
lostDueToMeetingOption?: string;
grantedDueToMeetingOption?: string;
};
}

// @beta
export interface CaptionLanguageStrings {
Expand Down
17 changes: 17 additions & 0 deletions packages/react-composites/review/beta/react-composites.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ export interface CallCompositeStrings {
cameraOffBackgroundEffectWarningText?: string;
cameraPermissionDenied: string;
cameraTurnedOff: string;
capabilityChangedNotification?: CapabilityChangedNotificationStrings;
captionLanguageStrings?: CaptionLanguageStrings;
captionsBannerMoreButtonCallingLabel?: string;
captionsBannerMoreButtonTooltip?: string;
Expand Down Expand Up @@ -934,6 +935,22 @@ export type CallWithChatEvent = 'callError' | 'chatError' | 'callEnded' | 'isMut
// @beta
export type CapabilitiesChangedListener = (data: CapabilitiesChangeInfo) => void;

// @beta
export interface CapabilityChangedNotificationStrings {
shareScreen?: {
lostDueToRoleChangeToAttendee?: string;
grantedDueToRoleChangeToPresenter?: string;
};
turnVideoOn?: {
lostDueToMeetingOption?: string;
grantedDueToMeetingOption?: string;
};
unmuteMic?: {
lostDueToMeetingOption?: string;
grantedDueToMeetingOption?: string;
};
}

// @beta
export type CaptionsReceivedListener = (event: {
captionsInfo: CaptionsInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ import { usePropsFor } from './hooks/usePropsFor';
import { deviceCountSelector } from './selectors/deviceCountSelector';
/* @conditional-compile-remove(gallery-layouts) */
import { VideoGalleryLayout } from '@internal/react-components';
/* @conditional-compile-remove(capabilities) */
import { capabilitiesChangedInfoAndRoleSelector } from './selectors/capabilitiesChangedInfoAndRoleSelector';
/* @conditional-compile-remove(capabilities) */
import { useTrackedCapabilityChangedNotifications } from './utils/TrackCapabilityChangedNotifications';

/**
* Props for {@link CallComposite}.
Expand Down Expand Up @@ -297,6 +301,13 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
onSidePaneIdChange?.(sidePaneRenderer?.id);
}, [sidePaneRenderer?.id, onSidePaneIdChange]);

/* @conditional-compile-remove(capabilities) */
const capabilitiesChangedInfoAndRole = useSelector(capabilitiesChangedInfoAndRoleSelector);

/* @conditional-compile-remove(capabilities) */
const capabilitiesChangedNotificationBarProps =
useTrackedCapabilityChangedNotifications(capabilitiesChangedInfoAndRole);

// Track the last dismissed errors of any error kind to prevent errors from re-appearing on subsequent page navigation
// This works by tracking the most recent timestamp of any active error type.
// And then tracking when that error type was last dismissed.
Expand Down Expand Up @@ -356,6 +367,8 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
onPermissionsTroubleshootingClick={props.options?.onPermissionsTroubleshootingClick}
/* @conditional-compile-remove(call-readiness) */
onNetworkingTroubleShootingClick={props.options?.onNetworkingTroubleShootingClick}
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps={capabilitiesChangedNotificationBarProps}
/>
);
break;
Expand Down Expand Up @@ -422,6 +435,8 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
mobileChatTabHeader={props.mobileChatTabHeader}
latestErrors={latestErrors}
onDismissError={onDismissError}
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps={capabilitiesChangedNotificationBarProps}
/>
);
break;
Expand All @@ -438,6 +453,8 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
onFetchAvatarPersonaData={onFetchAvatarPersonaData}
latestErrors={latestErrors}
onDismissError={onDismissError}
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps={capabilitiesChangedNotificationBarProps}
/>
);
break;
Expand All @@ -459,6 +476,8 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
galleryLayout={
props.options?.galleryOptions?.layout ? props.options.galleryOptions.layout : 'floatingLocalVideo'
}
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps={capabilitiesChangedNotificationBarProps}
/>
);
break;
Expand All @@ -475,6 +494,8 @@ const MainScreen = (props: MainScreenProps): JSX.Element => {
mobileChatTabHeader={props.mobileChatTabHeader}
latestErrors={latestErrors}
onDismissError={onDismissError}
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps={capabilitiesChangedNotificationBarProps}
/>
}
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

/* @conditional-compile-remove(close-captions) */
import { SpokenLanguageStrings, CaptionLanguageStrings } from '@internal/react-components';
/* @conditional-compile-remove(capabilities) */
import { CapabilityChangedNotificationStrings } from './components/CapabilitiesChangedNotificationBar';

/**
* Strings used by the {@link CallComposite} directly.
Expand Down Expand Up @@ -627,4 +629,9 @@ export interface CallCompositeStrings {
* Label for the selection of the focusedContentLayout (Focused content) layout
*/
moreButtonGalleryFocusedContentLayoutLabel?: string;
/* @conditional-compile-remove(capabilities) */
/**
* All strings for capability changed notification
*/
capabilityChangedNotification?: CapabilityChangedNotificationStrings;
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ import { MobileChatSidePaneTabHeaderProps } from '../../common/TabHeader';
import { CommonCallControlOptions } from '../../common/types/CommonCallControlOptions';
/* @conditional-compile-remove(video-background-effects) */
import { localVideoSelector } from '../../CallComposite/selectors/localVideoStreamSelector';
/* @conditional-compile-remove(capabilities) */
import {
CapabilitiesChangedNotificationBar,
CapabilitiesChangeNotificationBarProps
} from './CapabilitiesChangedNotificationBar';

/**
* @private
Expand All @@ -101,6 +106,8 @@ export interface CallArrangementProps {
onUserSetGalleryLayoutChange?: (layout: VideoGalleryLayout) => void;
/* @conditional-compile-remove(gallery-layouts) */
userSetGalleryLayout?: VideoGalleryLayout;
/* @conditional-compile-remove(capabilities) */
capabilitiesChangedNotificationBarProps?: CapabilitiesChangeNotificationBarProps;
}

/**
Expand Down Expand Up @@ -277,6 +284,14 @@ export const CallArrangement = (props: CallArrangementProps): JSX.Element => {
const verticalControlBar =
props.mobileView && containerWidth && containerHeight && containerWidth / containerHeight > 1 ? true : false;

/* @conditional-compile-remove(capabilities) */
// Filter out shareScreen capability notifications if on mobile
const filteredCapabilitesChangedNotifications = props.mobileView
? props.capabilitiesChangedNotificationBarProps?.capabilitiesChangedNotifications.filter(
(notification) => notification.capabilityName !== 'shareScreen'
)
: props.capabilitiesChangedNotificationBarProps?.capabilitiesChangedNotifications;

return (
<div ref={containerRef} className={mergeStyles(containerDivStyles)} id={props.id}>
<Stack verticalFill horizontalAlign="stretch" className={containerClassName} data-ui-id={props.dataUiId}>
Expand Down Expand Up @@ -385,6 +400,18 @@ export const CallArrangement = (props: CallArrangementProps): JSX.Element => {
/>
</Stack>
)}
{
/* @conditional-compile-remove(capabilities) */
props.capabilitiesChangedNotificationBarProps &&
props.capabilitiesChangedNotificationBarProps.capabilitiesChangedNotifications.length > 0 && (
<Stack styles={bannerNotificationStyles}>
<CapabilitiesChangedNotificationBar
{...props.capabilitiesChangedNotificationBarProps}
capabilitiesChangedNotifications={filteredCapabilitesChangedNotifications ?? []}
/>
</Stack>
)
}
{canUnmute && !!props.mutedNotificationProps && (
<MutedNotification {...props.mutedNotificationProps} />
)}
Expand Down
Loading