import { Box, TableToolbar } from '@wix/design-system';
import React, { cloneElement, Fragment, isValidElement, useMemo } from 'react';
import { classes, st } from './SearchOrCustomFilter.st.css.js';
import { ToolbarBaseProps } from '../ToolbarCollection';
import { useToolbarCollectionContext } from '../ToolbarCollectionContext';
import { observer } from 'mobx-react-lite';
import { useIsMobile } from '../../hooks/useIsMobile';
import { CollectionSearchElement } from '../assertComponentType.js';
import { runInAction } from 'mobx';
import {
SEARCH_COLLAPSED_WIDTH,
SEARCH_EXPANDED_WIDTH,
} from '../../state/Toolbar/toolbarResponsiveConstants';
export interface SearchOrCustomFilterProps {
search: ToolbarBaseProps['search'];
state: {
_searchExpanded: boolean;
};
}
function _SearchOrCustomFilter(props: SearchOrCustomFilterProps) {
const { search: _search, state } = props;
const {
toolbar: { responsive },
} = useToolbarCollectionContext();
const { search: searchResponsive, responsiveDisabled } = responsive;
const isMobile = useIsMobile();
const isSearchExpanded = state._searchExpanded;
const { search, isExpandable } = useMemo(() => {
if (!isValidElement(_search)) {
return {
search: _search,
isExpandable: false,
};
}
const element = cloneElement(_search as CollectionSearchElement, {
onExpandTransitionStart: (collapsed?: boolean) => {
runInAction(() => {
if (!collapsed) {
state._searchExpanded = true;
}
});
},
onExpandTransitionEnd: (collapsed?: boolean) => {
runInAction(() => {
if (collapsed) {
state._searchExpanded = false;
}
});
},
});
return {
search: element,
isExpandable: element.props.expandable,
};
}, [_search]);
if (responsiveDisabled || isMobile) {
let child = search;
if (isMobile) {
child = (
{isMobile && isValidElement(_search) && (
{/* render extra hidden search for measurement as the actual search is positioned absolutely */}
{cloneElement(_search as CollectionSearchElement, {
dataHook: `collection-search-mobile-measurement`,
// bypass stateful behavior on mobile for measurement
value: '',
onChange: () => {},
})}
)}
{search}
);
}
return (
{child}
);
}
const shouldShrink = searchResponsive._shouldShrink;
const width = shouldShrink ? SEARCH_COLLAPSED_WIDTH : SEARCH_EXPANDED_WIDTH;
return (
{search}
);
}
export const SearchOrCustomFilter = observer(_SearchOrCustomFilter);