[Glitch] Add lines to threads in web UI

Port 290e4aba31 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
Eugen Rochko 2023-04-24 08:07:03 +02:00 committed by Claire
parent 8015297f9e
commit 7b01b7c3bf
4 changed files with 76 additions and 7 deletions

View File

@ -67,6 +67,9 @@ class Status extends ImmutablePureComponent {
id: PropTypes.string, id: PropTypes.string,
status: ImmutablePropTypes.map, status: ImmutablePropTypes.map,
account: ImmutablePropTypes.map, account: ImmutablePropTypes.map,
previousId: PropTypes.string,
nextInReplyToId: PropTypes.string,
rootId: PropTypes.string,
onReply: PropTypes.func, onReply: PropTypes.func,
onFavourite: PropTypes.func, onFavourite: PropTypes.func,
onReblog: PropTypes.func, onReblog: PropTypes.func,
@ -518,6 +521,9 @@ class Status extends ImmutablePureComponent {
unread, unread,
featured, featured,
pictureInPicture, pictureInPicture,
previousId,
nextInReplyToId,
rootId,
...other ...other
} = this.props; } = this.props;
const { isCollapsed, forceFilter } = this.state; const { isCollapsed, forceFilter } = this.state;
@ -561,6 +567,8 @@ class Status extends ImmutablePureComponent {
openMedia: this.handleHotkeyOpenMedia, openMedia: this.handleHotkeyOpenMedia,
}; };
let prepend, rebloggedByText;
if (hidden) { if (hidden) {
return ( return (
<HotKeys handlers={handlers}> <HotKeys handlers={handlers}>
@ -572,7 +580,11 @@ class Status extends ImmutablePureComponent {
); );
} }
const connectUp = previousId && previousId === status.get('in_reply_to_id');
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
const matchedFilters = status.get('matched_filters'); const matchedFilters = status.get('matched_filters');
if (this.state.forceFilter === undefined ? matchedFilters : this.state.forceFilter) { if (this.state.forceFilter === undefined ? matchedFilters : this.state.forceFilter) {
const minHandlers = this.props.muted ? {} : { const minHandlers = this.props.muted ? {} : {
moveUp: this.handleHotkeyMoveUp, moveUp: this.handleHotkeyMoveUp,
@ -726,8 +738,6 @@ class Status extends ImmutablePureComponent {
'data-status-by': `@${status.getIn(['account', 'acct'])}`, 'data-status-by': `@${status.getIn(['account', 'acct'])}`,
}; };
let prepend;
if (this.props.prepend && account) { if (this.props.prepend && account) {
const notifKind = { const notifKind = {
favourite: 'favourited', favourite: 'favourited',
@ -748,8 +758,6 @@ class Status extends ImmutablePureComponent {
); );
} }
let rebloggedByText;
if (this.props.prepend === 'reblog') { if (this.props.prepend === 'reblog') {
rebloggedByText = intl.formatMessage({ id: 'status.reblogged_by', defaultMessage: '{name} boosted' }, { name: account.get('acct') }); rebloggedByText = intl.formatMessage({ id: 'status.reblogged_by', defaultMessage: '{name} boosted' }, { name: account.get('acct') });
} }
@ -758,6 +766,8 @@ class Status extends ImmutablePureComponent {
collapsed: isCollapsed, collapsed: isCollapsed,
'has-background': isCollapsed && background, 'has-background': isCollapsed && background,
'status__wrapper-reply': !!status.get('in_reply_to_id'), 'status__wrapper-reply': !!status.get('in_reply_to_id'),
'status--in-thread': !!rootId,
'status--first-in-thread': previousId && (!connectUp || connectToRoot),
unread, unread,
muted, muted,
}, 'focusable'); }, 'focusable');
@ -774,6 +784,9 @@ class Status extends ImmutablePureComponent {
aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}
> >
{!muted && prepend} {!muted && prepend}
{(connectReply || connectUp || connectToRoot) && <div className={classNames('status__line', { 'status__line--full': connectReply, 'status__line--first': !status.get('in_reply_to_id') && !connectToRoot })} />}
<header className='status__info'> <header className='status__info'>
<span> <span>
{muted && prepend} {muted && prepend}

View File

@ -83,6 +83,7 @@ const makeMapStateToProps = () => {
return { return {
containerId: props.containerId || props.id, // Should match reblogStatus's id for reblogs containerId: props.containerId || props.id, // Should match reblogStatus's id for reblogs
status: status, status: status,
nextInReplyToId: props.nextId ? state.getIn(['statuses', props.nextId, 'in_reply_to_id']) : null,
account: account || props.account, account: account || props.account,
settings: state.get('local_settings'), settings: state.get('local_settings'),
prepend: prepend || props.prepend, prepend: prepend || props.prepend,

View File

@ -559,8 +559,10 @@ class Status extends ImmutablePureComponent {
this.column.scrollTop(); this.column.scrollTop();
}; };
renderChildren (list) { renderChildren (list, ancestors) {
return list.map(id => ( const { params: { statusId } } = this.props;
return list.map((id, i) => (
<StatusContainer <StatusContainer
key={id} key={id}
id={id} id={id}
@ -568,6 +570,9 @@ class Status extends ImmutablePureComponent {
onMoveUp={this.handleMoveUp} onMoveUp={this.handleMoveUp}
onMoveDown={this.handleMoveDown} onMoveDown={this.handleMoveDown}
contextType='thread' contextType='thread'
previousId={i > 0 && list.get(i - 1)}
nextId={list.get(i + 1) || (ancestors && statusId)}
rootId={statusId}
/> />
)); ));
} }
@ -628,7 +633,7 @@ class Status extends ImmutablePureComponent {
const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded; const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded;
if (ancestorsIds && ancestorsIds.size > 0) { if (ancestorsIds && ancestorsIds.size > 0) {
ancestors = <>{this.renderChildren(ancestorsIds)}</>; ancestors = <>{this.renderChildren(ancestorsIds, true)}</>;
} }
if (descendantsIds && descendantsIds.size > 0) { if (descendantsIds && descendantsIds.size > 0) {

View File

@ -554,6 +554,7 @@
.detailed-status { .detailed-status {
background: lighten($ui-base-color, 4%); background: lighten($ui-base-color, 4%);
padding: 14px 10px; padding: 14px 10px;
border-top: 1px solid lighten($ui-base-color, 8%);
&--flex { &--flex {
display: flex; display: flex;
@ -690,6 +691,7 @@ a.status__display-name,
margin-inline-end: 10px; margin-inline-end: 10px;
height: 48px; height: 48px;
width: 48px; width: 48px;
box-shadow: 0 0 0 2px $ui-base-color;
} }
.muted { .muted {
@ -1029,6 +1031,54 @@ a.status-card.compact:hover {
pointer-events: none; pointer-events: none;
} }
} }
&--in-thread {
border-bottom: 0;
.status__content,
.status__action-bar {
margin-left: 46px + 10px;
width: calc(100% - (46px + 10px));
}
}
&--first-in-thread {
border-top: 1px solid lighten($ui-base-color, 8%);
}
&__line {
height: 16px - 4px;
border-inline-start: 2px solid lighten($ui-base-color, 8%);
width: 0;
position: absolute;
top: 0;
inset-inline-start: 16px + ((46px - 2px) / 2);
&--full {
top: 0;
height: 100%;
&::before {
content: '';
display: block;
position: absolute;
top: 16px - 4px;
height: 46px + 4px + 4px;
width: 2px;
background: $ui-base-color;
inset-inline-start: -2px;
}
}
&--first {
top: 16px + 46px + 4px;
height: calc(100% - (16px + 46px + 4px));
&::before {
display: none;
}
}
}
} }
.picture-in-picture { .picture-in-picture {