Merge commit 'e5826777b6c06a32b97388657beaca1e5eccb421' into glitch-soc/merge-upstream

Conflicts:
- `config/settings.yml`:
  Not a real conflict, upstream removed settings that are identical in glitch-soc
  but textually adjacent to glitch-soc-only settings.
  Removed what upstream removed.
This commit is contained in:
Claire committed 2025-07-30 20:05:45 +02:00
commit e53421b548
172 files changed
+2202 -647

No files matched your search

@@ -2,8 +2,6 @@ import { useEffect, useState, useCallback } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import {
fetchContext,
completeContextRefresh,
@@ -22,11 +20,15 @@ const messages = defineMessages({
export const RefreshController: React.FC<{
statusId: string;
withBorder?: boolean;
}> = ({ statusId, withBorder }) => {
}> = ({ statusId }) => {
const refresh = useAppSelector(
(state) => state.contexts.refreshing[statusId],
);
const autoRefresh = useAppSelector(
(state) =>
!state.contexts.replies[statusId] ||
state.contexts.replies[statusId].length === 0,
);
const dispatch = useAppDispatch();
const intl = useIntl();
const [ready, setReady] = useState(false);
@@ -42,6 +44,11 @@ export const RefreshController: React.FC<{
dispatch(completeContextRefresh({ statusId }));
if (result.async_refresh.result_count > 0) {
if (autoRefresh) {
void dispatch(fetchContext({ statusId }));
return '';
}
setReady(true);
}
} else {
@@ -60,7 +67,7 @@ export const RefreshController: React.FC<{
return () => {
clearTimeout(timeoutId);
};
}, [dispatch, setReady, statusId, refresh]);
}, [dispatch, setReady, statusId, refresh, autoRefresh]);
const handleClick = useCallback(() => {
setLoading(true);
@@ -78,12 +85,7 @@ export const RefreshController: React.FC<{
if (ready && !loading) {
return (
<button
className={classNames('load-more load-gap', {
'timeline-hint--with-descendants': withBorder,
})}
onClick={handleClick}
>
<button className='load-more load-gap' onClick={handleClick}>
<FormattedMessage
id='status.context.load_new_replies'
defaultMessage='New replies available'
@@ -98,9 +100,7 @@ export const RefreshController: React.FC<{
return (
<div
className={classNames('load-more load-gap', {
'timeline-hint--with-descendants': withBorder,
})}
className='load-more load-gap'
aria-busy
aria-live='polite'
aria-label={intl.formatMessage(messages.loading)}
@@ -580,7 +580,6 @@ class Status extends ImmutablePureComponent {
remoteHint = (
<RefreshController
statusId={status.get('id')}
withBorder={!!descendants}
/>
);
}
@@ -653,8 +652,8 @@ class Status extends ImmutablePureComponent {
</div>
</Hotkeys>
{descendants}
{remoteHint}
{descendants}
</div>
</ScrollContainer>