import { Snippet } from "@/components/Snippet"; const reactNestedPropsSnippets = [ { name: "JSX", codeLanguage: "jsx", withLineNumbers: true, code: `import { useState } from "react"; const App = () => { const [theme, setTheme] = useState("light"); return ; }; const A = ({ theme, setTheme }) => { return ; }; const B = ({ theme, setTheme }) => { return ; };`, }, { name: "TSX", codeLanguage: "tsx", withLineNumbers: true, code: `import type { Dispatch, SetStateAction } from "react"; import { useState } from "react"; type Theme = "light" | "dark"; const App = () => { const [theme, setTheme] = useState("light"); return ; }; const A = ({ theme, setTheme }: { theme: Theme; setTheme: Dispatch> }) => { return ; }; const B = ({ theme, setTheme }: { theme: Theme; setTheme: Dispatch> }) => { return ; };`, }, ]; const reactCreateContextSnippets = [ { name: "JSX", codeLanguage: "jsx", withLineNumbers: true, code: `import { createContext } from "react"; // On crée notre contexte, avec une valeur par défaut : un thème clair const ThemeContext = createContext({ theme: "light", setTheme: () => {}, });`, }, { name: "TSX", codeLanguage: "tsx", withLineNumbers: true, code: `import type { Dispatch, SetStateAction } from "react"; import { createContext } from "react"; // On crée un type pour les valeurs de thème export type Theme = "light" | "dark"; // On crée un type pour notre contexte type ThemeContextType = { theme: Theme; setTheme: Dispatch>; }; // On crée notre contexte, avec une valeur par défaut : un thème clair const ThemeContext = createContext({ theme: "light", setTheme: () => {}, });`, }, ]; const reactContextProviderSnippets = [ { name: "JSX", codeLanguage: "jsx", withLineNumbers: true, code: `import { useState } from "react"; const App = () => { const [theme, setTheme] = useState("light"); return ( ); };`, }, { name: "TSX", codeLanguage: "tsx", withLineNumbers: true, code: `import type { Theme } from "./ThemeContext"; import { useState } from "react"; const App = () => { const [theme, setTheme] = useState("light"); return ( ); };`, }, ]; const reactContextProviderWithValuesSnippets = [ { name: "JSX", codeLanguage: "jsx", withLineNumbers: true, code: `import { createContext, useState } from "react"; const ThemeContext = createContext({ theme: "light", setTheme: () => {}, }); const ThemeProvider = ({ children }) => { const [theme, setTheme] = useState("light"); return {children}; }; export { ThemeContext, ThemeProvider };`, }, { name: "TSX", codeLanguage: "tsx", withLineNumbers: true, code: `import type { ReactNode } from "react"; import { createContext, useState } from "react"; export type Theme = "light" | "dark"; type ThemeContextType = { theme: Theme; setTheme: Dispatch>; }; const ThemeContext = createContext({ theme: "light", setTheme: () => {}, }); type ThemeProviderProps = { children: ReactNode; }; const ThemeProvider = ({ children }: ThemeProviderProps) => { const [theme, setTheme] = useState("light"); return {children}; }; export { ThemeContext, ThemeProvider };`, }, ]; const reactContextProviderInAppSnippets = [ { name: "App.jsx", codeLanguage: "jsx", withLineNumbers: true, code: `import { ThemeProvider } from "./ThemeContext"; import A from "./A"; const App = () => { return ( ); };`, }, ]; const reactUseContextSnippets = [ { name: "Utilisation du hook `useContext`", codeLanguage: "jsx", withLineNumbers: true, code: `import { ThemeContext } from "./ThemeContext"; import { useContext } from "react"; const C = () => { const { theme, setTheme } = useContext(ThemeContext); return <>{/** JSX */}; };`, }, ]; const reactContextHellSnippets = [ { name: "Exemple de contexte imbriqué", codeLanguage: "jsx", withLineNumbers: true, code: `root.render( , );`, }, ]; const reactContextProvidersComponentSnippets = [ { name: "JSX", codeLanguage: "jsx", withLineNumbers: true, code: `const Providers = ({ providers, children }) => { return ( <> {/** Ouverture des providers */} {children} {/** Fermeture des providers */} ); };`, }, { name: "TSX", codeLanguage: "tsx", withLineNumbers: true, code: `import type { ReactNode } from "react"; type ProvidersProps = { providers: ReactNode[]; children: ReactNode; }; const Providers = ({ providers, children }: ProvidersProps) => { return ( <> {/** Ouverture des providers */} {children} {/** Fermeture des providers */} ); };`, }, ]; const reactNestFunctionSnippets = [ { name: "JSX", codeLanguage: "jsx", code: `const nest = (children, component) => { return React.cloneElement(component, {}, children); };`, }, { name: "TSX", codeLanguage: "tsx", code: `const nest = (children: ReactNode, component: ReactNode) => { return React.cloneElement(component, {}, children); };`, }, ]; const reactNestFunctionWithReduceRightSnippets = [ { name: "JSX", codeLanguage: "jsx", code: `const nest = (children, component) => { return React.cloneElement(component, {}, children); }; const Providers = ({ providers, children }) => { return providers.reduceRight(nest, children); };`, }, { name: "TSX", codeLanguage: "tsx", code: `import type { ReactNode } from "react"; type ProvidersProps = { providers: ReactNode[]; children: ReactNode; }; const nest = (children: ReactNode, component: ReactNode) => { return React.cloneElement(component, {}, children); }; const Providers = ({ providers, children }: ProvidersProps) => { return providers.reduceRight(nest, children); };`, }, ]; const reactCleanerProvidersSnippets = [ { name: "Import lisible et maintenable pour les providers", codeLanguage: "jsx", code: `root.render( , , , , , , , // ... ]} > , );`, }, ]; export default { reactNestedProps: () => , reactCreateContext: () => , reactContextProvider: () => ( ), reactContextProviderWithValues: () => ( ), reactContextProviderInApp: () => ( ), reactUseContext: () => , reactContextHell: () => , reactContextProvidersComponent: () => ( ), reactNestFunction: () => , reactNestFunctionWithReduceRight: () => ( ), reactCleanerProviders: () => ( ), };