import { DocumentNode } from 'graphql'; import { ReactNode } from 'react'; import { Companies_Bool_Exp, People_Bool_Exp, Users_Bool_Exp, } from '../../../generated/graphql'; import { GraphqlQueryCompany } from '../../../interfaces/company.interface'; import { SEARCH_COMPANY_QUERY, SEARCH_PEOPLE_QUERY, } from '../../../services/search/search'; import { GraphqlQueryPerson } from '../../../interfaces/person.interface'; export type SortType = { label: string; key: SortKey; icon?: ReactNode; }; export type SelectedSortType = SortType & { order: 'asc' | 'desc'; }; export type FilterType> = { operands: FilterOperandType[]; label: string; key: string; icon: ReactNode; whereTemplate: ( operand: FilterOperandType, value: FilterValue, ) => WhereTemplate; searchQuery: DocumentNode; searchTemplate: ( searchInput: string, ) => People_Bool_Exp | Companies_Bool_Exp | Users_Bool_Exp; searchResultMapper: (data: any) => { displayValue: string; value: FilterValue; }; }; export type FilterOperandType = { label: string; id: string; keyWord: 'ilike' | 'not_ilike' | 'equal' | 'not_equal'; }; export type SelectedFilterType = FilterType & { value: string; operand: FilterOperandType; where: WhereTemplate; }; export function assertFilterUseCompanySearch( filter: FilterType, ): filter is FilterType & { searchResultMapper: (data: GraphqlQueryCompany) => { displayValue: string; value: FilterValue; }; } { return filter.searchQuery === SEARCH_COMPANY_QUERY; } export function assertFilterUsePeopleSearch( filter: FilterType, ): filter is FilterType & { searchResultMapper: (data: GraphqlQueryPerson) => { displayValue: string; value: FilterValue; }; } { return filter.searchQuery === SEARCH_PEOPLE_QUERY; }