Skip to content

Commit 46d37d2

Browse files
committed
[WORK IN PROGRESS] Options page
1 parent 3b100c4 commit 46d37d2

File tree

13 files changed

+110
-45
lines changed

13 files changed

+110
-45
lines changed

workspaces/leetcode-zen-mode/src/extension/content-script-isolated/main.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { getChrome } from "@code-chronicles/util/browser-extensions/chrome/getChrome";
22

3-
import { SETTINGS_ATTRIBUTE, SETTINGS_STORAGE_KEY } from "../constants.ts";
3+
import { PUBLIC_SETTINGS_STORAGE_KEY } from "../shared/public-settings/constants.ts";
4+
import { publicSettingsZodType } from "../shared/public-settings/publicSettingsZodType.ts";
5+
import { writePublicSettingsToDocumentAttribute } from "../shared/public-settings/writePublicSettingsToDocumentAttribute.ts";
46

57
/**
68
* Entry point for the extension content script that will run in an isolated
@@ -18,10 +20,15 @@ async function main(): Promise<void> {
1820
return;
1921
}
2022

21-
const settings = await chrome.storage.sync.get(SETTINGS_STORAGE_KEY);
22-
document.documentElement.setAttribute(
23-
SETTINGS_ATTRIBUTE,
24-
JSON.stringify(settings[SETTINGS_STORAGE_KEY]),
23+
const unsafePublicSettings: unknown = (
24+
await chrome.storage.sync.get(PUBLIC_SETTINGS_STORAGE_KEY)
25+
)[PUBLIC_SETTINGS_STORAGE_KEY];
26+
if (unsafePublicSettings == null) {
27+
return;
28+
}
29+
30+
writePublicSettingsToDocumentAttribute(
31+
publicSettingsZodType.parse(unsafePublicSettings),
2532
);
2633
}
2734

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { isNonArrayObject } from "@code-chronicles/util/isNonArrayObject";
2-
import { isString } from "@code-chronicles/util/isString";
2+
3+
import { difficultyZodType, type Difficulty } from "../problemDifficulties.ts";
34

45
export function isArrayOfDataByDifficulty(
56
arr: unknown[],
6-
): arr is ({ difficulty: string } & Record<string, unknown>)[] {
7+
): arr is ({ difficulty: Difficulty } & Record<string, unknown>)[] {
78
return arr.every(
8-
(elem) => isNonArrayObject(elem) && isString(elem.difficulty),
9+
(elem) =>
10+
isNonArrayObject(elem) &&
11+
difficultyZodType.safeParse(elem.difficulty).success,
912
);
1013
}

workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/patchJsxFactory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { isString } from "@code-chronicles/util/isString";
33
import { assignFunctionCosmeticProperties } from "@code-chronicles/util/object-properties/assignFunctionCosmeticProperties";
44
import { NullReactElement } from "@code-chronicles/util/browser-extensions/NullReactElement";
55

6+
import { difficultyZodType } from "../problemDifficulties.ts";
7+
68
type CreateElementFn = (
79
this: unknown,
810
elementType: unknown,
@@ -23,7 +25,7 @@ export function patchJsxFactory<T extends CreateElementFn>(
2325
Array.isArray(props.items) &&
2426
props.items.some(
2527
(it: Record<string, unknown>) =>
26-
isString(it.value) && /^easy$/i.test(it.value),
28+
difficultyZodType.safeParse(it.value).success,
2729
)
2830
) {
2931
return createElementFn.apply(this, [NullReactElement, {}]);

workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeAggregateDataForDifficulty.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export function rewriteLeetCodeAggregateDataForDifficulty(
8383
if (isArrayOfNumbers(values)) {
8484
const total = sum(values);
8585

86+
// TODO: weighted average
8687
if (key === "percentage") {
8788
return total / (values.length || 1);
8889
}

workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeGraphQLData.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,16 @@ import { isString } from "@code-chronicles/util/isString";
33
import { mapObjectValues } from "@code-chronicles/util/mapObjectValues";
44
import { stringToCase } from "@code-chronicles/util/stringToCase";
55

6-
import { SETTINGS_ATTRIBUTE } from "../constants.ts";
76
import { rewriteLeetCodeAggregateDataForDifficulty } from "./rewriteLeetCodeAggregateDataForDifficulty.ts";
87
import { PREFERRED_STRING_CASE, STRING_CASE_CHECKERS } from "./stringCase.ts";
9-
import type { Difficulty } from "../usePreferredDifficulty.ts";
10-
11-
let preferredDifficulty: Difficulty | null = null;
12-
function getPreferredDifficulty(prevJsonParse: typeof JSON.parse): Difficulty {
13-
if (preferredDifficulty == null) {
14-
try {
15-
preferredDifficulty = (prevJsonParse(
16-
String(document.documentElement.getAttribute(SETTINGS_ATTRIBUTE)),
17-
) ?? "Easy") as Difficulty;
18-
} catch (err) {
19-
console.error(err);
20-
preferredDifficulty = "Easy";
21-
}
22-
}
23-
24-
return preferredDifficulty;
8+
import { difficultyZodType } from "../problemDifficulties.ts";
9+
import type { PublicSettings } from "../shared/public-settings/publicSettingsZodType.ts";
10+
import { readPublicSettingsFromDocumentAttribute } from "../shared/public-settings/readPublicSettingsFromDocumentAttribute.ts";
11+
12+
let publicSettings: PublicSettings | null = null;
13+
function getPublicSettings(prevJsonParse: typeof JSON.parse): PublicSettings {
14+
return (publicSettings ??=
15+
readPublicSettingsFromDocumentAttribute(prevJsonParse));
2516
}
2617

2718
export function rewriteLeetCodeGraphQLData(
@@ -46,11 +37,12 @@ export function rewriteLeetCodeGraphQLData(
4637
}
4738

4839
// Rewrite difficulty strings!
49-
if (isString(value) && /^(?:easy|medium|hard)$/i.test(value)) {
40+
if (isString(value) && difficultyZodType.safeParse(value).success) {
5041
const stringCase =
5142
STRING_CASE_CHECKERS.find(([, checker]) => checker(value))?.[0] ??
5243
PREFERRED_STRING_CASE;
53-
return stringToCase(getPreferredDifficulty(prevJsonParse), stringCase);
44+
const { preferredDifficulty } = getPublicSettings(prevJsonParse);
45+
return stringToCase(preferredDifficulty, stringCase);
5446
}
5547

5648
// Pass everything else through unchanged.

workspaces/leetcode-zen-mode/src/extension/options-ui/components/App.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import React from "react";
22

3-
import {
4-
usePreferredDifficulty,
5-
DIFFICULTIES,
6-
type Difficulty,
7-
} from "../../usePreferredDifficulty.ts";
3+
import { usePreferredDifficulty } from "../../usePreferredDifficulty.ts";
4+
import { DIFFICULTIES, difficultyZodType } from "../../problemDifficulties.ts";
85

96
function Options() {
107
const [preferredDifficulty, setPreferredDifficulty] =
@@ -17,7 +14,7 @@ function Options() {
1714
<select
1815
value={preferredDifficulty}
1916
onChange={(ev) =>
20-
setPreferredDifficulty(ev.target.value as Difficulty)
17+
setPreferredDifficulty(difficultyZodType.parse(ev.target.value))
2118
}
2219
>
2320
{DIFFICULTIES.map((difficultyOption) => (
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import nullthrows from "nullthrows";
2+
import { z } from "zod";
3+
4+
export const DIFFICULTIES = ["Easy", "Medium", "Hard"] as const;
5+
6+
export const difficultyZodType = z
7+
.string()
8+
.transform((s) =>
9+
nullthrows(DIFFICULTIES.find((d) => d.toLowerCase() === s.toLowerCase())),
10+
);
11+
12+
export type Difficulty = z.infer<typeof difficultyZodType>;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const PUBLIC_SETTINGS_ATTRIBUTE =
2+
"data-leetcode-zen-mode-public-settings";
3+
4+
export const PUBLIC_SETTINGS_STORAGE_KEY = "public-settings";
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { PublicSettings } from "./publicSettingsZodType.ts";
2+
3+
export function getDefaultPublicSettings(): PublicSettings {
4+
return {
5+
preferredDifficulty: "Easy",
6+
};
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { z } from "zod";
2+
3+
import { difficultyZodType } from "../../problemDifficulties.ts";
4+
5+
export const publicSettingsZodType = z.object({
6+
preferredDifficulty: difficultyZodType,
7+
});
8+
9+
export type PublicSettings = z.infer<typeof publicSettingsZodType>;

0 commit comments

Comments
 (0)