From 9c3f52fa18abeee7492c571f625c7c4a21c830b0 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Sat, 16 Sep 2023 20:41:05 +1000 Subject: [PATCH 1/5] remove popup from prod (as its in alpha dev) --- interface/.eslintrc.cjs | 18 ---- interface/.gitignore | 24 ----- interface/README.md | 27 ----- interface/bun.lockb | Bin 109500 -> 0 bytes interface/index.html | 13 --- interface/package.json | 33 ------ interface/postcss.config.js | 6 -- interface/public/vite.svg | 1 - interface/src/App.css | 0 interface/src/App.tsx | 75 -------------- .../src/assets/betterseqta-dark-full.png | Bin 10636 -> 0 bytes .../src/assets/betterseqta-light-full.png | Bin 10453 -> 0 bytes interface/src/assets/react.svg | 1 - interface/src/components/ColorPicker.tsx | 45 --------- interface/src/components/Slider.css | 21 ---- interface/src/components/Slider.tsx | 35 ------- interface/src/components/Switch.css | 3 - interface/src/components/Switch.tsx | 36 ------- interface/src/components/TabbedContainer.tsx | 92 ----------------- interface/src/index.css | 13 --- interface/src/main.tsx | 10 -- interface/src/pages/About.tsx | 10 -- interface/src/pages/Settings.tsx | 68 ------------- interface/src/pages/Shortcuts.tsx | 95 ------------------ interface/src/vite-env.d.ts | 1 - interface/tailwind.config.js | 22 ---- interface/tsconfig.json | 25 ----- interface/tsconfig.node.json | 10 -- interface/vite.config.ts | 17 ---- 29 files changed, 701 deletions(-) delete mode 100644 interface/.eslintrc.cjs delete mode 100644 interface/.gitignore delete mode 100644 interface/README.md delete mode 100755 interface/bun.lockb delete mode 100644 interface/index.html delete mode 100644 interface/package.json delete mode 100644 interface/postcss.config.js delete mode 100644 interface/public/vite.svg delete mode 100644 interface/src/App.css delete mode 100644 interface/src/App.tsx delete mode 100644 interface/src/assets/betterseqta-dark-full.png delete mode 100644 interface/src/assets/betterseqta-light-full.png delete mode 100644 interface/src/assets/react.svg delete mode 100644 interface/src/components/ColorPicker.tsx delete mode 100644 interface/src/components/Slider.css delete mode 100644 interface/src/components/Slider.tsx delete mode 100644 interface/src/components/Switch.css delete mode 100644 interface/src/components/Switch.tsx delete mode 100644 interface/src/components/TabbedContainer.tsx delete mode 100644 interface/src/index.css delete mode 100644 interface/src/main.tsx delete mode 100644 interface/src/pages/About.tsx delete mode 100644 interface/src/pages/Settings.tsx delete mode 100644 interface/src/pages/Shortcuts.tsx delete mode 100644 interface/src/vite-env.d.ts delete mode 100644 interface/tailwind.config.js delete mode 100644 interface/tsconfig.json delete mode 100644 interface/tsconfig.node.json delete mode 100644 interface/vite.config.ts diff --git a/interface/.eslintrc.cjs b/interface/.eslintrc.cjs deleted file mode 100644 index d6c95379..00000000 --- a/interface/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/interface/.gitignore b/interface/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/interface/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/interface/README.md b/interface/README.md deleted file mode 100644 index 1ebe379f..00000000 --- a/interface/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: - -- Configure the top-level `parserOptions` property like this: - -```js - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - project: ['./tsconfig.json', './tsconfig.node.json'], - tsconfigRootDir: __dirname, - }, -``` - -- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` -- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/interface/bun.lockb b/interface/bun.lockb deleted file mode 100755 index b124928df54836849e219b0cde0e2ea9b3a23dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109500 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 diff --git a/interface/index.html b/interface/index.html deleted file mode 100644 index feec9812..00000000 --- a/interface/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/interface/package.json b/interface/package.json deleted file mode 100644 index 9800ac8a..00000000 --- a/interface/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "popup", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "framer-motion": "^10.16.4", - "react": "^18.2.0", - "react-best-gradient-color-picker": "^2.2.22", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.15", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.29", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } -} diff --git a/interface/postcss.config.js b/interface/postcss.config.js deleted file mode 100644 index 2e7af2b7..00000000 --- a/interface/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/interface/public/vite.svg b/interface/public/vite.svg deleted file mode 100644 index e7b8dfb1..00000000 --- a/interface/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/src/App.css b/interface/src/App.css deleted file mode 100644 index e69de29b..00000000 diff --git a/interface/src/App.tsx b/interface/src/App.tsx deleted file mode 100644 index b0b4872e..00000000 --- a/interface/src/App.tsx +++ /dev/null @@ -1,75 +0,0 @@ -// 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/interface/src/assets/betterseqta-dark-full.png b/interface/src/assets/betterseqta-dark-full.png deleted file mode 100644 index f2c77f4940d4b5cd9044d2b009a6bc41dd6f6ad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10636 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 ZO!LFltV(;B?aIG?P+eE;)s4F${|my1+)Mxf diff --git a/interface/src/assets/react.svg b/interface/src/assets/react.svg deleted file mode 100644 index 6c87de9b..00000000 --- a/interface/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/interface/src/components/ColorPicker.tsx b/interface/src/components/ColorPicker.tsx deleted file mode 100644 index 84bd298d..00000000 --- a/interface/src/components/ColorPicker.tsx +++ /dev/null @@ -1,45 +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'; - -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/interface/src/components/Slider.css b/interface/src/components/Slider.css deleted file mode 100644 index ee7b1c0b..00000000 --- a/interface/src/components/Slider.css +++ /dev/null @@ -1,21 +0,0 @@ -.range-slider{ - margin: 20px; - appearance: none; - outline: none; - width: 150px; - height: 3px; - border-radius: 5px; - background-color: #ccc; -} - -.range-slide::-webkit-slider-runnable-track{ - background-color: #4BD663 !important; -} -.range-slider::-webkit-slider-thumb { - background: #fafafa; - appearance: none; - box-shadow: 1px 2px 26px 1px #bdbdbd; - width: 15px; - height: 15px; - border-radius: 50%; -} \ No newline at end of file diff --git a/interface/src/components/Slider.tsx b/interface/src/components/Slider.tsx deleted file mode 100644 index 664d357d..00000000 --- a/interface/src/components/Slider.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useState } from 'react'; -import "./Slider.css"; - -interface Slider { - onValueChange: (value: number) => void; -} - -const Slider: React.FC = ({ onValueChange }) => { - const [sliderValue, setSliderValue] = useState(0); - - const handleInputChange = (event: React.ChangeEvent) => { - const value = parseInt(event.target.value, 10); - setSliderValue(value); - }; - - const handleMouseUp = () => { - onValueChange(sliderValue); - }; - - return ( -
- -
- ); -}; - -export default Slider; \ No newline at end of file diff --git a/interface/src/components/Switch.css b/interface/src/components/Switch.css deleted file mode 100644 index d7e84449..00000000 --- a/interface/src/components/Switch.css +++ /dev/null @@ -1,3 +0,0 @@ -.switch[data-ison="true"] { - background-color: #30D259; -} \ No newline at end of file diff --git a/interface/src/components/Switch.tsx b/interface/src/components/Switch.tsx deleted file mode 100644 index 62dacfec..00000000 --- a/interface/src/components/Switch.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { motion } from "framer-motion"; -import "./Switch.css"; - -interface SwitchProps { - onChange: (isOn: boolean) => void; - state: boolean; -} - -export default function Switch(props: SwitchProps) { - const toggleSwitch = () => { - const newIsOn = !props.state; - props.onChange(newIsOn); - }; - - return ( -
- -
- ); -} - -const spring = { - type: "spring", - stiffness: 700, - damping: 30 -}; \ No newline at end of file diff --git a/interface/src/components/TabbedContainer.tsx b/interface/src/components/TabbedContainer.tsx deleted file mode 100644 index 91df24dd..00000000 --- a/interface/src/components/TabbedContainer.tsx +++ /dev/null @@ -1,92 +0,0 @@ -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/interface/src/index.css b/interface/src/index.css deleted file mode 100644 index b2d789e1..00000000 --- a/interface/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} \ No newline at end of file diff --git a/interface/src/main.tsx b/interface/src/main.tsx deleted file mode 100644 index c750850e..00000000 --- a/interface/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' - -ReactDOM.createRoot(document.getElementById('ExtensionPopup')!).render( - - - , -) diff --git a/interface/src/pages/About.tsx b/interface/src/pages/About.tsx deleted file mode 100644 index 53197a2a..00000000 --- a/interface/src/pages/About.tsx +++ /dev/null @@ -1,10 +0,0 @@ -const About: React.FC = () => { - - return ( -
-

About

-
- ); -}; - -export default About; diff --git a/interface/src/pages/Settings.tsx b/interface/src/pages/Settings.tsx deleted file mode 100644 index 71a13851..00000000 --- a/interface/src/pages/Settings.tsx +++ /dev/null @@ -1,68 +0,0 @@ -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 deleted file mode 100644 index 7400df6a..00000000 --- a/interface/src/pages/Shortcuts.tsx +++ /dev/null @@ -1,95 +0,0 @@ -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/interface/src/vite-env.d.ts b/interface/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/interface/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/interface/tailwind.config.js b/interface/tailwind.config.js deleted file mode 100644 index 1cc7babf..00000000 --- a/interface/tailwind.config.js +++ /dev/null @@ -1,22 +0,0 @@ -/** @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/interface/tsconfig.json b/interface/tsconfig.json deleted file mode 100644 index a7fc6fbf..00000000 --- a/interface/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/interface/tsconfig.node.json b/interface/tsconfig.node.json deleted file mode 100644 index 42872c59..00000000 --- a/interface/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/interface/vite.config.ts b/interface/vite.config.ts deleted file mode 100644 index 6c98fca4..00000000 --- a/interface/vite.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - build: { - //outDir: '../../public/popup-dist', - rollupOptions: { - output: { - assetFileNames: 'client/rsc/[ext]/[name][extname]', - chunkFileNames: 'client/rsc/[chunks]/[name].[hash].js', - entryFileNames: 'client/rsc/js/client.js' - } - } - } -}) From 62e46c51f657b814531cd8d58760e967e40033a7 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Tue, 19 Sep 2023 10:18:31 +1000 Subject: [PATCH 2/5] updates --- interface/src/App.css | 0 interface/src/App.tsx | 72 +++++++++++++ .../src/assets/betterseqta-dark-full.png | Bin 0 -> 10636 bytes .../src/assets/betterseqta-light-full.png | Bin 0 -> 10453 bytes interface/src/assets/react.svg | 1 + interface/src/components/ColorPicker.tsx | 45 +++++++++ interface/src/components/Slider.css | 21 ++++ interface/src/components/Slider.tsx | 35 +++++++ interface/src/components/Switch.css | 3 + interface/src/components/Switch.tsx | 36 +++++++ interface/src/components/TabbedContainer.tsx | 92 +++++++++++++++++ interface/src/index.css | 13 +++ interface/src/main.tsx | 12 +++ interface/src/pages/About.tsx | 20 ++++ interface/src/pages/Settings.tsx | 68 +++++++++++++ interface/src/pages/Shortcuts.tsx | 95 ++++++++++++++++++ interface/src/vite-env.d.ts | 1 + src/inject/iframe.css | 4 + src/inject/injected.css | 28 ------ 19 files changed, 518 insertions(+), 28 deletions(-) create mode 100644 interface/src/App.css create mode 100644 interface/src/App.tsx create mode 100644 interface/src/assets/betterseqta-dark-full.png create mode 100644 interface/src/assets/betterseqta-light-full.png create mode 100644 interface/src/assets/react.svg create mode 100644 interface/src/components/ColorPicker.tsx create mode 100644 interface/src/components/Slider.css create mode 100644 interface/src/components/Slider.tsx create mode 100644 interface/src/components/Switch.css create mode 100644 interface/src/components/Switch.tsx create mode 100644 interface/src/components/TabbedContainer.tsx create mode 100644 interface/src/index.css create mode 100644 interface/src/main.tsx create mode 100644 interface/src/pages/About.tsx create mode 100644 interface/src/pages/Settings.tsx create mode 100644 interface/src/pages/Shortcuts.tsx create mode 100644 interface/src/vite-env.d.ts diff --git a/interface/src/App.css b/interface/src/App.css new file mode 100644 index 00000000..e69de29b diff --git a/interface/src/App.tsx b/interface/src/App.tsx new file mode 100644 index 00000000..ea173fd1 --- /dev/null +++ b/interface/src/App.tsx @@ -0,0 +1,72 @@ +// 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/interface/src/assets/betterseqta-dark-full.png b/interface/src/assets/betterseqta-dark-full.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c77f4940d4b5cd9044d2b009a6bc41dd6f6ad5 GIT binary patch literal 10636 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 ZO!LFltV(;B?aIG?P+eE;)s4F${|my1+)Mxf literal 0 HcmV?d00001 diff --git a/interface/src/assets/react.svg b/interface/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/interface/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file 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/interface/src/components/Slider.css b/interface/src/components/Slider.css new file mode 100644 index 00000000..ee7b1c0b --- /dev/null +++ b/interface/src/components/Slider.css @@ -0,0 +1,21 @@ +.range-slider{ + margin: 20px; + appearance: none; + outline: none; + width: 150px; + height: 3px; + border-radius: 5px; + background-color: #ccc; +} + +.range-slide::-webkit-slider-runnable-track{ + background-color: #4BD663 !important; +} +.range-slider::-webkit-slider-thumb { + background: #fafafa; + appearance: none; + box-shadow: 1px 2px 26px 1px #bdbdbd; + width: 15px; + height: 15px; + border-radius: 50%; +} \ No newline at end of file diff --git a/interface/src/components/Slider.tsx b/interface/src/components/Slider.tsx new file mode 100644 index 00000000..664d357d --- /dev/null +++ b/interface/src/components/Slider.tsx @@ -0,0 +1,35 @@ +import React, { useState } from 'react'; +import "./Slider.css"; + +interface Slider { + onValueChange: (value: number) => void; +} + +const Slider: React.FC = ({ onValueChange }) => { + const [sliderValue, setSliderValue] = useState(0); + + const handleInputChange = (event: React.ChangeEvent) => { + const value = parseInt(event.target.value, 10); + setSliderValue(value); + }; + + const handleMouseUp = () => { + onValueChange(sliderValue); + }; + + return ( +
+ +
+ ); +}; + +export default Slider; \ No newline at end of file diff --git a/interface/src/components/Switch.css b/interface/src/components/Switch.css new file mode 100644 index 00000000..d7e84449 --- /dev/null +++ b/interface/src/components/Switch.css @@ -0,0 +1,3 @@ +.switch[data-ison="true"] { + background-color: #30D259; +} \ No newline at end of file diff --git a/interface/src/components/Switch.tsx b/interface/src/components/Switch.tsx new file mode 100644 index 00000000..62dacfec --- /dev/null +++ b/interface/src/components/Switch.tsx @@ -0,0 +1,36 @@ +import { motion } from "framer-motion"; +import "./Switch.css"; + +interface SwitchProps { + onChange: (isOn: boolean) => void; + state: boolean; +} + +export default function Switch(props: SwitchProps) { + const toggleSwitch = () => { + const newIsOn = !props.state; + props.onChange(newIsOn); + }; + + return ( +
+ +
+ ); +} + +const spring = { + type: "spring", + stiffness: 700, + damping: 30 +}; \ No newline at end of file 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/interface/src/index.css b/interface/src/index.css new file mode 100644 index 00000000..b2d789e1 --- /dev/null +++ b/interface/src/index.css @@ -0,0 +1,13 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} \ No newline at end of file diff --git a/interface/src/main.tsx b/interface/src/main.tsx new file mode 100644 index 00000000..be55245f --- /dev/null +++ b/interface/src/main.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' + +const root = ReactDOM.createRoot(document.getElementById('ExtensionPopup')!); + +root.render( + + + , +) diff --git a/interface/src/pages/About.tsx b/interface/src/pages/About.tsx new file mode 100644 index 00000000..ffeca441 --- /dev/null +++ b/interface/src/pages/About.tsx @@ -0,0 +1,20 @@ +const About: React.FC = () => { + + return ( +
+
+

About

+

BetterSEQTA+ is a branch of BetterSEQTA which was originally developed by Nulkem. It was discontinued. So BetterSEQTA+ has come in to fill in that gap!

+

We are currently working on fixing bugs and adding new features. If you want to request a feature or report a bug, you can do so on + Github. +

+
+
+

Credits

+

Nulkem for the original extension, OG-RandomTechChannel, Crazypersonalph, and the current maintainer SethBurkart123

+
+
+ ); +}; + +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/interface/src/vite-env.d.ts b/interface/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/interface/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/inject/iframe.css b/src/inject/iframe.css index 3675acb6..cb4516ae 100644 --- a/src/inject/iframe.css +++ b/src/inject/iframe.css @@ -51,6 +51,10 @@ table th { background-color: transparent; } +::-webkit-scrollbar-thumb { + border-radius: 10rem !important; +} + ::-webkit-scrollbar-corner { background: none; } diff --git a/src/inject/injected.css b/src/inject/injected.css index 5d943129..6622755a 100644 --- a/src/inject/injected.css +++ b/src/inject/injected.css @@ -1,28 +1,3 @@ -/* // This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . */ -/* // This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . */ - @import url("https://fonts.googleapis.com/css?family=Rubik:300,400,500,600"); @import "./injected/popup.css"; @@ -368,9 +343,6 @@ ol:has(.MessageList__avatar___2wxyb svg) { -webkit-box-shadow: 0px 5px 16px 6px rgba(0, 0, 0, 0.2) !important; box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2) !important; } -#main .timetablepage { - padding-top: 10px; -} #main .timetablepage .quickbar { border: none; From 8c652fe0f0bfbe8179972975e0e16528a1bbe421 Mon Sep 17 00:00:00 2001 From: Seth Burkart <108050083+SethBurkart123@users.noreply.github.com> Date: Tue, 19 Sep 2023 20:44:56 +1000 Subject: [PATCH 3/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95752f8e..a8494cf0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Logo](https://raw.githubusercontent.com/SethBurkart123/EvenBetterSEQTA/master/public/icons/betterseqta-dark-full.png#gh-light-mode-only)

- A beautiful 🤩 Chrome Extension that adds additional features and gives an overall better experience for [SEQTA Learn](https://seqta.com.au/). **Currently looking for contributors** 🔥 + A beautiful 🤩 Chrome Extension that adds additional features and gives an overall better experience for [SEQTA Learn.](https://seqta.com.au/) **Currently looking for contributors** 🔥

From 2a37f1363b01c06242888579c76315eb1a575461 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 25 Sep 2023 09:42:16 +1000 Subject: [PATCH 4/5] fix custom shortcuts not showing up --- src/SEQTA.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/SEQTA.js b/src/SEQTA.js index a8f3f832..3563adf2 100644 --- a/src/SEQTA.js +++ b/src/SEQTA.js @@ -3026,15 +3026,24 @@ function SendHomePage() { // Adds the shortcuts to the shortcut container chrome.storage.local.get(["shortcuts"], function (result) { var shortcuts = Object.values(result)[0]; + for (let i = 0; i < shortcuts.length; i++) { - if (shortcuts[i].enabled) { - let Itemname = shortcuts[i].name.replace(/ /g, ""); - createNewShortcut( - ShortcutLinks[Itemname].link, - ShortcutLinks[Itemname].icon, - ShortcutLinks[Itemname].viewBox, - shortcuts[i].name, - ); + const currentShortcut = shortcuts[i]; + + if (currentShortcut?.enabled) { + const Itemname = currentShortcut?.name; + + const linkDetails = ShortcutLinks?.[Itemname]; + if (linkDetails) { + createNewShortcut( + linkDetails.link, + linkDetails.icon, + linkDetails.viewBox, + Itemname + ); + } else { + console.warn(`No link details found for '${Itemname}'`); + } } } AddCustomShortcutsToPage(); From 5dedea8bb7097bd5f39a7bd1255ef7533af89799 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 25 Sep 2023 09:51:02 +1000 Subject: [PATCH 5/5] fix centering custom shortcut icons --- src/SEQTA.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/SEQTA.js b/src/SEQTA.js index 3563adf2..bba0925b 100644 --- a/src/SEQTA.js +++ b/src/SEQTA.js @@ -2870,7 +2870,21 @@ function CreateCustomShortcutDiv(element) { shortcutdiv.classList.add("customshortcut"); let image = stringToHTML( - `${element.icon}`, + ` + + + ${element.icon} + + + `, ).firstChild; image.classList.add("shortcuticondiv"); var text = document.createElement("p");