diff --git a/app/layout.tsx b/app/layout.tsx index bfc3470..9350629 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,6 +5,7 @@ import 'yet-another-react-lightbox/styles.css' import 'yet-another-react-lightbox/plugins/thumbnails.css' import 'yet-another-react-lightbox/plugins/captions.css' import { ToastContainer } from 'react-toastify' +import { PublicEnvScript } from 'next-runtime-env'; import { Shell } from '@/shell/Shell' import { CommandPaletteRoot } from '@/shell/CommandPalette/Root' @@ -36,6 +37,7 @@ export default function RootLayout({ isDarkModeEnabled() ? 'dark' : '' }`} > + <head> <title>Ozone</title> <link rel="icon" @@ -43,6 +45,8 @@ export default function RootLayout({ sizes="any" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> + <PublicEnvScript /> + </head> <body className="h-full overflow-hidden"> <ToastContainer position="bottom-right" diff --git a/environment.d.ts b/environment.d.ts index 7a47cc2..33ab29f 100644 --- a/environment.d.ts +++ b/environment.d.ts @@ -9,6 +9,8 @@ declare global { NEXT_PUBLIC_OZONE_SERVICE_DID?: string // e.g. did:plc:xxx#atproto_labeler NEXT_PUBLIC_OZONE_PUBLIC_URL?: string // e.g. https://ozone.example.com (falls back to window.location.origin) NEXT_PUBLIC_SOCIAL_APP_URL?: string // e.g. https://bsky.app + NEXT_PUBLIC_SOCIAL_APP_DOMAIN?: string // e.g. bsky.app + NEXT_PUBLIC_HANDLE_RESOLVER_URL?: string // e.g. https://api.bsky.app } } } diff --git a/lib/constants.ts b/lib/constants.ts index fe7c0e8..c286ac6 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -1,29 +1,32 @@ +import { env } from 'next-runtime-env'; + export const OAUTH_SCOPE = 'atproto transition:generic' export const OZONE_SERVICE_DID = - process.env.NEXT_PUBLIC_OZONE_SERVICE_DID || undefined + env('NEXT_PUBLIC_OZONE_SERVICE_DID') || undefined export const OZONE_PUBLIC_URL = - process.env.NEXT_PUBLIC_OZONE_PUBLIC_URL || undefined + env('NEXT_PUBLIC_OZONE_PUBLIC_URL') || undefined export const PLC_DIRECTORY_URL = - process.env.NEXT_PUBLIC_PLC_DIRECTORY_URL || + env('NEXT_PUBLIC_PLC_DIRECTORY_URL') || (process.env.NODE_ENV === 'development' ? 'http://localhost:2582' : 'https://plc.directory') -export const QUEUE_CONFIG = process.env.NEXT_PUBLIC_QUEUE_CONFIG || '{}' +export const QUEUE_CONFIG = env('NEXT_PUBLIC_QUEUE_CONFIG') || '{}' -export const QUEUE_SEED = process.env.NEXT_PUBLIC_QUEUE_SEED || '' +export const QUEUE_SEED = env('NEXT_PUBLIC_QUEUE_SEED') || '' +export const SOCIAL_APP_DOMAIN = env('NEXT_PUBLIC_SOCIAL_APP_DOMAIN') || 'bsky.app' export const SOCIAL_APP_URL = - process.env.NEXT_PUBLIC_SOCIAL_APP_URL || + env('NEXT_PUBLIC_SOCIAL_APP_URL') || (process.env.NODE_ENV === 'development' ? 'http://localhost:2584' - : 'https://bsky.app') + : `https://${SOCIAL_APP_DOMAIN}`) export const HANDLE_RESOLVER_URL = - process.env.NEXT_PUBLIC_HANDLE_RESOLVER_URL || + env('NEXT_PUBLIC_HANDLE_RESOLVER_URL') || (process.env.NODE_ENV === 'development' ? 'http://localhost:2584' : 'https://api.bsky.app') diff --git a/lib/util.ts b/lib/util.ts index 0aa4460..ecec7d1 100644 --- a/lib/util.ts +++ b/lib/util.ts @@ -1,5 +1,5 @@ import { CollectionId } from '@/reports/helpers/subject' -import { SOCIAL_APP_URL } from './constants' +import { SOCIAL_APP_URL, SOCIAL_APP_DOMAIN } from './constants' import { AtUri } from '@atproto/api' export function classNames(...classes: (string | undefined)[]) { @@ -57,7 +57,7 @@ export function takesKeyboardEvt(el?: EventTarget | null) { ) } -const blueSkyUrlMatcher = new RegExp('(https?://)?.*bsky.app') +const blueSkyUrlMatcher = new RegExp('(https?://)?.*'+ `${SOCIAL_APP_DOMAIN}`) export const isBlueSkyAppUrl = (url: string) => blueSkyUrlMatcher.test(url) diff --git a/package.json b/package.json index 8919841..750dce9 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "kbar": "^0.1.0-beta.45", "lande": "^1.0.10", "next": "15.2.4", + "next-runtime-env": "^3.2.1", "react": "19.1.0", "react-dom": "19.1.0", "react-dropzone": "^14.3.5",