import { FC, useEffect, useMemo } from 'react'; import { useAppDispatch, useAppSelector } from '../../../redux/hooks'; import { fetchGroupJoinLink } from '../../../redux/slices/groups'; import { Modal } from '../../../components/modal/Modal'; import { PrimaryButton } from '../../../components/button/PrimaryButton'; import { SecondaryButton } from '../../../components/button/SecondaryButton'; import { Input } from '../../../components/input/Input'; interface ModalInviteProps { active: boolean; setActive: (value: boolean) => void; groupId: number; groupName: string; } const ModalInvite: FC = ({ active, setActive, groupId, groupName, }) => { const dispatch = useAppDispatch(); const baseUrl = window.location.origin; // Получаем токен и дату из Redux const { joinLink, status } = useAppSelector( (state) => state.groups.fetchGroupJoinLink, ); // При открытии модалки запрашиваем join link useEffect(() => { if (active) { dispatch(fetchGroupJoinLink(groupId)); } }, [active, groupId, dispatch]); // Генерация полной ссылки с query параметрами const inviteLink = useMemo(() => { if (!joinLink) return ''; const params = new URLSearchParams({ token: joinLink.token, expiresAt: joinLink.expiresAt, groupName, groupId: `${groupId}`, }); return `${baseUrl}/home/group-invite?${params.toString()}`; }, [joinLink, groupName, baseUrl, groupId]); // Копирование и закрытие модалки const handleCopy = async () => { if (!inviteLink) return; try { await navigator.clipboard.writeText(inviteLink); setActive(false); } catch (err) { console.error('Не удалось скопировать ссылку:', err); } }; return (
Приглашение в группу "{groupName}"
Ссылка для приглашения
{inviteLink}
setActive(false)} text="Отмена" />
); }; export default ModalInvite;