// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import React, { memo } from 'react';
import { useSelector } from 'react-redux';
import { EditUsernameModalBody } from '../../components/EditUsernameModalBody';
import { getMinNickname, getMaxNickname } from '../../util/Username';
import { getIntl } from '../selectors/user';
import {
  getUsernameReservationState,
  getUsernameReservationObject,
  getUsernameReservationError,
  getRecoveredUsername,
} from '../selectors/username';
import { getUsernameCorrupted } from '../selectors/items';
import { getMe } from '../selectors/conversations';
import { useUsernameActions } from '../ducks/username';
import { useToastActions } from '../ducks/toast';

export type SmartEditUsernameModalBodyProps = Readonly<{
  isRootModal: boolean;
  onClose(): void;
}>;

export const SmartEditUsernameModalBody = memo(
  function SmartEditUsernameModalBody({
    isRootModal,
    onClose,
  }: SmartEditUsernameModalBodyProps) {
    const i18n = useSelector(getIntl);
    const { username } = useSelector(getMe);
    const usernameCorrupted = useSelector(getUsernameCorrupted);
    const currentUsername = usernameCorrupted ? undefined : username;
    const minNickname = getMinNickname();
    const maxNickname = getMaxNickname();
    const state = useSelector(getUsernameReservationState);
    const recoveredUsername = useSelector(getRecoveredUsername);
    const reservation = useSelector(getUsernameReservationObject);
    const error = useSelector(getUsernameReservationError);
    const {
      setUsernameReservationError,
      clearUsernameReservation,
      reserveUsername,
      confirmUsername,
    } = useUsernameActions();
    const { showToast } = useToastActions();
    return (
      <EditUsernameModalBody
        i18n={i18n}
        usernameCorrupted={usernameCorrupted}
        currentUsername={currentUsername}
        minNickname={minNickname}
        maxNickname={maxNickname}
        state={state}
        recoveredUsername={recoveredUsername}
        reservation={reservation}
        error={error}
        setUsernameReservationError={setUsernameReservationError}
        clearUsernameReservation={clearUsernameReservation}
        reserveUsername={reserveUsername}
        confirmUsername={confirmUsername}
        showToast={showToast}
        isRootModal={isRootModal}
        onClose={onClose}
      />
    );
  }
);