TextBuffer: add scroll targets

This commit is contained in:
He4eT 2024-01-27 03:28:05 +01:00
commit 3ef278fa5f
3 changed files with 17 additions and 11 deletions

View file

@ -4,6 +4,9 @@ import TextMessage from '../TextMessage/TextMessage'
import * as s from '../../Player.module.scss' import * as s from '../../Player.module.scss'
const eol = { style: 'endOfLine' }
const scrollTarget = { style: 'scrollTarget' }
const isFakeStatus = (w) => const isFakeStatus = (w) =>
w.height < 5 w.height < 5
@ -22,15 +25,13 @@ const parseInbox = (inbox, currentWindow) => {
if (!currentInbox) { if (!currentInbox) {
return { return {
clear: false, clear: false,
incoming: [], incoming: [scrollTarget],
} }
} }
const { text: inboxMessagesRaw } = const { text: inboxMessagesRaw } =
currentInbox currentInbox
const eol = { style: 'endOfLine' }
const incoming = const incoming =
inboxMessagesRaw inboxMessagesRaw
/* Normalize. */ /* Normalize. */
@ -40,7 +41,7 @@ const parseInbox = (inbox, currentWindow) => {
: [eol]) : [eol])
/* Flatten. */ /* Flatten. */
.reduce((acc, x) => .reduce((acc, x) =>
acc.concat(x), []) acc.concat(x), [scrollTarget])
return { return {
incoming, incoming,
@ -63,13 +64,13 @@ export default function TextBuffer ({ inbox, currentWindow }) {
: messages.concat(incoming)) : messages.concat(incoming))
setTimeout(() => { setTimeout(() => {
const inputs = const scrollTargets =
textBufferEl.current.querySelectorAll('.message.input') textBufferEl.current.querySelectorAll(`.${scrollTarget.style}`)
const lastInput = const freshScrollTarget =
inputs[inputs.length - 1] scrollTargets[scrollTargets.length - 1]
lastInput freshScrollTarget
? lastInput.scrollIntoView() ? freshScrollTarget.scrollIntoView()
: textBufferEl.current.scrollTo({ : textBufferEl.current.scrollTo({
top: textBufferEl.current.scrollHeight, top: textBufferEl.current.scrollHeight,
behavior: 'smooth', behavior: 'smooth',

View file

@ -15,6 +15,8 @@ export default function TextMessage ({ style, text }) {
(<strong className={[s.message, s.subheader].join(' ')}>{text}</strong>), (<strong className={[s.message, s.subheader].join(' ')}>{text}</strong>),
emphasized: emphasized:
(<em className={[s.message, s.emphasized].join(' ')}>{text}</em>), (<em className={[s.message, s.emphasized].join(' ')}>{text}</em>),
scrollTarget:
(<div className={[s.scrollTarget, style].join(' ')}></div>),
endOfLine: endOfLine:
(<br />), (<br />),
})[style] || defaultContent })[style] || defaultContent

View file

@ -1,6 +1,5 @@
.message { .message {
&.input { &.input {
scroll-margin-top: var(--inner-padding);
color: var(--input-color); color: var(--input-color);
} }
@ -9,3 +8,7 @@
color: var(--accent-color); color: var(--accent-color);
} }
} }
.scrollTarget {
scroll-margin-block-start: var(--inner-padding);
}