diff --git a/renovate.json b/renovate.json index 78358eff..2561e9c4 100644 --- a/renovate.json +++ b/renovate.json @@ -15,14 +15,10 @@ "matchManagers": ["npm"], "matchPackageNames": [ "@openfun/cunningham-react", - "@types/react", - "@types/react-dom", "eslint", "fetch-mock", "node", "node-fetch", - "react", - "react-dom", "workbox-webpack-plugin" ] } diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index e40d229f..2873b122 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -60,7 +60,7 @@ "@types/lodash": "4.17.16", "@types/luxon": "3.4.2", "@types/node": "*", - "@types/react": "18.3.12", + "@types/react": "*", "@types/react-dom": "*", "cross-env": "7.0.3", "dotenv": "16.4.7", diff --git a/src/frontend/apps/impress/src/components/Box.tsx b/src/frontend/apps/impress/src/components/Box.tsx index 61eb50f1..80a8a69e 100644 --- a/src/frontend/apps/impress/src/components/Box.tsx +++ b/src/frontend/apps/impress/src/components/Box.tsx @@ -1,4 +1,4 @@ -import { ComponentPropsWithRef, ReactHTML } from 'react'; +import { ComponentPropsWithRef, HTMLElementType } from 'react'; import styled from 'styled-components'; import { CSSProperties, RuleSet } from 'styled-components/dist/types'; @@ -11,7 +11,7 @@ import { import { hideEffect, showEffect } from './Effect'; export interface BoxProps { - as?: keyof ReactHTML; + as?: HTMLElementType; $align?: CSSProperties['alignItems']; $background?: CSSProperties['background']; $color?: CSSProperties['color']; diff --git a/src/frontend/apps/impress/src/components/Text.tsx b/src/frontend/apps/impress/src/components/Text.tsx index 89a52985..bc7dec46 100644 --- a/src/frontend/apps/impress/src/components/Text.tsx +++ b/src/frontend/apps/impress/src/components/Text.tsx @@ -1,9 +1,4 @@ -import { - CSSProperties, - ComponentPropsWithRef, - ReactHTML, - forwardRef, -} from 'react'; +import { CSSProperties, ComponentPropsWithRef, forwardRef } from 'react'; import styled from 'styled-components'; import { tokens } from '@/cunningham'; @@ -14,10 +9,7 @@ const { sizes } = tokens.themes.default.theme.font; type TextSizes = keyof typeof sizes; export interface TextProps extends BoxProps { - as?: keyof Pick< - ReactHTML, - 'p' | 'span' | 'div' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' - >; + as?: 'p' | 'span' | 'div' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; $elipsis?: boolean; $isMaterialIcon?: boolean; $weight?: CSSProperties['fontWeight']; diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx index e8e5d4f2..4d9e340b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx @@ -5,7 +5,7 @@ import { getFormattingToolbarItems, useDictionary, } from '@blocknote/react'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { JSX, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { getQuoteFormattingToolbarItems } from '../custom-blocks'; @@ -27,7 +27,11 @@ export const BlockNoteToolbar = () => { getQuoteFormattingToolbarItems(t), ]); const fileDownloadButtonIndex = toolbarItems.findIndex( - (item) => item.key === 'fileDownloadButton', + (item) => + typeof item === 'object' && + item !== null && + 'key' in item && + (item as { key: string }).key === 'fileDownloadButton', ); if (fileDownloadButtonIndex !== -1) { toolbarItems.splice( @@ -43,7 +47,7 @@ export const BlockNoteToolbar = () => { ); } - return toolbarItems; + return toolbarItems as JSX.Element[]; }, [dict, t]); const formattingToolbar = useCallback(() => { diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx index ca1ed005..51ef6350 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx @@ -66,7 +66,7 @@ const useSaveDoc = (docId: string, doc: Y.Doc, canSave: boolean) => { }); }, [doc, docId, updateDoc]); - const timeout = useRef(); + const timeout = useRef(null); const router = useRouter(); useEffect(() => { @@ -101,7 +101,10 @@ const useSaveDoc = (docId: string, doc: Y.Doc, canSave: boolean) => { router.events.on('routeChangeStart', onSave); return () => { - clearTimeout(timeout.current); + if (timeout.current) { + clearTimeout(timeout.current); + } + removeEventListener('beforeunload', onSave); router.events.off('routeChangeStart', onSave); }; diff --git a/src/frontend/package.json b/src/frontend/package.json index 794713ee..44efdba6 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -34,12 +34,13 @@ "@blocknote/xl-docx-exporter": "0.23.2-hotfix.0", "@blocknote/xl-pdf-exporter": "0.23.2-hotfix.0", "@types/node": "22.13.9", - "@types/react-dom": "18.3.1", + "@types/react": "19.0.0", + "@types/react-dom": "19.0.0", "@typescript-eslint/eslint-plugin": "8.26.0", "@typescript-eslint/parser": "8.26.0", "eslint": "8.57.0", - "react": "18.3.1", - "react-dom": "18.3.1", + "react": "19.0.0", + "react-dom": "19.0.0", "typescript": "5.8.2", "yjs": "13.6.23" } diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index b39f1b34..8c65d27e 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -5122,11 +5122,6 @@ pg-protocol "*" pg-types "^2.2.0" -"@types/prop-types@*": - version "15.7.14" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" - integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== - "@types/qs@*": version "6.9.18" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" @@ -5137,10 +5132,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@18.3.1": - version "18.3.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" - integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== +"@types/react-dom@*", "@types/react-dom@19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.0.0.tgz#e7f5d618a080486eaf9952246dbf59eaa2c64130" + integrity sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w== dependencies: "@types/react" "*" @@ -5156,21 +5151,13 @@ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*": - version "19.0.8" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" - integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== +"@types/react@*", "@types/react@19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.0.tgz#fbbb53ce223f4e2b750ad5dd09580b2c43522bbf" + integrity sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg== dependencies: csstype "^3.0.2" -"@types/react@18.3.12": - version "18.3.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" - integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" @@ -9989,7 +9976,7 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -11870,13 +11857,12 @@ react-aria@^3.34.2, react-aria@^3.37.0: "@react-aria/visually-hidden" "^3.8.19" "@react-types/shared" "^3.27.0" -react-dom@*, react-dom@18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +react-dom@*, react-dom@18.3.1, react-dom@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" + integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" + scheduler "^0.25.0" react-i18next@15.4.1: version "15.4.1" @@ -12057,12 +12043,10 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, react@18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" +react@*, react@18.3.1, react@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" + integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== readable-stream@^3.4.0: version "3.6.2" @@ -12514,12 +12498,10 @@ scheduler@0.25.0-rc-603e6108-20241029: resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz#684dd96647e104d23e0d29a37f18937daf82df19" integrity sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA== -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" +scheduler@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" + integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== schema-utils@^4.3.0: version "4.3.0"