diff --git a/.github/workflows/frontend-dev.yaml b/.github/workflows/frontend-dev.yaml index 2b39740..4854337 100644 --- a/.github/workflows/frontend-dev.yaml +++ b/.github/workflows/frontend-dev.yaml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Build Docker image - run: docker build -f frontend/Dockerfile -t ${{ env.DOCKER_TAGS }} . + run: docker build --build-arg VITE_DEPLOYMENT_ENV=dev -f frontend/Dockerfile -t ${{ env.DOCKER_TAGS }} . deploy: name: Deploy Frontend to DEV @@ -54,6 +54,8 @@ jobs: push: true tags: ${{ env.DOCKER_TAGS }} platforms: linux/arm64 + build-args: | + VITE_DEPLOYMENT_ENV=dev - name: Install cloudflared run: | diff --git a/.github/workflows/frontend-prd.yaml b/.github/workflows/frontend-prd.yaml index 53b4753..8327de0 100644 --- a/.github/workflows/frontend-prd.yaml +++ b/.github/workflows/frontend-prd.yaml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Build Docker image - run: docker build -f frontend/Dockerfile -t ${{ env.DOCKER_TAGS }} . + run: docker build --build-arg VITE_DEPLOYMENT_ENV=prd -f frontend/Dockerfile -t ${{ env.DOCKER_TAGS }} . deploy: name: Deploy Frontend to PRD @@ -54,6 +54,8 @@ jobs: push: true tags: ${{ env.DOCKER_TAGS }} platforms: linux/arm64 + build-args: | + VITE_DEPLOYMENT_ENV=prd - name: Install cloudflared run: | diff --git a/frontend/Dockerfile b/frontend/Dockerfile index fb119a4..1ebabdb 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -6,6 +6,8 @@ COPY frontend/ . COPY shared/ /app/shared/ ARG VITE_API_BASE_URL=/api ENV VITE_API_BASE_URL=$VITE_API_BASE_URL +ARG VITE_DEPLOYMENT_ENV +ENV VITE_DEPLOYMENT_ENV=$VITE_DEPLOYMENT_ENV RUN npm run build FROM nginx:alpine diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index cb56bb1..4756a17 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -6,13 +6,14 @@ import { ChallengesTable } from './components/ChallengesTable'; import { BridgesTable } from './components/BridgesTable'; import { MintersTable } from './components/MintersTable'; import { HealthStatus } from './components/HealthStatus'; +import { Footer } from './components/Footer'; function App() { const { health, jusd, positions, collateral, challenges, minters } = useApi(); return ( -
-
+
+
@@ -21,6 +22,7 @@ function App() {
+
); } diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx new file mode 100644 index 0000000..f7208bd --- /dev/null +++ b/frontend/src/components/Footer.tsx @@ -0,0 +1,36 @@ +import { DEPLOYMENT_ENV, resolveChain, TELEGRAM_BOT } from '../constants'; + +export function Footer() { + const botUrl = TELEGRAM_BOT[resolveChain()][DEPLOYMENT_ENV]; + + return ( + + ); +} + +function TelegramIcon({ className = '' }: { className?: string }) { + return ( + + ); +} diff --git a/frontend/src/constants.ts b/frontend/src/constants.ts new file mode 100644 index 0000000..aca41c6 --- /dev/null +++ b/frontend/src/constants.ts @@ -0,0 +1,26 @@ +export type DeploymentEnv = 'prd' | 'dev'; +export type Chain = 'mainnet' | 'testnet'; + +const rawDeploymentEnv = import.meta.env.VITE_DEPLOYMENT_ENV; +if (rawDeploymentEnv !== 'prd' && rawDeploymentEnv !== 'dev') { + throw new Error(`VITE_DEPLOYMENT_ENV must be "prd" or "dev" (got: "${rawDeploymentEnv}")`); +} +export const DEPLOYMENT_ENV: DeploymentEnv = rawDeploymentEnv; + +export const TELEGRAM_BOT = { + mainnet: { + prd: 'https://t.me/juicedollar_monitor_prd_bot', + dev: 'https://t.me/juicedollar_monitor_dev_bot', + }, + testnet: { + prd: 'https://t.me/juicedollar_monitor_tst_prd_bot', + dev: 'https://t.me/juicedollar_monitor_tst_dev_bot', + }, +} as const; + +export function resolveChain(): Chain { + if (typeof window === 'undefined') { + throw new Error('resolveChain() requires window.location'); + } + return window.location.hostname.includes('testnet') ? 'testnet' : 'mainnet'; +} diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts index 11f02fe..5565f7b 100644 --- a/frontend/src/vite-env.d.ts +++ b/frontend/src/vite-env.d.ts @@ -1 +1,10 @@ /// + +interface ImportMetaEnv { + readonly VITE_API_BASE_URL?: string; + readonly VITE_DEPLOYMENT_ENV?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +}