/** * Hook для управления действиями с контрагентами * Обрабатывает все GraphQL mutations и их результаты */ import { useMutation } from '@apollo/client' import { useCallback, useState } from 'react' import { toast } from 'sonner' import { RESPOND_TO_COUNTERPARTY_REQUEST, CANCEL_COUNTERPARTY_REQUEST, REMOVE_COUNTERPARTY, SEND_COUNTERPARTY_REQUEST, } from '@/graphql/mutations' import { GET_MY_COUNTERPARTIES, GET_INCOMING_REQUESTS, GET_OUTGOING_REQUESTS, SEARCH_ORGANIZATIONS, } from '@/graphql/queries' import type { UseCounterpartyActionsReturn } from '../types' export function useCounterpartyActions(): UseCounterpartyActionsReturn { const [loading, setLoading] = useState(false) const [error, setError] = useState(null) // Mutation для ответа на заявку (принять/отклонить) const [respondToRequestMutation] = useMutation(RESPOND_TO_COUNTERPARTY_REQUEST, { refetchQueries: [ { query: GET_INCOMING_REQUESTS }, { query: GET_MY_COUNTERPARTIES }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'SELLER' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'FULFILLMENT' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'LOGIST' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'WHOLESALE' } }, ], awaitRefetchQueries: true, }) // Mutation для отмены исходящей заявки const [cancelRequestMutation] = useMutation(CANCEL_COUNTERPARTY_REQUEST, { refetchQueries: [ { query: GET_OUTGOING_REQUESTS }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'SELLER' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'FULFILLMENT' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'LOGIST' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'WHOLESALE' } }, ], awaitRefetchQueries: true, }) // Mutation для удаления контрагента const [removeCounterpartyMutation] = useMutation(REMOVE_COUNTERPARTY, { refetchQueries: [ { query: GET_MY_COUNTERPARTIES }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'SELLER' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'FULFILLMENT' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'LOGIST' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'WHOLESALE' } }, ], awaitRefetchQueries: true, }) // Mutation для отправки заявки на партнерство const [sendRequestMutation] = useMutation(SEND_COUNTERPARTY_REQUEST, { refetchQueries: [ { query: GET_OUTGOING_REQUESTS }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'SELLER' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'FULFILLMENT' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'LOGIST' } }, { query: SEARCH_ORGANIZATIONS, variables: { type: 'WHOLESALE' } }, ], awaitRefetchQueries: true, }) // Принять заявку на партнерство const acceptRequest = useCallback( async (requestId: string) => { setLoading(true) setError(null) try { const { data } = await respondToRequestMutation({ variables: { input: { requestId, action: 'APPROVE', }, }, }) if (data?.respondToCounterpartyRequest?.success) { toast.success('Заявка принята! Организация добавлена в контрагенты') } else { const errorMessage = data?.respondToCounterpartyRequest?.message || 'Не удалось принять заявку' setError(errorMessage) toast.error(errorMessage) } } catch (error) { console.error('Error accepting request:', error) const errorMessage = 'Ошибка при принятии заявки' setError(errorMessage) toast.error(errorMessage) } finally { setLoading(false) } }, [respondToRequestMutation], ) // Отклонить заявку на партнерство const rejectRequest = useCallback( async (requestId: string) => { setLoading(true) setError(null) try { const { data } = await respondToRequestMutation({ variables: { input: { requestId, action: 'REJECT', }, }, }) if (data?.respondToCounterpartyRequest?.success) { toast.success('Заявка отклонена') } else { const errorMessage = data?.respondToCounterpartyRequest?.message || 'Не удалось отклонить заявку' setError(errorMessage) toast.error(errorMessage) } } catch (error) { console.error('Error rejecting request:', error) const errorMessage = 'Ошибка при отклонении заявки' setError(errorMessage) toast.error(errorMessage) } finally { setLoading(false) } }, [respondToRequestMutation], ) // Отменить исходящую заявку const cancelRequest = useCallback( async (requestId: string) => { setLoading(true) setError(null) try { const { data } = await cancelRequestMutation({ variables: { requestId }, }) if (data?.cancelCounterpartyRequest?.success) { toast.success('Заявка отменена') } else { const errorMessage = data?.cancelCounterpartyRequest?.message || 'Не удалось отменить заявку' setError(errorMessage) toast.error(errorMessage) } } catch (error) { console.error('Error canceling request:', error) const errorMessage = 'Ошибка при отмене заявки' setError(errorMessage) toast.error(errorMessage) } finally { setLoading(false) } }, [cancelRequestMutation], ) // Отправить заявку на партнерство const sendRequest = useCallback( async (organizationId: string, message?: string) => { setLoading(true) setError(null) try { const { data } = await sendRequestMutation({ variables: { input: { receiverId: organizationId, message: message || 'Предлагаем партнерское сотрудничество', }, }, }) if (data?.sendCounterpartyRequest?.success) { toast.success('Заявка отправлена! Ожидайте ответа от организации') } else { const errorMessage = data?.sendCounterpartyRequest?.message || 'Не удалось отправить заявку' setError(errorMessage) toast.error(errorMessage) } } catch (error) { console.error('Error sending request:', error) const errorMessage = 'Ошибка при отправке заявки' setError(errorMessage) toast.error(errorMessage) } finally { setLoading(false) } }, [sendRequestMutation], ) // Удалить контрагента const removeCounterparty = useCallback( async (organizationId: string) => { setLoading(true) setError(null) try { const { data } = await removeCounterpartyMutation({ variables: { organizationId }, }) if (data?.removeCounterparty?.success) { toast.success('Контрагент удален из списка') } else { const errorMessage = data?.removeCounterparty?.message || 'Не удалось удалить контрагента' setError(errorMessage) toast.error(errorMessage) } } catch (error) { console.error('Error removing counterparty:', error) const errorMessage = 'Ошибка при удалении контрагента' setError(errorMessage) toast.error(errorMessage) } finally { setLoading(false) } }, [removeCounterpartyMutation], ) return { // Действия с заявками acceptRequest, rejectRequest, cancelRequest, sendRequest, // Действия с контрагентами removeCounterparty, // Состояние loading, error, } }