diff --git a/.env b/.env index e1557044..d722fed5 100644 --- a/.env +++ b/.env @@ -10,10 +10,12 @@ NEXT_PUBLIC_REGION=Germany NEXT_PUBLIC_PLATFORM_UI_ROOT= ######### Ego -NEXT_PUBLIC_EGO_API_ROOT=http://localhost:8081 -EGO_CLIENT_ID=rdpc-ui-local -EGO_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0lOqMuPLCVusc6szklNXQL1FHhSkEgR7An+8BllBqTsRHM4bRYosseGFCbYPn8r8FsWuMDtxp0CwTyMQR2PCbJ740DdpbE1KC6jAfZxqcBete7gP0tooJtbvnA6X4vNpG4ukhtUoN9DzNOO0eqMU0Rgyy5HjERdYEWkwTNB30i9I+nHFOSj4MGLBSxNlnuo3keeomCRgtimCx+L/K3HNo0QHTG1J7RzLVAchfQT0lu3pUJ8kB+UM6/6NG+fVyysJyRZ9gadsr4gvHHckw8oUBp2tHvqBEkEdY+rt1Mf5jppt7JUV7HAPLB/qR5jhALY2FX/8MN+lPLmb/nLQQichVQIDAQAB\n-----END PUBLIC KEY-----" +NEXT_PUBLIC_EGO_API_ROOT= +NEXT_PUBLIC_EGO_CLIENT_ID= +NEXT_PUBLIC_EGO_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0lOqMuPLCVusc6szklNXQL1FHhSkEgR7An+8BllBqTsRHM4bRYosseGFCbYPn8r8FsWuMDtxp0CwTyMQR2PCbJ740DdpbE1KC6jAfZxqcBete7gP0tooJtbvnA6X4vNpG4ukhtUoN9DzNOO0eqMU0Rgyy5HjERdYEWkwTNB30i9I+nHFOSj4MGLBSxNlnuo3keeomCRgtimCx+L/K3HNo0QHTG1J7RzLVAchfQT0lu3pUJ8kB+UM6/6NG+fVyysJyRZ9gadsr4gvHHckw8oUBp2tHvqBEkEdY+rt1Mf5jppt7JUV7HAPLB/qR5jhALY2FX/8MN+lPLmb/nLQQichVQIDAQAB\n-----END PUBLIC KEY-----" # Recaptcha NEXT_PUBLIC_RECAPTCHA_SITE_KEY= + +NEXT_PUBLIC_RUNTIME_CONFIG_URL=http://localhost:3000/api/config diff --git a/Dockerfile b/Dockerfile index e4095c0d..89405701 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18.2.0-alpine +FROM node:18.17-alpine3.17 ENV APP_UID=9999 ENV APP_GID=9999 @@ -12,7 +12,7 @@ WORKDIR /appDir COPY . . RUN npm ci -RUN npx next build +RUN npm run build EXPOSE 3000 -CMD ["npx", "next", "start", "--", "-p", "3000"] +CMD ["npm", "run", "start", "--", "-p", "3000"] diff --git a/README.md b/README.md index 193e4cb2..dc0d70ea 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,13 @@ This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-opti ## Env vars +Hosting environments that use runtime variables need to be able to send public client env vars to the client. +To do this we create an api route which provides a config `/src/app/api/config/config.ts` +This creates a config object based on a priority of `server process vals` , then `client build time vals` and finally a hardcoded default. + +In our UI we provide values via a context provider `AppConfigProvider`. This means that accessing app config variables needs to be done in a "react way" - using context and hooks correctly. Importing from a regular function in a module does not work. + +Build time variables are inlined and "frozen" at build time. They are explained here: https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables ## Local dev diff --git a/package-lock.json b/package-lock.json index b616d328..c844be42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rdpc-ui", - "version": "0.4.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rdpc-ui", - "version": "0.4.0", + "version": "0.5.0", "dependencies": { "@hookform/resolvers": "^3.1.1", "@icgc-argo/ego-token-utils": "^8.2.0", @@ -14,7 +14,7 @@ "@types/url-join": "^4.0.1", "js-cookie": "^3.0.5", "lodash": "^4.17.21", - "next": "^13.4.4", + "next": "^13.4.12", "react": "18.2.0", "react-dom": "18.2.0", "react-google-recaptcha": "^3.1.0", @@ -451,8 +451,9 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, "node_modules/@next/env": { - "version": "13.4.4", - "license": "MIT" + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.12.tgz", + "integrity": "sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.4.3", @@ -463,11 +464,12 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.4", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.12.tgz", + "integrity": "sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -477,9 +479,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.12.tgz", + "integrity": "sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==", "cpu": [ "x64" ], @@ -492,9 +494,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.12.tgz", + "integrity": "sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==", "cpu": [ "arm64" ], @@ -507,9 +509,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.12.tgz", + "integrity": "sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==", "cpu": [ "arm64" ], @@ -522,9 +524,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.12.tgz", + "integrity": "sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==", "cpu": [ "x64" ], @@ -537,9 +539,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.12.tgz", + "integrity": "sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==", "cpu": [ "x64" ], @@ -552,9 +554,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.12.tgz", + "integrity": "sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==", "cpu": [ "arm64" ], @@ -567,9 +569,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.12.tgz", + "integrity": "sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==", "cpu": [ "ia32" ], @@ -582,9 +584,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.12.tgz", + "integrity": "sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==", "cpu": [ "x64" ], @@ -2987,6 +2989,11 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -3052,8 +3059,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -4390,16 +4396,17 @@ "dev": true }, "node_modules/next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.12.tgz", + "integrity": "sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==", "dependencies": { - "@next/env": "13.4.4", + "@next/env": "13.4.12", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", + "watchpack": "2.4.0", "zod": "3.21.4" }, "bin": { @@ -4409,15 +4416,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4" + "@next/swc-darwin-arm64": "13.4.12", + "@next/swc-darwin-x64": "13.4.12", + "@next/swc-linux-arm64-gnu": "13.4.12", + "@next/swc-linux-arm64-musl": "13.4.12", + "@next/swc-linux-x64-gnu": "13.4.12", + "@next/swc-linux-x64-musl": "13.4.12", + "@next/swc-win32-arm64-msvc": "13.4.12", + "@next/swc-win32-ia32-msvc": "13.4.12", + "@next/swc-win32-x64-msvc": "13.4.12" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -6211,6 +6218,18 @@ "xml-name-validator": "^3.0.0" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", diff --git a/package.json b/package.json index cc290082..f774e0c5 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "rdpc-ui", - "version": "0.4.0", + "version": "0.5.0", "private": true, "scripts": { "dev": "next dev", - "build": "next build", + "build": "NEXT_IS_BUILDING=true next build", "start": "next start", "lint": "next lint", "prepare": "husky install", @@ -17,7 +17,7 @@ "@types/url-join": "^4.0.1", "js-cookie": "^3.0.5", "lodash": "^4.17.21", - "next": "^13.4.4", + "next": "^13.4.12", "react": "18.2.0", "react-dom": "18.2.0", "react-google-recaptcha": "^3.1.0", diff --git a/src/app/App.tsx b/src/app/App.tsx new file mode 100644 index 00000000..0796ae36 --- /dev/null +++ b/src/app/App.tsx @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of + * the GNU Affero General Public License v3.0. You should have received a copy of the + * GNU Affero General Public License along with this program. + * If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +// all our context providers won't work server side, beacuse React.Context is client side +'use client'; + +import { AuthProvider } from '@/global/utils/auth'; +import { css } from '@/lib/emotion'; +import { ReactNode } from 'react'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { AppConfigProvider } from './components/ConfigProvider'; +import Footer from './components/Footer'; +import Header from './components/Header'; +import ThemeProvider from './components/ThemeProvider'; + +const queryClient = new QueryClient(); + +const App = ({ children, config }: { children: ReactNode; config: any }) => ( + + + + +
+
+ {children} +
+
+
+
+
+
+); + +export default App; diff --git a/src/app/api/config/config.ts b/src/app/api/config/config.ts new file mode 100644 index 00000000..5d8ef27a --- /dev/null +++ b/src/app/api/config/config.ts @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of + * the GNU Affero General Public License v3.0. You should have received a copy of the + * GNU Affero General Public License along with this program. + * If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import urljoin from 'url-join'; +import packageJSON from '../../../../package.json'; + +export type AppConfig = { + DOCS_URL_ROOT: string; + EGO_API_ROOT: string; + EGO_CLIENT_ID: string; + EGO_PUBLIC_KEY: string; + REGION: string; + UI_VERSION: string; + PLATFORM_UI_ROOT: string; + RECAPTCHA_SITE_KEY: string; + ARGO_ROOT: string; + EGO_LOGIN_URL: string; + DACO_ROOT: string; +}; + +/** + * returns app config env vars + * order of priority: server runtime > process.env build time > default + */ +export const getAppConfig = (serverEnv: any): AppConfig => { + /** + * keep explicit style of: Server || Client to prevent errors with Next inlining build variables + */ + + const EGO_API_ROOT = + serverEnv.NEXT_PUBLIC_EGO_API_ROOT || + process.env.NEXT_PUBLIC_EGO_API_ROOT || + 'http://localhost:8081'; + const EGO_CLIENT_ID = + serverEnv.NEXT_PUBLIC_EGO_CLIENT_ID || process.env.NEXT_PUBLIC_EGO_CLIENT_ID || 'rdpc-ui-local'; + const EGO_LOGIN_URL = urljoin( + EGO_API_ROOT, + '/api/oauth/login/google', + `?client_id=${EGO_CLIENT_ID}`, + ); + + const config = { + DOCS_URL_ROOT: + serverEnv.NEXT_PUBLIC_DOCS_URL_ROOT || + process.env.NEXT_PUBLIC_DOCS_URL_ROOT || + 'https://docs.icgc-argo.org/', + EGO_PUBLIC_KEY: + serverEnv.NEXT_PUBLIC_EGO_PUBLIC_KEY || process.env.NEXT_PUBLIC_EGO_PUBLIC_KEY || '', + UI_VERSION: packageJSON.version, + REGION: serverEnv.NEXT_PUBLIC_REGION || process.env.NEXT_PUBLIC_REGION || '', + PLATFORM_UI_ROOT: + serverEnv.NEXT_PUBLIC_PLATFORM_UI_ROOT || process.env.NEXT_PUBLIC_PLATFORM_UI_ROOT || '', + RECAPTCHA_SITE_KEY: + serverEnv.RECAPTCHA_SITE_KEY || process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY || '', + ARGO_ROOT: serverEnv.ARGO_ROOT || process.env.ARGO_ROOT || 'https://www.icgc-argo.org', + EGO_API_ROOT, + EGO_CLIENT_ID, + EGO_LOGIN_URL, + DACO_ROOT: serverEnv.DACO_ROOT || process.env.DACO_ROOT || 'https://daco.icgc-argo.org/', + }; + + return config; +}; diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts new file mode 100644 index 00000000..d8736dcd --- /dev/null +++ b/src/app/api/config/route.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of + * the GNU Affero General Public License v3.0. You should have received a copy of the + * GNU Affero General Public License along with this program. + * If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { headers } from 'next/headers'; +import { NextResponse } from 'next/server'; +import { getAppConfig } from './config'; + +export async function GET() { + headers(); + const appConfig = getAppConfig(process.env); + + return NextResponse.json(appConfig); +} diff --git a/src/global/config.ts b/src/app/components/ConfigProvider.tsx similarity index 58% rename from src/global/config.ts rename to src/app/components/ConfigProvider.tsx index a0280e4a..713b4fbb 100644 --- a/src/global/config.ts +++ b/src/app/components/ConfigProvider.tsx @@ -17,28 +17,32 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import packageJSON from '../../package.json'; +'use client'; -type AppConfig = { - DOCS_URL_ROOT: string; - EGO_API_ROOT: string; - EGO_CLIENT_ID: string; - EGO_PUBLIC_KEY: string; - REGION: string; - UI_VERSION: string; - PLATFORM_UI_ROOT: string; - RECAPTCHA_SITE_KEY: string; +import { ReactNode, createContext, useContext } from 'react'; +import { AppConfig } from '../api/config/config'; + +const defaultContext = { + DOCS_URL_ROOT: '', + EGO_API_ROOT: '', + EGO_CLIENT_ID: '', + EGO_PUBLIC_KEY: '', + UI_VERSION: '', + REGION: '', + PLATFORM_UI_ROOT: '', + RECAPTCHA_SITE_KEY: '', + ARGO_ROOT: '', + EGO_LOGIN_URL: '', + DACO_ROOT: '', +}; + +const AppConfig = createContext(defaultContext); + +export const AppConfigProvider = ({ children, config }: { children: ReactNode; config: any }) => { + return {children}; }; -export const getAppConfig = (): AppConfig => { - return { - DOCS_URL_ROOT: process.env.NEXT_PUBLIC_DOCS_URL_ROOT || 'https://docs.icgc-argo.org/', - EGO_API_ROOT: process.env.NEXT_PUBLIC_EGO_API_ROOT || 'http://localhost:8081', - EGO_CLIENT_ID: process.env.EGO_CLIENT_ID || 'rdpc-ui-local', - EGO_PUBLIC_KEY: process.env.EGO_PUBLIC_KEY || '', - UI_VERSION: packageJSON.version, - REGION: process.env.NEXT_PUBLIC_REGION || '', - PLATFORM_UI_ROOT: process.env.NEXT_PUBLIC_PLATFORM_UI_ROOT || '', - RECAPTCHA_SITE_KEY: process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY || '', - }; +export const useAppConfigContext = () => { + const currentContext = useContext(AppConfig); + return process.env.NEXT_IS_BUILDING === 'true' ? defaultContext : currentContext; }; diff --git a/src/app/components/Footer.tsx b/src/app/components/Footer.tsx index 33d31af9..e77171b8 100644 --- a/src/app/components/Footer.tsx +++ b/src/app/components/Footer.tsx @@ -17,52 +17,60 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import { getAppConfig } from '@/global/config'; -import * as urls from '@/global/urls'; import { css, useTheme } from '@/lib/emotion'; import { Icon, Link } from '@icgc-argo/uikit'; import Image from 'next/image'; import { Col, Row } from 'react-grid-system'; +import urljoin from 'url-join'; +import { useAppConfigContext } from './ConfigProvider'; import rdpcLogo from '/public/assets/rdpc-logo.svg'; -const { UI_VERSION, REGION } = getAppConfig(); -const subtitle = `RDPC ${REGION} Clinical Data Submission Portal - ${UI_VERSION}`; - const Logo = () => RDPC logo; -const links = [ - { - displayName: 'Contact', - href: '/contact', - }, - { - displayName: 'Documentation', - href: urls.DOCS_URL_ROOT, - target: '_blank', - }, - { - displayName: 'The Team', - href: '', - }, - { - displayName: 'Privacy Policy', - href: urls.ARGO_PRIVACY_PAGE, - target: '_blank', - }, - { - displayName: 'Terms & Conditions', - href: urls.ARGO_TERMS_PAGE, - target: '_blank', - }, - { - displayName: 'Publication Policy', - href: urls.ARGO_PUBLICATION_PAGE, - target: '_blank', - }, -]; +const getNavLinks = (docsUrl: string, argoRootUrl: string) => { + const privacyUrl = urljoin(argoRootUrl, '/page/2/privacy'); + const termsUrl = urljoin(argoRootUrl, '/page/1/terms-and-conditions'); + const publicationUrl = urljoin(argoRootUrl, '/page/77/e3-publication-policy'); + + return [ + { + displayName: 'Contact', + href: '/contact', + }, + { + displayName: 'Documentation', + href: docsUrl, + target: '_blank', + }, + { + displayName: 'The Team', + href: '', + }, + { + displayName: 'Privacy Policy', + href: privacyUrl, + target: '_blank', + }, + { + displayName: 'Terms & Conditions', + href: termsUrl, + target: '_blank', + }, + { + displayName: 'Publication Policy', + href: publicationUrl, + target: '_blank', + }, + ]; +}; export default function Footer() { const theme = useTheme(); + const { UI_VERSION, REGION, DOCS_URL_ROOT, ARGO_ROOT } = useAppConfigContext(); + + const subtitle = `RDPC ${REGION} Clinical Data Submission Portal - ${UI_VERSION}`; + const navLinks = getNavLinks(DOCS_URL_ROOT, ARGO_ROOT); + return (