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:
parent
307d737555
commit
015b9386e1
2 changed files with 32 additions and 5 deletions
|
@ -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(
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
Loading…
Reference in a new issue