@aws-amplify/ui-reactでSignUpフォームをカスタマイズする
@aws-amplify/ui-reactを使っている場合、AmplifyAuthenticatorやAmplifySignUpコンポーネントを使うことでアカウント作成(SignUp)の実装はほぼ片付きます。 が、独自の […]
広告ここから
広告ここまで
目次
@aws-amplify/ui-react
を使っている場合、AmplifyAuthenticator
やAmplifySignUp
コンポーネントを使うことでアカウント作成(SignUp)の実装はほぼ片付きます。
が、独自のバリデーションや処理を追加したい場合には、少しカスタムする必要がでてきます。
handleSubmit
を独自処理に置き換えたコード
若干横着していますが、AmplifySignUp
とほぼ似た挙動をするCustomSignUp
コンポーネントです。
import {
AmplifyAuthenticator,
AmplifySignUp,
} from '@aws-amplify/ui-react';
import {
UI_AUTH_CHANNEL,
AUTH_STATE_CHANGE_EVENT
import {
Auth,
Hub
} from 'aws-amplify';
const dispatchAuthStateChangeEvent = (nextAuthState: AuthState, data?: object) => {
Hub.dispatch(UI_AUTH_CHANNEL, {
event: AUTH_STATE_CHANGE_EVENT,
message: nextAuthState,
data,
});
};
const CustomSignUp: FC = () => {
const [userData, updateUserData] = useState<{
username?: string;
email?: string;
password?: string;
}>({})
const handleUserDataChange = (type: 'username' | 'email' | 'password', value: string) => {
updateUserData({
...userData,
[type]: value
})
}
const handleSubmit = (e: Event) => {
e.preventDefault()
console.log(userData)
if (!userData.username || !userData.password) return;
Auth.signUp({
username: userData.username,
password: userData.password,
attributes: {
email: userData.email
}
}).then(data => {
dispatchAuthStateChangeEvent(AuthState.ConfirmSignUp, data)
})
}
return (
<AmplifySignUp
slot="sign-up"
formFields={[
{
handleInputChange: (e: any) => {
handleUserDataChange('username', e.target.value)
},
type: "username",
},
{
handleInputChange: (e: any) => {
handleUserDataChange('email', e.target.value)
},
type: "email",
},
{
handleInputChange: (e: any) => {
handleUserDataChange('password', e.target.value)
},
type: "password",
},
]}
handleSubmit={handleSubmit}
/>
)
}
実装のポイント
formFieldsでFormの設定と値のハンドルを行う
handleSubmit
を自前で実行する関係上、Auth.SignUp
に必要な値のハンドルが必要です。AmplifySignUp
を利用する場合、formFields
で表示したいフィールドを定義する際に、handleInputChange
を実装してuseState
などと組み合わせることで、各フィールドの値をハンドルできるようになります。
Hub.dispatchで確認コード入力に切り替える
handleSubmit
でAuth.signUp
を呼び出せばアカウント作成自体は完了します。が、この後Hub.dispatch
を実行することで、AmplifyAuthenticator
が自動で確認コード入力のフォームを表示してくれるようになります。以下の関数がSDK内部で再利用されていましたので、exportされるまでは自前でこれを作る形での対応になりそうです。
const dispatchAuthStateChangeEvent = (nextAuthState: AuthState, data?: object) => {
Hub.dispatch(UI_AUTH_CHANNEL, {
event: AUTH_STATE_CHANGE_EVENT,
message: nextAuthState,
data,
});
};