11import {
22 Dispatch ,
3- FC ,
43 MutableRefObject ,
54 ReactNode ,
65 SetStateAction ,
@@ -19,28 +18,28 @@ import { ActiveTabTipIcon, IconOutline } from '../svgs'
1918import { TabsNavItem } from './tabs-nav-item.model'
2019import styles from './TabsNavbar.module.scss'
2120
22- export interface TabsNavbarProps {
23- defaultActive : string
24- onChange : ( active : string ) => void
25- tabs : ReadonlyArray < TabsNavItem >
21+ export interface TabsNavbarProps < T > {
22+ defaultActive : T
23+ onChange : ( active : T ) => void
24+ tabs : ReadonlyArray < TabsNavItem < T > >
2625}
2726
28- const TabsNavbar : FC < TabsNavbarProps > = ( props : TabsNavbarProps ) => {
27+ const TabsNavbar = < T , > ( props : TabsNavbarProps < T > ) : JSX . Element => {
2928 const query : URLSearchParams = new URLSearchParams ( window . location . search )
30- const initialTab : MutableRefObject < string | null > = useRef < string | null > ( query . get ( 'tab' ) )
29+ const initialTab : MutableRefObject < T | undefined > = useRef < T | undefined > ( query . get ( 'tab' ) as T )
3130
32- const [ tabOpened , setTabOpened ] : [ string | undefined , Dispatch < SetStateAction < string | undefined > > ]
33- = useState < string | undefined > ( props . defaultActive )
31+ const [ tabOpened , setTabOpened ] : [ T | undefined , Dispatch < SetStateAction < T | undefined > > ]
32+ = useState < T | undefined > ( props . defaultActive )
3433 const tabRefs : MutableRefObject < Array < HTMLElement > > = useRef ( [ ] as Array < HTMLElement > )
3534 const [ offset , setOffset ] : [ number , Dispatch < SetStateAction < number > > ] = useState < number > ( 0 )
3635 const [ menuIsVisible , setMenuIsVisible ] : [ boolean , Dispatch < SetStateAction < boolean > > ] = useState ( false )
3736 const triggerRef : MutableRefObject < any > = useRef ( undefined )
3837
39- const activeTab : TabsNavItem = useMemo ( ( ) => (
40- props . tabs . find ( tab => tab . id === tabOpened ) as TabsNavItem
38+ const activeTab : TabsNavItem < T > = useMemo ( ( ) => (
39+ props . tabs . find ( tab => tab . id === tabOpened ) as TabsNavItem < T >
4140 ) , [ tabOpened , props . tabs ] )
4241
43- const updateOffset : ( tabId : string ) => void = useCallback ( ( tabId : string ) => {
42+ const updateOffset : ( tabId : T ) => void = useCallback ( ( tabId : T ) => {
4443
4544 const index : number = props . tabs . findIndex ( tab => tab . id === tabId )
4645 if ( index === - 1 ) {
@@ -54,7 +53,7 @@ const TabsNavbar: FC<TabsNavbarProps> = (props: TabsNavbarProps) => {
5453 props . tabs ,
5554 ] )
5655
57- const handleActivateTab : ( tabId : string ) => ( ) => void = useCallback ( ( tabId : string ) => ( ) => {
56+ const handleActivateTab : ( tabId : T ) => ( ) => void = useCallback ( ( tabId : T ) => ( ) => {
5857 setTabOpened ( tabId )
5958 props . onChange . call ( undefined , tabId )
6059 updateOffset ( tabId )
@@ -74,7 +73,7 @@ const TabsNavbar: FC<TabsNavbarProps> = (props: TabsNavbarProps) => {
7473 && props . tabs . find ( tab => tab . id === initialTab . current )
7574 ) {
7675 handleActivateTab ( initialTab . current ) ( )
77- initialTab . current = ''
76+ initialTab . current = undefined
7877 } else if ( props . defaultActive ) {
7978 setTabOpened ( props . defaultActive )
8079 updateOffset ( props . defaultActive )
@@ -87,7 +86,7 @@ const TabsNavbar: FC<TabsNavbarProps> = (props: TabsNavbarProps) => {
8786 ] )
8887
8988 const renderTabItem : (
90- tab : TabsNavItem ,
89+ tab : TabsNavItem < T > ,
9190 activeTabId ?: string ,
9291 ref ?: ( el : HTMLElement | null ) => void
9392 ) => ReactNode = (
@@ -122,7 +121,7 @@ const TabsNavbar: FC<TabsNavbarProps> = (props: TabsNavbarProps) => {
122121 < div
123122 ref = { ref }
124123 className = { classNames ( styles [ 'tab-item' ] , activeTabId === tab . id && 'active' ) }
125- key = { tab . id }
124+ key = { tab . id as string }
126125 onClick = { handleActivateTab ( tab . id ) }
127126 >
128127 { tabContent }
@@ -151,7 +150,7 @@ const TabsNavbar: FC<TabsNavbarProps> = (props: TabsNavbarProps) => {
151150
152151 < div className = { classNames ( styles [ 'menu-wrapper' ] ) } >
153152 { props . tabs . map ( ( tab , i ) => (
154- renderTabItem ( tab , tabOpened , el => { tabRefs . current [ i ] = el as HTMLElement } )
153+ renderTabItem ( tab , tabOpened as string , el => { tabRefs . current [ i ] = el as HTMLElement } )
155154 ) ) }
156155 </ div >
157156 < div
0 commit comments