import React, { useCallback, useState } from "react"; import { Tabs, type TabsProps, cn } from "heroui-native"; import { NText } from "./NText"; export interface TabItem { label: string; value: string; isDisabled?: boolean; content?: React.ReactNode; } export interface NTabsProps extends Omit { items: TabItem[]; value?: string; /** Alias of `value`, as the React package names it. */ selected?: string; defaultValue?: string; onValueChange?: (value: string) => void; /** Alias of `onValueChange`. */ onChange?: (value: string) => void; listClassName?: string; triggerClassName?: string; contentClassName?: string; } export const NTabs = React.memo( ({ items, value, selected, defaultValue, onValueChange, onChange, className, listClassName, triggerClassName, contentClassName, ...props }) => { const controlled = value ?? selected; const change = onValueChange ?? onChange; const [internalValue, setInternalValue] = useState(defaultValue || items[0]?.value || ""); const activeValue = controlled ?? internalValue; const handleChange = useCallback( (v: string) => { if (controlled === undefined) setInternalValue(v); change?.(v); }, [controlled, change], ); return ( {items.map((item) => ( {item.label} ))} {items.map((item) => ( {typeof item.content === "string" ? {item.content} : item.content} ))} ); }, ); NTabs.displayName = "NTabs";