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 (
);
}
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 (
) : 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));