diff --git a/src/app/components/create-room/CreateRoomKindSelector.tsx b/src/app/components/create-room/CreateRoomAccessSelector.tsx similarity index 54% rename from src/app/components/create-room/CreateRoomKindSelector.tsx rename to src/app/components/create-room/CreateRoomAccessSelector.tsx index ebc55e7f..35f39af8 100644 --- a/src/app/components/create-room/CreateRoomKindSelector.tsx +++ b/src/app/components/create-room/CreateRoomAccessSelector.tsx @@ -2,39 +2,39 @@ import React from 'react'; import { Box, Text, Icon, Icons, config, IconSrc } from 'folds'; import { SequenceCard } from '../sequence-card'; import { SettingTile } from '../setting-tile'; -import { CreateRoomKind } from './types'; +import { CreateRoomAccess } from './types'; -type CreateRoomKindSelectorProps = { - value?: CreateRoomKind; - onSelect: (value: CreateRoomKind) => void; +type CreateRoomAccessSelectorProps = { + value?: CreateRoomAccess; + onSelect: (value: CreateRoomAccess) => void; canRestrict?: boolean; disabled?: boolean; - getIcon: (kind: CreateRoomKind) => IconSrc; + getIcon: (access: CreateRoomAccess) => IconSrc; }; -export function CreateRoomKindSelector({ +export function CreateRoomAccessSelector({ value, onSelect, canRestrict, disabled, getIcon, -}: CreateRoomKindSelectorProps) { +}: CreateRoomAccessSelectorProps) { return ( {canRestrict && ( onSelect(CreateRoomKind.Restricted)} + aria-pressed={value === CreateRoomAccess.Restricted} + onClick={() => onSelect(CreateRoomAccess.Restricted)} disabled={disabled} > } - after={value === CreateRoomKind.Restricted && } + before={} + after={value === CreateRoomAccess.Restricted && } > Restricted @@ -45,18 +45,18 @@ export function CreateRoomKindSelector({ )} onSelect(CreateRoomKind.Private)} + aria-pressed={value === CreateRoomAccess.Private} + onClick={() => onSelect(CreateRoomAccess.Private)} disabled={disabled} > } - after={value === CreateRoomKind.Private && } + before={} + after={value === CreateRoomAccess.Private && } > Private @@ -66,18 +66,18 @@ export function CreateRoomKindSelector({ onSelect(CreateRoomKind.Public)} + aria-pressed={value === CreateRoomAccess.Public} + onClick={() => onSelect(CreateRoomAccess.Public)} disabled={disabled} > } - after={value === CreateRoomKind.Public && } + before={} + after={value === CreateRoomAccess.Public && } > Public diff --git a/src/app/components/create-room/CreateRoomVoiceSelector.tsx b/src/app/components/create-room/CreateRoomTypeSelector.tsx similarity index 55% rename from src/app/components/create-room/CreateRoomVoiceSelector.tsx rename to src/app/components/create-room/CreateRoomTypeSelector.tsx index f3862db2..06227cb5 100644 --- a/src/app/components/create-room/CreateRoomVoiceSelector.tsx +++ b/src/app/components/create-room/CreateRoomTypeSelector.tsx @@ -2,36 +2,36 @@ import React from 'react'; import { Box, Text, Icon, Icons, config, IconSrc } from 'folds'; import { SequenceCard } from '../sequence-card'; import { SettingTile } from '../setting-tile'; -import { CreateRoomVoice } from './types'; +import { CreateRoomType } from './types'; -type CreateRoomVoiceSelectorProps = { - value?: CreateRoomVoice; - onSelect: (value: CreateRoomVoice) => void; +type CreateRoomTypeSelectorProps = { + value?: CreateRoomType; + onSelect: (value: CreateRoomType) => void; disabled?: boolean; - getIcon: (kind: CreateRoomVoice) => IconSrc; + getIcon: (type: CreateRoomType) => IconSrc; }; -export function CreateRoomVoiceSelector({ +export function CreateRoomTypeSelector({ value, onSelect, disabled, getIcon, -}: CreateRoomVoiceSelectorProps) { +}: CreateRoomTypeSelectorProps) { return ( onSelect(CreateRoomVoice.TextRoom)} + aria-pressed={value === CreateRoomType.TextRoom} + onClick={() => onSelect(CreateRoomType.TextRoom)} disabled={disabled} > } - after={value === CreateRoomVoice.TextRoom && } + before={} + after={value === CreateRoomType.TextRoom && } > Text @@ -41,18 +41,18 @@ export function CreateRoomVoiceSelector({ onSelect(CreateRoomVoice.VoiceRoom)} + aria-pressed={value === CreateRoomType.VoiceRoom} + onClick={() => onSelect(CreateRoomType.VoiceRoom)} disabled={disabled} > } - after={value === CreateRoomVoice.VoiceRoom && } + before={} + after={value === CreateRoomType.VoiceRoom && } > Voice diff --git a/src/app/components/create-room/index.ts b/src/app/components/create-room/index.ts index a9c603b2..cce6e037 100644 --- a/src/app/components/create-room/index.ts +++ b/src/app/components/create-room/index.ts @@ -1,4 +1,4 @@ -export * from './CreateRoomKindSelector'; +export * from './CreateRoomAccessSelector'; export * from './CreateRoomAliasInput'; export * from './RoomVersionSelector'; export * from './utils'; diff --git a/src/app/components/create-room/types.ts b/src/app/components/create-room/types.ts index e35af47a..8b54587d 100644 --- a/src/app/components/create-room/types.ts +++ b/src/app/components/create-room/types.ts @@ -1,9 +1,9 @@ -export enum CreateRoomVoice { +export enum CreateRoomType { TextRoom = 'text', VoiceRoom = 'voice', } -export enum CreateRoomKind { +export enum CreateRoomAccess { Private = 'private', Restricted = 'restricted', Public = 'public', diff --git a/src/app/components/create-room/utils.ts b/src/app/components/create-room/utils.ts index 3d702f2a..b8cca03a 100644 --- a/src/app/components/create-room/utils.ts +++ b/src/app/components/create-room/utils.ts @@ -10,8 +10,7 @@ import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types'; import { RoomType, StateEvent } from '../../../types/matrix/room'; import { getViaServers } from '../../plugins/via-servers'; import { getMxIdServer } from '../../utils/matrix'; -import { IPowerLevels } from '../../hooks/usePowerLevels'; -import { CreateRoomKind } from './types'; +import { CreateRoomAccess } from './types'; export const createRoomCreationContent = ( type: RoomType | undefined, @@ -33,7 +32,7 @@ export const createRoomCreationContent = ( }; export const createRoomJoinRulesState = ( - kind: CreateRoomKind, + access: CreateRoomAccess, parent: Room | undefined, knock: boolean ) => { @@ -41,13 +40,13 @@ export const createRoomJoinRulesState = ( join_rule: knock ? JoinRule.Knock : JoinRule.Invite, }; - if (kind === CreateRoomKind.Public) { + if (access === CreateRoomAccess.Public) { content = { join_rule: JoinRule.Public, }; } - if (kind === CreateRoomKind.Restricted && parent) { + if (access === CreateRoomAccess.Restricted && parent) { content = { join_rule: knock ? ('knock_restricted' as JoinRule) : JoinRule.Restricted, allow: [ @@ -89,43 +88,17 @@ export const createRoomCallState = () => ({ content: {}, }); -export const createPowerLevelContentOverrides = ( - base: IPowerLevels, - overrides: Partial -): IPowerLevels => ({ - ...base, - ...overrides, - ...(base.events || overrides.events - ? { - events: { - ...base.events, - ...overrides.events, - }, - } - : {}), - ...(base.users || overrides.users - ? { - users: { - ...base.users, - ...overrides.users, - }, - } - : {}), - ...(base.notifications || overrides.notifications - ? { - notifications: { - ...base.notifications, - ...overrides.notifications, - }, - } - : {}), +export const createVoiceRoomPowerLevelsOverride = () => ({ + events: { + [StateEvent.GroupCallMemberPrefix]: 0, + }, }); export type CreateRoomData = { version: string; type?: RoomType; parent?: Room; - kind: CreateRoomKind; + access: CreateRoomAccess; name: string; topic?: string; aliasLocalPart?: string; @@ -133,7 +106,6 @@ export type CreateRoomData = { knock: boolean; allowFederation: boolean; additionalCreators?: string[]; - powerLevelContentOverrides?: IPowerLevels; }; export const createRoom = async (mx: MatrixClient, data: CreateRoomData): Promise => { const initialState: ICreateRoomStateEvent[] = []; @@ -150,7 +122,7 @@ export const createRoom = async (mx: MatrixClient, data: CreateRoomData): Promis initialState.push(createRoomCallState()); } - initialState.push(createRoomJoinRulesState(data.kind, data.parent, data.knock)); + initialState.push(createRoomJoinRulesState(data.access, data.parent, data.knock)); const options: ICreateRoomOpts = { room_version: data.version, @@ -162,6 +134,8 @@ export const createRoom = async (mx: MatrixClient, data: CreateRoomData): Promis data.allowFederation, data.additionalCreators ), + power_level_content_override: + data.type === RoomType.Call ? createVoiceRoomPowerLevelsOverride() : undefined, initial_state: initialState, }; @@ -180,15 +154,5 @@ export const createRoom = async (mx: MatrixClient, data: CreateRoomData): Promis ); } - if (data.powerLevelContentOverrides) { - const roomPowers = await mx.getStateEvent(result.room_id, StateEvent.RoomPowerLevels, ''); - const updatedPowers = createPowerLevelContentOverrides( - roomPowers, - data.powerLevelContentOverrides - ); - - await mx.sendStateEvent(result.room_id, StateEvent.RoomPowerLevels as any, updatedPowers, ''); - } - return result.room_id; }; diff --git a/src/app/features/create-room/CreateRoom.tsx b/src/app/features/create-room/CreateRoom.tsx index 9cc8bee8..94799f6e 100644 --- a/src/app/features/create-room/CreateRoom.tsx +++ b/src/app/features/create-room/CreateRoom.tsx @@ -33,41 +33,40 @@ import { createRoom, CreateRoomAliasInput, CreateRoomData, - CreateRoomKind, - CreateRoomKindSelector, + CreateRoomAccess, + CreateRoomAccessSelector, RoomVersionSelector, useAdditionalCreators, - CreateRoomVoice, + CreateRoomType, } from '../../components/create-room'; -import { RoomType, StateEvent } from '../../../types/matrix/room'; -import { IPowerLevels } from '../../hooks/usePowerLevels'; -import { CreateRoomVoiceSelector } from '../../components/create-room/CreateRoomVoiceSelector'; +import { RoomType } from '../../../types/matrix/room'; +import { CreateRoomTypeSelector } from '../../components/create-room/CreateRoomTypeSelector'; import { getRoomIconSrc } from '../../utils/room'; -const getCreateRoomKindToIcon = (kind: CreateRoomKind, voice?: CreateRoomVoice) => { - const isVoiceRoom = voice === CreateRoomVoice.VoiceRoom; +const getCreateRoomAccessToIcon = (access: CreateRoomAccess, type?: CreateRoomType) => { + const isVoiceRoom = type === CreateRoomType.VoiceRoom; let joinRule: JoinRule = JoinRule.Public; - if (kind === CreateRoomKind.Restricted) joinRule = JoinRule.Restricted; - if (kind === CreateRoomKind.Private) joinRule = JoinRule.Knock; + if (access === CreateRoomAccess.Restricted) joinRule = JoinRule.Restricted; + if (access === CreateRoomAccess.Private) joinRule = JoinRule.Knock; return getRoomIconSrc(Icons, isVoiceRoom ? RoomType.Call : undefined, joinRule); }; -const getCreateRoomVoiceToIcon = (kind: CreateRoomVoice) => { - if (kind === CreateRoomVoice.VoiceRoom) return Icons.VolumeHigh; +const getCreateRoomTypeToIcon = (type: CreateRoomType) => { + if (type === CreateRoomType.VoiceRoom) return Icons.VolumeHigh; return Icons.Hash; }; type CreateRoomFormProps = { - defaultKind?: CreateRoomKind; - defaultVoice?: CreateRoomVoice; + defaultAccess?: CreateRoomAccess; + defaultType?: CreateRoomType; space?: Room; onCreate?: (roomId: string) => void; }; export function CreateRoomForm({ - defaultKind, - defaultVoice, + defaultAccess, + defaultType, space, onCreate, }: CreateRoomFormProps) { @@ -84,9 +83,9 @@ export function CreateRoomForm({ const allowRestricted = space && restrictedSupported(selectedRoomVersion); - const [voice, setVoice] = useState(defaultVoice ?? CreateRoomVoice.TextRoom); - const [kind, setKind] = useState( - defaultKind ?? allowRestricted ? CreateRoomKind.Restricted : CreateRoomKind.Private + const [type, setType] = useState(defaultType ?? CreateRoomType.TextRoom); + const [access, setAccess] = useState( + defaultAccess ?? (allowRestricted ? CreateRoomAccess.Restricted : CreateRoomAccess.Private) ); const allowAdditionalCreators = creatorsSupported(selectedRoomVersion); const { additionalCreators, addAdditionalCreator, removeAdditionalCreator } = @@ -96,13 +95,13 @@ export function CreateRoomForm({ const [knock, setKnock] = useState(false); const [advance, setAdvance] = useState(false); - const allowKnock = kind === CreateRoomKind.Private && knockSupported(selectedRoomVersion); + const allowKnock = access === CreateRoomAccess.Private && knockSupported(selectedRoomVersion); const allowKnockRestricted = - kind === CreateRoomKind.Restricted && knockRestrictedSupported(selectedRoomVersion); + access === CreateRoomAccess.Restricted && knockRestrictedSupported(selectedRoomVersion); const handleRoomVersionChange = (version: string) => { if (!restrictedSupported(version)) { - setKind(CreateRoomKind.Private); + setAccess(CreateRoomAccess.Private); } selectRoomVersion(version); }; @@ -128,29 +127,23 @@ export function CreateRoomForm({ aliasInput && aliasInput.value ? replaceSpaceWithDash(aliasInput.value) : undefined; if (!roomName) return; - const publicRoom = kind === CreateRoomKind.Public; + const publicRoom = access === CreateRoomAccess.Public; let roomKnock = false; - if (allowKnock && kind === CreateRoomKind.Private) { + if (allowKnock && access === CreateRoomAccess.Private) { roomKnock = knock; } - if (allowKnockRestricted && kind === CreateRoomKind.Restricted) { + if (allowKnockRestricted && access === CreateRoomAccess.Restricted) { roomKnock = knock; } - let roomType; - const powerOverrides: IPowerLevels = { - events: {}, - }; - if (voice === CreateRoomVoice.VoiceRoom) { - roomType = RoomType.Call; - powerOverrides.events![StateEvent.GroupCallMemberPrefix] = 0; - } + let roomType: RoomType | undefined; + if (type === CreateRoomType.VoiceRoom) roomType = RoomType.Call; create({ version: selectedRoomVersion, type: roomType, parent: space, - kind, + access, name: roomName, topic: roomTopic || undefined, aliasLocalPart: publicRoom ? aliasLocalPart : undefined, @@ -158,7 +151,6 @@ export function CreateRoomForm({ knock: roomKnock, allowFederation: federation, additionalCreators: allowAdditionalCreators ? additionalCreators : undefined, - powerLevelContentOverrides: powerOverrides, }).then((roomId) => { if (alive()) { onCreate?.(roomId); @@ -171,29 +163,29 @@ export function CreateRoomForm({ {!space && ( Type - )} Access - getCreateRoomKindToIcon(roomKind, voice)} + getIcon={(roomAccess) => getCreateRoomAccessToIcon(roomAccess, type)} /> Name } + before={} name="nameInput" autoFocus size="500" @@ -214,7 +206,7 @@ export function CreateRoomForm({ /> - {kind === CreateRoomKind.Public && } + {access === CreateRoomAccess.Public && } @@ -244,7 +236,7 @@ export function CreateRoomForm({ /> )} - {kind !== CreateRoomKind.Public && ( + {access !== CreateRoomAccess.Public && ( <> - New {voice === CreateRoomVoice.VoiceRoom && 'Voice '}Room + New {type === CreateRoomType.VoiceRoom && 'Voice '}Room @@ -75,7 +75,7 @@ function CreateRoomModal({ state }: CreateRoomModalProps) { direction="Column" gap="500" > - + diff --git a/src/app/features/create-space/CreateSpace.tsx b/src/app/features/create-space/CreateSpace.tsx index 530145af..b0c12f56 100644 --- a/src/app/features/create-space/CreateSpace.tsx +++ b/src/app/features/create-space/CreateSpace.tsx @@ -33,25 +33,25 @@ import { createRoom, CreateRoomAliasInput, CreateRoomData, - CreateRoomKind, - CreateRoomKindSelector, + CreateRoomAccess, + CreateRoomAccessSelector, RoomVersionSelector, useAdditionalCreators, } from '../../components/create-room'; import { RoomType } from '../../../types/matrix/room'; -const getCreateSpaceKindToIcon = (kind: CreateRoomKind) => { - if (kind === CreateRoomKind.Private) return Icons.SpaceLock; - if (kind === CreateRoomKind.Restricted) return Icons.Space; +const getCreateSpaceAccessToIcon = (access: CreateRoomAccess) => { + if (access === CreateRoomAccess.Private) return Icons.SpaceLock; + if (access === CreateRoomAccess.Restricted) return Icons.Space; return Icons.SpaceGlobe; }; type CreateSpaceFormProps = { - defaultKind?: CreateRoomKind; + defaultAccess?: CreateRoomAccess; space?: Room; onCreate?: (roomId: string) => void; }; -export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFormProps) { +export function CreateSpaceForm({ defaultAccess, space, onCreate }: CreateSpaceFormProps) { const mx = useMatrixClient(); const alive = useAlive(); @@ -65,8 +65,8 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor const allowRestricted = space && restrictedSupported(selectedRoomVersion); - const [kind, setKind] = useState( - defaultKind ?? allowRestricted ? CreateRoomKind.Restricted : CreateRoomKind.Private + const [access, setAccess] = useState( + defaultAccess ?? (allowRestricted ? CreateRoomAccess.Restricted : CreateRoomAccess.Private) ); const allowAdditionalCreators = creatorsSupported(selectedRoomVersion); @@ -76,13 +76,13 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor const [knock, setKnock] = useState(false); const [advance, setAdvance] = useState(false); - const allowKnock = kind === CreateRoomKind.Private && knockSupported(selectedRoomVersion); + const allowKnock = access === CreateRoomAccess.Private && knockSupported(selectedRoomVersion); const allowKnockRestricted = - kind === CreateRoomKind.Restricted && knockRestrictedSupported(selectedRoomVersion); + access === CreateRoomAccess.Restricted && knockRestrictedSupported(selectedRoomVersion); const handleRoomVersionChange = (version: string) => { if (!restrictedSupported(version)) { - setKind(CreateRoomKind.Private); + setAccess(CreateRoomAccess.Private); } selectRoomVersion(version); }; @@ -108,12 +108,12 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor aliasInput && aliasInput.value ? replaceSpaceWithDash(aliasInput.value) : undefined; if (!roomName) return; - const publicRoom = kind === CreateRoomKind.Public; + const publicRoom = access === CreateRoomAccess.Public; let roomKnock = false; - if (allowKnock && kind === CreateRoomKind.Private) { + if (allowKnock && access === CreateRoomAccess.Private) { roomKnock = knock; } - if (allowKnockRestricted && kind === CreateRoomKind.Restricted) { + if (allowKnockRestricted && access === CreateRoomAccess.Restricted) { roomKnock = knock; } @@ -121,7 +121,7 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor version: selectedRoomVersion, type: RoomType.Space, parent: space, - kind, + access, name: roomName, topic: roomTopic || undefined, aliasLocalPart: publicRoom ? aliasLocalPart : undefined, @@ -139,19 +139,19 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor Access - Name } + before={} name="nameInput" autoFocus size="500" @@ -172,7 +172,7 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor /> - {kind === CreateRoomKind.Public && } + {access === CreateRoomAccess.Public && } @@ -202,7 +202,7 @@ export function CreateSpaceForm({ defaultKind, space, onCreate }: CreateSpaceFor /> )} - {kind !== CreateRoomKind.Public && advance && (allowKnock || allowKnockRestricted) && ( + {access !== CreateRoomAccess.Public && advance && (allowKnock || allowKnockRestricted) && ( { - openCreateRoomModal(item.roomId, voice); + const handleCreateRoom = (type?: CreateRoomType) => { + openCreateRoomModal(item.roomId, type); setCords(undefined); }; @@ -282,7 +282,7 @@ function AddRoomButton({ item }: { item: HierarchyItem }) { radii="300" variant="Primary" fill="None" - onClick={() => handleCreateRoom(CreateRoomVoice.TextRoom)} + onClick={() => handleCreateRoom(CreateRoomType.TextRoom)} > New Room @@ -291,7 +291,7 @@ function AddRoomButton({ item }: { item: HierarchyItem }) { radii="300" variant="Primary" fill="None" - onClick={() => handleCreateRoom(CreateRoomVoice.VoiceRoom)} + onClick={() => handleCreateRoom(CreateRoomType.VoiceRoom)} > New Voice Room diff --git a/src/app/state/createRoomModal.ts b/src/app/state/createRoomModal.ts index 3d1a6803..f32e7665 100644 --- a/src/app/state/createRoomModal.ts +++ b/src/app/state/createRoomModal.ts @@ -1,9 +1,9 @@ import { atom } from 'jotai'; -import { CreateRoomVoice } from '../components/create-room/types'; +import { CreateRoomType } from '../components/create-room/types'; export type CreateRoomModalState = { spaceId?: string; - voice?: CreateRoomVoice; + type?: CreateRoomType; }; export const createRoomModalAtom = atom(undefined); diff --git a/src/app/state/hooks/createRoomModal.ts b/src/app/state/hooks/createRoomModal.ts index dfb15017..2663e5dc 100644 --- a/src/app/state/hooks/createRoomModal.ts +++ b/src/app/state/hooks/createRoomModal.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; import { createRoomModalAtom, CreateRoomModalState } from '../createRoomModal'; -import { CreateRoomVoice } from '../../components/create-room/types'; +import { CreateRoomType } from '../../components/create-room/types'; export const useCreateRoomModalState = (): CreateRoomModalState | undefined => { const data = useAtomValue(createRoomModalAtom); @@ -20,13 +20,13 @@ export const useCloseCreateRoomModal = (): CloseCallback => { return close; }; -type OpenCallback = (space?: string, voice?: CreateRoomVoice) => void; +type OpenCallback = (space?: string, type?: CreateRoomType) => void; export const useOpenCreateRoomModal = (): OpenCallback => { const setSettings = useSetAtom(createRoomModalAtom); const open: OpenCallback = useCallback( - (spaceId, voice) => { - setSettings({ spaceId, voice }); + (spaceId, type) => { + setSettings({ spaceId, type }); }, [setSettings] );