import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { updateAsset, bulkShareAssets, getAssetGroups, addAssetsToGroup } from '../../../services/assets-api'; import type { AssetGroup } from '../../../services/assets-api'; import type { Asset, Organization, ShareItem } from '../../../types/assets'; import Modal from '../../../components/ui/Modal'; import Button from '../../../components/ui/Button'; import { ChevronDown, ChevronUp } from 'lucide-react'; import { useToast } from '../../../hooks/use-toast'; interface ShareAssetModalProps { isOpen: boolean; onClose: () => void; asset: Asset | null; assetIds?: string[] | null; organizations: Organization[]; onSuccess: () => void; } export const ShareAssetModal: React.FC = ({ isOpen, onClose, asset, assetIds, organizations, onSuccess }) => { const { success, error } = useToast(); const [sharesList, setSharesList] = useState([]); const [isSavingShare, setIsSavingShare] = useState(false); const [expandedOrgId, setExpandedOrgId] = useState(null); const [groups, setGroups] = useState([]); const [selectedGroupId, setSelectedGroupId] = useState(''); useEffect(() => { if (isOpen) { getAssetGroups().then(setGroups).catch(console.error); setSelectedGroupId(''); } }, [isOpen]); useEffect(() => { if (asset) { setSharesList( asset.sharedWith?.map(s => ({ organizationId: s.organizationId, userId: s.userId })) || [] ); } else { setSharesList([]); } }, [asset, isOpen]); const isOrgSharedEntirely = (orgId: string) => { return sharesList.some(s => s.organizationId === orgId && s.userId === null); }; const isUserSharedSpecifically = (orgId: string, userId: string) => { return sharesList.some(s => s.organizationId === orgId && s.userId === userId); }; const handleToggleOrg = (orgId: string) => { const isShared = isOrgSharedEntirely(orgId); if (isShared) { setSharesList(prev => prev.filter(s => s.organizationId !== orgId)); } else { setSharesList(prev => [ ...prev.filter(s => s.organizationId !== orgId), { organizationId: orgId, userId: null } ]); } }; const handleToggleUser = (orgId: string, userId: string) => { const isShared = isUserSharedSpecifically(orgId, userId); if (isShared) { setSharesList(prev => prev.filter(s => !(s.organizationId === orgId && s.userId === userId))); } else { setSharesList(prev => [ ...prev.filter(s => !(s.organizationId === orgId && s.userId === null)), { organizationId: orgId, userId } ]); } }; const handleShareSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!asset && (!assetIds || assetIds.length === 0)) return; setIsSavingShare(true); try { if (asset) { await updateAsset(asset.id, { shares: sharesList }); } else if (assetIds && assetIds.length > 0) { await bulkShareAssets(assetIds, sharesList); } if (selectedGroupId) { const ids = asset ? [asset.id] : (assetIds || []); if (ids.length > 0) { await addAssetsToGroup(selectedGroupId, ids); } } success('Share permissions updated', 'The asset visibility and group membership settings have been updated.'); onSuccess(); onClose(); } catch (err: any) { console.error('Failed to update share permissions', err); error('Failed to update share permissions', err.response?.data?.error || 'Something went wrong.'); } finally { setIsSavingShare(false); } }; return ( 0))} onClose={onClose} title="Share Settings" subtitle={asset ? asset.title : `${assetIds?.length || 0} selected assets`} size="md" footer={ <> } > {(asset || (assetIds && assetIds.length > 0)) && (

Select organizations or expand to specify exact users that can access this asset:

{organizations.length === 0 ? (

No partner organizations registered yet.

) : ( organizations.map(org => { const isEntireShared = isOrgSharedEntirely(org.id); const isExpanded = expandedOrgId === org.id; const activeUsers = org.users || []; const specificSharedCount = sharesList.filter(s => s.organizationId === org.id && s.userId !== null).length; return (
{isExpanded && ( {activeUsers.length === 0 ? (

No users found in this organization.

) : ( activeUsers.map(userItem => { const isUserShared = isUserSharedSpecifically(org.id, userItem.id); return ( ); }) )}
)}
); }) )}
{groups.length > 0 && (

This will automatically register the shared asset(s) as part of the selected bundle.

)}
)}
); };