forked from github/cinny
refactor: unify join rule icon mapping and update call/space icons
- bump folds from 2.5.0 to 2.6.0 - replace separate room/space join-rule icon hooks with useJoinRuleIcons(roomType) - route join-rule icons through getRoomIconSrc for consistent room type handling - simplify getRoomIconSrc by removing the locked override path - use VolumeHighGlobe for public call rooms and VolumeHighLock for private call rooms
This commit is contained in:
@@ -16,34 +16,24 @@ import {
|
||||
import { JoinRule } from 'matrix-js-sdk';
|
||||
import FocusTrap from 'focus-trap-react';
|
||||
import { stopPropagation } from '../utils/keyboard';
|
||||
import { getRoomIconSrc } from '../utils/room';
|
||||
|
||||
export type ExtraJoinRules = 'knock_restricted';
|
||||
export type ExtendedJoinRules = JoinRule | ExtraJoinRules;
|
||||
|
||||
type JoinRuleIcons = Record<ExtendedJoinRules, IconSrc>;
|
||||
export const useRoomJoinRuleIcon = (): JoinRuleIcons =>
|
||||
|
||||
export const useJoinRuleIcons = (roomType?: string): JoinRuleIcons =>
|
||||
useMemo(
|
||||
() => ({
|
||||
[JoinRule.Invite]: Icons.HashLock,
|
||||
[JoinRule.Knock]: Icons.HashLock,
|
||||
knock_restricted: Icons.Hash,
|
||||
[JoinRule.Restricted]: Icons.Hash,
|
||||
[JoinRule.Public]: Icons.HashGlobe,
|
||||
[JoinRule.Private]: Icons.HashLock,
|
||||
[JoinRule.Invite]: getRoomIconSrc(Icons, roomType, JoinRule.Invite),
|
||||
[JoinRule.Knock]: getRoomIconSrc(Icons, roomType, JoinRule.Knock),
|
||||
knock_restricted: getRoomIconSrc(Icons, roomType, JoinRule.Restricted),
|
||||
[JoinRule.Restricted]: getRoomIconSrc(Icons, roomType, JoinRule.Restricted),
|
||||
[JoinRule.Public]: getRoomIconSrc(Icons, roomType, JoinRule.Public),
|
||||
[JoinRule.Private]: getRoomIconSrc(Icons, roomType, JoinRule.Private),
|
||||
}),
|
||||
[]
|
||||
);
|
||||
export const useSpaceJoinRuleIcon = (): JoinRuleIcons =>
|
||||
useMemo(
|
||||
() => ({
|
||||
[JoinRule.Invite]: Icons.SpaceLock,
|
||||
[JoinRule.Knock]: Icons.SpaceLock,
|
||||
knock_restricted: Icons.Space,
|
||||
[JoinRule.Restricted]: Icons.Space,
|
||||
[JoinRule.Public]: Icons.SpaceGlobe,
|
||||
[JoinRule.Private]: Icons.SpaceLock,
|
||||
}),
|
||||
[]
|
||||
[roomType]
|
||||
);
|
||||
|
||||
type JoinRuleLabels = Record<ExtendedJoinRules, string>;
|
||||
|
||||
@@ -46,8 +46,7 @@ export const RoomIcon = forwardRef<
|
||||
Omit<ComponentProps<typeof Icon>, 'src'> & {
|
||||
joinRule?: JoinRule;
|
||||
roomType?: string;
|
||||
locked?: boolean;
|
||||
}
|
||||
>(({ joinRule, roomType, locked, ...props }, ref) => (
|
||||
<Icon src={getRoomIconSrc(Icons, roomType, joinRule, locked)} {...props} ref={ref} />
|
||||
>(({ joinRule, roomType, ...props }, ref) => (
|
||||
<Icon src={getRoomIconSrc(Icons, roomType, joinRule)} {...props} ref={ref} />
|
||||
));
|
||||
|
||||
@@ -6,9 +6,8 @@ import { useAtomValue } from 'jotai';
|
||||
import {
|
||||
ExtendedJoinRules,
|
||||
JoinRulesSwitcher,
|
||||
useRoomJoinRuleIcon,
|
||||
useJoinRuleIcons,
|
||||
useRoomJoinRuleLabel,
|
||||
useSpaceJoinRuleIcon,
|
||||
} from '../../../components/JoinRulesSwitcher';
|
||||
import { SequenceCard } from '../../../components/sequence-card';
|
||||
import { SequenceCardStyle } from '../../room-settings/styles.css';
|
||||
@@ -75,8 +74,7 @@ export function RoomJoinRules({ permissions }: RoomJoinRulesProps) {
|
||||
return r;
|
||||
}, [allowKnockRestricted, allowRestricted, allowKnock, space]);
|
||||
|
||||
const icons = useRoomJoinRuleIcon();
|
||||
const spaceIcons = useSpaceJoinRuleIcon();
|
||||
const icons = useJoinRuleIcons(room.getType());
|
||||
const labels = useRoomJoinRuleLabel();
|
||||
|
||||
const [submitState, submit] = useAsyncCallback(
|
||||
@@ -137,7 +135,7 @@ export function RoomJoinRules({ permissions }: RoomJoinRulesProps) {
|
||||
}
|
||||
after={
|
||||
<JoinRulesSwitcher
|
||||
icons={room.isSpaceRoom() ? spaceIcons : icons}
|
||||
icons={icons}
|
||||
labels={labels}
|
||||
rules={joinRules}
|
||||
value={rule}
|
||||
|
||||
@@ -161,7 +161,8 @@ export const getOrphanParents = (roomToParents: RoomToParents, roomId: string):
|
||||
|
||||
export const isMutedRule = (rule: IPushRule) =>
|
||||
// Check for empty actions (new spec) or dont_notify (deprecated)
|
||||
(rule.actions.length === 0 || rule.actions[0] === 'dont_notify') && rule.conditions?.[0]?.kind === 'event_match';
|
||||
(rule.actions.length === 0 || rule.actions[0] === 'dont_notify') &&
|
||||
rule.conditions?.[0]?.kind === 'event_match';
|
||||
|
||||
export const findMutedRule = (overrideRules: IPushRule[], roomId: string) =>
|
||||
overrideRules.find((rule) => rule.rule_id === roomId && isMutedRule(rule));
|
||||
@@ -260,57 +261,41 @@ export const getUnreadInfos = (mx: MatrixClient): UnreadInfo[] => {
|
||||
export const getRoomIconSrc = (
|
||||
icons: Record<IconName, IconSrc>,
|
||||
roomType?: string,
|
||||
joinRule?: JoinRule,
|
||||
locked?: boolean
|
||||
joinRule?: JoinRule
|
||||
): IconSrc => {
|
||||
type RoomIcons = {
|
||||
base: IconSrc;
|
||||
locked: IconSrc;
|
||||
public: IconSrc;
|
||||
};
|
||||
|
||||
const roomTypeIcons: Record<string, RoomIcons> = {
|
||||
[RoomType.Call]: {
|
||||
base: icons.VolumeHigh,
|
||||
locked: icons.Lock,
|
||||
public: icons.VolumeHigh,
|
||||
},
|
||||
[RoomType.Space]: {
|
||||
base: icons.Space,
|
||||
locked: icons.SpaceLock,
|
||||
public: icons.SpaceGlobe,
|
||||
},
|
||||
default: {
|
||||
base: icons.Hash,
|
||||
locked: icons.HashLock,
|
||||
public: icons.HashGlobe,
|
||||
},
|
||||
};
|
||||
|
||||
const roomIcons = roomTypeIcons[roomType ?? 'default'] ?? roomTypeIcons.default;
|
||||
|
||||
let roomIcon = roomIcons.base;
|
||||
|
||||
if (locked) {
|
||||
roomIcon = roomIcons.locked;
|
||||
} else {
|
||||
switch (joinRule) {
|
||||
case JoinRule.Invite:
|
||||
case JoinRule.Knock:
|
||||
roomIcon = roomIcons.locked;
|
||||
break;
|
||||
case JoinRule.Restricted:
|
||||
roomIcon = roomIcons.base;
|
||||
break;
|
||||
case JoinRule.Public:
|
||||
roomIcon = roomIcons.public;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (roomType === RoomType.Space) {
|
||||
if (joinRule === JoinRule.Public) return icons.SpaceGlobe;
|
||||
if (
|
||||
joinRule === JoinRule.Invite ||
|
||||
joinRule === JoinRule.Knock ||
|
||||
joinRule === JoinRule.Private
|
||||
) {
|
||||
return icons.SpaceLock;
|
||||
}
|
||||
return icons.Space;
|
||||
}
|
||||
|
||||
return roomIcon;
|
||||
if (roomType === RoomType.Call) {
|
||||
if (joinRule === JoinRule.Public) return icons.VolumeHighGlobe;
|
||||
if (
|
||||
joinRule === JoinRule.Invite ||
|
||||
joinRule === JoinRule.Knock ||
|
||||
joinRule === JoinRule.Private
|
||||
) {
|
||||
return icons.VolumeHighLock;
|
||||
}
|
||||
return icons.VolumeHigh;
|
||||
}
|
||||
|
||||
if (joinRule === JoinRule.Public) return icons.HashGlobe;
|
||||
if (
|
||||
joinRule === JoinRule.Invite ||
|
||||
joinRule === JoinRule.Knock ||
|
||||
joinRule === JoinRule.Private
|
||||
) {
|
||||
return icons.HashLock;
|
||||
}
|
||||
return icons.Hash;
|
||||
};
|
||||
|
||||
export const getRoomAvatarUrl = (
|
||||
|
||||
Reference in New Issue
Block a user