diff --git a/src/app/pages/404/404.js b/src/app/pages/404/404.tsx similarity index 100% rename from src/app/pages/404/404.js rename to src/app/pages/404/404.tsx diff --git a/src/app/pages/a-page-template/a-page-template.js b/src/app/pages/a-page-template/a-page-template.tsx similarity index 77% rename from src/app/pages/a-page-template/a-page-template.js rename to src/app/pages/a-page-template/a-page-template.tsx index d823f5181..5019c92ae 100644 --- a/src/app/pages/a-page-template/a-page-template.js +++ b/src/app/pages/a-page-template/a-page-template.tsx @@ -4,10 +4,14 @@ import './a-page-template.scss'; const slug = 'books/biology-2e'; -function Pagename({data: {heading}}) { +type PageData = { + heading: string; +}; + +function Pagename({data}: {data: PageData}) { return (
-

{heading}

+

{data.heading}

); } diff --git a/src/app/pages/partners/partner-details/info-request-form/school-selector.js b/src/app/pages/partners/partner-details/info-request-form/school-selector.tsx similarity index 68% rename from src/app/pages/partners/partner-details/info-request-form/school-selector.js rename to src/app/pages/partners/partner-details/info-request-form/school-selector.tsx index c71392017..551f51cff 100644 --- a/src/app/pages/partners/partner-details/info-request-form/school-selector.js +++ b/src/app/pages/partners/partner-details/info-request-form/school-selector.tsx @@ -2,8 +2,7 @@ import React from 'react'; import useMatchingSchools from '~/models/use-school-suggestion-list'; import {FilteringSelect} from '~/components/form-elements/form-elements'; -// Left as JS because I couldn't get the tests to cover these -export default function SchoolSelector({value, setValue}) { +export default function SchoolSelector({value, setValue}: {value: string; setValue: (value: string) => void}) { const {schoolIsOk, schoolOptions} = useMatchingSchools(value); return ( @@ -18,17 +17,17 @@ export default function SchoolSelector({value, setValue}) { required: true, value, autoComplete: 'off', - onChange({target}) {setValue(target.value);} + onChange({target}: React.ChangeEvent) {setValue(target.value);} }} - accept={(option) => setValue(option.value)} + accept={(option: {value: string}) => setValue(option.value)} accepted={schoolIsOk} /> ); } -export function useDoSubmit(afterSubmit) { - return React.useCallback((form) => { +export function useDoSubmit(afterSubmit: () => void) { + return React.useCallback((form: HTMLFormElement) => { form.submit(); afterSubmit(); }, [afterSubmit]); diff --git a/src/app/pages/press/testimonials/testimonials.js b/src/app/pages/press/testimonials/testimonials.tsx similarity index 74% rename from src/app/pages/press/testimonials/testimonials.js rename to src/app/pages/press/testimonials/testimonials.tsx index f875089ab..253a542e1 100644 --- a/src/app/pages/press/testimonials/testimonials.js +++ b/src/app/pages/press/testimonials/testimonials.tsx @@ -4,7 +4,20 @@ import ClippedImage from '~/components/clipped-image/clipped-image'; import Carousel from '~/components/carousel/carousel'; import './testimonials.scss'; -function Card({data: {image, testimonial}}) { +type ImageData = { + file: string; + title: string; +}; + +type TestimonialData = { + image?: ImageData; + testimonial: string; + description: string; +}; + +function Card({data}: {data: TestimonialData}) { + const {image, testimonial} = data; + return (
@@ -24,7 +37,7 @@ export default function Testimonials() {

Making an impact

- {testimonials.map((c) => ( + {testimonials.map((c: TestimonialData) => ( ))} diff --git a/src/app/pages/subjects/new/language-selector-section.js b/src/app/pages/subjects/new/language-selector-section.tsx similarity index 86% rename from src/app/pages/subjects/new/language-selector-section.js rename to src/app/pages/subjects/new/language-selector-section.tsx index ba2ff4e8e..ab5a9f7c2 100644 --- a/src/app/pages/subjects/new/language-selector-section.js +++ b/src/app/pages/subjects/new/language-selector-section.tsx @@ -2,7 +2,7 @@ import React from 'react'; import LanguageSelector from '~/components/language-selector/language-selector'; import {FormattedMessage} from 'react-intl'; -export default function LanguageSelectorSection(props) { +export default function LanguageSelectorSection(props: Record) { return (
diff --git a/src/app/pages/subjects/new/use-categorized-books.js b/src/app/pages/subjects/new/use-categorized-books.tsx similarity index 63% rename from src/app/pages/subjects/new/use-categorized-books.js rename to src/app/pages/subjects/new/use-categorized-books.tsx index 8099169ff..f5a2625d0 100644 --- a/src/app/pages/subjects/new/use-categorized-books.js +++ b/src/app/pages/subjects/new/use-categorized-books.tsx @@ -1,10 +1,20 @@ import useSubjectsContext from './context'; import useSubjectCategoryContext from '~/contexts/subject-category'; -export default function useCategorizedBooks() { +type Book = { + subjects: string[]; +}; + +type CategoryWithBooks = Book[] & { + label?: string; +}; + +type CategorizedBooks = Record; + +export default function useCategorizedBooks(): CategorizedBooks { const {books} = useSubjectsContext(); const categories = useSubjectCategoryContext(); - const result = {}; + const result: CategorizedBooks = {}; const addLabels = () => { for (const category of categories) { if (result[category.cms]) { @@ -14,9 +24,9 @@ export default function useCategorizedBooks() { }; for (const book of books) { - book.subjects.forEach((cmsCategory) => { + book.subjects.forEach((cmsCategory: string) => { if (!(cmsCategory in result)) { - result[cmsCategory] = []; + result[cmsCategory] = [] as CategoryWithBooks; } if (!result[cmsCategory].includes(book)) { result[cmsCategory].push(book);