nicolium: use helpers for minification

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2026-02-23 21:24:13 +01:00
parent 060f959d07
commit f8e0d2d47c
2 changed files with 61 additions and 61 deletions

View File

@ -14,28 +14,15 @@ import { store } from '@/store';
import { compareDate } from '@/utils/comparators';
import { queryClient } from '../client';
import {
minifyConversation,
minifyConversationList,
type MinifiedConversation,
} from '../utils/minify-list';
import { updatePaginatedResponse } from '../utils/update-paginated-response';
import type { Conversation, PaginatedResponse } from 'pl-api';
type MinifiedConversation = {
id: string;
unread: boolean;
account_ids: string[];
last_status: string | null;
last_status_created_at: string | null;
};
type MinifiedConversationPage = PaginatedResponse<MinifiedConversation>;
const minifyConversation = (conversation: Conversation): MinifiedConversation => ({
id: conversation.id,
unread: conversation.unread,
account_ids: conversation.accounts.map((account) => account.id),
last_status: conversation.last_status?.id ?? null,
last_status_created_at: conversation.last_status?.created_at ?? null,
});
const sortConversations = (items: MinifiedConversation[]) =>
items.toSorted((a, b) => {
if (a.last_status_created_at === null || b.last_status_created_at === null) {
@ -54,48 +41,34 @@ const importConversationEntities = (conversations: Conversation[]) => {
);
};
const minifyConversationPage = (
response: PaginatedResponse<Conversation>,
): MinifiedConversationPage => {
importConversationEntities(response.items);
return {
...response,
previous: response.previous
? () => response.previous!().then((page) => minifyConversationPage(page))
: null,
next: response.next
? () => response.next!().then((page) => minifyConversationPage(page))
: null,
items: response.items.map(minifyConversation),
};
};
const updateConversations = (conversation: Conversation) => {
importConversationEntities([conversation]);
queryClient.setQueryData<InfiniteData<MinifiedConversationPage>>(['conversations'], (data) => {
if (!data || !data.pages.length) return data;
queryClient.setQueryData<InfiniteData<PaginatedResponse<MinifiedConversation>>>(
['conversations'],
(data) => {
if (!data || !data.pages.length) return data;
return create(data, (draft) => {
const updatedConversation = minifyConversation(conversation);
return create(data, (draft) => {
const updatedConversation = minifyConversation(conversation);
let found = false;
let found = false;
for (const page of draft.pages) {
const index = page.items.findIndex((item) => item.id === updatedConversation.id);
if (index !== -1) {
page.items[index] = updatedConversation;
found = true;
break;
for (const page of draft.pages) {
const index = page.items.findIndex((item) => item.id === updatedConversation.id);
if (index !== -1) {
page.items[index] = updatedConversation;
found = true;
break;
}
}
}
if (!found) {
draft.pages[0].items.unshift(updatedConversation);
}
});
});
if (!found) {
draft.pages[0].items.unshift(updatedConversation);
}
});
},
);
};
const useConversations = () => {
@ -110,14 +83,11 @@ const useConversations = () => {
}
const response = await client.timelines.getConversations();
return minifyConversationPage(response);
return minifyConversationList(response);
},
initialPageParam: {
previous: null,
next: null,
items: [],
partial: false,
} as MinifiedConversationPage,
next: null as (() => Promise<PaginatedResponse<MinifiedConversation>>) | null,
} as PaginatedResponse<MinifiedConversation>,
getNextPageParam: (page) => (page.next ? page : undefined),
enabled: isLoggedIn,
});
@ -140,9 +110,9 @@ const useMarkConversationRead = (conversationId: string) => {
onMutate: async () => {
await queryClient.cancelQueries({ queryKey: ['conversations'] });
const previous = queryClient.getQueryData<InfiniteData<MinifiedConversationPage>>([
'conversations',
]);
const previous = queryClient.getQueryData<
InfiniteData<PaginatedResponse<MinifiedConversation>>
>(['conversations']);
updatePaginatedResponse<MinifiedConversation>(['conversations'], (items) =>
items.map((item) => (item.id === conversationId ? { ...item, unread: false } : item)),

View File

@ -8,6 +8,7 @@ import type {
AdminAccount,
AdminReport,
BlockedAccount,
Conversation,
Group,
MutedAccount,
PaginatedResponse,
@ -82,6 +83,32 @@ const minifyGroupList = (response: PaginatedResponse<Group>): PaginatedResponse<
},
);
type MinifiedConversation = {
id: string;
unread: boolean;
account_ids: string[];
last_status: string | null;
last_status_created_at: string | null;
};
const minifyConversation = (conversation: Conversation): MinifiedConversation => ({
id: conversation.id,
unread: conversation.unread,
account_ids: conversation.accounts.map((account) => account.id),
last_status: conversation.last_status?.id ?? null,
last_status_created_at: conversation.last_status?.created_at ?? null,
});
const minifyConversationList = (response: PaginatedResponse<Conversation>) =>
minifyList(response, minifyConversation, (conversations) => {
store.dispatch(
importEntities({
accounts: conversations.flatMap((conversation) => conversation.accounts),
statuses: conversations.map((conversation) => conversation.last_status),
}) as any,
);
});
const minifyAdminAccount = ({ account, ...adminAccount }: AdminAccount) => {
store.dispatch(importEntities({ accounts: [account] }) as any);
queryClient.setQueryData(['admin', 'accounts', adminAccount.id], adminAccount);
@ -159,8 +186,11 @@ export {
minifyMutedAccountList,
minifyStatusList,
minifyGroupList,
minifyConversation,
minifyConversationList,
minifyAdminAccount,
minifyAdminAccountList,
minifyAdminReport,
minifyAdminReportList,
type MinifiedConversation,
};