diff --git a/web/components/integration/github/select-repository.tsx b/web/components/integration/github/select-repository.tsx index 9857c0088..2c7822c98 100644 --- a/web/components/integration/github/select-repository.tsx +++ b/web/components/integration/github/select-repository.tsx @@ -4,6 +4,8 @@ import { useRouter } from "next/router"; import useSWRInfinite from "swr/infinite"; +import getConfig from "next/config"; + // services import projectService from "services/project.service"; // ui @@ -31,11 +33,13 @@ export const SelectRepository: React.FC = ({ const router = useRouter(); const { workspaceSlug } = router.query; + const { publicRuntimeConfig: { NEXT_PUBLIC_API_BASE_URL } } = getConfig(); + const getKey = (pageIndex: number) => { if (!workspaceSlug || !integration) return; return `${ - process.env.NEXT_PUBLIC_API_BASE_URL + NEXT_PUBLIC_API_BASE_URL }/api/workspaces/${workspaceSlug}/workspace-integrations/${ integration.id }/github-repositories/?page=${++pageIndex}`; diff --git a/web/components/project/publish-project/modal.tsx b/web/components/project/publish-project/modal.tsx index 173a5242c..b93b84f20 100644 --- a/web/components/project/publish-project/modal.tsx +++ b/web/components/project/publish-project/modal.tsx @@ -6,6 +6,7 @@ import { Controller, useForm } from "react-hook-form"; // headless ui import { Dialog, Transition } from "@headlessui/react"; // ui components +import getConfig from "next/config"; import { ToggleSwitch, PrimaryButton, @@ -63,9 +64,11 @@ export const PublishProjectModal: React.FC = observer(() => { const [isUnpublishing, setIsUnpublishing] = useState(false); const [isUpdateRequired, setIsUpdateRequired] = useState(false); - const plane_deploy_url = process.env.NEXT_PUBLIC_DEPLOY_URL ?? "http://localhost:4000"; + const { publicRuntimeConfig: { NEXT_PUBLIC_DEPLOY_URL } } = getConfig(); - const router = useRouter(); + const plane_deploy_url = NEXT_PUBLIC_DEPLOY_URL ?? "http://localhost:4000"; + + const router = useRouter() const { workspaceSlug } = router.query; const store: RootStore = useMobxStore(); diff --git a/web/layouts/app-layout/app-header.tsx b/web/layouts/app-layout/app-header.tsx index f2fbdc78c..b5c7509c2 100644 --- a/web/layouts/app-layout/app-header.tsx +++ b/web/layouts/app-layout/app-header.tsx @@ -8,6 +8,8 @@ import { Tooltip } from "components/ui"; // hooks import useProjectDetails from "hooks/use-project-details"; +import getConfig from "next/config"; + type Props = { breadcrumbs?: JSX.Element; left?: JSX.Element; @@ -16,7 +18,7 @@ type Props = { noHeader: boolean; }; -const { NEXT_PUBLIC_DEPLOY_URL } = process.env; +const { publicRuntimeConfig: { NEXT_PUBLIC_DEPLOY_URL } } = getConfig(); const plane_deploy_url = NEXT_PUBLIC_DEPLOY_URL ? NEXT_PUBLIC_DEPLOY_URL : "http://localhost:3001"; const Header: React.FC = ({ breadcrumbs, left, right, setToggleSidebar, noHeader }) => { diff --git a/web/lib/auth.ts b/web/lib/auth.ts index 47a52663d..504387f66 100644 --- a/web/lib/auth.ts +++ b/web/lib/auth.ts @@ -1,4 +1,5 @@ // cookies +import getConfig from "next/config"; import { convertCookieStringToObject } from "./cookie"; // types import type { IProjectMember, IUser, IWorkspace, IWorkspaceMember } from "types"; @@ -9,7 +10,9 @@ export const requiredAuth = async (cookie?: string) => { if (!token) return null; - const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; + const { publicRuntimeConfig: { NEXT_PUBLIC_API_BASE_URL } } = getConfig(); + + const baseUrl = NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; let user: IUser | null = null; @@ -41,7 +44,9 @@ export const requiredAdmin = async (workspaceSlug: string, projectId: string, co const cookies = convertCookieStringToObject(cookie); const token = cookies?.accessToken; - const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; + const { publicRuntimeConfig: { NEXT_PUBLIC_API_BASE_URL } } = getConfig(); + + const baseUrl = NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; let memberDetail: IProjectMember | null = null; @@ -75,7 +80,9 @@ export const requiredWorkspaceAdmin = async (workspaceSlug: string, cookie?: str const cookies = convertCookieStringToObject(cookie); const token = cookies?.accessToken; - const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; + const { publicRuntimeConfig: { NEXT_PUBLIC_API_BASE_URL } } = getConfig(); + + const baseUrl = NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; let memberDetail: IWorkspaceMember | null = null; @@ -119,7 +126,8 @@ export const homePageRedirect = async (cookie?: string) => { let workspaces: IWorkspace[] = []; - const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; + const { publicRuntimeConfig: { NEXT_PUBLIC_API_BASE_URL } } = getConfig(); + const baseUrl = NEXT_PUBLIC_API_BASE_URL || "https://api.plane.so"; const cookies = convertCookieStringToObject(cookie); const token = cookies?.accessToken; diff --git a/web/next.config.js b/web/next.config.js index b50066f86..250433a65 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -9,6 +9,10 @@ const extraImageDomains = (process.env.NEXT_PUBLIC_EXTRA_IMAGE_DOMAINS ?? "") const nextConfig = { reactStrictMode: false, swcMinify: true, + publicRuntimeConfig: { + NEXT_PUBLIC_DEPLOY_URL: process.env.NEXT_PUBLIC_DEPLOY_URL, + NEXT_PUBLIC_API_BASE_URL: process.env.NEXT_PUBLIC_API_BASE_URL + }, images: { domains: [ "vinci-web.s3.amazonaws.com", diff --git a/web/pages/_app.tsx b/web/pages/_app.tsx index 5ef047ca9..a8c90c051 100644 --- a/web/pages/_app.tsx +++ b/web/pages/_app.tsx @@ -2,6 +2,7 @@ import Head from "next/head"; import dynamic from "next/dynamic"; import Router from "next/router"; +import App, { AppContext, AppProps } from 'next/app' // themes import { ThemeProvider } from "next-themes"; @@ -20,8 +21,6 @@ import NProgress from "nprogress"; import { UserProvider } from "contexts/user.context"; import { ToastContextProvider } from "contexts/toast.context"; import { ThemeContextProvider } from "contexts/theme.context"; -// types -import type { AppProps } from "next/app"; // constants import { THEMES } from "constants/themes"; // constants @@ -45,6 +44,12 @@ Router.events.on("routeChangeStart", NProgress.start); Router.events.on("routeChangeError", NProgress.done); Router.events.on("routeChangeComplete", NProgress.done); +MyApp.getInitialProps = async (appContext: AppContext) => { + const appProps = await App.getInitialProps(appContext) + + return { ...appProps } +} + function MyApp({ Component, pageProps }: AppProps) { return ( // diff --git a/web/pages/index.tsx b/web/pages/index.tsx index dec63f9f4..0a59a802a 100644 --- a/web/pages/index.tsx +++ b/web/pages/index.tsx @@ -29,6 +29,7 @@ import { useMobxStore } from "lib/mobx/store-provider"; // next themes import { useTheme } from "next-themes"; import { IUser } from "types"; +import getConfig from "next/config"; // types type EmailPasswordFormValues = { @@ -41,6 +42,10 @@ const HomePage: NextPage = observer(() => { const store: any = useMobxStore(); const { setTheme } = useTheme(); + const { + publicRuntimeConfig: { PROJECT_API }, + } = getConfig() + const { isLoading, mutateUser } = useUserAuth("sign-in"); const { setToastAlert } = useToast(); @@ -176,7 +181,7 @@ const HomePage: NextPage = observer(() => { {parseInt(process.env.NEXT_PUBLIC_ENABLE_OAUTH || "0") ? ( <>

- Sign in to Plane + { `Sign in to ${PROJECT_API} Plane` }