Merged in feature/IO-3048-Fix-Job-Bug-Messaging (pull request #1984)

feature/IO-3048-Fix-Job-Bug-Messaging - Fix tag weirdness and a vite error

Approved-by: Patrick Fic
This commit is contained in:
Dave Richer
2024-12-03 17:55:30 +00:00
committed by Patrick Fic
4 changed files with 59 additions and 47 deletions

View File

@@ -334,12 +334,47 @@ export const registerMessagingHandlers = ({ socket, client }) => {
break;
case "tag-added":
// Ensure `job_conversations` is properly formatted
const formattedJobConversations = job_conversations.map((jc) => ({
__typename: "job_conversations",
jobid: jc.jobid || jc.job?.id,
conversationid: conversationId,
job: jc.job || {
__typename: "jobs",
id: data.selectedJob.id,
ro_number: data.selectedJob.ro_number,
ownr_co_nm: data.selectedJob.ownr_co_nm,
ownr_fn: data.selectedJob.ownr_fn,
ownr_ln: data.selectedJob.ownr_ln
}
}));
client.cache.modify({
id: client.cache.identify({ __typename: "conversations", id: conversationId }),
fields: {
job_conversations: (existing = []) => [...existing, ...job_conversations]
job_conversations: (existing = []) => {
// Ensure no duplicates based on `jobid`
const existingIds = new Set(
existing.map(
(jc) =>
client.cache.readFragment({
id: client.cache.identify(jc),
fragment: gql`
fragment JobConversationId on job_conversations {
jobid
}
`
})?.jobid
)
);
const newItems = formattedJobConversations.filter((jc) => !existingIds.has(jc.jobid));
return [...existing, ...newItems];
}
}
});
break;
case "tag-removed":

View File

@@ -1,4 +1,4 @@
import React, { useEffect, useRef, useState } from "react";
import React, { useCallback, useEffect, useRef, useState } from "react";
import { Virtuoso } from "react-virtuoso";
import { renderMessage } from "./renderMessage";
import "./chat-message-list.styles.scss";
@@ -16,7 +16,7 @@ export default function ChatMessageListComponent({ messages }) {
loadedImagesRef.current = 0;
};
const preloadImages = (imagePaths, onComplete) => {
const preloadImages = useCallback((imagePaths, onComplete) => {
resetImageLoadState();
if (imagePaths.length === 0) {
@@ -34,7 +34,7 @@ export default function ChatMessageListComponent({ messages }) {
}
};
});
};
}, []);
// Ensure all images are loaded on initial render
useEffect(() => {
@@ -51,7 +51,7 @@ export default function ChatMessageListComponent({ messages }) {
});
}
});
}, [messages]);
}, [messages, preloadImages]);
// Handle scrolling when new messages are added
useEffect(() => {
@@ -69,7 +69,7 @@ export default function ChatMessageListComponent({ messages }) {
});
}
});
}, [messages, atBottom]);
}, [messages, atBottom, preloadImages]);
return (
<div className="chat">

View File

@@ -52,20 +52,26 @@ export function ChatTagRoContainer({ conversation, bodyshop }) {
// Find the job details from the search data
const selectedJob = data?.search_jobs.find((job) => job.id === option.key);
if (!selectedJob) return;
const newJobConversation = {
__typename: "job_conversations",
jobid: selectedJob.id,
conversationid: conversation.id,
job: {
__typename: "jobs",
...selectedJob
}
};
socket.emit("conversation-modified", {
conversationId: conversation.id,
bodyshopId: bodyshop.id,
type: "tag-added",
job_conversations: [newJobConversation]
selectedJob,
job_conversations: [
{
__typename: "job_conversations",
jobid: selectedJob.id,
conversationid: conversation.id,
job: {
__typename: "jobs",
id: selectedJob.id,
ro_number: selectedJob.ro_number,
ownr_co_nm: selectedJob.ownr_co_nm,
ownr_fn: selectedJob.ownr_fn,
ownr_ln: selectedJob.ownr_ln
}
}
]
});
}

View File

@@ -3,7 +3,7 @@ import { setContext } from "@apollo/client/link/context";
import { HttpLink } from "@apollo/client/link/http"; //"apollo-link-http";
import { RetryLink } from "@apollo/client/link/retry";
import { WebSocketLink } from "@apollo/client/link/ws";
import { getMainDefinition, offsetLimitPagination } from "@apollo/client/utilities";
import { getMainDefinition } from "@apollo/client/utilities";
//import { split } from "apollo-link";
import apolloLogger from "apollo-link-logger";
//import axios from "axios";
@@ -143,36 +143,7 @@ middlewares.push(
new SentryLink().concat(roundTripLink.concat(retryLink.concat(errorLink.concat(authLink.concat(link)))))
);
const cache = new InMemoryCache({
typePolicies: {
conversations: {
fields: {
job_conversations: {
merge(existing = [], incoming = [], { readField }) {
const merged = new Map();
// Add existing data to the map
existing.forEach((jobConversation) => {
// Use `readField` to get the unique `jobid`, fallback to `__ref`
const jobId = readField("jobid", jobConversation) || jobConversation.__ref;
if (jobId) merged.set(jobId, jobConversation);
});
// Add or replace with incoming data
incoming.forEach((jobConversation) => {
// Use `readField` to get the unique `jobid`, fallback to `__ref`
const jobId = readField("jobid", jobConversation) || jobConversation.__ref;
if (jobId) merged.set(jobId, jobConversation);
});
// Return the merged data as an array
return Array.from(merged.values());
}
}
}
}
}
});
const cache = new InMemoryCache({});
const client = new ApolloClient({
link: ApolloLink.from(middlewares),
cache,