|
| 1 | +import { useCallback, useEffect, useId, useMemo } from 'react'; |
| 2 | +import { |
| 3 | + ContextProvider, |
| 4 | + ContextSearch, |
| 5 | + type ContextSearchProps, |
| 6 | + type ContextSelectEvent, |
| 7 | + ContextClearEvent, |
| 8 | +} from '@equinor/fusion-react-context-selector'; |
| 9 | +import { useContextResolver } from './useContextResolver'; |
| 10 | + |
| 11 | +/** |
| 12 | + * See fusion-react-component storybook for available attributes |
| 13 | + * @link https://equinor.github.io/fusion-react-components/?path=/docs/data-contextselector--component |
| 14 | + * @returns JSX element |
| 15 | + */ |
| 16 | +export const ContextSelector = (props: ContextSearchProps): JSX.Element | null => { |
| 17 | + const contextSelectorId = useId(); |
| 18 | + const { |
| 19 | + resolver, |
| 20 | + provider, |
| 21 | + currentContext: [selectedContextItem], |
| 22 | + } = useContextResolver(); |
| 23 | + |
| 24 | + /** callback handler for context selector, when context is changed or cleared */ |
| 25 | + const onContextSelect = useCallback( |
| 26 | + (e: Event | ContextSelectEvent) => { |
| 27 | + if (provider) { |
| 28 | + if (e.type === 'select') { |
| 29 | + const ev = e as unknown as ContextSelectEvent; |
| 30 | + if (ev.nativeEvent.detail.selected.length) { |
| 31 | + provider.contextClient.setCurrentContext(ev.nativeEvent.detail.selected[0].id); |
| 32 | + } |
| 33 | + } else { |
| 34 | + provider.clearCurrentContext(); |
| 35 | + } |
| 36 | + } |
| 37 | + }, |
| 38 | + [provider], |
| 39 | + ); |
| 40 | + |
| 41 | + /** |
| 42 | + * Clears context when ctx has been cleared outside the selector. |
| 43 | + */ |
| 44 | + const clearEvent = useMemo(() => new ContextClearEvent({ date: Date.now() }), []); |
| 45 | + useEffect(() => { |
| 46 | + if (!selectedContextItem) { |
| 47 | + document.dispatchEvent(clearEvent); |
| 48 | + } |
| 49 | + }, [clearEvent, selectedContextItem]); |
| 50 | + |
| 51 | + if (!resolver) return null; |
| 52 | + |
| 53 | + return ( |
| 54 | + <div style={{ flex: 1, maxWidth: '480px' }}> |
| 55 | + <ContextProvider resolver={resolver}> |
| 56 | + <ContextSearch |
| 57 | + id={contextSelectorId} |
| 58 | + placeholder={props.placeholder ?? 'Search for context'} |
| 59 | + initialText={props.initialText ?? 'Start typing to search'} |
| 60 | + dropdownHeight={props.dropdownHeight ?? '300px'} |
| 61 | + variant={props.variant ?? 'header'} |
| 62 | + onSelect={(e: ContextSelectEvent) => onContextSelect(e)} |
| 63 | + selectTextOnFocus={true} |
| 64 | + previewItem={selectedContextItem} |
| 65 | + onClearContext={onContextSelect} |
| 66 | + /> |
| 67 | + </ContextProvider> |
| 68 | + </div> |
| 69 | + ); |
| 70 | +}; |
| 71 | + |
| 72 | +export default ContextSelector; |
0 commit comments