import {useApolloClient, useQuery, useSubscription} from "@apollo/client"; import _ from "lodash"; import React, {useEffect, useState} from "react"; import {connect} from "react-redux"; import {createStructuredSelector} from "reselect"; import { QUERY_EXACT_JOB_IN_PRODUCTION, QUERY_EXACT_JOBS_IN_PRODUCTION, QUERY_JOBS_IN_PRODUCTION, SUBSCRIPTION_JOBS_IN_PRODUCTION, } from "../../graphql/jobs.queries"; import {QUERY_KANBAN_SETTINGS} from "../../graphql/user.queries"; import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import ProductionBoardKanbanComponent from "./production-board-kanban.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, currentUser: selectCurrentUser, }); export function ProductionBoardKanbanContainer({bodyshop, currentUser}) { const {refetch, loading, data} = useQuery(QUERY_JOBS_IN_PRODUCTION, { pollInterval: 3600000, fetchPolicy: "network-only", nextFetchPolicy: "network-only", }); const client = useApolloClient(); const [joblist, setJoblist] = useState([]); const {data: updatedJobs} = useSubscription( SUBSCRIPTION_JOBS_IN_PRODUCTION ); useEffect(() => { if (!(data && data.jobs)) return; setJoblist( data.jobs.map((j) => { return {id: j.id, updated_at: j.updated_at}; }) ); }, [data]); useEffect(() => { if (!updatedJobs || joblist.length === 0) return; const jobDiff = _.differenceWith( joblist, updatedJobs.jobs, (a, b) => a.id === b.id && a.updated_at === b.updated_at ); jobDiff.forEach((job) => { getUpdatedJobData(job.id); }); if (jobDiff.length > 1) { getUpdatedJobsData(jobDiff.map((j) => j.id)); } else if (jobDiff.length === 1) { jobDiff.forEach((job) => { getUpdatedJobData(job.id); }); } setJoblist(updatedJobs.jobs); // eslint-disable-next-line react-hooks/exhaustive-deps }, [updatedJobs]); const getUpdatedJobData = async (jobId) => { client.query({ query: QUERY_EXACT_JOB_IN_PRODUCTION, variables: {id: jobId}, }); }; const getUpdatedJobsData = async (jobIds) => { client.query({ query: QUERY_EXACT_JOBS_IN_PRODUCTION, variables: {ids: jobIds}, }); }; const {loading: associationSettingsLoading, data: associationSettings} = useQuery(QUERY_KANBAN_SETTINGS, { variables: {email: currentUser.email}, }); return ( ); } export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer);