Files
element-call/src/Home.jsx

246 lines
7.2 KiB
React
Raw Normal View History

2021-08-19 17:49:45 -07:00
/*
Copyright 2021 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
2021-11-17 14:24:52 -08:00
import React, { useCallback, useState } from "react";
2021-12-07 17:59:55 -08:00
import { useHistory } from "react-router-dom";
import {
useGroupCallRooms,
usePublicRooms,
} from "./ConferenceCallManagerHooks";
2021-12-06 18:00:34 -08:00
import { Header, HeaderLogo, LeftNav, RightNav } from "./Header";
2021-08-19 17:49:45 -07:00
import styles from "./Home.module.css";
2021-12-07 11:59:57 -08:00
import { FieldRow, InputField, ErrorMessage } from "./Input";
2021-09-29 16:23:18 -07:00
import {
GroupCallIntent,
GroupCallType,
} from "matrix-js-sdk/src/browser-index";
2021-12-06 18:00:34 -08:00
import { UserMenu } from "./UserMenu";
2021-12-07 11:59:57 -08:00
import { Button } from "./button";
2021-12-07 17:59:55 -08:00
import { CallTile } from "./CallTile";
2021-08-19 17:49:45 -07:00
2021-11-17 14:24:52 -08:00
function roomAliasFromRoomName(roomName) {
return roomName
.trim()
.replace(/\s/g, "-")
.replace(/[^\w-]/g, "")
.toLowerCase();
}
2021-09-10 12:20:17 -07:00
export function Home({ client, onLogout }) {
2021-08-19 17:49:45 -07:00
const history = useHistory();
2021-11-17 14:24:52 -08:00
const [roomName, setRoomName] = useState("");
const [guestAccess, setGuestAccess] = useState(false);
2021-08-19 17:49:45 -07:00
const [createRoomError, setCreateRoomError] = useState();
const rooms = useGroupCallRooms(client);
const publicRooms = usePublicRooms(
client,
import.meta.env.VITE_PUBLIC_SPACE_ROOM_ID
);
2021-08-19 17:49:45 -07:00
const onCreateRoom = useCallback(
(e) => {
e.preventDefault();
setCreateRoomError(undefined);
2021-11-17 14:24:52 -08:00
async function createRoom(name, roomAlias, guestAccess) {
const { room_id, room_alias } = await client.createRoom({
2021-08-19 17:49:45 -07:00
visibility: "private",
preset: "public_chat",
2021-09-03 15:45:07 -07:00
name,
2021-11-17 14:24:52 -08:00
room_alias_name: roomAlias,
2021-10-13 12:59:53 -07:00
power_level_content_override: {
invite: 100,
kick: 100,
ban: 100,
redact: 50,
state_default: 0,
events_default: 0,
users_default: 0,
events: {
"m.room.power_levels": 100,
"m.room.history_visibility": 100,
"m.room.tombstone": 100,
"m.room.encryption": 100,
"m.room.name": 50,
"m.room.message": 0,
"m.room.encrypted": 50,
"m.sticker": 50,
"org.matrix.msc3401.call.member": 0,
},
users: {
[client.getUserId()]: 100,
},
},
2021-09-03 15:45:07 -07:00
});
if (guestAccess) {
2021-09-10 12:20:17 -07:00
await client.setGuestAccess(room_id, {
2021-09-03 15:45:07 -07:00
allowJoin: true,
allowRead: true,
});
}
2021-09-29 16:23:18 -07:00
await client.createGroupCall(
room_id,
GroupCallType.Video,
GroupCallIntent.Prompt
);
2021-11-17 14:24:52 -08:00
history.push(`/room/${room_alias || room_id}`);
2021-09-03 15:45:07 -07:00
}
2021-11-17 14:24:52 -08:00
const data = new FormData(e.target);
const roomName = data.get("roomName");
const guestAccess = data.get("guestAccess");
2021-12-07 17:59:55 -08:00
createRoom(roomName, roomAliasFromRoomName(roomName), guestAccess).catch(
(error) => {
setCreateRoomError(error);
setShowAdvanced(true);
}
);
2021-08-19 17:49:45 -07:00
},
2021-09-10 12:20:17 -07:00
[client]
2021-08-19 17:49:45 -07:00
);
2021-12-07 17:59:55 -08:00
const [roomId, setRoomId] = useState("");
const onJoinRoom = useCallback(
(e) => {
e.preventDefault();
const data = new FormData(e.target);
const roomId = data.get("roomId");
history.push(`/room/${roomId}`);
},
[history]
);
2021-08-19 17:49:45 -07:00
return (
2021-12-07 17:59:55 -08:00
<div class={styles.home}>
<div className={styles.left}>
<Header>
<LeftNav>
<HeaderLogo />
</LeftNav>
</Header>
<div className={styles.content}>
<div className={styles.centered}>
<form onSubmit={onJoinRoom}>
<h1>Join a call</h1>
<FieldRow className={styles.fieldRow}>
<InputField
id="roomId"
name="roomId"
label="Call ID"
type="text"
required
autoComplete="off"
placeholder="Call ID"
value={roomId}
onChange={(e) => setRoomId(e.target.value)}
/>
</FieldRow>
<FieldRow className={styles.fieldRow}>
<Button className={styles.button} type="submit">
Join call
</Button>
</FieldRow>
</form>
<hr />
<form onSubmit={onCreateRoom}>
<h1>Create a call</h1>
<FieldRow className={styles.fieldRow}>
<InputField
id="roomName"
name="roomName"
label="Room Name"
type="text"
required
autoComplete="off"
placeholder="Room Name"
value={roomName}
onChange={(e) => setRoomName(e.target.value)}
/>
</FieldRow>
<FieldRow>
<InputField
id="guestAccess"
name="guestAccess"
label="Allow Guest Access"
type="checkbox"
checked={guestAccess}
onChange={(e) => setGuestAccess(e.target.checked)}
/>
</FieldRow>
{createRoomError && (
<FieldRow className={styles.fieldRow}>
<ErrorMessage>{createRoomError.message}</ErrorMessage>
2021-08-23 12:32:32 -07:00
</FieldRow>
2021-12-07 17:59:55 -08:00
)}
<FieldRow className={styles.fieldRow}>
<Button className={styles.button} type="submit">
Create call
</Button>
</FieldRow>
</form>
</div>
</div>
</div>
<div className={styles.right}>
<Header>
<LeftNav />
<RightNav>
<UserMenu
signedIn
userName={client.getUserIdLocalpart()}
onLogout={onLogout}
/>
</RightNav>
</Header>
<div className={styles.content}>
{publicRooms.length > 0 && (
<>
<h3>Public Calls</h3>
2021-08-23 12:32:32 -07:00
<div className={styles.roomList}>
2021-12-07 17:59:55 -08:00
{publicRooms.map((room) => (
<CallTile
key={room.room_id}
name={room.name}
avatarUrl={null}
roomUrl={`/room/${room.room_id}`}
/>
2021-08-23 12:32:32 -07:00
))}
</div>
2021-12-07 17:59:55 -08:00
</>
)}
<h3>Recent Calls</h3>
<div className={styles.roomList}>
{rooms.map(({ room, participants }) => (
<CallTile
key={room.roomId}
name={room.name}
avatarUrl={null}
roomUrl={`/room/${room.getCanonicalAlias() || room.roomId}`}
participants={participants}
/>
))}
</div>
</div>
</div>
</div>
2021-08-19 17:49:45 -07:00
);
}