From 11563a794e5c2ea892dd640c4f242824f0cf9abc Mon Sep 17 00:00:00 2001 From: Darren Clarke Date: Tue, 7 Oct 2025 11:24:00 +0200 Subject: [PATCH] Update dependencies and version number, remove link tickets endpoint --- apps/bridge-frontend/package.json | 20 +- apps/bridge-migrations/package.json | 14 +- apps/bridge-whatsapp/package.json | 16 +- apps/bridge-whatsapp/src/routes.ts | 4 +- apps/bridge-worker/package.json | 10 +- apps/leafcutter/next-env.d.ts | 1 + apps/leafcutter/package.json | 30 +- apps/link/app/(main)/knowledge/page.tsx | 10 - .../_components/ArticleCreateDialog.tsx | 100 - .../[id]/@detail/_components/TicketDetail.tsx | 177 - .../app/(main)/tickets/[id]/@detail/page.tsx | 13 - .../[id]/@edit/_components/TicketEdit.tsx | 201 - .../app/(main)/tickets/[id]/@edit/page.tsx | 13 - apps/link/app/(main)/tickets/[id]/error.tsx | 11 - apps/link/app/(main)/tickets/[id]/layout.tsx | 19 - .../app/(main)/tickets/[id]/not-found.tsx | 15 - apps/link/middleware.ts | 56 +- apps/link/next-env.d.ts | 1 + apps/link/package.json | 32 +- docker/zammad/Dockerfile | 20 +- package-lock.json | 6675 +++++++---------- package.json | 24 +- packages/bridge-common/package.json | 10 +- packages/bridge-ui/package.json | 22 +- packages/eslint-config/package.json | 22 +- packages/jest-config/package.json | 6 +- packages/leafcutter-ui/package.json | 20 +- packages/logger/package.json | 14 +- packages/opensearch-common/package.json | 12 +- packages/signal-api/package.json | 6 +- packages/typescript-config/package.json | 2 +- packages/ui/package.json | 20 +- packages/zammad-addon-bridge/package.json | 2 +- packages/zammad-addon-common/package.json | 6 +- packages/zammad-addon-hardening/package.json | 2 +- packages/zammad-addon-leafcutter/package.json | 2 +- 36 files changed, 2953 insertions(+), 4655 deletions(-) delete mode 100644 apps/link/app/(main)/knowledge/page.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/@detail/_components/ArticleCreateDialog.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/@detail/_components/TicketDetail.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/@detail/page.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/@edit/_components/TicketEdit.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/@edit/page.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/error.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/layout.tsx delete mode 100644 apps/link/app/(main)/tickets/[id]/not-found.tsx diff --git a/apps/bridge-frontend/package.json b/apps/bridge-frontend/package.json index c955522..7595d4c 100644 --- a/apps/bridge-frontend/package.json +++ b/apps/bridge-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@link-stack/bridge-frontend", - "version": "3.1.0", + "version": "3.2.0b3", "type": "module", "scripts": { "dev": "next dev", @@ -13,26 +13,26 @@ "migrate:down:one": "tsx database/migrate.ts down:one" }, "dependencies": { - "@auth/kysely-adapter": "^1.8.0", + "@auth/kysely-adapter": "^1.10.0", "@mui/icons-material": "^6", "@mui/material": "^6", "@mui/material-nextjs": "^6", - "@mui/x-license": "^7.28.0", + "@mui/x-license": "^7", "@link-stack/bridge-common": "*", "@link-stack/bridge-ui": "*", - "next": "15.2.3", + "next": "15.5.4", "next-auth": "^4.24.11", - "react": "19.0.0", - "react-dom": "19.0.0", - "sharp": "^0.33.5", - "tsx": "^4.19.3", + "react": "19.2.0", + "react-dom": "19.2.0", + "sharp": "^0.34.4", + "tsx": "^4.20.6", "@link-stack/ui": "*" }, "devDependencies": { "@link-stack/eslint-config": "*", "@link-stack/typescript-config": "*", - "@types/node": "^22", - "@types/pg": "^8.11.11", + "@types/node": "^24", + "@types/pg": "^8.15.5", "@types/react": "^19", "@types/react-dom": "^19", "@link-stack/eslint-config": "*", diff --git a/apps/bridge-migrations/package.json b/apps/bridge-migrations/package.json index baee565..7aba07a 100644 --- a/apps/bridge-migrations/package.json +++ b/apps/bridge-migrations/package.json @@ -1,6 +1,6 @@ { "name": "@link-stack/bridge-migrations", - "version": "3.1.0", + "version": "3.2.0b3", "type": "module", "scripts": { "migrate:up:all": "tsx migrate.ts up:all", @@ -10,14 +10,14 @@ }, "dependencies": { "@link-stack/logger": "*", - "dotenv": "^16.4.7", - "kysely": "0.27.6", - "pg": "^8.14.1", - "tsx": "^4.19.3" + "dotenv": "^17.2.3", + "kysely": "0.27.5", + "pg": "^8.16.3", + "tsx": "^4.20.6" }, "devDependencies": { - "@types/node": "^22", - "@types/pg": "^8.11.11", + "@types/node": "^24", + "@types/pg": "^8.15.5", "@link-stack/eslint-config": "*", "@link-stack/typescript-config": "*", "typescript": "^5" diff --git a/apps/bridge-whatsapp/package.json b/apps/bridge-whatsapp/package.json index 1724218..5c80ea6 100644 --- a/apps/bridge-whatsapp/package.json +++ b/apps/bridge-whatsapp/package.json @@ -1,27 +1,27 @@ { "name": "@link-stack/bridge-whatsapp", - "version": "3.1.0", + "version": "3.2.0b3", "main": "build/main/index.js", "author": "Darren Clarke ", "license": "AGPL-3.0-or-later", "dependencies": { "@adiwajshing/keyed-db": "0.2.4", - "@hapi/hapi": "^21.4.0", + "@hapi/hapi": "^21.4.3", "@hapipal/schmervice": "^3.0.0", "@hapipal/toys": "^4.0.0", "@link-stack/logger": "*", - "@whiskeysockets/baileys": "^6.7.16", - "hapi-pino": "^12.1.0", - "link-preview-js": "^3.0.14" + "@whiskeysockets/baileys": "^6.7.20", + "hapi-pino": "^13.0.0", + "link-preview-js": "^3.1.0" }, "devDependencies": { "@link-stack/eslint-config": "*", "@link-stack/jest-config": "*", "@link-stack/typescript-config": "*", "@types/node": "*", - "dotenv-cli": "^8.0.0", - "tsx": "^4.19.3", - "typescript": "^5.8.2" + "dotenv-cli": "^10.0.0", + "tsx": "^4.20.6", + "typescript": "^5.9.3" }, "scripts": { "build": "tsc -p tsconfig.json", diff --git a/apps/bridge-whatsapp/src/routes.ts b/apps/bridge-whatsapp/src/routes.ts index 2b76cb8..1d9caf6 100644 --- a/apps/bridge-whatsapp/src/routes.ts +++ b/apps/bridge-whatsapp/src/routes.ts @@ -42,7 +42,7 @@ export const SendMessageRoute = withDefaults({ attachmentCount: attachments?.length || 0, }, "Sent a message at %s", - new Date(), + new Date().toISOString(), ); return _h @@ -69,7 +69,7 @@ export const ReceiveMessageRoute = withDefaults({ const date = new Date(); const twoDaysAgo = new Date(date.getTime()); twoDaysAgo.setDate(date.getDate() - 2); - request.logger.info({ id }, "Received messages at %s", new Date()); + request.logger.info({ id }, "Received messages at %s", new Date().toISOString()); return whatsappService.receive(id, twoDaysAgo); }, diff --git a/apps/bridge-worker/package.json b/apps/bridge-worker/package.json index 7f7bcd5..3699243 100644 --- a/apps/bridge-worker/package.json +++ b/apps/bridge-worker/package.json @@ -1,6 +1,6 @@ { "name": "@link-stack/bridge-worker", - "version": "3.1.0", + "version": "3.2.0b3", "type": "module", "main": "build/main/index.js", "author": "Darren Clarke ", @@ -17,14 +17,14 @@ "@link-stack/signal-api": "*", "fluent-ffmpeg": "^2.1.3", "graphile-worker": "^0.16.6", - "remeda": "^2.21.2", - "twilio": "^5.5.1" + "remeda": "^2.32.0", + "twilio": "^5.10.2" }, "devDependencies": { "@types/fluent-ffmpeg": "^2.1.27", - "dotenv-cli": "^8.0.0", + "dotenv-cli": "^10.0.0", "@link-stack/eslint-config": "*", "@link-stack/typescript-config": "*", - "typescript": "^5.8.2" + "typescript": "^5.9.3" } } diff --git a/apps/leafcutter/next-env.d.ts b/apps/leafcutter/next-env.d.ts index 3cd7048..36a4fe4 100644 --- a/apps/leafcutter/next-env.d.ts +++ b/apps/leafcutter/next-env.d.ts @@ -1,6 +1,7 @@ /// /// /// +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/leafcutter/package.json b/apps/leafcutter/package.json index 72e93cf..b21e711 100644 --- a/apps/leafcutter/package.json +++ b/apps/leafcutter/package.json @@ -1,6 +1,6 @@ { "name": "@link-stack/leafcutter", - "version": "3.1.0", + "version": "3.2.0b3", "scripts": { "dev": "next dev -p 3001", "login": "aws sso login --sso-session cdr", @@ -16,35 +16,35 @@ "@emotion/cache": "^11.14.0", "@emotion/react": "^11.14.0", "@emotion/server": "^11.11.0", - "@emotion/styled": "^11.14.0", + "@emotion/styled": "^11.14.1", "@link-stack/leafcutter-ui": "*", "@link-stack/logger": "*", "@link-stack/opensearch-common": "*", "@mui/icons-material": "^6", "@mui/material": "^6", "@mui/material-nextjs": "^6", - "@mui/x-date-pickers-pro": "^7.28.0", - "@opensearch-project/opensearch": "^3.4.0", + "@mui/x-date-pickers-pro": "^7", + "@opensearch-project/opensearch": "^3.5.1", "date-fns": "^4.1.0", - "http-proxy-middleware": "^3.0.3", - "material-ui-popup-state": "^5.3.3", - "next": "15.2.3", + "http-proxy-middleware": "^3.0.5", + "material-ui-popup-state": "^5.3.6", + "next": "15.5.4", "next-auth": "^4.24.11", - "react": "19.0.0", + "react": "19.2.0", "react-cookie": "^8.0.1", "react-cookie-consent": "^9.0.0", - "react-dom": "19.0.0", + "react-dom": "19.2.0", "react-iframe": "^1.8.5", "react-polyglot": "^0.7.2", - "sharp": "^0.33.5", - "uuid": "^11.1.0" + "sharp": "^0.34.4", + "uuid": "^13.0.0" }, "devDependencies": { - "@types/node": "^22.13.12", - "@types/react": "19.0.12", - "@types/uuid": "^10.0.0", + "@types/node": "^24.7.0", + "@types/react": "19.2.2", + "@types/uuid": "^11.0.0", "@link-stack/eslint-config": "*", "@link-stack/typescript-config": "*", - "typescript": "5.8.2" + "typescript": "5.9.3" } } diff --git a/apps/link/app/(main)/knowledge/page.tsx b/apps/link/app/(main)/knowledge/page.tsx deleted file mode 100644 index 54ff398..0000000 --- a/apps/link/app/(main)/knowledge/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Metadata } from "next"; -import { ZammadWrapper } from "../../(main)/_components/ZammadWrapper"; - -export const metadata: Metadata = { - title: "Knowledge Base", -}; - -export default function Page() { - return ; -} diff --git a/apps/link/app/(main)/tickets/[id]/@detail/_components/ArticleCreateDialog.tsx b/apps/link/app/(main)/tickets/[id]/@detail/_components/ArticleCreateDialog.tsx deleted file mode 100644 index 7ba5255..0000000 --- a/apps/link/app/(main)/tickets/[id]/@detail/_components/ArticleCreateDialog.tsx +++ /dev/null @@ -1,100 +0,0 @@ -"use client"; - -import { FC, useState } from "react"; -import { - Grid, - Button, - Dialog, - DialogActions, - DialogContent, - TextField, -} from "@mui/material"; -import { createTicketArticleAction } from "app/_actions/tickets"; - -interface ArticleCreateDialogProps { - ticketID: string; - open: boolean; - closeDialog: () => void; - kind: string; - recipient?: string; -} - -export const ArticleCreateDialog: FC = ({ - ticketID, - open, - closeDialog, - kind, - recipient, -}) => { - const [body, setBody] = useState(""); - const backgroundColor = kind === "note" ? "#FFB620" : "#1982FC"; - const color = kind === "note" ? "black" : "white"; - const article = { - body, - type: kind, - internal: kind === "note", - }; - - if (kind === "email") { - article["to"] = recipient; - } - - const createArticle = async () => { - await createTicketArticleAction(ticketID, article); - closeDialog(); - setBody(""); - }; - - return ( - - - setBody(e.target.value)} - /> - - - - - - - - - - - - - ); -}; diff --git a/apps/link/app/(main)/tickets/[id]/@detail/_components/TicketDetail.tsx b/apps/link/app/(main)/tickets/[id]/@detail/_components/TicketDetail.tsx deleted file mode 100644 index bee6548..0000000 --- a/apps/link/app/(main)/tickets/[id]/@detail/_components/TicketDetail.tsx +++ /dev/null @@ -1,177 +0,0 @@ -"use client"; - -import { FC, useState, useEffect } from "react"; -import { getTicketAction, getTicketArticlesAction } from "app/_actions/tickets"; -import { Grid, Box, Typography } from "@mui/material"; -import { Button, fonts, colors } from "@link-stack/ui"; -import "@chatscope/chat-ui-kit-styles/dist/default/styles.min.css"; -import { - MainContainer, - ChatContainer, - MessageList, - Message, - ConversationHeader, -} from "@chatscope/chat-ui-kit-react"; -import { ArticleCreateDialog } from "./ArticleCreateDialog"; - -interface TicketDetailProps { - id: string; -} - -export const TicketDetail: FC = ({ id }) => { - const [ticket, setTicket] = useState(null); - const [ticketArticles, setTicketArticles] = useState(null); - const { poppins, roboto } = fonts; - const { veryLightGray, lightGray } = colors; - const [dialogOpen, setDialogOpen] = useState(false); - const [articleKind, setArticleKind] = useState("note"); - - useEffect(() => { - const fetchTicket = async () => { - const result = await getTicketAction(id); - setTicket(result); - }; - - fetchTicket(); - - const interval = setInterval(fetchTicket, 20000); - - return () => clearInterval(interval); - }, [id]); - - useEffect(() => { - const fetchTicketArticles = async () => { - const result = await getTicketArticlesAction(id); - setTicketArticles(result); - }; - - fetchTicketArticles(); - - const interval = setInterval(fetchTicketArticles, 5000); - - return () => clearInterval(interval); - }, [id]); - - const closeDialog = () => setDialogOpen(false); - - const firstArticle = ticketArticles?.edges[0]?.node; - const firstArticleKind = firstArticle?.type?.name ?? "phone"; - const firstEmailSender = firstArticle?.from?.parsed?.[0]?.emailAddress ?? ""; - const recipient = firstEmailSender; - const shouldRender = !!ticket && !!ticketArticles; - - return ( - - {shouldRender && ( - <> - - - - - - - {ticket.title} - - {`Ticket #${ticket.number} (created ${new Date( - ticket.createdAt, - ).toLocaleDateString()})`} - - - - - {ticketArticles.edges.map(({ node: article }: any) => ( - - ))} - - - - - -