fix(messages): the delivery indicator updates when a send completes (#306)
CI / Build & Quality Checks (pull_request) Successful in 3m47s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 13s
CI / Playwright smoke (e2e) (pull_request) Successful in 14m53s
CI / Build & Quality Checks (pull_request) Successful in 3m47s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 13s
CI / Playwright smoke (e2e) (pull_request) Successful in 14m53s
DeliveryStatus showed whatever mEvent.status was at the last timeline re-render, and a local echo's status changes (SENDING → SENT → confirmed, NOT_SENT → retried) only emit event-level events, so the last message in a quiet room kept "Sending..." (or a stale "Failed to send. Click to retry" after an outbox retry) indefinitely. It now re-renders on MatrixEventEvent.Status / LocalEventIdReplaced. Not browser-verified in this change (checks: tsc, unit tests, eslint). Fixes #306 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
400ee76b63
commit
36e697613b
@@ -31,12 +31,13 @@ import React, {
|
|||||||
MouseEventHandler,
|
MouseEventHandler,
|
||||||
ReactNode,
|
ReactNode,
|
||||||
useCallback,
|
useCallback,
|
||||||
|
useEffect,
|
||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { useHover, useFocusWithin } from 'react-aria';
|
import { useHover, useFocusWithin } from 'react-aria';
|
||||||
import { MatrixEvent, Room, EventStatus } from 'matrix-js-sdk';
|
import { MatrixEvent, MatrixEventEvent, Room, EventStatus } from 'matrix-js-sdk';
|
||||||
import { Relations } from 'matrix-js-sdk/lib/models/relations';
|
import { Relations } from 'matrix-js-sdk/lib/models/relations';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useAtom, useAtomValue } from 'jotai';
|
import { useAtom, useAtomValue } from 'jotai';
|
||||||
@@ -114,6 +115,20 @@ function DeliveryStatus({
|
|||||||
}) {
|
}) {
|
||||||
const mx = useMatrixClient();
|
const mx = useMatrixClient();
|
||||||
const offline = useAtomValue(sendOfflineAtom);
|
const offline = useAtomValue(sendOfflineAtom);
|
||||||
|
// [Gitea #306] A local echo's status changes (SENDING → SENT → confirmed,
|
||||||
|
// NOT_SENT → retried) don't re-render the timeline, so the last message in a
|
||||||
|
// quiet room kept "Sending..." (or a stale "Failed to send") indefinitely.
|
||||||
|
// Re-render on the event's own status updates.
|
||||||
|
const [, setStatusTick] = useState(0);
|
||||||
|
useEffect(() => {
|
||||||
|
const bump = () => setStatusTick((t) => t + 1);
|
||||||
|
mEvent.on(MatrixEventEvent.Status, bump);
|
||||||
|
mEvent.on(MatrixEventEvent.LocalEventIdReplaced, bump);
|
||||||
|
return () => {
|
||||||
|
mEvent.off(MatrixEventEvent.Status, bump);
|
||||||
|
mEvent.off(MatrixEventEvent.LocalEventIdReplaced, bump);
|
||||||
|
};
|
||||||
|
}, [mEvent]);
|
||||||
const { status } = mEvent;
|
const { status } = mEvent;
|
||||||
if (status === null) return null; // confirmed by server — read receipts take over
|
if (status === null) return null; // confirmed by server — read receipts take over
|
||||||
let iconSrc: IconSrc;
|
let iconSrc: IconSrc;
|
||||||
|
|||||||
Reference in New Issue
Block a user