minor : fix copy effect

This commit is contained in:
Yannick Le Duc
2025-08-25 19:03:47 +02:00
parent 1be44503c9
commit f768df7d1a

View File

@@ -25,6 +25,7 @@ function AdminPageContent() {
const [showDeleteModal, setShowDeleteModal] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false);
const [selectedCampaign, setSelectedCampaign] = useState<Campaign | null>(null); const [selectedCampaign, setSelectedCampaign] = useState<Campaign | null>(null);
const [searchTerm, setSearchTerm] = useState(''); const [searchTerm, setSearchTerm] = useState('');
const [copiedCampaignId, setCopiedCampaignId] = useState<string | null>(null);
useEffect(() => { useEffect(() => {
loadCampaigns(); loadCampaigns();
@@ -83,6 +84,29 @@ function AdminPageContent() {
return tiers.split(',').map(tier => `${tier.trim()}`).join(', '); return tiers.split(',').map(tier => `${tier.trim()}`).join(', ');
}; };
const copyToClipboard = async (text: string, campaignId: string) => {
try {
await navigator.clipboard.writeText(text);
setCopiedCampaignId(campaignId);
setTimeout(() => setCopiedCampaignId(null), 2000);
} catch (error) {
console.error('Erreur lors de la copie:', error);
// Fallback pour les navigateurs qui ne supportent pas l'API Clipboard
const textArea = document.createElement('textarea');
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
setCopiedCampaignId(campaignId);
setTimeout(() => setCopiedCampaignId(null), 2000);
} catch (fallbackError) {
console.error('Erreur avec la méthode de fallback:', fallbackError);
}
document.body.removeChild(textArea);
}
};
const filteredCampaigns = campaigns.filter(campaign => const filteredCampaigns = campaigns.filter(campaign =>
campaign.title.toLowerCase().includes(searchTerm.toLowerCase()) || campaign.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
campaign.description.toLowerCase().includes(searchTerm.toLowerCase()) campaign.description.toLowerCase().includes(searchTerm.toLowerCase())
@@ -304,14 +328,14 @@ function AdminPageContent() {
className="flex-1 text-sm bg-white dark:bg-slate-800 border-blue-300 dark:border-blue-600 text-blue-700 dark:text-blue-300 font-mono" className="flex-1 text-sm bg-white dark:bg-slate-800 border-blue-300 dark:border-blue-600 text-blue-700 dark:text-blue-300 font-mono"
/> />
<Button <Button
variant="outline" variant={copiedCampaignId === campaign.id ? "default" : "outline"}
size="sm" size="sm"
onClick={() => { onClick={() => {
navigator.clipboard.writeText(`${window.location.origin}/campaigns/${campaign.id}/propose`); copyToClipboard(`${window.location.origin}/campaigns/${campaign.id}/propose`, campaign.id);
}} }}
className="text-xs" className="text-xs"
> >
Copier {copiedCampaignId === campaign.id ? '✓ Copié !' : 'Copier'}
</Button> </Button>
</div> </div>
</div> </div>