Dependency cleanup

This commit is contained in:
Darren Clarke 2024-08-07 12:02:33 +02:00
parent 2d892779bf
commit 2568547384
28 changed files with 170 additions and 482 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-frontend", "name": "@link-stack/bridge-frontend",
"version": "0.1.0", "version": "2.1.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@ -18,7 +18,6 @@
"@emotion/react": "^11.13.0", "@emotion/react": "^11.13.0",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6", "@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-whatsapp", "name": "@link-stack/bridge-whatsapp",
"version": "0.3.0", "version": "2.1.0",
"main": "build/main/index.js", "main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",

View file

@ -1 +1 @@
*/1 * * * * fetch-signal-messages */1 * * * * fetch-signal-messages ?max=1

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-worker", "name": "@link-stack/bridge-worker",
"version": "0.2.0", "version": "2.1.0",
"type": "module", "type": "module",
"main": "build/main/index.js", "main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",
@ -20,7 +20,7 @@
"jest": "^29.7.0", "jest": "^29.7.0",
"kysely": "^0.27.3", "kysely": "^0.27.3",
"pg": "^8.12.0", "pg": "^8.12.0",
"remeda": "^2.7.1", "remeda": "^2.10.0",
"twilio": "^5.2.2" "twilio": "^5.2.2"
}, },
"devDependencies": { "devDependencies": {

View file

@ -9,7 +9,7 @@ import { I18n } from "react-polyglot";
import { AdapterDateFns } from "@mui/x-date-pickers-pro/AdapterDateFnsV3"; import { AdapterDateFns } from "@mui/x-date-pickers-pro/AdapterDateFnsV3";
import { LocalizationProvider } from "@mui/x-date-pickers-pro"; import { LocalizationProvider } from "@mui/x-date-pickers-pro";
import { LeafcutterProvider } from "@link-stack/leafcutter-ui/components/LeafcutterProvider"; import { LeafcutterProvider } from "@link-stack/leafcutter-ui/components/LeafcutterProvider";
import { NextAppDirEmotionCacheProvider } from "tss-react/next/appDir"; import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter";
import en from "@link-stack/leafcutter-ui/locales/en.json"; import en from "@link-stack/leafcutter-ui/locales/en.json";
import fr from "@link-stack/leafcutter-ui/locales/fr.json"; import fr from "@link-stack/leafcutter-ui/locales/fr.json";
import { LicenseInfo } from "@mui/x-license"; import { LicenseInfo } from "@mui/x-license";
@ -25,7 +25,7 @@ export const MultiProvider: FC<PropsWithChildren> = ({ children }: any) => {
const locale = "en"; const locale = "en";
return ( return (
<NextAppDirEmotionCacheProvider options={{ key: "css" }}> <AppRouterCacheProvider>
<SessionProvider> <SessionProvider>
<CookiesProvider> <CookiesProvider>
<CssBaseline /> <CssBaseline />
@ -38,6 +38,6 @@ export const MultiProvider: FC<PropsWithChildren> = ({ children }: any) => {
</LeafcutterProvider> </LeafcutterProvider>
</CookiesProvider> </CookiesProvider>
</SessionProvider> </SessionProvider>
</NextAppDirEmotionCacheProvider> </AppRouterCacheProvider>
); );
}; };

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/leafcutter", "name": "@link-stack/leafcutter",
"version": "0.2.0", "version": "2.1.0",
"scripts": { "scripts": {
"dev": "next dev -p 3001", "dev": "next dev -p 3001",
"login": "aws sso login --sso-session cdr", "login": "aws sso login --sso-session cdr",
@ -17,22 +17,20 @@
"@emotion/react": "^11.13.0", "@emotion/react": "^11.13.0",
"@emotion/server": "^11.11.0", "@emotion/server": "^11.11.0",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@link-stack/leafcutter-ui": "*",
"@link-stack/opensearch-common": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",
"@opensearch-project/opensearch": "^2.11.0", "@opensearch-project/opensearch": "^2.11.0",
"cryptr": "^6.3.0", "cryptr": "^6.3.0",
"date-fns": "^3.6.0", "date-fns": "^3.6.0",
"http-proxy-middleware": "^3.0.0", "http-proxy-middleware": "^3.0.0",
"@link-stack/leafcutter-ui": "*",
"material-ui-popup-state": "^5.1.2", "material-ui-popup-state": "^5.1.2",
"next": "14.2.5", "next": "14.2.5",
"next-auth": "^4.24.7", "next-auth": "^4.24.7",
"next-http-proxy-middleware": "^1.2.6",
"@link-stack/opensearch-common": "*",
"nodemailer": "^6.9.14",
"react": "18.3.1", "react": "18.3.1",
"react-cookie": "^7.2.0", "react-cookie": "^7.2.0",
"react-cookie-consent": "^9.0.0", "react-cookie-consent": "^9.0.0",
@ -41,8 +39,6 @@
"react-markdown": "^9.0.1", "react-markdown": "^9.0.1",
"react-polyglot": "^0.7.2", "react-polyglot": "^0.7.2",
"sharp": "^0.33.4", "sharp": "^0.33.4",
"swr": "^2.2.5",
"tss-react": "^4.9.12",
"uuid": "^10.0.0" "uuid": "^10.0.0"
}, },
"devDependencies": { "devDependencies": {

View file

@ -1,12 +1,18 @@
import { Suspense } from "react";
import { Metadata } from "next"; import { Metadata } from "next";
import { getSession } from "next-auth/react"; import { getSession } from "next-auth/react";
import { Login } from "./_components/Login"; import { Login } from "./_components/Login";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Login", title: "CDR Link - Login",
}; };
export default async function Page() { export default async function Page() {
const session = await getSession(); const session = await getSession();
return <Login session={session} />;
return (
<Suspense fallback={<div>Loading...</div>}>
<Login session={session} />
</Suspense>
);
} }

View file

@ -7,11 +7,13 @@ import { SetupModeWarning } from "./SetupModeWarning";
interface InternalLayoutProps extends PropsWithChildren { interface InternalLayoutProps extends PropsWithChildren {
setupModeActive: boolean; setupModeActive: boolean;
leafcutterEnabled: boolean;
} }
export const InternalLayout: FC<InternalLayoutProps> = ({ export const InternalLayout: FC<InternalLayoutProps> = ({
children, children,
setupModeActive, setupModeActive,
leafcutterEnabled,
}) => { }) => {
const [open, setOpen] = useState(true); const [open, setOpen] = useState(true);
@ -19,7 +21,11 @@ export const InternalLayout: FC<InternalLayoutProps> = ({
<Box sx={{ position: "relative" }}> <Box sx={{ position: "relative" }}>
<SetupModeWarning setupModeActive={setupModeActive} /> <SetupModeWarning setupModeActive={setupModeActive} />
<Grid container direction="row"> <Grid container direction="row">
<Sidebar open={open} setOpen={setOpen} /> <Sidebar
open={open}
setOpen={setOpen}
leafcutterEnabled={leafcutterEnabled}
/>
<Grid <Grid
item item
sx={{ ml: open ? "270px" : "70px", width: "100%", height: "100vh" }} sx={{ ml: open ? "270px" : "70px", width: "100%", height: "100vh" }}

View file

@ -1,5 +1,3 @@
"use client";
import { FC } from "react"; import { FC } from "react";
import { Box } from "@mui/material"; import { Box } from "@mui/material";

View file

@ -25,7 +25,6 @@ import {
Assessment as AssessmentIcon, Assessment as AssessmentIcon,
LibraryBooks as LibraryBooksIcon, LibraryBooks as LibraryBooksIcon,
School as SchoolIcon, School as SchoolIcon,
Search as SearchIcon,
} from "@mui/icons-material"; } from "@mui/icons-material";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
@ -179,17 +178,21 @@ const MenuItem = ({
interface SidebarProps { interface SidebarProps {
open: boolean; open: boolean;
setOpen: (open: boolean) => void; setOpen: (open: boolean) => void;
leafcutterEnabled?: boolean;
} }
export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => { export const Sidebar: FC<SidebarProps> = ({
open,
setOpen,
leafcutterEnabled = false,
}) => {
const pathname = usePathname(); const pathname = usePathname();
const { data: session } = useSession(); const { data: session } = useSession();
const [overviewCounts, setOverviewCounts] = useState<any>(null); const [overviewCounts, setOverviewCounts] = useState<any>(null);
const { poppins } = fonts; const { poppins } = fonts;
const username = session?.user?.name || "User"; const username = session?.user?.name || "";
// @ts-ignore // @ts-ignore
const roles = session?.user?.roles || []; const roles = session?.user?.roles || [];
const leafcutterEnabled = false;
useEffect(() => { useEffect(() => {
const fetchCounts = async () => { const fetchCounts = async () => {
@ -205,12 +208,6 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
return () => clearInterval(interval); return () => clearInterval(interval);
}, []); }, []);
const recentCount = 0;
const assignedCount = overviewCounts?.["My Assigned Tickets"] ?? 0;
const openCount = overviewCounts?.["Open Tickets"] ?? 0;
const urgentCount = overviewCounts?.["Escalated Tickets"] ?? 0;
const unassignedCount = overviewCounts?.["Unassigned & Open Tickets"] ?? 0;
const logout = () => { const logout = () => {
signOut({ callbackUrl: "/login" }); signOut({ callbackUrl: "/login" });
}; };
@ -439,7 +436,7 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
Icon={FeaturedPlayListIcon} Icon={FeaturedPlayListIcon}
iconSize={0} iconSize={0}
selected={pathname.endsWith("/overview/recent")} selected={pathname.endsWith("/overview/recent")}
badge={recentCount} badge={overviewCounts?.recent}
open={open} open={open}
/> />
<MenuItem <MenuItem
@ -448,7 +445,7 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
Icon={FeaturedPlayListIcon} Icon={FeaturedPlayListIcon}
iconSize={0} iconSize={0}
selected={pathname.endsWith("/overview/open")} selected={pathname.endsWith("/overview/open")}
badge={openCount} badge={overviewCounts?.open}
open={open} open={open}
/> />
<MenuItem <MenuItem
@ -457,7 +454,7 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
Icon={FeaturedPlayListIcon} Icon={FeaturedPlayListIcon}
iconSize={0} iconSize={0}
selected={pathname.endsWith("/overview/urgent")} selected={pathname.endsWith("/overview/urgent")}
badge={urgentCount} badge={overviewCounts?.urgent}
open={open} open={open}
/> />
<MenuItem <MenuItem
@ -466,7 +463,7 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
Icon={FeaturedPlayListIcon} Icon={FeaturedPlayListIcon}
iconSize={0} iconSize={0}
selected={pathname.endsWith("/overview/assigned")} selected={pathname.endsWith("/overview/assigned")}
badge={assignedCount} badge={overviewCounts?.assigned}
open={open} open={open}
/> />
<MenuItem <MenuItem
@ -475,7 +472,7 @@ export const Sidebar: FC<SidebarProps> = ({ open, setOpen }) => {
Icon={FeaturedPlayListIcon} Icon={FeaturedPlayListIcon}
iconSize={0} iconSize={0}
selected={pathname.endsWith("/overview/unassigned")} selected={pathname.endsWith("/overview/unassigned")}
badge={unassignedCount} badge={overviewCounts?.unassigned}
open={open} open={open}
/> />
</List> </List>

View file

@ -12,9 +12,13 @@ type LayoutProps = {
export default function Layout({ children }: LayoutProps) { export default function Layout({ children }: LayoutProps) {
const setupModeActive = process.env.SETUP_MODE === "true"; const setupModeActive = process.env.SETUP_MODE === "true";
const leafcutterEnabled = process.env.LEAFCUTTER_ENABLED === "true";
return ( return (
<InternalLayout setupModeActive={setupModeActive}> <InternalLayout
setupModeActive={setupModeActive}
leafcutterEnabled={leafcutterEnabled}
>
{children} {children}
</InternalLayout> </InternalLayout>
); );

View file

@ -6,22 +6,26 @@ import { getUserVisualizations } from "@link-stack/opensearch-common";
import { LeafcutterWrapper } from "@link-stack/leafcutter-ui"; import { LeafcutterWrapper } from "@link-stack/leafcutter-ui";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Link", title: "CDR Link - Home",
}; };
export default async function Page() { export default async function Page() {
const leafcutterEnabled = process.env.LEAFCUTTER_ENABLED === "true";
if (!leafcutterEnabled) {
redirect("/overview/recent");
}
const session = await getServerSession(); const session = await getServerSession();
const { const {
user: { email }, user: { email },
}: any = session; }: any = session;
// const visualizations = await getUserVisualizations(email ?? "none", 20);
redirect("/overview/recent"); const visualizations = await getUserVisualizations(email ?? "none", 20);
/*
return ( return (
<LeafcutterWrapper> <LeafcutterWrapper>
<Home visualizations={visualizations} showWelcome={false} /> <Home visualizations={visualizations} showWelcome={false} />
</LeafcutterWrapper> </LeafcutterWrapper>
); );
*/
} }

View file

@ -4,15 +4,34 @@ import { executeGraphQL, executeREST } from "app/_lib/zammad";
import { getTicketOverviewCountsQuery } from "app/_graphql/getTicketOverviewCountsQuery"; import { getTicketOverviewCountsQuery } from "app/_graphql/getTicketOverviewCountsQuery";
import { getTicketsByOverviewQuery } from "app/_graphql/getTicketsByOverviewQuery"; import { getTicketsByOverviewQuery } from "app/_graphql/getTicketsByOverviewQuery";
const overviewLookup = {
Assigned: "My Assigned Tickets",
Open: "Open Tickets",
Urgent: "Escalated Tickets",
Unassigned: "Unassigned & Open Tickets",
Recent: "Recent Tickets",
Pending: "Pending Reached Tickets",
MyPending: "My Pending Reached Tickets",
MySubscribed: "My Subscribed Tickets",
};
export const getOverviewTicketCountsAction = async () => { export const getOverviewTicketCountsAction = async () => {
const recent = await executeREST({ path: "/api/v1/recent_view" });
const countResult = await executeGraphQL({ const countResult = await executeGraphQL({
query: getTicketOverviewCountsQuery, query: getTicketOverviewCountsQuery,
}); });
const overviews = countResult?.ticketOverviews?.edges; const overviews = countResult?.ticketOverviews?.edges ?? [];
const counts = overviews?.reduce((acc: any, overview: any) => { const counts = overviews.reduce((acc: any, overview: any) => {
acc[overview.node.name] = overview.node.ticketCount; const name = overview.node.name;
const key = Object.keys(overviewLookup)
.find((k) => overviewLookup[k] === name)
?.toLowerCase();
if (key) {
acc[key] = overview.node.ticketCount ?? 0;
}
return acc; return acc;
}); }, {});
counts.recent = recent.length;
return counts; return counts;
}; };
@ -36,12 +55,6 @@ export const getOverviewTicketsAction = async (name: string) => {
}); });
} }
} else { } else {
const overviewLookup = {
Assigned: "My Assigned Tickets",
Open: "Open Tickets",
Urgent: "Escalated Tickets",
Unassigned: "Unassigned & Open Tickets",
};
const fullName = overviewLookup[name]; const fullName = overviewLookup[name];
const countResult = await executeGraphQL({ const countResult = await executeGraphQL({
query: getTicketOverviewCountsQuery, query: getTicketOverviewCountsQuery,

View file

@ -162,14 +162,6 @@ export const getTicketStatesAction = async () => {
path: "/api/v1/ticket_states", path: "/api/v1/ticket_states",
}); });
return states;
};
export const getTicketTagsAction = async () => {
const states = await executeREST({
path: "/api/v1/tags",
});
const formattedStates = const formattedStates =
states?.map((state: any) => ({ states?.map((state: any) => ({
value: state.id, value: state.id,
@ -179,6 +171,14 @@ export const getTicketTagsAction = async () => {
return formattedStates; return formattedStates;
}; };
export const getTicketTagsAction = async () => {
const tags = await executeREST({
path: "/api/v1/tags",
});
return tags;
};
export const getTicketPrioritiesAction = async () => { export const getTicketPrioritiesAction = async () => {
const priorities = await executeREST({ const priorities = await executeREST({
path: "/api/v1/ticket_priorities", path: "/api/v1/ticket_priorities",

View file

@ -1,10 +1,9 @@
"use client"; "use client";
import { FC, PropsWithChildren, useState } from "react"; import { FC, PropsWithChildren } from "react";
import { CssBaseline } from "@mui/material"; import { CssBaseline } from "@mui/material";
import { CookiesProvider } from "react-cookie"; import { CookiesProvider } from "react-cookie";
import { SessionProvider } from "next-auth/react"; import { SessionProvider } from "next-auth/react";
import { NextAppDirEmotionCacheProvider } from "tss-react/next/appDir";
import { I18n } from "react-polyglot"; import { I18n } from "react-polyglot";
import { AdapterDateFns } from "@mui/x-date-pickers-pro/AdapterDateFnsV3"; import { AdapterDateFns } from "@mui/x-date-pickers-pro/AdapterDateFnsV3";
import { LocalizationProvider } from "@mui/x-date-pickers-pro"; import { LocalizationProvider } from "@mui/x-date-pickers-pro";
@ -17,17 +16,12 @@ LicenseInfo.setLicenseKey(
); );
export const MultiProvider: FC<PropsWithChildren> = ({ children }) => { export const MultiProvider: FC<PropsWithChildren> = ({ children }) => {
const origin =
typeof window !== "undefined" && window.location.origin
? window.location.origin
: null;
const messages: any = { en: locales.en, fr: locales.fr }; const messages: any = { en: locales.en, fr: locales.fr };
const locale = "en"; const locale = "en";
return ( return (
<NextAppDirEmotionCacheProvider options={{ key: "css" }}>
<CssBaseline />
<SessionProvider> <SessionProvider>
<CssBaseline />
<CSRFProvider> <CSRFProvider>
<CookiesProvider> <CookiesProvider>
<LocalizationProvider dateAdapter={AdapterDateFns}> <LocalizationProvider dateAdapter={AdapterDateFns}>
@ -38,6 +32,5 @@ export const MultiProvider: FC<PropsWithChildren> = ({ children }) => {
</CookiesProvider> </CookiesProvider>
</CSRFProvider> </CSRFProvider>
</SessionProvider> </SessionProvider>
</NextAppDirEmotionCacheProvider>
); );
}; };

View file

@ -17,7 +17,6 @@ const fetchRoles = async () => {
const url = `${process.env.ZAMMAD_URL}/api/v1/roles`; const url = `${process.env.ZAMMAD_URL}/api/v1/roles`;
const res = await fetch(url, { headers }); const res = await fetch(url, { headers });
const roles = await res.json(); const roles = await res.json();
console.log({ roles });
const formattedRoles = roles.reduce((acc: any, role: any) => { const formattedRoles = roles.reduce((acc: any, role: any) => {
acc[role.id] = role.name; acc[role.id] = role.name;
return acc; return acc;
@ -26,13 +25,9 @@ const fetchRoles = async () => {
}; };
const fetchUser = async (email: string) => { const fetchUser = async (email: string) => {
console.log({ email });
const url = `${process.env.ZAMMAD_URL}/api/v1/users/search?query=login:${email}&limit=1`; const url = `${process.env.ZAMMAD_URL}/api/v1/users/search?query=login:${email}&limit=1`;
console.log({ url });
const res = await fetch(url, { headers }); const res = await fetch(url, { headers });
console.log({ res });
const users = await res.json(); const users = await res.json();
console.log({ users });
const user = users?.[0]; const user = users?.[0];
return user; return user;
@ -41,9 +36,7 @@ const fetchUser = async (email: string) => {
const getUserRoles = async (email: string) => { const getUserRoles = async (email: string) => {
try { try {
const user = await fetchUser(email); const user = await fetchUser(email);
console.log({ user });
const allRoles = await fetchRoles(); const allRoles = await fetchRoles();
console.log({ allRoles });
const roles = user.role_ids.map((roleID: number) => { const roles = user.role_ids.map((roleID: number) => {
const role = allRoles[roleID]; const role = allRoles[roleID];
return role ? role.toLowerCase().replace(" ", "_") : null; return role ? role.toLowerCase().replace(" ", "_") : null;
@ -57,7 +50,6 @@ const getUserRoles = async (email: string) => {
const login = async (email: string, password: string) => { const login = async (email: string, password: string) => {
const url = `${process.env.ZAMMAD_URL}/api/v1/users/me`; const url = `${process.env.ZAMMAD_URL}/api/v1/users/me`;
console.log({ url });
const authorization = const authorization =
"Basic " + Buffer.from(email + ":" + password).toString("base64"); "Basic " + Buffer.from(email + ":" + password).toString("base64");
const res = await fetch(url, { const res = await fetch(url, {
@ -66,7 +58,6 @@ const login = async (email: string, password: string) => {
}, },
}); });
const user = await res.json(); const user = await res.json();
console.log({ user });
if (user && !user.error && user.id) { if (user && !user.error && user.id) {
return user; return user;
@ -96,7 +87,7 @@ export const authOptions: NextAuthOptions = {
email: { label: "Email", type: "text" }, email: { label: "Email", type: "text" },
password: { label: "Password", type: "password" }, password: { label: "Password", type: "password" },
}, },
async authorize(credentials, req) { async authorize(credentials) {
const user = await login(credentials.email, credentials.password); const user = await login(credentials.email, credentials.password);
if (user) { if (user) {
return user; return user;
@ -108,7 +99,7 @@ export const authOptions: NextAuthOptions = {
], ],
secret: process.env.NEXTAUTH_SECRET, secret: process.env.NEXTAUTH_SECRET,
callbacks: { callbacks: {
signIn: async ({ user, account, profile }) => { signIn: async ({ user }) => {
const roles = (await getUserRoles(user.email)) ?? []; const roles = (await getUserRoles(user.email)) ?? [];
return ( return (
roles.includes("admin") || roles.includes("admin") ||
@ -116,7 +107,7 @@ export const authOptions: NextAuthOptions = {
process.env.SETUP_MODE === "true" process.env.SETUP_MODE === "true"
); );
}, },
session: async ({ session, user, token }) => { session: async ({ session, token }) => {
// @ts-ignore // @ts-ignore
session.user.roles = token.roles ?? []; session.user.roles = token.roles ?? [];
// @ts-ignore // @ts-ignore
@ -126,7 +117,7 @@ export const authOptions: NextAuthOptions = {
return session; return session;
}, },
jwt: async ({ token, user, account, profile, trigger, session }) => { jwt: async ({ token, user, trigger, session }) => {
if (user) { if (user) {
token.roles = (await getUserRoles(user.email)) ?? []; token.roles = (await getUserRoles(user.email)) ?? [];
} }

View file

@ -1,10 +1,11 @@
import { ReactNode } from "react"; import { ReactNode } from "react";
import { Metadata } from "next"; import { Metadata } from "next";
import "./_styles/global.css"; import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter";
import { MultiProvider } from "./_components/MultiProvider"; import { MultiProvider } from "./_components/MultiProvider";
import "./_styles/global.css";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Link", title: "CDR Link",
}; };
type LayoutProps = { type LayoutProps = {
@ -15,7 +16,9 @@ export default function Layout({ children }: LayoutProps) {
return ( return (
<html lang="en"> <html lang="en">
<body> <body>
<AppRouterCacheProvider>
<MultiProvider>{children}</MultiProvider> <MultiProvider>{children}</MultiProvider>
</AppRouterCacheProvider>
</body> </body>
</html> </html>
); );

View file

@ -61,7 +61,8 @@ export default withAuth(checkRewrites, {
}, },
callbacks: { callbacks: {
authorized: ({ token, req }) => { authorized: ({ token, req }) => {
if (req.nextUrl.pathname.startsWith("/api/v1/")) { const path = req.nextUrl.pathname;
if (path.startsWith("/api/v1/")) {
return true; return true;
} }
@ -70,6 +71,11 @@ export default withAuth(checkRewrites, {
} }
const roles: any = token?.roles ?? []; const roles: any = token?.roles ?? [];
if (path.startsWith("/admin") && !roles.includes("admin")) {
return false;
}
if (roles.includes("admin") || roles.includes("agent")) { if (roles.includes("admin") || roles.includes("agent")) {
return true; return true;
} }

View file

@ -1,8 +1,5 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
experimental: {
missingSuspenseWithCSRBailout: false,
},
transpilePackages: [ transpilePackages: [
"@link-stack/leafcutter-ui", "@link-stack/leafcutter-ui",
"@link-stack/opensearch-common", "@link-stack/opensearch-common",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/link", "name": "@link-stack/link",
"version": "0.0.1", "version": "2.1.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@ -16,32 +16,29 @@
"@emotion/react": "^11.13.0", "@emotion/react": "^11.13.0",
"@emotion/server": "^11.11.0", "@emotion/server": "^11.11.0",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0",
"@link-stack/bridge-common": "*", "@link-stack/bridge-common": "*",
"@link-stack/bridge-ui": "*", "@link-stack/bridge-ui": "*",
"@link-stack/leafcutter-ui": "*",
"@link-stack/opensearch-common": "*",
"@link-stack/ui": "*",
"@mui/icons-material": "^5",
"@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0",
"date-fns": "^3.6.0", "date-fns": "^3.6.0",
"graphql": "^16.9.0", "graphql": "^16.9.0",
"graphql-request": "^7.1.0", "graphql-request": "^7.1.0",
"@link-stack/leafcutter-ui": "*",
"material-ui-popup-state": "^5.1.2", "material-ui-popup-state": "^5.1.2",
"mui-chips-input": "^2.1.5", "mui-chips-input": "^2.1.5",
"next": "14.2.5", "next": "14.2.5",
"next-auth": "^4.24.7", "next-auth": "^4.24.7",
"@link-stack/opensearch-common": "*",
"react": "18.3.1", "react": "18.3.1",
"react-cookie": "^7.2.0", "react-cookie": "^7.2.0",
"react-dom": "18.3.1", "react-dom": "18.3.1",
"react-iframe": "^1.8.5", "react-iframe": "^1.8.5",
"react-polyglot": "^0.7.2", "react-polyglot": "^0.7.2",
"sharp": "^0.33.4", "sharp": "^0.33.4"
"swr": "^2.2.5",
"tss-react": "^4.9.12",
"twilio-client": "^1.15.1",
"@link-stack/ui": "*"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",

405
package-lock.json generated
View file

@ -24,7 +24,7 @@
}, },
"apps/bridge-frontend": { "apps/bridge-frontend": {
"name": "@link-stack/bridge-frontend", "name": "@link-stack/bridge-frontend",
"version": "0.1.0", "version": "2.1.0",
"dependencies": { "dependencies": {
"@auth/kysely-adapter": "^1.4.2", "@auth/kysely-adapter": "^1.4.2",
"@emotion/cache": "^11.13.1", "@emotion/cache": "^11.13.1",
@ -35,7 +35,6 @@
"@link-stack/signal-api": "*", "@link-stack/signal-api": "*",
"@link-stack/ui": "*", "@link-stack/ui": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6", "@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
@ -72,7 +71,7 @@
}, },
"apps/bridge-whatsapp": { "apps/bridge-whatsapp": {
"name": "@link-stack/bridge-whatsapp", "name": "@link-stack/bridge-whatsapp",
"version": "0.3.0", "version": "2.1.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@adiwajshing/keyed-db": "0.2.4", "@adiwajshing/keyed-db": "0.2.4",
@ -179,7 +178,7 @@
}, },
"apps/bridge-worker": { "apps/bridge-worker": {
"name": "@link-stack/bridge-worker", "name": "@link-stack/bridge-worker",
"version": "0.2.0", "version": "2.1.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@hapi/wreck": "^18.1.0", "@hapi/wreck": "^18.1.0",
@ -191,7 +190,7 @@
"jest": "^29.7.0", "jest": "^29.7.0",
"kysely": "^0.27.3", "kysely": "^0.27.3",
"pg": "^8.12.0", "pg": "^8.12.0",
"remeda": "^2.7.1", "remeda": "^2.10.0",
"twilio": "^5.2.2" "twilio": "^5.2.2"
}, },
"devDependencies": { "devDependencies": {
@ -219,7 +218,7 @@
}, },
"apps/leafcutter": { "apps/leafcutter": {
"name": "@link-stack/leafcutter", "name": "@link-stack/leafcutter",
"version": "0.2.0", "version": "2.1.0",
"dependencies": { "dependencies": {
"@emotion/cache": "^11.13.1", "@emotion/cache": "^11.13.1",
"@emotion/react": "^11.13.0", "@emotion/react": "^11.13.0",
@ -228,8 +227,8 @@
"@link-stack/leafcutter-ui": "*", "@link-stack/leafcutter-ui": "*",
"@link-stack/opensearch-common": "*", "@link-stack/opensearch-common": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",
"@opensearch-project/opensearch": "^2.11.0", "@opensearch-project/opensearch": "^2.11.0",
@ -239,8 +238,6 @@
"material-ui-popup-state": "^5.1.2", "material-ui-popup-state": "^5.1.2",
"next": "14.2.5", "next": "14.2.5",
"next-auth": "^4.24.7", "next-auth": "^4.24.7",
"next-http-proxy-middleware": "^1.2.6",
"nodemailer": "^6.9.14",
"react": "18.3.1", "react": "18.3.1",
"react-cookie": "^7.2.0", "react-cookie": "^7.2.0",
"react-cookie-consent": "^9.0.0", "react-cookie-consent": "^9.0.0",
@ -249,8 +246,6 @@
"react-markdown": "^9.0.1", "react-markdown": "^9.0.1",
"react-polyglot": "^0.7.2", "react-polyglot": "^0.7.2",
"sharp": "^0.33.4", "sharp": "^0.33.4",
"swr": "^2.2.5",
"tss-react": "^4.9.12",
"uuid": "^10.0.0" "uuid": "^10.0.0"
}, },
"devDependencies": { "devDependencies": {
@ -271,7 +266,7 @@
}, },
"apps/link": { "apps/link": {
"name": "@link-stack/link", "name": "@link-stack/link",
"version": "0.0.1", "version": "2.1.0",
"dependencies": { "dependencies": {
"@chatscope/chat-ui-kit-react": "^2.0.3", "@chatscope/chat-ui-kit-react": "^2.0.3",
"@chatscope/chat-ui-kit-styles": "^1.4.0", "@chatscope/chat-ui-kit-styles": "^1.4.0",
@ -285,8 +280,8 @@
"@link-stack/opensearch-common": "*", "@link-stack/opensearch-common": "*",
"@link-stack/ui": "*", "@link-stack/ui": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/material-nextjs": "^5.16.6",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",
"date-fns": "^3.6.0", "date-fns": "^3.6.0",
@ -301,10 +296,7 @@
"react-dom": "18.3.1", "react-dom": "18.3.1",
"react-iframe": "^1.8.5", "react-iframe": "^1.8.5",
"react-polyglot": "^0.7.2", "react-polyglot": "^0.7.2",
"sharp": "^0.33.4", "sharp": "^0.33.4"
"swr": "^2.2.5",
"tss-react": "^4.9.12",
"twilio-client": "^1.15.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",
@ -3041,44 +3033,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
} }
}, },
"node_modules/@floating-ui/core": {
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz",
"integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.6"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.9",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz",
"integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.6.0",
"@floating-ui/utils": "^0.2.6"
}
},
"node_modules/@floating-ui/react-dom": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz",
"integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==",
"license": "MIT",
"dependencies": {
"@floating-ui/dom": "^1.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz",
"integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==",
"license": "MIT"
},
"node_modules/@fortawesome/fontawesome-common-types": { "node_modules/@fortawesome/fontawesome-common-types": {
"version": "0.2.36", "version": "0.2.36",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
@ -4717,38 +4671,6 @@
"ts-toolbelt": "^9.6.0" "ts-toolbelt": "^9.6.0"
} }
}, },
"node_modules/@mui/base": {
"version": "5.0.0-beta.40",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
"integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@floating-ui/react-dom": "^2.0.8",
"@mui/types": "^7.2.14",
"@mui/utils": "^5.15.14",
"@popperjs/core": "^2.11.8",
"clsx": "^2.1.0",
"prop-types": "^15.8.1"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
"react": "^17.0.0 || ^18.0.0",
"react-dom": "^17.0.0 || ^18.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/core-downloads-tracker": { "node_modules/@mui/core-downloads-tracker": {
"version": "5.16.6", "version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz",
@ -4785,47 +4707,6 @@
} }
} }
}, },
"node_modules/@mui/lab": {
"version": "5.0.0-alpha.173",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.173.tgz",
"integrity": "sha512-Gt5zopIWwxDgGy/MXcp6GueD84xFFugFai4hYiXY0zowJpTVnIrTQCQXV004Q7rejJ7aaCntX9hpPJqCrioshA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@mui/base": "5.0.0-beta.40",
"@mui/system": "^5.16.5",
"@mui/types": "^7.2.15",
"@mui/utils": "^5.16.5",
"clsx": "^2.1.0",
"prop-types": "^15.8.1"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
"@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0",
"@mui/material": ">=5.15.0",
"@types/react": "^17.0.0 || ^18.0.0",
"react": "^17.0.0 || ^18.0.0",
"react-dom": "^17.0.0 || ^18.0.0"
},
"peerDependenciesMeta": {
"@emotion/react": {
"optional": true
},
"@emotion/styled": {
"optional": true
},
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/material": { "node_modules/@mui/material": {
"version": "5.16.6", "version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.6.tgz", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.6.tgz",
@ -5965,21 +5846,6 @@
"devOptional": true, "devOptional": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@twilio/audioplayer": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@twilio/audioplayer/-/audioplayer-1.0.6.tgz",
"integrity": "sha512-c9cjX/ifICgXqShtyAQdVMqfe7odnxougiuRMXBJtn3dZ320mFdt7kmuKedpNnc3ZJ6irOZ9M9MZi9/vuEqHiw==",
"license": "BSD-3-Clause",
"dependencies": {
"babel-runtime": "^6.26.0"
}
},
"node_modules/@twilio/voice-errors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@twilio/voice-errors/-/voice-errors-1.0.1.tgz",
"integrity": "sha512-iXzCuiOhNMhrr8DVjRRzI14YwGUIBM83kWSWcDktxmXim0Tz9xoCth4QFAQcMkNL2h9DlfXlob6noH+3h2iA4A==",
"license": "BSD-3-Clause"
},
"node_modules/@types/babel__core": { "node_modules/@types/babel__core": {
"version": "7.20.5", "version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@ -6120,9 +5986,9 @@
} }
}, },
"node_modules/@types/http-proxy": { "node_modules/@types/http-proxy": {
"version": "1.17.14", "version": "1.17.15",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
"integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
@ -6298,9 +6164,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/yargs": { "node_modules/@types/yargs": {
"version": "17.0.32", "version": "17.0.33",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
"integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/yargs-parser": "*" "@types/yargs-parser": "*"
@ -7490,34 +7356,6 @@
"@babel/core": "^7.0.0" "@babel/core": "^7.0.0"
} }
}, },
"node_modules/babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"license": "MIT",
"dependencies": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"node_modules/babel-runtime/node_modules/regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"license": "MIT"
},
"node_modules/backoff": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
"integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==",
"license": "MIT",
"dependencies": {
"precond": "0.2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/bail": { "node_modules/bail": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
@ -7839,9 +7677,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001649", "version": "1.0.30001650",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001650.tgz",
"integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "integrity": "sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -8377,14 +8215,6 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"hasInstallScript": true,
"license": "MIT"
},
"node_modules/core-js-compat": { "node_modules/core-js-compat": {
"version": "3.38.0", "version": "3.38.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
@ -9090,9 +8920,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.4", "version": "1.5.5",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz",
"integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/emittery": { "node_modules/emittery": {
@ -9940,9 +9770,9 @@
} }
}, },
"node_modules/eslint-plugin-promise": { "node_modules/eslint-plugin-promise": {
"version": "7.0.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.1.0.tgz",
"integrity": "sha512-wb1ECT+b90ndBdAujhIdAU8oQ3Vt5gKqP/t78KOmg0ifynrvc2jGR9f6ndbOVNFpKf6jLUBlBBDF3H3Wk0JICg==", "integrity": "sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==",
"license": "ISC", "license": "ISC",
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -11611,6 +11441,18 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0" "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
} }
}, },
"node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/https-proxy-agent": { "node_modules/https-proxy-agent": {
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
@ -12210,12 +12052,12 @@
} }
}, },
"node_modules/is-plain-obj": { "node_modules/is-plain-obj": {
"version": "3.0.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=12"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
@ -13652,19 +13494,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/loglevel": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz",
"integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==",
"license": "MIT",
"engines": {
"node": ">= 0.6.0"
},
"funding": {
"type": "tidelift",
"url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund"
}
},
"node_modules/long": { "node_modules/long": {
"version": "5.2.3", "version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
@ -14762,28 +14591,6 @@
"uuid": "dist/bin/uuid" "uuid": "dist/bin/uuid"
} }
}, },
"node_modules/next-http-proxy-middleware": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/next-http-proxy-middleware/-/next-http-proxy-middleware-1.2.6.tgz",
"integrity": "sha512-vHmtFLeO+HomU4Fx/CoA4MbLnXya1B17yR5qOmpYZqRjzGa17a9dgXh9ONvquSZdMrIn7bUfjoPLxMkYMtKj3Q==",
"license": "MIT",
"dependencies": {
"@types/http-proxy": "1.17.3",
"http-proxy": "^1.18.1"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/next-http-proxy-middleware/node_modules/@types/http-proxy": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.3.tgz",
"integrity": "sha512-wIPqXANye5BbORbuh74exbwNzj+UWCwWyeEFJzUQ7Fq3W2NSAy+7x7nX1fgbEypr2/TdKqpeuxLnXWgzN533/Q==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/node-abi": { "node_modules/node-abi": {
"version": "3.65.0", "version": "3.65.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz",
@ -14875,15 +14682,6 @@
"node": ">=4.4.0" "node": ">=4.4.0"
} }
}, },
"node_modules/nodemailer": {
"version": "6.9.14",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz",
"integrity": "sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==",
"license": "MIT-0",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/normalize-package-data": { "node_modules/normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@ -16023,14 +15821,6 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/precond": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
"integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/prelude-ls": { "node_modules/prelude-ls": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -16864,9 +16654,9 @@
} }
}, },
"node_modules/remeda": { "node_modules/remeda": {
"version": "2.7.1", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/remeda/-/remeda-2.7.1.tgz", "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.10.0.tgz",
"integrity": "sha512-P+tm5rsatmF0GRh/EWq7vfoVyYyZbjO5Un/d08rZyEiznQWHXTtxhPu8cTntlQ8bHyPJBF3n2i5yFFmgaS3stA==", "integrity": "sha512-2RFz0VWckq8nb0nttzToa8BB5HgLsBHokWUKYiV5C8hnsZOTO1jcx0oXKvfS5khabhS6XkngMOLebQB+pm20IQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"type-fest": "^4.23.0" "type-fest": "^4.23.0"
@ -17020,19 +16810,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/rtcpeerconnection-shim": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.8.tgz",
"integrity": "sha512-5Sx90FGru1sQw9aGOM+kHU4i6mbP8eJPgxliu2X3Syhg8qgDybx8dpDTxUwfJvPnubXFnZeRNl59DWr4AttJKQ==",
"license": "BSD-3-Clause",
"dependencies": {
"sdp": "^2.6.0"
},
"engines": {
"node": ">=6.0.0",
"npm": ">=3.10.0"
}
},
"node_modules/run-async": { "node_modules/run-async": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@ -17219,12 +16996,6 @@
"integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==", "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==",
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/sdp": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/sdp/-/sdp-2.12.0.tgz",
"integrity": "sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==",
"license": "MIT"
},
"node_modules/secure-json-parse": { "node_modules/secure-json-parse": {
"version": "2.7.0", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz",
@ -18012,19 +17783,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/swr": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz",
"integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==",
"license": "MIT",
"dependencies": {
"client-only": "^0.0.1",
"use-sync-external-store": "^1.2.0"
},
"peerDependencies": {
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/synckit": { "node_modules/synckit": {
"version": "0.9.1", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
@ -18555,46 +18313,6 @@
"node": ">=14.0" "node": ">=14.0"
} }
}, },
"node_modules/twilio-client": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/twilio-client/-/twilio-client-1.15.1.tgz",
"integrity": "sha512-O2Cdq4THosTPLMIfFK0/xcS8SCCLUiv1hDB4i4sAisqtfHEVLXSuNoL332rPkDPC3jzgm3C5zzbEz/XyEXO+NQ==",
"deprecated": "Effective April 1, 2025, Twilio will end of life (EOL) our support for Twilio Voice JS SDK version 1.x. Please migrate to version 2.x https://www.twilio.com/docs/voice/sdks/javascript/migrating-to-js-voice-sdk-20",
"license": "Apache-2.0",
"dependencies": {
"@twilio/audioplayer": "1.0.6",
"@twilio/voice-errors": "1.0.1",
"backoff": "2.5.0",
"loglevel": "1.6.7",
"rtcpeerconnection-shim": "1.2.8",
"ws": "7.4.6",
"xmlhttprequest": "1.8.0"
},
"engines": {
"node": ">= 12"
}
},
"node_modules/twilio-client/node_modules/ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"license": "MIT",
"engines": {
"node": ">=8.3.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/twilio/node_modules/agent-base": { "node_modules/twilio/node_modules/agent-base": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@ -18905,18 +18623,6 @@
"url": "https://opencollective.com/unified" "url": "https://opencollective.com/unified"
} }
}, },
"node_modules/unified/node_modules/is-plain-obj": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
"integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/unist-util-is": { "node_modules/unist-util-is": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
@ -19074,15 +18780,6 @@
"integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/use-sync-external-store": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
"integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -19522,15 +19219,6 @@
"node": ">=6.0" "node": ">=6.0"
} }
}, },
"node_modules/xmlhttprequest": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/xtend": { "node_modules/xtend": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
@ -19644,7 +19332,7 @@
}, },
"packages/bridge-common": { "packages/bridge-common": {
"name": "@link-stack/bridge-common", "name": "@link-stack/bridge-common",
"version": "1.0.0", "version": "2.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@auth/kysely-adapter": "^1.4.2", "@auth/kysely-adapter": "^1.4.2",
@ -19673,7 +19361,6 @@
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@link-stack/signal-api": "*", "@link-stack/signal-api": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",
@ -19725,7 +19412,7 @@
"eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.7.0", "eslint-plugin-jest": "^28.7.0",
"eslint-plugin-promise": "^7.0.0", "eslint-plugin-promise": "^7.1.0",
"eslint-plugin-unicorn": "55.0.0" "eslint-plugin-unicorn": "55.0.0"
}, },
"devDependencies": { "devDependencies": {
@ -19760,7 +19447,6 @@
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@link-stack/opensearch-common": "*", "@link-stack/opensearch-common": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",
@ -19838,7 +19524,6 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-common", "name": "@link-stack/bridge-common",
"version": "1.0.0", "version": "2.2.0",
"main": "build/main/index.js", "main": "build/main/index.js",
"type": "module", "type": "module",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",

View file

@ -13,7 +13,6 @@ export class Whatsapp extends Service {
const id = row.id; const id = row.id;
const url = `${process.env.BRIDGE_WHATSAPP_URL}/api/bots/${id}`; const url = `${process.env.BRIDGE_WHATSAPP_URL}/api/bots/${id}`;
const result = await fetch(url, { cache: "no-store" }); const result = await fetch(url, { cache: "no-store" });
console.log({ result1: result });
const json = await result.json(); const json = await result.json();
await db await db
@ -25,7 +24,6 @@ export class Whatsapp extends Service {
if (!json.verified) { if (!json.verified) {
const url = `${process.env.BRIDGE_WHATSAPP_URL}/api/bots/${id}/register`; const url = `${process.env.BRIDGE_WHATSAPP_URL}/api/bots/${id}/register`;
const result = await fetch(url, { method: "POST" }); const result = await fetch(url, { method: "POST" });
console.log({ result2: result });
} }
revalidatePath(`/whatsapp/${id}`); revalidatePath(`/whatsapp/${id}`);

View file

@ -12,7 +12,6 @@
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@link-stack/signal-api": "*", "@link-stack/signal-api": "*",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",

View file

@ -18,7 +18,7 @@
"eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.7.0", "eslint-plugin-jest": "^28.7.0",
"eslint-plugin-promise": "^7.0.0", "eslint-plugin-promise": "^7.1.0",
"eslint-plugin-unicorn": "55.0.0", "eslint-plugin-unicorn": "55.0.0",
"@babel/eslint-parser": "7.25.1" "@babel/eslint-parser": "7.25.1"
}, },

View file

@ -10,7 +10,6 @@
"@emotion/server": "^11.11.0", "@emotion/server": "^11.11.0",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",

View file

@ -1,5 +1,3 @@
"use client";
import { FC } from "react"; import { FC } from "react";
import Link from "next/link"; import Link from "next/link";
import { Button as MUIButton } from "@mui/material"; import { Button as MUIButton } from "@mui/material";

View file

@ -9,7 +9,6 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@mui/icons-material": "^5", "@mui/icons-material": "^5",
"@mui/lab": "^5.0.0-alpha.173",
"@mui/material": "^5", "@mui/material": "^5",
"@mui/x-data-grid-pro": "^7.12.0", "@mui/x-data-grid-pro": "^7.12.0",
"@mui/x-date-pickers-pro": "^7.12.0", "@mui/x-date-pickers-pro": "^7.12.0",