## Description ### Fixes - [x] https://github.com/appsmithorg/appsmith/issues/19383 - [x] https://github.com/appsmithorg/appsmith/issues/19384 - [x] https://github.com/appsmithorg/appsmith/issues/19385 - [x] https://github.com/appsmithorg/appsmith/issues/19386 - [x] https://github.com/appsmithorg/appsmith/issues/19387 - [x] https://github.com/appsmithorg/appsmith/issues/19388 - [x] https://github.com/appsmithorg/appsmith/issues/19389 - [x] https://github.com/appsmithorg/appsmith/issues/19390 - [x] https://github.com/appsmithorg/appsmith/issues/19391 - [x] https://github.com/appsmithorg/appsmith/issues/19392 - [x] https://github.com/appsmithorg/appsmith/issues/19393 - [x] https://github.com/appsmithorg/appsmith/issues/19394 - [x] https://github.com/appsmithorg/appsmith/issues/19395 - [x] https://github.com/appsmithorg/appsmith/issues/19396 - [x] https://github.com/appsmithorg/appsmith/issues/19397 - [x] https://github.com/appsmithorg/appsmith/issues/19398 - [x] https://github.com/appsmithorg/appsmith/issues/19399 - [x] https://github.com/appsmithorg/appsmith/issues/19400 - [x] https://github.com/appsmithorg/appsmith/issues/19401 - [x] https://github.com/appsmithorg/appsmith/issues/19402 - [x] https://github.com/appsmithorg/appsmith/issues/19403 - [x] https://github.com/appsmithorg/appsmith/issues/19404 - [x] https://github.com/appsmithorg/appsmith/issues/19405 - [x] https://github.com/appsmithorg/appsmith/issues/19406 - [x] https://github.com/appsmithorg/appsmith/issues/19407 - [x] https://github.com/appsmithorg/appsmith/issues/19408 - [x] https://github.com/appsmithorg/appsmith/issues/19409 Fixes # (issue) > if no issue exists, please create an issue and ask the maintainers about this first Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video ## Type of change > Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to not work as expected) - Chore (housekeeping or task changes that don't impact user perception) - This change requires a documentation update ## How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Provide instructions, so we can reproduce. > Please also list any relevant details for your test configuration. > Delete anything that is not important - Manual - Jest - Cypress ### Test Plan > Add Testsmith test cases links that relate to this PR ### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) ## Checklist: ### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [ ] Test plan has been approved by relevant developers - [ ] Test plan has been peer reviewed by QA - [ ] Cypress test cases have been added and approved by either SDET or manual QA - [ ] Organized project review call with relevant stakeholders after Round 1/2 of QA - [ ] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Ankita Kinger <ankita@appsmith.com> Co-authored-by: akash-codemonk <67054171+akash-codemonk@users.noreply.github.com> Co-authored-by: Tanvi Bhakta <tanvi@appsmith.com> Co-authored-by: Arsalan <arsalanyaldram0211@outlook.com> Co-authored-by: Aman Agarwal <aman@appsmith.com> Co-authored-by: Rohit Agarwal <rohit_agarwal@live.in> Co-authored-by: Nilesh Sarupriya <nilesh@appsmith.com> Co-authored-by: Nilesh Sarupriya <20905988+nsarupr@users.noreply.github.com> Co-authored-by: Tanvi Bhakta <tanvibhakta@gmail.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local> Co-authored-by: Vijetha-Kaja <vijetha@appsmith.com> Co-authored-by: Parthvi <80334441+Parthvi12@users.noreply.github.com> Co-authored-by: Apple <nandan@thinkify.io> Co-authored-by: Saroj <43822041+sarojsarab@users.noreply.github.com> Co-authored-by: Sangeeth Sivan <74818788+berzerkeer@users.noreply.github.com> Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com> Co-authored-by: Aishwarya-U-R <91450662+Aishwarya-U-R@users.noreply.github.com> Co-authored-by: rahulramesha <rahul@appsmith.com> Co-authored-by: Aswath K <aswath.sana@gmail.com> Co-authored-by: Preet Sidhu <preetsidhu.bits@gmail.com> Co-authored-by: Vijetha-Kaja <119562824+Vijetha-Kaja@users.noreply.github.com> Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
146 lines
4.1 KiB
TypeScript
146 lines
4.1 KiB
TypeScript
import React, { useState } from "react";
|
|
import { Button, Input, toast, Text } from "design-system";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import { getCurrentUser } from "selectors/usersSelectors";
|
|
import { forgotPasswordSubmitHandler } from "pages/UserAuth/helpers";
|
|
import {
|
|
FORGOT_PASSWORD_SUCCESS_TEXT,
|
|
USER_DISPLAY_NAME_CHAR_CHECK_FAILED,
|
|
USER_DISPLAY_NAME_PLACEHOLDER,
|
|
USER_DISPLAY_PICTURE_PLACEHOLDER,
|
|
USER_EMAIL_PLACEHOLDER,
|
|
USER_RESET_PASSWORD,
|
|
} from "@appsmith/constants/messages";
|
|
import { logoutUser, updateUserDetails } from "actions/userActions";
|
|
import UserProfileImagePicker from "./UserProfileImagePicker";
|
|
import { Wrapper, FieldWrapper, LabelWrapper } from "./StyledComponents";
|
|
import { ANONYMOUS_USERNAME } from "constants/userConstants";
|
|
import { ALL_LANGUAGE_CHARACTERS_REGEX } from "constants/Regex";
|
|
import { createMessage } from "design-system-old/build/constants/messages";
|
|
import { notEmptyValidator } from "design-system-old";
|
|
import { getIsFormLoginEnabled } from "@appsmith/selectors/tenantSelectors";
|
|
|
|
const nameValidator = (
|
|
value: string,
|
|
): {
|
|
isValid: boolean;
|
|
message: string;
|
|
} => {
|
|
const notEmpty = notEmptyValidator(value);
|
|
if (!notEmpty.isValid) {
|
|
return notEmpty;
|
|
}
|
|
if (!new RegExp(`^[${ALL_LANGUAGE_CHARACTERS_REGEX} 0-9.'-]+$`).test(value)) {
|
|
return {
|
|
isValid: false,
|
|
message: createMessage(USER_DISPLAY_NAME_CHAR_CHECK_FAILED),
|
|
};
|
|
}
|
|
return {
|
|
isValid: true,
|
|
message: "",
|
|
};
|
|
};
|
|
|
|
function General() {
|
|
const user = useSelector(getCurrentUser);
|
|
const isFormLoginEnabled = useSelector(getIsFormLoginEnabled);
|
|
const [name, setName] = useState(user?.name);
|
|
const dispatch = useDispatch();
|
|
const forgotPassword = async () => {
|
|
try {
|
|
await forgotPasswordSubmitHandler({ email: user?.email }, dispatch);
|
|
toast.show(createMessage(FORGOT_PASSWORD_SUCCESS_TEXT, user?.email), {
|
|
kind: "success",
|
|
});
|
|
dispatch(logoutUser());
|
|
} catch (error) {
|
|
toast.show((error as { _error: string })._error, {
|
|
kind: "success",
|
|
});
|
|
}
|
|
};
|
|
const saveName = () => {
|
|
name &&
|
|
nameValidator(name).isValid &&
|
|
dispatch(
|
|
updateUserDetails({
|
|
name,
|
|
}),
|
|
);
|
|
};
|
|
|
|
if (user?.email === ANONYMOUS_USERNAME) return null;
|
|
|
|
return (
|
|
<Wrapper>
|
|
<FieldWrapper>
|
|
<LabelWrapper>
|
|
<Text kind="body-m">
|
|
{createMessage(USER_DISPLAY_PICTURE_PLACEHOLDER)}
|
|
</Text>
|
|
</LabelWrapper>
|
|
<div className="user-profile-image-picker">
|
|
<UserProfileImagePicker />
|
|
</div>
|
|
</FieldWrapper>
|
|
<FieldWrapper>
|
|
<Input
|
|
data-testid="t--display-name"
|
|
defaultValue={name}
|
|
isRequired
|
|
label={createMessage(USER_DISPLAY_NAME_PLACEHOLDER)}
|
|
labelPosition="top"
|
|
onBlur={saveName}
|
|
onChange={setName}
|
|
onKeyPress={(ev: React.KeyboardEvent) => {
|
|
if (ev.key === "Enter") {
|
|
saveName();
|
|
}
|
|
}}
|
|
placeholder={createMessage(USER_DISPLAY_NAME_PLACEHOLDER)}
|
|
renderAs="input"
|
|
size="md"
|
|
type="text"
|
|
/>
|
|
</FieldWrapper>
|
|
<FieldWrapper>
|
|
<Input
|
|
data-testid="t--user-name"
|
|
defaultValue={user?.email}
|
|
isDisabled
|
|
isReadOnly
|
|
label={createMessage(USER_EMAIL_PLACEHOLDER)}
|
|
labelPosition="top"
|
|
placeholder={createMessage(USER_EMAIL_PLACEHOLDER)}
|
|
renderAs="input"
|
|
size="md"
|
|
type="text"
|
|
/>
|
|
</FieldWrapper>
|
|
<FieldWrapper>
|
|
<div
|
|
style={{
|
|
display: "flex",
|
|
flex: "1 1 0%",
|
|
justifyContent: "flex-end",
|
|
}}
|
|
>
|
|
{isFormLoginEnabled && (
|
|
<Button
|
|
kind="secondary"
|
|
onClick={forgotPassword}
|
|
renderAs="a"
|
|
size="md"
|
|
>
|
|
{createMessage(USER_RESET_PASSWORD)}
|
|
</Button>
|
|
)}
|
|
</div>
|
|
</FieldWrapper>
|
|
</Wrapper>
|
|
);
|
|
}
|
|
|
|
export default General;
|