import React, {isValidElement} from 'react'; import {ScrollView, StyleProp, TouchableOpacity, View, ViewStyle} from 'react-native'; import {Popover as Pop, PopoverController} from './rnm-popover'; import {Placement} from './rnm-popover/PopoverGeometry'; import {WithTheme, WithThemeStyles} from '../style'; import PopoverStyles, {PopoverStyle} from './style'; export interface PopoverProps extends WithThemeStyles { triggerStyle?: StyleProp; onSelect?: (node: any, index?: number) => void; overlay: React.ReactNode; disabled?: boolean; renderOverlayComponent?: (node: React.ReactNode) => React.ReactNode; placement?: Placement | 'auto'; } export interface PopoverItemProps { value: any; [key: string]: any; disabled?: boolean; style?: StyleProp; } export class PopoverItem extends React.PureComponent { static displayName: 'PopoverItem'; render() { const {value, disabled, children, onSelect, style} = this.props; return ( {(_, theme) => ( { if (typeof onSelect === 'function') { onSelect(value); } }} style={[ { padding: theme.v_spacing_md, }, style, ]}> {children} )} ); } } export default class Popover extends React.PureComponent { static defaultProps = { onSelect: () => {}, }; static Item = PopoverItem; onSelect = (value: any, closePopover: any) => { const {onSelect} = this.props; if (onSelect) { onSelect(value); } closePopover(); }; renderOverlay = (closePopover: any) => { const {overlay, renderOverlayComponent} = this.props; const items = React.Children.map(overlay, (child) => { if (!isValidElement(child)) { return child; } return React.cloneElement(child, { onSelect: (v: any) => this.onSelect(v, closePopover), } as any); }); if (typeof renderOverlayComponent === 'function') { return renderOverlayComponent(items); } return {items}; }; render() { const {children, disabled, triggerStyle, styles, placement} = this.props; return ( {(s) => ( {({openPopover, closePopover, popoverVisible, setPopoverAnchor, popoverAnchorRect}) => ( {children} {this.renderOverlay(closePopover)} )} )} ); } }