diff --git a/client/src/app/chat-page.component.html b/client/src/app/chat-page.component.html index 7d986cb..1fa31ac 100644 --- a/client/src/app/chat-page.component.html +++ b/client/src/app/chat-page.component.html @@ -219,136 +219,145 @@ placeholder="Write a text message to your peer" > -
diff --git a/client/src/app/chat-page.component.scss b/client/src/app/chat-page.component.scss index 81f0aff..46372bf 100644 --- a/client/src/app/chat-page.component.scss +++ b/client/src/app/chat-page.component.scss @@ -526,10 +526,41 @@ .composer-toolbar { display: flex; flex-wrap: wrap; + gap: 0.85rem; + align-items: center; + justify-content: space-between; +} + +.composer-actions { + display: flex; + flex: 1 1 auto; + flex-wrap: wrap; gap: 0.6rem; align-items: center; } +.composer-receive-speed { + display: inline-flex; + flex: 0 0 auto; + align-items: baseline; + gap: 0.45rem; + margin-left: auto; + text-align: right; + white-space: nowrap; + color: var(--page-text-soft); +} + +.composer-receive-speed-label { + font-size: 0.75rem; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.composer-receive-speed-value { + font-size: 0.92rem; + font-variant-numeric: tabular-nums; +} + .composer-emoji-picker-shell { position: relative; } @@ -585,6 +616,11 @@ background: var(--badge-background); } +.composer-plus { + font-size: 1.76rem; + font-weight: 700; +} + .composer-dictation { color: var(--page-text); background: linear-gradient(135deg, #f6d8ff, #ffcadb); diff --git a/client/src/app/chat-page.component.ts b/client/src/app/chat-page.component.ts index 662ca1f..7aaaa52 100644 --- a/client/src/app/chat-page.component.ts +++ b/client/src/app/chat-page.component.ts @@ -125,6 +125,11 @@ export class ChatPageComponent implements OnDestroy { .messages() .filter((entry) => entry.peerId === this.peerId()), ); + readonly lastIncomingReceiveMetric = computed(() => { + const metric = this.session.lastIncomingReceiveMetric(); + + return metric?.peerId === this.peerId() ? metric : null; + }); readonly remoteCallAudioStream = computed(() => this.session.remoteAudioStreamForPeer(this.callModalPeerId() ?? ''), ); diff --git a/client/src/app/chat-session.service.ts b/client/src/app/chat-session.service.ts index 544bcc2..4cef67b 100644 --- a/client/src/app/chat-session.service.ts +++ b/client/src/app/chat-session.service.ts @@ -43,6 +43,8 @@ type IncomingFileTransfer = { authorName: string; chunks: ArrayBuffer[]; receivedBytes: number; + controlBytes: number; + startedAtMs: number; }; type PersistedBinary = string | ArrayBuffer; @@ -146,6 +148,7 @@ export class ChatSessionService { readonly status = signal('Disconnected from signaling server.'); readonly error = signal