change logic of when to show the call and share button. (#12385)

Allow starting calls in rooms with only one person if one can add invite others with a call link.

Signed-off-by: Timo K <toger5@hotmail.de>
This commit is contained in:
Timo 2024-04-04 15:36:07 +02:00 committed by GitHub
parent 307d737555
commit 015b9386e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 5 deletions

View file

@ -189,6 +189,8 @@ export const useRoomCall = (
// We only want to prompt to pin the widget if it's not element call based. // We only want to prompt to pin the widget if it's not element call based.
const isECWidget = WidgetType.CALL.matches(widget?.type ?? ""); const isECWidget = WidgetType.CALL.matches(widget?.type ?? "");
const promptPinWidget = !isECWidget && canPinWidget && !widgetPinned; const promptPinWidget = !isECWidget && canPinWidget && !widgetPinned;
const userId = room.client.getUserId();
const canInviteToRoom = userId ? room.canInvite(userId) : false;
const state = useMemo((): State => { const state = useMemo((): State => {
if (activeCalls.find((call) => call.roomId != room.roomId)) { if (activeCalls.find((call) => call.roomId != room.roomId)) {
return State.Ongoing; return State.Ongoing;
@ -199,8 +201,9 @@ export const useRoomCall = (
if (hasLegacyCall) { if (hasLegacyCall) {
return State.Ongoing; return State.Ongoing;
} }
const canCallAlone =
if (memberCount <= 1) { canInviteToRoom && (room.getJoinRule() === "public" || room.getJoinRule() === JoinRule.Knock);
if (!(memberCount > 1 || canCallAlone)) {
return State.NoOneHere; return State.NoOneHere;
} }
@ -210,6 +213,7 @@ export const useRoomCall = (
return State.NoCall; return State.NoCall;
}, [ }, [
activeCalls, activeCalls,
canInviteToRoom,
hasGroupCall, hasGroupCall,
hasJitsiWidget, hasJitsiWidget,
hasLegacyCall, hasLegacyCall,
@ -218,7 +222,7 @@ export const useRoomCall = (
mayEditWidgets, mayEditWidgets,
memberCount, memberCount,
promptPinWidget, promptPinWidget,
room.roomId, room,
]); ]);
const voiceCallClick = useCallback( const voiceCallClick = useCallback(

View file

@ -33,6 +33,7 @@ import {
getByLabelText, getByLabelText,
getByRole, getByRole,
getByText, getByText,
queryAllByLabelText,
render, render,
RenderOptions, RenderOptions,
screen, screen,
@ -83,7 +84,6 @@ describe("RoomHeader", () => {
); );
let room: Room; let room: Room;
const ROOM_ID = "!1:example.org"; const ROOM_ID = "!1:example.org";
let setCardSpy: jest.SpyInstance | undefined; let setCardSpy: jest.SpyInstance | undefined;
@ -371,7 +371,7 @@ describe("RoomHeader", () => {
} }
}); });
it("can't call if you have no friends", () => { it("can't call if you have no friends and cannot invite friends", () => {
mockRoomMembers(room, 1); mockRoomMembers(room, 1);
const { container } = render(<RoomHeader room={room} />, getWrapper()); const { container } = render(<RoomHeader room={room} />, getWrapper());
for (const button of getAllByLabelText(container, "There's no one here to call")) { for (const button of getAllByLabelText(container, "There's no one here to call")) {
@ -379,6 +379,29 @@ describe("RoomHeader", () => {
} }
}); });
it("can call if you have no friends but can invite friends", () => {
mockRoomMembers(room, 1);
// go through all the different `canInvite` and `getJoinRule` combinations
jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Invite);
jest.spyOn(room, "canInvite").mockReturnValue(false);
const { container: containerNoInviteNotPublic } = render(<RoomHeader room={room} />, getWrapper());
expect(queryAllByLabelText(containerNoInviteNotPublic, "There's no one here to call")).toHaveLength(2);
jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Knock);
jest.spyOn(room, "canInvite").mockReturnValue(false);
const { container: containerNoInvitePublic } = render(<RoomHeader room={room} />, getWrapper());
expect(queryAllByLabelText(containerNoInvitePublic, "There's no one here to call")).toHaveLength(2);
jest.spyOn(room, "canInvite").mockReturnValue(true);
jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Invite);
const { container: containerInviteNotPublic } = render(<RoomHeader room={room} />, getWrapper());
expect(queryAllByLabelText(containerInviteNotPublic, "There's no one here to call")).toHaveLength(2);
jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Knock);
jest.spyOn(room, "canInvite").mockReturnValue(true);
const { container: containerInvitePublic } = render(<RoomHeader room={room} />, getWrapper());
expect(queryAllByLabelText(containerInvitePublic, "There's no one here to call")).toHaveLength(0);
});
it("calls using legacy or jitsi", async () => { it("calls using legacy or jitsi", async () => {
mockRoomMembers(room, 2); mockRoomMembers(room, 2);
jest.spyOn(room.currentState, "mayClientSendStateEvent").mockImplementation((key) => { jest.spyOn(room.currentState, "mayClientSendStateEvent").mockImplementation((key) => {