diff --git a/.gitignore b/.gitignore index 9ba6742..4011990 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules .env .turbo +*.tsbuildinfo build/** **/dist/** .next/** @@ -26,3 +27,7 @@ signald-state/* baileys-state signald-state project.org +**/.openapi-generator/ +apps/bridge-worker/scripts/* +ENVIRONMENT_VARIABLES_MIGRATION.md +local-scripts/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6f80211..8fcd82b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: node:20-bookworm-slim +image: node:22-bookworm-slim stages: - build @@ -8,37 +8,44 @@ stages: build-all: stage: build variables: - TURBO_TOKEN: $TURBO_TOKEN - TURBO_TEAM: $TURBO_TEAM + TURBO_TOKEN: ${TURBO_TOKEN} + TURBO_TEAM: ${TURBO_TEAM} + ZAMMAD_URL: ${ZAMMAD_URL} + PNPM_HOME: "/pnpm" script: - - npm install npm@latest -g - - npm install -g turbo - - npm ci + - export PATH="$PNPM_HOME:$PATH" + - corepack enable && corepack prepare pnpm@9.15.4 --activate + - pnpm add -g turbo + - pnpm install --frozen-lockfile - turbo build .docker-build: - image: registry.gitlab.com/digiresilience/link/link-stack/buildx:${CI_COMMIT_REF_NAME} + image: registry.gitlab.com/digiresilience/link/link-stack/buildx:main services: - docker:dind stage: docker-build variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" DOCKER_TAG: ${CI_COMMIT_SHORT_SHA} - DOCKER_CONTEXT: . + BUILD_CONTEXT: . only: - main - develop - tags script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - - DOCKER_BUILDKIT=1 docker build --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${DOCKER_CONTEXT} + - DOCKER_BUILDKIT=1 docker build --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${BUILD_CONTEXT} - docker push ${DOCKER_NS}:${DOCKER_TAG} .docker-release: - image: registry.gitlab.com/digiresilience/link/link-stack/buildx:${CI_COMMIT_REF_NAME} + image: registry.gitlab.com/digiresilience/link/link-stack/buildx:main services: - docker:dind stage: docker-release variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" DOCKER_TAG: ${CI_COMMIT_SHORT_SHA} DOCKER_TAG_NEW: ${CI_COMMIT_REF_NAME} only: @@ -73,49 +80,49 @@ link-docker-release: variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/link -leafcutter-docker-build: +bridge-frontend-docker-build: extends: .docker-build variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/leafcutter - DOCKERFILE_PATH: ./apps/leafcutter/Dockerfile + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-frontend + DOCKERFILE_PATH: ./apps/bridge-frontend/Dockerfile -leafcutter-docker-release: +bridge-frontend-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/leafcutter + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-frontend -bridge-docker-build: +bridge-worker-docker-build: extends: .docker-build variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge - DOCKERFILE_PATH: ./apps/bridge-cli/Dockerfile + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-worker + DOCKERFILE_PATH: ./apps/bridge-worker/Dockerfile -bridge-docker-release: +bridge-worker-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-worker -elasticsearch-docker-build: +bridge-whatsapp-docker-build: extends: .docker-build variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/elasticsearch - DOCKERFILE_PATH: ./docker/elasticsearch/Dockerfile + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-whatsapp + DOCKERFILE_PATH: ./apps/bridge-whatsapp/Dockerfile -elasticsearch-docker-release: +bridge-whatsapp-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/elasticsearch + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-whatsapp -label-studio-docker-build: +signal-cli-rest-api-docker-build: extends: .docker-build variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/label-studio - DOCKERFILE_PATH: ./docker/label-studio/Dockerfile + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signal-cli-rest-api + DOCKERFILE_PATH: ./docker/signal-cli-rest-api/Dockerfile -label-studio-docker-release: +signal-cli-rest-api-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/label-studio + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signal-cli-rest-api memcached-docker-build: extends: .docker-build @@ -183,32 +190,22 @@ redis-docker-release: variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/redis -signald-docker-build: - extends: .docker-build - variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signald - DOCKERFILE_PATH: ./docker/signald/Dockerfile - -signald-docker-release: - extends: .docker-release - variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signald - zammad-docker-build: extends: .docker-build variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/zammad DOCKERFILE_PATH: ./docker/zammad/Dockerfile - DOCKER_CONTEXT: ./docker/zammad + BUILD_CONTEXT: ./docker/zammad + PNPM_HOME: "/pnpm" before_script: - - apk --update add nodejs npm + - export PATH="$PNPM_HOME:$PATH" + - corepack enable && corepack prepare pnpm@9.15.4 --activate script: - - npm install npm@latest -g - - npm install -g turbo - - npm ci - - turbo build --force --filter zammad-addon-* + - pnpm add -g turbo + - pnpm install --frozen-lockfile + - turbo build --force --filter @link-stack/zammad-addon-* - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - - DOCKER_BUILDKIT=1 docker build --build-arg EMBEDDED=true --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${DOCKER_CONTEXT} + - DOCKER_BUILDKIT=1 docker build --build-arg EMBEDDED=true --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${BUILD_CONTEXT} - docker push ${DOCKER_NS}:${DOCKER_TAG} zammad-docker-release: @@ -221,16 +218,17 @@ zammad-standalone-docker-build: variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/zammad-standalone DOCKERFILE_PATH: ./docker/zammad/Dockerfile - DOCKER_CONTEXT: ./docker/zammad + BUILD_CONTEXT: ./docker/zammad + PNPM_HOME: "/pnpm" before_script: - - apk --update add nodejs npm + - export PATH="$PNPM_HOME:$PATH" + - corepack enable && corepack prepare pnpm@9.15.4 --activate script: - - npm install npm@latest -g - - npm install -g turbo - - npm ci - - turbo build --force --filter zammad-addon-* + - pnpm add -g turbo + - pnpm install --frozen-lockfile + - turbo build --force --filter @link-stack/zammad-addon-* - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - - DOCKER_BUILDKIT=1 docker build --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${DOCKER_CONTEXT} + - DOCKER_BUILDKIT=1 docker build --pull --no-cache -t ${DOCKER_NS}:${DOCKER_TAG} -f ${DOCKERFILE_PATH} ${BUILD_CONTEXT} - docker push ${DOCKER_NS}:${DOCKER_TAG} zammad-standalone-docker-release: diff --git a/.nvmrc b/.nvmrc index 6ed5da9..32cfab6 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.2.0 +v22.18.0 diff --git a/README.md b/README.md index 964bee8..155729c 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ -# TK +# CDR Link + +CDR Link is a simple & streamlined helpdesk that lets you tag, assign and respond to your tickets. It is developed by the [Center for Digital Resilience](https://digiresilience.org) and powered by [Zammad](https://zammad.org). + +Key differences between CDR Link and a standard Zammad installation: + +- In addition to the full Zammad interface, CDR Link also provides a simplified 'shell' interface that focuses on the most-commonly-used functionality. +- Additional channels to communicate with users, including Signal, Whatsapp & Twilio voice messaging. +- More stringent privacy defaults: ticket data is never sent over email and calls to third-party services are restricted. + +## Developing + +This is a monorepo that contains CDR Link and several supporting applications and libraries. It also includes Dockerfiles to build all of the other containers required for an installation. By tagging our own versions of these dependencies, we can make sure that different versions of the supporting containers all work together and are updated in sync. + +We use [Turborepo](https://turbo.build) to manage development and building of the packages. To get started: + +- `npm install` in the root directory +- `turbo build` to build all packages + +To run a single package: + +- `turbo dev --filter @link-stack/link` + diff --git a/apps/bridge-frontend/Dockerfile b/apps/bridge-frontend/Dockerfile index 44f5b57..75a19ce 100644 --- a/apps/bridge-frontend/Dockerfile +++ b/apps/bridge-frontend/Dockerfile @@ -1,24 +1,30 @@ -FROM node:20-bookworm AS base +FROM node:22-bookworm-slim AS base FROM base AS builder ARG APP_DIR=/opt/bridge-frontend +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" RUN mkdir -p ${APP_DIR}/ -RUN npm i -g turbo +RUN corepack enable && corepack prepare pnpm@9.15.4 --activate +RUN pnpm add -g turbo WORKDIR ${APP_DIR} COPY . . -RUN turbo prune --scope=bridge-frontend --docker +RUN turbo prune --scope=@link-stack/bridge-frontend --scope=@link-stack/bridge-migrations --docker FROM base AS installer ARG APP_DIR=/opt/bridge-frontend +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" WORKDIR ${APP_DIR} +RUN corepack enable && corepack prepare pnpm@9.15.4 --activate COPY --from=builder ${APP_DIR}/.gitignore .gitignore COPY --from=builder ${APP_DIR}/out/json/ . -COPY --from=builder ${APP_DIR}/out/package-lock.json ./package-lock.json -RUN npm ci +COPY --from=builder ${APP_DIR}/out/pnpm-lock.yaml ./pnpm-lock.yaml +RUN pnpm install --frozen-lockfile COPY --from=builder ${APP_DIR}/out/full/ . -RUN npm i -g turbo -RUN turbo run build --filter=bridge-frontend +RUN pnpm add -g turbo +RUN turbo run build --filter=@link-stack/bridge-frontend --filter=@link-stack/bridge-migrations FROM base AS runner ARG APP_DIR=/opt/bridge-frontend @@ -29,22 +35,20 @@ LABEL maintainer="Darren Clarke " LABEL org.label-schema.build-date=$BUILD_DATE LABEL org.label-schema.version=$VERSION ENV APP_DIR ${APP_DIR} +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable && corepack prepare pnpm@9.15.4 --activate RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ apt-get install -y --no-install-recommends \ dumb-init RUN mkdir -p ${APP_DIR} -RUN chown -R node ${APP_DIR}/ - -USER node WORKDIR ${APP_DIR} -COPY --from=installer ${APP_DIR}/node_modules/ ./node_modules/ -COPY --from=installer ${APP_DIR}/apps/bridge-frontend/ ./apps/bridge-frontend/ -COPY --from=installer ${APP_DIR}/package.json ./package.json -USER root +COPY --from=installer ${APP_DIR} ./ +RUN chown -R node:node ${APP_DIR}/ WORKDIR ${APP_DIR}/apps/bridge-frontend/ RUN chmod +x docker-entrypoint.sh USER node EXPOSE 3000 ENV PORT 3000 ENV NODE_ENV production -ENTRYPOINT ["/opt/link/apps/bridge-frontend/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/bridge-frontend/apps/bridge-frontend/docker-entrypoint.sh"] diff --git a/apps/bridge-frontend/README.md b/apps/bridge-frontend/README.md index c403366..ebec248 100644 --- a/apps/bridge-frontend/README.md +++ b/apps/bridge-frontend/README.md @@ -1,36 +1,133 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +# Bridge Frontend -## Getting Started +Frontend application for managing communication bridges between various messaging platforms and the CDR Link system. -First, run the development server: +## Overview + +Bridge Frontend provides a web interface for configuring and managing communication channels including Signal, WhatsApp, Facebook, and Voice integrations. It handles bot registration, webhook configuration, and channel settings. + +## Features + +- **Channel Management**: Configure Signal, WhatsApp, Facebook, and Voice channels +- **Bot Registration**: Register and manage bots for each communication platform +- **Webhook Configuration**: Set up webhooks for message routing +- **Settings Management**: Configure channel-specific settings and behaviors +- **User Authentication**: Secure access with NextAuth.js + +## Development + +### Prerequisites + +- Node.js >= 20 +- npm >= 10 +- PostgreSQL database +- Running bridge-worker service + +### Setup ```bash +# Install dependencies +npm install + +# Run database migrations +npm run migrate:latest + +# Run development server npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev + +# Build for production +npm run build + +# Start production server +npm run start ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +### Environment Variables -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +Required environment variables: -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +- `DATABASE_URL` - PostgreSQL connection string +- `DATABASE_HOST` - Database host +- `DATABASE_NAME` - Database name +- `DATABASE_USER` - Database username +- `DATABASE_PASSWORD` - Database password +- `NEXTAUTH_URL` - Application URL +- `NEXTAUTH_SECRET` - NextAuth.js secret +- `GOOGLE_CLIENT_ID` - Google OAuth client ID +- `GOOGLE_CLIENT_SECRET` - Google OAuth client secret -## Learn More +### Available Scripts -To learn more about Next.js, take a look at the following resources: +- `npm run dev` - Start development server +- `npm run build` - Build for production +- `npm run start` - Start production server +- `npm run lint` - Run ESLint +- `npm run migrate:latest` - Run all pending migrations +- `npm run migrate:down` - Rollback last migration +- `npm run migrate:up` - Run next migration +- `npm run migrate:make` - Create new migration -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +## Architecture -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +### Database Schema -## Deploy on Vercel +The application manages the following main entities: -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +- **Bots**: Communication channel bot configurations +- **Webhooks**: Webhook endpoints for external integrations +- **Settings**: Channel-specific configuration settings +- **Users**: User accounts with role-based permissions -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +### API Routes + +- `/api/auth` - Authentication endpoints +- `/api/[service]/bots` - Bot management for each service +- `/api/[service]/webhooks` - Webhook configuration + +### Page Structure + +- `/` - Dashboard/home page +- `/login` - Authentication page +- `/[...segment]` - Dynamic routing for CRUD operations + - `@create` - Create new entities + - `@detail` - View entity details + - `@edit` - Edit existing entities + +## Integration + +### Database Access + +Uses Kysely ORM for type-safe database queries: + +```typescript +import { db } from '@link-stack/database' + +const bots = await db + .selectFrom('bots') + .selectAll() + .execute() +``` + +### Authentication + +Integrated with NextAuth.js using database adapter: + +```typescript +import { authOptions } from '@link-stack/auth' +``` + +## Docker Support + +```bash +# Build image +docker build -t link-stack/bridge-frontend . + +# Run with docker-compose +docker-compose -f docker/compose/bridge.yml up +``` + +## Related Services + +- **bridge-worker**: Processes messages from configured channels +- **bridge-whatsapp**: WhatsApp-specific integration service +- **bridge-migrations**: Database schema management \ No newline at end of file diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx index 6b1def5..bc5b6b8 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx @@ -1,10 +1,11 @@ -import { Create } from "bridge-ui"; +import { Create } from "@link-stack/bridge-ui"; type PageProps = { - params: { segment: string[] }; + params: Promise<{ segment: string[] }>; }; -export default function Page({ params: { segment } }: PageProps) { +export default async function Page({ params }: PageProps) { + const { segment } = await params; const service = segment[0]; return ; diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@detail/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@detail/page.tsx index 66d9c09..e857b7d 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/@detail/page.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/@detail/page.tsx @@ -1,11 +1,12 @@ -import { db } from "bridge-common"; -import { serviceConfig, Detail } from "bridge-ui"; +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, Detail } from "@link-stack/bridge-ui"; -type Props = { - params: { segment: string[] }; +type PageProps = { + params: Promise<{ segment: string[] }>; }; -export default async function Page({ params: { segment } }: Props) { +export default async function Page({ params }: PageProps) { + const { segment } = await params; const service = segment[0]; const id = segment?.[1]; diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx index f028400..82c8052 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx @@ -1,11 +1,12 @@ -import { db } from "bridge-common"; -import { serviceConfig, Edit } from "bridge-ui"; +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, Edit } from "@link-stack/bridge-ui"; type PageProps = { - params: { segment: string[] }; + params: Promise<{ segment: string[] }>; }; -export default async function Page({ params: { segment } }: PageProps) { +export default async function Page({ params }: PageProps) { + const { segment } = await params; const service = segment[0]; const id = segment?.[1]; diff --git a/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx b/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx index 773d96c..c360a57 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx @@ -1,3 +1,3 @@ -import { ServiceLayout } from "bridge-ui"; +import { ServiceLayout } from "@link-stack/bridge-ui"; export default ServiceLayout; diff --git a/apps/bridge-frontend/app/(main)/[...segment]/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/page.tsx index 6da1c45..7b4fc03 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/page.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/page.tsx @@ -1,13 +1,14 @@ -import { db } from "bridge-common"; -import { serviceConfig, List } from "bridge-ui"; +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, List } from "@link-stack/bridge-ui"; type PageProps = { - params: { + params: Promise<{ segment: string[]; - }; + }>; }; -export default async function Page({ params: { segment } }: PageProps) { +export default async function Page({ params }: PageProps) { + const { segment } = await params; const service = segment[0]; if (!service) return null; diff --git a/apps/bridge-frontend/app/(main)/page.tsx b/apps/bridge-frontend/app/(main)/page.tsx index d8a8d6c..e01be47 100644 --- a/apps/bridge-frontend/app/(main)/page.tsx +++ b/apps/bridge-frontend/app/(main)/page.tsx @@ -1,4 +1,4 @@ -import { Home } from "bridge-ui"; +import { Home } from "@link-stack/bridge-ui"; export default function Page() { return ; diff --git a/apps/bridge-frontend/app/_components/InternalLayout.tsx b/apps/bridge-frontend/app/_components/InternalLayout.tsx index 976719c..72985ad 100644 --- a/apps/bridge-frontend/app/_components/InternalLayout.tsx +++ b/apps/bridge-frontend/app/_components/InternalLayout.tsx @@ -3,33 +3,27 @@ import { FC, PropsWithChildren, useState } from "react"; import { Grid } from "@mui/material"; import { CssBaseline } from "@mui/material"; +import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter"; import { SessionProvider } from "next-auth/react"; -import { css, Global } from "@emotion/react"; -import { fonts } from "ui"; import { Sidebar } from "./Sidebar"; export const InternalLayout: FC = ({ children }) => { const [open, setOpen] = useState(true); - const { roboto } = fonts; - const globalCSS = css` - * { - font-family: ${roboto.style.fontFamily}; - } - `; return ( - - - - - - - {children as any} + + + + + + + {children as any} + - - + + ); }; diff --git a/apps/bridge-frontend/app/_components/Login.tsx b/apps/bridge-frontend/app/_components/Login.tsx index 9282b19..8e40129 100644 --- a/apps/bridge-frontend/app/_components/Login.tsx +++ b/apps/bridge-frontend/app/_components/Login.tsx @@ -17,7 +17,7 @@ import { import { signIn } from "next-auth/react"; import Image from "next/image"; import LinkLogo from "@/app/_images/link-logo-small.png"; -import { colors, fonts } from "ui"; +import { colors, fonts } from "@link-stack/ui"; import { useSearchParams } from "next/navigation"; type LoginProps = { diff --git a/apps/bridge-frontend/app/_components/Sidebar.tsx b/apps/bridge-frontend/app/_components/Sidebar.tsx index 60355c2..31aaaaa 100644 --- a/apps/bridge-frontend/app/_components/Sidebar.tsx +++ b/apps/bridge-frontend/app/_components/Sidebar.tsx @@ -20,11 +20,12 @@ import { WhatsApp as WhatsAppIcon, Facebook as FacebookIcon, AirlineStops as AirlineStopsIcon, + Logout as LogoutIcon, } from "@mui/icons-material"; import { usePathname } from "next/navigation"; import Link from "next/link"; import Image from "next/image"; -import { typography, fonts } from "ui"; +import { typography, fonts, Button } from "@link-stack/ui"; import LinkLogo from "@/app/_images/link-logo-small.png"; import { useSession, signOut } from "next-auth/react"; @@ -161,9 +162,9 @@ export const Sidebar: FC = ({ open, setOpen }) => { const { data: session } = useSession(); const user = session?.user; - // const logout = () => { - // signOut({ callbackUrl: "/login" }); - // }; + const logout = () => { + signOut({ callbackUrl: "/login" }); + }; return ( = ({ open, setOpen }) => { )} - {open && ( - - - {user?.email} - - - )} + + + + {user?.email} + + + +