import { useSpoilerClickHandler } from '../../hooks/useSpoilerClickHandler';
import { useRoomNavigate } from '../../hooks/useRoomNavigate';
import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
+import { useIgnoredUsers } from '../../hooks/useIgnoredUsers';
const TimelineFloat = as<'div', css.TimelineFloatVariants>(
({ position, className, ...props }, ref) => (
const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview');
const showUrlPreview = room.hasEncryptionStateEvent() ? encUrlPreview : urlPreview;
const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents');
+
+ const ignoredUsersList = useIgnoredUsers();
+ const ignoredUsersSet = useMemo(() => new Set(ignoredUsersList), [ignoredUsersList]);
+
const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId));
const powerLevels = usePowerLevelsContext();
const { canDoAction, canSendEvent, canSendStateEvent, getPowerLevel } =
if (!mEvent || !mEventId) return null;
+ const eventSender = mEvent.getSender();
+ if (eventSender && ignoredUsersSet.has(eventSender)) {
+ return null;
+ }
+
if (!newDivider && readUptoEventIdRef.current) {
newDivider = prevEvent?.getId() === readUptoEventIdRef.current;
}
const collapsed =
isPrevRendered &&
!dayDivider &&
- (!newDivider || mEvent.getSender() === mx.getUserId()) &&
+ (!newDivider || eventSender === mx.getUserId()) &&
prevEvent !== undefined &&
- prevEvent.getSender() === mEvent.getSender() &&
+ prevEvent.getSender() === eventSender &&
prevEvent.getType() === mEvent.getType() &&
minuteDifference(prevEvent.getTs(), mEvent.getTs()) < 2;
isPrevRendered = !!eventJSX;
const newDividerJSX =
- newDivider && eventJSX && mEvent.getSender() !== mx.getUserId() ? (
+ newDivider && eventJSX && eventSender !== mx.getUserId() ? (
<MessageBase space={messageSpacing}>
<TimelineDivider style={{ color: color.Success.Main }} variant="Inherit">
<Badge as="span" size="500" variant="Success" fill="Solid" radii="300">
-import React, { ChangeEventHandler, FormEventHandler, useCallback, useMemo, useState } from 'react';
+import React, { ChangeEventHandler, FormEventHandler, useCallback, useState } from 'react';
import { Box, Button, Chip, Icon, IconButton, Icons, Input, Spinner, Text, config } from 'folds';
-import { useAccountData } from '../../../hooks/useAccountData';
-import { AccountDataEvent } from '../../../../types/matrix/accountData';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../styles.css';
import { SettingTile } from '../../../components/setting-tile';
import { useMatrixClient } from '../../../hooks/useMatrixClient';
import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';
import { isUserId } from '../../../utils/matrix';
-
-type IgnoredUserListContent = {
- ignored_users?: Record<string, object>;
-};
+import { useIgnoredUsers } from '../../../hooks/useIgnoredUsers';
function IgnoreUserInput({ userList }: { userList: string[] }) {
const mx = useMatrixClient();
}
export function IgnoredUserList() {
- const ignoredUserListEvt = useAccountData(AccountDataEvent.IgnoredUserList);
- const ignoredUsers = useMemo(() => {
- const ignoredUsersRecord =
- ignoredUserListEvt?.getContent<IgnoredUserListContent>().ignored_users ?? {};
- return Object.keys(ignoredUsersRecord);
- }, [ignoredUserListEvt]);
+ const ignoredUsers = useIgnoredUsers();
return (
<Box direction="Column" gap="100">
--- /dev/null
+import { useMemo } from 'react';
+import { useAccountData } from './useAccountData';
+import { AccountDataEvent } from '../../types/matrix/accountData';
+
+export type IgnoredUserListContent = {
+ ignored_users?: Record<string, object>;
+};
+
+export const useIgnoredUsers = (): string[] => {
+ const ignoredUserListEvt = useAccountData(AccountDataEvent.IgnoredUserList);
+ const ignoredUsers = useMemo(() => {
+ const ignoredUsersRecord =
+ ignoredUserListEvt?.getContent<IgnoredUserListContent>().ignored_users ?? {};
+ return Object.keys(ignoredUsersRecord);
+ }, [ignoredUserListEvt]);
+
+ return ignoredUsers;
+};