com um clique
context
Generate a new React Context with provider and hooks
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
Generate a new React Context with provider and hooks
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
Generate a new React component with Mantine styling
Update documentation after implementing features or making changes
Run a quick architecture review via architect-reviewer agent
Generate mobile-specific React components with platform detection and safe areas
Run a quick security audit on recent changes or specific files
Generate a test file for a component, hook, or utility
| name | context |
| description | Generate a new React Context with provider and hooks |
Generates a complete React Context following Skelenote patterns.
src/contexts/{ContextName}Context.tsx:
import {
createContext,
useContext,
useState,
useCallback,
useMemo,
ReactNode,
FC,
} from 'react';
// Types
interface ContextNameState {
value1: string;
value2: number;
}
interface ContextNameContextValue extends ContextNameState {
setValue1: (value: string) => void;
setValue2: (value: number) => void;
reset: () => void;
}
// Context
const ContextNameContext = createContext<ContextNameContextValue | null>(null);
// Provider
interface ContextNameProviderProps {
children: ReactNode;
}
export const ContextNameProvider: FC<ContextNameProviderProps> = ({ children }) => {
const [value1, setValue1State] = useState<string>('');
const [value2, setValue2State] = useState<number>(0);
const setValue1 = useCallback((value: string) => {
setValue1State(value);
}, []);
const setValue2 = useCallback((value: number) => {
setValue2State(value);
}, []);
const reset = useCallback(() => {
setValue1State('');
setValue2State(0);
}, []);
const value = useMemo<ContextNameContextValue>(
() => ({
value1,
value2,
setValue1,
setValue2,
reset,
}),
[value1, value2, setValue1, setValue2, reset]
);
return (
<ContextNameContext.Provider value={value}>
{children}
</ContextNameContext.Provider>
);
};
// Hooks
export function useContextName(): ContextNameContextValue {
const context = useContext(ContextNameContext);
if (!context) {
throw new Error('useContextName must be used within ContextNameProvider');
}
return context;
}
export function useContextNameSafe(): ContextNameContextValue | null {
return useContext(ContextNameContext);
}
Update src/contexts/index.ts:
export { ContextNameProvider, useContextName, useContextNameSafe } from './ContextNameContext';
// src/contexts/FilterContext.tsx
import {
createContext,
useContext,
useState,
useCallback,
useMemo,
ReactNode,
FC,
} from 'react';
interface FilterState {
searchQuery: string;
typeFilter: string[];
statusFilter: string | null;
}
interface FilterContextValue extends FilterState {
setSearchQuery: (query: string) => void;
setTypeFilter: (types: string[]) => void;
setStatusFilter: (status: string | null) => void;
clearFilters: () => void;
hasActiveFilters: boolean;
}
const FilterContext = createContext<FilterContextValue | null>(null);
const initialState: FilterState = {
searchQuery: '',
typeFilter: [],
statusFilter: null,
};
interface FilterProviderProps {
children: ReactNode;
}
export const FilterProvider: FC<FilterProviderProps> = ({ children }) => {
const [searchQuery, setSearchQueryState] = useState(initialState.searchQuery);
const [typeFilter, setTypeFilterState] = useState(initialState.typeFilter);
const [statusFilter, setStatusFilterState] = useState(initialState.statusFilter);
const setSearchQuery = useCallback((query: string) => {
setSearchQueryState(query);
}, []);
const setTypeFilter = useCallback((types: string[]) => {
setTypeFilterState(types);
}, []);
const setStatusFilter = useCallback((status: string | null) => {
setStatusFilterState(status);
}, []);
const clearFilters = useCallback(() => {
setSearchQueryState(initialState.searchQuery);
setTypeFilterState(initialState.typeFilter);
setStatusFilterState(initialState.statusFilter);
}, []);
const hasActiveFilters = useMemo(
() => searchQuery !== '' || typeFilter.length > 0 || statusFilter !== null,
[searchQuery, typeFilter, statusFilter]
);
const value = useMemo<FilterContextValue>(
() => ({
searchQuery,
typeFilter,
statusFilter,
setSearchQuery,
setTypeFilter,
setStatusFilter,
clearFilters,
hasActiveFilters,
}),
[
searchQuery,
typeFilter,
statusFilter,
setSearchQuery,
setTypeFilter,
setStatusFilter,
clearFilters,
hasActiveFilters,
]
);
return (
<FilterContext.Provider value={value}>
{children}
</FilterContext.Provider>
);
};
export function useFilter(): FilterContextValue {
const context = useContext(FilterContext);
if (!context) {
throw new Error('useFilter must be used within FilterProvider');
}
return context;
}
export function useFilterSafe(): FilterContextValue | null {
return useContext(FilterContext);
}
src/contexts/src/contexts/index.tsuseMemouseCallbackany typesAdd new providers in src/App.tsx:
<NewProvider>
<ExistingProviders>
{/* ... */}
</ExistingProviders>
</NewProvider>
Order matters for contexts that depend on each other.