mirror of https://github.com/buster-so/buster.git
54 lines
1.6 KiB
Plaintext
54 lines
1.6 KiB
Plaintext
|
---
|
||
|
description: Rules for the context directory
|
||
|
globs: src/context/**/*
|
||
|
---
|
||
|
|
||
|
# Context Creation Pattern
|
||
|
|
||
|
When creating new contexts in this project, we use the `@fluentui/react-context-selector` library for optimized context consumption. Follow this pattern:
|
||
|
|
||
|
1. Create the context using `createContext`:
|
||
|
```typescript
|
||
|
const MyContext = createContext<ReturnType<typeof useMyHook>>({} as ReturnType<typeof useMyHook>);
|
||
|
```
|
||
|
|
||
|
2. Create a Provider component:
|
||
|
```typescript
|
||
|
export const MyContextProvider: React.FC<PropsWithChildren> = React.memo(({ children }) => {
|
||
|
return (
|
||
|
<MyContext.Provider value={useMyHook()}>
|
||
|
{children}
|
||
|
</MyContext.Provider>
|
||
|
);
|
||
|
});
|
||
|
MyContextProvider.displayName = 'MyContextProvider';
|
||
|
```
|
||
|
|
||
|
3. Create a selector hook for consuming the context:
|
||
|
```typescript
|
||
|
export const useMyContextSelector = <T,>(
|
||
|
selector: ContextSelector<ReturnType<typeof useMyHook>, T>
|
||
|
) => {
|
||
|
return useContextSelector(MyContext, selector);
|
||
|
};
|
||
|
```
|
||
|
|
||
|
## Key Points
|
||
|
- Always use TypeScript for proper type inference
|
||
|
- Wrap the Provider component with `React.memo()` for performance optimization
|
||
|
- Set a `displayName` for better debugging
|
||
|
- Export the selector hook for consuming components to use
|
||
|
- Use `PropsWithChildren` type for the Provider component
|
||
|
|
||
|
## Benefits
|
||
|
- The context selector pattern allows for partial context updates without full re-renders
|
||
|
- TypeScript integration ensures type safety throughout the context usage
|
||
|
- Memoization of the Provider component prevents unnecessary re-renders
|
||
|
|
||
|
## Example Usage
|
||
|
```typescript
|
||
|
// In a consumer component:
|
||
|
const someValue = useMyContextSelector(context => context.someValue);
|
||
|
```
|
||
|
|