From db667ca3f619fd2815a421e2ebdec28d813766e3 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Wed, 4 Sep 2024 15:14:33 +0200 Subject: [PATCH 001/177] feat: init /announcements route + update dependecies + add types + add components --- package-lock.json | 74 +++++++++++++------ package.json | 7 +- src/data/api/index.ts | 67 +++++++++++++---- src/data/api/settings.ts | 20 ++++- .../Announcements/AnnouncementCard.svelte | 28 +++++++ src/layout/Announcements/CardsList.svelte | 31 ++++++++ src/layout/Announcements/ChannelChip.svelte | 38 ++++++++++ src/layout/Footer/FooterHost.svelte | 2 +- src/layout/Hero/SocialHost.svelte | 2 +- src/layout/Navbar/NavButton.svelte | 4 +- src/layout/Navbar/NavHost.svelte | 4 + src/lib/types.ts | 14 ++++ src/routes/announcements/+page.svelte | 10 +++ src/routes/contributors/+page.svelte | 2 +- src/routes/donate/+page.svelte | 4 +- src/routes/download/+page.svelte | 2 +- src/routes/patches/+page.svelte | 2 +- 17 files changed, 263 insertions(+), 48 deletions(-) create mode 100644 src/layout/Announcements/AnnouncementCard.svelte create mode 100644 src/layout/Announcements/CardsList.svelte create mode 100644 src/layout/Announcements/ChannelChip.svelte create mode 100644 src/routes/announcements/+page.svelte diff --git a/package-lock.json b/package-lock.json index 906a93bf..ede3a122 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,9 @@ "@tanstack/query-core": "^4.36.1", "@tanstack/query-persist-client-core": "^4.36.1", "@tanstack/query-sync-storage-persister": "^4.36.1", - "@tanstack/svelte-query": "^4.36.1" + "@tanstack/svelte-query": "^5.54.1", + "datetrigger": "^1.1.1", + "moment": "^2.30.1" }, "devDependencies": { "@sveltejs/adapter-static": "3.0.2", @@ -19,7 +21,7 @@ "@sveltejs/vite-plugin-svelte": "3.1.1", "@typescript-eslint/eslint-plugin": "7.16.0", "@typescript-eslint/parser": "7.16.0", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "2.42.0", "fuse.js": "^7.0.0", @@ -30,7 +32,7 @@ "sass": "1.77.8", "semver": "7.6.2", "sirv-cli": "^2.0.2", - "svelte": "4.2.18", + "svelte": "^4.2.19", "svelte-check": "3.8.4", "svelte-meta-tags": "3.1.2", "tslib": "2.6.3", @@ -532,10 +534,11 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1521,19 +1524,29 @@ } }, "node_modules/@tanstack/svelte-query": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/@tanstack/svelte-query/-/svelte-query-4.36.1.tgz", - "integrity": "sha512-5fj79QuAu5HuS6G/fairU6ywgILXfs4TGl3+Xc9+MBlmB1aPoQBvGsgJrNyhqvXQcnxro8wDNyZOH8S+Qitycw==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@tanstack/svelte-query/-/svelte-query-5.54.1.tgz", + "integrity": "sha512-Vf2tkXj6a23gxm+vduzkm1anqH1rxj9HcYen1v9yNAzMAmBkWgGh5pcOTTj0D4Vdz1YpiP4RdbWAqlkPvHE17g==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "4.36.1" + "@tanstack/query-core": "5.54.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "svelte": ">=3 <5" + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/@tanstack/svelte-query/node_modules/@tanstack/query-core": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.54.1.tgz", + "integrity": "sha512-hKS+WRpT5zBFip21pB6Jx1C0hranWQrbv5EJ7qPoiV5MYI3C8rTCqWC9DdBseiPT1JgQWh8Y55YthuYZNiw3Xw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@types/cookie": { @@ -2083,6 +2096,13 @@ "node": ">=4" } }, + "node_modules/datetrigger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/datetrigger/-/datetrigger-1.1.1.tgz", + "integrity": "sha512-SGKQEQO0xqBxDwtpY/qViOpUbN3L3Jr27ZHm1AQ/fQlXLtiFbdKsdwMSEW/reIjWLaNn9R/40to2tM3xibbBRA==", + "hasInstallScript": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2232,16 +2252,17 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3039,9 +3060,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -3098,6 +3119,15 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3862,9 +3892,9 @@ } }, "node_modules/svelte": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.18.tgz", - "integrity": "sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==", + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", + "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", diff --git a/package.json b/package.json index 73efcc8d..1d275ab9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "sass": "1.77.8", "semver": "7.6.2", "sirv-cli": "^2.0.2", - "svelte": "4.2.18", + "svelte": "^4.2.19", "svelte-check": "3.8.4", "svelte-meta-tags": "3.1.2", "tslib": "2.6.3", @@ -42,7 +42,8 @@ "@tanstack/query-core": "^4.36.1", "@tanstack/query-persist-client-core": "^4.36.1", "@tanstack/query-sync-storage-persister": "^4.36.1", - "@tanstack/svelte-query": "^4.36.1", - "datetrigger": "^1.1.1" + "@tanstack/svelte-query": "^5.54.1", + "datetrigger": "^1.1.1", + "moment": "^2.30.1" } } diff --git a/src/data/api/index.ts b/src/data/api/index.ts index 0bfdd918..25b91ea2 100644 --- a/src/data/api/index.ts +++ b/src/data/api/index.ts @@ -10,7 +10,8 @@ import type { CryptoWallet, Social, About, - CompatiblePackage + CompatiblePackage, + Announcement } from '$lib/types'; export type ContributorsData = { contributables: Contributable[] }; @@ -20,10 +21,14 @@ export type TeamData = { members: TeamMember[] }; export type AboutData = { about: About }; export type DonationData = { wallets: CryptoWallet[]; platforms: DonationPlatform[] }; export type SocialsData = { socials: Social[] }; +export type AnnouncementsData = { announcements: Announcement[] }; + +function build_url(endpoint: string) { + return `${settings.api_base_url()}/${endpoint}`; +} async function get_json(endpoint: string) { - const url = `${settings.api_base_url()}/${endpoint}`; - return await fetch(url).then((r) => r.json()); + return await fetch(build_url(endpoint)).then((r) => r.json()); } async function contributors(): Promise { @@ -65,31 +70,67 @@ async function about(): Promise { return { about: json }; } +async function announcements(channel?: string): Promise { + // const json = await get_json(channel ? `v3/announcements/${channel}` : 'v3/announcements'); + // return { announcements: json.reverse() }; + return { + announcements: [ + { + author: 'madkarmaa', + channel: 'test', + content: 'test content', + createdAt: { + value: '2024-09-03T15:53:01.532Z' + }, + id: 69, + level: 69, + title: 'test title' + }, + { + author: 'balls', + channel: 'test2', + content: 'test content 2', + createdAt: { + value: '2024-09-03T15:54:31.912Z' + }, + id: 420, + level: 420, + title: 'test title 2' + } + ] + }; +} + export const staleTime = 5 * 60 * 1000; export const queries = { - manager: { + manager: () => ({ queryKey: ['manager'], queryFn: manager, staleTime - }, - patches: { + }), + patches: () => ({ queryKey: ['patches'], queryFn: patches, staleTime - }, - contributors: { + }), + contributors: () => ({ queryKey: ['contributors'], queryFn: contributors, staleTime - }, - team: { + }), + team: () => ({ queryKey: ['team'], queryFn: team, staleTime - }, - about: { + }), + about: () => ({ queryKey: ['info'], queryFn: about, staleTime - } + }), + announcements: (channel?: string) => ({ + queryKey: ['announcements'], + queryFn: () => announcements(channel), + staleTime + }) }; diff --git a/src/data/api/settings.ts b/src/data/api/settings.ts index 1e50660a..b8b045f4 100644 --- a/src/data/api/settings.ts +++ b/src/data/api/settings.ts @@ -14,7 +14,7 @@ export function api_base_url(): string { return default_base_url; } -// (re)set base URL. +// (Re)set base URL. export function set_api_base_url(url?: string) { if (!url) { localStorage.removeItem(URL_KEY); @@ -22,3 +22,21 @@ export function set_api_base_url(url?: string) { localStorage.setItem(URL_KEY, url); } } + +// Get access token. +export function get_access_token(): string | null { + if (browser) { + return localStorage.getItem('revanced_api_access_token'); + } + + return null; +} + +// Set access token. +export function set_access_token(token?: string) { + if (!token) { + localStorage.removeItem('revanced_api_access_token'); + } else { + localStorage.setItem('revanced_api_access_token', token); + } +} diff --git a/src/layout/Announcements/AnnouncementCard.svelte b/src/layout/Announcements/AnnouncementCard.svelte new file mode 100644 index 00000000..84e85b85 --- /dev/null +++ b/src/layout/Announcements/AnnouncementCard.svelte @@ -0,0 +1,28 @@ + + +
+ thumbnail +

