From 2d132a8f660dcd777b2ab042a071eff601b2c044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Wed, 25 Mar 2026 13:04:00 +0100 Subject: [PATCH 01/56] nicolium: allow filtering reblogs in list timelines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/nicolium/src/hooks/use-timeline-filters-options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nicolium/src/hooks/use-timeline-filters-options.ts b/packages/nicolium/src/hooks/use-timeline-filters-options.ts index be569957c..d201d1277 100644 --- a/packages/nicolium/src/hooks/use-timeline-filters-options.ts +++ b/packages/nicolium/src/hooks/use-timeline-filters-options.ts @@ -59,7 +59,7 @@ const useTimelineFiltersOptions = ( return useMemo(() => { const items: Menu = []; - if (timeline === 'home') { + if (['home', 'list', 'antenna'].includes(timeline)) { items.push({ text: intl.formatMessage(messages.showReblogs), type: 'toggle', From 75a892e7c525bd8c478edbea3043fd3126046192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 28 Mar 2026 12:23:12 +0100 Subject: [PATCH 02/56] pl-api: fix content type again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/lib/client/experimental.ts | 6 +++--- packages/pl-api/lib/client/media.ts | 2 +- packages/pl-api/lib/client/settings.ts | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/pl-api/lib/client/experimental.ts b/packages/pl-api/lib/client/experimental.ts index ea10bfe12..e1c03bdc5 100644 --- a/packages/pl-api/lib/client/experimental.ts +++ b/packages/pl-api/lib/client/experimental.ts @@ -98,7 +98,7 @@ const experimental = (client: PlApiBaseClient) => { description: params.note, membership: 'public', }, - contentType: params.avatar || params.header ? '' : undefined, + formData: !!(params.avatar || params.header), }); if (response.json?.id) { @@ -108,7 +108,7 @@ const experimental = (client: PlApiBaseClient) => { response = await client.request('/api/v1/groups', { method: 'POST', body: params, - contentType: params.avatar || params.header ? '' : undefined, + formData: !!(params.avatar || params.header), }); } @@ -133,7 +133,7 @@ const experimental = (client: PlApiBaseClient) => { const response = await client.request(`/api/v1/groups/${groupId}`, { method: 'PUT', body: params, - contentType: params.avatar || params.header ? '' : undefined, + formData: !!(params.avatar || params.header), }); return v.parse(groupSchema, response.json); diff --git a/packages/pl-api/lib/client/media.ts b/packages/pl-api/lib/client/media.ts index 0fdc03518..8028dd330 100644 --- a/packages/pl-api/lib/client/media.ts +++ b/packages/pl-api/lib/client/media.ts @@ -42,7 +42,7 @@ const media = (client: PlApiBaseClient) => ({ const response = await client.request(`/api/v1/media/${attachmentId}`, { method: 'PUT', body: params, - contentType: params.thumbnail ? '' : undefined, + formData: !!params.thumbnail, }); return v.parse(mediaAttachmentSchema, response.json); diff --git a/packages/pl-api/lib/client/settings.ts b/packages/pl-api/lib/client/settings.ts index 9a6847d2e..b61eae408 100644 --- a/packages/pl-api/lib/client/settings.ts +++ b/packages/pl-api/lib/client/settings.ts @@ -81,13 +81,12 @@ const settings = (client: PlApiBaseClient) => ({ const response = await client.request('/api/v1/accounts/update_credentials', { method: 'PATCH', - contentType: + formData: !!( client.features.version.software === GOTOSOCIAL || client.features.version.software === ICESHRIMP_NET || params.avatar || params.header - ? '' - : undefined, + ), body: params, }); From d91c3fbadc9cb9ca8e1b9f3bb73d0b906e465047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 28 Mar 2026 14:41:33 +0100 Subject: [PATCH 03/56] nicolium: improve current lang display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../src/components/statuses/status-language-picker.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nicolium/src/components/statuses/status-language-picker.tsx b/packages/nicolium/src/components/statuses/status-language-picker.tsx index 509aeb286..ba2cbddbe 100644 --- a/packages/nicolium/src/components/statuses/status-language-picker.tsx +++ b/packages/nicolium/src/components/statuses/status-language-picker.tsx @@ -19,7 +19,7 @@ const messages = defineMessages({ }); interface IStatusLanguagePicker { - status: Pick; + status: Pick; showLabel?: boolean; } @@ -44,7 +44,7 @@ const StatusLanguagePicker: React.FC = React.memo( action: () => { setStatusLanguage(status.id, language); }, - active: language === currentLanguage, + active: language === (currentLanguage || status.language), }))} > + +); + interface IStatusContent { status: NormalizedStatus; onClick?: () => void; @@ -62,6 +86,7 @@ interface IStatusContent { withMedia?: boolean; compose?: boolean; isEvent?: boolean; + expandable?: boolean; } /** Renders the text content of a status */ @@ -77,6 +102,7 @@ const StatusContent: React.FC = React.memo( withMedia, compose = false, isEvent = false, + expandable = false, }) => { const { urlPrivacy, displaySpoilers, renderMfm, displayMentionAvatars } = useSettings(); const { greentext } = useFrontendConfig(); @@ -89,7 +115,8 @@ const StatusContent: React.FC = React.memo( const contentNode = useRef(null); const spoilerNode = useRef(null); - const { collapseStatuses, expandStatuses } = useStatusMetaActions(); + const { collapseStatuses, expandStatuses, collapseStatusSpoilers, expandStatusSpoilers } = + useStatusMetaActions(); const statusMeta = useStatusMeta(status.id); const { data: translation } = useStatusTranslation(status.id, statusMeta.targetLanguage); const { data: localTranslation } = useLocalStatusTranslation( @@ -98,7 +125,8 @@ const StatusContent: React.FC = React.memo( ); const withSpoiler = status.spoiler_text.length > 0; - const expanded = !withSpoiler || (statusMeta.expanded ?? false); + const { expanded } = statusMeta; + const spoilerExpanded = !withSpoiler || (statusMeta.spoilerExpanded ?? false); const maybeSetCollapsed = (): void => { if (!contentNode.current) return; @@ -121,20 +149,30 @@ const StatusContent: React.FC = React.memo( } }; - const toggleExpanded: React.MouseEventHandler = (e) => { + const toggleSpoilerExpanded: React.MouseEventHandler = (e) => { e.preventDefault(); e.stopPropagation(); + if (spoilerExpanded) { + collapseStatusSpoilers([status.id]); + setCollapsed(null); + } else expandStatusSpoilers([status.id]); + }; + + const toggleExpanded: React.MouseEventHandler = (e) => { + e.preventDefault(); + e.stopPropagation(); if (expanded) { collapseStatuses([status.id]); - setCollapsed(null); - } else expandStatuses([status.id]); + } else { + expandStatuses([status.id]); + } }; useLayoutEffect(() => { maybeSetCollapsed(); maybeSetOnlyEmoji(); - }, [expanded]); + }, [spoilerExpanded]); const content = useMemo( (): string => @@ -194,23 +232,23 @@ const StatusContent: React.FC = React.memo( const className = useMemo( () => clsx('⁂-status-content', { - 'overflow-hidden': collapsed, - 'max-h-[200px]': collapsed && !isQuote && !preview, - 'max-h-[120px]': collapsed && isQuote, - 'max-h-[80px]': collapsed && preview, - 'max-h-[282px]': collapsable && collapsed === null && !isQuote && !preview, - 'max-h-[202px]': collapsable && collapsed === null && isQuote, - 'max-h-[82px]': collapsed === null && preview, + 'overflow-hidden': collapsed && !expanded, + 'max-h-[200px]': collapsed && !isQuote && !preview && !expanded, + 'max-h-[120px]': collapsed && isQuote && !expanded, + 'max-h-[80px]': collapsed && preview && !expanded, + 'max-h-[282px]': collapsable && collapsed === null && !isQuote && !preview && !expanded, + 'max-h-[202px]': collapsable && collapsed === null && isQuote && !expanded, + 'max-h-[82px]': collapsed === null && preview && !expanded, 'big-emoji leading-normal': onlyEmoji, - '⁂-status-content--expanded': !collapsable, + '⁂-status-content--spoiler-expanded': !collapsable, '⁂-status-content--quote': isQuote, '⁂-status-content--preview': preview, '⁂-status-content--poll': !!status.poll_id, }), - [collapsed, onlyEmoji], + [collapsed, onlyEmoji, spoilerExpanded, expanded], ); - const expandable = !displaySpoilers && !isEvent; + const hasSpoiler = !displaySpoilers && !isEvent; const output = []; @@ -218,21 +256,21 @@ const StatusContent: React.FC = React.memo( output.push(

- {expandable && ( -