diff --git a/package-lock.json b/package-lock.json index d518c5e..0990b26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "webhallen-userscript", "version": "1.0.1", "license": "GPL-3.0", + "dependencies": { + "charts.css": "^1.1.0" + }, "devDependencies": { "@sleavely/eslint-config": "^1.0.1", "@types/node": "^20.10.7", @@ -1501,6 +1504,11 @@ "node": ">=8" } }, + "node_modules/charts.css": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/charts.css/-/charts.css-1.1.0.tgz", + "integrity": "sha512-K1Qyb8ZKsu5cDrVbZeHECk/xSq6iOl8IDTR35uaMdhr/Vyyxvg9nYQy3KNB3aidxJ2E251afX5q2725N0uL3Vw==" + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -5725,6 +5733,11 @@ "supports-color": "^7.1.0" } }, + "charts.css": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/charts.css/-/charts.css-1.1.0.tgz", + "integrity": "sha512-K1Qyb8ZKsu5cDrVbZeHECk/xSq6iOl8IDTR35uaMdhr/Vyyxvg9nYQy3KNB3aidxJ2E251afX5q2725N0uL3Vw==" + }, "check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", diff --git a/package.json b/package.json index 98b2b5e..c6a91fe 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "dist/webhallen.user.js", "scripts": { "build": "npm run build:compile && npm run build:header && npm run build:merge && npm run build:cleanup", - "build:compile": "npx esbuild --bundle src/userscript.ts --outdir=dist", + "build:compile": "npx esbuild --bundle src/userscript.ts --outdir=dist --loader:.css=text", "build:header": "npx envsub --env USER_SCRIPT_VERSION=\"$(jq .version package.json)\" --env USER_SCRIPT_DESC=\"$(jq .description package.json)\" --env USER_SCRIPT_AUTHORS=\"$(jq --join-output '.authors | join(\", \")' package.json)\" -p -s dollar-basic userscript-header.js dist/header.js", "build:merge": "cat dist/header.js dist/userscript.js > dist/webhallen.user.js", "build:cleanup": "rm dist/header.js dist/userscript.js", @@ -35,5 +35,8 @@ "esbuild": "^0.19.11", "typescript": "^5.3.3", "vitest": "^1.1.3" + }, + "dependencies": { + "charts.css": "^1.1.0" } } diff --git a/src/lib/api.ts b/src/lib/api.ts index 2e95c02..3ce577a 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -30,8 +30,13 @@ export const fetchAPI = async ( } export async function fetchMe (): Promise { - const data = await fetchAPI('https://www.webhallen.com/api/me') - return data.user + return await getCachedPromise({ + key: 'me', + fn: async () => { + const data = await fetchAPI('https://www.webhallen.com/api/me') + return data.user + }, + }) } const fetchOrdersFresh = async (whId: number): Promise => { diff --git a/src/lib/css.ts b/src/lib/css.ts new file mode 100644 index 0000000..c9f17e5 --- /dev/null +++ b/src/lib/css.ts @@ -0,0 +1,9 @@ +const addedCache = {} as Record + +export const addCss = (css: string): void => { + if (addedCache[css]) return + const stylesheet = document.createElement('style') + stylesheet.innerHTML = css + document.head.appendChild(stylesheet) + addedCache[css] = true +} diff --git a/src/renderers/stats.ts b/src/renderers/stats.ts index 9dd5e38..5187c55 100644 --- a/src/renderers/stats.ts +++ b/src/renderers/stats.ts @@ -1,4 +1,5 @@ import { fetchAchievements, fetchOrders, fetchSupplyDrops } from '../lib/api' +import { addCss } from '../lib/css' import { getCachedUser } from '../lib/userIdCache' import { findCategoriesByPeriod } from '../reducers/categories' import { type ExperienceStats, getExperienceStats } from '../reducers/experience' @@ -6,6 +7,7 @@ import { type HoarderEntry, findTopHoarderCheevoStats } from '../reducers/hoarde import { findOrdersPerMonth } from '../reducers/orders' import { getStoreStats, type StoreSum } from '../reducers/stores' import { type Streaks, findStreaks } from '../reducers/streaks' +import chartsCss from 'charts.css' function addDataToDiv (headerText: string, domObject: Element): HTMLDivElement { const div = document.createElement('div') @@ -481,7 +483,8 @@ function generateStoresChart (storeSums: Map): HTMLDivElement async function _clearAndAddStatistics (event: MouseEvent): Promise { event.preventDefault() - GM_addStyle('@import url("https://unpkg.com/charts.css/dist/charts.min.css");') + + addCss(chartsCss) const clickedLink = event.target as HTMLElement diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..03af48f --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module '*.css' { + const content + export default content +}