diff --git a/.gitignore b/.gitignore index cc597ab..eb15c89 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules .env .turbo +*.tsbuildinfo build/** **/dist/** .next/** @@ -19,10 +20,11 @@ docker-compose.yml coverage .pgpass **/dist/** -.metamigo.local.json +.bridge.local.json out/ signald-state/* !./signald-state/.gitkeep baileys-state signald-state -project.org \ No newline at end of file +project.org +**/.openapi-generator/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8a2974..1907598 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -84,38 +84,49 @@ leafcutter-docker-release: variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/leafcutter -metamigo-docker-build: +bridge-frontend-docker-build: extends: .docker-build variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/metamigo - DOCKERFILE_PATH: ./apps/metamigo-cli/Dockerfile + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-frontend + DOCKERFILE_PATH: ./apps/bridge-frontend/Dockerfile -metamigo-docker-release: +bridge-frontend-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/metamigo + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-frontend -elasticsearch-docker-build: +bridge-worker-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-worker + DOCKERFILE_PATH: ./apps/bridge-worker/Dockerfile -elasticsearch-docker-release: +bridge-worker-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/elasticsearch + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-worker -label-studio-docker-build: +bridge-whatsapp-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/bridge-whatsapp + DOCKERFILE_PATH: ./apps/bridge-whatsapp/Dockerfile -label-studio-docker-release: +bridge-whatsapp-docker-release: extends: .docker-release variables: - DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/label-studio + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/bridge-whatsapp + +signal-cli-rest-api-docker-build: + extends: .docker-build + variables: + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signal-cli-rest-api + DOCKERFILE_PATH: ./docker/signal-cli-rest-api/Dockerfile + +signal-cli-rest-api-docker-release: + extends: .docker-release + variables: + DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/signal-cli-rest-api memcached-docker-build: extends: .docker-build @@ -183,17 +194,6 @@ 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: @@ -206,7 +206,7 @@ zammad-docker-build: - npm install npm@latest -g - npm install -g turbo - npm ci - - turbo build --force --filter zammad-addon-* + - 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 push ${DOCKER_NS}:${DOCKER_TAG} @@ -215,7 +215,7 @@ zammad-docker-release: extends: .docker-release variables: DOCKER_NS: ${CI_REGISTRY}/digiresilience/link/link-stack/zammad - + zammad-standalone-docker-build: extends: .docker-build variables: @@ -228,7 +228,7 @@ zammad-standalone-docker-build: - npm install npm@latest -g - npm install -g turbo - npm ci - - turbo build --force --filter zammad-addon-* + - 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 push ${DOCKER_NS}:${DOCKER_TAG} diff --git a/.gitpod.dockerfile b/.gitpod.dockerfile deleted file mode 100644 index e2b4a7b..0000000 --- a/.gitpod.dockerfile +++ /dev/null @@ -1,78 +0,0 @@ -FROM gitpod/workspace-full - -# install tools we need -RUN set -ex; \ - pyenv global system; \ - sudo add-apt-repository ppa:ansible/ansible; \ - sudo add-apt-repository ppa:maxmind/ppa; \ - curl -s https://helm.baltorepo.com/organization/signing.asc | sudo apt-key add - ; \ - curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash; \ - echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list ; \ - sudo apt-get update; \ - sudo apt-get -y upgrade ; \ - sudo apt-get install -y \ - ansible \ - build-essential \ - httpie \ - fd-find \ - ffmpeg \ - geoipupdate \ - gitlab-runner \ - helm \ - htop \ - iotop \ - iptraf \ - jq \ - kitty-terminfo \ - libolm-dev \ - ncdu \ - postgresql \ - pwgen \ - python3-wheel \ - ripgrep \ - rsync \ - scdaemon \ - socat \ - tmux \ - unrar \ - unzip \ - vifm \ - vim \ - yamllint \ - zsh \ - zsh-syntax-highlighting \ - ; sudo rm -rf /var/lib/apt/lists/* - -RUN set -ex; \ - brew install \ - zoxide \ - fzf; - -# needed for tailscale -RUN sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft - -# install npm global packages we need -RUN set -ex; \ - npm install -g \ - standard-version \ - turbo \ - ; - -# make a place for all our warez -RUN sudo mkdir -p /usr/local/bin - -# install AWS' kubectl -# from https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html -ARG KUBECTL_URL="https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl" -RUN set -ex; \ - curl -o kubectl "${KUBECTL_URL}"; \ - chmod +x kubectl; \ - sudo mv kubectl /usr/local/bin - -# install cloudflared -# from https://github.com/cloudflare/cloudflared/releases -ARG CLOUDFLARED_VERSION="2023.2.1" -RUN set -ex; \ - wget --progress=dot:mega https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64.deb; \ - sudo dpkg -i cloudflared-linux-amd64.deb; \ - cloudflared --version diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index b7144e3..0000000 --- a/.gitpod.yml +++ /dev/null @@ -1,63 +0,0 @@ ---- -# build the docker image for our gitpod from this dockerfile -image: - file: .gitpod.dockerfile -# all init+before are run in prebuilds, and on workspace startup -tasks: - - name: npm install - init: | - npm install -# extra extensions we share -vscode: - extensions: - - redhat.vscode-yaml - - ms-azuretools.vscode-docker - - ms-kubernetes-tools.vscode-kubernetes-tools - - ms-vscode.makefile-tools - - bungcip.better-toml - - sleistner.vscode-fileutils - - esbenp.prettier-vscode - - darkriszty.markdown-table-prettify - - VisualStudioExptTeam.vscodeintellicode - -ports: - - name: Zammad - port: 8001 - onOpen: notify - - - name: Leafcutter Local - port: 3001 - onOpen: notify - - - name: Leafcutter - port: 8004 - onOpen: notify - - - name: Link - port: 8003 - onOpen: notify - - - name: Link Local - port: 3000 - onOpen: notify - - - - name: Metamigo - port: 8002 - onOpen: notify - - - name: Metamigo Local - port: 2999 - onOpen: notify - - - name: Metamigo API - port: 8004 - onOpen: notify - - - name: Zammad Postgres - port: 5432 - onOpen: notify - - - name: Metamigo Postgres - port: 5433 - onOpen: notify \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 4183c4a..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "prettier.prettierPath": "" -} diff --git a/Makefile b/Makefile deleted file mode 100644 index dfd3742..0000000 --- a/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -CURRENT_UID := $(shell id -u):$(shell id -g) -PACKAGE_NAME ?= $(shell jq -r '.name' package.json) -PACKAGE_VERSION?= $(shell jq -r '.version' package.json) -BUILD_DATE ?=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ") -DOCKER_ARGS ?= -DOCKER_NS ?= registry.gitlab.com/digiresilience/link/${PACKAGE_NAME} -DOCKER_TAG ?= test -DOCKER_BUILD := docker build ${DOCKER_ARGS} --build-arg BUILD_DATE=${BUILD_DATE} -DOCKER_BUILD_FRESH := ${DOCKER_BUILD} --pull --no-cache -DOCKER_BUILD_ARGS := --build-arg VCS_REF=${CI_COMMIT_SHORT_SHA} -DOCKER_PUSH := docker push -DOCKER_BUILD_TAG := ${DOCKER_NS}:${DOCKER_TAG} - -.PHONY: .npmrc -.EXPORT_ALL_VARIABLES: - -.npmrc: -ifdef CI_JOB_TOKEN - echo '@guardianproject-ops:registry=https://gitlab.com/api/v4/packages/npm/' > .npmrc - echo '@digiresilience:registry=https://gitlab.com/api/v4/packages/npm/' >> .npmrc - echo '//gitlab.com/api/v4/packages/npm/:_authToken=${CI_JOB_TOKEN}' >> .npmrc - echo '//gitlab.com/api/v4/projects/:_authToken=${CI_JOB_TOKEN}' >> .npmrc - echo '//gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}' >> .npmrc -endif - -docker/build: .npmrc - DOCKER_BUILDKIT=1 ${DOCKER_BUILD} ${DOCKER_BUILD_ARGS} -t ${DOCKER_BUILD_TAG} ${PWD} - -docker/build-fresh: .npmrc - DOCKER_BUILDKIT=1 ${DOCKER_BUILD_FRESH} ${DOCKER_BUILD_ARGS} -t ${DOCKER_BUILD_TAG} ${PWD} - -docker/add-tag: - docker pull ${DOCKER_NS}:${DOCKER_TAG} - docker tag ${DOCKER_NS}:${DOCKER_TAG} ${DOCKER_NS}:${DOCKER_TAG_NEW} - docker push ${DOCKER_NS}:${DOCKER_TAG_NEW} - -docker/push: - ${DOCKER_PUSH} ${DOCKER_BUILD_TAG} - -docker/build-push: docker/build docker/push -docker/build-fresh-push: docker/build-fresh docker/push - -# don't use this to generate passwords for production -generate-secrets: - ZAMMAD_DATABASE_PASSWORD=$(shell openssl rand -hex 16) - METAMIGO_DATABASE_ROOT_PASSWORD=$(shell openssl rand -hex 16) - METAMIGO_DATABASE_PASSWORD=$(shell openssl rand -hex 16) - METAMIGO_DATABASE_AUTHENTICATOR_PASSWORD=$(shell openssl rand -hex 16) - NEXTAUTH_AUDIENCE=$(shell openssl rand -hex 16) - NEXTAUTH_SECRET=$(shell openssl rand -hex 16) - -generate-keys: - docker exec -i $(shell docker ps -aqf "name=metamigo-frontend") bash -c "/opt/metamigo/cli gen-jwks" - -setup-signal: - mkdir -p signald - -create-admin-user: - docker exec -i $(shell docker ps -aqf "name=metamigo-postgresql") bash < ./scripts/create-admin-user.sh - - -.env: - @test -f .env || echo "You must create .env please refer to the README" && exit 1 - -start: .env - CURRENT_UID=$(CURRENT_UID) docker compose -f docker-compose.link.yml up -d - -start-dev: .env - CURRENT_UID=$(CURRENT_UID) docker compose up --build -d - -restart: .env - CURRENT_UID=$(CURRENT_UID) docker restart $(shell docker ps -a -q) - -stop: - CURRENT_UID=$(CURRENT_UID) docker compose down - -destroy: - docker compose down - docker volume prune - - -dev-metamigo: - CURRENT_UID=$(CURRENT_UID) docker compose up -d metamigo-postgresql signald diff --git a/README.md b/README.md index 5b2659e..964bee8 100644 --- a/README.md +++ b/README.md @@ -1,36 +1 @@ -# Dev Setup - -> NOTE: When using Gitpod/Codespaces, use at least 16GB RAM - -Local dev with docker-compose - -* Create `link-stack/.env` from Bitwarden `.env for root of link-stack` -* Run local dev with docker-compose: - ``` - git clone ... - cd link-stack - make start-dev - ``` - -Or for local dev of a single app - -* Create `link-stack/apps/link/.env.local` from Bitwarden `.env.local for link-stack/apps/link` -* Create `link-stack/apps/metamigo-frontend/.metamigo.local.json` from Bitwarden `.metamigo.local.json for link-stack/apps/metamigo/frontend` -* Build locally for development: - ``` - npm install - make dev-metamigo # this starts the containers - npm run migrate # this migrates the db - npm run dev:metamigo # this runs metamigo frontend and api - ``` - -# TODO - -- [ ] Delete old JWT config stuff -- [ ] Consolidate config -- [ ] Complete react-admin upgrade.. make all the metamigo-frontend stuff work - * https://marmelab.com/react-admin/Upgrade.html#no-more-prop-injection-in-page-components -- [ ] Get metamigo-worker working -- [ ] Migrate off mui/styles - * https://mui.com/material-ui/migration/v5-style-changes/ - * the codemods might help us? \ No newline at end of file +# TK diff --git a/apps/metamigo-frontend/.eslintrc.json b/apps/bridge-frontend/.eslintrc.json similarity index 100% rename from apps/metamigo-frontend/.eslintrc.json rename to apps/bridge-frontend/.eslintrc.json diff --git a/apps/metamigo-frontend/.gitignore b/apps/bridge-frontend/.gitignore similarity index 100% rename from apps/metamigo-frontend/.gitignore rename to apps/bridge-frontend/.gitignore diff --git a/apps/metamigo-cli/Dockerfile b/apps/bridge-frontend/Dockerfile similarity index 52% rename from apps/metamigo-cli/Dockerfile rename to apps/bridge-frontend/Dockerfile index 211caf5..0d0d1fa 100644 --- a/apps/metamigo-cli/Dockerfile +++ b/apps/bridge-frontend/Dockerfile @@ -1,27 +1,27 @@ -FROM node:20 as base +FROM node:20-bookworm AS base FROM base AS builder -ARG APP_DIR=/opt/metamigo-cli +ARG APP_DIR=/opt/bridge-frontend RUN mkdir -p ${APP_DIR}/ RUN npm i -g turbo WORKDIR ${APP_DIR} COPY . . -RUN turbo prune --scope=@digiresilience/metamigo-cli --docker +RUN turbo prune --scope=@link-stack/bridge-frontend --scope=@link-stack/bridge-migrations --docker FROM base AS installer -ARG APP_DIR=/opt/metamigo-cli +ARG APP_DIR=/opt/bridge-frontend WORKDIR ${APP_DIR} -COPY .gitignore .gitignore +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 i +RUN npm ci COPY --from=builder ${APP_DIR}/out/full/ . RUN npm i -g turbo -RUN turbo run build --filter=metamigo-cli +RUN turbo run build --filter=@link-stack/bridge-frontend --filter=@link-stack/bridge-migrations FROM base AS runner -ARG APP_DIR=/opt/metamigo-cli +ARG APP_DIR=/opt/bridge-frontend WORKDIR ${APP_DIR}/ ARG BUILD_DATE ARG VERSION @@ -33,21 +33,16 @@ 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}/packages/ ./packages/ -COPY --from=installer ${APP_DIR}/apps/metamigo-cli/ ./apps/metamigo-cli/ -COPY --from=installer ${APP_DIR}/apps/metamigo-api/ ./apps/metamigo-api/ -COPY --from=installer ${APP_DIR}/apps/metamigo-worker/ ./apps/metamigo-worker/ +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}/apps/bridge-migrations/ ./apps/bridge-migrations/ COPY --from=installer ${APP_DIR}/package.json ./package.json -USER root -WORKDIR ${APP_DIR}/apps/metamigo-cli/ +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/metamigo-cli/apps/metamigo-cli/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/bridge-frontend/apps/bridge-frontend/docker-entrypoint.sh"] diff --git a/apps/metamigo-frontend/README.md b/apps/bridge-frontend/README.md similarity index 100% rename from apps/metamigo-frontend/README.md rename to apps/bridge-frontend/README.md diff --git a/apps/bridge-frontend/app/(login)/login/page.tsx b/apps/bridge-frontend/app/(login)/login/page.tsx new file mode 100644 index 0000000..8f79c27 --- /dev/null +++ b/apps/bridge-frontend/app/(login)/login/page.tsx @@ -0,0 +1,14 @@ +import { Metadata } from "next"; +import { getSession } from "next-auth/react"; +import { Login } from "@/app/_components/Login"; + +export const dynamic = "force-dynamic"; + +export const metadata: Metadata = { + title: "Login", +}; + +export default async function Page() { + const session = await getSession(); + return ; +} diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx new file mode 100644 index 0000000..3973926 --- /dev/null +++ b/apps/bridge-frontend/app/(main)/[...segment]/@create/page.tsx @@ -0,0 +1,11 @@ +import { Create } from "@link-stack/bridge-ui"; + +type PageProps = { + params: { segment: string[] }; +}; + +export default function Page({ params: { segment } }: PageProps) { + 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 new file mode 100644 index 0000000..0b1f49c --- /dev/null +++ b/apps/bridge-frontend/app/(main)/[...segment]/@detail/page.tsx @@ -0,0 +1,27 @@ +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, Detail } from "@link-stack/bridge-ui"; + +type Props = { + params: { segment: string[] }; +}; + +export default async function Page({ params: { segment } }: Props) { + const service = segment[0]; + const id = segment?.[1]; + + if (!id) return null; + + const { + [service]: { table }, + } = serviceConfig; + + const row = await db + .selectFrom(table) + .selectAll() + .where("id", "=", id) + .executeTakeFirst(); + + if (!row) return null; + + return ; +} diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx new file mode 100644 index 0000000..59977eb --- /dev/null +++ b/apps/bridge-frontend/app/(main)/[...segment]/@edit/page.tsx @@ -0,0 +1,27 @@ +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, Edit } from "@link-stack/bridge-ui"; + +type PageProps = { + params: { segment: string[] }; +}; + +export default async function Page({ params: { segment } }: PageProps) { + const service = segment[0]; + const id = segment?.[1]; + + if (!id) return null; + + const { + [service]: { table }, + } = serviceConfig; + + const row = await db + .selectFrom(table) + .selectAll() + .where("id", "=", id) + .executeTakeFirst(); + + if (!row) return null; + + return ; +} diff --git a/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx b/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx new file mode 100644 index 0000000..c360a57 --- /dev/null +++ b/apps/bridge-frontend/app/(main)/[...segment]/layout.tsx @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..e248a86 --- /dev/null +++ b/apps/bridge-frontend/app/(main)/[...segment]/page.tsx @@ -0,0 +1,22 @@ +import { db } from "@link-stack/bridge-common"; +import { serviceConfig, List } from "@link-stack/bridge-ui"; + +type PageProps = { + params: { + segment: string[]; + }; +}; + +export default async function Page({ params: { segment } }: PageProps) { + const service = segment[0]; + + if (!service) return null; + + const config = serviceConfig[service]; + + if (!config) return null; + + const rows = await db.selectFrom(config.table).selectAll().execute(); + + return ; +} diff --git a/apps/bridge-frontend/app/(main)/layout.tsx b/apps/bridge-frontend/app/(main)/layout.tsx new file mode 100644 index 0000000..32203a2 --- /dev/null +++ b/apps/bridge-frontend/app/(main)/layout.tsx @@ -0,0 +1,9 @@ +import { InternalLayout } from "@/app/_components/InternalLayout"; + +export default function Layout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return {children}; +} diff --git a/apps/bridge-frontend/app/(main)/page.tsx b/apps/bridge-frontend/app/(main)/page.tsx new file mode 100644 index 0000000..e01be47 --- /dev/null +++ b/apps/bridge-frontend/app/(main)/page.tsx @@ -0,0 +1,5 @@ +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 new file mode 100644 index 0000000..fcce6f2 --- /dev/null +++ b/apps/bridge-frontend/app/_components/InternalLayout.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { FC, PropsWithChildren, useState } from "react"; +import { Grid } from "@mui/material"; +import { CssBaseline } from "@mui/material"; +import { SessionProvider } from "next-auth/react"; +import { css, Global } from "@emotion/react"; +import { fonts } from "@link-stack/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} + + + + ); +}; diff --git a/apps/bridge-frontend/app/_components/Login.tsx b/apps/bridge-frontend/app/_components/Login.tsx new file mode 100644 index 0000000..8e40129 --- /dev/null +++ b/apps/bridge-frontend/app/_components/Login.tsx @@ -0,0 +1,185 @@ +"use client"; + +import { FC, useState } from "react"; +import { + Box, + Grid, + Container, + IconButton, + Typography, + TextField, +} from "@mui/material"; +import { + Apple as AppleIcon, + Google as GoogleIcon, + Key as KeyIcon, +} from "@mui/icons-material"; +import { signIn } from "next-auth/react"; +import Image from "next/image"; +import LinkLogo from "@/app/_images/link-logo-small.png"; +import { colors, fonts } from "@link-stack/ui"; +import { useSearchParams } from "next/navigation"; + +type LoginProps = { + session: any; +}; + +export const Login: FC = ({ session }) => { + const origin = + typeof window !== "undefined" && window.location.origin + ? window.location.origin + : ""; + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const params = useSearchParams(); + const error = params.get("error"); + const { darkGray, cdrLinkOrange, white } = colors; + const { poppins } = fonts; + const buttonStyles = { + borderRadius: 500, + width: "100%", + fontSize: "16px", + fontWeight: "bold", + backgroundColor: white, + "&:hover": { + color: white, + backgroundColor: cdrLinkOrange, + }, + }; + const fieldStyles = { + "& label.Mui-focused": { + color: cdrLinkOrange, + }, + "& .MuiInput-underline:after": { + borderBottomColor: cdrLinkOrange, + }, + "& .MuiFilledInput-underline:after": { + borderBottomColor: cdrLinkOrange, + }, + "& .MuiOutlinedInput-root": { + "&.Mui-focused fieldset": { + borderColor: cdrLinkOrange, + }, + }, + }; + + return ( + + + + + + + Link logo + + + + + CDR Bridge + + + + + + {!session ? ( + + + {error ? ( + + + + {`${error} error`} + + + + ) : null} + + + signIn("google", { + callbackUrl: `${origin}`, + }) + } + > + + Sign in with Google + + + + + signIn("apple", { + callbackUrl: `${window.location.origin}`, + }) + } + > + + Sign in with Apple + + + + + ) : null} + {session ? ( + + {` ${session.user.name ?? session.user.email}.`} + + ) : null} + + + + + ); +}; diff --git a/apps/bridge-frontend/app/_components/Sidebar.tsx b/apps/bridge-frontend/app/_components/Sidebar.tsx new file mode 100644 index 0000000..31aaaaa --- /dev/null +++ b/apps/bridge-frontend/app/_components/Sidebar.tsx @@ -0,0 +1,399 @@ +"use client"; + +import { FC } from "react"; +import { + Box, + Grid, + Typography, + List, + ListItemButton, + ListItemIcon, + ListItemText, + ListItemSecondaryAction, + Drawer, +} from "@mui/material"; +import { + ExpandCircleDown as ExpandCircleDownIcon, + AccountCircle as AccountCircleIcon, + Chat as ChatIcon, + PermPhoneMsg as PhoneIcon, + 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, Button } from "@link-stack/ui"; +import LinkLogo from "@/app/_images/link-logo-small.png"; +import { useSession, signOut } from "next-auth/react"; + +const openWidth = 270; +const closedWidth = 70; + +const MenuItem = ({ + name, + href, + Icon, + iconSize, + inset = false, + selected = false, + open = true, + badge, + target = "_self", +}: any) => ( + + + {iconSize > 0 ? ( + + + + + + ) : ( + + + + + )} + {open && ( + + {name} + + } + /> + )} + {badge && badge > 0 ? ( + + + {badge} + + + ) : null} + + +); + +interface SidebarProps { + open: boolean; + setOpen: (open: boolean) => void; +} + +export const Sidebar: FC = ({ open, setOpen }) => { + const pathname = usePathname(); + const { poppins } = fonts; + const { bodyLarge } = typography; + const { data: session } = useSession(); + const user = session?.user; + + const logout = () => { + signOut({ callbackUrl: "/login" }); + }; + + return ( + + { + setOpen!(!open); + }} + > + + + + + + + Link logo + + . + + {open && ( + + + CDR Bridge + + + )} + + + + + + + + + + + + + + + + {user?.image && ( + + + Profile image + + + )} + + + + {user?.email} + + + +