From 46d37d250e2dcd0ebbab1b163231778ff749a0aa Mon Sep 17 00:00:00 2001 From: Miorel-Lucian Palii Date: Sun, 10 Nov 2024 00:56:00 -0800 Subject: [PATCH 1/2] [WORK IN PROGRESS] Options page --- .../extension/content-script-isolated/main.ts | 17 +++++++---- .../isArrayOfDataByDifficulty.ts | 9 ++++-- .../patchJsxFactory.ts | 4 ++- ...writeLeetCodeAggregateDataForDifficulty.ts | 1 + .../rewriteLeetCodeGraphQLData.ts | 30 +++++++------------ .../extension/options-ui/components/App.tsx | 9 ++---- .../src/extension/problemDifficulties.ts | 12 ++++++++ .../shared/public-settings/constants.ts | 4 +++ .../getDefaultPublicSettings.ts | 7 +++++ .../public-settings/publicSettingsZodType.ts | 9 ++++++ ...readPublicSettingsFromDocumentAttribute.ts | 23 ++++++++++++++ .../writePublicSettingsToDocumentAttribute.ts | 11 +++++++ .../src/extension/usePreferredDifficulty.ts | 19 +++++------- 13 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 workspaces/leetcode-zen-mode/src/extension/problemDifficulties.ts create mode 100644 workspaces/leetcode-zen-mode/src/extension/shared/public-settings/constants.ts create mode 100644 workspaces/leetcode-zen-mode/src/extension/shared/public-settings/getDefaultPublicSettings.ts create mode 100644 workspaces/leetcode-zen-mode/src/extension/shared/public-settings/publicSettingsZodType.ts create mode 100644 workspaces/leetcode-zen-mode/src/extension/shared/public-settings/readPublicSettingsFromDocumentAttribute.ts create mode 100644 workspaces/leetcode-zen-mode/src/extension/shared/public-settings/writePublicSettingsToDocumentAttribute.ts diff --git a/workspaces/leetcode-zen-mode/src/extension/content-script-isolated/main.ts b/workspaces/leetcode-zen-mode/src/extension/content-script-isolated/main.ts index 5d952183..3d6c7b00 100644 --- a/workspaces/leetcode-zen-mode/src/extension/content-script-isolated/main.ts +++ b/workspaces/leetcode-zen-mode/src/extension/content-script-isolated/main.ts @@ -1,6 +1,8 @@ import { getChrome } from "@code-chronicles/util/browser-extensions/chrome/getChrome"; -import { SETTINGS_ATTRIBUTE, SETTINGS_STORAGE_KEY } from "../constants.ts"; +import { PUBLIC_SETTINGS_STORAGE_KEY } from "../shared/public-settings/constants.ts"; +import { publicSettingsZodType } from "../shared/public-settings/publicSettingsZodType.ts"; +import { writePublicSettingsToDocumentAttribute } from "../shared/public-settings/writePublicSettingsToDocumentAttribute.ts"; /** * Entry point for the extension content script that will run in an isolated @@ -18,10 +20,15 @@ async function main(): Promise { return; } - const settings = await chrome.storage.sync.get(SETTINGS_STORAGE_KEY); - document.documentElement.setAttribute( - SETTINGS_ATTRIBUTE, - JSON.stringify(settings[SETTINGS_STORAGE_KEY]), + const unsafePublicSettings: unknown = ( + await chrome.storage.sync.get(PUBLIC_SETTINGS_STORAGE_KEY) + )[PUBLIC_SETTINGS_STORAGE_KEY]; + if (unsafePublicSettings == null) { + return; + } + + writePublicSettingsToDocumentAttribute( + publicSettingsZodType.parse(unsafePublicSettings), ); } diff --git a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/isArrayOfDataByDifficulty.ts b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/isArrayOfDataByDifficulty.ts index 533e9f6e..e8a143ca 100644 --- a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/isArrayOfDataByDifficulty.ts +++ b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/isArrayOfDataByDifficulty.ts @@ -1,10 +1,13 @@ import { isNonArrayObject } from "@code-chronicles/util/isNonArrayObject"; -import { isString } from "@code-chronicles/util/isString"; + +import { difficultyZodType, type Difficulty } from "../problemDifficulties.ts"; export function isArrayOfDataByDifficulty( arr: unknown[], -): arr is ({ difficulty: string } & Record)[] { +): arr is ({ difficulty: Difficulty } & Record)[] { return arr.every( - (elem) => isNonArrayObject(elem) && isString(elem.difficulty), + (elem) => + isNonArrayObject(elem) && + difficultyZodType.safeParse(elem.difficulty).success, ); } diff --git a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/patchJsxFactory.ts b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/patchJsxFactory.ts index e18361b1..b3277101 100644 --- a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/patchJsxFactory.ts +++ b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/patchJsxFactory.ts @@ -3,6 +3,8 @@ import { isString } from "@code-chronicles/util/isString"; import { assignFunctionCosmeticProperties } from "@code-chronicles/util/object-properties/assignFunctionCosmeticProperties"; import { NullReactElement } from "@code-chronicles/util/browser-extensions/NullReactElement"; +import { difficultyZodType } from "../problemDifficulties.ts"; + type CreateElementFn = ( this: unknown, elementType: unknown, @@ -23,7 +25,7 @@ export function patchJsxFactory( Array.isArray(props.items) && props.items.some( (it: Record) => - isString(it.value) && /^easy$/i.test(it.value), + difficultyZodType.safeParse(it.value).success, ) ) { return createElementFn.apply(this, [NullReactElement, {}]); diff --git a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeAggregateDataForDifficulty.ts b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeAggregateDataForDifficulty.ts index 61c898c2..3cb131d3 100644 --- a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeAggregateDataForDifficulty.ts +++ b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeAggregateDataForDifficulty.ts @@ -83,6 +83,7 @@ export function rewriteLeetCodeAggregateDataForDifficulty( if (isArrayOfNumbers(values)) { const total = sum(values); + // TODO: weighted average if (key === "percentage") { return total / (values.length || 1); } diff --git a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeGraphQLData.ts b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeGraphQLData.ts index 66b4e80e..6ae189da 100644 --- a/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeGraphQLData.ts +++ b/workspaces/leetcode-zen-mode/src/extension/content-script-non-isolated/rewriteLeetCodeGraphQLData.ts @@ -3,25 +3,16 @@ import { isString } from "@code-chronicles/util/isString"; import { mapObjectValues } from "@code-chronicles/util/mapObjectValues"; import { stringToCase } from "@code-chronicles/util/stringToCase"; -import { SETTINGS_ATTRIBUTE } from "../constants.ts"; import { rewriteLeetCodeAggregateDataForDifficulty } from "./rewriteLeetCodeAggregateDataForDifficulty.ts"; import { PREFERRED_STRING_CASE, STRING_CASE_CHECKERS } from "./stringCase.ts"; -import type { Difficulty } from "../usePreferredDifficulty.ts"; - -let preferredDifficulty: Difficulty | null = null; -function getPreferredDifficulty(prevJsonParse: typeof JSON.parse): Difficulty { - if (preferredDifficulty == null) { - try { - preferredDifficulty = (prevJsonParse( - String(document.documentElement.getAttribute(SETTINGS_ATTRIBUTE)), - ) ?? "Easy") as Difficulty; - } catch (err) { - console.error(err); - preferredDifficulty = "Easy"; - } - } - - return preferredDifficulty; +import { difficultyZodType } from "../problemDifficulties.ts"; +import type { PublicSettings } from "../shared/public-settings/publicSettingsZodType.ts"; +import { readPublicSettingsFromDocumentAttribute } from "../shared/public-settings/readPublicSettingsFromDocumentAttribute.ts"; + +let publicSettings: PublicSettings | null = null; +function getPublicSettings(prevJsonParse: typeof JSON.parse): PublicSettings { + return (publicSettings ??= + readPublicSettingsFromDocumentAttribute(prevJsonParse)); } export function rewriteLeetCodeGraphQLData( @@ -46,11 +37,12 @@ export function rewriteLeetCodeGraphQLData( } // Rewrite difficulty strings! - if (isString(value) && /^(?:easy|medium|hard)$/i.test(value)) { + if (isString(value) && difficultyZodType.safeParse(value).success) { const stringCase = STRING_CASE_CHECKERS.find(([, checker]) => checker(value))?.[0] ?? PREFERRED_STRING_CASE; - return stringToCase(getPreferredDifficulty(prevJsonParse), stringCase); + const { preferredDifficulty } = getPublicSettings(prevJsonParse); + return stringToCase(preferredDifficulty, stringCase); } // Pass everything else through unchanged. diff --git a/workspaces/leetcode-zen-mode/src/extension/options-ui/components/App.tsx b/workspaces/leetcode-zen-mode/src/extension/options-ui/components/App.tsx index 864732cb..a5a5d7b2 100644 --- a/workspaces/leetcode-zen-mode/src/extension/options-ui/components/App.tsx +++ b/workspaces/leetcode-zen-mode/src/extension/options-ui/components/App.tsx @@ -1,10 +1,7 @@ import React from "react"; -import { - usePreferredDifficulty, - DIFFICULTIES, - type Difficulty, -} from "../../usePreferredDifficulty.ts"; +import { usePreferredDifficulty } from "../../usePreferredDifficulty.ts"; +import { DIFFICULTIES, difficultyZodType } from "../../problemDifficulties.ts"; function Options() { const [preferredDifficulty, setPreferredDifficulty] = @@ -17,7 +14,7 @@ function Options() {