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);