feat: start of using updateOurProfileDisplayName in onboarding

pull/3083/head
William Grant 10 months ago
parent 0b811bc641
commit 6fa6e5c189

@ -3,6 +3,7 @@ import { useDispatch } from 'react-redux';
import useMount from 'react-use/lib/useMount'; import useMount from 'react-use/lib/useMount';
import { SettingsKey } from '../../../data/settings-key'; import { SettingsKey } from '../../../data/settings-key';
import { mnDecode } from '../../../session/crypto/mnemonic'; import { mnDecode } from '../../../session/crypto/mnemonic';
import { ProfileManager } from '../../../session/profile_manager/ProfileManager';
import { StringUtils } from '../../../session/utils'; import { StringUtils } from '../../../session/utils';
import { fromHex } from '../../../session/utils/String'; import { fromHex } from '../../../session/utils/String';
import { trigger } from '../../../shims/events'; import { trigger } from '../../../shims/events';
@ -12,11 +13,13 @@ import {
setDisplayName, setDisplayName,
setDisplayNameError, setDisplayNameError,
setHexGeneratedPubKey, setHexGeneratedPubKey,
setPrivateKeyBytes,
setRecoveryPassword, setRecoveryPassword,
} from '../../../state/onboarding/ducks/registration'; } from '../../../state/onboarding/ducks/registration';
import { import {
useDisplayName, useDisplayName,
useDisplayNameError, useDisplayNameError,
useOnboardPrivateKeyBytes,
useRecoveryPassword, useRecoveryPassword,
} from '../../../state/onboarding/selectors/registration'; } from '../../../state/onboarding/selectors/registration';
import { import {
@ -25,6 +28,7 @@ import {
sessionGenerateKeyPair, sessionGenerateKeyPair,
} from '../../../util/accountManager'; } from '../../../util/accountManager';
import { Storage, setSignWithRecoveryPhrase } from '../../../util/storage'; import { Storage, setSignWithRecoveryPhrase } from '../../../util/storage';
import { UserConfigWrapperActions } from '../../../webworker/workers/browser/libsession_worker_interface';
import { Flex } from '../../basic/Flex'; import { Flex } from '../../basic/Flex';
import { SpacerLG, SpacerSM } from '../../basic/Text'; import { SpacerLG, SpacerSM } from '../../basic/Text';
import { SessionInput } from '../../inputs'; import { SessionInput } from '../../inputs';
@ -55,6 +59,7 @@ async function signUp(signUpDetails: AccountDetails) {
} }
export const CreateAccount = () => { export const CreateAccount = () => {
const privateKeyBytes = useOnboardPrivateKeyBytes();
const recoveryPassword = useRecoveryPassword(); const recoveryPassword = useRecoveryPassword();
const displayName = useDisplayName(); const displayName = useDisplayName();
const displayNameError = useDisplayNameError(); const displayNameError = useDisplayNameError();
@ -77,6 +82,7 @@ export const CreateAccount = () => {
const newHexPubKey = StringUtils.decode(keyPair.pubKey, 'hex'); const newHexPubKey = StringUtils.decode(keyPair.pubKey, 'hex');
dispatch(setRecoveryPassword(mnemonic)); dispatch(setRecoveryPassword(mnemonic));
dispatch(setPrivateKeyBytes(keyPair.ed25519KeyPair.privateKey));
dispatch(setHexGeneratedPubKey(newHexPubKey)); // our 'frontend' account ID dispatch(setHexGeneratedPubKey(newHexPubKey)); // our 'frontend' account ID
} }
}; };
@ -91,18 +97,35 @@ export const CreateAccount = () => {
} }
try { try {
if (!privateKeyBytes) {
throw new Error('Private key not found');
}
// validate display name using libsession
// eslint-disable-next-line max-len
// TODO [libsession validation] if we try and use a different display name after entering one that is already too long we get an error because the user config has been initialised. I call .free() in the finally but that doesn't help
await UserConfigWrapperActions.init(privateKeyBytes, null);
const validName = await ProfileManager.updateOurProfileDisplayName(displayName, true);
await signUp({ await signUp({
displayName, displayName: validName,
recoveryPassword, recoveryPassword,
}); });
dispatch(setAccountCreationStep(AccountCreation.Done)); dispatch(setAccountCreationStep(AccountCreation.Done));
} catch (e) { } catch (err) {
let errorString = err.message || String(err);
// Note error substring is taken from libsession-util
if (err.message && err.message.includes('exceeds maximum length')) {
errorString = window.i18n('displayNameTooLong');
}
window.log.error( window.log.error(
`[onboarding] create account: signUpWithDetails failed! Error: ${e.message || e}` `[onboarding] create account: signUpWithDetails failed! Error: ${errorString}`
); );
dispatch(setAccountCreationStep(AccountCreation.DisplayName)); dispatch(setAccountCreationStep(AccountCreation.DisplayName));
dispatch(setDisplayNameError(e.message || String(e))); dispatch(setDisplayNameError(errorString));
} finally {
await UserConfigWrapperActions.free();
} }
}; };

