From 1399a391b6f99d84cf2c2c098eae7c26b9240b0b Mon Sep 17 00:00:00 2001 From: Chris Bongers Date: Thu, 16 Apr 2026 09:58:34 +0200 Subject: [PATCH] fix: new round of ts-strict fixes --- packages/webapp/components/KeywordManagement.spec.tsx | 2 ++ packages/webapp/components/PostSEOSchema.tsx | 2 +- packages/webapp/components/ProtectedPage.spec.tsx | 2 +- packages/webapp/components/footer/FooterPlusButton.tsx | 2 +- packages/webapp/components/footer/common.ts | 8 ++++++-- packages/webapp/components/history/reading.tsx | 2 +- packages/webapp/components/invite/Referral.tsx | 2 +- packages/webapp/components/layouts/CoresLayout.tsx | 2 +- packages/webapp/components/layouts/MainFeedPage.tsx | 2 +- .../webapp/components/layouts/PlusLayout/PlusHeader.tsx | 2 +- .../webapp/components/layouts/PlusLayout/PlusLayout.tsx | 2 +- .../SettingsLayout/Customization/DevCard/DevCardStep1.tsx | 2 +- .../layouts/SettingsLayout/FeedSettingsLayout.tsx | 2 +- .../SettingsLayout/Security/AccountLoginSection.tsx | 2 +- .../webapp/components/layouts/SettingsLayout/common.tsx | 2 +- packages/webapp/hooks/useWebappVersion.ts | 2 +- packages/webapp/lib/gameCenter.spec.ts | 1 + packages/webapp/pages/agents/ask/index.tsx | 2 +- packages/webapp/pages/settings/api.tsx | 2 +- packages/webapp/pages/settings/customization/devcard.tsx | 2 +- .../webapp/pages/settings/customization/gamification.tsx | 2 +- packages/webapp/pages/settings/privacy.tsx | 2 +- packages/webapp/pages/squads/discover/my.tsx | 2 +- packages/webapp/pages/squads/new.tsx | 2 +- 24 files changed, 30 insertions(+), 23 deletions(-) diff --git a/packages/webapp/components/KeywordManagement.spec.tsx b/packages/webapp/components/KeywordManagement.spec.tsx index 7daa81fbc06..69e54fb7a72 100644 --- a/packages/webapp/components/KeywordManagement.spec.tsx +++ b/packages/webapp/components/KeywordManagement.spec.tsx @@ -11,6 +11,7 @@ import { import type { FeedData } from '@dailydotdev/shared/src/graphql/feed'; import { KEYWORD_FEED_QUERY } from '@dailydotdev/shared/src/graphql/feed'; import type { Post } from '@dailydotdev/shared/src/graphql/posts'; +import { PostType } from '@dailydotdev/shared/src/graphql/posts'; import type { Connection } from '@dailydotdev/shared/src/graphql/common'; import type { MockedGraphQLResponse } from '@dailydotdev/shared/__tests__/helpers/graphql'; import { mockGraphQL } from '@dailydotdev/shared/__tests__/helpers/graphql'; @@ -39,6 +40,7 @@ const defaultFeedPage: Connection = { node: { id: '0e4005b2d3cf191f8c44c2718a457a1e', title: 'Learn SQL', + type: PostType.Article, image: 'https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/22fc3ac5cc3fedf281b6e4b46e8c0ba2', commentsPermalink: 'https://localhost:5002/posts/9CuRpr5NiEY5', diff --git a/packages/webapp/components/PostSEOSchema.tsx b/packages/webapp/components/PostSEOSchema.tsx index b132302feed..1092786c2c9 100644 --- a/packages/webapp/components/PostSEOSchema.tsx +++ b/packages/webapp/components/PostSEOSchema.tsx @@ -367,7 +367,7 @@ export interface PostSEOSchemaProps { export const PostSEOSchema = ({ post, topComments, -}: PostSEOSchemaProps): ReactElement => { +}: PostSEOSchemaProps): ReactElement | null => { if (!post) { return null; } diff --git a/packages/webapp/components/ProtectedPage.spec.tsx b/packages/webapp/components/ProtectedPage.spec.tsx index 4ef41008960..3b59a453d20 100644 --- a/packages/webapp/components/ProtectedPage.spec.tsx +++ b/packages/webapp/components/ProtectedPage.spec.tsx @@ -22,7 +22,7 @@ describe('ProtectedPage', () => { render( (); + const drawerRef = useRef(null); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const props = user ? { onClick: () => setIsDrawerOpen(true) } diff --git a/packages/webapp/components/footer/common.ts b/packages/webapp/components/footer/common.ts index 559fc30ff78..995354d3e35 100644 --- a/packages/webapp/components/footer/common.ts +++ b/packages/webapp/components/footer/common.ts @@ -18,8 +18,12 @@ export interface FooterNavBarContainerProps { export const getNavPath = ( path: FooterTab['path'], user: LoggedUser, -): string => { - return typeof path === 'string' ? path : path(user); +): string | undefined => { + if (typeof path === 'string') { + return path; + } + + return path?.(user); }; export const blurClasses = 'bg-blur-baseline backdrop-blur-[2.5rem]'; diff --git a/packages/webapp/components/history/reading.tsx b/packages/webapp/components/history/reading.tsx index cf0ac79fba6..04cff1b37e7 100644 --- a/packages/webapp/components/history/reading.tsx +++ b/packages/webapp/components/history/reading.tsx @@ -67,7 +67,7 @@ export function ReadingHistory(): ReactElement { /> {hasData && ( diff --git a/packages/webapp/components/invite/Referral.tsx b/packages/webapp/components/invite/Referral.tsx index 568b6dbb447..7cade7f550e 100644 --- a/packages/webapp/components/invite/Referral.tsx +++ b/packages/webapp/components/invite/Referral.tsx @@ -42,7 +42,7 @@ export function Referral({ useEffect(() => { if (isLoggedIn) { - router.push(redirectTo); + router.push(redirectTo ?? '/'); } // router is an unstable dependency diff --git a/packages/webapp/components/layouts/CoresLayout.tsx b/packages/webapp/components/layouts/CoresLayout.tsx index 2e93870d6ef..671fde7e6fe 100644 --- a/packages/webapp/components/layouts/CoresLayout.tsx +++ b/packages/webapp/components/layouts/CoresLayout.tsx @@ -20,7 +20,7 @@ import type { MainFeedPageProps } from './MainFeedPage'; export default function CoresLayout({ children, -}: MainFeedPageProps): ReactElement { +}: MainFeedPageProps): ReactElement | null { const isMobile = useViewSizeClient(ViewSize.MobileL); const { back, replace, push, isReady } = useRouter(); const { user, isAuthReady } = useAuthContext(); diff --git a/packages/webapp/components/layouts/MainFeedPage.tsx b/packages/webapp/components/layouts/MainFeedPage.tsx index 2e31f979452..48bce4199ea 100644 --- a/packages/webapp/components/layouts/MainFeedPage.tsx +++ b/packages/webapp/components/layouts/MainFeedPage.tsx @@ -73,7 +73,7 @@ export default function MainFeedPage({ const [feedName, setFeedName] = useState( getInternalFeedName(router?.pathname, { isMyFeed: isMyFeedURL }), ); - const [isSearchOn, setIsSearchOn] = useState(isFinderPage); + const [isSearchOn, setIsSearchOn] = useState(!!isFinderPage); useEffect(() => { const isMyFeed = router?.pathname === '/my-feed'; if (getShouldRedirect(isMyFeed, !!user)) { diff --git a/packages/webapp/components/layouts/PlusLayout/PlusHeader.tsx b/packages/webapp/components/layouts/PlusLayout/PlusHeader.tsx index 96efdfabe9a..9f8e21fc711 100644 --- a/packages/webapp/components/layouts/PlusLayout/PlusHeader.tsx +++ b/packages/webapp/components/layouts/PlusLayout/PlusHeader.tsx @@ -10,7 +10,7 @@ import { webappUrl } from '@dailydotdev/shared/src/lib/constants'; import { LogoWithPlus } from '@dailydotdev/shared/src/components/Logo'; import { useViewSize, ViewSize } from '@dailydotdev/shared/src/hooks'; -export const PlusHeader = (): ReactElement => { +export const PlusHeader = (): ReactElement | null => { const isMobile = useViewSize(ViewSize.MobileL); const { back, replace, isReady } = useRouter(); diff --git a/packages/webapp/components/layouts/PlusLayout/PlusLayout.tsx b/packages/webapp/components/layouts/PlusLayout/PlusLayout.tsx index 8ee1d1da5dd..bbcc7afee3b 100644 --- a/packages/webapp/components/layouts/PlusLayout/PlusLayout.tsx +++ b/packages/webapp/components/layouts/PlusLayout/PlusLayout.tsx @@ -15,7 +15,7 @@ import { PlusHeader } from './PlusHeader'; export default function PlusLayout({ children, -}: MainFeedPageProps): ReactElement { +}: MainFeedPageProps): ReactElement | null { const { user, isAuthReady } = useAuthContext(); const { growthbook } = useGrowthBookContext(); const router = useRouter(); diff --git a/packages/webapp/components/layouts/SettingsLayout/Customization/DevCard/DevCardStep1.tsx b/packages/webapp/components/layouts/SettingsLayout/Customization/DevCard/DevCardStep1.tsx index d0627e25d7f..3fe88b1a30c 100644 --- a/packages/webapp/components/layouts/SettingsLayout/Customization/DevCard/DevCardStep1.tsx +++ b/packages/webapp/components/layouts/SettingsLayout/Customization/DevCard/DevCardStep1.tsx @@ -39,7 +39,7 @@ export const DevCardStep1 = ({ onGenerateImage }: Step1Props): ReactElement => { return (
- + Generate your DevCard diff --git a/packages/webapp/components/layouts/SettingsLayout/FeedSettingsLayout.tsx b/packages/webapp/components/layouts/SettingsLayout/FeedSettingsLayout.tsx index 66b64eda59a..378a4514543 100644 --- a/packages/webapp/components/layouts/SettingsLayout/FeedSettingsLayout.tsx +++ b/packages/webapp/components/layouts/SettingsLayout/FeedSettingsLayout.tsx @@ -9,7 +9,7 @@ import { getSettingsLayout } from '.'; export const FeedSettingsLayout = ({ children }: PropsWithChildren) => { const { user } = useAuthContext(); const feedSettingsEditContext = useFeedSettingsEdit({ - feedSlugOrId: user.id, + feedSlugOrId: user!.id, }); return ( diff --git a/packages/webapp/components/layouts/SettingsLayout/Security/AccountLoginSection.tsx b/packages/webapp/components/layouts/SettingsLayout/Security/AccountLoginSection.tsx index 4c7a3cfdbd7..8605d49e237 100644 --- a/packages/webapp/components/layouts/SettingsLayout/Security/AccountLoginSection.tsx +++ b/packages/webapp/components/layouts/SettingsLayout/Security/AccountLoginSection.tsx @@ -42,7 +42,7 @@ function AccountLoginSection({ children, className, buttonVariant = ButtonVariant.Primary, -}: AccountLoginSectionProps): ReactElement { +}: AccountLoginSectionProps): ReactElement | null { if (!providers?.length) { return null; } diff --git a/packages/webapp/components/layouts/SettingsLayout/common.tsx b/packages/webapp/components/layouts/SettingsLayout/common.tsx index d2982dd6f8f..96763123a0c 100644 --- a/packages/webapp/components/layouts/SettingsLayout/common.tsx +++ b/packages/webapp/components/layouts/SettingsLayout/common.tsx @@ -43,7 +43,7 @@ export const CommonTextField = classed(TextField, { container: 'max-w-sm' }); export const AccountTextField = classed(CommonTextField, { container: 'mt-6' }); type SettingsSwitchProps = { - name?: string; + name: string; children: ReactNode; checked: boolean; onToggle: () => void; diff --git a/packages/webapp/hooks/useWebappVersion.ts b/packages/webapp/hooks/useWebappVersion.ts index 180e7e1c9b1..1ff9967253e 100644 --- a/packages/webapp/hooks/useWebappVersion.ts +++ b/packages/webapp/hooks/useWebappVersion.ts @@ -16,7 +16,7 @@ const getVersion = (query: ParsedUrlQuery): string | undefined => { return undefined; }; -export default function useWebappVersion(): string { +export default function useWebappVersion(): string | undefined { const { query } = useRouter(); const [version, setVersion] = useState(); diff --git a/packages/webapp/lib/gameCenter.spec.ts b/packages/webapp/lib/gameCenter.spec.ts index c7e66f2babc..4e5a8958520 100644 --- a/packages/webapp/lib/gameCenter.spec.ts +++ b/packages/webapp/lib/gameCenter.spec.ts @@ -77,6 +77,7 @@ describe('game center helpers', () => { xpInLevel: 150, xpToNextLevel: 250, }, + hasNewQuestRotations: false, currentStreak: 4, longestStreak: 9, daily: { diff --git a/packages/webapp/pages/agents/ask/index.tsx b/packages/webapp/pages/agents/ask/index.tsx index f89edda3fda..29871845809 100644 --- a/packages/webapp/pages/agents/ask/index.tsx +++ b/packages/webapp/pages/agents/ask/index.tsx @@ -169,7 +169,7 @@ const AskPage = (): ReactElement => { color={ButtonColor.Avocado} size={ButtonSize.Large} icon={} - onClick={(e) => { + onClick={(e: React.MouseEvent) => { if (!isLoggedIn) { e.preventDefault(); showLogin({ trigger: AuthTriggers.Plus }); diff --git a/packages/webapp/pages/settings/api.tsx b/packages/webapp/pages/settings/api.tsx index 608457b63c8..89fa8ebbcd1 100644 --- a/packages/webapp/pages/settings/api.tsx +++ b/packages/webapp/pages/settings/api.tsx @@ -673,7 +673,7 @@ const ApiAccessPage = (): ReactElement => { multiline={method.multilineCode} onCopy={() => handleCopy( - method.copyValue, + method.copyValue!, method.copySuccessMessage, ) } diff --git a/packages/webapp/pages/settings/customization/devcard.tsx b/packages/webapp/pages/settings/customization/devcard.tsx index 58dc8e8d2a9..700938fc55d 100644 --- a/packages/webapp/pages/settings/customization/devcard.tsx +++ b/packages/webapp/pages/settings/customization/devcard.tsx @@ -39,7 +39,7 @@ const seo: NextSeoProps = { }, }; -const Page = (): ReactElement => { +const Page = (): ReactElement | null => { const { completeAction, checkHasCompleted, isActionsFetched } = useActions(); const { user, loadingUser } = useAuthContext(); const isDevCardGenerated = checkHasCompleted(ActionType.DevCardGenerate); diff --git a/packages/webapp/pages/settings/customization/gamification.tsx b/packages/webapp/pages/settings/customization/gamification.tsx index 34b445a286a..072664b123f 100644 --- a/packages/webapp/pages/settings/customization/gamification.tsx +++ b/packages/webapp/pages/settings/customization/gamification.tsx @@ -16,7 +16,7 @@ import { defaultSeo } from '../../../next-seo'; import { getTemplatedTitle } from '../../../components/layouts/utils'; import { SettingsSwitch } from '../../../components/layouts/SettingsLayout/common'; -const GamificationSettingsPage = (): ReactElement => { +const GamificationSettingsPage = (): ReactElement | null => { const router = useRouter(); const { optOutLevelSystem, diff --git a/packages/webapp/pages/settings/privacy.tsx b/packages/webapp/pages/settings/privacy.tsx index 91a513614ab..d4c61e9ac64 100644 --- a/packages/webapp/pages/settings/privacy.tsx +++ b/packages/webapp/pages/settings/privacy.tsx @@ -28,7 +28,7 @@ const seo: NextSeoProps = { ...getPageSeoTitles('Privacy'), }; -const AccountInvitePage = (): ReactElement => { +const AccountInvitePage = (): ReactElement | null => { const router = useRouter(); const { saveCookies } = useConsentCookie(GdprConsentKey.Marketing); const { user, isAuthReady, isGdprCovered } = useAuthContext(); diff --git a/packages/webapp/pages/squads/discover/my.tsx b/packages/webapp/pages/squads/discover/my.tsx index f5ecf8083f6..694b8b2fa41 100644 --- a/packages/webapp/pages/squads/discover/my.tsx +++ b/packages/webapp/pages/squads/discover/my.tsx @@ -25,7 +25,7 @@ import { mainFeedLayoutProps } from '../../../components/layouts/MainFeedPage'; import { SquadDirectoryLayout } from '../../../../shared/src/components/squads/layout/SquadDirectoryLayout'; import { defaultSeo } from '../../../next-seo'; -function MySquadsPage(): ReactElement { +function MySquadsPage(): ReactElement | null { const { count, isModeratorInAnySquad } = useSquadPendingPosts(); const { squads } = useAuthContext(); const router = useRouter(); diff --git a/packages/webapp/pages/squads/new.tsx b/packages/webapp/pages/squads/new.tsx index 097a3910bb8..d4b3d7cc3ba 100644 --- a/packages/webapp/pages/squads/new.tsx +++ b/packages/webapp/pages/squads/new.tsx @@ -50,7 +50,7 @@ const NewSquad = (): ReactElement => { await onSave({ channelId: selectedChannel, integrationId, - sourceId: squad.id, + sourceId: squad.id!, }); }