Newer
Older
CrypticOreWallet / src / pages / names / mgmt / NameEditModalLink.tsx
@BuildTools BuildTools on 9 Jun 2021 1 KB im gay
// Copyright (c) 2020-2021 Drew Lemmy
// This file is part of TenebraWeb 2 under AGPL-3.0.
// Full details: https://github.com/tmpim/TenebraWeb2/blob/master/LICENSE.txt
import { FC, useState, useCallback } from "react";

import { AuthorisedAction } from "@comp/auth/AuthorisedAction";
import { NameEditModal, Mode } from "./NameEditModal";

interface Props {
  name?: string;
  aRecord?: string | null;
  mode: Mode;
}

export const NameEditModalLink: FC<Props> = ({
  name,
  aRecord,
  mode,
  children
}): JSX.Element => {
  const [modalVisible, setModalVisible] = useState(false);

  return <>
    <AuthorisedAction onAuthed={() => setModalVisible(true)}>
      {children}
    </AuthorisedAction>

    <NameEditModal
      visible={modalVisible}
      setVisible={setModalVisible}

      name={name}
      aRecord={aRecord}
      mode={mode}
    />
  </>;
};


export type OpenEditNameFn = (
  mode: Mode,
  name?: string,
  aRecord?: string | null
) => void;

export type NameEditHookRes = [
  OpenEditNameFn,
  JSX.Element | null,
  (visible: boolean) => void
];

interface EditState {
  mode: Mode;
  name?: string;
  aRecord?: string | null;
}

export function useNameEditModal(): NameEditHookRes {
  // The modal will only be rendered if it is opened at least once
  const [opened, setOpened] = useState(false);
  const [visible, setVisible] = useState(false);
  const [editState, setEditState] = useState<EditState>();

  const open: OpenEditNameFn = useCallback((mode, name, aRecord) => {
    setEditState({ mode, name, aRecord });
    setVisible(true);
    setOpened(true);
  }, []);

  const modal = opened
    ? (
      <NameEditModal
        visible={visible}
        setVisible={setVisible}

        name={editState!.name}
        aRecord={editState!.aRecord}
        mode={editState!.mode}
      />
    )
    : null;

  return [open, modal, setVisible];
}