From aee19e8b6c8aac1c4ef62f4d1a7764b7b4f11d3e Mon Sep 17 00:00:00 2001 From: abdou6666 Date: Thu, 6 Feb 2025 11:31:39 +0100 Subject: [PATCH 1/4] fix: location does not display in inbox conversation --- .../src/components/inbox/components/Chat.tsx | 26 ++++- .../inbox/components/GeolocationMessage.tsx | 106 ++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/inbox/components/GeolocationMessage.tsx diff --git a/frontend/src/components/inbox/components/Chat.tsx b/frontend/src/components/inbox/components/Chat.tsx index bcb47a51..3d678824 100644 --- a/frontend/src/components/inbox/components/Chat.tsx +++ b/frontend/src/components/inbox/components/Chat.tsx @@ -6,7 +6,6 @@ * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ - import { Avatar, ChatContainer, @@ -34,6 +33,9 @@ import { useInfinitedLiveMessages } from "../hooks/useInfiniteLiveMessages"; import { ChatActions } from "./ChatActions"; import { ChatHeader } from "./ChatHeader"; +import GeolocationMessage, { + GeolocationMessageProps, +} from "./GeolocationMessage"; export function Chat() { const { apiUrl } = useConfig(); @@ -92,13 +94,33 @@ export function Chat() { autoScrollToBottom={true} autoScrollToBottomOnMount={true} > - {messages.map((message, i) => { + {messages.map((message: any, i) => { const position = getMessagePosition( message, messages[i - 1], messages[i + 1], ); + if (message?.message?.type === "location") { + const msg = { + type: message.message.type, + data: { + coordinates: { + lat: message.message.coordinates.lat, + lng: message.message.coordinates.lon, + }, + }, + author: message.sender, + read: message.read, + mid: message.mid, + createdAt: message.createdAt, + direction: "sent", + delivery: false, + } as GeolocationMessageProps["message"]; + + return ; + } + return ( = ({ message }) => { + // const { colors: allColors } = useColors(); + // const widget = useWidget(); + const allColors = { + header: { bg: "#1BA089", text: "#fff" }, + launcher: { bg: "#1BA089" }, + messageList: { bg: "#fff" }, + sent: { bg: "#1BA089", text: "#fff" }, + received: { bg: "#f6f8f9", text: "#000" }, + userInput: { bg: "#fff", text: "#000" }, + button: { bg: "#ffffff", text: "#1BA089", border: "#1BA089" }, + messageStatus: { bg: "#1BA089" }, + messageTime: { text: "#9C9C9C" }, + }; + const [isSeen, setIsSeen] = useState(false); + const iframeRef = useRef(null); + + useEffect(() => { + const observer = new IntersectionObserver((entries) => { + if (!isSeen && entries[0].intersectionRatio > 0) { + setIsSeen(true); + } + }); + + if (iframeRef.current) { + observer.observe(iframeRef.current); + } + + return () => { + if (iframeRef.current) { + // eslint-disable-next-line react-hooks/exhaustive-deps + observer.unobserve(iframeRef.current); + } + }; + }, [isSeen]); + + if (!("coordinates" in message.data)) { + throw new Error("Unable to find coordinates"); + } + const coordinates = message.data?.coordinates || { lat: 0.0, lng: 0.0 }; + const openStreetMapUrl = `https://www.openstreetmap.org/export/embed.html?bbox=${ + coordinates.lng - 0.1 + },${coordinates.lat - 0.1},${coordinates.lng + 0.1},${ + coordinates.lat + 0.1 + }&layer=mapnik&marker=${coordinates.lat},${coordinates.lng}`; + const colors = allColors[message.direction || Direction.received]; + + return ( +
+ {isSeen && ( +