| 31 | let instancesCount = 0; |
| 32 | |
| 33 | export function autocomplete<TItem extends BaseItem>( |
| 34 | options: AutocompleteOptions<TItem> |
| 35 | ): AutocompleteApi<TItem> { |
| 36 | const { runEffect, cleanupEffects, runEffects } = createEffectWrapper(); |
| 37 | const { reactive, runReactives } = createReactiveWrapper(); |
| 38 | |
| 39 | const hasNoResultsSourceTemplateRef = createRef(false); |
| 40 | const optionsRef = createRef(options); |
| 41 | const onStateChangeRef = |
| 42 | createRef<AutocompleteOptions<TItem>['onStateChange']>(undefined); |
| 43 | const props = reactive(() => getDefaultOptions(optionsRef.current)); |
| 44 | const isDetached = reactive( |
| 45 | () => |
| 46 | props.value.core.environment.matchMedia( |
| 47 | props.value.renderer.detachedMediaQuery |
| 48 | ).matches |
| 49 | ); |
| 50 | |
| 51 | const autocomplete = reactive(() => |
| 52 | createAutocomplete<TItem>({ |
| 53 | ...props.value.core, |
| 54 | onStateChange(params) { |
| 55 | hasNoResultsSourceTemplateRef.current = params.state.collections.some( |
| 56 | (collection) => |
| 57 | (collection.source as AutocompleteSource<TItem>).templates.noResults |
| 58 | ); |
| 59 | onStateChangeRef.current?.(params as any); |
| 60 | props.value.core.onStateChange?.(params as any); |
| 61 | }, |
| 62 | shouldPanelOpen: |
| 63 | optionsRef.current.shouldPanelOpen || |
| 64 | (({ state }) => { |
| 65 | if (isDetached.value) { |
| 66 | return true; |
| 67 | } |
| 68 | |
| 69 | const hasItems = getItemsCount(state) > 0; |
| 70 | |
| 71 | if (!props.value.core.openOnFocus && !state.query) { |
| 72 | return hasItems; |
| 73 | } |
| 74 | |
| 75 | const hasNoResultsTemplate = Boolean( |
| 76 | hasNoResultsSourceTemplateRef.current || |
| 77 | props.value.renderer.renderNoResults |
| 78 | ); |
| 79 | |
| 80 | return (!hasItems && hasNoResultsTemplate) || hasItems; |
| 81 | }), |
| 82 | __autocomplete_metadata: { |
| 83 | userAgents, |
| 84 | options, |
| 85 | }, |
| 86 | }) |
| 87 | ); |
| 88 | const lastStateRef = createRef<AutocompleteState<TItem>>({ |
| 89 | collections: [], |
| 90 | completion: null, |