with one click
context
Generate a new React Context with provider and hooks
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Generate a new React Context with provider and hooks
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
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.