UNPKG

saagie-ui

Version:

Saagie UI from Saagie Design System

80 lines (69 loc) 1.63 kB
import React, { createContext, useContext, useEffect, useState, } from 'react'; import PropTypes from 'prop-types'; import { useId } from '@reach/auto-id'; const propTypes = { /** * Children to set inside the Tabs. * * @see Tabs * @see TabList * @see Tab * @see TabPanel */ children: PropTypes.node, /** * Use this property to control the selected name. */ name: PropTypes.string, /** * Function called on tab change. */ onChange: PropTypes.func, }; const defaultProps = { children: '', name: undefined, onChange: undefined, }; export const TabContext = createContext(); export const useTabContext = () => useContext(TabContext); /** * TabsProvider is the main component to manage tabs using context. */ export const TabsProvider = ({ children, onChange, name: controlledName, }) => { // On init, we want to use the name const [selectedName, setSelectedName] = useState(controlledName || ''); // If the name property of the component changes, we want to update the // selected name. useEffect(() => { if (controlledName) { setSelectedName(controlledName); } }, [controlledName]); const handleChangeTab = (name) => { setSelectedName(name); if (onChange) { onChange(name); } }; // Ensure unicity of id if there are multiple Tabs on the same page. const id = useId(); return ( <TabContext.Provider value={{ id, selectedName, handleChangeTab, }} > {children} </TabContext.Provider> ); }; TabsProvider.propTypes = propTypes; TabsProvider.defaultProps = defaultProps;