Skip to content

Commit

Permalink
Join site configs for languages, add language to URL
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasdax98 committed Jul 11, 2024
1 parent 62c308b commit b44b43a
Show file tree
Hide file tree
Showing 11 changed files with 46 additions and 46 deletions.
5 changes: 4 additions & 1 deletion admin/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,10 @@ export function App() {
value={{
configs: config.sitesConfig,
resolveSiteConfigForScope: (configs, scope: ContentScope) => {
const siteConfig = configs.find((config) => config.contentScope.domain === scope.domain);
const siteConfig = configs.find((config) => {
return config.contentScope.domain === scope.domain && config.contentScope.language === scope.language;
});

if (!siteConfig) throw new Error(`siteConfig not found for domain ${scope.domain}`);
return {
url: siteConfig.url,
Expand Down
2 changes: 1 addition & 1 deletion admin/src/documents/pages/EditPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export const EditPage: React.FC<Props> = ({ id, category }) => {
startIcon={<Preview />}
disabled={!pageState}
onClick={() => {
openSitePreviewWindow(pageState.path, contentScopeMatch.url);
openSitePreviewWindow(`/${scope.language}${pageState.path}`, contentScopeMatch.url);
}}
color="info"
>
Expand Down
32 changes: 22 additions & 10 deletions site-configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import { SiteConfig } from "./site-configs.d";

// Types for files in site-configs/
type Environment = "local" | "dev" | "test" | "staging" | "prod";
export type Config = Omit<SiteConfig, "domains"> & {
export type Config = Omit<SiteConfig, "domains" | "contentScope"> & {
contentScope: {
domain: string;
languages: string[];
}
domains: {
preliminary?: string;
} & {
Expand All @@ -17,17 +21,25 @@ const getSiteConfigs = async (env: Environment): Promise<SiteConfig[]> => {

const files = (await fs.readdir(path)).filter((file) => !file.startsWith("_"));
const imports = (await Promise.all(files.map((file) => import(`${path}/${file}`)))) as { default: Config }[];
return imports.map((imprt, index) => {
return imports.flatMap((imprt, index) => {
const { domains, ...site } = imprt.default;
const languages = site.contentScope.languages

const ret: SiteConfig = {
...site,
domains: {
main: domains[env] ?? "",
preliminary: env === "prod" ? domains["preliminary"] : undefined,
},
preloginEnabled: env === "prod" ? site.preloginEnabled : true,
};
const ret = languages.map((language):SiteConfig => {
return {
...site,
name: `${site.name} ${language.toUpperCase()}`,
contentScope: {
domain: site.contentScope.domain,
language
},
domains: {
main: `${domains[env]}/${language}` ?? "",
preliminary: env === "prod" ? `${domains["preliminary"]}/${language}` : undefined,
},
preloginEnabled: env === "prod" ? site.preloginEnabled : true,
}
})

return ret;
});
Expand Down
12 changes: 0 additions & 12 deletions site-configs/main-en.ts

This file was deleted.

4 changes: 2 additions & 2 deletions site-configs/main-de.ts → site-configs/main.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Config } from "../site-configs";

export default {
name: "Starter Main DE",
name: "Starter Main",
contentScope: {
domain: "main",
language: "de",
languages: ["en", "de"],
},
domains: {
local: "localhost:3000",
Expand Down
12 changes: 0 additions & 12 deletions site-configs/secondary-en.ts

This file was deleted.

4 changes: 2 additions & 2 deletions site-configs/secondary-de.ts → site-configs/secondary.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Config } from "../site-configs";

export default {
name: "Starter Secondary DE",
name: "Starter Secondary",
contentScope: {
domain: "secondary",
language: "de",
languages: ["en", "de"],
},
domains: {
local: "secondary.localhost:3000",
Expand Down
File renamed without changes.
File renamed without changes.
5 changes: 3 additions & 2 deletions site/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ export type { SiteConfig };

export async function getSiteConfig() {
const host = getHost(headers());
const language = headers().get("x-current-language");
const domain = `${host}/${language}`;

let siteConfig = getSiteConfigs().find((siteConfig) => siteConfig.domains.main === host || siteConfig.domains.preliminary === host);

let siteConfig = getSiteConfigs().find((siteConfig) => siteConfig.domains.main === domain || siteConfig.domains.preliminary === domain);
if (!siteConfig) {
const preview = await previewParams();
if (preview && preview.scope) {
Expand Down
16 changes: 12 additions & 4 deletions site/src/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,32 @@ import { getSiteConfigs } from "./siteConfigs";
export async function middleware(request: NextRequest) {
const headers = request.headers;
const host = getHost(headers);
const { pathname } = new URL(request.url);
const language = pathname.split("/")?.[1] ?? "";

if (!language) {
return NextResponse.redirect(new URL("/en", request.url));
}
headers.set("x-current-language", language);

const domain = `${host}/${language}`;

// Site-Preview is handled in getSiteConfigs since draftMode() is not set yet in middleware (https://github.com/vercel/next.js/issues/52080)

// Redirect to Main Host
const siteConfig = getSiteConfigs().find((siteConfig) => siteConfig.domains.main === host || siteConfig.domains.preliminary === host);
const siteConfig = getSiteConfigs().find((siteConfig) => siteConfig.domains.main === domain || siteConfig.domains.preliminary === domain);
if (!siteConfig) {
const redirectSiteConfig = getSiteConfigs().find(
(siteConfig) =>
siteConfig.domains.additional?.includes(host) || (siteConfig.domains.pattern && host.match(new RegExp(siteConfig.domains.pattern))),
siteConfig.domains.additional?.includes(domain) ||
(siteConfig.domains.pattern && domain.match(new RegExp(siteConfig.domains.pattern))),
);
if (redirectSiteConfig) {
return NextResponse.redirect(redirectSiteConfig.url);
}
return; // Fallback for Site-Preview
}

const { pathname } = new URL(request.url);

const redirects = await createRedirects();

const redirect = redirects.get(pathname);
Expand Down

0 comments on commit b44b43a

Please sign in to comment.