11'use client' ;
22
33import clsx from 'clsx' ;
4- import { useCallback , useRef , useState , useSyncExternalStore } from 'react' ;
4+ import { useRef , useState } from 'react' ;
55import { mergeProps , useButton , useDisclosure , useFocusRing } from 'react-aria' ;
66import { useDisclosureState } from 'react-stately' ;
77
@@ -11,30 +11,6 @@ interface InteractiveSectionTab {
1111 body : React . ReactNode ;
1212}
1313
14- let globalState : Record < string , string > = { } ;
15- const listeners = new Set < ( ) => void > ( ) ;
16-
17- function useSyncedTabsGlobalState ( ) {
18- const subscribe = useCallback ( ( callback : ( ) => void ) => {
19- listeners . add ( callback ) ;
20- return ( ) => listeners . delete ( callback ) ;
21- } , [ ] ) ;
22-
23- const getSnapshot = useCallback ( ( ) => globalState , [ ] ) ;
24-
25- const setSyncedTabs = useCallback (
26- ( updater : ( tabs : Record < string , string > ) => Record < string , string > ) => {
27- globalState = updater ( globalState ) ;
28- listeners . forEach ( ( listener ) => listener ( ) ) ;
29- } ,
30- [ ] ,
31- ) ;
32-
33- const tabs = useSyncExternalStore ( subscribe , getSnapshot , getSnapshot ) ;
34-
35- return [ tabs , setSyncedTabs ] as const ;
36- }
37-
3814/**
3915 * To optimize rendering, most of the components are server-components,
4016 * and the interactiveness is mainly handled by a few key components like this one.
@@ -59,8 +35,6 @@ export function InteractiveSection(props: {
5935 children ?: React . ReactNode ;
6036 /** Children to display within the container */
6137 overlay ?: React . ReactNode ;
62- /** An optional key referencing a value in global state */
63- stateKey ?: string ;
6438} ) {
6539 const {
6640 id,
@@ -73,16 +47,11 @@ export function InteractiveSection(props: {
7347 children,
7448 overlay,
7549 toggleIcon = '▶' ,
76- stateKey,
7750 } = props ;
78- const [ syncedTabs , setSyncedTabs ] = useSyncedTabsGlobalState ( ) ;
79- const tabFromState =
80- stateKey && stateKey in syncedTabs
81- ? tabs . find ( ( tab ) => tab . key === syncedTabs [ stateKey ] )
82- : undefined ;
83- const [ selectedTabKey , setSelectedTab ] = useState ( tabFromState ?. key ?? defaultTab ) ;
51+
52+ const [ selectedTabKey , setSelectedTab ] = useState ( defaultTab ) ;
8453 const selectedTab : InteractiveSectionTab | undefined =
85- tabFromState ?? tabs . find ( ( tab ) => tab . key === selectedTabKey ) ?? tabs [ 0 ] ;
54+ tabs . find ( ( tab ) => tab . key === selectedTabKey ) ?? tabs [ 0 ] ;
8655
8756 const state = useDisclosureState ( {
8857 defaultExpanded : defaultOpened ,
@@ -153,12 +122,6 @@ export function InteractiveSection(props: {
153122 value = { selectedTab ?. key ?? '' }
154123 onChange = { ( event ) => {
155124 setSelectedTab ( event . target . value ) ;
156- if ( stateKey ) {
157- setSyncedTabs ( ( state ) => ( {
158- ...state ,
159- [ stateKey ] : event . target . value ,
160- } ) ) ;
161- }
162125 state . expand ( ) ;
163126 } }
164127 >
0 commit comments