mirror of
https://github.com/lux-tel/session-desktop.git
synced 2026-10-30 20:33:24 +00:00
126 lines
4.0 KiB
TypeScript
126 lines
4.0 KiB
TypeScript
import { useState } from 'react';
|
|
import { getAppDispatch } from '../../state/dispatch';
|
|
|
|
import { ConvoHub } from '../../session/conversations';
|
|
import { changeNickNameModal } from '../../state/ducks/modalDialog';
|
|
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
|
|
import { useConversationRealName, useNickname } from '../../hooks/useParamSelector';
|
|
import { PubKey } from '../../session/types';
|
|
import { tr } from '../../localization/localeTools';
|
|
import LIBSESSION_CONSTANTS from '../../session/utils/libsession/libsession_constants';
|
|
import { ModalSimpleSessionInput } from '../inputs/SessionInput';
|
|
import { ClearInputButton } from '../inputs/ClearInputButton';
|
|
import {
|
|
ModalBasicHeader,
|
|
ModalActionsContainer,
|
|
SessionWrapperModal,
|
|
} from '../SessionWrapperModal';
|
|
import { ModalDescription } from './shared/ModalDescriptionContainer';
|
|
import { ModalFlexContainer } from './shared/ModalFlexContainer';
|
|
|
|
type Props = {
|
|
conversationId: string;
|
|
};
|
|
|
|
function NicknameInput({
|
|
onConfirm,
|
|
nickname,
|
|
setStateNickname,
|
|
}: {
|
|
onConfirm: () => void;
|
|
nickname: string;
|
|
setStateNickname: (nickname: string) => void;
|
|
}) {
|
|
const errorString =
|
|
nickname.length > LIBSESSION_CONSTANTS.CONTACT_MAX_NAME_LENGTH
|
|
? tr('nicknameErrorShorter')
|
|
: '';
|
|
return (
|
|
<ModalSimpleSessionInput
|
|
ariaLabel="nickname input"
|
|
value={nickname}
|
|
textSize="md"
|
|
inputDataTestId="nickname-input"
|
|
onValueChanged={setStateNickname}
|
|
placeholder={tr('nicknameEnter')}
|
|
onEnterPressed={onConfirm}
|
|
errorDataTestId="error-message"
|
|
providedError={errorString}
|
|
autoFocus={true}
|
|
buttonEnd={
|
|
<ClearInputButton
|
|
dataTestId={'clear-nickname-button'}
|
|
onClearInputClicked={() => {
|
|
setStateNickname('');
|
|
}}
|
|
show={!!nickname}
|
|
/>
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export const SessionNicknameDialog = (props: Props) => {
|
|
const { conversationId } = props;
|
|
// this resolves to the real user name, and not the nickname (if set) like we do usually
|
|
const displayName = useConversationRealName(conversationId);
|
|
const dispatch = getAppDispatch();
|
|
const currentNickname = useNickname(conversationId);
|
|
const [nickname, setStateNickname] = useState(currentNickname || '');
|
|
|
|
const onClickClose = () => {
|
|
dispatch(changeNickNameModal(null));
|
|
};
|
|
|
|
const saveNickname = async (providedNickname: string | null) => {
|
|
await ConvoHub.use().get(conversationId)?.setNickname(providedNickname, true);
|
|
onClickClose();
|
|
};
|
|
|
|
const onClickRemove = async () => {
|
|
await saveNickname(null);
|
|
};
|
|
|
|
return (
|
|
<SessionWrapperModal
|
|
modalId="nickNameModal"
|
|
headerChildren={<ModalBasicHeader title={tr('nicknameSet')} showExitIcon={true} />}
|
|
onClose={onClickClose}
|
|
buttonChildren={
|
|
<ModalActionsContainer buttonType={SessionButtonType.Simple}>
|
|
<SessionButton
|
|
text={tr('save')}
|
|
disabled={!nickname}
|
|
buttonType={SessionButtonType.Simple}
|
|
onClick={() => saveNickname(nickname)}
|
|
dataTestId="set-nickname-confirm-button"
|
|
/>
|
|
<SessionButton
|
|
text={tr('remove')}
|
|
buttonColor={SessionButtonColor.Danger}
|
|
buttonType={SessionButtonType.Simple}
|
|
onClick={onClickRemove}
|
|
dataTestId="set-nickname-remove-button"
|
|
disabled={!currentNickname} // "remove" disabled if no nickname were set for that user, on load
|
|
/>
|
|
</ModalActionsContainer>
|
|
}
|
|
>
|
|
<ModalFlexContainer>
|
|
<ModalDescription
|
|
dataTestId="modal-description"
|
|
localizerProps={{
|
|
token: 'nicknameDescription',
|
|
name: displayName || PubKey.shorten(conversationId),
|
|
}}
|
|
/>
|
|
<NicknameInput
|
|
onConfirm={() => void saveNickname(nickname)}
|
|
nickname={nickname}
|
|
setStateNickname={setStateNickname}
|
|
/>
|
|
</ModalFlexContainer>
|
|
</SessionWrapperModal>
|
|
);
|
|
};
|