feat: updated display name

show error when display name is too long
pull/3056/head
William Grant 2 years ago
parent 4e2101a9e5
commit 8aac036bca

@ -585,5 +585,6 @@
"termsOfService": "Terms of Service", "termsOfService": "Terms of Service",
"privacyPolicy": "Privacy Policy", "privacyPolicy": "Privacy Policy",
"displayNamePick": "Pick your display name", "displayNamePick": "Pick your display name",
"displayNameDescription": "It can be your real name, an alias, or anything else you like — and you can change it any time." "displayNameDescription": "It can be your real name, an alias, or anything else you like — and you can change it any time.",
"invalidDisplayNameTooLong": "Please enter a shorter display name."
} }

@ -1,6 +1,6 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import { MAX_USERNAME_BYTES } from '../../../session/constants'; import { sanitizeSessionUsername } from '../../../session/utils/String';
import { AccountCreation } from '../../../state/onboarding/ducks/registration'; import { AccountCreation } from '../../../state/onboarding/ducks/registration';
import { import {
useOnboardAccountCreationStep, useOnboardAccountCreationStep,
@ -8,12 +8,11 @@ import {
useOnboardHexGeneratedPubKey, useOnboardHexGeneratedPubKey,
} from '../../../state/onboarding/selectors/registration'; } from '../../../state/onboarding/selectors/registration';
import { Flex } from '../../basic/Flex'; import { Flex } from '../../basic/Flex';
import { SessionButton } from '../../basic/SessionButton'; import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
import { SpacerLG, SpacerSM } from '../../basic/Text'; import { SpacerLG, SpacerSM } from '../../basic/Text';
import { SessionInput2 } from '../../inputs'; import { SessionInput2 } from '../../inputs';
import { signUp } from '../RegistrationStages'; import { signUp } from '../RegistrationStages';
import { BackButtonWithininContainer } from '../components/BackButton'; import { BackButtonWithininContainer } from '../components/BackButton';
import { sanitizeDisplayNameOrToast } from './RestoreAccount';
const StyledContainer = styled.div` const StyledContainer = styled.div`
width: 100%; width: 100%;
@ -30,13 +29,27 @@ const StyledDescription = styled.p`
margin: 0; margin: 0;
`; `;
function sanitizeDisplayNameOrToast(
displayName: string,
setDisplayName: (sanitized: string) => void,
setDisplayNameError: (error: string | undefined) => void
) {
try {
const sanitizedName = sanitizeSessionUsername(displayName);
const trimName = sanitizedName.trim();
setDisplayName(sanitizedName);
setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined);
} catch (e) {
setDisplayName(displayName);
setDisplayNameError(window.i18n('invalidDisplayNameTooLong'));
}
}
export const CreateAccount = () => { export const CreateAccount = () => {
const step = useOnboardAccountCreationStep(); const step = useOnboardAccountCreationStep();
const generatedRecoveryPhrase = useOnboardGeneratedRecoveryPhrase(); const generatedRecoveryPhrase = useOnboardGeneratedRecoveryPhrase();
const hexGeneratedPubKey = useOnboardHexGeneratedPubKey(); const hexGeneratedPubKey = useOnboardHexGeneratedPubKey();
// const dispatch = useDispatch();
const [displayName, setDisplayName] = useState(''); const [displayName, setDisplayName] = useState('');
const [displayNameError, setDisplayNameError] = useState<undefined | string>(''); const [displayNameError, setDisplayNameError] = useState<undefined | string>('');
@ -46,12 +59,13 @@ export const CreateAccount = () => {
} }
}, [step, hexGeneratedPubKey]); }, [step, hexGeneratedPubKey]);
// Display name is required const displayNameOK = !!displayName && !displayNameError;
const displayNameOK = !displayNameError && !!displayName; const signUpWithDetails = () => {
if (!displayNameOK) {
return;
}
const enableCompleteSignUp = displayNameOK; void signUp({
const signUpWithDetails = async () => {
await signUp({
displayName, displayName,
generatedRecoveryPhrase, generatedRecoveryPhrase,
}); });
@ -70,18 +84,18 @@ export const CreateAccount = () => {
type="text" type="text"
placeholder={window.i18n('enterDisplayName')} placeholder={window.i18n('enterDisplayName')}
value={displayName} value={displayName}
maxLength={MAX_USERNAME_BYTES}
onValueChanged={(name: string) => { onValueChanged={(name: string) => {
sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError); sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError);
}} }}
onEnterPressed={signUpWithDetails} onEnterPressed={signUpWithDetails}
error={displayNameError}
inputDataTestId="display-name-input" inputDataTestId="display-name-input"
/> />
<SpacerLG /> <SpacerLG />
<SessionButton <SessionButton
buttonColor={SessionButtonColor.White}
onClick={signUpWithDetails} onClick={signUpWithDetails}
text={window.i18n('continue')} text={window.i18n('continue')}
disabled={!enableCompleteSignUp}
/> />
</Flex> </Flex>
</BackButtonWithininContainer> </BackButtonWithininContainer>

@ -1,6 +1,4 @@
import { useState } from 'react'; import { useState } from 'react';
import { ToastUtils } from '../../../session/utils';
import { sanitizeSessionUsername } from '../../../session/utils/String';
import { AccountRestoration } from '../../../state/onboarding/ducks/registration'; import { AccountRestoration } from '../../../state/onboarding/ducks/registration';
import { useOnboardAccountRestorationStep } from '../../../state/onboarding/selectors/registration'; import { useOnboardAccountRestorationStep } from '../../../state/onboarding/selectors/registration';
import { Flex } from '../../basic/Flex'; import { Flex } from '../../basic/Flex';
@ -40,23 +38,6 @@ const SignInContinueButton = (props: {
); );
}; };
export function sanitizeDisplayNameOrToast(
displayName: string,
setDisplayName: (sanitized: string) => void,
setDisplayNameError: (error: string | undefined) => void
) {
try {
const sanitizedName = sanitizeSessionUsername(displayName);
const trimName = sanitizedName.trim();
setDisplayName(sanitizedName);
setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined);
} catch (e) {
setDisplayName(displayName);
setDisplayNameError(window.i18n('displayNameTooLong'));
ToastUtils.pushToastError('toolong', window.i18n('displayNameTooLong'));
}
}
export const RestoreAccount = () => { export const RestoreAccount = () => {
const step = useOnboardAccountRestorationStep(); const step = useOnboardAccountRestorationStep();
@ -108,7 +89,10 @@ export const RestoreAccount = () => {
displayName={displayName} displayName={displayName}
handlePressEnter={continueYourSession} handlePressEnter={continueYourSession}
onDisplayNameChanged={(name: string) => { onDisplayNameChanged={(name: string) => {
sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError); // NOTE this is just dummy code for later
setDisplayName(name);
setDisplayNameError(name);
window.log.debug(`WIP: [displayName] ${displayName} `);
}} }}
onSeedChanged={(seed: string) => { onSeedChanged={(seed: string) => {
setRecoveryPhrase(seed); setRecoveryPhrase(seed);

@ -68,6 +68,7 @@ export const VALIDATION = {
export const DEFAULT_RECENT_REACTS = ['😂', '🥰', '😢', '😡', '😮', '😈']; export const DEFAULT_RECENT_REACTS = ['😂', '🥰', '😢', '😡', '😮', '😈'];
export const REACT_LIMIT = 6; export const REACT_LIMIT = 6;
/** the useronfig wrapper name property character limit */
export const MAX_USERNAME_BYTES = 64; export const MAX_USERNAME_BYTES = 64;
export const FEATURE_RELEASE_TIMESTAMPS = { export const FEATURE_RELEASE_TIMESTAMPS = {

@ -236,6 +236,7 @@ export type LocalizerKeys =
| 'imageCaptionIconAlt' | 'imageCaptionIconAlt'
| 'incomingCallFrom' | 'incomingCallFrom'
| 'incomingError' | 'incomingError'
| 'invalidDisplayNameTooLong'
| 'invalidGroupNameTooLong' | 'invalidGroupNameTooLong'
| 'invalidGroupNameTooShort' | 'invalidGroupNameTooShort'
| 'invalidNumberError' | 'invalidNumberError'

Loading…
Cancel
Save