137 lines
5.1 KiB
JavaScript

const { useState, useEffect } = React;
const BugGenerator = () => {
const [currentBug, setCurrentBug] = useState('Qui peut s\'assoir à la même table que Dofus et dire qu\'il a des bugs qui sont tout aussi stylés ?');
const generateBug = async () => {
try {
const [hooksResponse, bugsResponse, featuresResponse] = await Promise.all([
fetch('data/hooks.json'),
fetch('data/bugs.json'),
fetch('data/features.json')
]);
const [hooks, bugs, features] = await Promise.all([
hooksResponse.json(),
bugsResponse.json(),
featuresResponse.json()
]);
const hook = hooks.hooks[Math.floor(Math.random() * hooks.hooks.length)];
const bug = bugs.bugs[Math.floor(Math.random() * bugs.bugs.length)];
const feature = features.features[Math.floor(Math.random() * features.features.length)];
const phrase = hook.includes("fait que") ?
`${hook} ${feature}` :
`${hook} ${bug}, ${feature}`;
setCurrentBug(phrase);
} catch (error) {
console.error('Erreur lors de la génération:', error);
setCurrentBug('Une erreur s\'est produite. Veuillez réessayer.');
}
};
const generateImage = async () => {
try {
// Créer un canvas temporaire
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// Définir la taille du canvas
canvas.width = 1200;
canvas.height = 630;
// Définir le style
ctx.fillStyle = '#1a1b26';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Charger le favicon
const faviconLoadPromise = new Promise((resolve, reject) => {
const favicon = new Image();
favicon.onload = () => resolve(favicon);
favicon.onerror = reject;
favicon.src = 'assets/favicon.png';
});
const favicon = await faviconLoadPromise;
// Dessiner le favicon
const iconSize = 64;
ctx.drawImage(favicon,
canvas.width/2 - (iconSize + 180), // Position X (à gauche du texte)
80 - iconSize/2, // Position Y (centré avec le texte)
iconSize,
iconSize
);
// Ajouter le texte "À cause de Flash"
ctx.fillStyle = '#9ece6a';
ctx.font = 'bold 48px Arial';
ctx.textAlign = 'center';
ctx.fillText('À cause de Flash', canvas.width/2, 120);
// Ajouter le bug
ctx.fillStyle = '#c0caf5';
ctx.font = '32px Arial';
// Wrapper le texte
const words = currentBug.split(' ');
let line = '';
let lines = [];
const maxWidth = canvas.width - 100;
const lineHeight = 40;
for (let n = 0; n < words.length; n++) {
const testLine = line + words[n] + ' ';
const metrics = ctx.measureText(testLine);
if (metrics.width > maxWidth) {
lines.push(line);
line = words[n] + ' ';
} else {
line = testLine;
}
}
lines.push(line);
// Dessiner les lignes de texte
lines.forEach((line, i) => {
ctx.fillText(line, canvas.width/2, 280 + (i * lineHeight));
});
// Ajouter le watermark
ctx.fillStyle = '#a9b1d6';
ctx.font = '24px Arial';
ctx.fillText('https://cila.camelia-studio.org/a-cause-de-flash/', canvas.width/2, canvas.height - 40);
// Convertir le canvas en image et déclencher le téléchargement
const dataUrl = canvas.toDataURL('image/png');
const link = document.createElement('a');
link.download = 'mon-bug-dofus.png';
link.href = dataUrl;
link.click();
} catch (error) {
console.error('Erreur lors de la génération de l\'image:', error);
alert('Une erreur s\'est produite lors de la génération de l\'image.');
}
};
return React.createElement('div', { className: 'bug-container' },
React.createElement('button', {
onClick: generateBug,
className: 'generate-button'
}, 'Générer un bug !'),
React.createElement('div', {
className: 'bug-result'
}, currentBug),
React.createElement('button', {
onClick: generateImage,
className: 'share-button'
}, 'Partager mon bug')
);
};
// Attendre que le DOM soit chargé
document.addEventListener('DOMContentLoaded', () => {
const root = document.getElementById('bug-generator-root');
ReactDOM.createRoot(root).render(React.createElement(BugGenerator));
});