import React, { useState } from 'react'; import { connect } from 'react-redux'; import { Input, Icon } from 'UI'; import FilterModal from 'Shared/Filters/FilterModal'; import { debounce } from 'App/utils'; import { assist as assistRoute, isRoute } from 'App/routes'; import { addFilterByKeyAndValue, fetchFilterSearch, edit, clearSearch } from 'Duck/search'; import { addFilterByKeyAndValue as liveAddFilterByKeyAndValue, fetchFilterSearch as liveFetchFilterSearch, } from 'Duck/liveSearch'; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; import { Segmented } from 'antd'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import { EnterOutlined, CloseOutlined } from '@ant-design/icons'; const ASSIST_ROUTE = assistRoute(); interface Props { fetchFilterSearch: (query: any) => void; addFilterByKeyAndValue: (key: string, value: string) => void; liveAddFilterByKeyAndValue: (key: string, value: string) => void; liveFetchFilterSearch: any; appliedFilter: any; edit: typeof edit; clearSearch: typeof clearSearch; } function SessionSearchField(props: Props) { const isLive = isRoute(ASSIST_ROUTE, window.location.pathname) || window.location.pathname.includes('multiview'); const debounceFetchFilterSearch = React.useCallback( debounce(isLive ? props.liveFetchFilterSearch : props.fetchFilterSearch, 1000), [] ); const [showModal, setShowModal] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const onSearchChange = ({ target: { value } }: any) => { setSearchQuery(value); debounceFetchFilterSearch({ q: value }); }; const onAddFilter = (filter: any) => { isLive ? props.liveAddFilterByKeyAndValue(filter.key, filter.value) : props.addFilterByKeyAndValue(filter.key, filter.value); }; const onFocus = () => { setShowModal(true); }; const onBlur = () => { setTimeout(() => { setShowModal(false); }, 200); }; return (
{showModal && (
)}
); } const AiSearchField = observer(({ edit, appliedFilter, clearSearch }: Props) => { const hasFilters = appliedFilter && appliedFilter.filters && appliedFilter.filters.size > 0; const { aiFiltersStore } = useStore(); const [searchQuery, setSearchQuery] = useState(''); const debounceAiFetch = React.useCallback(debounce(aiFiltersStore.getSearchFilters, 1000), []); const onSearchChange = ({ target: { value } }: any) => { setSearchQuery(value); }; const fetchResults = () => { if (searchQuery) { debounceAiFetch(searchQuery); } }; const handleKeyDown = (event: any) => { if (event.key === 'Enter') { fetchResults(); } }; const clearAll = () => { clearSearch(); setSearchQuery(''); }; React.useEffect(() => { if (aiFiltersStore.filtersSetKey !== 0) { console.log('updating filters', aiFiltersStore.filters, aiFiltersStore.filtersSetKey); edit(aiFiltersStore.filters); } }, [aiFiltersStore.filters, aiFiltersStore.filtersSetKey]); return (
{hasFilters ? : }
) : null } /> ); }); function AiSessionSearchField(props: Props) { const [tab, setTab] = useState('search'); const [isFocused, setIsFocused] = useState(false); const boxStyle = isFocused ? gradientBox : gradientBoxUnfocused; return ( setIsFocused(false)} className={'bg-white rounded-lg'} >
setIsFocused(true)}> setTab(value as string)} options={[ { label: (
Search
), value: 'search', }, { label: (
Ask AI
), value: 'ask', }, ]} /> {tab === 'ask' ? : }
); } const gradientBox = { border: 'double 1px transparent', borderRadius: '6px', background: 'linear-gradient(#f6f6f6, #f6f6f6), linear-gradient(to right, #394EFF 0%, #3EAAAF 100%)', backgroundOrigin: 'border-box', backgroundClip: 'content-box, border-box', display: 'flex', gap: '0.25rem', alignItems: 'center', width: '100%', }; const gradientBoxUnfocused = { borderRadius: '6px', border: 'double 1px transparent', background: '#f6f6f6', display: 'flex', gap: '0.25rem', alignItems: 'center', width: '100%', }; export default connect( (state: any) => ({ appliedFilter: state.getIn(['search', 'instance']), }), { addFilterByKeyAndValue, fetchFilterSearch, liveFetchFilterSearch, liveAddFilterByKeyAndValue, edit, clearSearch, } )(observer(AiSessionSearchField));