BulkAddToGroupModal.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useEffect, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { AutoComplete, Form, Modal, message } from 'antd';
  4. interface BulkAddToGroupModalProps {
  5. open: boolean;
  6. count: number;
  7. groups: string[];
  8. onOpenChange: (open: boolean) => void;
  9. onSubmit: (group: string) => Promise<{ affected?: number } | null>;
  10. }
  11. export default function BulkAddToGroupModal({
  12. open,
  13. count,
  14. groups,
  15. onOpenChange,
  16. onSubmit,
  17. }: BulkAddToGroupModalProps) {
  18. const { t } = useTranslation();
  19. const [messageApi, messageContextHolder] = message.useMessage();
  20. const [value, setValue] = useState('');
  21. const [submitting, setSubmitting] = useState(false);
  22. useEffect(() => {
  23. if (open) setValue('');
  24. }, [open]);
  25. async function submit() {
  26. const next = value.trim();
  27. if (!next) return;
  28. setSubmitting(true);
  29. try {
  30. const result = await onSubmit(next);
  31. if (result) {
  32. const affected = result.affected ?? 0;
  33. messageApi.success(t('pages.clients.addToGroupSuccessToast', { count: affected, group: next }));
  34. onOpenChange(false);
  35. }
  36. } finally {
  37. setSubmitting(false);
  38. }
  39. }
  40. return (
  41. <>
  42. {messageContextHolder}
  43. <Modal
  44. open={open}
  45. title={t('pages.clients.addToGroupTitle', { count })}
  46. okText={t('add')}
  47. cancelText={t('cancel')}
  48. confirmLoading={submitting}
  49. okButtonProps={{ disabled: !value.trim() }}
  50. onCancel={() => onOpenChange(false)}
  51. onOk={submit}
  52. destroyOnHidden
  53. >
  54. <Form layout="vertical">
  55. <Form.Item
  56. label={t('pages.clients.group')}
  57. tooltip={t('pages.clients.addToGroupTooltip')}
  58. >
  59. <AutoComplete
  60. value={value}
  61. placeholder={t('pages.clients.addToGroupPlaceholder')}
  62. options={groups.map((g) => ({ value: g }))}
  63. onChange={(v) => setValue(v ?? '')}
  64. filterOption={(input, option) =>
  65. String(option?.value ?? '').toLowerCase().includes((input || '').toLowerCase())
  66. }
  67. allowClear
  68. style={{ width: '100%' }}
  69. autoFocus
  70. />
  71. </Form.Item>
  72. </Form>
  73. </Modal>
  74. </>
  75. );
  76. }