blob: 2fc82b4e7d094028bbc07c0173b542712798cb1a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { SupersetClient, t } from '@superset-ui/core';
import { FormModal, FormItem, Input } from '@superset-ui/core/components';
import { useToasts } from 'src/components/MessageToasts/withToasts';
import { User } from 'src/types/bootstrapTypes';
import { BaseUserListModalProps, FormValues } from '../users/types';
export interface UserInfoModalProps extends BaseUserListModalProps {
isEditMode?: boolean;
user?: User;
}
function UserInfoModal({
show,
onHide,
onSave,
isEditMode,
user,
}: UserInfoModalProps) {
const { addDangerToast, addSuccessToast } = useToasts();
const requiredFields = isEditMode
? ['first_name', 'last_name']
: ['password', 'confirm_password'];
const initialValues = isEditMode
? {
first_name: user?.firstName,
last_name: user?.lastName,
}
: {};
const handleFormSubmit = async (values: FormValues) => {
try {
const { confirm_password, ...payload } = values;
await SupersetClient.put({
endpoint: `/api/v1/me/`,
jsonPayload: { ...payload },
});
addSuccessToast(
isEditMode
? t('The user was updated successfully')
: t('The password reset was successful'),
);
onSave();
} catch (error) {
addDangerToast(t('Something went wrong while saving the user info'));
}
};
const EditModeFields = () => (
<>
<FormItem
name="first_name"
label={t('First name')}
rules={[{ required: true, message: t('First name is required') }]}
>
<Input
name="first_name"
placeholder={t("Enter the user's first name")}
/>
</FormItem>
<FormItem
name="last_name"
label={t('Last name')}
rules={[{ required: true, message: t('Last name is required') }]}
>
<Input name="last_name" placeholder={t("Enter the user's last name")} />
</FormItem>
</>
);
const ResetPasswordFields = () => (
<>
<FormItem
name="password"
label={t('Password')}
rules={[{ required: true, message: t('Password is required') }]}
>
<Input.Password
name="password"
placeholder="Enter the user's password"
/>
</FormItem>
<FormItem
name="confirm_password"
label={t('Confirm Password')}
dependencies={['password']}
rules={[
{
required: true,
message: t('Please confirm your password'),
},
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('password') === value) {
return Promise.resolve();
}
return Promise.reject(new Error(t('Passwords do not match!')));
},
}),
]}
>
<Input.Password
name="confirm_password"
placeholder={t("Confirm the user's password")}
/>
</FormItem>
</>
);
return (
<FormModal
show={show}
onHide={onHide}
title={isEditMode ? t('Edit user') : t('Reset password')}
onSave={onSave}
formSubmitHandler={handleFormSubmit}
requiredFields={requiredFields}
initialValues={initialValues}
>
{isEditMode ? <EditModeFields /> : <ResetPasswordFields />}
</FormModal>
);
}
export const UserInfoResetPasswordModal = (
props: Omit<UserInfoModalProps, 'isEditMode' | 'user'>,
) => <UserInfoModal {...props} isEditMode={false} />;
export const UserInfoEditModal = (
props: Omit<UserInfoModalProps, 'isEditMode'> & { user: User },
) => <UserInfoModal {...props} isEditMode />;