npm package: @mr.inverted/confirmer
Description: A lightweight, promise-based confirmation hook for React modals
Author: mr.inverted
Latest version: 1.0.12

# confirmer

“A lightweight, promise-based confirmation hook for React modals.”

## 🧩 Installation
```bash
npm install @mr.inverted/confirmer
```

## 💡 Usage
### In Component
```tsx
const { showConfirmer } = useConfirmer();

const result = await showConfirmer<T>(data?: unknown);
// result: T

showConfirmer();
showConfirmer(10);
showConfirmer(true);
showConfirmer("title");
showConfirmer({ title: "title" });
```

### In Modal
```tsx
const { visibility, data, resolve, reject } = useConfirmerModal<T>();
// data: T

resolve(); // default is true
resolve(10);
resolve(true);
resolve("messsage");
resolve({ input: "message" });

reject();
reject(10);
reject(false);
reject("error");
reject({ input: "error" });
```



## 🧪 Example
```ts
import { useConfirmer } from "@mr.inverted/confirmer";

function SomeComponent() {
  const { showConfirmer } = useConfirmer();

  const onButtonClick = async () => {
    try {
      const result = await showConfirmer<boolean>({ 
        icon: "warning",
        title: "Do you want to confirm?",
        message: "Please click one of the buttons"
      });

      console.log({ result });
    } catch (error) {
      console.error({ error });
    }
  }

  return (
    <button onClick={onButtonClick}>Open modal</button>
  );
}
```

```ts
import { useConfirmerModal } from "@mr.inverted/confirmer";

function Modal() {
  const { visibility, data, resolve, reject } = useConfirmerModal<{ 
    icon: string; 
    title: string; 
    message: string; 
  }>();

  if (!visibility) return null;

  const { icon, title, message } = data;

  return (
    <>
      {/* ... your custom modal */}

      <button onClick={() => resolve()}>Accept</button>
      <button onClick={() => reject()}>Decline</button>
    </>
  )
}
```



## 🧠 Tips
▫️If you need to create multiple modals, you can define a property in the `showConfirmer` function.
```ts
showConfirmer({ 
  modal: "first",
  // ...other props
});
```

▫️You can also create an action builder for type-safe props.
```ts
const setWarningModalProps = (title: string, description: string) => ({
  icon: "warning",
  title,
  description
  // ... other props
});
// or
const setWarningModalProps = (props: IProps) => ({
  icon: "warning",
  ...props
});


showConfirmer( setWarningModalProps("title", "descriptions") );
```

▫️If you don’t want the promise to be rejected, you can pass a falsy value to the `resolve` function.
```ts
resolve(false);
resolve({ result: false });
```

▫️You can also use it to display a notification modal.
```ts
const onDeleteAccountClick = async () => {
  try {
    await showConfirmer(setConfirmedModalProps({
      title: "Delete account",
      description: "After deletion, your account and all data will be permanently removed.",
      rejectButtonText: "Cancel",
      rejectButtonClass: "button-gradient",
      resolveButtonText: "Delete",
      resolveButtonClass: "button-red"
    }));

    deleteAccountApiRequest(id);

    await showConfirmer(setConfirmedModalProps({
      title: "Delete account",
      description: "Your account will be deleted within 7 days.",
      resolveButtonText: "Ok",
      resolveButtonClass: "button-gradient"
    }));
  } catch (error) {
    console.log(error);
  }
}
```