|
1 | | -import React, { |
| 1 | +import { |
2 | 2 | createContext, useState, useReducer, useMemo, |
3 | 3 | } from 'react'; |
4 | 4 | import PropTypes from 'prop-types'; |
5 | 5 |
|
6 | | -import selectedRowsReducer from './data/reducer'; |
| 6 | +import selectedRowsReducer, { Action, SelectedRow } from './data/reducer'; |
7 | 7 |
|
8 | | -export const BulkEnrollContext = createContext({}); |
| 8 | +export type Subscription = { |
| 9 | + uuid: string; |
| 10 | + enterpriseCatalogUuid: string; |
| 11 | +}; |
| 12 | + |
| 13 | +export type BulkEnrollContextValue = { |
| 14 | + courses: [SelectedRow[], React.Dispatch<Action>], |
| 15 | + emails: [SelectedRow[], React.Dispatch<Action>], |
| 16 | + subscription: [Subscription | null, React.Dispatch<React.SetStateAction<Subscription>>], |
| 17 | +}; |
| 18 | + |
| 19 | +export const BulkEnrollContext = createContext<BulkEnrollContextValue>({ |
| 20 | + courses: [[], () => {}], |
| 21 | + emails: [[], () => {}], |
| 22 | + subscription: [null, () => {}], |
| 23 | +}); |
9 | 24 |
|
10 | | -const BulkEnrollContextProvider = ({ children, initialEmailsList }) => { |
| 25 | +interface BulkEnrollContextProviderProps { |
| 26 | + children: React.ReactNode; |
| 27 | + initialEmailsList?: string[]; |
| 28 | +} |
| 29 | + |
| 30 | +const BulkEnrollContextProvider: React.FC<BulkEnrollContextProviderProps> = ({ children, initialEmailsList = [] }) => { |
11 | 31 | const [selectedCourses, coursesDispatch] = useReducer(selectedRowsReducer, []); |
12 | 32 | // this format is to make this consistent with the format used by ReviewStep components |
13 | 33 | // similar to DataTable row objects, but not exactly |
14 | | - const formattedEmailsList = initialEmailsList.map(email => ({ |
| 34 | + const formattedEmailsList: SelectedRow[] = initialEmailsList.map(email => ({ |
15 | 35 | id: email, |
16 | 36 | values: { |
17 | 37 | userEmail: email, |
18 | 38 | }, |
19 | 39 | })); |
20 | 40 | const [selectedEmails, emailsDispatch] = useReducer(selectedRowsReducer, formattedEmailsList); |
21 | | - const [selectedSubscription, setSelectedSubscription] = useState({}); |
| 41 | + const [selectedSubscription, setSelectedSubscription] = useState<Subscription>(); |
22 | 42 |
|
23 | 43 | const contextValue = useMemo( |
24 | 44 | () => ({ |
25 | 45 | courses: [selectedCourses, coursesDispatch], |
26 | 46 | emails: [selectedEmails, emailsDispatch], |
27 | 47 | subscription: [selectedSubscription, setSelectedSubscription], |
28 | | - }), |
| 48 | + } as BulkEnrollContextValue), |
29 | 49 | [selectedCourses, selectedEmails, selectedSubscription], |
30 | 50 | ); |
31 | 51 |
|
32 | 52 | return <BulkEnrollContext.Provider value={contextValue}>{children}</BulkEnrollContext.Provider>; |
33 | 53 | }; |
34 | 54 |
|
35 | | -BulkEnrollContextProvider.defaultProps = { |
36 | | - initialEmailsList: [], |
37 | | -}; |
38 | | - |
39 | 55 | BulkEnrollContextProvider.propTypes = { |
40 | 56 | children: PropTypes.node.isRequired, |
41 | | - initialEmailsList: PropTypes.arrayOf(PropTypes.string), |
| 57 | + initialEmailsList: PropTypes.arrayOf(PropTypes.string.isRequired), |
42 | 58 | }; |
43 | 59 |
|
44 | 60 | export default BulkEnrollContextProvider; |
0 commit comments