diff --git a/index.html b/index.html index f3dd9a6..b43df8d 100644 --- a/index.html +++ b/index.html @@ -22,11 +22,11 @@ window.location.href = window.location.href; diff --git a/package.json b/package.json index 154b503..fca11ac 100644 --- a/package.json +++ b/package.json @@ -1,66 +1,66 @@ -{ - "name": "nebula", - "private": true, - "type": "module", - "scripts": { - "dev": "concurrently \"vite\" \"bare-server-node --port 8080\"", - "build": "vite build", - "bstart": "npm run build && tsx server.ts", - "start": "tsx server.ts", - "preview": "vite preview", - "format": "prettier --write ." - }, - "dependencies": { - "@fastify/compress": "^6.5.0", - "@fastify/cookie": "^9.3.1", - "@fastify/static": "^6.12.0", - "@mercuryworkshop/bare-mux": "^1.0.5", - "@mercuryworkshop/epoxy-transport": "^1.1.0", - "@mercuryworkshop/libcurl-transport": "^1.2.3", - "@nebula-services/dynamic": "0.7.2-patch.2", - "@titaniumnetwork-dev/ultraviolet": "^3.0.0", - "@tomphttp/bare-server-node": "2.0.3", - "@tsparticles/engine": "^3.3.0", - "@tsparticles/react": "^3.0.0", - "@tsparticles/slim": "^3.3.0", - "@types/express": "^4.17.21", - "chalk": "^5.3.0", - "classnames": "^2.5.1", - "compression": "^1.7.4", - "cookie-parser": "^1.4.6", - "crypto-js": "^4.2.0", - "express": "^4.18.3", - "fastify": "^4.26.2", - "framer-motion": "^10.18.0", - "i18next": "^23.10.1", - "i18next-browser-languagedetector": "^7.2.0", - "localforage": "^1.10.0", - "million": "^2.6.4", - "preact": "^10.19.6", - "preact-iso": "^2.4.0", - "preact-render-to-string": "^6.4.0", - "preact-router": "^4.1.2", - "rammerhead": "https://github.com/NebulaServices/rammerhead/releases/download/rammerhead-1.2.41-nebula.8/rammerhead-1.2.41-nebula.7.tgz", - "react-helmet": "^6.1.0", - "react-i18next": "^13.5.0", - "react-icons": "^4.12.0", - "react-toastify": "^9.1.3", - "tsx": "^4.7.1", - "wisp-server-node": "^1.0.2", - "ws": "^8.16.0" - }, - "devDependencies": { - "@preact/preset-vite": "^2.8.1", - "autoprefixer": "^10.4.18", - "concurrently": "^8.2.2", - "eslint": "^8.57.0", - "eslint-config-preact": "^1.3.0", - "postcss": "^8.4.35", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.12", - "tailwindcss": "^3.4.1", - "typescript": "^5.4.2", - "vite": "^5.1.6", - "vite-plugin-static-copy": "^1.0.1" - } -} +{ + "name": "nebula", + "private": true, + "type": "module", + "scripts": { + "dev": "concurrently \"vite\" \"bare-server-node --port 8080\"", + "build": "vite build", + "bstart": "npm run build && tsx server.ts", + "start": "tsx server.ts", + "preview": "vite preview", + "format": "prettier --write ." + }, + "dependencies": { + "@fastify/compress": "^6.5.0", + "@fastify/cookie": "^9.3.1", + "@fastify/static": "^6.12.0", + "@mercuryworkshop/bare-mux": "^1.0.5", + "@mercuryworkshop/epoxy-transport": "^1.1.0", + "@mercuryworkshop/libcurl-transport": "^1.2.3", + "@nebula-services/dynamic": "0.7.2-patch.2", + "@titaniumnetwork-dev/ultraviolet": "^3.0.0", + "@tomphttp/bare-server-node": "2.0.3", + "@tsparticles/engine": "^3.3.0", + "@tsparticles/react": "^3.0.0", + "@tsparticles/slim": "^3.3.0", + "@types/express": "^4.17.21", + "chalk": "^5.3.0", + "classnames": "^2.5.1", + "compression": "^1.7.4", + "cookie-parser": "^1.4.6", + "crypto-js": "^4.2.0", + "express": "^4.18.3", + "fastify": "^4.26.2", + "framer-motion": "^10.18.0", + "i18next": "^23.10.1", + "i18next-browser-languagedetector": "^7.2.0", + "localforage": "^1.10.0", + "million": "^2.6.4", + "preact": "^10.19.6", + "preact-iso": "^2.4.0", + "preact-render-to-string": "^6.4.0", + "preact-router": "^4.1.2", + "rammerhead": "https://github.com/NebulaServices/rammerhead/releases/download/rammerhead-1.2.41-nebula.8/rammerhead-1.2.41-nebula.7.tgz", + "react-helmet": "^6.1.0", + "react-i18next": "^13.5.0", + "react-icons": "^4.12.0", + "react-toastify": "^9.1.3", + "tsx": "^4.7.1", + "wisp-server-node": "^1.0.2", + "ws": "^8.16.0" + }, + "devDependencies": { + "@preact/preset-vite": "^2.8.1", + "autoprefixer": "^10.4.18", + "concurrently": "^8.2.2", + "eslint": "^8.57.0", + "eslint-config-preact": "^1.3.0", + "postcss": "^8.4.35", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.12", + "tailwindcss": "^3.4.1", + "typescript": "^5.4.2", + "vite": "^5.1.6", + "vite-plugin-static-copy": "^1.0.1" + } +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 06b3927..5314835 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -92,7 +92,7 @@ export function Home() { const handleSubmit = (event) => { event.preventDefault(); - //ensure transport is set + //ensure transport is set setTransport(); window.location.href = "/go/" + diff --git a/src/pages/Settings/transportDropdown.tsx b/src/pages/Settings/transportDropdown.tsx index 34e80e3..c50173a 100644 --- a/src/pages/Settings/transportDropdown.tsx +++ b/src/pages/Settings/transportDropdown.tsx @@ -1,76 +1,80 @@ -import { FaAngleDown } from "react-icons/fa"; -import { useState, useEffect } from "preact/hooks" -import { changeTransport } from "../../util/transports.ts"; -const wispUrl = localStorage.getItem("wispUrl") || (location.protocol === "https:" ? "wss://" : "ws://") + location.host + "/wisp/"; - -interface Option { - id: string; - label: string; // Translations CAN be passed -} - -const TransportDropdown = ({ - storageKey, - options, - refresh -}: { - storageKey: string; - options: Option[]; - refresh: boolean; -}) => { - const [isOpen, setIsOpen] = useState(false); - - const [choice, setChoice] = useState(() => { - return localStorage.getItem(storageKey) || options[0]?.id || ""; - }); - - // update on localstorage change - useEffect(() => { - setChoice(localStorage.getItem(storageKey) || options[0]?.id || ""); - }, [storageKey, options]); - - return ( -
-
setIsOpen(!isOpen)} - > -
-
-
- {options.find((o) => o.id === choice)?.label} -
-
- -
-
- {isOpen && ( -
- {options.map((option, index) => ( -
{ - setIsOpen(false); - setChoice(option.id); - localStorage.setItem(storageKey, option.id); - changeTransport(option.id, wispUrl); - if (refresh === true) { - window.location.reload(); - } - }} - > - {option.label} -
- ))} -
- )} -
-
- ); -}; - -export default TransportDropdown; +import { FaAngleDown } from "react-icons/fa"; +import { useState, useEffect } from "preact/hooks"; +import { changeTransport } from "../../util/transports.ts"; +const wispUrl = + localStorage.getItem("wispUrl") || + (location.protocol === "https:" ? "wss://" : "ws://") + + location.host + + "/wisp/"; + +interface Option { + id: string; + label: string; // Translations CAN be passed +} + +const TransportDropdown = ({ + storageKey, + options, + refresh +}: { + storageKey: string; + options: Option[]; + refresh: boolean; +}) => { + const [isOpen, setIsOpen] = useState(false); + + const [choice, setChoice] = useState(() => { + return localStorage.getItem(storageKey) || options[0]?.id || ""; + }); + + // update on localstorage change + useEffect(() => { + setChoice(localStorage.getItem(storageKey) || options[0]?.id || ""); + }, [storageKey, options]); + + return ( +
+
setIsOpen(!isOpen)} + > +
+
+
+ {options.find((o) => o.id === choice)?.label} +
+
+ +
+
+ {isOpen && ( +
+ {options.map((option, index) => ( +
{ + setIsOpen(false); + setChoice(option.id); + localStorage.setItem(storageKey, option.id); + changeTransport(option.id, wispUrl); + if (refresh === true) { + window.location.reload(); + } + }} + > + {option.label} +
+ ))} +
+ )} +
+
+ ); +}; + +export default TransportDropdown; diff --git a/src/routes.tsx b/src/routes.tsx index 625dd71..15c7498 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -14,7 +14,7 @@ import "./i18n"; import { setTransport } from "./util/transports"; export default function Routes() { - if ("serviceWorker" in navigator) { + if ("serviceWorker" in navigator) { window.addEventListener("load", () => { navigator.serviceWorker .register("/sw.js", { diff --git a/src/util/IosDetector.tsx b/src/util/IosDetector.tsx index e3741ed..d2c3a0c 100644 --- a/src/util/IosDetector.tsx +++ b/src/util/IosDetector.tsx @@ -1,7 +1,7 @@ -export function isIOS() { - if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { - return true; - } else { - return false; - } -} +export function isIOS() { + if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { + return true; + } else { + return false; + } +} diff --git a/src/util/SWHelper.js b/src/util/SWHelper.js index a89eba5..8722008 100644 --- a/src/util/SWHelper.js +++ b/src/util/SWHelper.js @@ -19,16 +19,16 @@ function uninstallServiceWorkers() { } function registerServiceWorker() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker - .register("/sw.js", { - scope: "/~/" - }) - .then(() => { - console.log("Service worker registered successfully"); - setTransport(); - }); - } + if ("serviceWorker" in navigator) { + navigator.serviceWorker + .register("/sw.js", { + scope: "/~/" + }) + .then(() => { + console.log("Service worker registered successfully"); + setTransport(); + }); + } } export { updateServiceWorkers, uninstallServiceWorkers, registerServiceWorker }; diff --git a/src/util/transports.ts b/src/util/transports.ts index 48cf10b..7850340 100644 --- a/src/util/transports.ts +++ b/src/util/transports.ts @@ -61,7 +61,7 @@ registerRemoteListener(navigator.serviceWorker.controller!); //changeTransport( // localStorage.getItem("transport") || "libcurl", -// localStorage.getItem("wispUrl") || wispUrl +// localStorage.getItem("wispUrl") || wispUrl //); // helper function for ../routes.tsx