Files
flipper/desktop/flipper-plugin/src/ui/Tabs.tsx
James Wysynski 5551cf3bb2 Fix tab names [again]
Summary: child.hasOwnProperty -> child.props.hasOwnProperty for tabs

Reviewed By: udat

Differential Revision: D37751552

fbshipit-source-id: 78015bbc185387587ce3644c959596cf0a661ddf
2022-07-11 06:40:31 -07:00

111 lines
2.4 KiB
TypeScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import * as React from 'react';
import {Children} from 'react';
import {Tabs as AntdTabs, TabsProps, TabPaneProps} from 'antd';
import {css, cx} from '@emotion/css';
import {Layout} from './Layout';
import {Spacing} from './theme';
import {useLocalStorageState} from '../utils/useLocalStorageState';
/**
* A Tabs component.
*/
export function Tabs({
grow,
children,
className,
...baseProps
}: {grow?: boolean} & TabsProps) {
const keys: string[] = [];
const keyedChildren = Children.map(children, (child: any, idx) => {
if (!child || typeof child !== 'object') {
return;
}
const tabKey =
(child.props.hasOwnProperty('tabKey') &&
typeof child.props.tabKey === 'string' &&
child.props.tabKey) ||
(child.props.hasOwnProperty('tab') &&
typeof child.props.tab === 'string' &&
child.props.tab) ||
(child.props.hasOwnProperty('key') &&
typeof child.props.key === 'string' &&
child.props.key) ||
`tab_${idx}`;
keys.push(tabKey);
return {
...child,
props: {
...child.props,
key: tabKey,
tabKey,
},
};
});
const [activeTab, setActiveTab] = useLocalStorageState<string | undefined>(
'Tabs:' + keys.join(','),
undefined,
);
return (
<AntdTabs
activeKey={activeTab}
onChange={(key) => {
setActiveTab(key);
}}
{...baseProps}
className={cx(
className,
baseTabs,
grow !== false ? growingTabs : undefined,
)}>
{keyedChildren}
</AntdTabs>
);
}
export const Tab: React.FC<
TabPaneProps & {
pad?: Spacing;
gap?: Spacing;
}
> = function Tab({pad, gap, children, ...baseProps}) {
return (
<AntdTabs.TabPane {...baseProps}>
<Layout.Container gap={gap} pad={pad} grow style={{maxWidth: '100%'}}>
{children}
</Layout.Container>
</AntdTabs.TabPane>
);
};
const baseTabs = css`
& .ant-tabs-nav {
margin: 0;
padding-left: 8px;
padding-right: 8px;
}
`;
const growingTabs = css`
flex: 1;
& .tabpanel {
display: flex;
}
& .ant-tabs-content {
height: 100%;
}
& .ant-tabs-tabpane {
display: flex;
}
`;