@hanamura/rcgen
Version:
Generate optimized React container components from configuration
64 lines (53 loc) • 1.75 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = render;
function render(_config) {
return `// generated by static-generator
'use client'
import { useState, useEffect } from 'react'
/**
* Hook for creating responsive container components that adapt to breakpoints
*
* This hook handles media query matching and option merging to enable
* responsive behavior in container components.
*
* @param queries - Array of media query definitions with associated keys
* @param defaultValue - Default value to return if no media queries match
* @returns The active context key or the default value
*
* @typeParam T - Type for the return value
* @typeParam K - Type for breakpoint keys (e.g. 'mobile', 'tablet', 'desktop')
*/
export function useMediaQueries<T extends unknown, K extends string = string>(
queries: { name: K; query: string }[],
defaultValue: T
): K | T {
const [matches, setMatches] = useState<K | T>(defaultValue)
useEffect(() => {
if (typeof window === 'undefined') return
const mediaQueryLists = queries.map(({ name, query }) => ({
name,
mql: window.matchMedia(query),
}))
function updateMatches() {
const match = mediaQueryLists.findLast(({ mql }) => mql.matches)
if (match) {
setMatches(match.name)
} else {
setMatches(defaultValue)
}
}
mediaQueryLists.forEach(({ mql: mediaQueryList }) => {
mediaQueryList.addEventListener('change', updateMatches)
})
updateMatches()
return () => {
mediaQueryLists.forEach(({ mql: mediaQueryList }) => {
mediaQueryList.removeEventListener('change', updateMatches)
})
}
}, [queries])
return matches
}
`;
}