tfrere's picture
tfrere HF Staff
update
6bda4a6
import { useEffect, useRef, useCallback, useState } from 'react';
import { Pane } from 'tweakpane';
import { useFontMapStore } from '../../../store/fontMapStore';
/**
* Hook pour gérer Tweakpane avec les contrôles de taille
* Activé uniquement en mode debug (touche D)
* Maintenant utilise Zustand pour éviter le props drilling
*/
export const useTweakpane = (darkMode) => {
// Récupérer l'état depuis le store Zustand
const {
characterSize,
variantSizeImpact,
debugMode,
setCharacterSize,
setVariantSizeImpact,
setDebugMode
} = useFontMapStore();
const paneRef = useRef(null);
const paramsRef = useRef({
size: characterSize,
variantSizeImpact: variantSizeImpact,
debugMode: debugMode
});
const [isDebugMode, setIsDebugMode] = useState(false);
// Charger l'état du debug depuis localStorage
useEffect(() => {
const savedDebugState = localStorage.getItem('fontmap-debug-mode');
if (savedDebugState === 'true') {
setIsDebugMode(true);
}
}, []);
// Fonction pour créer le pane Tweakpane
const createPane = useCallback(() => {
if (paneRef.current) return; // Déjà créé
// Créer le pane
const pane = new Pane({
title: 'FontMap Debug Controls',
container: document.body,
expanded: true
});
// Configuration du style
pane.element.style.position = 'fixed';
pane.element.style.top = '80px';
pane.element.style.right = '20px';
pane.element.style.zIndex = '10000';
pane.element.style.fontSize = '12px';
pane.element.style.backgroundColor = 'rgba(0, 0, 0, 0.9)';
pane.element.style.border = '1px solid #333';
pane.element.style.borderRadius = '8px';
// Contrôle de debug mode
pane.addBinding(paramsRef.current, 'debugMode', {
label: '🐛 Debug Logs'
}).on('change', (ev) => {
console.log('🎯 Debug mode changed to:', ev.value);
setDebugMode(ev.value);
});
// Contrôle de taille
pane.addBinding(paramsRef.current, 'size', {
label: 'Font Size',
min: 0.1,
max: 2.0,
step: 0.05,
format: (value) => `${value.toFixed(2)}x`
}).on('change', (ev) => {
setCharacterSize(ev.value);
});
// Checkbox pour l'impact des variantes sur la taille
pane.addBinding(paramsRef.current, 'variantSizeImpact', {
label: 'Variant Size Impact'
}).on('change', (ev) => {
setVariantSizeImpact(ev.value);
});
// Bouton pour réinitialiser
pane.addButton({
title: 'Reset'
}).on('click', () => {
setCharacterSize(1); // Valeur par défaut
setVariantSizeImpact(false); // Valeur par défaut
paramsRef.current.size = 1;
paramsRef.current.variantSizeImpact = false;
pane.refresh();
});
paneRef.current = pane;
}, [setCharacterSize, setVariantSizeImpact, setDebugMode]);
// Fonction pour détruire le pane
const destroyPane = useCallback(() => {
if (paneRef.current) {
paneRef.current.dispose();
paneRef.current = null;
}
}, []);
// Fonction pour toggle le mode debug
const toggleDebugMode = useCallback(() => {
const newDebugMode = !isDebugMode;
setIsDebugMode(newDebugMode);
localStorage.setItem('fontmap-debug-mode', newDebugMode.toString());
if (newDebugMode) {
createPane();
console.log('🐛 Debug mode activated - Press D to toggle');
} else {
destroyPane();
console.log('🐛 Debug mode deactivated');
}
}, [isDebugMode, createPane, destroyPane]);
// Initialiser le pane si le mode debug est activé
useEffect(() => {
if (isDebugMode) {
createPane();
} else {
destroyPane();
}
}, [isDebugMode, createPane, destroyPane]);
// Gestionnaire de touches pour activer/désactiver le debug
useEffect(() => {
const handleKeyDown = (event) => {
// Activer le debug avec la touche D
if (event.key.toLowerCase() === 'd' && !event.ctrlKey && !event.metaKey && !event.altKey) {
// Vérifier que ce n'est pas dans un input
const target = event.target;
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.contentEditable === 'true') {
return;
}
event.preventDefault();
toggleDebugMode();
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [toggleDebugMode]);
// Mettre à jour les valeurs quand elles changent
useEffect(() => {
if (paneRef.current) {
paramsRef.current.size = characterSize;
paramsRef.current.variantSizeImpact = variantSizeImpact;
paneRef.current.refresh();
}
}, [characterSize, variantSizeImpact]);
return {
isDebugMode,
toggleDebugMode
};
};