import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; import './CreateRoom.scss'; import initMatrix from '../../../client/initMatrix'; import { isRoomAliasAvailable } from '../../../util/matrixUtil'; import * as roomActions from '../../../client/action/room'; import { selectRoom } from '../../../client/action/navigation'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; import Toggle from '../../atoms/button/Toggle'; import IconButton from '../../atoms/button/IconButton'; import Input from '../../atoms/input/Input'; import Spinner from '../../atoms/spinner/Spinner'; import SegmentControl from '../../atoms/segmented-controls/SegmentedControls'; import PopupWindow from '../../molecules/popup-window/PopupWindow'; import SettingTile from '../../molecules/setting-tile/SettingTile'; import HashPlusIC from '../../../../public/res/ic/outlined/hash-plus.svg'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; function CreateRoom({ isOpen, onRequestClose }) { const [isPublic, togglePublic] = useState(false); const [isEncrypted, toggleEncrypted] = useState(true); const [isValidAddress, updateIsValidAddress] = useState(null); const [isCreatingRoom, updateIsCreatingRoom] = useState(false); const [creatingError, updateCreatingError] = useState(null); const [titleValue, updateTitleValue] = useState(undefined); const [topicValue, updateTopicValue] = useState(undefined); const [addressValue, updateAddressValue] = useState(undefined); const [roleIndex, setRoleIndex] = useState(0); const addressRef = useRef(null); const topicRef = useRef(null); const nameRef = useRef(null); const userId = initMatrix.matrixClient.getUserId(); const hsString = userId.slice(userId.indexOf(':')); function resetForm() { togglePublic(false); toggleEncrypted(true); updateIsValidAddress(null); updateIsCreatingRoom(false); updateCreatingError(null); updateTitleValue(undefined); updateTopicValue(undefined); updateAddressValue(undefined); setRoleIndex(0); } async function createRoom() { if (isCreatingRoom) return; updateIsCreatingRoom(true); updateCreatingError(null); const name = nameRef.current.value; let topic = topicRef.current.value; if (topic.trim() === '') topic = undefined; let roomAlias; if (isPublic) { roomAlias = addressRef?.current?.value; if (roomAlias.trim() === '') roomAlias = undefined; } const powerLevel = roleIndex === 1 ? 101 : undefined; try { const result = await roomActions.create({ name, topic, isPublic, roomAlias, isEncrypted, powerLevel, }); resetForm(); selectRoom(result.room_id); onRequestClose(); } catch (e) { if (e.message === 'M_UNKNOWN: Invalid characters in room alias') { updateCreatingError('ERROR: Invalid characters in room address'); updateIsValidAddress(false); } else if (e.message === 'M_ROOM_IN_USE: Room alias already taken') { updateCreatingError('ERROR: Room address is already in use'); updateIsValidAddress(false); } else updateCreatingError(e.message); } updateIsCreatingRoom(false); } function validateAddress(e) { const myAddress = e.target.value; updateIsValidAddress(null); updateAddressValue(e.target.value); updateCreatingError(null); setTimeout(async () => { if (myAddress !== addressRef.current.value) return; const roomAlias = addressRef.current.value; if (roomAlias === '') return; const roomAddress = `#${roomAlias}${hsString}`; if (await isRoomAliasAvailable(roomAddress)) { updateIsValidAddress(true); } else { updateIsValidAddress(false); } }, 1000); } function handleTitleChange(e) { if (e.target.value.trim() === '') updateTitleValue(undefined); updateTitleValue(e.target.value); } function handleTopicChange(e) { if (e.target.value.trim() === '') updateTopicValue(undefined); updateTopicValue(e.target.value); } return ( } onRequestClose={onRequestClose} >
{ e.preventDefault(); createRoom(); }}> } content={Public room can be joined by anyone.} /> {isPublic && (
Room address
# {hsString}
{isValidAddress === false && {`#${addressValue}${hsString} is already in use`}}
)} {!isPublic && ( } content={You can’t disable this later. Bridges & most bots won’t work yet.} /> )} )} content={( Override the default (100) power level. )} />
{isCreatingRoom && (
Creating room...
)} {typeof creatingError === 'string' && {creatingError}}
); } CreateRoom.propTypes = { isOpen: PropTypes.bool.isRequired, onRequestClose: PropTypes.func.isRequired, }; export default CreateRoom;