From a8a0cb27ef7a9af94f8f8c1cbda0838492a067fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Fri, 27 Feb 2026 17:01:47 +0100 Subject: [PATCH] nicolium: moar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/nicolium/src/actions/timelines.ts | 3 +-- packages/nicolium/src/components/ui/form.tsx | 4 ++-- .../src/features/ui/components/timeline.tsx | 2 +- packages/nicolium/src/main.tsx | 12 +++++++++- .../src/pages/auth/password-reset.tsx | 4 ++-- .../src/pages/dashboard/theme-editor.tsx | 4 ++-- packages/nicolium/src/reducers/statuses.ts | 2 +- packages/nicolium/src/selectors/index.ts | 24 +++++++++---------- packages/nicolium/src/service-worker/sw.ts | 2 +- packages/nicolium/src/stores/compose.ts | 3 +-- packages/nicolium/src/utils/is-mobile.ts | 2 +- packages/nicolium/src/utils/queries.ts | 11 +++++---- packages/nicolium/src/utils/state.ts | 2 +- 13 files changed, 41 insertions(+), 34 deletions(-) diff --git a/packages/nicolium/src/actions/timelines.ts b/packages/nicolium/src/actions/timelines.ts index 351dad5e2..9632fae29 100644 --- a/packages/nicolium/src/actions/timelines.ts +++ b/packages/nicolium/src/actions/timelines.ts @@ -91,7 +91,7 @@ interface TimelineDequeueAction { } const dequeueTimeline = - (timelineId: string, expandFunc?: (lastStatusId: string) => void) => + (timelineId: string, expandFunc?: () => void) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const queuedCount = state.timelines[timelineId]?.totalQueuedItemsCount || 0; @@ -105,7 +105,6 @@ const dequeueTimeline = if (typeof expandFunc === 'function') { dispatch(clearTimeline(timelineId)); - // @ts-expect-error expandFunc(); } else if (timelineId === 'home') { dispatch(clearTimeline(timelineId)); diff --git a/packages/nicolium/src/components/ui/form.tsx b/packages/nicolium/src/components/ui/form.tsx index 632af7122..348c423ea 100644 --- a/packages/nicolium/src/components/ui/form.tsx +++ b/packages/nicolium/src/components/ui/form.tsx @@ -3,7 +3,7 @@ import React from 'react'; interface IForm { /** Form submission event handler. */ - onSubmit?: (event: React.FormEvent) => void; + onSubmit?: (event: React.SubmitEvent) => void; /** Class name override for the
element. */ className?: string; /** Elements to display within the Form. */ @@ -12,7 +12,7 @@ interface IForm { /** Form element with custom styles. */ const Form: React.FC = ({ onSubmit, children, className, ...filteredProps }) => { - const handleSubmit: React.FormEventHandler = React.useCallback( + const handleSubmit: React.SubmitEventHandler = React.useCallback( (event) => { event.preventDefault(); diff --git a/packages/nicolium/src/features/ui/components/timeline.tsx b/packages/nicolium/src/features/ui/components/timeline.tsx index b3ec18c90..0749c0194 100644 --- a/packages/nicolium/src/features/ui/components/timeline.tsx +++ b/packages/nicolium/src/features/ui/components/timeline.tsx @@ -45,7 +45,7 @@ const Timeline: React.FC = ({ timelineId, onLoadMore, prefix, ...rest ); const handleDequeueTimeline = useCallback(() => { - dispatch(dequeueTimeline(timelineId, onLoadMore)); + dispatch(dequeueTimeline(timelineId, onLoadMore ? () => onLoadMore(lastStatusId!) : undefined)); }, []); const handleScroll = useCallback( diff --git a/packages/nicolium/src/main.tsx b/packages/nicolium/src/main.tsx index df35790cc..4ea609b24 100644 --- a/packages/nicolium/src/main.tsx +++ b/packages/nicolium/src/main.tsx @@ -1,4 +1,14 @@ -(window as any).__PL_API_FALLBACK_ACCOUNT = { id: '', acct: 'undefined', url: location.origin }; +window.__PL_API_FALLBACK_ACCOUNT = { id: '', acct: 'undefined', url: location.origin }; + +declare global { + interface Window { + __PL_API_FALLBACK_ACCOUNT: { + id: string; + acct: string; + url: string; + }; + } +} import './polyfills'; import React from 'react'; diff --git a/packages/nicolium/src/pages/auth/password-reset.tsx b/packages/nicolium/src/pages/auth/password-reset.tsx index a5a0a884b..bdb3bd262 100644 --- a/packages/nicolium/src/pages/auth/password-reset.tsx +++ b/packages/nicolium/src/pages/auth/password-reset.tsx @@ -33,8 +33,8 @@ const PasswordResetPage = () => { const [isLoading, setIsLoading] = useState(false); const [success, setSuccess] = useState(false); - const handleSubmit = (e: React.FormEvent) => { - const nicknameOrEmail = (e.target as any).nickname_or_email.value; + const handleSubmit = (e: React.SubmitEvent) => { + const nicknameOrEmail = (e.target as HTMLFormElement).nickname_or_email.value; setIsLoading(true); dispatch(resetPassword(nicknameOrEmail)) .then(() => { diff --git a/packages/nicolium/src/pages/dashboard/theme-editor.tsx b/packages/nicolium/src/pages/dashboard/theme-editor.tsx index be4354cd5..9bc17fd19 100644 --- a/packages/nicolium/src/pages/dashboard/theme-editor.tsx +++ b/packages/nicolium/src/pages/dashboard/theme-editor.tsx @@ -85,7 +85,7 @@ const ThemeEditorPage: React.FC = () => { }); }; - const setTheme = (theme: any) => { + const setTheme = (theme: Record | string>) => { setResetKey(crypto.randomUUID()); setIsDefault(false); setTimeout(() => { @@ -130,7 +130,7 @@ const ThemeEditorPage: React.FC = () => { const json = JSON.parse(text); const colors = v.parse(frontendConfigSchema, { colors: json }).colors; - setTheme(colors); + if (colors) setTheme(colors); toast.success(intl.formatMessage(messages.importSuccess)); } }; diff --git a/packages/nicolium/src/reducers/statuses.ts b/packages/nicolium/src/reducers/statuses.ts index 2fbbb4a42..ae336a4f0 100644 --- a/packages/nicolium/src/reducers/statuses.ts +++ b/packages/nicolium/src/reducers/statuses.ts @@ -127,7 +127,7 @@ const normalizeStatus = ( } }); - const accountId = (account || (window as any).__PL_API_FALLBACK_ACCOUNT)?.id; + const accountId = (account || window.__PL_API_FALLBACK_ACCOUNT).id; // Add self to mentions if it's a reply to self const isSelfReply = accountId === status.in_reply_to_account_id; diff --git a/packages/nicolium/src/selectors/index.ts b/packages/nicolium/src/selectors/index.ts index df9e2cf54..1911a6b1a 100644 --- a/packages/nicolium/src/selectors/index.ts +++ b/packages/nicolium/src/selectors/index.ts @@ -149,21 +149,19 @@ const makeGetNotification = () => [ (_state: RootState, notification: NotificationGroup) => notification, (_state: RootState, notification: NotificationGroup) => - // @ts-expect-error types will be fine valibot ensures that - selectAccount(notification.target_id), - // @ts-expect-error types will be fine valibot ensures that - (state: RootState, notification: NotificationGroup) => state.statuses[notification.status_id], + selectAccount(('target_id' in notification ? notification.target_id : undefined)!), + (state: RootState, notification: NotificationGroup) => + state.statuses[('status_id' in notification ? notification.status_id : undefined)!], (_state: RootState, notification: NotificationGroup) => selectAccounts(notification.sample_account_ids), ], - (notification, target, status, accounts): SelectedNotification => ({ - ...notification, - // @ts-expect-error types will be fine valibot ensures that - target, - // @ts-expect-error types will be fine valibot ensures that - status, - accounts, - }), + (notification, target, status, accounts): SelectedNotification => + ({ + ...notification, + target: target!, + status: status!, + accounts, + }) as unknown as SelectedNotification, ); type SelectedNotification = NotificationGroup & { @@ -293,7 +291,7 @@ const makeGetStatusIds = () => (state: RootState, { type }: ColumnQuery) => state.timelines[type]?.items || [], (state: RootState) => state.statuses, ], - (columnSettings: any, statusIds: Array, statuses) => + (columnSettings, statusIds: Array, statuses) => statusIds.filter((id: string) => { const status = statuses[id]; if (!status) return true; diff --git a/packages/nicolium/src/service-worker/sw.ts b/packages/nicolium/src/service-worker/sw.ts index ccff2dab2..38878370e 100644 --- a/packages/nicolium/src/service-worker/sw.ts +++ b/packages/nicolium/src/service-worker/sw.ts @@ -140,7 +140,7 @@ const cloneNotification = (notification: Notification): ClonedNotification => { // Object.assign() does not work with notifications for (k in notification) { - clone[k] = (notification as any)[k]; + clone[k] = notification[k as keyof Notification]; } return clone as ClonedNotification; diff --git a/packages/nicolium/src/stores/compose.ts b/packages/nicolium/src/stores/compose.ts index 6a82c6c5a..1c1fdaa13 100644 --- a/packages/nicolium/src/stores/compose.ts +++ b/packages/nicolium/src/stores/compose.ts @@ -806,8 +806,7 @@ const useSubmitCompose = (composeId: string) => { }; if (compose.editedId) { - // @ts-expect-error - params.media_attributes = media.map((item) => { + (params as EditStatusParams).media_attributes = media.map((item) => { const focalPoint = (item.type === 'image' || item.type === 'gifv') && item.meta?.focus; const focus = focalPoint ? `${focalPoint.x.toFixed(2)},${focalPoint.y.toFixed(2)}` diff --git a/packages/nicolium/src/utils/is-mobile.ts b/packages/nicolium/src/utils/is-mobile.ts index e1376e96b..45df1171c 100644 --- a/packages/nicolium/src/utils/is-mobile.ts +++ b/packages/nicolium/src/utils/is-mobile.ts @@ -5,7 +5,7 @@ const LAYOUT_BREAKPOINT = 581; const isMobile = (width: number) => width <= LAYOUT_BREAKPOINT; /** Whether the device is iOS (best guess). */ -const iOS: boolean = /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream; +const iOS: boolean = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window); const userTouching = window.matchMedia('(pointer: coarse)'); diff --git a/packages/nicolium/src/utils/queries.ts b/packages/nicolium/src/utils/queries.ts index af66c5ea5..631b24320 100644 --- a/packages/nicolium/src/utils/queries.ts +++ b/packages/nicolium/src/utils/queries.ts @@ -83,7 +83,7 @@ const removePageItem = ( }; const paginateQueryData = (array: T[] | undefined) => - array?.reduce((resultArray: any, item: any, index: any) => { + array?.reduce((resultArray, item, index) => { const chunkIndex = Math.floor(index / 20); resultArray[chunkIndex] ??= []; @@ -103,10 +103,11 @@ const sortQueryData = ( const flattenedQueryData = flattenPages(nextResult); const sortedQueryData = flattenedQueryData?.toSorted(comparator); const paginatedPages = paginateQueryData(sortedQueryData); - const newPages = paginatedPages.map((page: T, idx: number) => ({ - ...prevResult.pages[idx], - result: page, - })); + const newPages = + paginatedPages?.map((page, idx) => ({ + ...prevResult.pages[idx], + result: page, + })) ?? []; nextResult.pages = newPages; return nextResult; diff --git a/packages/nicolium/src/utils/state.ts b/packages/nicolium/src/utils/state.ts index 75155e6b4..56e141a84 100644 --- a/packages/nicolium/src/utils/state.ts +++ b/packages/nicolium/src/utils/state.ts @@ -27,7 +27,7 @@ const isStandalone = (state: RootState): boolean => { return isURL(BuildConfig.BACKEND_URL) ? false : !isPrerendered && instanceFetchFailed; }; -const getHost = (url: any): string => { +const getHost = (url: string = ''): string => { try { return new URL(url).origin; } catch {