From c01342a86cf627f8b66d2d9add1a7ba2d3f17c1b Mon Sep 17 00:00:00 2001 From: Aden Linday Date: Sun, 8 Mar 2026 09:18:04 +1030 Subject: [PATCH] feat: add desqta qr code instant sign in for schools without normal qr code --- package.json | 1 + src/background.ts | 27 +++ .../components/ConnectMobileApp.svelte | 183 ++++++++++++++++++ src/interface/pages/settings/general.svelte | 8 + src/manifests/manifest.json | 2 +- 5 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 src/interface/components/ConnectMobileApp.svelte diff --git a/package.json b/package.json index 6f62688c..3b184f3c 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "motion": "^12.4.12", "pdfjs-dist": "^5.4.530", "postcss": "^8.5.3", + "qrcode": "^1.5.4", "react": "17", "react-best-gradient-color-picker": "3.0.11", "react-dom": "17", diff --git a/src/background.ts b/src/background.ts index 04da8de2..22cbac7c 100644 --- a/src/background.ts +++ b/src/background.ts @@ -200,6 +200,33 @@ const MESSAGE_HANDLERS: Record = { cloudLogin: handleCloudLogin, cloudRefresh: handleCloudRefresh, cloudFavorite: handleCloudFavorite, + getSeqtaSession: (req: { baseUrl?: string }, sendResponse: MessageSender) => { + (async () => { + try { + let baseUrl = req.baseUrl; + if (!baseUrl) { + const tabs = await browser.tabs.query({ active: true, currentWindow: true }); + const tab = tabs[0]; + if (!tab?.url) { + sendResponse({ session: null }); + return; + } + baseUrl = new URL(tab.url).origin; + } + const cookies = await browser.cookies.getAll({ url: baseUrl }); + const jsession = cookies.find((c) => c.name === "JSESSIONID"); + if (jsession?.value) { + sendResponse({ session: { baseUrl, jsessionId: jsession.value } }); + } else { + sendResponse({ session: null }); + } + } catch (err) { + console.error("[Background] getSeqtaSession error:", err); + sendResponse({ session: null }); + } + })(); + return true; + }, }; browser.runtime.onMessage.addListener( diff --git a/src/interface/components/ConnectMobileApp.svelte b/src/interface/components/ConnectMobileApp.svelte new file mode 100644 index 00000000..7daaf60e --- /dev/null +++ b/src/interface/components/ConnectMobileApp.svelte @@ -0,0 +1,183 @@ + + +
+ + Download + + + {#if errorMessage} +

{errorMessage}

+ {/if} +
+ +{#if showQrModal && qrDataUrl} +
{ + if (e.target === e.currentTarget) closeModal(); + }} + onkeydown={(e) => { + if (e.key === "Escape") closeModal(); + }} + transition:fade={{ duration: 150 }}> + +
e.stopPropagation()} + onkeydown={(e) => e.stopPropagation()}> +
+

Scan with DesQTA

+ +
+
+ DesQTA QR Code +
+
+ + +
+

+ Or scan this QR code with DesQTA on your phone. +

+
+
+{/if} diff --git a/src/interface/pages/settings/general.svelte b/src/interface/pages/settings/general.svelte index 23936824..38bf0c98 100644 --- a/src/interface/pages/settings/general.svelte +++ b/src/interface/pages/settings/general.svelte @@ -10,6 +10,7 @@ import type { SettingsList } from "@/interface/types/SettingsProps" import { settingsState } from "@/seqta/utils/listeners/SettingsState.ts" import PickerSwatch from "@/interface/components/PickerSwatch.svelte" + import ConnectMobileApp from "@/interface/components/ConnectMobileApp.svelte" import { showPrivacyNotification } from "@/seqta/utils/Openers/OpenPrivacyNotification" import { closeExtensionPopup } from "@/seqta/utils/Closers/closeExtensionPopup" @@ -112,6 +113,13 @@
{#each [ + { + title: "Connect Mobile App", + description: "Link your SEQTA session to DesQTA — the modern desktop and mobile app for SEQTA Learn. Scan the QR code with DesQTA to sign in instantly.", + id: 0, + Component: ConnectMobileApp, + props: {} + }, { title: "Transparency Effects", description: "Enables transparency effects on certain elements such as blur. (May impact battery life)", diff --git a/src/manifests/manifest.json b/src/manifests/manifest.json index 40091d86..15565728 100644 --- a/src/manifests/manifest.json +++ b/src/manifests/manifest.json @@ -15,7 +15,7 @@ "64": "resources/icons/icon-64.png" } }, - "permissions": ["tabs", "notifications", "storage"], + "permissions": ["tabs", "notifications", "storage", "cookies"], "host_permissions": ["https://newsapi.org/", "https://betterseqta.org/", "https://accounts.betterseqta.org/", "*://*/*"], "background": { "service_worker": "background.ts"