From 78f4a00e689669429cdd8e5b97783d37852edcdb Mon Sep 17 00:00:00 2001 From: Chris Bongers Date: Thu, 16 Apr 2026 10:41:01 +0200 Subject: [PATCH 1/2] fix: new round of ts-strict fixes --- .../shared/src/hooks/bookmark/useBookmarkFolder.ts | 4 ++-- .../shared/src/hooks/integrations/slack/useSlack.ts | 4 ++-- .../shared/src/hooks/post/usePostCodeSnippets.ts | 6 +----- packages/shared/src/hooks/post/usePostImage.ts | 6 +++--- packages/shared/src/hooks/post/useRelatedPosts.ts | 4 ++-- packages/shared/src/hooks/post/useViewPost.ts | 12 +++++++----- packages/shared/src/hooks/profile/useDevCard.ts | 6 +++--- packages/shared/src/hooks/profile/useProfile.ts | 4 ++-- .../src/hooks/source/useSourcePostModerationById.ts | 4 ++-- .../shared/src/hooks/streaks/useReadingStreak.ts | 4 ++-- packages/shared/src/hooks/useCheckCoresRole.ts | 4 ++-- packages/shared/src/hooks/useDebounceFn.ts | 4 ++-- packages/shared/src/hooks/useDeleteSquad.ts | 6 +++--- packages/shared/src/hooks/useLeaveSquad.ts | 6 +++--- 14 files changed, 36 insertions(+), 38 deletions(-) diff --git a/packages/shared/src/hooks/bookmark/useBookmarkFolder.ts b/packages/shared/src/hooks/bookmark/useBookmarkFolder.ts index dd9b0801b14..d6d620b3f99 100644 --- a/packages/shared/src/hooks/bookmark/useBookmarkFolder.ts +++ b/packages/shared/src/hooks/bookmark/useBookmarkFolder.ts @@ -18,7 +18,7 @@ interface UseBookmarkFolder { query: { isPending: boolean; isReady: boolean; - folder: BookmarkFolder; + folder?: BookmarkFolder; }; update: { isPending: boolean; @@ -62,7 +62,7 @@ export const useBookmarkFolder = ({ logEvent({ event_name: LogEvent.RenameBookmarkFolder, - target_id: folder.id, + target_id: folder!.id, }); }, onError: () => { diff --git a/packages/shared/src/hooks/integrations/slack/useSlack.ts b/packages/shared/src/hooks/integrations/slack/useSlack.ts index b4653085f38..e2160c95814 100644 --- a/packages/shared/src/hooks/integrations/slack/useSlack.ts +++ b/packages/shared/src/hooks/integrations/slack/useSlack.ts @@ -37,11 +37,11 @@ export const useSlack = (): UseSlack => { const redirectUrl = new URL(`${apiUrl}/integrations/slack/auth/callback`); url.searchParams.append('redirect_uri', redirectUrl.toString()); - url.searchParams.append('state', user.id); + url.searchParams.append('state', user!.id); url.searchParams.append('scope', scopes.join(',')); url.searchParams.append( 'client_id', - process.env.NEXT_PUBLIC_SLACK_CLIENT_ID, + process.env.NEXT_PUBLIC_SLACK_CLIENT_ID!, ); setCookie('slackRedirectPath', redirectPath, { diff --git a/packages/shared/src/hooks/post/usePostCodeSnippets.ts b/packages/shared/src/hooks/post/usePostCodeSnippets.ts index d0bdc4df9d4..990a0cdb312 100644 --- a/packages/shared/src/hooks/post/usePostCodeSnippets.ts +++ b/packages/shared/src/hooks/post/usePostCodeSnippets.ts @@ -42,7 +42,7 @@ export const usePostCodeSnippetsQuery = ({ const enabled = !!postId; const queryResult = useInfiniteQuery({ - queryKey: generateQueryKey(RequestKey.PostCodeSnippets, null, { + queryKey: generateQueryKey(RequestKey.PostCodeSnippets, undefined, { id: postId, }), queryFn: async ({ pageParam }) => { @@ -65,10 +65,6 @@ export const usePostCodeSnippetsQuery = ({ : enabled, getNextPageParam: (lastPage) => getNextPageParam(lastPage?.pageInfo), select: useCallback((data: InfiniteData) => { - if (!data) { - return undefined; - } - return { ...data, // filter out last page with no edges returned by api paginator diff --git a/packages/shared/src/hooks/post/usePostImage.ts b/packages/shared/src/hooks/post/usePostImage.ts index 2f0d0c79483..f15b9b3d5a3 100644 --- a/packages/shared/src/hooks/post/usePostImage.ts +++ b/packages/shared/src/hooks/post/usePostImage.ts @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { PostType } from '../../graphql/posts'; import type { Post } from '../../graphql/posts'; -export const usePostImage = (post: Post): string => +export const usePostImage = (post: Post): string | undefined => useMemo(() => { if (post?.type === PostType.SocialTwitter && post?.subType === 'thread') { return undefined; @@ -15,10 +15,10 @@ export const usePostImage = (post: Post): string => } const parser = new DOMParser(); - const doc = parser.parseFromString(post?.contentHtml, 'text/html'); + const doc = parser.parseFromString(post?.contentHtml ?? '', 'text/html'); const imgTag = doc.querySelector('img'); if (imgTag) { - return imgTag.getAttribute('src'); + return imgTag.getAttribute('src') ?? undefined; } return undefined; diff --git a/packages/shared/src/hooks/post/useRelatedPosts.ts b/packages/shared/src/hooks/post/useRelatedPosts.ts index 1be7f001b84..4ae674affc8 100644 --- a/packages/shared/src/hooks/post/useRelatedPosts.ts +++ b/packages/shared/src/hooks/post/useRelatedPosts.ts @@ -29,7 +29,7 @@ export type UseRelatedPostsProps = { type RelatedPostsQueryData = Connection; export type UseRelatedPosts = { - relatedPosts: InfiniteData; + relatedPosts?: InfiniteData; isLoading: boolean; hasNextPage: boolean; fetchNextPage: UseInfiniteQueryResult['fetchNextPage']; @@ -51,7 +51,7 @@ export const useRelatedPosts = ({ fetchNextPage, isFetchingNextPage, } = useInfiniteQuery({ - queryKey: generateQueryKey(RequestKey.RelatedPosts, null, { + queryKey: generateQueryKey(RequestKey.RelatedPosts, undefined, { id: postId, type: relationType, }), diff --git a/packages/shared/src/hooks/post/useViewPost.ts b/packages/shared/src/hooks/post/useViewPost.ts index 7c9bf2f0188..0c60c632a72 100644 --- a/packages/shared/src/hooks/post/useViewPost.ts +++ b/packages/shared/src/hooks/post/useViewPost.ts @@ -20,11 +20,13 @@ export const useViewPost = (): UseMutateAsyncFunction< onSuccess: async () => { const streak = client.getQueryData(streakKey); const isNewStreak = !streak?.lastViewAt; - const isFirstViewToday = !isSameDayInTimezone( - new Date(streak?.lastViewAt), - new Date(), - user.timezone, - ); + const isFirstViewToday = + !isNewStreak && + !isSameDayInTimezone( + new Date(streak!.lastViewAt!), + new Date(), + user!.timezone, + ); if (isNewStreak || isFirstViewToday) { await client.refetchQueries({ queryKey: streakKey }); diff --git a/packages/shared/src/hooks/profile/useDevCard.ts b/packages/shared/src/hooks/profile/useDevCard.ts index bebac7942a1..2e83e72e853 100644 --- a/packages/shared/src/hooks/profile/useDevCard.ts +++ b/packages/shared/src/hooks/profile/useDevCard.ts @@ -31,7 +31,7 @@ export interface DevCardQueryData { } export interface UseDevCard { - devcard: DevCardData; + devcard: Partial & { streak: { max: number } }; isLoading: boolean; coverImage: string; } @@ -53,13 +53,13 @@ export const useDevCard = (userId: string): UseDevCard => { const { isProfileCover, user } = devCard ?? {}; const coverImage = - (isProfileCover ? user.cover : undefined) ?? + (isProfileCover ? user!.cover : undefined) ?? cloudinaryDevcardDefaultCoverImage; return { devcard: { ...devCard, - streak: { ...userStreakProfile }, + streak: { max: userStreakProfile?.max ?? 0 }, }, isLoading, coverImage, diff --git a/packages/shared/src/hooks/profile/useProfile.ts b/packages/shared/src/hooks/profile/useProfile.ts index 614089cb6c6..d65d2dfdc46 100644 --- a/packages/shared/src/hooks/profile/useProfile.ts +++ b/packages/shared/src/hooks/profile/useProfile.ts @@ -16,7 +16,7 @@ export function useProfile(initialUser?: PublicProfile): { }); const { data: user } = useQuery({ queryKey: userQueryKey, - queryFn: () => getProfile(initialUser?.id), + queryFn: () => getProfile(initialUser!.id), ...disabledRefetch, staleTime: StaleTime.OneHour, initialData: initialUser, @@ -24,7 +24,7 @@ export function useProfile(initialUser?: PublicProfile): { }); return { - user, + user: user!, userQueryKey, isUserSame: !!(loggedUser && loggedUser?.id === initialUser?.id), }; diff --git a/packages/shared/src/hooks/source/useSourcePostModerationById.ts b/packages/shared/src/hooks/source/useSourcePostModerationById.ts index 06ad5111570..2543446cb37 100644 --- a/packages/shared/src/hooks/source/useSourcePostModerationById.ts +++ b/packages/shared/src/hooks/source/useSourcePostModerationById.ts @@ -5,7 +5,7 @@ import { useAuthContext } from '../../contexts/AuthContext'; import { getSourcePostModeration } from '../../graphql/posts'; interface UseSourcePostModerationById { - moderated: SourcePostModeration; + moderated?: SourcePostModeration; isLoading: boolean; } @@ -21,7 +21,7 @@ export const useSourcePostModerationById = ({ const { user } = useAuthContext(); const { data, isLoading } = useQuery({ queryKey: generateQueryKey(RequestKey.SourcePostModeration, user, id), - queryFn: () => getSourcePostModeration({ id }), + queryFn: () => getSourcePostModeration({ id: id! }), enabled: !!id && enabled, }); diff --git a/packages/shared/src/hooks/streaks/useReadingStreak.ts b/packages/shared/src/hooks/streaks/useReadingStreak.ts index c2b65554c5f..310eee2f413 100644 --- a/packages/shared/src/hooks/streaks/useReadingStreak.ts +++ b/packages/shared/src/hooks/streaks/useReadingStreak.ts @@ -20,7 +20,7 @@ type UpdateReadingStreakConfig = { }; interface UserReadingStreak { - streak: UserStreak; + streak?: UserStreak; isLoading: boolean; isUpdatingConfig: boolean; checkReadingStreak: () => void; @@ -67,7 +67,7 @@ export const useReadingStreak = (): UserReadingStreak => { isSameDayInTimezone( new Date(streak.lastViewAt), new Date(), - user.timezone, + user!.timezone, ); if (!hasReadToday) { diff --git a/packages/shared/src/hooks/useCheckCoresRole.ts b/packages/shared/src/hooks/useCheckCoresRole.ts index bf9da1d1d26..cede61a5b57 100644 --- a/packages/shared/src/hooks/useCheckCoresRole.ts +++ b/packages/shared/src/hooks/useCheckCoresRole.ts @@ -19,9 +19,9 @@ export const useCheckCoresRole = (): void => { checkCoresRole: Pick; }>(CHECK_CORES_ROLE_QUERY); - if (result.checkCoresRole.coresRole !== user.coresRole) { + if (result.checkCoresRole.coresRole !== user!.coresRole) { await updateUser({ - ...user, + ...user!, coresRole: result.checkCoresRole.coresRole, }); } diff --git a/packages/shared/src/hooks/useDebounceFn.ts b/packages/shared/src/hooks/useDebounceFn.ts index a9f7cd76906..07409a0651c 100644 --- a/packages/shared/src/hooks/useDebounceFn.ts +++ b/packages/shared/src/hooks/useDebounceFn.ts @@ -35,7 +35,7 @@ export default function useDebounceFn( } timeoutRef.current = window.setTimeout(() => { lastExecutionRef.current = new Date(); - timeoutRef.current = null; + timeoutRef.current = undefined; callbackRef.current?.(args); }, delay); }, @@ -45,7 +45,7 @@ export default function useDebounceFn( const cancelCallback = useCallback(() => { if (timeoutRef.current) { window.clearTimeout(timeoutRef.current); - timeoutRef.current = null; + timeoutRef.current = undefined; } }, [timeoutRef]); diff --git a/packages/shared/src/hooks/useDeleteSquad.ts b/packages/shared/src/hooks/useDeleteSquad.ts index 1b9830e011c..b48d6dbc826 100644 --- a/packages/shared/src/hooks/useDeleteSquad.ts +++ b/packages/shared/src/hooks/useDeleteSquad.ts @@ -41,10 +41,10 @@ export const useDeleteSquad = ({ if (await showPrompt(options)) { logEvent({ event_name: LogEvent.DeleteSquad, - extra: JSON.stringify({ squad: squad.id }), + extra: JSON.stringify({ squad: squad.id! }), }); - await deleteSquad(squad.id); - deleteCachedSquad(squad.id); + await deleteSquad(squad.id!); + deleteCachedSquad(squad.id!); await callback?.(); } }; diff --git a/packages/shared/src/hooks/useLeaveSquad.ts b/packages/shared/src/hooks/useLeaveSquad.ts index eb867f852a2..7843540acd0 100644 --- a/packages/shared/src/hooks/useLeaveSquad.ts +++ b/packages/shared/src/hooks/useLeaveSquad.ts @@ -45,10 +45,10 @@ export const useLeaveSquad = ({ squad }: UseLeaveSquadProps): UseLeaveSquad => { if (left) { logEvent({ event_name: LogEvent.LeaveSquad, - extra: JSON.stringify({ squad: squad.id }), + extra: JSON.stringify({ squad: squad.id! }), }); - await leaveSquad(squad.id); - deleteCachedSquad(squad.id); + await leaveSquad(squad.id!); + deleteCachedSquad(squad.id!); queryClient.setQueryData( generateQueryKey(RequestKey.ContentPreference, user, { From ae55b9d2a6230d124db74a1227251077c6766815 Mon Sep 17 00:00:00 2001 From: Chris Bongers Date: Thu, 16 Apr 2026 10:48:09 +0200 Subject: [PATCH 2/2] fix: new round of ts-strict fixes --- packages/shared/src/hooks/integrations/slack/useSlack.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/src/hooks/integrations/slack/useSlack.ts b/packages/shared/src/hooks/integrations/slack/useSlack.ts index e2160c95814..e62f7a99059 100644 --- a/packages/shared/src/hooks/integrations/slack/useSlack.ts +++ b/packages/shared/src/hooks/integrations/slack/useSlack.ts @@ -54,7 +54,7 @@ export const useSlack = (): UseSlack => { window.location.href = url.toString(); }, - [user?.id], + [user], ); const connectSource = useCallback(