/* * Copyright © 2024 Hexastack. All rights reserved. * * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). * 3. SaaS Restriction: This software, or any derivative of it, may not be used to offer a competing product or service (SaaS) without prior written consent from Hexastack. Offering the software as a service or using it in a commercial cloud environment without express permission is strictly prohibited. */ import { debounce } from "@mui/material"; import { ChangeEvent, useState } from "react"; import { TParamItem, TBuildParamProps, TBuildInitialParamProps, } from "@/types/search.types"; const buildOrParams = ({ params, searchText }: TBuildParamProps) => ({ or: params?.map((field) => ({ [field]: { contains: searchText }, })), }); const buildILikeParams = ({ params, searchText }: TBuildParamProps) => params?.reduce( (acc, field) => ({ ...acc, [field]: { contains: searchText }, }), {}, ); const buildEqInitialParams = ({ initialParams, }: TBuildInitialParamProps) => initialParams?.reduce( (acc, obj) => ({ ...acc, ...obj, }), {}, ); const buildNeqInitialParams = ({ initialParams, }: TBuildInitialParamProps) => initialParams?.reduce( (acc, obj) => ({ ...acc, [Object.entries(obj)[0][0]]: { "!=": Object.entries(obj)[0][1], }, }), {}, ); export const useSearch = (params: TParamItem) => { const [searchText, setSearchText] = useState(""); const onSearch = debounce( (e: ChangeEvent | string) => { setSearchText(typeof e === "string" ? e : e.target.value); }, 300, ); const { $eq: eqInitialParams, $iLike: iLikeParams, $neq: neqInitialParams, $or: orParams, } = params; return { onSearch, searchPayload: { where: { ...buildEqInitialParams({ initialParams: eqInitialParams }), ...buildNeqInitialParams({ initialParams: neqInitialParams }), ...(searchText?.length > 0 && { ...buildOrParams({ params: orParams, searchText }), ...buildILikeParams({ params: iLikeParams, searchText }), }), }, }, }; };