Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 57 additions & 23 deletions apps/meteor/client/components/RoomIcon/RoomIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,68 @@ import { isValidElement } from 'react';
import { OmnichannelRoomIcon } from './OmnichannelRoomIcon';
import { useRoomIcon } from '../../hooks/useRoomIcon';

// export const RoomIcon = ({
// room,
// size = 'x16',
// isIncomingCall,
// placement = 'default',
// }: {
// room: Pick<IRoom, 't' | 'prid' | 'teamMain' | 'uids' | 'u' | 'avatarETag'>;
// size?: ComponentProps<typeof Icon>['size'];
// isIncomingCall?: boolean;
// placement?: 'sidebar' | 'default';
// }): ReactElement | null => {
// const iconPropsOrReactNode = useRoomIcon(room);

// if (isIncomingCall) {
// return <Icon name='phone' size={size} />;
// }

// if (isOmnichannelRoom(room)) {
// return <OmnichannelRoomIcon placement={placement} source={room.source} status={room.v?.status} size={size} />;
// }

// if (isValidElement<any>(iconPropsOrReactNode)) {
// return iconPropsOrReactNode;
// }

// if (!iconPropsOrReactNode) {
// return null;
// }

// return <Icon {...iconPropsOrReactNode} size={size} />;
// };

export const RoomIcon = ({
room,
size = 'x16',
isIncomingCall,
placement = 'default',
room,
size = 'x16',
isIncomingCall,
placement = 'default',
}: {
room: Pick<IRoom, 't' | 'prid' | 'teamMain' | 'uids' | 'u'>;
size?: ComponentProps<typeof Icon>['size'];
isIncomingCall?: boolean;
placement?: 'sidebar' | 'default';
// Add avatarETag here so the component tracks it
room: Pick<IRoom, 't' | 'prid' | 'teamMain' | 'uids' | 'u' | 'avatarETag'>;
size?: ComponentProps<typeof Icon>['size'];
isIncomingCall?: boolean;
placement?: 'sidebar' | 'default';
}): ReactElement | null => {
const iconPropsOrReactNode = useRoomIcon(room);
// Passing the room with the avatarETag into the hook
const iconPropsOrReactNode = useRoomIcon(room);

if (isIncomingCall) {
return <Icon name='phone' size={size} />;
}
if (isIncomingCall) {
return <Icon name='phone' size={size} />;
}

if (isOmnichannelRoom(room)) {
return <OmnichannelRoomIcon placement={placement} source={room.source} status={room.v?.status} size={size} />;
}
if (isOmnichannelRoom(room)) {
return <OmnichannelRoomIcon placement={placement} source={room.source} status={room.v?.status} size={size} />;
}

if (isValidElement<any>(iconPropsOrReactNode)) {
return iconPropsOrReactNode;
}
if (isValidElement<any>(iconPropsOrReactNode)) {
return iconPropsOrReactNode;
}

if (!iconPropsOrReactNode) {
return null;
}
if (!iconPropsOrReactNode) {
return null;
}

return <Icon {...iconPropsOrReactNode} size={size} />;
};
return <Icon {...iconPropsOrReactNode} size={size} />;
};
125 changes: 89 additions & 36 deletions apps/meteor/client/sidebar/RoomList/SidebarItemWithData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,41 +119,94 @@ function safeDateNotEqualCheck(a: Date | string | undefined, b: Date | string |
const keys: (keyof RoomListRowProps)[] = ['id', 'style', 't', 'videoConfActions'];

// eslint-disable-next-line react/no-multi-comp
export default memo(SidebarItemWithData, (prevProps, nextProps) => {
if (keys.some((key) => prevProps[key] !== nextProps[key])) {
return false;
}

if (prevProps.room === nextProps.room) {
return true;
}

if (prevProps.room._id !== nextProps.room._id) {
return false;
}
if (prevProps.room._updatedAt?.toISOString() !== nextProps.room._updatedAt?.toISOString()) {
return false;
}
if (safeDateNotEqualCheck(prevProps.room.lastMessage?._updatedAt, nextProps.room.lastMessage?._updatedAt)) {
return false;
}
if (prevProps.room.alert !== nextProps.room.alert) {
return false;
}
if (isOmnichannelRoom(prevProps.room) && isOmnichannelRoom(nextProps.room) && prevProps.room?.v?.status !== nextProps.room?.v?.status) {
return false;
}
if (prevProps.room.teamMain !== nextProps.room.teamMain) {
return false;
}
// export default memo(SidebarItemWithData, (prevProps, nextProps) => {
// if (keys.some((key) => prevProps[key] !== nextProps[key])) {
// return false;
// }

// if (prevProps.room === nextProps.room) {
// return true;
// }

// if (prevProps.room._id !== nextProps.room._id) {
// return false;
// }
// if (prevProps.room._updatedAt?.toISOString() !== nextProps.room._updatedAt?.toISOString()) {
// return false;
// }
// if (safeDateNotEqualCheck(prevProps.room.lastMessage?._updatedAt, nextProps.room.lastMessage?._updatedAt)) {
// return false;
// }
// if (prevProps.room.alert !== nextProps.room.alert) {
// return false;
// }
// if (isOmnichannelRoom(prevProps.room) && isOmnichannelRoom(nextProps.room) && prevProps.room?.v?.status !== nextProps.room?.v?.status) {
// return false;
// }
// if (prevProps.room.teamMain !== nextProps.room.teamMain) {
// return false;
// }

// if (
// isOmnichannelRoom(prevProps.room) &&
// isOmnichannelRoom(nextProps.room) &&
// prevProps.room.priorityWeight !== nextProps.room.priorityWeight
// ) {
// return false;
// }

// return true;
// });

if (
isOmnichannelRoom(prevProps.room) &&
isOmnichannelRoom(nextProps.room) &&
prevProps.room.priorityWeight !== nextProps.room.priorityWeight
) {
return false;
}

return true;
});
// eslint-disable-next-line react/no-multi-comp
export default memo(SidebarItemWithData, (prevProps, nextProps) => {
if (keys.some((key) => prevProps[key] !== nextProps[key])) {
return false;
}

if (prevProps.room === nextProps.room) {
return true;
}

if (prevProps.room._id !== nextProps.room._id) {
return false;
}


// This ensures the sidebar re-renders when the avatar is updated
if (prevProps.room.avatarETag !== nextProps.room.avatarETag) {
return false;
}


if (prevProps.room.avatarETag !== nextProps.room.avatarETag) {
return false; // Tells React to re-render the sidebar item
}

if (prevProps.room._updatedAt?.toISOString() !== nextProps.room._updatedAt?.toISOString()) {
return false;
}
if (safeDateNotEqualCheck(prevProps.room.lastMessage?._updatedAt, nextProps.room.lastMessage?._updatedAt)) {
return false;
}
if (prevProps.room.alert !== nextProps.room.alert) {
return false;
}
if (isOmnichannelRoom(prevProps.room) && isOmnichannelRoom(nextProps.room) && prevProps.room?.v?.status !== nextProps.room?.v?.status) {
return false;
}
if (prevProps.room.teamMain !== nextProps.room.teamMain) {
return false;
}

if (
isOmnichannelRoom(prevProps.room) &&
isOmnichannelRoom(nextProps.room) &&
prevProps.room.priorityWeight !== nextProps.room.priorityWeight
) {
return false;
}

return true;
});
Loading