AddClientsToGroupModal.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { lazy, useEffect, useMemo, useState } from 'react';
  2. import { HttpUtil } from '@/utils';
  3. import { coerceInboundJsonField, type DBInbound } from '@/models/dbinbound';
  4. const BulkAddToGroupModal = lazy(() => import('@/pages/clients/BulkAddToGroupModal'));
  5. interface AddClientsToGroupModalProps {
  6. open: boolean;
  7. source: DBInbound | null;
  8. onClose: () => void;
  9. onAdded?: () => void;
  10. }
  11. function readClientEmails(settings: unknown): string[] {
  12. const parsed = coerceInboundJsonField(settings) as { clients?: Array<{ email?: string }> };
  13. const clients = Array.isArray(parsed?.clients) ? parsed.clients : [];
  14. return clients.map((c) => (c?.email || '').trim()).filter(Boolean);
  15. }
  16. export default function AddClientsToGroupModal({
  17. open,
  18. source,
  19. onClose,
  20. onAdded,
  21. }: AddClientsToGroupModalProps) {
  22. const [groups, setGroups] = useState<string[]>([]);
  23. const emails = useMemo(() => (source ? readClientEmails(source.settings) : []), [source]);
  24. useEffect(() => {
  25. if (!open) return;
  26. let cancelled = false;
  27. (async () => {
  28. const msg = await HttpUtil.get('/panel/api/clients/groups', undefined, { silent: true });
  29. if (cancelled) return;
  30. const list = Array.isArray(msg?.obj) ? (msg.obj as Array<{ name?: string }>) : [];
  31. setGroups(list.map((g) => g?.name || '').filter(Boolean));
  32. })();
  33. return () => { cancelled = true; };
  34. }, [open]);
  35. return (
  36. <BulkAddToGroupModal
  37. open={open}
  38. count={emails.length}
  39. groups={groups}
  40. onOpenChange={(o) => { if (!o) onClose(); }}
  41. onSubmit={async (group) => {
  42. const msg = await HttpUtil.post(
  43. '/panel/api/clients/groups/bulkAdd',
  44. { emails, group },
  45. { headers: { 'Content-Type': 'application/json' } },
  46. );
  47. if (!msg?.success) return null;
  48. onAdded?.();
  49. return (msg.obj as { affected?: number } | undefined) ?? { affected: 0 };
  50. }}
  51. />
  52. );
  53. }