1+ import { TabApi , TabPageApi , TabBladeParams , FolderApi } from '@tweakpane/core'
2+ import { RefObject , useLayoutEffect , useRef } from 'react'
3+ import { FolderInstance } from './usePaneFolder'
4+
5+ interface UseTabBladeParams {
6+ pages : {
7+ title : string ;
8+ } [ ] ;
9+ }
10+
11+ export function asFolderInstance < T extends object > (
12+ tab : RefObject < TabPageInstance < T > >
13+ ) : RefObject < FolderInstance < T > > {
14+ return tab as unknown as RefObject < FolderInstance < T > >
15+ }
16+
17+ // Create a wrapper that makes TabPageApi behave like FolderApi
18+ export interface TabPageInstance < T extends { } > {
19+ instance : TabPageApi | FolderApi
20+ params : T
21+ }
22+
23+ export function useTabBlade < T extends Object > (
24+ paneRef : RefObject < FolderInstance < T > > ,
25+ params : UseTabBladeParams
26+ ) : {
27+ tabRef : RefObject < TabApi > ,
28+ tabs : RefObject < TabPageInstance < T > > [ ]
29+ } {
30+ const tabRef = useRef < TabApi > ( null ! )
31+ const tabsRef = useRef < RefObject < TabPageInstance < T > > [ ] > ( [ ] )
32+
33+ useLayoutEffect ( ( ) => {
34+ const pane = paneRef . current ?. instance
35+ if ( pane == null ) return
36+
37+ const tab = pane . addTab ( {
38+ ...params ,
39+ view : 'tab'
40+ } as TabBladeParams ) as TabApi
41+
42+ tabRef . current = tab
43+
44+ // Since TabPageApi implements ContainerApi, we can use it directly
45+ tabsRef . current = tab . pages . map ( page => ( {
46+ current : {
47+ instance : page ,
48+ params : paneRef . current ?. params || ( { } as T )
49+ }
50+ } ) )
51+
52+ return ( ) => {
53+ if ( tab . element ) tab . dispose ( )
54+ }
55+ } , [ ] )
56+
57+ return {
58+ tabRef,
59+ tabs : tabsRef . current
60+ }
61+ }
0 commit comments