- Merge master-aio

- Package updates
- Fix subscription

Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
Dave Richer
2024-07-16 09:43:57 -04:00
parent ea55b1a797
commit 4b44ff29ee
5 changed files with 140 additions and 193 deletions

View File

@@ -1,14 +1,8 @@
import { useApolloClient, useQuery, useSubscription } from "@apollo/client";
import _ from "lodash";
import React, { useEffect, useState, useCallback, useMemo } from "react";
import { useQuery, useSubscription } from "@apollo/client";
import React, { useEffect, useMemo } 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_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";
@@ -18,64 +12,26 @@ const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser
});
export function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
const client = useApolloClient();
const [joblist, setJoblist] = useState([]);
function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
const { refetch, loading, data } = useQuery(QUERY_JOBS_IN_PRODUCTION, {
pollInterval: 3600000,
fetchPolicy: "network-only",
nextFetchPolicy: "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 { loading: associationSettingsLoading, data: associationSettings } = useQuery(QUERY_KANBAN_SETTINGS, {
variables: { email: currentUser.email }
variables: { email: currentUser.email },
onError: (error) => console.error(`Error fetching Kanban settings: ${error.message}`)
});
const getUpdatedJobData = useCallback(
async (jobId) => {
await client.query({
query: QUERY_EXACT_JOB_IN_PRODUCTION,
variables: { id: jobId }
});
},
[client]
);
const getUpdatedJobsData = useCallback(
async (jobIds) => {
await client.query({
query: QUERY_EXACT_JOBS_IN_PRODUCTION,
variables: { ids: jobIds }
});
},
[client]
);
useEffect(() => {
if (!data?.jobs) return;
setJoblist(data.jobs.map((j) => ({ 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
);
if (jobDiff.length > 1) {
getUpdatedJobsData(jobDiff.map((j) => j.id));
} else if (jobDiff.length === 1) {
getUpdatedJobData(jobDiff[0].id);
if (updatedJobs) {
refetch().catch((err) => console.error(`Error re-fetching jobs in production: ${err.message}`));
}
setJoblist(updatedJobs.jobs);
}, [updatedJobs, joblist, getUpdatedJobData, getUpdatedJobsData]);
}, [updatedJobs, refetch]);
const filteredAssociationSettings = useMemo(() => {
return associationSettings?.associations[0] || null;
@@ -91,4 +47,4 @@ export function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
);
}
export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer);
export default connect(mapStateToProps)(ProductionBoardKanbanContainer);