|
1 |
| -import { createContext, useContext, useState, useEffect } from 'react' |
| 1 | +import { createContext, useContext, useState, useEffect, useMemo } from 'react' |
2 | 2 |
|
3 | 3 | type SideBarWidth = number
|
4 | 4 | const MIN_SIDEBAR_WIDTH = 300
|
@@ -95,39 +95,47 @@ export function SideBarProvider({ children }: { children: React.ReactNode }) {
|
95 | 95 | }, [width, setWidth])
|
96 | 96 |
|
97 | 97 | // Create the state and API objects
|
98 |
| - const state: SideBarState = { |
99 |
| - isOpen, |
100 |
| - width, |
101 |
| - } |
102 |
| - |
103 |
| - const api: SideBarAPI = { |
104 |
| - toggle: (open?: boolean) => { |
105 |
| - if (open !== undefined) { |
106 |
| - setIsOpen(open) |
107 |
| - } else { |
108 |
| - setIsOpen((prevOpen) => !prevOpen) |
109 |
| - } |
110 |
| - }, |
111 |
| - resize: (newWidth: SideBarWidth) => { |
112 |
| - const clampedWidth = Math.max( |
113 |
| - MIN_SIDEBAR_WIDTH, |
114 |
| - Math.min(MAX_SIDEBAR_WIDTH, newWidth) |
115 |
| - ) |
116 |
| - setWidth(clampedWidth) |
117 |
| - }, |
118 |
| - open: (state?: boolean) => { |
119 |
| - if (state !== undefined) { |
120 |
| - setIsOpen(state) |
121 |
| - } else { |
122 |
| - setIsOpen(true) |
123 |
| - } |
124 |
| - }, |
125 |
| - close: () => { |
126 |
| - setIsOpen(false) |
127 |
| - }, |
128 |
| - } |
| 98 | + const state: SideBarState = useMemo( |
| 99 | + () => ({ |
| 100 | + isOpen, |
| 101 | + width, |
| 102 | + }), |
| 103 | + [isOpen, width] |
| 104 | + ) |
| 105 | + |
| 106 | + const api: SideBarAPI = useMemo( |
| 107 | + () => ({ |
| 108 | + toggle: (open?: boolean) => { |
| 109 | + if (open !== undefined) { |
| 110 | + setIsOpen(open) |
| 111 | + } else { |
| 112 | + setIsOpen((prevOpen) => !prevOpen) |
| 113 | + } |
| 114 | + }, |
| 115 | + resize: (newWidth: SideBarWidth) => { |
| 116 | + const clampedWidth = Math.max( |
| 117 | + MIN_SIDEBAR_WIDTH, |
| 118 | + Math.min(MAX_SIDEBAR_WIDTH, newWidth) |
| 119 | + ) |
| 120 | + setWidth(clampedWidth) |
| 121 | + }, |
| 122 | + open: (state?: boolean) => { |
| 123 | + if (state !== undefined) { |
| 124 | + setIsOpen(state) |
| 125 | + } else { |
| 126 | + setIsOpen(true) |
| 127 | + } |
| 128 | + }, |
| 129 | + close: () => { |
| 130 | + setIsOpen(false) |
| 131 | + }, |
| 132 | + }), |
| 133 | + [] |
| 134 | + ) |
| 135 | + |
| 136 | + const value = useMemo(() => ({ state, api }), [state, api]) |
129 | 137 |
|
130 |
| - return <Context.Provider value={{ state, api }}>{children}</Context.Provider> |
| 138 | + return <Context.Provider value={value}>{children}</Context.Provider> |
131 | 139 | }
|
132 | 140 |
|
133 | 141 | export {
|
|
0 commit comments