@ -3,6 +3,7 @@ import { isEmpty } from 'lodash';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { ONBOARDING_TIMES } from '../../../session/constants'; import { ONBOARDING_TIMES } from '../../../session/constants';
import { InvalidWordsError, NotEnoughWordsError } from '../../../session/crypto/mnemonic'; import { InvalidWordsError, NotEnoughWordsError } from '../../../session/crypto/mnemonic';
import { ProfileManager } from '../../../session/profile_manager/ProfileManager';
import { PromiseUtils } from '../../../session/utils'; import { PromiseUtils } from '../../../session/utils';
import { TaskTimedOutError } from '../../../session/utils/Promise'; import { TaskTimedOutError } from '../../../session/utils/Promise';
import { NotFoundError } from '../../../session/utils/errors'; import { NotFoundError } from '../../../session/utils/errors';
@ -175,17 +176,26 @@ export const RestoreAccount = () => {
} }
try { try {
// validate display name using libsession
// TODO [libsession validation] once you have it working in CreateAccount.tsx you will need to do it here
const validName = await ProfileManager.updateOurProfileDisplayName(displayName, true);
await signInWithNewDisplayName({ await signInWithNewDisplayName({
displayName, displayName: validName,
recoveryPassword, recoveryPassword,
dispatch, dispatch,
}); });
} catch (e) { } catch (err) {
let errorString = err.message || String(err);
// Note error substring is taken from libsession-util
if (err.message && err.message.includes('exceeds maximum length')) {
errorString = window.i18n('displayNameTooLong');
}
window.log.error( window.log.error(
`[onboarding] restore account: Failed with new display name! Error: ${e.message || e}` `[onboarding] restore account: Failed with new display name! Error: ${errorString}`
); );
dispatch(setAccountRestorationStep(AccountRestoration.DisplayName)); dispatch(setAccountRestorationStep(AccountRestoration.DisplayName));
dispatch(setDisplayNameError(e.message || String(e))); dispatch(setDisplayNameError(errorString));
} }
}; };

@ -41,6 +41,7 @@ export type OnboardingState = {
progress: number; progress: number;
recoveryPassword: string; recoveryPassword: string;
recoveryPasswordError: string | undefined; recoveryPasswordError: string | undefined;
privateKeyBytes: Uint8Array | undefined;
hexGeneratedPubKey: string; hexGeneratedPubKey: string;
displayName: string; displayName: string;
displayNameError: string | undefined; displayNameError: string | undefined;
@ -54,6 +55,7 @@ const initialState: OnboardingState = {
progress: 0, progress: 0,
recoveryPassword: '', recoveryPassword: '',
recoveryPasswordError: undefined, recoveryPasswordError: undefined,
privateKeyBytes: undefined,
hexGeneratedPubKey: '', hexGeneratedPubKey: '',
displayName: '', displayName: '',
displayNameError: undefined, displayNameError: undefined,
@ -90,6 +92,9 @@ export const registrationSlice = createSlice({
setHexGeneratedPubKey(state, action: PayloadAction<string>) { setHexGeneratedPubKey(state, action: PayloadAction<string>) {
return { ...state, hexGeneratedPubKey: action.payload }; return { ...state, hexGeneratedPubKey: action.payload };
}, },
setPrivateKeyBytes(state, action: PayloadAction<Uint8Array>) {
return { ...state, privateKeyBytes: action.payload };
},
setDisplayName(state, action: PayloadAction<string>) { setDisplayName(state, action: PayloadAction<string>) {
return { ...state, displayName: action.payload }; return { ...state, displayName: action.payload };
}, },
@ -109,6 +114,7 @@ export const {
setRecoveryPassword, setRecoveryPassword,
setRecoveryPasswordError, setRecoveryPasswordError,
setHexGeneratedPubKey, setHexGeneratedPubKey,
setPrivateKeyBytes,
setDisplayName, setDisplayName,
setDisplayNameError, setDisplayNameError,
} = registrationSlice.actions; } = registrationSlice.actions;

@ -54,6 +54,11 @@ const getHexGeneratedPubKey = createSelector(
(state: OnboardingState): string => state.hexGeneratedPubKey (state: OnboardingState): string => state.hexGeneratedPubKey
); );
const getPrivateKeyBytes = createSelector(
getRegistration,
(state: OnboardingState): Uint8Array | undefined => state.privateKeyBytes
);
const getDisplayName = createSelector( const getDisplayName = createSelector(
getRegistration, getRegistration,
(state: OnboardingState): string => state.displayName (state: OnboardingState): string => state.displayName
@ -98,6 +103,10 @@ export const useOnboardHexGeneratedPubKey = () => {
return useSelector(getHexGeneratedPubKey); return useSelector(getHexGeneratedPubKey);
}; };
export const useOnboardPrivateKeyBytes = () => {
return useSelector(getPrivateKeyBytes);
};
export const useDisplayName = () => { export const useDisplayName = () => {
return useSelector(getDisplayName); return useSelector(getDisplayName);
}; };

Loading…
Cancel
Save