# Astuces Cette page regroupe des astuces et bonnes pratiques pour le développement avec SmartMaker. ## Utiliser la configuration SmartCommon utilise ''LibConfigProvider'' pour centraliser la configuration de l'application. ``` // src/appConfig.js export const appConfig = { debug: true, // Active les logs de debug api: { prefixUrl: import.meta.env.VITE_API_URL, timeout: 30000, debug: true } }; ``` ``` // src/App.jsx import { Provider } from '@cap-rel/smartcommon'; import { appConfig } from './appConfig'; export const App = () => { return ( {/* Votre application */} ); }; ``` Pour accéder à la configuration dans un composant : ``` import { useLibConfig } from '@cap-rel/smartcommon'; const MyComponent = () => { const config = useLibConfig(); console.log(config.debug); // true }; ``` ## Composant Head Pour modifier le titre et les meta de la page, utilisez ''react-helmet'' : ``` import { Helmet } from 'react-helmet'; export const MyPage = () => { return ( <> Ma Page - Mon App {/* Contenu de la page */} ); }; ``` ## Composant Toaster SmartCommon intègre ''react-hot-toast'' pour les notifications. ``` import toast from 'react-hot-toast'; // Notification de succès toast.success('Enregistré avec succès !'); // Notification d'erreur toast.error('Une erreur est survenue'); // Notification personnalisée toast('Message neutre', { icon: '👋', duration: 4000, }); // Notification avec promesse toast.promise( saveData(), { loading: 'Enregistrement...', success: 'Données enregistrées', error: 'Échec de l\'enregistrement', } ); ``` Le ''Toaster'' est automatiquement inclus dans le ''Provider'' de SmartCommon. ## Utiliser les variables d'environnement Dans un environnement **Vite**, les variables d'environnement doivent être préfixées de ''VITE_''. ``` # .env VITE_API_URL=https://api.example.com VITE_APP_VERSION=1.0.0 VITE_APP_NAME=Mon Application ``` On peut ainsi les importer avec ''import.meta.env'' : ``` // src/utils/constants/vite.js export const API_URL = import.meta.env.VITE_API_URL; export const APP_VERSION = import.meta.env.VITE_APP_VERSION; export const APP_NAME = import.meta.env.VITE_APP_NAME; ``` Ne jamais commiter le fichier ''.env''. Utilisez ''.env.example'' comme modèle. ## Fichiers de traductions publiques Les fichiers de traduction peuvent être chargés dynamiquement depuis le dossier ''public'' : ``` public/ locales/ fr.json en.json es.json ``` Configuration i18next : ``` // src/i18n/index.js import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import HttpBackend from 'i18next-http-backend'; i18n .use(HttpBackend) .use(initReactI18next) .init({ fallbackLng: 'fr', backend: { loadPath: '/locales/{{lng}}.json', }, }); export { i18n }; ``` ## Faire des fichiers de traductions "namespace" Pour organiser les traductions par fonctionnalité : ``` public/ locales/ fr/ common.json login.json dashboard.json en/ common.json login.json dashboard.json ``` Configuration : ``` i18n.init({ ns: ['common', 'login', 'dashboard'], defaultNS: 'common', backend: { loadPath: '/locales/{{lng}}/{{ns}}.json', }, }); ``` Utilisation : ``` const { t } = useTranslation('login'); // ou const { t } = useTranslation(['login', 'common']); ``` ## Utiliser des préfixes avec useTranslation Pour éviter de répéter le chemin des clés : ``` // Sans préfixe const { t } = useTranslation(); t('loginPage.form.emailInput.label'); t('loginPage.form.emailInput.placeholder'); t('loginPage.form.passwordInput.label'); // Avec préfixe const { t } = useTranslation('translation', { keyPrefix: 'loginPage.form' }); t('emailInput.label'); t('emailInput.placeholder'); t('passwordInput.label'); ``` ## Fichiers CSS publiques Les fichiers CSS dans ''public/'' ne sont pas traités par Vite et sont servis tels quels : ``` public/ css/ custom-theme.css ``` Pour les charger dynamiquement : ``` // Charger un thème CSS au runtime const loadTheme = (themeName) => { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = `/css/${themeName}.css`; document.head.appendChild(link); }; ``` ## Retirer Tailwind CSS Si vous ne souhaitez pas utiliser Tailwind CSS : 1. Supprimer les dépendances : ``` npm uninstall tailwindcss @tailwindcss/vite ``` 2. Modifier ''vite.config.js'' : ``` import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; // Retirer: import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ plugins: [ react(), // Retirer: tailwindcss(), ] }); ``` 3. Supprimer les imports Tailwind dans vos fichiers CSS : ``` /* Retirer: @import "tailwindcss"; */ ``` ## Importer les fichiers CSS entre eux ### Avec Tailwind CSS 4 ``` /* src/assets/styles/style.css */ @import "tailwindcss"; @layer theme, base, components; @import "./theme.css" layer(theme); @import "./base.css" layer(base); @import "./components.css" layer(components); ``` ### En CSS classique ``` /* src/assets/styles/style.css */ @import "./variables.css"; @import "./base.css"; @import "./components.css"; ``` ## Faire un listener de changement de thème Pour détecter et réagir aux changements de thème (clair/sombre) : ``` import { useEffect, useState } from 'react'; export const useThemeDetector = () => { const [isDark, setIsDark] = useState( window.matchMedia('(prefers-color-scheme: dark)').matches ); useEffect(() => { const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); const handleChange = (e) => { setIsDark(e.matches); }; mediaQuery.addEventListener('change', handleChange); return () => mediaQuery.removeEventListener('change', handleChange); }, []); return isDark; }; ``` Utilisation : ``` const MyComponent = () => { const isDarkMode = useThemeDetector(); return (
Mode actuel : {isDarkMode ? 'Sombre' : 'Clair'}
); }; ``` Pour changer le thème manuellement avec ''useGlobalStates'' : ``` import { useGlobalStates } from '@cap-rel/smartcommon'; const ThemeSwitcher = () => { const gst = useGlobalStates(); const theme = gst.get('settings.theme') || 'light'; const toggleTheme = () => { gst.local.set('settings.theme', theme === 'light' ? 'dark' : 'light'); }; useEffect(() => { document.documentElement.setAttribute('data-theme', theme); }, [theme]); return ( ); }; ``` ## Voir aussi * [[smartcommon|SmartCommon]] - Liste des composants * [[hooks|Hooks]] - Documentation des hooks * [[themes|Thèmes]] - Personnalisation des thèmes