From e9db7b02832ac2802f2c67b0f7a9640ad471afbc Mon Sep 17 00:00:00 2001 From: Seth Burkart Date: Fri, 15 Sep 2023 12:01:08 +1000 Subject: [PATCH] major updates to popup dev, manifest fix --- bun.lockb | Bin 0 -> 103159 bytes {src/popup => interface}/.eslintrc.cjs | 0 {src/popup => interface}/.gitignore | 0 {src/popup => interface}/README.md | 0 {src/popup => interface}/bun.lockb | Bin {src/popup => interface}/index.html | 0 {src/popup => interface}/package.json | 0 {src/popup => interface}/postcss.config.js | 0 {src/popup => interface}/public/vite.svg | 0 {src/popup => interface}/src/App.css | 0 interface/src/App.tsx | 75 ++++++++++++++ .../src/assets/betterseqta-dark-full.png | Bin .../src/assets/betterseqta-light-full.png | Bin {src/popup => interface}/src/assets/react.svg | 0 interface/src/components/ColorPicker.tsx | 45 +++++++++ .../src/components/Slider.css | 0 .../src/components/Slider.tsx | 0 .../src/components/Switch.css | 1 - .../src/components/Switch.tsx | 15 ++- interface/src/components/TabbedContainer.tsx | 92 +++++++++++++++++ {src/popup => interface}/src/index.css | 0 {src/popup => interface}/src/main.tsx | 0 interface/src/pages/About.tsx | 10 ++ interface/src/pages/Settings.tsx | 68 +++++++++++++ interface/src/pages/Shortcuts.tsx | 95 ++++++++++++++++++ {src/popup => interface}/src/vite-env.d.ts | 0 interface/tailwind.config.js | 22 ++++ {src/popup => interface}/tsconfig.json | 0 {src/popup => interface}/tsconfig.node.json | 0 {src/popup => interface}/vite.config.ts | 2 +- public/manifest.json | 3 +- src/popup/src/App.tsx | 67 ------------ src/popup/src/components/ColorPicker.tsx | 43 -------- src/popup/tailwind.config.js | 24 ----- 34 files changed, 416 insertions(+), 146 deletions(-) create mode 100755 bun.lockb rename {src/popup => interface}/.eslintrc.cjs (100%) rename {src/popup => interface}/.gitignore (100%) rename {src/popup => interface}/README.md (100%) rename {src/popup => interface}/bun.lockb (100%) rename {src/popup => interface}/index.html (100%) rename {src/popup => interface}/package.json (100%) rename {src/popup => interface}/postcss.config.js (100%) rename {src/popup => interface}/public/vite.svg (100%) rename {src/popup => interface}/src/App.css (100%) create mode 100644 interface/src/App.tsx rename {src/popup => interface}/src/assets/betterseqta-dark-full.png (100%) rename {src/popup => interface}/src/assets/betterseqta-light-full.png (100%) rename {src/popup => interface}/src/assets/react.svg (100%) create mode 100644 interface/src/components/ColorPicker.tsx rename {src/popup => interface}/src/components/Slider.css (100%) rename {src/popup => interface}/src/components/Slider.tsx (100%) rename {src/popup => interface}/src/components/Switch.css (70%) rename {src/popup => interface}/src/components/Switch.tsx (76%) create mode 100644 interface/src/components/TabbedContainer.tsx rename {src/popup => interface}/src/index.css (100%) rename {src/popup => interface}/src/main.tsx (100%) create mode 100644 interface/src/pages/About.tsx create mode 100644 interface/src/pages/Settings.tsx create mode 100644 interface/src/pages/Shortcuts.tsx rename {src/popup => interface}/src/vite-env.d.ts (100%) create mode 100644 interface/tailwind.config.js rename {src/popup => interface}/tsconfig.json (100%) rename {src/popup => interface}/tsconfig.node.json (100%) rename {src/popup => interface}/vite.config.ts (90%) delete mode 100644 src/popup/src/App.tsx delete mode 100644 src/popup/src/components/ColorPicker.tsx delete mode 100644 src/popup/tailwind.config.js diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..843f64382a0f5f1459df724273740c0a161bd860 GIT binary patch literal 103159 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 bvE^dw{?u3{FAgN+-K#Rn&Nlo%@PGdcB+^aL literal 0 HcmV?d00001 diff --git a/src/popup/.eslintrc.cjs b/interface/.eslintrc.cjs similarity index 100% rename from src/popup/.eslintrc.cjs rename to interface/.eslintrc.cjs diff --git a/src/popup/.gitignore b/interface/.gitignore similarity index 100% rename from src/popup/.gitignore rename to interface/.gitignore diff --git a/src/popup/README.md b/interface/README.md similarity index 100% rename from src/popup/README.md rename to interface/README.md diff --git a/src/popup/bun.lockb b/interface/bun.lockb similarity index 100% rename from src/popup/bun.lockb rename to interface/bun.lockb diff --git a/src/popup/index.html b/interface/index.html similarity index 100% rename from src/popup/index.html rename to interface/index.html diff --git a/src/popup/package.json b/interface/package.json similarity index 100% rename from src/popup/package.json rename to interface/package.json diff --git a/src/popup/postcss.config.js b/interface/postcss.config.js similarity index 100% rename from src/popup/postcss.config.js rename to interface/postcss.config.js diff --git a/src/popup/public/vite.svg b/interface/public/vite.svg similarity index 100% rename from src/popup/public/vite.svg rename to interface/public/vite.svg diff --git a/src/popup/src/App.css b/interface/src/App.css similarity index 100% rename from src/popup/src/App.css rename to interface/src/App.css diff --git a/interface/src/App.tsx b/interface/src/App.tsx new file mode 100644 index 00000000..b0b4872e --- /dev/null +++ b/interface/src/App.tsx @@ -0,0 +1,75 @@ +// App.tsx +import { useState } from 'react'; +import TabbedContainer from './components/TabbedContainer'; +import Settings from './pages/Settings'; +import logo from './assets/betterseqta-dark-full.png'; +import logoDark from './assets/betterseqta-light-full.png'; +import Shortcuts from './pages/Shortcuts'; +import About from './pages/About'; + +export interface SettingsState { + notificationCollector: boolean; + lessonAlerts: boolean; + animatedBackground: boolean; + animatedBackgroundSpeed: boolean; + customThemeColor: string; + betterSEQTAPlus: boolean; +} + +const App: React.FC = () => { + const [settingsState, setSettingsState] = useState({ + notificationCollector: false, + lessonAlerts: false, + animatedBackground: false, + animatedBackgroundSpeed: false, + customThemeColor: "#db6969", + betterSEQTAPlus: true + }); + + // Handler for Switches + const switchChange = (key: string, isOn: boolean) => { + setSettingsState({ + ...settingsState, + [key]: isOn, + }); + }; + + // Handler for ColorPicker + const colorChange = (color: string) => { + setSettingsState({ + ...settingsState, + customThemeColor: color, + }); + }; + + const tabs = [ + { + title: 'Settings', + content: + }, + { + title: 'Shortcuts', + content: + }, + { + title: 'About', + content: + } + ]; + + return ( +
+ +
+
+ + +
+ +
+ +
+ ); +} + +export default App; \ No newline at end of file diff --git a/src/popup/src/assets/betterseqta-dark-full.png b/interface/src/assets/betterseqta-dark-full.png similarity index 100% rename from src/popup/src/assets/betterseqta-dark-full.png rename to interface/src/assets/betterseqta-dark-full.png diff --git a/src/popup/src/assets/betterseqta-light-full.png b/interface/src/assets/betterseqta-light-full.png similarity index 100% rename from src/popup/src/assets/betterseqta-light-full.png rename to interface/src/assets/betterseqta-light-full.png diff --git a/src/popup/src/assets/react.svg b/interface/src/assets/react.svg similarity index 100% rename from src/popup/src/assets/react.svg rename to interface/src/assets/react.svg diff --git a/interface/src/components/ColorPicker.tsx b/interface/src/components/ColorPicker.tsx new file mode 100644 index 00000000..84bd298d --- /dev/null +++ b/interface/src/components/ColorPicker.tsx @@ -0,0 +1,45 @@ +// TODO: Create types for ColorPicker +// @ts-expect-error No typescript declarations available +import ColorPicker from 'react-best-gradient-color-picker'; +import { useState, useRef, useEffect } from 'react'; + +interface ColorPickerProps { + color: string; + onChange: (color: string) => void; +} + +const Picker = ({ color, onChange }: ColorPickerProps) => { + const [showPicker, setShowPicker] = useState(false); + const ref = useRef(null); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent): void => { + if (ref.current && !ref.current.contains(event.target as Node)) { + setShowPicker(false); + } + }; + if (showPicker) { + document.addEventListener('mousedown', handleClickOutside); + } + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [showPicker]); + + return ( +
+ + {showPicker && ( +
+ +
+ )} +
+ ); +}; + +export default Picker; diff --git a/src/popup/src/components/Slider.css b/interface/src/components/Slider.css similarity index 100% rename from src/popup/src/components/Slider.css rename to interface/src/components/Slider.css diff --git a/src/popup/src/components/Slider.tsx b/interface/src/components/Slider.tsx similarity index 100% rename from src/popup/src/components/Slider.tsx rename to interface/src/components/Slider.tsx diff --git a/src/popup/src/components/Switch.css b/interface/src/components/Switch.css similarity index 70% rename from src/popup/src/components/Switch.css rename to interface/src/components/Switch.css index 019c0c56..d7e84449 100644 --- a/src/popup/src/components/Switch.css +++ b/interface/src/components/Switch.css @@ -1,4 +1,3 @@ .switch[data-ison="true"] { - justify-content: end; background-color: #30D259; } \ No newline at end of file diff --git a/src/popup/src/components/Switch.tsx b/interface/src/components/Switch.tsx similarity index 76% rename from src/popup/src/components/Switch.tsx rename to interface/src/components/Switch.tsx index 19996a3c..62dacfec 100644 --- a/src/popup/src/components/Switch.tsx +++ b/interface/src/components/Switch.tsx @@ -1,31 +1,30 @@ -import { useState } from "react"; import { motion } from "framer-motion"; import "./Switch.css"; interface SwitchProps { onChange: (isOn: boolean) => void; + state: boolean; } export default function Switch(props: SwitchProps) { - const [isOn, setIsOn] = useState(false); - const toggleSwitch = () => { - const newIsOn = !isOn; - setIsOn(newIsOn); + const newIsOn = !props.state; props.onChange(newIsOn); }; return (
+ />
); } diff --git a/interface/src/components/TabbedContainer.tsx b/interface/src/components/TabbedContainer.tsx new file mode 100644 index 00000000..91df24dd --- /dev/null +++ b/interface/src/components/TabbedContainer.tsx @@ -0,0 +1,92 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { motion } from 'framer-motion'; + +interface Tab { + title: string; + content: JSX.Element; +} + +interface TabbedContainerProps { + tabs: Tab[]; + themeColor: string; +} + +const TabbedContainer: React.FC = ({ tabs, themeColor }) => { + const [activeTab, setActiveTab] = useState(0); + const [hoveredTab, setHoveredTab] = useState(null); + const [tabWidth, setTabWidth] = useState(0); + const [position, setPosition] = useState(0); + const positionRef = useRef(position); + + useEffect(() => { + const newPosition = -activeTab * 100; + setPosition(newPosition); + positionRef.current = newPosition; + }, [activeTab]); + + const containerRef = useRef(null); + + const springTransition = { type: 'spring', stiffness: 250, damping: 25 }; + + useEffect(() => { + if (containerRef.current) { + // @ts-expect-error for some reason its giving an error in TS but it works... + const width = containerRef.current.getBoundingClientRect().width; + setTabWidth(width / tabs.length); + } + }, [tabs.length]); + + const calcXPos = (index: number | null) => { + if (index !== null) { + return tabWidth * index; + } + return tabWidth * activeTab; + }; + + return ( +
+
+
+ + {tabs.map((tab, index) => ( + + ))} +
+
+
+ +
+ {tabs.map((tab, index) => ( +
+ {tab.content} +
+ ))} +
+
+
+
+ ); +}; + +export default TabbedContainer; diff --git a/src/popup/src/index.css b/interface/src/index.css similarity index 100% rename from src/popup/src/index.css rename to interface/src/index.css diff --git a/src/popup/src/main.tsx b/interface/src/main.tsx similarity index 100% rename from src/popup/src/main.tsx rename to interface/src/main.tsx diff --git a/interface/src/pages/About.tsx b/interface/src/pages/About.tsx new file mode 100644 index 00000000..53197a2a --- /dev/null +++ b/interface/src/pages/About.tsx @@ -0,0 +1,10 @@ +const About: React.FC = () => { + + return ( +
+

About

+
+ ); +}; + +export default About; diff --git a/interface/src/pages/Settings.tsx b/interface/src/pages/Settings.tsx new file mode 100644 index 00000000..71a13851 --- /dev/null +++ b/interface/src/pages/Settings.tsx @@ -0,0 +1,68 @@ +import Switch from '../components/Switch'; +import ColorPicker from '../components/ColorPicker'; +import { SettingsState } from '../App'; + +interface ISetting { + title: string; + description: string; + modifyElement: JSX.Element; +} + +interface SettingsProps { + settingsState: SettingsState; + switchChange: (key: string, isOn: boolean) => void; + colorChange: (color: string) => void; +} + +const Settings: React.FC = ({ settingsState, switchChange, colorChange }) => { + const settings: ISetting[] = [ + { + title: "Notification Collector", + description: "Uncaps the 9+ limit for notifications, showing the real number.", + modifyElement: switchChange('notificationCollector', isOn)} /> + }, + { + title: "Lesson Alerts", + description: "Sends a native browser notification ~5 minutes prior to lessons.", + modifyElement: switchChange('lessonAlerts', isOn)} /> + }, + { + title: "Animated Background", + description: "Adds an animated background to BetterSEQTA. (May impact battery life)", + modifyElement: switchChange('animatedBackground', isOn)} /> + }, + { + title: "Animated Background Speed", + description: "Controls the speed of the animated background.", + modifyElement: switchChange('animatedBackgroundSpeed', isOn)} /> + }, + { + title: "Custom Theme Colour", + description: "Customise the overall theme colour of SEQTA Learn.", + modifyElement: colorChange(color)} /> + }, + { + title: "BetterSEQTA+", + description: "Unlocks premium features.", + modifyElement: switchChange('betterSEQTAPlus', isOn)} /> + } + ]; + + return ( +
+ {settings.map((setting, index) => ( +
+
+

{setting.title}

+

{setting.description}

+
+
+ {setting.modifyElement} +
+
+ ))} +
+ ); +}; + +export default Settings; diff --git a/interface/src/pages/Shortcuts.tsx b/interface/src/pages/Shortcuts.tsx new file mode 100644 index 00000000..7400df6a --- /dev/null +++ b/interface/src/pages/Shortcuts.tsx @@ -0,0 +1,95 @@ +import { useState } from "react"; +import Switch from "../components/Switch"; + +export default function Shortcuts() { + const [shortcutState, setShortcutState] = useState({ + youtube: false, + outlook: false, + office: false, + spotify: false, + google: false, + duckduckgo: false, + coolmathgames: false, + sace: false, + googlescholar: false, + gmail: false, + netflix: false + }); + + // Handler for Switches + const switchChange = (key: string, isOn: boolean) => { + setShortcutState({ + ...shortcutState, + [key]: isOn, + }); + }; + + const DefaultShortcuts = [ + { + title: "YouTube", + link: "https://youtube.com", + modifyElement: switchChange('youtube', isOn)} /> + }, + { + title: "Outlook", + link: "https://outlook.office.com/mail/inbox", + modifyElement: switchChange('outlook', isOn)} /> + }, + { + title: "Office", + link: "https://www.office.com/", + modifyElement: switchChange('office', isOn)} /> + }, + { + title: "Spotify", + link: "https://www.spotify.com/", + modifyElement: switchChange('spotify', isOn)} /> + }, + { + title: "Google", + link: "https://www.google.com/", + modifyElement: switchChange('google', isOn)} /> + }, + { + title: "DuckDuckGo", + link: "https://duckduckgo.com/", + modifyElement: switchChange('duckduckgo', isOn)} /> + }, + { + title: "Cool Math Games", + link: "https://www.coolmathgames.com/", + modifyElement: switchChange('coolmathgames', isOn)} /> + }, + { + title: "SACE", + link: "https://www.sace.sa.edu.au/", + modifyElement: switchChange('sace', isOn)} /> + }, + { + title: "Google Scholar", + link: "https://scholar.google.com/", + modifyElement: switchChange('googlescholar', isOn)} /> + }, + { + title: "Gmail", + link: "https://mail.google.com/", + modifyElement: switchChange('gmail', isOn)} /> + }, + { + title: "Netflix", + link: "https://www.netflix.com/", + modifyElement: switchChange('netflix', isOn)} /> + } + ]; + + return ( +
+ {DefaultShortcuts.map((shortcut, index) => ( +
+ {shortcut.title} + {shortcut.modifyElement} +
+ ))} +
+ ); +} diff --git a/src/popup/src/vite-env.d.ts b/interface/src/vite-env.d.ts similarity index 100% rename from src/popup/src/vite-env.d.ts rename to interface/src/vite-env.d.ts diff --git a/interface/tailwind.config.js b/interface/tailwind.config.js new file mode 100644 index 00000000..1cc7babf --- /dev/null +++ b/interface/tailwind.config.js @@ -0,0 +1,22 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + darkMode: "class", + theme: { + fontSize: { + 'xs': '.65rem', + 'sm': '.775rem', + 'base': '0.65rem', // 16px + 'md': '0.65rem', // 16px + 'lg': '1rem', // 18px + 'xl': '1.25rem', // 20px + '2xl': '1.5rem', // 24px + '3xl': '1.875rem', // 30px + } + }, + plugins: [], +} + diff --git a/src/popup/tsconfig.json b/interface/tsconfig.json similarity index 100% rename from src/popup/tsconfig.json rename to interface/tsconfig.json diff --git a/src/popup/tsconfig.node.json b/interface/tsconfig.node.json similarity index 100% rename from src/popup/tsconfig.node.json rename to interface/tsconfig.node.json diff --git a/src/popup/vite.config.ts b/interface/vite.config.ts similarity index 90% rename from src/popup/vite.config.ts rename to interface/vite.config.ts index 4d2fbbab..6c98fca4 100644 --- a/src/popup/vite.config.ts +++ b/interface/vite.config.ts @@ -5,7 +5,7 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], build: { - outDir: '../../public/popup-dist', + //outDir: '../../public/popup-dist', rollupOptions: { output: { assetFileNames: 'client/rsc/[ext]/[name][extname]', diff --git a/public/manifest.json b/public/manifest.json index 254a7cde..c05fac74 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -20,8 +20,7 @@ "permissions": ["tabs", "notifications", "storage"], "host_permissions": ["https://newsapi.org/", "*://*/*"], "background": { - "content_scripts": "background.js", - "persistent": false + "service_worker": "background.js" }, "optional_permissions": ["declarativeContent"], "content_scripts": [ diff --git a/src/popup/src/App.tsx b/src/popup/src/App.tsx deleted file mode 100644 index 6f749e9f..00000000 --- a/src/popup/src/App.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import './App.css' -import Switch from './components/Switch' -import logo from './assets/betterseqta-dark-full.png' -import logoDark from './assets/betterseqta-light-full.png' -import ColorPicker from './components/ColorPicker' - -const switchChange = (isOn: boolean) => { - console.log(isOn) -} - -const settings = [ - { - title: "Notification Collector", - description: "Uncaps the 9+ limit for notifications, showing the real number.", - modifyElement: - }, - { - title: "Lesson Alerts", - description: "Sends a native browser notification ~5 minutes prior to lessons.", - modifyElement: - }, - { - title: "Animated Background", - description: "Adds an animated background to BetterSEQTA. (May impact battery life)", - modifyElement: - }, - { - title: "Animated Background Speed", - description: "Controls the speed of the animated background.", - modifyElement: - }, - { - title: "Custom Theme Colour", - description: "Customise the overall theme colour of SEQTA Learn.", - modifyElement: - }, - { - title: "BetterSEQTA+", - description: "Unlocks premium features.", - modifyElement: - } -] - -function App() { - - return ( -
-
- - -
- {settings.map((setting, index) => ( -
-
-

{setting.title}

-

{setting.description}

-
-
- {setting.modifyElement} -
-
- ))} -
- ) -} - -export default App \ No newline at end of file diff --git a/src/popup/src/components/ColorPicker.tsx b/src/popup/src/components/ColorPicker.tsx deleted file mode 100644 index 09a11fa4..00000000 --- a/src/popup/src/components/ColorPicker.tsx +++ /dev/null @@ -1,43 +0,0 @@ -// TODO: Create types for ColorPicker -// @ts-expect-error No typescript declarations available -import ColorPicker from 'react-best-gradient-color-picker'; -import { useState, useRef, useEffect } from 'react'; - -const Picker = (): JSX.Element => { - const [color, setColor] = useState('rgba(255,20,255,1)'); - const [showPicker, setShowPicker] = useState(false); - const pickerRef = useRef(null); - - useEffect(() => { - const handleClickOutside = (event: MouseEvent): void => { - if (pickerRef.current && !pickerRef.current.contains(event.target as Node)) { - setShowPicker(false); - } - }; - - document.addEventListener('mousedown', handleClickOutside); - - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - }, [pickerRef]); - - return ( -
- -
- { showPicker && - - } -
-
- ); -}; - -export default Picker; \ No newline at end of file diff --git a/src/popup/tailwind.config.js b/src/popup/tailwind.config.js deleted file mode 100644 index cf1ad7f8..00000000 --- a/src/popup/tailwind.config.js +++ /dev/null @@ -1,24 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - "./index.html", - "./src/**/*.{js,ts,jsx,tsx}", - ], - darkMode: "class", - theme: { - extend: { - colors: { - "background-primary-dark": "", - "background-primary-light": "", - "background-secondary-dark": "", - "background-secondary-light": "", - "forground-primary-dark": "", - "forground-primary-light": "", - "forground-secondary-dark": "", - "forground-secondary-light": "" - }, - }, - }, - plugins: [], -} -