Compare commits

...

2 Commits

Author SHA1 Message Date
jared 15a54eca4b chore: remove debug console.log calls from CallEmbed
CI / Build & Quality Checks (push) Successful in 10m21s
Remove [CallEmbed] state, container styles, and syncCallEmbedPlacement
debug logs that were flooding the console during call sessions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:16:45 -04:00
jared 2e1e61c963 feat: show presence status badges in member list panels
Add online/offline/idle presence dots next to verification shields in
both the room members drawer and the common-settings members list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:13:08 -04:00
4 changed files with 15 additions and 40 deletions
-34
View File
@@ -445,40 +445,6 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) {
// Track previous pipMode to only reset position when entering/exiting pip // Track previous pipMode to only reset position when entering/exiting pip
const prevPipModeRef = React.useRef(false); const prevPipModeRef = React.useRef(false);
// Debug: log whenever call embed visibility/mode changes
React.useEffect(() => {
console.log('[CallEmbed] state:', {
callEmbedRoomId: callEmbed?.roomId,
selectedRoom,
joined,
inCallRoom: !!inCallRoom,
callVisible: !!callVisible,
pipMode: !!pipMode,
chatOnlyView: !!chatOnlyView,
});
const el = callEmbedRef.current;
if (el) {
console.log('[CallEmbed] container styles:', {
top: el.style.top,
left: el.style.left,
width: el.style.width,
height: el.style.height,
visibility: el.style.visibility,
bottom: el.style.bottom,
right: el.style.right,
});
}
}, [
callEmbed?.roomId,
selectedRoom,
joined,
inCallRoom,
callVisible,
pipMode,
chatOnlyView,
callEmbedRef,
]);
React.useEffect(() => { React.useEffect(() => {
const el = callEmbedRef.current; const el = callEmbedRef.current;
if (!el) return; if (!el) return;
@@ -58,6 +58,14 @@ import { useRoomCreators } from '../../../hooks/useRoomCreators';
import { getMouseEventCords } from '../../../utils/dom'; import { getMouseEventCords } from '../../../utils/dom';
import { useCrossSigningActive } from '../../../hooks/useCrossSigning'; import { useCrossSigningActive } from '../../../hooks/useCrossSigning';
import { MemberVerificationBadge } from '../../../components/MemberVerificationBadge'; import { MemberVerificationBadge } from '../../../components/MemberVerificationBadge';
import { useUserPresence } from '../../../hooks/useUserPresence';
import { PresenceBadge } from '../../../components/presence';
function MemberPresenceBadge({ userId }: { userId: string }) {
const presence = useUserPresence(userId);
if (!presence) return null;
return <PresenceBadge presence={presence.presence} status={presence.status} size="300" />;
}
const SEARCH_OPTIONS: UseAsyncSearchOptions = { const SEARCH_OPTIONS: UseAsyncSearchOptions = {
limit: 1000, limit: 1000,
@@ -333,6 +341,7 @@ export function Members({ requestClose }: MembersProps) {
useAuthentication={useAuthentication} useAuthentication={useAuthentication}
after={ after={
<> <>
<MemberPresenceBadge userId={tagOrMember.userId} />
{showEncryption && ( {showEncryption && (
<MemberVerificationBadge userId={tagOrMember.userId} /> <MemberVerificationBadge userId={tagOrMember.userId} />
)} )}
+6
View File
@@ -61,6 +61,8 @@ import { useFlattenPowerTagMembers, useGetMemberPowerTag } from '../../hooks/use
import { useRoomCreators } from '../../hooks/useRoomCreators'; import { useRoomCreators } from '../../hooks/useRoomCreators';
import { useCrossSigningActive } from '../../hooks/useCrossSigning'; import { useCrossSigningActive } from '../../hooks/useCrossSigning';
import { MemberVerificationBadge } from '../../components/MemberVerificationBadge'; import { MemberVerificationBadge } from '../../components/MemberVerificationBadge';
import { useUserPresence } from '../../hooks/useUserPresence';
import { PresenceBadge } from '../../components/presence';
type MemberDrawerHeaderProps = { type MemberDrawerHeaderProps = {
room: Room; room: Room;
@@ -131,6 +133,7 @@ function MemberItem({
const avatarUrl = avatarMxcUrl const avatarUrl = avatarMxcUrl
? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication) ? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication)
: undefined; : undefined;
const presence = useUserPresence(member.userId);
return ( return (
<MenuItem <MenuItem
@@ -152,6 +155,9 @@ function MemberItem({
} }
after={ after={
<> <>
{presence && (
<PresenceBadge presence={presence.presence} status={presence.status} size="300" />
)}
{showEncryption && <MemberVerificationBadge userId={member.userId} />} {showEncryption && <MemberVerificationBadge userId={member.userId} />}
{typing && ( {typing && (
<Badge size="300" variant="Secondary" fill="Soft" radii="Pill" outlined> <Badge size="300" variant="Secondary" fill="Soft" radii="Pill" outlined>
-6
View File
@@ -155,12 +155,6 @@ export const useCallEmbedPlacementSync = (containerViewRef: RefObject<HTMLDivEle
if (!embedEl || !container) return; if (!embedEl || !container) return;
const rect = container.getBoundingClientRect(); const rect = container.getBoundingClientRect();
console.log('[CallEmbed] syncCallEmbedPlacement:', {
top: rect.top,
left: rect.left,
width: rect.width,
height: rect.height,
});
embedEl.style.top = `${rect.top}px`; embedEl.style.top = `${rect.top}px`;
embedEl.style.left = `${rect.left}px`; embedEl.style.left = `${rect.left}px`;
embedEl.style.width = `${rect.width}px`; embedEl.style.width = `${rect.width}px`;