minor : fix copy effect
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user