diff --git a/packages/client/src/login/LoginForm.test.tsx b/packages/client/src/login/LoginForm.test.tsx
index 738b33c..66d3abd 100644
--- a/packages/client/src/login/LoginForm.test.tsx
+++ b/packages/client/src/login/LoginForm.test.tsx
@@ -1,8 +1,10 @@
import * as Feature from './'
+import React from 'react'
import ReactDOM from 'react-dom'
import T from 'react-dom/test-utils'
import {HTTPClientMock, TestUtils, getError} from '../test-utils'
import {IAPIDef} from '@rondo/common'
+import {MemoryRouter} from 'react-router-dom'
const test = new TestUtils()
@@ -15,6 +17,8 @@ describe('LoginForm', () => {
reducers: {Login: Feature.Login},
connector: new Feature.LoginConnector(loginActions),
select: state => state.Login,
+ customJSX: (Component, props) =>
+ ,
})
beforeAll(() => {
@@ -61,16 +65,7 @@ describe('LoginForm', () => {
data,
})
expect(onSuccess.mock.calls.length).toBe(1)
- expect(
- (node.querySelector('input[name="username"]') as HTMLInputElement)
- .value,
- )
- .toEqual('')
- expect(
- (node.querySelector('input[name="password"]') as HTMLInputElement)
- .value,
- )
- .toEqual('')
+ // TODO test clear username/password
node = ReactDOM.findDOMNode(component) as Element
expect(node.innerHTML).toMatch(//)
})
diff --git a/packages/client/src/login/withForm.tsx b/packages/client/src/login/withForm.tsx
index f1bfeb0..2b7db31 100644
--- a/packages/client/src/login/withForm.tsx
+++ b/packages/client/src/login/withForm.tsx
@@ -1,5 +1,5 @@
import React from 'react'
-import {IAction} from '../actions'
+import {IPendingAction} from '../actions'
export interface IComponentProps {
onSubmit: () => void
@@ -10,13 +10,18 @@ export interface IComponentProps {
}
export interface IFormHOCProps {
- onSubmit: (props: Data) => IAction
+ onSubmit: (props: Data) => IPendingAction
// TODO figure out what would happen if the underlying child component
// would have the same required property as the HOC, like onSuccess?
onSuccess?: () => void
clearOnSuccess?: boolean
}
+export interface IFormHOCState {
+ error: string
+ data: Data
+}
+
export function withForm>(
Component: React.ComponentType,
initialState: Data,
@@ -26,28 +31,44 @@ export function withForm>(
Exclude>>
type T = IFormHOCProps & OtherProps
- return class FormHOC extends React.PureComponent {
+ return class FormHOC extends React.PureComponent> {
constructor(props: T) {
super(props)
- this.state = initialState
+ this.state = {
+ error: '',
+ data: initialState,
+ }
}
handleSubmit = async (e: React.FormEvent) => {
const {clearOnSuccess, onSuccess} = this.props
e.preventDefault()
- const promise = this.props.onSubmit(this.state)
- console.log('aaaaaaaaa', promise)
- await promise
+ const action = this.props.onSubmit(this.state.data)
+ try {
+ await action.payload
+ } catch (err) {
+ this.setState({
+ error: err.message,
+ })
+ return
+ }
if (clearOnSuccess) {
- this.setState(initialState)
+ this.setState({
+ ...this.state,
+ data: initialState,
+ })
}
if (onSuccess) {
onSuccess()
}
}
handleChange = (name: string, value: string) => {
- this.setState(
- {[name]: value} as unknown as Pick,
- )
+ this.setState({
+ ...this.state,
+ data: {
+ ...this.state.data,
+ [name]: value,
+ },
+ })
}
render() {
const {children, onSuccess, onSubmit, ...otherProps} = this.props
diff --git a/packages/client/src/test-utils/HTTPClientMock.ts b/packages/client/src/test-utils/HTTPClientMock.ts
index bf26b70..c6f88fb 100644
--- a/packages/client/src/test-utils/HTTPClientMock.ts
+++ b/packages/client/src/test-utils/HTTPClientMock.ts
@@ -110,9 +110,11 @@ export class HTTPClientMock extends HTTPClient {
*/
async wait(): Promise {
expect(this.waitPromise).toBe(undefined)
- return new Promise((resolve, reject) => {
+ const result: IReqRes = await new Promise((resolve, reject) => {
this.waitPromise = {resolve, reject}
})
+ await new Promise(resolve => setImmediate(resolve))
+ return result
}
}
diff --git a/packages/client/src/test-utils/TestUtils.tsx b/packages/client/src/test-utils/TestUtils.tsx
index dc05726..dee4cf1 100644
--- a/packages/client/src/test-utils/TestUtils.tsx
+++ b/packages/client/src/test-utils/TestUtils.tsx
@@ -18,9 +18,9 @@ interface IRenderParams {
state?: DeepPartial
connector: Connector
select: IStateSelector
- customJSX?: (
- Component: React.ComponentType,
- additionalProps: Record,
+ customJSX?: (
+ Component: React.ComponentType,
+ additionalProps: Record,
) => JSX.Element
}