You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
6.3 KiB
197 lines
6.3 KiB
import { ReactElement, useMemo, useRef, useState } from 'react'; |
|
|
|
import INPUT_TYPES from '../../lib/consts/INPUT_TYPES'; |
|
|
|
import Grid from '../Grid'; |
|
import InputWithRef, { InputForwardedRefContent } from '../InputWithRef'; |
|
import OutlinedInputWithLabel from '../OutlinedInputWithLabel'; |
|
import { |
|
buildPeacefulStringTestBatch, |
|
testNotBlank, |
|
} from '../../lib/test_input'; |
|
|
|
const INPUT_ID_USER_CONFIRM_PASSWORD = 'common-user-input-confirm-password'; |
|
const INPUT_ID_USER_NAME = 'common-user-input-name'; |
|
const INPUT_ID_USER_PASSWORD = 'common-user-input-password'; |
|
|
|
const INPUT_LABEL_USER_CONFIRM_PASSWORD = 'Confirm password'; |
|
const INPUT_LABEL_USER_NAME = 'Username'; |
|
const INPUT_LABEL_USER_PASSWORD = 'Password'; |
|
|
|
const CommonUserInputGroup = < |
|
M extends { |
|
[K in |
|
| typeof INPUT_ID_USER_CONFIRM_PASSWORD |
|
| typeof INPUT_ID_USER_NAME |
|
| typeof INPUT_ID_USER_PASSWORD]: string; |
|
}, |
|
>({ |
|
formUtils: { |
|
buildFinishInputTestBatchFunction, |
|
buildInputFirstRenderFunction, |
|
setMessage, |
|
setValidity, |
|
}, |
|
previous: { name: previousName } = {}, |
|
readOnlyUserName, |
|
requirePassword = false, |
|
showPasswordField, |
|
}: CommonUserInputGroupProps<M>): ReactElement => { |
|
const userPasswordInputRef = useRef<InputForwardedRefContent<'string'>>({}); |
|
const userConfirmPasswordInputRef = useRef< |
|
InputForwardedRefContent<'string'> |
|
>({}); |
|
|
|
const [requireConfirmPassword, setRequireConfirmPassword] = |
|
useState<boolean>(requirePassword); |
|
|
|
const userPasswordInputGroup = useMemo( |
|
() => |
|
showPasswordField |
|
? { |
|
'common-user-input-cell-password': { |
|
children: ( |
|
<InputWithRef |
|
input={ |
|
<OutlinedInputWithLabel |
|
id={INPUT_ID_USER_PASSWORD} |
|
label={INPUT_LABEL_USER_PASSWORD} |
|
type={INPUT_TYPES.password} |
|
/> |
|
} |
|
inputTestBatch={buildPeacefulStringTestBatch( |
|
INPUT_LABEL_USER_PASSWORD, |
|
() => { |
|
setMessage(INPUT_ID_USER_PASSWORD); |
|
}, |
|
{ |
|
onFinishBatch: buildFinishInputTestBatchFunction( |
|
INPUT_ID_USER_PASSWORD, |
|
), |
|
}, |
|
(message) => { |
|
setMessage(INPUT_ID_USER_PASSWORD, { children: message }); |
|
}, |
|
)} |
|
onBlurAppend={({ target: { value } }) => { |
|
setRequireConfirmPassword(value.length > 0); |
|
setValidity( |
|
INPUT_ID_USER_CONFIRM_PASSWORD, |
|
value === |
|
userConfirmPasswordInputRef.current.getValue?.call( |
|
null, |
|
), |
|
); |
|
}} |
|
onFirstRender={buildInputFirstRenderFunction( |
|
INPUT_ID_USER_PASSWORD, |
|
)} |
|
ref={userPasswordInputRef} |
|
required={requirePassword} |
|
/> |
|
), |
|
}, |
|
'common-user-input-cell-confirm-password': { |
|
children: ( |
|
<InputWithRef |
|
input={ |
|
<OutlinedInputWithLabel |
|
id={INPUT_ID_USER_CONFIRM_PASSWORD} |
|
inputProps={{ readOnly: !requireConfirmPassword }} |
|
label={INPUT_LABEL_USER_CONFIRM_PASSWORD} |
|
type={INPUT_TYPES.password} |
|
/> |
|
} |
|
inputTestBatch={{ |
|
defaults: { |
|
onSuccess: () => { |
|
setMessage(INPUT_ID_USER_CONFIRM_PASSWORD); |
|
}, |
|
}, |
|
onFinishBatch: buildFinishInputTestBatchFunction( |
|
INPUT_ID_USER_CONFIRM_PASSWORD, |
|
), |
|
tests: [ |
|
{ test: testNotBlank }, |
|
{ |
|
onFailure: () => { |
|
setMessage(INPUT_ID_USER_CONFIRM_PASSWORD, { |
|
children: 'The passwords do not match.', |
|
}); |
|
}, |
|
test: ({ value }) => |
|
value === |
|
userPasswordInputRef.current.getValue?.call(null), |
|
}, |
|
], |
|
}} |
|
onFirstRender={buildInputFirstRenderFunction( |
|
INPUT_ID_USER_CONFIRM_PASSWORD, |
|
)} |
|
ref={userConfirmPasswordInputRef} |
|
required={requireConfirmPassword} |
|
/> |
|
), |
|
}, |
|
} |
|
: undefined, |
|
[ |
|
buildFinishInputTestBatchFunction, |
|
buildInputFirstRenderFunction, |
|
requireConfirmPassword, |
|
requirePassword, |
|
setMessage, |
|
setValidity, |
|
showPasswordField, |
|
], |
|
); |
|
|
|
return ( |
|
<Grid |
|
columns={{ xs: 1, sm: 2, md: 3 }} |
|
layout={{ |
|
'common-user-input-cell-name': { |
|
children: ( |
|
<InputWithRef |
|
input={ |
|
<OutlinedInputWithLabel |
|
id={INPUT_ID_USER_NAME} |
|
inputProps={{ readOnly: readOnlyUserName }} |
|
label={INPUT_LABEL_USER_NAME} |
|
value={previousName} |
|
/> |
|
} |
|
inputTestBatch={buildPeacefulStringTestBatch( |
|
INPUT_LABEL_USER_NAME, |
|
() => { |
|
setMessage(INPUT_ID_USER_NAME); |
|
}, |
|
{ |
|
onFinishBatch: |
|
buildFinishInputTestBatchFunction(INPUT_ID_USER_NAME), |
|
}, |
|
(message) => { |
|
setMessage(INPUT_ID_USER_NAME, { children: message }); |
|
}, |
|
)} |
|
onFirstRender={buildInputFirstRenderFunction(INPUT_ID_USER_NAME)} |
|
required |
|
/> |
|
), |
|
md: 1, |
|
sm: 2, |
|
}, |
|
...userPasswordInputGroup, |
|
}} |
|
spacing="1em" |
|
/> |
|
); |
|
}; |
|
|
|
export { |
|
INPUT_ID_USER_CONFIRM_PASSWORD, |
|
INPUT_ID_USER_NAME, |
|
INPUT_ID_USER_PASSWORD, |
|
}; |
|
|
|
export default CommonUserInputGroup;
|
|
|