diff --git a/.parcelrc b/.parcelrc new file mode 100644 index 00000000..6f883d01 --- /dev/null +++ b/.parcelrc @@ -0,0 +1,5 @@ +{ +"transformers": { + "raw:*": ["@parcel/transformer-raw"] + } +} \ No newline at end of file diff --git a/package.json b/package.json index dfff627d..a51b5f29 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "3.2.4", "type": "module", "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", + "browserslist": "> 0.5%, last 2 versions, not dead", "scripts": { "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash --no-cache --no-source-maps", @@ -24,6 +25,7 @@ "devDependencies": { "@parcel/config-webextension": "^2.11.0", "@parcel/optimizer-data-url": "^2.11.0", + "@parcel/packager-ts": "2.11.0", "@parcel/transformer-inline-string": "^2.11.0", "@parcel/transformer-sass": "2.11.0", "assert": "^2.0.0", @@ -50,6 +52,7 @@ "yarn": "^1.22.21" }, "dependencies": { + "@parcel/transformer-raw": "^2.11.0", "@sentry/browser": "^7.85.0", "@sentry/react": "^7.88.0", "@sentry/webpack-plugin": "^2.10.2", diff --git a/src/interface/components/BackgroundSelector.tsx b/src/interface/components/BackgroundSelector.tsx index 19c690f6..37bf2baa 100644 --- a/src/interface/components/BackgroundSelector.tsx +++ b/src/interface/components/BackgroundSelector.tsx @@ -3,6 +3,7 @@ import { downloadPresetBackground, openDB, readAllData, writeData } from "../hoo import presetBackgrounds from "../assets/presetBackgrounds"; import "./BackgroundSelector.css"; import { disableTheme } from "../hooks/ThemeManagment"; +import browser from "webextension-polyfill"; // Custom Types and Interfaces export interface Background { @@ -21,12 +22,27 @@ interface BackgroundSelectorProps { isEditMode: boolean; } +async function GetTheme() { + return localStorage.getItem('selectedBackground'); +} + +async function SetTheme(theme: string) { + localStorage.setItem('selectedBackground', theme); + await browser.storage.local.set({ theme }); +} + function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: BackgroundSelectorProps) { const [backgrounds, setBackgrounds] = useState([]); - const [selectedBackground, setSelectedBackground] = useState(localStorage.getItem('selectedBackground')); + const [selectedBackground, setSelectedBackground] = useState(); const [downloadedPresetIds, setDownloadedPresetIds] = useState([]); const [downloadProgress, setDownloadProgress] = useState>({}); + useEffect(() => { + GetTheme().then((theme) => { + setSelectedBackground(theme); + }); + }, []); + const handleFileChange = async (e: ChangeEvent): Promise => { const file = e.target.files?.[0]; if (!file) return; @@ -77,7 +93,7 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg disableTheme(); setSelectedType('background'); setSelectedBackground(fileId); - localStorage.setItem('selectedBackground', fileId); + SetTheme(fileId); }; const deleteBackground = async (fileId: string): Promise => { @@ -97,7 +113,7 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg setSelectedType('background'); disableTheme(); setSelectedBackground(null); - localStorage.removeItem('selectedBackground'); + SetTheme(''); }; const calcCircumference = (radius: number) => 2 * Math.PI * radius; diff --git a/src/interface/types/AppProps.ts b/src/interface/types/AppProps.ts index b31c2a81..9c1cb949 100644 --- a/src/interface/types/AppProps.ts +++ b/src/interface/types/AppProps.ts @@ -1,5 +1,6 @@ export interface SettingsState { notificationCollector: boolean; + theme: string; lessonAlerts: boolean; telemetry: boolean; animatedBackground: boolean; diff --git a/src/seqta/ui/ImageBackgrounds.ts b/src/seqta/ui/ImageBackgrounds.ts index 645e44d2..120a90f4 100644 --- a/src/seqta/ui/ImageBackgrounds.ts +++ b/src/seqta/ui/ImageBackgrounds.ts @@ -1,7 +1,13 @@ import backgroundPage from 'url:./background/background.html' +import browser from 'webextension-polyfill'; +import { SettingsState } from '../../types/storage'; export async function appendBackgroundToUI() { - console.log('Starting appendBackgroundToUI...'); + const settings = await browser.storage.local.get() as SettingsState; + + console.log(settings.theme); + + if (settings.theme == '') return; const parent = document.getElementById('container'); diff --git a/src/seqta/ui/background/background.html b/src/seqta/ui/background/background.html index eeb2bc55..d8d4fda4 100644 --- a/src/seqta/ui/background/background.html +++ b/src/seqta/ui/background/background.html @@ -23,7 +23,7 @@
- - + + diff --git a/src/seqta/ui/background/background.ts b/src/seqta/ui/background/background.ts index 52f739ae..3df9be91 100644 --- a/src/seqta/ui/background/background.ts +++ b/src/seqta/ui/background/background.ts @@ -19,7 +19,7 @@ const openDB = (): Promise => { request.onsuccess = () => resolve(request.result); request.onupgradeneeded = (event: IDBVersionChangeEvent) => { - // @ts-expect-error + // @ts-expect-error - The event type is not recognized by TypeScript event?.target?.result.createObjectStore('backgrounds', { keyPath: 'id' }); }; }); @@ -27,7 +27,9 @@ const openDB = (): Promise => { const readData = async (): Promise => { const selectedBackground = localStorage.getItem('selectedBackground'); - if (!selectedBackground) { + + //const selectedBackground = localStorage.getItem('selectedBackground'); + if (!selectedBackground || selectedBackground === '') { return null; } @@ -46,8 +48,6 @@ const updateBackground = async (): Promise => { try { const data = await readData(); if (!data) { - console.log('No data found in IndexedDB.'); - const container = document.getElementById('media-container'); const currentMedia = container?.querySelector('.current-media'); if (currentMedia) { diff --git a/src/seqta/utils/StorageListener.ts b/src/seqta/utils/StorageListener.ts index 75553bca..5d6dc10a 100644 --- a/src/seqta/utils/StorageListener.ts +++ b/src/seqta/utils/StorageListener.ts @@ -11,6 +11,7 @@ import { } from '../../SEQTA'; import { updateBgDurations } from '../ui/Animation'; import { getDarkMode, updateAllColors } from '../ui/colors/Manager'; +import { appendBackgroundToUI } from '../ui/ImageBackgrounds'; export default class StorageListener { @@ -21,6 +22,7 @@ export default class StorageListener { } handleStorageChanges(changes: any) { + console.log('Storage changed:', changes); Object.keys(changes).forEach((changeKey) => { switch (changeKey) { @@ -80,6 +82,15 @@ export default class StorageListener { document.documentElement.classList.remove('transparencyEffects'); } break; + + case 'theme': + if (changes.theme.newValue === '' && changes.theme.oldValue !== '') { + document.querySelector('iframe#background')?.remove(); + } else if (changes.theme.newValue !== '' && changes.theme.oldValue === '') { + appendBackgroundToUI(); + } + + break; // Add default case if you need to handle a case where changeKey does not match any case default: diff --git a/src/types/storage.ts b/src/types/storage.ts index 068482cc..247f6f00 100644 --- a/src/types/storage.ts +++ b/src/types/storage.ts @@ -1,5 +1,6 @@ export interface SettingsState { DarkMode: boolean; + theme: string; animatedbk: boolean; bksliderinput: string; customshortcuts: CustomShortcut[];