Skip to content

Commit 80f8767

Browse files
committed
Set all modes from dev pages
1 parent 7f569f8 commit 80f8767

File tree

4 files changed

+104
-10
lines changed

4 files changed

+104
-10
lines changed

pages/app/page.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
import { Suspense, useEffect } from "react";
5-
import { useSearchParams } from "react-router-dom";
4+
import { Suspense } from "react";
65

76
import { pagesMap } from "../pages";
8-
7+
import useModes from "./use-modes";
98
export interface PageProps {
109
pageId: string;
1110
}
12-
1311
export default function Page({ pageId }: PageProps) {
14-
const [searchParams] = useSearchParams();
15-
const direction = searchParams.get("direction") ?? "ltr";
16-
17-
useEffect(() => {
18-
document.documentElement.setAttribute("dir", direction);
19-
}, [direction]);
12+
useModes();
2013

2114
const Component = pagesMap[pageId];
2215

pages/app/use-modes.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
import { useEffect } from "react";
4+
import { useSearchParams } from "react-router-dom";
5+
6+
import { applyDensity, applyMode, disableMotion } from "@cloudscape-design/global-styles";
7+
8+
import { AppUrlParams, formatQuery, parseQuery } from "./utils";
9+
10+
export default function useModes() {
11+
const [searchParams, setSearchParams] = useSearchParams();
12+
const urlParams = parseQuery(searchParams) as AppUrlParams;
13+
const { density, direction, mode, motionDisabled, visualRefresh } = urlParams;
14+
15+
function setParams(newParams: Partial<AppUrlParams>) {
16+
setSearchParams(formatQuery({ ...urlParams, ...newParams }));
17+
18+
if (
19+
(newParams.direction && newParams.direction !== direction) ||
20+
(newParams.visualRefresh && newParams.visualRefresh !== visualRefresh)
21+
) {
22+
window.location.reload();
23+
}
24+
}
25+
26+
useEffect(() => {
27+
applyMode(mode);
28+
}, [mode]);
29+
30+
useEffect(() => {
31+
applyDensity(density);
32+
}, [density]);
33+
34+
useEffect(() => {
35+
disableMotion(motionDisabled);
36+
}, [motionDisabled]);
37+
38+
document.documentElement.setAttribute("dir", urlParams.direction);
39+
40+
return { density, direction, mode, motionDisabled, visualRefresh, setParams };
41+
}

pages/app/utils.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import mapValues from "lodash/mapValues";
5+
6+
import { Density, Mode } from "@cloudscape-design/global-styles";
7+
8+
export interface AppUrlParams {
9+
mode: Mode;
10+
density: Density;
11+
direction: "ltr" | "rtl";
12+
motionDisabled: boolean;
13+
visualRefresh: boolean;
14+
}
15+
16+
export const defaults: AppUrlParams = {
17+
mode: Mode.Light,
18+
density: Density.Comfortable,
19+
direction: "ltr",
20+
motionDisabled: false,
21+
visualRefresh: true,
22+
};
23+
24+
export function parseQuery(urlParams: URLSearchParams) {
25+
const queryParams: Record<string, any> = { ...defaults };
26+
urlParams.forEach((value, key) => (queryParams[key] = value));
27+
28+
return mapValues(queryParams, (value) => {
29+
if (value === "true" || value === "false") {
30+
return value === "true";
31+
}
32+
return value;
33+
});
34+
}
35+
36+
export function formatQuery(params: AppUrlParams) {
37+
const query: Record<string, string> = {};
38+
for (const [key, value] of Object.entries(params)) {
39+
if (value === defaults[key as keyof AppUrlParams]) {
40+
continue;
41+
}
42+
query[key as keyof AppUrlParams] = String(value);
43+
}
44+
return query;
45+
}
46+
47+
const awsuiVisualRefreshFlag = Symbol.for("awsui-visual-refresh-flag");
48+
interface ExtendedWindow extends Window {
49+
[awsuiVisualRefreshFlag]?: () => boolean;
50+
}
51+
declare const window: ExtendedWindow;
52+
53+
export function setVisualRefresh() {
54+
const { visualRefresh } = parseQuery(new URLSearchParams(window.location.hash.split("?")[1]));
55+
56+
window[awsuiVisualRefreshFlag] = () => visualRefresh ?? true;
57+
}

pages/main.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import { StrictMode } from "react";
44
import ReactDOM from "react-dom/client";
55

66
import App from "./app";
7+
import { setVisualRefresh } from "./app/utils";
78

89
import "@cloudscape-design/global-styles/index.css";
910

11+
setVisualRefresh();
12+
1013
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
1114
<StrictMode>
1215
<App />

0 commit comments

Comments
 (0)