/* eslint-disable react/require-default-props */ import type { ComponentType, HTMLAttributes } from 'react'; import React, { useState } from 'react'; import { SafeImage } from '@teambit/base-react.content.image'; import type { FileIconMatch } from '@teambit/code.ui.utils.get-file-icon'; import { getFileIcon } from '@teambit/code.ui.utils.get-file-icon'; import type { NavPlugin } from '@teambit/component'; import { CollapsibleMenuNav } from '@teambit/component'; import type { WidgetProps } from '@teambit/ui-foundation.ui.tree.tree-node'; import classNames from 'classnames'; import { Dropdown } from '@teambit/evangelist.surfaces.dropdown'; import styles from './code-compare-navigation.module.scss'; export type CodeCompareNavigationProps = { Menu: React.ReactNode; files: string[]; selectedFile: string; fileIconMatchers: FileIconMatch[]; getHref: (node: { id: string }) => string; onTabClicked?: (id: string, event?: React.MouseEvent) => void; widgets?: ComponentType>[]; }; type CodeCompareNavProps = { files: string[]; selectedFile: string; fileIconMatchers: FileIconMatch[]; onTabClicked?: (id: string, event?: React.MouseEvent) => void; getHref: (node: { id: string }) => string; widgets?: ComponentType>[]; } & HTMLAttributes; function CodeCompareNav({ files, selectedFile, fileIconMatchers, onTabClicked = () => {}, getHref, children, widgets = [], }: CodeCompareNavProps) { const selectedFileIndex = files.findIndex((file) => file === selectedFile); const extractedTabs: [string, NavPlugin][] = React.useMemo( () => files.map((file, index) => { const isActive = file === selectedFile; const href = getHref({ id: file }); const icon = getFileIcon(fileIconMatchers, file); return [ file, { props: { href, active: isActive, onClick: onTabClicked && ((e) => onTabClicked(file, e)), activeClassName: styles.activeNav, className: classNames(styles.compareNavItem, index === 0 && styles.first), children: (
{icon && } {file}
{widgets?.map((Widget, widgetIndex) => )}
), ignoreQueryParams: true, }, }, ]; }), [files.join(''), selectedFile] ); return (
{children}
); } export function CodeCompareNavigation({ files, selectedFile, fileIconMatchers, onTabClicked, getHref, widgets, Menu, }: CodeCompareNavigationProps) { const [open, setOpen] = useState(); return (
settings-icon
} clickPlaceholderToggles clickOutside position="left-start" clickToggles={false} onPlaceholderToggle={() => setOpen((o) => !o)} onClickOutside={() => { setOpen(false); }} > {Menu}
); }