| import { ActionList } from '@primer/react' | |
| import React, { ReactNode } from 'react' | |
| import cx from 'classnames' | |
| import { PickerItem } from './Picker' | |
| import styles from './Fields.module.scss' | |
| export const Fields = (fieldProps: { | |
| open: boolean | |
| setOpen: React.Dispatch<React.SetStateAction<boolean>> | |
| items: PickerItem[] | |
| onSelect?: (item: PickerItem) => void | |
| renderItem?: (item: PickerItem) => ReactNode | string | |
| }) => { | |
| const { open, setOpen, items, onSelect, renderItem } = fieldProps | |
| return ( | |
| <ActionList selectionVariant="single" role="menu"> | |
| {items.map((item, i) => | |
| item.divider ? ( | |
| <ActionList.Divider key={`divider${i}`} /> | |
| ) : ( | |
| <ActionList.LinkItem | |
| as="a" | |
| key={item.text} | |
| href={item.href} | |
| active={item.selected === true} | |
| onSelect={() => { | |
| if (onSelect) onSelect(item) | |
| setOpen(!open) | |
| }} | |
| // These extra links in the pickers are not a part of the selection variant | |
| // in that they are generally external links, so we want to remove the selection | |
| // variant span box in front of it. To date there isn't a possibility to have | |
| // an ActionMenu in Primer that allow non-selection variant items with selection | |
| // variant items | |
| className={cx( | |
| (item.extra?.arrow || item.extra?.info) && styles.extrasDisplay, | |
| styles.linkItem, | |
| )} | |
| role={item.extra?.arrow || item.extra?.info ? 'menuitem' : 'menuitemradio'} | |
| > | |
| {renderItem ? renderItem(item) : item.text} | |
| </ActionList.LinkItem> | |
| ), | |
| )} | |
| </ActionList> | |
| ) | |
| } | |