import { useParams, useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { partnerApi } from '../api/partners'; import { campaignsApi } from '../api/campaigns'; import { AdminBackButton } from '../components/admin'; export default function AdminPartnerCampaignAssign() { const { t } = useTranslation(); const { userId } = useParams<{ userId: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); // Fetch partner detail to know already assigned campaign IDs const { data: partner } = useQuery({ queryKey: ['admin-partner-detail', userId], queryFn: () => partnerApi.getPartnerDetail(Number(userId)), enabled: !!userId, }); // Fetch all campaigns const { data: campaignsData, isLoading } = useQuery({ queryKey: ['admin-campaigns-all'], queryFn: () => campaignsApi.getCampaigns(true, 0, 100), }); const assignMutation = useMutation({ mutationFn: (campaignId: number) => partnerApi.assignCampaign(Number(userId), campaignId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-partner-detail', userId] }); navigate(`/admin/partners/${userId}`); }, }); const assignedIds = new Set(partner?.campaigns.map((c) => c.id) ?? []); const available = campaignsData?.campaigns.filter((c) => !assignedIds.has(c.id) && c.partner_user_id === null) ?? []; const takenByOthers = campaignsData?.campaigns.filter((c) => !assignedIds.has(c.id) && c.partner_user_id !== null) ?? []; const partnerName = partner ? partner.first_name || partner.username || `#${partner.user_id}` : ''; return (
{/* Header */}

{t('admin.partnerDetail.campaigns.assignTitle')}

{partnerName &&

{partnerName}

}
{isLoading ? (
) : available.length === 0 ? (
{t('admin.partnerDetail.campaigns.noAvailable')}
) : (
{available.map((campaign) => (
{campaign.name} {!campaign.is_active && ( {t('admin.campaigns.table.inactive')} )}
?start={campaign.start_parameter} {campaign.registrations_count}{' '} {t('admin.campaigns.overview.registrations').toLowerCase()}
))} {/* Show campaigns assigned to other partners as greyed out */} {takenByOthers.map((campaign) => (
{campaign.name} {campaign.partner_name}
?start={campaign.start_parameter}
))}
)} {assignMutation.isError && (
{t('common.error')}
)}
); }