diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts index 4e5a01d6a..184cdf6e3 100644 --- a/apps/web/playwright.config.ts +++ b/apps/web/playwright.config.ts @@ -12,6 +12,8 @@ const PORT = process.env.PORT || 3000; // Set webServer.url and use.baseURL with the location of the WebServer respecting the correct set port const baseURL = `http://localhost:${PORT}`; +process.env.NEXT_PUBLIC_BASE_URL = baseURL; + // Reference: https://playwright.dev/docs/test-configuration const config: PlaywrightTestConfig = { // Artifacts folder where screenshots, videos, and traces are stored. diff --git a/apps/web/src/components/invite-dialog.tsx b/apps/web/src/components/invite-dialog.tsx index 25a9a6420..789d34446 100644 --- a/apps/web/src/components/invite-dialog.tsx +++ b/apps/web/src/components/invite-dialog.tsx @@ -8,6 +8,7 @@ import { DialogTitle, DialogTrigger, } from "@rallly/ui/dialog"; +import { shortUrl } from "@rallly/utils"; import Link from "next/link"; import React from "react"; import { useCopyToClipboard } from "react-use"; @@ -29,7 +30,7 @@ export const InviteDialog = () => { } }, [state]); - const inviteLink = `${window.location.origin}/invite/${poll?.id}`; + const inviteLink = shortUrl(`/invite/${poll?.id}`); const [didCopy, setDidCopy] = React.useState(false); return ( diff --git a/packages/backend/trpc/routers/polls.ts b/packages/backend/trpc/routers/polls.ts index 3cbd59afe..5cdc146b2 100644 --- a/packages/backend/trpc/routers/polls.ts +++ b/packages/backend/trpc/routers/polls.ts @@ -1,6 +1,6 @@ import { prisma } from "@rallly/database"; import { sendEmail } from "@rallly/emails"; -import { absoluteUrl } from "@rallly/utils"; +import { absoluteUrl, shortUrl } from "@rallly/utils"; import { TRPCError } from "@trpc/server"; import dayjs from "dayjs"; import timezone from "dayjs/plugin/timezone"; @@ -140,7 +140,7 @@ export const polls = router({ ? absoluteUrl(`/admin/${adminToken}`) : absoluteUrl(`/poll/${pollId}`); - const participantLink = absoluteUrl(`/invite/${pollId}`); + const participantLink = shortUrl(`/invite/${pollId}`); if (email && name) { await sendEmail("NewPollEmail", { diff --git a/packages/utils/src/absolute-url.ts b/packages/utils/src/absolute-url.ts index fba32a0a5..7b1b8a732 100644 --- a/packages/utils/src/absolute-url.ts +++ b/packages/utils/src/absolute-url.ts @@ -6,10 +6,17 @@ const getVercelUrl = () => { : null; }; -export function absoluteUrl(path = "") { +export function absoluteUrl(subpath = "") { const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? getVercelUrl() ?? `http://localhost:${port}`; - return `${baseUrl}${path}`; + const url = new URL(subpath, baseUrl); + return url.href; +} + +export function shortUrl(subpath = "") { + const baseUrl = process.env.NEXT_PUBLIC_SHORT_BASE_URL ?? absoluteUrl(); + const url = new URL(subpath, baseUrl); + return url.href; } diff --git a/turbo.json b/turbo.json index 147227f27..3bedea6c9 100644 --- a/turbo.json +++ b/turbo.json @@ -59,6 +59,7 @@ "EMAIL_PROVIDER", "MAINTENANCE_MODE", "NEXT_PUBLIC_APP_BASE_URL", + "NEXT_PUBLIC_SHORT_BASE_URL", "NEXT_PUBLIC_APP_VERSION", "NEXT_PUBLIC_BASE_URL", "NEXT_PUBLIC_BETA",