- Make sure subscription and initial query only grab jobs that have statuses that are on the board

Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
Dave Richer
2024-07-18 16:59:17 -04:00
parent 118f14ed4c
commit c31d4096c6
4 changed files with 126 additions and 42 deletions

View File

@@ -1,8 +1,11 @@
import { useQuery, useSubscription } from "@apollo/client";
import React, { useEffect, useMemo } from "react";
import { useQuery, useSubscription } from "@apollo/client";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { QUERY_JOBS_IN_PRODUCTION, SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries";
import {
QUERY_JOBS_IN_PRODUCTION_WITH_STATUSES,
SUBSCRIPTION_JOBS_IN_PRODUCTION_WITH_STATUSES
} 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";
@@ -13,14 +16,26 @@ const mapStateToProps = createStructuredSelector({
});
function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
const { refetch, loading, data } = useQuery(QUERY_JOBS_IN_PRODUCTION, {
const combinedStatuses = useMemo(
() => [
...bodyshop.md_ro_statuses.production_statuses,
...(bodyshop.md_ro_statuses.additional_board_statuses || [])
],
[bodyshop.md_ro_statuses.production_statuses, bodyshop.md_ro_statuses.additional_board_statuses]
);
const { refetch, loading, data } = useQuery(QUERY_JOBS_IN_PRODUCTION_WITH_STATUSES, {
variables: { statuses: combinedStatuses },
pollInterval: 3600000,
fetchPolicy: "network-only",
nextFetchPolicy: "network-only",
onError: (error) => console.error(`Error fetching jobs in production: ${error.message}`)
});
const { data: updatedJobs } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION);
const { data: updatedJobs } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION_WITH_STATUSES, {
variables: { statuses: combinedStatuses },
onError: (error) => console.error(`Error subscribing to jobs in production: ${error.message}`)
});
const { loading: associationSettingsLoading, data: associationSettings } = useQuery(QUERY_KANBAN_SETTINGS, {
variables: { email: currentUser.email },
@@ -28,10 +43,10 @@ function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
});
useEffect(() => {
if (updatedJobs) {
if (updatedJobs && data) {
refetch().catch((err) => console.error(`Error re-fetching jobs in production: ${err.message}`));
}
}, [updatedJobs, refetch]);
}, [updatedJobs, data, refetch]);
const filteredAssociationSettings = useMemo(() => {
return associationSettings?.associations[0] || null;
@@ -43,6 +58,8 @@ function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
data={data ? data.jobs : []}
refetch={refetch}
associationSettings={filteredAssociationSettings}
bodyshop={bodyshop}
statuses={combinedStatuses}
/>
);
}