{title}

+

+ by + + {author} + , + {moment(created_at).fromNow()} +

+ {#if $$slots.channel} +
+ {/if} + +
+ + diff --git a/src/layout/Announcements/CardsList.svelte b/src/layout/Announcements/CardsList.svelte new file mode 100644 index 00000000..ec5801bf --- /dev/null +++ b/src/layout/Announcements/CardsList.svelte @@ -0,0 +1,31 @@ + + +
+ + {#each data.announcements as ann (ann.id)} + + + + + + {/each} + +
+ + diff --git a/src/layout/Announcements/ChannelChip.svelte b/src/layout/Announcements/ChannelChip.svelte new file mode 100644 index 00000000..3ed5dc29 --- /dev/null +++ b/src/layout/Announcements/ChannelChip.svelte @@ -0,0 +1,38 @@ + + + + + diff --git a/src/layout/Footer/FooterHost.svelte b/src/layout/Footer/FooterHost.svelte index 695d551b..7f95ffee 100644 --- a/src/layout/Footer/FooterHost.svelte +++ b/src/layout/Footer/FooterHost.svelte @@ -8,7 +8,7 @@ import Query from '$lib/components/Query.svelte'; import FooterSection from './FooterSection.svelte'; - const aboutQuery = createQuery(['about'], queries.about); + const aboutQuery = createQuery(queries.about()); diff --git a/src/layout/Hero/SocialHost.svelte b/src/layout/Hero/SocialHost.svelte index c848fedd..7df26a57 100644 --- a/src/layout/Hero/SocialHost.svelte +++ b/src/layout/Hero/SocialHost.svelte @@ -4,7 +4,7 @@ import { createQuery } from '@tanstack/svelte-query'; import Query from '$lib/components/Query.svelte'; - const aboutQuery = createQuery(['about'], queries.about); + const aboutQuery = createQuery(queries.about());
- +
+
From f1365dd1cd513f56a1f0705821521e2634b30ad0 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Tue, 24 Sep 2024 09:16:56 +0200 Subject: [PATCH 031/177] chore: update dependencies to fix vulnerability --- package-lock.json | 172 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 89 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44556157..50daa32c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "svelte-meta-tags": "3.1.2", "tslib": "2.6.3", "typescript": "5.5.3", - "vite": "5.3.3", + "vite": "^5.4.7", "vite-imagetools": "7.0.4" } }, @@ -1180,9 +1180,9 @@ "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -1194,9 +1194,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -1208,9 +1208,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -1222,9 +1222,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -1236,9 +1236,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -1250,9 +1250,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -1264,9 +1264,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -1278,9 +1278,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -1292,9 +1292,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -1306,9 +1306,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -1320,9 +1320,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -1334,9 +1334,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -1348,9 +1348,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -1362,9 +1362,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -1376,9 +1376,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -1390,9 +1390,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -3291,9 +3291,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, "license": "ISC" }, @@ -3310,9 +3310,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -3331,8 +3331,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3542,9 +3542,9 @@ } }, "node_modules/rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3558,22 +3558,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -3825,9 +3825,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -4166,15 +4166,15 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -4193,6 +4193,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -4210,6 +4211,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, diff --git a/package.json b/package.json index 80c22663..3da0d750 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "svelte-meta-tags": "3.1.2", "tslib": "2.6.3", "typescript": "5.5.3", - "vite": "5.3.3", + "vite": "^5.4.7", "vite-imagetools": "7.0.4" }, "type": "module", From d520d18ea83c1d8987fc6136f8580614a4decf3f Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Tue, 24 Sep 2024 09:41:11 +0200 Subject: [PATCH 032/177] refactor: remove card banner --- src/routes/announcements/AnnouncementCard.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index a99231e3..d452e3bb 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -40,9 +40,9 @@ {#if isRead !== undefined && !isRead} {/if} - {#if announcement.attachmentUrls} +

{announcement.title}

@@ -110,10 +110,10 @@ } } - img { + /* img { width: 100%; border-radius: 12px 12px 0px 0px; - } + } */ button { background-color: transparent; From ca8365f18f2de78df3828e5bebcc227d710aecc6 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Tue, 24 Sep 2024 10:11:02 +0200 Subject: [PATCH 033/177] feat: init login functionality in dom --- src/layout/Navbar/NavHost.svelte | 23 ++++++++++++++++++++++- src/lib/auth.ts | 6 ++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/layout/Navbar/NavHost.svelte b/src/layout/Navbar/NavHost.svelte index 70d41b85..fed3e872 100644 --- a/src/layout/Navbar/NavHost.svelte +++ b/src/layout/Navbar/NavHost.svelte @@ -40,8 +40,17 @@ url = settings.default_base_url; } + function handleLogin(e: SubmitEvent) { + const { username, password } = e.target as HTMLFormElement; + console.log(username, password); + // login(username.value, password.value).then(() => { + // loginModalOpen = false; + // }); + } + let menuOpen = false; let modalOpen = false; + let loginModalOpen = false; let y: number; onMount(() => { @@ -134,7 +143,9 @@
- +
@@ -143,6 +154,16 @@ + + + + diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index d452e3bb..31381c1d 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -2,10 +2,10 @@ import moment from 'moment'; import { onMount } from 'svelte'; - import Svg from '$lib/components/Svg.svelte'; - import Dialogue from '$lib/components/Dialogue.svelte'; import type { Announcement } from '$lib/types'; import UnreadDot from './UnreadDot.svelte'; + import ChannelChip from './ChannelChip.svelte'; + import ChannelsHost from './ChannelsHost.svelte'; export let announcement: Announcement; @@ -36,105 +36,94 @@ -
- {#if isRead !== undefined && !isRead} - - {/if} - -
-
-

{announcement.title}

- - - - - - - - Author avatar - - {announcement.title} - - - - + diff --git a/src/routes/announcements/ChannelChip.svelte b/src/routes/announcements/ChannelChip.svelte index 78f3d3ff..e660b84a 100644 --- a/src/routes/announcements/ChannelChip.svelte +++ b/src/routes/announcements/ChannelChip.svelte @@ -3,25 +3,26 @@ import { derived, readable, type Readable } from 'svelte/store'; import { building } from '$app/environment'; import { page } from '$app/stores'; + import Svg from '$lib/components/Svg.svelte'; export let channel: string; + export let clickable: boolean = true; + let searchParams: Readable; if (building) searchParams = readable(new URLSearchParams()); else searchParams = derived(page, ($page) => $page.url.searchParams); - $: selected = $searchParams.get('channel') === channel; + $: selected = $searchParams.getAll('channel').includes(channel); const handleClick = () => { const url = new URL(window.location.href); const params = new URLSearchParams(url.search); - if (params.get('channel') === channel) { - params.delete('channel'); - selected = false; + if (params.getAll('channel').includes(channel)) { + params.delete('channel', channel); } else { - params.set('channel', channel); - selected = true; + params.append('channel', channel); } url.search = params.toString(); @@ -31,21 +32,53 @@ }; - + - diff --git a/src/routes/announcements/ChannelsHost.svelte b/src/routes/announcements/ChannelsHost.svelte new file mode 100644 index 00000000..3417bdac --- /dev/null +++ b/src/routes/announcements/ChannelsHost.svelte @@ -0,0 +1,86 @@ + + +
+ {#if showAllChannels} + {#each sortedChannels as channel} + + {/each} + {:else if selectedChannels.length > 0} + + {#each selectedChannels.filter((channel) => channel !== sortedChannels[0]) as channel} + + {/each} + {:else} + + {/if} + + {#if sortedChannels.length > 1} +
  • + +
  • + {/if} +
    + + diff --git a/src/routes/announcements/[slug]/+page.svelte b/src/routes/announcements/[slug]/+page.svelte new file mode 100644 index 00000000..a08381b7 --- /dev/null +++ b/src/routes/announcements/[slug]/+page.svelte @@ -0,0 +1,124 @@ + + +
    + +
    +
    +

    + {data.announcements.get(announcementIdNumber).title} +

    + +

    + {new Date(data.announcements.get(announcementIdNumber).createdAt.value).toLocaleString( + 'en-US', + { + dateStyle: 'long', + timeStyle: 'short' + } + )} · + {data.announcements.get(announcementIdNumber).author} +

    +
    + + + +
    + {@html data.announcements.get(announcementIdNumber).content} +
    +
    +
    +
    + +
    + + From c0b16641eece239bf7f87463f89a79bd66254642 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sat, 12 Oct 2024 19:47:05 +0200 Subject: [PATCH 052/177] feat: add Input component --- src/layout/Navbar/NavHost.svelte | 37 ++++---------------------------- src/lib/components/Input.svelte | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 src/lib/components/Input.svelte diff --git a/src/layout/Navbar/NavHost.svelte b/src/layout/Navbar/NavHost.svelte index 69f3abc4..2dbb7c66 100644 --- a/src/layout/Navbar/NavHost.svelte +++ b/src/layout/Navbar/NavHost.svelte @@ -15,6 +15,7 @@ import { useQueryClient } from '@tanstack/svelte-query'; import { get_access_token, is_logged_in, login } from '$lib/auth'; import moment from 'moment'; + import Input from '$lib/components/Input.svelte'; const client = useQueryClient(); @@ -171,14 +172,8 @@

    -
    - - -
    -
    - - -
    + +
    form > div:has(> div > input) { display: flex; flex-direction: column; - gap: 0.2rem; + gap: 1rem; margin-bottom: 5rem; } - .admin-modal-content input { - min-width: 130%; - } - - .admin-modal-content label { - position: absolute; - top: 47%; - left: 1rem; - transition: all 0.2s ease-in-out; - color: var(--surface-six); - pointer-events: none; - padding: 0; - margin: 0; - } - - .admin-modal-content input:focus + label, - input:valid + label { - top: 2px; - font-size: 0.85rem; - background-color: var(--surface-seven); - color: var(--text-one); - padding: 0.3rem; - } - .admin-modal-content > form > div:has(svg) { display: flex; flex-direction: column; diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte new file mode 100644 index 00000000..917d23e3 --- /dev/null +++ b/src/lib/components/Input.svelte @@ -0,0 +1,37 @@ + + +
    + + +
    + + From 107cadcc7af430c50660007ad7f18924e28aab8b Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sat, 12 Oct 2024 19:50:34 +0200 Subject: [PATCH 053/177] fix: fix input font size --- src/lib/components/Input.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte index 917d23e3..7a371a13 100644 --- a/src/lib/components/Input.svelte +++ b/src/lib/components/Input.svelte @@ -24,6 +24,11 @@ pointer-events: none; padding: 0; margin: 0; + font-size: 1rem; + } + + input { + font-size: 1rem; } input:focus + label, From 9a0fd34f1b653d78f5bbe758fc0bf7ff272b8377 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sat, 12 Oct 2024 20:30:46 +0200 Subject: [PATCH 054/177] feat: add HA1 sha256 to session storage --- src/lib/auth.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 4f41b781..9c526212 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -18,6 +18,22 @@ export class UnauthenticatedError extends Error { } } +class Session { + static set(id: string, value: any): void { + if (typeof value === 'object') value = JSON.stringify(value); + sessionStorage.setItem(id, value); + } + + static get(id: string): any | undefined { + const value: any = sessionStorage.getItem(id); + try { + return JSON.parse(value); + } catch (e) { + return value; + } + } +} + // Get access token. export function get_access_token(): AuthToken | null { if (!browser) return null; @@ -104,7 +120,13 @@ async function digest_fetch( // Create HA1, HA2, and response hashes according to the Digest authentication scheme // https://ktor.io/docs/server-digest-auth.html#flow - const HA1 = await sha256(`${username}:${realm}:${password}`); + let HA1: string; + if (Session.get('ha1')) HA1 = Session.get('ha1'); + else { + HA1 = await sha256(`${username}:${realm}:${password}`); + Session.set('ha1', HA1); + } + const HA2 = await sha256(`${method}:${uri}`); const responseHash = await sha256(`${HA1}:${nonce}:${HA2}`); From 147590cf06d1640065da6d1af522f94e2c41b88c Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sat, 12 Oct 2024 20:47:44 +0200 Subject: [PATCH 055/177] feat: add login success dialog --- src/layout/Navbar/NavHost.svelte | 47 ++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/layout/Navbar/NavHost.svelte b/src/layout/Navbar/NavHost.svelte index 2dbb7c66..8d29d886 100644 --- a/src/layout/Navbar/NavHost.svelte +++ b/src/layout/Navbar/NavHost.svelte @@ -43,7 +43,9 @@ } $: passed_login = is_logged_in(); - $: session_exp_date = passed_login ? moment(get_access_token()!.expires).fromNow() : undefined; + $: session_exp_date = passed_login + ? moment(get_access_token()!.expires).fromNow(true) + : undefined; async function handle_login(e: SubmitEvent) { const data = new FormData(e.target as HTMLFormElement); @@ -51,7 +53,7 @@ const username = data.get('username') as string; const password = data.get('password') as string; - passed_login = await login(username, password); + passed_login = passed_login_with_creds = await login(username, password); loginOpen = !passed_login; } @@ -59,6 +61,8 @@ let modalOpen = false; let y: number; let loginOpen = false; + let passed_login_with_creds = false; // will only change when the user INPUTS the credentials, not if the session is just valid + let loginForm: HTMLFormElement; onMount(() => { return RouterEvents.subscribe((event) => { @@ -149,9 +153,11 @@
    - + {#if passed_login} - Session will expire {session_exp_date} + Admin session will expire in {session_exp_date} {/if}
    @@ -170,7 +176,7 @@ This panel is reserved for administrators at ReVanced, this is not what you should be looking for, go back!

    - +
    @@ -187,15 +193,25 @@ d="M404-346h152l-24-136q19-13 30.5-33.5T574-560q0-39.29-27.3-66.64Q519.41-654 480.2-654q-39.2 0-66.7 27.36Q386-599.29 386-560q0 24 11.5 44.5T428-482l-24 136Zm76.13 314Q321-70 217.5-209T114-516.16v-274.82L480-928l366 137.02v274.82Q846-348 742.63-209 639.25-70 480.13-32Z" /> -
    - - -
    + + + + + + + + + + Successfully logged in! + + This session will expire in {session_exp_date} + + + + diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte index a56b7c60..39fb3680 100644 --- a/src/lib/components/Input.svelte +++ b/src/lib/components/Input.svelte @@ -8,37 +8,37 @@
    - diff --git a/src/lib/components/Masonry.svelte b/src/lib/components/Masonry.svelte deleted file mode 100644 index 605baadb..00000000 --- a/src/lib/components/Masonry.svelte +++ /dev/null @@ -1,137 +0,0 @@ - - - - -
    - -
    - - - - diff --git a/src/routes/announcements/+page.svelte b/src/routes/announcements/+page.svelte index 1e1593eb..88b4e54c 100644 --- a/src/routes/announcements/+page.svelte +++ b/src/routes/announcements/+page.svelte @@ -15,7 +15,6 @@ import Fuse from 'fuse.js'; import { onMount } from 'svelte'; - let searchParams: Readable; if (building) searchParams = readable(new URLSearchParams()); @@ -31,7 +30,6 @@ const announcementsArray = Array.from(announcements); if (!search) { - console.log(channels); if (channels.length > 0) return announcementsArray.filter((announcement) => channels.includes(announcement.channel)); return announcementsArray; diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index 16308319..82d5a7d0 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -4,14 +4,11 @@ import type { Announcement } from '$lib/types'; import UnreadDot from './UnreadDot.svelte'; - import ChannelChip from './ChannelChip.svelte'; - import ChannelsHost from './ChannelsHost.svelte'; import { is_logged_in } from '$lib/auth'; export let announcement: Announcement; let isRead: boolean; - let isUserAdmin: boolean; function isAnnouncementRead() { isRead = (localStorage.getItem('read_announcements') ?? '') @@ -28,7 +25,6 @@ onMount(() => { isAnnouncementRead(); - isUserAdmin = is_logged_in(); }); diff --git a/src/routes/announcements/ChannelsHost.svelte b/src/routes/announcements/ChannelsHost.svelte index 3417bdac..a3473166 100644 --- a/src/routes/announcements/ChannelsHost.svelte +++ b/src/routes/announcements/ChannelsHost.svelte @@ -67,20 +67,20 @@ display: flex; align-items: center; gap: 4px; - } - .button { - display: flex; - align-items: center; - } + .button { + display: flex; + align-items: center; + } - .expand-arrow { - transition: all 0.2s var(--bezier-one); - user-select: none; - height: 1.5rem; - } + .expand-arrow { + transition: all 0.2s var(--bezier-one); + user-select: none; + height: 1.5rem; + } - .rotate .expand-arrow { - transform: rotate(180deg); + .rotate .expand-arrow { + transform: rotate(180deg); + } } From 5a91cda931ceedb9552debfc83f5b18ead36cfdc Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 29 Oct 2024 13:45:41 +0300 Subject: [PATCH 067/177] feat: Replace 'Sudo Login' with 'Admin Login' and remove icon --- src/layout/Navbar/NavHost.svelte | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/layout/Navbar/NavHost.svelte b/src/layout/Navbar/NavHost.svelte index 0efae4d7..76a55e77 100644 --- a/src/layout/Navbar/NavHost.svelte +++ b/src/layout/Navbar/NavHost.svelte @@ -168,7 +168,7 @@
    {#if passed_login} Admin session will expire in {session_exp_date} @@ -185,7 +185,7 @@
    -

    Sudo login

    +

    Admin Login

    This panel is reserved for administrators at ReVanced, this is not what you should be looking for, go back! @@ -195,19 +195,6 @@

    -
    - - - -
    @@ -295,6 +282,7 @@ flex-direction: column; gap: 1rem; margin-bottom: 1rem; + width: 100%; } .admin-modal-content > form > div:has(svg) { From 8239d20d1d4f8434c855837a275b48c142f6e456 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Wed, 6 Nov 2024 14:44:06 +0100 Subject: [PATCH 068/177] feat: update api to v4 --- src/data/api/index.ts | 160 ++++++++------------------------------- src/data/api/settings.ts | 2 + 2 files changed, 33 insertions(+), 129 deletions(-) diff --git a/src/data/api/index.ts b/src/data/api/index.ts index b5f61948..fbbe22fb 100644 --- a/src/data/api/index.ts +++ b/src/data/api/index.ts @@ -34,8 +34,20 @@ type ApiAnnouncementCreate = { title: string; }; +type GetAnnouncementsOptions = Partial<{ + tags: string[]; + count: number; + cursor: number; +}>; + export function build_url(endpoint: string) { - return `${settings.api_base_url()}/${endpoint}`; + // //////v4/contributors -> v4/contributors + endpoint = endpoint.replace(/^\/+/, ''); + + // v4/contributors -> contributors + if (endpoint.startsWith(settings.API_VERSION)) endpoint = endpoint.split('/').slice(1).join('/'); + + return `${settings.api_base_url()}/${settings.API_VERSION}/${endpoint}`; } function build_headers() { @@ -81,17 +93,17 @@ async function delete_json(endpoint: string, body?: any) { } async function contributors(): Promise { - const json = await get_json('v3/contributors'); + const json = await get_json('contributors'); return { contributables: json }; } async function manager(): Promise { - const json = await get_json('v3/manager/latest'); + const json = await get_json('manager/latest'); return { release: json }; } async function patches(): Promise { - const json = await get_json('v3/patches/latest/list'); + const json = await get_json('patches/latest/list'); const packagesWithCount: { [key: string]: number } = {}; // gets packages and patch count @@ -109,135 +121,25 @@ async function patches(): Promise { } async function team(): Promise { - const json = await get_json('v3/team'); + const json = await get_json('team'); return { members: json }; } async function about(): Promise { - const json = await get_json('v3/about'); + const json = await get_json('about'); return { about: json }; } -async function announcements(): Promise { - // const json = await get_json(channel ? `v3/announcements/${channel}` : 'v3/announcements'); - // return { announcements: json.reverse() }; +async function announcements(options: GetAnnouncementsOptions = {}): Promise { + const url = new URL(build_url('announcements')); + + if (options.tags && options.tags.length > 0) url.searchParams.set('tags', options.tags.join(',')); + if (options.count) url.searchParams.set('count', String(options.count)); + if (options.cursor) url.searchParams.set('cursor', String(options.cursor)); - const announcements = [ - { - id: 1, - author: 'ReVanced', - title: 'ReVanced Manager', - content: `

    Recently we noticed that many users have unknowingly been using counterfeit versions of ReVanced. As an open-source project, occasional instances like this can unfortunately occur.

    While we strongly encourage freedom with what you do with ReVanced as an open-source project, it's important to note that we cannot guarantee the safety of counterfeits. Ultimately, it\'s a personal choice whom to trust.

    How do I know if I am using counterfeit?

    • ReVanced is officially only available on revanced.app, and any links you can find on revanced.app
    • You downloaded any pre-patched app claiming to be ReVanced from a site other than revanced.app

    Known counterfeits

    A list of known counterfeit sites are:

    • revanced.net
    • revanced.to
    • revancedextended.com
    • revancedextended.io
    • revancedapp.download
    • revancedapps.com
    • revancedapk.org
    • revancedapp.io
    • revancedapk.net

    I downloaded counterfeit, what now?

    Suppose you downloaded a counterfeit from a domain other than revanced.app, then we strongly advise you to uninstall it and obtain the official version from revanced.app.

    Unfortunately, gauging the security and safety impact of downloading counterfeits is hard. Therefore, you should update your passwords for any accounts you think may have been targeted and run a security and safety check on them.

    Official links

    How to get ReVanced officially?

    You can use ReVanced CLI or ReVanced Manager from revanced.app to get ReVanced. Refer to the documentation in ⁠<#953993848374325269> .

    `, - attachmentUrls: [], - channel: 'youtube', - createdAt: { value: '2029-10-23 19:07:31.154969' }, - level: 0 - }, - { - id: 2, - author: 'ReVanced', - title: 'Return YouTube Dislike down', - content: 'This is a test message', - attachmentUrls: [], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:05:28.508306' }, - level: 0 - }, - { - id: 3, - author: 'ReVanced', - title: 'Return YouTube Dislike down', - content: 'This is a test message', - attachmentUrls: [], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:05:52.443376' }, - level: 0 - }, - { - id: 4, - author: 'ReVanced', - title: 'Test title', - content: 'This is a test message', - attachmentUrls: [], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:24:02.621462' }, - level: 0 - }, - { - id: 5, - author: 'ReVanced', - title: 'Test title', - content: 'This is a test message', - attachmentUrls: [ - 'https://repository-images.githubusercontent.com/731390704/b0ddaf49-d868-4bb5-866c-417a86ebbf65' - ], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:27:23.246805' }, - level: 0 - }, - { - id: 6, - author: 'ReVanced', - title: 'Test title', - content: 'This is a test message', - attachmentUrls: [ - 'https://p3-ofp.static.pub/fes/cms/2022/12/07/m0521vlcnt1r2d29a50yjx8dagm5ve573937.png', - 'https://media.discordapp.net/attachments/1095487869923119144/1115436493050224660/revanced-logo.png?width=905&height=905' - ], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:36:33.695140' }, - level: 2 - }, - { - id: 7, - author: 'ReVanced', - title: 'Test title', - content: 'This is a test message', - attachmentUrls: [ - 'https://p3-ofp.static.pub/fes/cms/2022/12/07/m0521vlcnt1r2d29a50yjx8dagm5ve573937.png', - 'https://media.discordapp.net/attachments/1095487869923119144/1115436493050224660/revanced-logo.png?width=905&height=905' - ], - channel: 'revanced', - createdAt: { value: '2023-10-26 22:47:05.331425' }, - level: 1 - }, - { - id: 8, - author: 'ReVanced', - title: 'Test title', - content: 'This is a test message', - attachmentUrls: [ - 'https://p3-ofp.static.pub/fes/cms/2022/12/07/m0521vlcnt1r2d29a50yjx8dagm5ve573937.png', - 'https://media.discordapp.net/attachments/1095487869923119144/1115436493050224660/revanced-logo.png?width=905&height=905' - ], - channel: 'revanced', - createdAt: { value: '2023-11-23 02:36:04.138995' }, - level: 2 - }, - { - id: 9, - author: 'ReVanced', - title: 'YouTube history fixed', - content: - '\u003Cp\u003EOn 28 Feb 2024, YouTube has changed how videos are tracked. This change broke tracking history if you used the \u003Cb\u003EClient spoof\u003C/b\u003E patch for YouTube. A fix for it has been released with the latest version of ReVanced Patches. If you experience this issue, re-patch YouTube with the latest patches to apply the fix, otherwise ignore this.\u003C/p\u003E\u003Cbr\u003E\u003Cp\u003EFor more information visit one of our links below.\u003C/p\u003E\u003Cbr\u003E\u003Ch2\u003EOfficial links\u003C/h2\u003E\u003Cbr\u003E\u003Cp\u003EReVanced is always available at \u003Ca href="https://revanced.app"\u003Erevanced.app\u003C/a\u003E.\u003C/p\u003E\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href="https://revanced.app"\u003EWebsite\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href="https://revanced.app/discord"\u003EDiscord\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href="https://www.reddit.com/r/revancedapp"\u003EReddit\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href="https://twitter.com/revancedapp"\u003ETwitter\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href="https://t.me/app_revanced"\u003ETelegram\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href="https://www.youtube.com/@ReVanced"\u003EYouTube\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E', - attachmentUrls: [], - channel: 'youtube', - createdAt: { value: '2024-03-02 22:03:48.194543' }, - level: 0 - }, - { - id: 13, - author: 'ReVanced', - title: 'YouTube playback speed menu fixed', - content: - '\u003Cp\u003EIf you patched the YouTube app with the \u003Cb\u003EClient spoof\u003C/b\u003E patch, the video playback speed menu may have been missing.\u003Cbr\u003EThis issues has been fixed now. Patch YouTube using the latest version of \u003Ca href=https://github.com/ReVanced/revanced-patches\u003EReVanced Patches\u003C/a\u003E. Make sure to use the \u003Cb\u003EClient spoof\u003C/b\u003E patch when patching YouTube.\u003C/p\u003E\u003Cbr\u003E\u003Cp\u003EFor more information visit one of our links below.\u003C/p\u003E\u003Cbr\u003E\u003Ch2\u003EOfficial links\u003C/h2\u003E\u003Cbr\u003E\u003Cp\u003EReVanced is always available at \u003Ca href=https://revanced.app\u003Erevanced.app\u003C/a\u003E.\u003C/p\u003E\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=https://revanced.app\u003EWebsite\u003C/a\u003E\u003Cli\u003E\u003Ca href=https://revanced.app/discord\u003EDiscord\u003C/a\u003E\u003Cli\u003E\u003Ca href=https://www.reddit.com/r/revancedapp\u003EReddit\u003C/a\u003E\u003Cli\u003E\u003Ca href=https://twitter.com/revancedapp\u003ETwitter\u003C/a\u003E\u003Cli\u003E\u003Ca href=https://t.me/app_revanced\u003ETelegram\u003C/a\u003E\u003Cli\u003E\u003Ca href=https://www.youtube.com/@ReVanced\u003EYouTube\u003C/a\u003E\u003C/ul\u003E', - attachmentUrls: [], - channel: 'youtube', - createdAt: { value: '2024-06-02 23:28:57.028295' }, - level: 0 - } - ].sort((a, b) => a.id - b.id); + const json = (await get_json(url.pathname)) as Announcement[]; + const announcements = json.sort((a, b) => a.id - b.id); const announcementsMap = new Map( announcements.map((announcement) => [announcement.id, announcement]) ); @@ -246,23 +148,23 @@ async function announcements(): Promise { } async function create_announcement(announcement: ApiAnnouncementCreate) { - await post_json('v3/announcements', announcement); + await post_json('announcements', announcement); } async function update_announcement(announcement: ApiAnnouncementCreate) { - await patch_json('v3/announcements', announcement); + await patch_json('announcements', announcement); } async function delete_announcement(id: number) { - await delete_json(`v3/announcements/${id}`); + await delete_json(`announcements/${id}`); } async function archive_announcement(id: number) { - await post_json(`v3/announcements/${id}/archive`); + await post_json(`announcements/${id}/archive`); } async function unarchive_announcement(id: number) { - await post_json(`v3/announcements/${id}/unarchive`); + await post_json(`announcements/${id}/unarchive`); } export const staleTime = 5 * 60 * 1000; diff --git a/src/data/api/settings.ts b/src/data/api/settings.ts index 1904b0f5..022da608 100644 --- a/src/data/api/settings.ts +++ b/src/data/api/settings.ts @@ -5,6 +5,8 @@ const URL_KEY = 'revanced_api_url'; export const default_base_url = RV_API_URL; +export const API_VERSION = 'v4'; + // Get base URL export function api_base_url(): string { if (browser) return localStorage.getItem(URL_KEY) || default_base_url; From e261a7af0cbcfa5e27d978c87c4cd3a1510cd312 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Wed, 6 Nov 2024 15:12:39 +0100 Subject: [PATCH 069/177] refactor: move ApiAnnouncementCreate to types file --- src/data/api/index.ts | 13 ++----------- src/lib/types.ts | 10 ++++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/data/api/index.ts b/src/data/api/index.ts index fbbe22fb..17fa98f2 100644 --- a/src/data/api/index.ts +++ b/src/data/api/index.ts @@ -11,7 +11,8 @@ import type { Social, About, CompatiblePackage, - Announcement + Announcement, + ApiAnnouncementCreate } from '$lib/types'; import { get_access_token, is_logged_in, UnauthenticatedError } from '$lib/auth'; @@ -24,16 +25,6 @@ export type DonationData = { wallets: CryptoWallet[]; platforms: DonationPlatfor export type SocialsData = { socials: Social[] }; export type AnnouncementsData = { announcements: Map }; -type ApiAnnouncementCreate = { - archivedAt?: string; - attachmentUrls?: string[]; - author?: string; - channel?: string; - content?: string; - level?: number; - title: string; -}; - type GetAnnouncementsOptions = Partial<{ tags: string[]; count: number; diff --git a/src/lib/types.ts b/src/lib/types.ts index 7c62c51d..7b9b9af3 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -12,6 +12,16 @@ export interface Announcement { title: string; } +export type ApiAnnouncementCreate = { + title: string; +} & Partial<{ + attachmentUrls: string[]; + author: string; + channel: string; + content: string; + level: number; +}>; + export interface Contributor { name: string; avatar_url: string; From 95ad5042175f7a5ccdb8f2714f6b745a2caf50d1 Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Thu, 7 Nov 2024 13:45:05 +0100 Subject: [PATCH 070/177] fix: minor code fixes --- src/routes/announcements/+page.svelte | 16 ++++++---------- src/routes/announcements/ChannelChip.svelte | 7 ++----- src/routes/announcements/[slug]/+page.svelte | 17 +++++++---------- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/routes/announcements/+page.svelte b/src/routes/announcements/+page.svelte index 88b4e54c..0b07a18b 100644 --- a/src/routes/announcements/+page.svelte +++ b/src/routes/announcements/+page.svelte @@ -14,6 +14,7 @@ import Search from '$lib/components/Search.svelte'; import Fuse from 'fuse.js'; import { onMount } from 'svelte'; + import type { Announcement } from '$lib/types'; let searchParams: Readable; @@ -21,12 +22,12 @@ else searchParams = derived(page, ($page) => $page.url.searchParams); let searchTerm = $searchParams.get('s') || ''; - let searcher; + let searcher: Fuse; $: query = createQuery(queries.announcements()); $: channels = $searchParams.getAll('channel'); - function filter(announcements, search) { + function filter(announcements: Iterable, search: string) { const announcementsArray = Array.from(announcements); if (!search) { @@ -48,9 +49,7 @@ .map(({ item }) => item) .filter((item) => { // Don't show if the announcement isn't under the selected channels - if (channels.length > 0 && !channels.includes(item.channel)) { - return false; - } + if (channels.length > 0 && !channels.includes(item.channel)) return false; return true; }); return result; @@ -71,11 +70,8 @@ const url = new URL(window.location.href); url.pathname = '/announcements'; - if (searchTerm) { - url.searchParams.set('s', searchTerm); - } else { - url.searchParams.delete('s'); - } + if (searchTerm) url.searchParams.set('s', searchTerm); + else url.searchParams.delete('s'); }; onMount(update); diff --git a/src/routes/announcements/ChannelChip.svelte b/src/routes/announcements/ChannelChip.svelte index e660b84a..b6b084ef 100644 --- a/src/routes/announcements/ChannelChip.svelte +++ b/src/routes/announcements/ChannelChip.svelte @@ -19,11 +19,8 @@ const url = new URL(window.location.href); const params = new URLSearchParams(url.search); - if (params.getAll('channel').includes(channel)) { - params.delete('channel', channel); - } else { - params.append('channel', channel); - } + if (params.getAll('channel').includes(channel)) params.delete('channel', channel); + else params.append('channel', channel); url.search = params.toString(); goto(url.pathname + url.search); diff --git a/src/routes/announcements/[slug]/+page.svelte b/src/routes/announcements/[slug]/+page.svelte index a08381b7..77775b85 100644 --- a/src/routes/announcements/[slug]/+page.svelte +++ b/src/routes/announcements/[slug]/+page.svelte @@ -6,6 +6,7 @@ import { createQuery } from '@tanstack/svelte-query'; import { queries } from '$data/api'; import Query from '$lib/components/Query.svelte'; + import moment from 'moment'; $: query = createQuery(queries.announcements()); $: announcementIdNumber = Number($page.url.pathname.split('/').pop()); @@ -16,18 +17,14 @@

    - {data.announcements.get(announcementIdNumber).title} + {data.announcements.get(announcementIdNumber)?.title || 'No title'}

    - {new Date(data.announcements.get(announcementIdNumber).createdAt.value).toLocaleString( - 'en-US', - { - dateStyle: 'long', - timeStyle: 'short' - } - )} · - {data.announcements.get(announcementIdNumber).author} + {moment(data.announcements.get(announcementIdNumber)?.createdAt.value).format( + 'MMMM D, YYYY [at] h:mm A' + ) || 'No date'} · + {data.announcements.get(announcementIdNumber)?.author || 'System'}

    @@ -48,7 +45,7 @@
    - {@html data.announcements.get(announcementIdNumber).content} + {@html data.announcements.get(announcementIdNumber)?.content || ''}
    From 9fee2bb057e26c27c22490262db86f038e88857d Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sun, 10 Nov 2024 12:04:55 +0100 Subject: [PATCH 071/177] feat: update Announcement type to API v4 spec --- src/lib/types.ts | 10 +++---- src/routes/announcements/+page.svelte | 9 ++++-- .../announcements/AnnouncementCard.svelte | 14 +++------ src/routes/announcements/ChannelsHost.svelte | 30 +++++++++---------- src/routes/announcements/[slug]/+page.svelte | 2 +- 5 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/lib/types.ts b/src/lib/types.ts index 7b9b9af3..98b50106 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,12 +1,10 @@ export interface Announcement { - archivedAt?: string; - attachmentUrls?: string[]; + archived_at?: string; + attachments: string[]; author: string; - channel: string; + tags: string[]; content: string; - createdAt: { - value: string; - }; + created_at: string; id: number; level: number; title: string; diff --git a/src/routes/announcements/+page.svelte b/src/routes/announcements/+page.svelte index 0b07a18b..d26125e3 100644 --- a/src/routes/announcements/+page.svelte +++ b/src/routes/announcements/+page.svelte @@ -32,7 +32,9 @@ if (!search) { if (channels.length > 0) - return announcementsArray.filter((announcement) => channels.includes(announcement.channel)); + return announcementsArray.filter((announcement) => + channels.some((channel) => announcement.tags.includes(channel)) + ); return announcementsArray; } @@ -49,7 +51,8 @@ .map(({ item }) => item) .filter((item) => { // Don't show if the announcement isn't under the selected channels - if (channels.length > 0 && !channels.includes(item.channel)) return false; + if (channels.length > 0 && !channels.some((channel) => item.tags.includes(channel))) + return false; return true; }); return result; @@ -91,7 +94,7 @@
    - +
    {#each filter(data.announcements.values(), displayedTerm) as announcement} diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index 82d5a7d0..0da0daee 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -1,10 +1,8 @@ + + + +{#if selectedImage} + +{/if} + + diff --git a/src/lib/components/ImageModal.svelte b/src/lib/components/ImageModal.svelte new file mode 100644 index 00000000..61e1b01d --- /dev/null +++ b/src/lib/components/ImageModal.svelte @@ -0,0 +1,75 @@ + + + + + + + + + From f74e8c4b8dfa3162dd9bdf1e38e6327193c9aa7d Mon Sep 17 00:00:00 2001 From: madkarmaa Date: Sun, 10 Nov 2024 13:00:57 +0100 Subject: [PATCH 073/177] feat: use NewBadge instead of UnreadDot --- .../announcements/AnnouncementCard.svelte | 4 +-- .../{UnreadDot.svelte => NewBadge.svelte} | 26 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) rename src/routes/announcements/{UnreadDot.svelte => NewBadge.svelte} (62%) diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index 0da0daee..30491875 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -2,7 +2,7 @@ import moment from 'moment'; import { onMount } from 'svelte'; import type { Announcement } from '$lib/types'; - import UnreadDot from './UnreadDot.svelte'; + import NewBadge from './NewBadge.svelte'; export let announcement: Announcement; @@ -31,7 +31,7 @@
    {#if isRead !== undefined && !isRead} - + {/if} {#if announcement.attachments.length > 0} Banner diff --git a/src/routes/announcements/UnreadDot.svelte b/src/routes/announcements/NewBadge.svelte similarity index 62% rename from src/routes/announcements/UnreadDot.svelte rename to src/routes/announcements/NewBadge.svelte index b4888012..1d0bd572 100644 --- a/src/routes/announcements/UnreadDot.svelte +++ b/src/routes/announcements/NewBadge.svelte @@ -9,42 +9,44 @@ let self: HTMLElement; onMount(() => { - // doing this here because we don't want to change the position attribute of the parent element when the component is not present in it self.parentElement!.style.position = 'relative'; }); - + NEW diff --git a/src/routes/announcements/NewHeader.svelte b/src/routes/announcements/NewHeader.svelte new file mode 100644 index 00000000..437ae327 --- /dev/null +++ b/src/routes/announcements/NewHeader.svelte @@ -0,0 +1,14 @@ +NEW + + From 043f23131a96e48b74a9332b9b575b35812018c0 Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 18 Nov 2024 17:06:40 +0300 Subject: [PATCH 097/177] fix: Don't show 2nd swiggly line if there's no attachments --- src/routes/announcements/[slug]/+page.svelte | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/routes/announcements/[slug]/+page.svelte b/src/routes/announcements/[slug]/+page.svelte index 4fe0f39b..6b283f8e 100644 --- a/src/routes/announcements/[slug]/+page.svelte +++ b/src/routes/announcements/[slug]/+page.svelte @@ -150,23 +150,23 @@ {@html data.announcement.content}
    - - {#if data.announcement.attachments.length > 0} + + {/if}
    From 66209505f26dda11875e33dfae81d9d53fcc88a7 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 23 Nov 2024 16:50:56 +0300 Subject: [PATCH 098/177] fix: Attachment border radius on unread announcements --- src/routes/announcements/AnnouncementCard.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index ce666dff..80ed55a5 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -51,7 +51,7 @@ {/if} {#if announcement.attachments.length > 0} - Banner + Banner {/if}
    @@ -109,6 +109,10 @@ object-fit: cover; width: 100%; border-radius: 12px 12px 0px 0px; + + &.no-border-radius { + border-radius: 0; + } } .content { From 44e9fd38443da9d661ea5781a3ec969dbea1a6f3 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 23 Nov 2024 16:52:16 +0300 Subject: [PATCH 099/177] feat: Add create announcement button --- src/routes/announcements/+page.svelte | 28 ++++++++++++++++++++------- static/icons/create.svg | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 static/icons/create.svg diff --git a/src/routes/announcements/+page.svelte b/src/routes/announcements/+page.svelte index 8071b1ef..07515d54 100644 --- a/src/routes/announcements/+page.svelte +++ b/src/routes/announcements/+page.svelte @@ -15,6 +15,8 @@ import Fuse from 'fuse.js'; import { onMount } from 'svelte'; import type { ResponseAnnouncement } from '$lib/types'; + import { admin_login } from '$lib/stores'; + import Button from '$lib/components/Button.svelte'; let searchParams: Readable; @@ -82,12 +84,17 @@
    @@ -116,8 +123,15 @@ background-color: var(--surface-eight); .search-contain { - width: min(90%, 80rem); + display: flex; + justify-content: center; + gap: 1rem; margin-inline: auto; + width: min(90%, 80rem); + + .search-bar { + flex: 1; + } } } diff --git a/static/icons/create.svg b/static/icons/create.svg new file mode 100644 index 00000000..605cb6f4 --- /dev/null +++ b/static/icons/create.svg @@ -0,0 +1 @@ + \ No newline at end of file From 52d56313355909540b2e1ecce9458c1cfbed338f Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 1 Dec 2024 17:32:41 +0300 Subject: [PATCH 100/177] fix: Hide tags section in AnnouncementCard when there's no tags --- src/routes/announcements/AnnouncementCard.svelte | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/routes/announcements/AnnouncementCard.svelte b/src/routes/announcements/AnnouncementCard.svelte index 80ed55a5..99f0deff 100644 --- a/src/routes/announcements/AnnouncementCard.svelte +++ b/src/routes/announcements/AnnouncementCard.svelte @@ -64,12 +64,14 @@ {moment(announcement.created_at).format('MMMM DD, YYYY')} -
    -
    - {#each announcement.tags as tag} - - {/each} -
    + {#if announcement.tags.length > 0} +
    +
    + {#each announcement.tags as tag} + + {/each} +
    + {/if}
    From 64802d2020b19880fe1ca6f28643f508eb828f43 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 1 Dec 2024 17:33:49 +0300 Subject: [PATCH 101/177] fix: Cleanup tags handling and don't show TagsHost if there's no tags --- src/routes/announcements/TagsHost.svelte | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/routes/announcements/TagsHost.svelte b/src/routes/announcements/TagsHost.svelte index 9c620c5d..d023d2c1 100644 --- a/src/routes/announcements/TagsHost.svelte +++ b/src/routes/announcements/TagsHost.svelte @@ -30,21 +30,20 @@ else searchParams = derived(page, ($page) => $page.url.searchParams); $: selectedTags = $searchParams.getAll('tag'); + + $: displayedTags = (() => { + if (showAllTags) return sortedTags; + if (selectedTags.length > 0) { + return [sortedTags[0], ...selectedTags.filter((tag) => tag !== sortedTags[0])]; + } + return sortedTags.length > 0 ? [sortedTags[0]] : []; + })();
    - {#if showAllTags} - {#each sortedTags as tag} - - {/each} - {:else if selectedTags.length > 0} - - {#each selectedTags.filter((tag) => tag !== sortedTags[0]) as tag} - - {/each} - {:else} - - {/if} + {#each displayedTags as tag} + + {/each} {#if sortedTags.length > 1}
  • From fc2ac3ddd1cf5d683226f349ef92e732f6d4cdb6 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 1 Dec 2024 18:00:34 +0300 Subject: [PATCH 102/177] feat: Add editing and creating announcements and major cleanup --- src/app.scss | 11 +- src/lib/components/Button.svelte | 24 +- src/routes/announcements/[slug]/+page.svelte | 268 ++------------- .../announcements/[slug]/Announcement.svelte | 322 ++++++++++++++++++ static/icons/delete.svg | 1 + static/icons/edit.svg | 1 + static/icons/hide.svg | 1 + static/icons/show.svg | 1 + 8 files changed, 382 insertions(+), 247 deletions(-) create mode 100644 src/routes/announcements/[slug]/Announcement.svelte create mode 100644 static/icons/delete.svg create mode 100644 static/icons/edit.svg create mode 100644 static/icons/hide.svg create mode 100644 static/icons/show.svg diff --git a/src/app.scss b/src/app.scss index 306a73b0..aec85c1f 100644 --- a/src/app.scss +++ b/src/app.scss @@ -170,7 +170,13 @@ hr { border-top: 1px solid var(--border); } -input { +textarea { + resize: vertical; + field-sizing: content; +} + +input, +textarea { padding: 1rem; border-radius: 12px; border: 1px solid var(--border); @@ -178,6 +184,7 @@ input { color: var(--secondary); } -input:focus { +input:focus, +textarea:focus { outline: 1px solid var(--primary); } diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index b0d2c910..5cc269bf 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -1,5 +1,5 @@ {#if href} - - {#if icon} - {icon} - {/if} - - + {#if type == 'icon'} + + {#if icon} + {icon} + {/if} + + {:else} + + {#if icon} + {icon} + {/if} + + + {/if} +{:else if type == 'icon'} + {icon} {:else} - - - -
    - -
    -
    -
    -

    - {data.announcement.title} -

    - -

    - - {moment(data.announcement.created_at).format('MMMM D, YYYY [at] h:mm A')} - - · - - {data.announcement.author} - -

    -
    - - {#if $admin_login.logged_in} -
    - -
    - {/if} -
    - - - -
    - {@html data.announcement.content} -
    - - {#if data.announcement.attachments.length > 0} - - - - {/if} -
    -
    + {#if query} + + + + {:else} + + {/if}