import dayjs from 'dayjs'; import { SlidersHorizontal } from 'lucide-react'; import { ComponentProps, useCallback, useMemo } from 'react'; import { DateRangePicker } from '@/common/components/organisms/DateRangePicker/DateRangePicker'; import { useLocale } from '@/common/hooks/useLocale/useLocale'; import { usePagination } from '@/common/hooks/usePagination/usePagination'; import { useSearch } from '@/common/hooks/useSearch/useSearch'; import { useZodSearchParams } from '@/common/hooks/useZodSearchParams/useZodSearchParams'; import { IS_ALERT_TO_DISPLAY_TEXT } from '@/pages/MerchantMonitoring/schemas'; import { useAuthenticatedUserQuery } from '@/domains/auth/hooks/queries/useAuthenticatedUserQuery/useAuthenticatedUserQuery'; import { KybAndOwnershipAssessmentsSearchSchema } from '../../schemas'; import { useKybAndOwnershipAssessmentsQuery } from '@/domains/assessments/hooks/queries/useKybAndOwnershipAssessmentsQuery/useKybAndOwnershipAssessmentsQuery'; export const useKybAndOwnershipLogic = () => { const locale = useLocale(); const { data: session } = useAuthenticatedUserQuery(); const { firstName, fullName, avatarUrl } = session?.user || {}; const { search, onSearch } = useSearch(); const [{ page, pageSize, from, to, isCreating }, setSearchParams] = useZodSearchParams( KybAndOwnershipAssessmentsSearchSchema, { replace: true }, ); const open = isCreating ?? false; const toggleOpen = useCallback( (value?: boolean) => setSearchParams({ isCreating: value }), [setSearchParams], ); const reportQuery = useMemo( () => ({ page: { number: page, size: pageSize, }, from, to, }), [page, pageSize, from, to], ); const { data, isLoading: isLoadingAssessments } = useKybAndOwnershipAssessmentsQuery(reportQuery); const isClearAllButtonVisible = useMemo( () => !!(search !== '' || from || to), [from, search, to], ); const handleFilterChange = useCallback( (filterKey: string) => (selected: unknown) => { setSearchParams({ [filterKey]: Array.isArray(selected) ? selected : [selected], page: '1', }); }, [setSearchParams], ); const handleFilterClear = useCallback( (filterKey: string) => () => { setSearchParams({ [filterKey]: [], page: '1', }); }, [setSearchParams], ); const onClearAllFilters = useCallback(() => { setSearchParams({ statuses: [], findings: [], from: undefined, to: undefined, page: '1', }); onSearch(''); }, [onSearch, setSearchParams]); const { onPaginate, onPrevPage, onNextPage, onLastPage, isLastPage } = usePagination({ totalPages: data?.totalPages ?? 0, }); const dates = useMemo( () => ({ from: from ? dayjs(from).toDate() : undefined, to: to ? dayjs(to).toDate() : undefined, }), [from, to], ); const onDatesChange: ComponentProps['onChange'] = range => { const from = range?.from ? dayjs(range.from).format('YYYY-MM-DD') : undefined; const to = range?.to ? dayjs(range?.to).format('YYYY-MM-DD') : undefined; setSearchParams({ from, to, allowAllDates: !from && !to }); }; const multiselectProps = useMemo( () => ({ trigger: { leftIcon: , title: { className: `font-normal text-sm`, }, }, }), [], ); return { totalPages: data?.totalPages || 0, totalItems: Intl.NumberFormat(locale).format(data?.totalItems || 0), assessments: data?.data || [], isLoadingAssessments, isClearAllButtonVisible, search, onSearch, page, onPrevPage, onNextPage, onLastPage, onPaginate, isLastPage, locale, multiselectProps, handleFilterChange, handleFilterClear, IS_ALERT_TO_DISPLAY_TEXT, dates, onDatesChange, onClearAllFilters, firstName, fullName, avatarUrl, open, toggleOpen, }; };