( manager: MetadataManager, )
| 221 | }>; |
| 222 | |
| 223 | export function makeUseEmbeddedMetadata( |
| 224 | manager: MetadataManager, |
| 225 | ): () => UseEmbeddedMetadataResult { |
| 226 | return function useEmbeddedMetadata(): UseEmbeddedMetadataResult { |
| 227 | // Hook binds re-renders to the memory reference of the entire exposed |
| 228 | // metadata object, meaning that even if you only care about one metadata |
| 229 | // property, the hook will cause a component to re-render if the object |
| 230 | // changes at all. If this becomes a performance issue down the line, we can |
| 231 | // look into selector functions to minimize re-renders, but let's wait |
| 232 | const metadata = useSyncExternalStore( |
| 233 | manager.subscribe, |
| 234 | manager.getMetadata, |
| 235 | ); |
| 236 | |
| 237 | const stableMetadataResult = useMemo<UseEmbeddedMetadataResult>(() => { |
| 238 | return { |
| 239 | metadata, |
| 240 | clearMetadataByKey: manager.clearMetadataByKey, |
| 241 | }; |
| 242 | }, [metadata]); |
| 243 | |
| 244 | return stableMetadataResult; |
| 245 | }; |
| 246 | } |
| 247 | |
| 248 | export const defaultMetadataManager = new MetadataManager(); |
| 249 | export const useEmbeddedMetadata = makeUseEmbeddedMetadata( |
no outgoing calls