From 456707c87a52829bf95421e79f57af40cf0be6e3 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:50:42 +0100 Subject: [PATCH 1/7] chore: leaderboard init --- build/esbuild-build.ts | 82 +- build/plugins/invert-colors.ts | 49 ++ package.json | 8 +- src/home/authentication.ts | 17 + src/home/fetch-github/fetch-avatar.ts | 60 ++ src/home/getters/get-github-access-token.ts | 85 +++ src/home/getters/get-github-user.ts | 42 ++ src/home/getters/get-indexed-db.ts | 70 ++ src/home/getters/get-local-store.ts | 19 + src/home/github-types.ts | 18 + src/home/home.ts | 31 + src/home/ready-toolbar.ts | 6 + .../display-github-user-information.ts | 34 + src/home/rendering/display-leaderboard.ts | 309 ++++++++ src/home/rendering/display-popup-modal.ts | 31 + src/home/rendering/render-github-issues.ts | 15 + .../rendering/render-github-login-button.ts | 42 ++ src/home/rendering/render-preview-modal.ts | 44 ++ .../rendering/setup-keyboard-navigation.ts | 88 +++ src/home/task-manager.ts | 58 ++ src/the-grid.ts | 162 ++++ static/favicon.svg | 9 + static/icon-512x512.png | Bin 0 -> 65863 bytes static/index.html | 55 +- static/main.ts | 10 - static/style/fonts/ubiquity-nova-standard.eot | Bin 0 -> 56807 bytes static/style/fonts/ubiquity-nova-standard.ttf | Bin 0 -> 187128 bytes .../style/fonts/ubiquity-nova-standard.woff | Bin 0 -> 77756 bytes static/style/inverted-style.css | 702 ++++++++++++++++++ static/style/special.css | 86 +++ static/style/style.css | 702 ++++++++++++++++++ yarn.lock | 222 +++++- 32 files changed, 3016 insertions(+), 40 deletions(-) create mode 100644 build/plugins/invert-colors.ts create mode 100644 src/home/authentication.ts create mode 100644 src/home/fetch-github/fetch-avatar.ts create mode 100644 src/home/getters/get-github-access-token.ts create mode 100644 src/home/getters/get-github-user.ts create mode 100644 src/home/getters/get-indexed-db.ts create mode 100644 src/home/getters/get-local-store.ts create mode 100644 src/home/github-types.ts create mode 100644 src/home/home.ts create mode 100644 src/home/ready-toolbar.ts create mode 100644 src/home/rendering/display-github-user-information.ts create mode 100644 src/home/rendering/display-leaderboard.ts create mode 100644 src/home/rendering/display-popup-modal.ts create mode 100644 src/home/rendering/render-github-issues.ts create mode 100644 src/home/rendering/render-github-login-button.ts create mode 100644 src/home/rendering/render-preview-modal.ts create mode 100644 src/home/rendering/setup-keyboard-navigation.ts create mode 100644 src/home/task-manager.ts create mode 100644 src/the-grid.ts create mode 100644 static/favicon.svg create mode 100644 static/icon-512x512.png delete mode 100644 static/main.ts create mode 100644 static/style/fonts/ubiquity-nova-standard.eot create mode 100644 static/style/fonts/ubiquity-nova-standard.ttf create mode 100644 static/style/fonts/ubiquity-nova-standard.woff create mode 100644 static/style/inverted-style.css create mode 100644 static/style/special.css create mode 100644 static/style/style.css diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts index 3004b1d..5c7e08a 100644 --- a/build/esbuild-build.ts +++ b/build/esbuild-build.ts @@ -1,33 +1,77 @@ +import { config } from "dotenv"; import esbuild from "esbuild"; -const typescriptEntries = ["static/main.ts"]; -// const cssEntries = ["static/style.css"]; -const entries = [ - ...typescriptEntries, - // ...cssEntries -]; +import { invertColors } from "./plugins/invert-colors"; +import { execSync } from "child_process"; +config(); + +const typescriptEntries = ["src/home/home.ts"]; +const cssEntries = ["static/style/style.css"]; +const entries = [...typescriptEntries, ...cssEntries, "static/favicon.svg", "static/icon-512x512.png"]; export const esBuildContext: esbuild.BuildOptions = { + plugins: [invertColors], sourcemap: true, entryPoints: entries, bundle: true, minify: false, loader: { - ".png": "dataurl", - ".woff": "dataurl", - ".woff2": "dataurl", - ".eot": "dataurl", - ".ttf": "dataurl", - ".svg": "dataurl", + ".png": "file", + ".woff": "file", + ".woff2": "file", + ".eot": "file", + ".ttf": "file", + ".svg": "file", + ".json": "file", }, outdir: "static/dist", + define: createEnvDefines(["SUPABASE_URL", "SUPABASE_ANON_KEY"], { + SUPABASE_STORAGE_KEY: generateSupabaseStorageKey(), + commitHash: execSync(`git rev-parse --short HEAD`).toString().trim(), + }), }; esbuild .build(esBuildContext) - .then(() => { - console.log("\tesbuild complete"); - }) - .catch((err) => { - console.error(err); - process.exit(1); - }); + .then(() => console.log("\tesbuild complete")) + .catch(console.error); + +function createEnvDefines(environmentVariables: string[], generatedAtBuild: Record): Record { + const defines: Record = {}; + for (const name of environmentVariables) { + const envVar = process.env[name]; + if (envVar !== undefined) { + defines[name] = JSON.stringify(envVar); + } else { + throw new Error(`Missing environment variable: ${name}`); + } + } + for (const key of Object.keys(generatedAtBuild)) { + if (Object.prototype.hasOwnProperty.call(generatedAtBuild, key)) { + defines[key] = JSON.stringify(generatedAtBuild[key]); + } + } + return defines; +} + +export function generateSupabaseStorageKey(): string | null { + const SUPABASE_URL = process.env.SUPABASE_URL; + if (!SUPABASE_URL) { + console.error("SUPABASE_URL environment variable is not set"); + return null; + } + + const urlParts = SUPABASE_URL.split("."); + if (urlParts.length === 0) { + console.error("Invalid SUPABASE_URL environment variable"); + return null; + } + + const domain = urlParts[0]; + const lastSlashIndex = domain.lastIndexOf("/"); + if (lastSlashIndex === -1) { + console.error("Invalid SUPABASE_URL format"); + return null; + } + + return domain.substring(lastSlashIndex + 1); +} diff --git a/build/plugins/invert-colors.ts b/build/plugins/invert-colors.ts new file mode 100644 index 0000000..a0b3edf --- /dev/null +++ b/build/plugins/invert-colors.ts @@ -0,0 +1,49 @@ +import esbuild from "esbuild"; +import fs from "fs"; +import path from "path"; + +export const invertColors: esbuild.Plugin = { + name: "invert-colors", + setup(build) { + build.onLoad({ filter: /\.css$/ }, async (args) => { + const contents = await fs.promises.readFile(args.path, "utf8"); + + const updatedContents = contents.replace(/prefers-color-scheme: dark/g, "prefers-color-scheme: light"); + + // Invert greyscale colors and accommodate alpha channels in the CSS content + const invertedContents = updatedContents.replace(/#([0-9A-Fa-f]{3,6})([0-9A-Fa-f]{2})?\b/g, (match, rgb, alpha) => { + let color = rgb.startsWith("#") ? rgb.slice(1) : rgb; + if (color.length === 3) { + color = color + .split("") + .map((char: string) => char + char) + .join(""); + } + const r = parseInt(color.slice(0, 2), 16); + const g = parseInt(color.slice(2, 4), 16); + const b = parseInt(color.slice(4, 6), 16); + + // Check if the color is greyscale (R, G, and B components are equal) + if (r === g && g === b) { + // Invert RGB values + const invertedColorValue = (255 - r).toString(16).padStart(2, "0"); + // Return the inverted greyscale color with alpha channel if present + return `#${invertedColorValue}${invertedColorValue}${invertedColorValue}${alpha || ""}`; + } + + // If the color is not greyscale, return it as is, including the alpha channel if present + return `#${color}${alpha || ""}`; + }); + + // Define the output path for the new CSS file + const outputPath = path.resolve("static/style", "inverted-style.css"); + const outputDir = path.dirname(outputPath); + await fs.promises.mkdir(outputDir, { recursive: true }); + // Write the new contents to the output file + await fs.promises.writeFile(outputPath, invertedContents, "utf8"); + + // Return an empty result to esbuild since we're writing the file ourselves + return { contents: "", loader: "css" }; + }); + }, +}; diff --git a/package.json b/package.json index ec1b4ae..4b024af 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,11 @@ "open-source" ], "dependencies": { - "dotenv": "^16.4.4" + "@octokit/rest": "^20.0.2", + "@supabase/supabase-js": "^2.39.0", + "dotenv": "^16.3.1", + "esbuild-plugin-env": "^1.0.8", + "marked": "^11.0.0" }, "devDependencies": { "@commitlint/cli": "^18.6.1", @@ -77,4 +81,4 @@ "@commitlint/config-conventional" ] } -} +} \ No newline at end of file diff --git a/src/home/authentication.ts b/src/home/authentication.ts new file mode 100644 index 0000000..1a263ce --- /dev/null +++ b/src/home/authentication.ts @@ -0,0 +1,17 @@ +import { getGitHubAccessToken } from "./getters/get-github-access-token"; +import { getGitHubUser } from "./getters/get-github-user"; +import { GitHubUser } from "./github-types"; +import { displayGitHubUserInformation } from "./rendering/display-github-user-information"; +import { renderGitHubLoginButton } from "./rendering/render-github-login-button"; + +export async function authentication() { + const accessToken = await getGitHubAccessToken(); + if (!accessToken) { + renderGitHubLoginButton(); + } + + const gitHubUser: null | GitHubUser = await getGitHubUser(); + if (gitHubUser) { + displayGitHubUserInformation(gitHubUser); + } +} diff --git a/src/home/fetch-github/fetch-avatar.ts b/src/home/fetch-github/fetch-avatar.ts new file mode 100644 index 0000000..d966a58 --- /dev/null +++ b/src/home/fetch-github/fetch-avatar.ts @@ -0,0 +1,60 @@ +import { Octokit } from "@octokit/rest"; +import { getGitHubAccessToken } from "../getters/get-github-access-token"; +import { getImageFromCache, saveImageToCache } from "../getters/get-indexed-db"; + +export const organizationImageCache = new Map(); + +export async function fetchAvatar(orgName: string) { + // Check local cache first + const cachedAvatar = organizationImageCache.get(orgName); + if (cachedAvatar) { + return Promise.resolve(); + } + + // If not in local cache, check IndexedDB + const avatarBlob = await getImageFromCache({ dbName: "GitHubAvatars", storeName: "ImageStore", orgName: `avatarUrl-${orgName}` }); + if (avatarBlob) { + // If the avatar Blob is found in IndexedDB, add it to the cache + organizationImageCache.set(orgName, avatarBlob); + return Promise.resolve(); + } + + // If not in IndexedDB, fetch from network + const octokit = new Octokit({ auth: await getGitHubAccessToken() }); + try { + const { + data: { avatar_url: avatarUrl }, + } = await octokit.rest.orgs.get({ org: orgName }); + if (avatarUrl) { + // Fetch the image as a Blob and save it to IndexedDB + const response = await fetch(avatarUrl); + const blob = await response.blob(); + await saveImageToCache({ + dbName: "GitHubAvatars", + storeName: "ImageStore", + keyName: "name", + orgName: `avatarUrl-${orgName}`, + avatarBlob: blob, + }); + organizationImageCache.set(orgName, blob); + } + } catch (error) { + console.error(`Failed to fetch avatar for organization ${orgName}: ${error}`); + const { + data: { avatar_url: avatarUrl }, + } = await octokit.rest.users.getByUsername({ username: orgName }); + if (avatarUrl) { + // Fetch the image as a Blob and save it to IndexedDB + const response = await fetch(avatarUrl); + const blob = await response.blob(); + await saveImageToCache({ + dbName: "GitHubAvatars", + storeName: "ImageStore", + keyName: "name", + orgName: `avatarUrl-${orgName}`, + avatarBlob: blob, + }); + organizationImageCache.set(orgName, blob); + } + } +} diff --git a/src/home/getters/get-github-access-token.ts b/src/home/getters/get-github-access-token.ts new file mode 100644 index 0000000..25585cb --- /dev/null +++ b/src/home/getters/get-github-access-token.ts @@ -0,0 +1,85 @@ +declare const SUPABASE_STORAGE_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts +import { checkSupabaseSession } from "../rendering/render-github-login-button"; +import { getLocalStore } from "./get-local-store"; + +export async function getGitHubAccessToken(): Promise { + // better to use official function, looking up localstorage has flaws + const oauthToken = await checkSupabaseSession(); + + const expiresAt = oauthToken?.expires_at; + if (expiresAt && expiresAt < Date.now() / 1000) { + localStorage.removeItem(`sb-${SUPABASE_STORAGE_KEY}-auth-token`); + return null; + } + + return oauthToken?.provider_token ?? null; +} + +export function getGitHubUserName(): string | null { + const oauthToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OAuthToken | null; + + const username = oauthToken?.user?.user_metadata?.user_name; + if (username) { + return username; + } + + return null; +} + +export interface OAuthToken { + provider_token: string; + access_token: string; + expires_in: number; + expires_at: number; + refresh_token: string; + token_type: string; + user: { + id: string; + aud: string; + role: string; + email: string; + email_confirmed_at: string; + phone: string; + confirmed_at: string; + last_sign_in_at: string; + app_metadata: { provider: string; providers: string[] }; + user_metadata: { + avatar_url: string; + email: string; + email_verified: boolean; + full_name: string; + iss: string; + name: string; + phone_verified: boolean; + preferred_username: string; + provider_id: string; + sub: string; + user_name: string; + }; + identities: [ + { + id: string; + user_id: string; + identity_data: { + avatar_url: string; + email: string; + email_verified: boolean; + full_name: string; + iss: string; + name: string; + phone_verified: boolean; + preferred_username: string; + provider_id: string; + sub: string; + user_name: string; + }; + provider: string; + last_sign_in_at: string; + created_at: string; + updated_at: string; + }, + ]; + created_at: string; + updated_at: string; + }; +} diff --git a/src/home/getters/get-github-user.ts b/src/home/getters/get-github-user.ts new file mode 100644 index 0000000..8d6a1a7 --- /dev/null +++ b/src/home/getters/get-github-user.ts @@ -0,0 +1,42 @@ +import { Octokit } from "@octokit/rest"; +import { GitHubUser, GitHubUserResponse } from "../github-types"; +import { OAuthToken } from "./get-github-access-token"; +import { getLocalStore } from "./get-local-store"; +declare const SUPABASE_STORAGE_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts + +export async function getGitHubUser(): Promise { + const activeSessionToken = await getSessionToken(); + if (activeSessionToken) { + return getNewGitHubUser(activeSessionToken); + } else { + return null; + } +} + +async function getSessionToken(): Promise { + const cachedSessionToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OAuthToken | null; + if (cachedSessionToken) { + return cachedSessionToken.provider_token; + } + const newSessionToken = await getNewSessionToken(); + if (newSessionToken) { + return newSessionToken; + } + return null; +} + +async function getNewSessionToken(): Promise { + const hash = window.location.hash; + const params = new URLSearchParams(hash.substr(1)); // remove the '#' and parse + const providerToken = params.get("provider_token"); + if (!providerToken) { + return null; + } + return providerToken; +} + +async function getNewGitHubUser(providerToken: string): Promise { + const octokit = new Octokit({ auth: providerToken }); + const response = (await octokit.request("GET /user")) as GitHubUserResponse; + return response.data; +} diff --git a/src/home/getters/get-indexed-db.ts b/src/home/getters/get-indexed-db.ts new file mode 100644 index 0000000..110ab73 --- /dev/null +++ b/src/home/getters/get-indexed-db.ts @@ -0,0 +1,70 @@ +export async function saveImageToCache({ + dbName, + storeName, + keyName, + orgName, + avatarBlob, +}: { + dbName: string; + storeName: string; + keyName: string; + orgName: string; + avatarBlob: Blob; +}): Promise { + return new Promise((resolve, reject) => { + const open = indexedDB.open(dbName, 2); // Increase version number to ensure onupgradeneeded is called + open.onupgradeneeded = function () { + const db = open.result; + if (!db.objectStoreNames.contains(storeName)) { + db.createObjectStore(storeName, { keyPath: keyName }); + } + }; + open.onsuccess = function () { + const db = open.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + const item = { + name: `avatarUrl-${orgName}`, + image: avatarBlob, + created: new Date().getTime(), + }; + store.put(item); + transaction.oncomplete = function () { + db.close(); + resolve(); + }; + transaction.onerror = function (event) { + const errorEventTarget = event.target as IDBRequest; + reject("Error saving image to DB: " + errorEventTarget.error?.message); + }; + }; + }); +} + +export function getImageFromCache({ dbName, storeName, orgName }: { dbName: string; storeName: string; orgName: string }): Promise { + return new Promise((resolve, reject) => { + const open = indexedDB.open(dbName, 2); // Increase version number to ensure onupgradeneeded is called + open.onupgradeneeded = function () { + const db = open.result; + if (!db.objectStoreNames.contains(storeName)) { + db.createObjectStore(storeName, { keyPath: "name" }); + } + }; + open.onsuccess = function () { + const db = open.result; + const transaction = db.transaction(storeName, "readonly"); + const store = transaction.objectStore(storeName); + const getImage = store.get(`avatarUrl-${orgName}`); + getImage.onsuccess = function () { + resolve(getImage.result?.image || null); + }; + transaction.oncomplete = function () { + db.close(); + }; + transaction.onerror = function (event) { + const errorEventTarget = event.target as IDBRequest; + reject("Error retrieving image from DB: " + errorEventTarget.error?.message); + }; + }; + }); +} diff --git a/src/home/getters/get-local-store.ts b/src/home/getters/get-local-store.ts new file mode 100644 index 0000000..43bbdb1 --- /dev/null +++ b/src/home/getters/get-local-store.ts @@ -0,0 +1,19 @@ +import { TaskStorageItems } from "../github-types"; +import { OAuthToken } from "./get-github-access-token"; + +export function getLocalStore(key: string): TaskStorageItems | OAuthToken | null { + const cachedIssues = localStorage.getItem(key); + if (cachedIssues) { + try { + return JSON.parse(cachedIssues); // as OAuthToken; + } catch (error) { + console.error(error); + } + } + return null; +} + +export function setLocalStore(key: string, value: TaskStorageItems | OAuthToken) { + // remove state from issues before saving to local storage + localStorage[key] = JSON.stringify(value); +} diff --git a/src/home/github-types.ts b/src/home/github-types.ts new file mode 100644 index 0000000..89d34e9 --- /dev/null +++ b/src/home/github-types.ts @@ -0,0 +1,18 @@ +import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; +import { TaskNoState } from "./fetch-github/preview-to-full-mapping"; + +export interface AvatarCache { + [organization: string]: string | null; +} + +export const GITHUB_TASKS_STORAGE_KEY = "gitHubTasks"; + +export type TaskStorageItems = { + timestamp: number; + tasks: TaskNoState[]; + loggedIn: boolean; +}; + +export type GitHubUserResponse = RestEndpointMethodTypes["users"]["getByUsername"]["response"]; +export type GitHubUser = GitHubUserResponse["data"]; +export type GitHubIssue = RestEndpointMethodTypes["issues"]["get"]["response"]["data"]; diff --git a/src/home/home.ts b/src/home/home.ts new file mode 100644 index 0000000..614fd56 --- /dev/null +++ b/src/home/home.ts @@ -0,0 +1,31 @@ +import { grid } from "../the-grid"; +import { authentication } from "./authentication"; +import { readyToolbar } from "./ready-toolbar"; +import { renderLeaderboard } from "./rendering/display-leaderboard"; +import { displayPopupMessage } from "./rendering/display-popup-modal"; +import { TaskManager } from "./task-manager"; + +grid(document.getElementById("grid") as HTMLElement, () => document.body.classList.add("grid-loaded")); // @DEV: display grid background +const container = document.getElementById("issues-container") as HTMLDivElement; + +if (!container) { + throw new Error("Could not find issues container"); +} + +export const taskManager = new TaskManager(container); + +async function leaderboardLoaderWhileRendering() { + const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a moment if it's your first time."); + await renderLeaderboard(); + killPopup(); +} + +void (async function home() { + try { + void authentication(); + void readyToolbar(); + return await leaderboardLoaderWhileRendering(); + } catch (error) { + console.error(error); + } +})(); diff --git a/src/home/ready-toolbar.ts b/src/home/ready-toolbar.ts new file mode 100644 index 0000000..8bac32f --- /dev/null +++ b/src/home/ready-toolbar.ts @@ -0,0 +1,6 @@ +const toolbar = document.getElementById("toolbar"); +export async function readyToolbar() { + if (!toolbar) throw new Error("toolbar not found"); + toolbar.classList.add("ready"); +} +export { toolbar }; diff --git a/src/home/rendering/display-github-user-information.ts b/src/home/rendering/display-github-user-information.ts new file mode 100644 index 0000000..cb87573 --- /dev/null +++ b/src/home/rendering/display-github-user-information.ts @@ -0,0 +1,34 @@ +import { GitHubUser } from "../github-types"; +import { getSupabase } from "./render-github-login-button"; + +export function displayGitHubUserInformation(gitHubUser: GitHubUser) { + const toolbar = document.getElementById("toolbar"); + const authenticated = document.createElement("div"); + authenticated.id = "authenticated"; + if (!toolbar) throw new Error("toolbar not found"); + + const img = document.createElement("img"); + img.src = gitHubUser.avatar_url; + img.alt = gitHubUser.login; + authenticated.appendChild(img); + + const div = document.createElement("div"); + + div.textContent = gitHubUser.name; + div.classList.add("full"); + authenticated.appendChild(div); + + authenticated.addEventListener("click", async function signOut() { + const supabase = getSupabase(); + const { error } = await supabase.auth.signOut(); + if (error) { + console.error("Error logging out:", error); + alert(error); + } + window.location.reload(); + }); + + toolbar.appendChild(authenticated); + toolbar.setAttribute("data-authenticated", "true"); + toolbar.classList.add("ready"); +} diff --git a/src/home/rendering/display-leaderboard.ts b/src/home/rendering/display-leaderboard.ts new file mode 100644 index 0000000..8fccb49 --- /dev/null +++ b/src/home/rendering/display-leaderboard.ts @@ -0,0 +1,309 @@ +import { taskManager } from "../home"; +import { preview, previewBodyInner, titleAnchor, titleHeader } from "./render-preview-modal"; +import { getSupabase } from "./render-github-login-button"; +import { getGitHubAccessToken } from "../getters/get-github-access-token"; +import { Octokit } from "@octokit/rest"; + +type SupabaseUser = { id: string; created: string; wallet_id: string }; +type LeaderboardData = { address: string; balance: number }; +type LeaderboardEntry = { address: string; username?: string; balance: number; created_at?: string }; + +export async function renderLeaderboard() { + const container = taskManager.getContainer(); + if (container.classList.contains("ready")) { + container.classList.remove("ready"); + + const leaderboardFetchLoader = document.createElement("div"); + leaderboardFetchLoader.classList.add("loader"); + container.appendChild(leaderboardFetchLoader); + + container.innerHTML = ""; + } + const existingAddresses = new Set(Array.from(container.querySelectorAll(".issue-element-inner")).map((element) => element.getAttribute("data-preview-id"))); + + const delay = 0; + const baseDelay = 500 / 15; + + const cachedEntries = localStorage.getItem("ubq-leaderboard") || "[]"; + const lastUpdate = localStorage.getItem("ubq-leaderboard-last-update") || "0"; + const parsedEntries = JSON.parse(cachedEntries) as LeaderboardEntry[]; + + let entries: LeaderboardEntry[] | undefined = []; + let addrAndBalances: LeaderboardData[] = []; + + if (!cachedEntries || Date.now() - parseInt(lastUpdate) > 1000 * 60 * 60 * 24 * 7) { + // fetches the most up to date leaderboard data from the repo + entries = await fetchAllLeaderboardDatas(); + + if (!entries) { + return; + } + + return launchLeaderboard( + entries.sort((a, b) => b.balance - a.balance), + container, + existingAddresses, + delay, + baseDelay + ); + } else { + if (lastUpdate && Date.now() - parseInt(lastUpdate) < 1000 * 60 * 60 * 24) { + entries = parsedEntries.sort((a, b) => b.balance - a.balance); + + return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); + } + + addrAndBalances = await fetchLeaderboardDataFromRepo(); + + const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; + const USER_IDS = users.data.map((user) => user.id); + const githubUsers = await fetchUsernames(USER_IDS, new Octokit({ auth: await getGitHubAccessToken() })); + + entries = (await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers)).sort((a, b) => b.balance - a.balance); + + if (!entries) { + return; + } + + return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); + } +} + +async function launchLeaderboard( + entries: LeaderboardEntry[], + container: HTMLDivElement, + existingAddresses: Set, + delay: number, + baseDelay: number +) { + for (const entry of entries) { + if (!existingAddresses.has(entry.address)) { + const entryWrapper = await everyNewEntry({ entry, container }); + if (entryWrapper) { + setTimeout(() => entryWrapper?.classList.add("active"), delay); + delay += baseDelay; + } + } + } + container.classList.add("ready"); + container.setAttribute("data-leaderboard", "true"); + localStorage.setItem("ubq-leaderboard-last-update", Date.now().toString()); + + return true; +} + +async function pullFromSupabase() { + const supabase = getSupabase(); + + // pull all wallets from the database + const { data, error } = await supabase.from("wallets").select("address, id"); + + if (error || !data?.length) { + console.error(error); + return; + } + + const walletMap = new Map(); + + for (const wallet of data) { + walletMap.set(wallet.id, wallet.address); + } + + // pull all users with wallets that are in the walletMap + const users = (await supabase.from("users").select("id, created, wallet_id").in("wallet_id", Array.from(walletMap.keys()))) as { data: SupabaseUser[] }; + + if (!users.data) { + return; + } + + return { walletMap, users }; +} + +async function makeLeaderboardEntries( + walletMap: Map, + users: { data: SupabaseUser[] }, + addrAndBalances: LeaderboardData[], + githubUsers: { id: string; username: string }[] +): Promise { + const wallets = users.data.map((user) => { + const wId = Number(user.wallet_id); + const uId = user.id; + + const username = githubUsers.find((user) => user.id === uId)?.username; + + const address = walletMap.get(wId); + + if (!address) { + console.warn(`No address found for wallet ID ${wId}`); + return { address: "", username: "", balance: 0, created_at: "" }; + } + + const balance = addrAndBalances.find((entry) => entry.address.toLowerCase() === address?.toLowerCase())?.balance || 0; + + return { address, username, balance, created_at: user.created }; + }); + + localStorage.setItem("ubq-leaderboard", JSON.stringify(wallets)); + + return wallets; +} + +async function fetchAllLeaderboardDatas() { + const octokit = new Octokit({ auth: await getGitHubAccessToken() }); + const addrAndBalances = await fetchLeaderboardDataFromRepo(); + + const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; + + const USER_IDS = users.data.map((user) => user.id); + const githubUsers = await fetchUsernames(USER_IDS, octokit); + const wallets = await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers); + + return wallets.sort((a, b) => b.balance - a.balance); +} + +async function fetchUsernames(userIds: string[], octokit: Octokit) { + const usernames = []; + + for (const userId of userIds) { + const { data, status } = await octokit.request(`GET /user/${userId}`); + + if (status !== 200) { + console.error(`Failed to fetch user data for ${userId}`); + continue; + } + + usernames.push({ + id: data.id, + username: data.login, + avatar: data.avatar_url, + name: data.name, + }); + } + + return usernames; +} + +async function everyNewEntry({ entry, container }: { entry: LeaderboardEntry; container: HTMLDivElement }) { + const entryWrapper = document.createElement("div"); + const issueElement = document.createElement("div"); + issueElement.setAttribute("data-preview-id", entry.balance.toFixed(0)); + issueElement.classList.add("issue-element-inner"); + + if (!entry.address) { + console.warn("No address found"); + return; + } + + setUpIssueElement(issueElement, entry); + entryWrapper.appendChild(issueElement); + + container.appendChild(entryWrapper); + return entryWrapper; +} + +function setUpIssueElement(entryElement: HTMLDivElement, entry: LeaderboardEntry) { + entryElement.innerHTML = ` +
+
+

${entry.username ?? "Contributor"}

+

$${entry.balance.toLocaleString()}

+
+
+

${entry.address.toUpperCase()}

+
+
+ `; + + entryElement.addEventListener("click", () => { + const entryWrapper = entryElement.parentElement; + + if (!entryWrapper) { + throw new Error("No issue container found"); + } + + Array.from(entryWrapper.parentElement?.children || []).forEach((sibling) => { + sibling.classList.remove("selected"); + }); + + entryWrapper.classList.add("selected"); + + previewEntryAdditionalDetails(entry); + }); +} + +function previewEntryAdditionalDetails(entry: LeaderboardEntry) { + titleHeader.textContent = entry.address; + titleAnchor.href = `https://etherscan.io/address/${entry.address}`; + previewBodyInner.innerHTML = ` +
+
+

${entry.username ?? "Contributor"}

+
+
+ ${entry.created_at ? `

Joined: ${new Date(entry.created_at).toLocaleDateString()}

` : ""} +

Earnings To Date: $${entry.balance.toLocaleString()}

+
+
+ `; + + // Show the preview + preview.classList.add("active"); + document.body.classList.add("preview-active"); +} + +async function fetchLeaderboardDataFromRepo(): Promise { + try { + const token = await getGitHubAccessToken(); + const octokit = new Octokit({ auth: token }); + + // @TODO: create an action that updates this every 24hrs and pulls from a Ubiquity repo + + const path = "leaderboard.csv"; + const url = "https://github.com/keyrxng/ubq-airdrop-cli"; + + const { data, status } = await octokit.repos.getContent({ + owner: "keyrxng", + repo: "ubq-airdrop-cli", + path, + }); + + if (status !== 200) { + throw new Error(`Failed to fetch leaderboard data from ${url}`); + } + let parsedData; + + // TODO: remove in place of db pulled stats + if ("content" in data) { + parsedData = atob(data.content); + } else { + throw new Error("No content found in leaderboard data"); + } + + const entries = cvsToLeaderboardData(parsedData); + + if (entries.length === 0) { + throw new Error("No entries found in leaderboard data"); + } + + return entries; + } catch (err) { + console.log(err); + return []; + } +} + +function cvsToLeaderboardData(cvsData: string): { address: string; balance: number }[] { + const lines = cvsData.split("\n"); + const data = []; + for (const line of lines) { + const [address, balance] = line.split(","); + + if (balance === undefined || isNaN(parseInt(balance))) { + continue; + } + + data.push({ address: address.toUpperCase(), balance: parseInt(balance) }); + } + + return data.sort((a, b) => b.balance - a.balance); +} diff --git a/src/home/rendering/display-popup-modal.ts b/src/home/rendering/display-popup-modal.ts new file mode 100644 index 0000000..c9c8581 --- /dev/null +++ b/src/home/rendering/display-popup-modal.ts @@ -0,0 +1,31 @@ +import { toolbar } from "../ready-toolbar"; +import { gitHubLoginButton } from "./render-github-login-button"; +import { preview, previewBodyInner, titleAnchor, titleHeader } from "./render-preview-modal"; + +export function displayPopupMessage(header: string, message: string, url?: string) { + titleHeader.textContent = header; + if (url) { + titleAnchor.href = url; + } + previewBodyInner.innerHTML = message; + + preview.classList.add("active"); + document.body.classList.add("preview-active"); + + if (toolbar) { + toolbar.scrollTo({ + left: toolbar.scrollWidth, + behavior: "smooth", + }); + + gitHubLoginButton?.classList.add("highlight"); + } + + function killPopup() { + preview.classList.remove("active"); + document.body.classList.remove("preview-active"); + gitHubLoginButton?.classList.remove("highlight"); + } + + return killPopup; +} diff --git a/src/home/rendering/render-github-issues.ts b/src/home/rendering/render-github-issues.ts new file mode 100644 index 0000000..222a43e --- /dev/null +++ b/src/home/rendering/render-github-issues.ts @@ -0,0 +1,15 @@ +import { marked } from "marked"; +import { GitHubIssue } from "../github-types"; +import { preview, previewBodyInner, titleAnchor, titleHeader } from "./render-preview-modal"; + +export function viewIssueDetails(full: GitHubIssue) { + // Update the title and body for the new issue + titleHeader.textContent = full.title; + titleAnchor.href = full.html_url; + if (!full.body) return; + previewBodyInner.innerHTML = marked(full.body) as string; + + // Show the preview + preview.classList.add("active"); + document.body.classList.add("preview-active"); +} diff --git a/src/home/rendering/render-github-login-button.ts b/src/home/rendering/render-github-login-button.ts new file mode 100644 index 0000000..a8b5f8f --- /dev/null +++ b/src/home/rendering/render-github-login-button.ts @@ -0,0 +1,42 @@ +import { createClient } from "@supabase/supabase-js"; +import { toolbar } from "../ready-toolbar"; + +declare const SUPABASE_URL: string; // @DEV: passed in at build time check build/esbuild-build.ts +declare const SUPABASE_ANON_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts + +const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY); + +export function getSupabase() { + return supabase; +} + +export async function checkSupabaseSession() { + const { + data: { session }, + } = await supabase.auth.getSession(); + + return session; +} + +async function gitHubLoginButtonHandler() { + const { error } = await supabase.auth.signInWithOAuth({ + provider: "github", + options: { + scopes: "repo", + }, + }); + if (error) { + console.error("Error logging in:", error); + } +} +const gitHubLoginButton = document.createElement("button"); +export function renderGitHubLoginButton() { + gitHubLoginButton.id = "github-login-button"; + gitHubLoginButton.innerHTML = "Login With GitHub"; + gitHubLoginButton.addEventListener("click", gitHubLoginButtonHandler); + if (toolbar) { + toolbar.appendChild(gitHubLoginButton); + toolbar.classList.add("ready"); + } +} +export { gitHubLoginButton }; diff --git a/src/home/rendering/render-preview-modal.ts b/src/home/rendering/render-preview-modal.ts new file mode 100644 index 0000000..af5d46d --- /dev/null +++ b/src/home/rendering/render-preview-modal.ts @@ -0,0 +1,44 @@ +export const preview = document.createElement("div"); +preview.classList.add("preview"); +const previewContent = document.createElement("div"); +previewContent.classList.add("preview-content"); +const previewHeader = document.createElement("div"); +previewHeader.classList.add("preview-header"); +export const titleAnchor = document.createElement("a"); +titleAnchor.setAttribute("target", "_blank"); +// titleAnchor.href = "#"; +export const titleHeader = document.createElement("h1"); +const closeButton = document.createElement("button"); +closeButton.classList.add("close-preview"); +closeButton.innerHTML = ``; +const previewBody = document.createElement("div"); +previewBody.classList.add("preview-body"); +export const previewBodyInner = document.createElement("div"); +previewBodyInner.classList.add("preview-body-inner"); +// Assemble the preview box +previewHeader.appendChild(closeButton); +titleAnchor.appendChild(titleHeader); +const openNewLinkIcon = ``; +const openNewLink = document.createElement("span"); +openNewLink.classList.add("open-new-link"); +openNewLink.innerHTML = openNewLinkIcon; +titleAnchor.appendChild(openNewLink); +previewHeader.appendChild(titleAnchor); +previewBody.appendChild(previewBodyInner); +previewContent.appendChild(previewHeader); +previewContent.appendChild(previewBody); +preview.appendChild(previewContent); +document.body.appendChild(preview); +export const issuesContainer = document.getElementById("issues-container"); + +closeButton.addEventListener("click", closePreview); +document.addEventListener("keydown", (event) => { + if (event.key === "Escape") { + closePreview(); + } +}); + +function closePreview() { + preview.classList.remove("active"); + document.body.classList.remove("preview-active"); +} diff --git a/src/home/rendering/setup-keyboard-navigation.ts b/src/home/rendering/setup-keyboard-navigation.ts new file mode 100644 index 0000000..f5e0324 --- /dev/null +++ b/src/home/rendering/setup-keyboard-navigation.ts @@ -0,0 +1,88 @@ +import { taskManager } from "../home"; +import { viewIssueDetails } from "./render-github-issues"; + +const keyDownHandlerCurried = keyDownHandler(); +const disableKeyBoardNavigationCurried = disableKeyboardNavigationCurry; + +let isKeyDownListenerAdded = false; +let isMouseOverListenerAdded = false; + +export function setupKeyboardNavigation(container: HTMLDivElement) { + if (!isKeyDownListenerAdded) { + document.addEventListener("keydown", keyDownHandlerCurried); + isKeyDownListenerAdded = true; + } + if (!isMouseOverListenerAdded) { + container.addEventListener("mouseover", disableKeyBoardNavigationCurried); + isMouseOverListenerAdded = true; + } +} + +function disableKeyboardNavigationCurry() { + const container = document.getElementById("issues-container") as HTMLDivElement; + return disableKeyboardNavigation(container); +} + +function disableKeyboardNavigation(container: HTMLDivElement) { + container.classList.remove("keyboard-selection"); +} + +function keyDownHandler() { + const container = document.getElementById("issues-container") as HTMLDivElement; + return function keyDownHandler(event: KeyboardEvent) { + if (event.key === "ArrowUp" || event.key === "ArrowDown") { + const issues = Array.from(container.children) as HTMLElement[]; + const visibleIssues = issues.filter((issue) => issue.style.display !== "none"); + const activeIndex = visibleIssues.findIndex((issue) => issue.classList.contains("selected")); + const originalIndex = activeIndex === -1 ? -1 : activeIndex; + let newIndex = originalIndex; + + if (event.key === "ArrowUp" && originalIndex > 0) { + newIndex = originalIndex - 1; + event.preventDefault(); + } else if (event.key === "ArrowDown" && originalIndex < visibleIssues.length - 1) { + newIndex = originalIndex + 1; + event.preventDefault(); + } + + if (newIndex !== originalIndex) { + visibleIssues.forEach((issue) => { + issue.classList.remove("selected"); + }); + + visibleIssues[newIndex]?.classList.add("selected"); + visibleIssues[newIndex].scrollIntoView({ + behavior: "smooth", + block: "center", + }); + + container.classList.add("keyboard-selection"); + + const previewId = visibleIssues[newIndex].children[0].getAttribute("data-preview-id"); + + const issueElement = visibleIssues.find((issue) => issue.children[0].getAttribute("data-preview-id") === previewId); + + if (issueElement) { + const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; + if (issueFull) { + viewIssueDetails(issueFull); + } + } + } + } else if (event.key === "Enter") { + const selectedIssue = container.querySelector("#issues-container > div.selected"); + if (selectedIssue) { + const previewId = selectedIssue.children[0].getAttribute("data-preview-id"); + + if (previewId) { + const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; + if (issueFull) { + window.open(issueFull.html_url, "_blank"); + } + } + } + } else if (event.key === "Escape") { + disableKeyboardNavigation(container); + } + }; +} diff --git a/src/home/task-manager.ts b/src/home/task-manager.ts new file mode 100644 index 0000000..59bde85 --- /dev/null +++ b/src/home/task-manager.ts @@ -0,0 +1,58 @@ +import { TaskMaybeFull } from "./fetch-github/preview-to-full-mapping"; +import { getGitHubAccessToken } from "./getters/get-github-access-token"; +import { setLocalStore } from "./getters/get-local-store"; +import { GITHUB_TASKS_STORAGE_KEY } from "./github-types"; + +export class TaskManager { + private _tasks: TaskMaybeFull[] = []; + private _container: HTMLDivElement; + constructor(container: HTMLDivElement) { + this._container = container; + } + + public syncTasks(incoming: TaskMaybeFull[]) { + const incomingIds = new Set(incoming.map((task) => task.preview.id)); + const taskMap = new Map(); + + for (const task of incoming) { + const id = task.full?.id || task.preview.id; + taskMap.set(id, task); + } + + for (const task of this._tasks) { + const id = task.full?.id || task.preview.id; + if (!incomingIds.has(id)) { + continue; + } + if (!taskMap.has(id)) { + taskMap.set(id, task); + } else { + const existingTask = taskMap.get(id); + if (existingTask && !existingTask.full && task.full) { + taskMap.set(id, task); + } + } + } + + this._tasks = Array.from(taskMap.values()); + } + + public getTasks() { + return this._tasks; + } + + public getTaskByPreviewId(id: number) { + const task = this._tasks.find((task) => task.preview.id === id); + if (!task) throw new Error(`No task found for preview id ${id}`); + return task; + } + + public getContainer() { + return this._container; + } + + public async writeToStorage() { + const _accessToken = await getGitHubAccessToken(); + setLocalStore(GITHUB_TASKS_STORAGE_KEY, { timestamp: Date.now(), tasks: this._tasks, loggedIn: _accessToken !== null }); + } +} diff --git a/src/the-grid.ts b/src/the-grid.ts new file mode 100644 index 0000000..02c651f --- /dev/null +++ b/src/the-grid.ts @@ -0,0 +1,162 @@ +export function grid(node = document.body, callback?: () => void) { + // Create canvas and WebGL context + const canvas = document.createElement("canvas"); + const devicePixelRatio = window.devicePixelRatio || 1; + canvas.width = window.innerWidth * devicePixelRatio; + canvas.height = window.innerHeight * devicePixelRatio; + node.appendChild(canvas); + + const gl = canvas.getContext("webgl") as WebGLRenderingContext; + + // Enable alpha blending + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + + // Define shader sources + const vertexShaderSource = ` + attribute vec2 a_position; + + void main() { + gl_Position = vec4(a_position, 0, 1); + } +`; + + // cspell:ignore mediump + const fragmentShaderSource = ` + precision mediump float; + + uniform vec2 u_resolution; + uniform float u_time; + + float rand(vec2 n) { + return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); + } + + void main() { + vec3 color = vec3(128.0/255.0, 128.0/255.0, 128.0/255.0); // #808080 + vec2 tilePosition = mod(gl_FragCoord.xy, 24.0); + vec2 tileNumber = floor(gl_FragCoord.xy / 24.0); + + float period = rand(tileNumber) * 9.0 + 1.0; // Random value in the range [1, 10] + float phase = fract(u_time / period / 8.0); // Animation eight times slower + float opacity = (1.0 - abs(phase * 2.0 - 1.0)) * 0.125; // Limit maximum opacity to 0.25 + + vec4 backgroundColor = vec4(color, opacity); + + if (tilePosition.x > 23.0 && tilePosition.y < 1.0) { + gl_FragColor = vec4(color, 1.0); // Full opacity for the dot + } else { + gl_FragColor = backgroundColor; + } + } +`; + + // Define shader creation function + function createShader(gl: WebGLRenderingContext, type: number, source: string) { + const shader = gl.createShader(type); + if (!shader) { + console.error("An error occurred creating the shaders"); + return null; + } + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + console.error("An error occurred compiling the shaders: " + gl.getShaderInfoLog(shader)); + gl.deleteShader(shader); + return null; + } + return shader; + } + + // Create vertex and fragment shaders + const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource); + if (!vertexShader) { + console.error("An error occurred creating the vertex shader"); + return; + } + const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource); + if (!fragmentShader) { + console.error("An error occurred creating the fragment shader"); + return; + } + + // Create program, attach shaders, and link + const program = gl.createProgram(); + if (!program) { + console.error("An error occurred creating the program"); + return; + } + + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + + // Verify program link status + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + console.error("Unable to initialize the shader program: " + gl.getProgramInfoLog(program)); + return; + } + + // Use the program + gl.useProgram(program); + + // Get location of time and resolution uniforms + const timeUniformLocation = gl.getUniformLocation(program, "u_time"); + const resolutionUniformLocation = gl.getUniformLocation(program, "u_resolution"); + + // Bind the position buffer and set attribute pointer + const positionBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW); + + const positionAttributeLocation = gl.getAttribLocation(program, "a_position"); + gl.enableVertexAttribArray(positionAttributeLocation); + gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0); + + // Resize function + function resizeCanvasToDisplaySize(canvas: HTMLCanvasElement) { + // Lookup the size the browser is displaying the canvas. + const displayWidth = window.innerWidth; + const displayHeight = window.innerHeight; + + // Check if the canvas is not the same size. + if (canvas.width != displayWidth || canvas.height != displayHeight) { + // Make the canvas the same size + canvas.width = displayWidth; + canvas.height = displayHeight; + + // Update WebGL viewport to match + gl.viewport(0, 0, canvas.width, canvas.height); + } + } + + // Render function + function render() { + resizeCanvasToDisplaySize(canvas); // Check and update canvas size each frame + + // Update resolution uniform + gl.uniform2f(resolutionUniformLocation, canvas.width, canvas.height); + + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + // Update time uniform + gl.uniform1f(timeUniformLocation, performance.now() / 1000.0); + + // Draw + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + // Request next frame + requestAnimationFrame(render); + } + + // Handle window resize + window.addEventListener("resize", () => resizeCanvasToDisplaySize(canvas)); + + // Callback + if (callback) { + callback(); + } + // Start the render loop + render(); +} diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..75322cc --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/icon-512x512.png b/static/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebb3ae6af5dfac7704434b5f739261640f16655 GIT binary patch literal 65863 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 z%0D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

t`~c^h=1PoV5Nw5J<)sP%e1Ej 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 literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html index dbae5f4..23fb038 100644 --- a/static/index.html +++ b/static/index.html @@ -2,12 +2,57 @@ - - Ubiquity TypeScript Template - + Leaderboard | Ubiquity DAO + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Ubiquity TypeScript Template

- +
+
+
+
+ + + Ubiquity DAO | + Leaderboard + +
+
+
+ diff --git a/static/main.ts b/static/main.ts deleted file mode 100644 index b19bfa7..0000000 --- a/static/main.ts +++ /dev/null @@ -1,10 +0,0 @@ -export async function mainModule() { - console.log(`Hello from mainModule`); -} -mainModule() - .then(() => { - console.log("mainModule loaded"); - }) - .catch((error) => { - console.error(error); - }); diff --git a/static/style/fonts/ubiquity-nova-standard.eot b/static/style/fonts/ubiquity-nova-standard.eot new file mode 100644 index 0000000000000000000000000000000000000000..1e46099c15e2689320d5364ce9efe044a746c4d2 GIT binary patch literal 56807 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

+B!4@fPXK=MbH20b9;y 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 literal 0 HcmV?d00001 diff --git a/static/style/fonts/ubiquity-nova-standard.ttf b/static/style/fonts/ubiquity-nova-standard.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d95348697ee4708a002df1f2d5f7651779a32347 GIT binary patch literal 187128 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�o)%n5Ro>)+X{RQp&#yU;IxEBgJqng`uq=ux+O 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 Qg*sdCOSBq--N{P*KZNstwg3PC literal 0 HcmV?d00001 diff --git a/static/style/fonts/ubiquity-nova-standard.woff b/static/style/fonts/ubiquity-nova-standard.woff new file mode 100644 index 0000000000000000000000000000000000000000..0c2691e4352e99afb2390b0cee6734d71d5aa035 GIT binary patch literal 77756 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 EMtAR8XaE2J literal 0 HcmV?d00001 diff --git a/static/style/inverted-style.css b/static/style/inverted-style.css new file mode 100644 index 0000000..b80c26e --- /dev/null +++ b/static/style/inverted-style.css @@ -0,0 +1,702 @@ +@media (prefers-color-scheme: light) { + :root { + --grid-background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSAYG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAwf1XlwAAACNJREFUSA3t0IEAAAAMBKFHm7/UTaQQWnXDgAEDBgwYMGDgAXaJAz4RVVHYAAAAAElFTkSuQmCC"); + --background-color-default-brightness: 2%; + --background-color-light-brightness: 6%; + --border-brightness: 5%; + --background-color-default: hsl(225 50% var(--background-color-default-brightness) / 1); + --background-color-light: hsl(225 50% var(--background-color-light-brightness) / 1); + --border-color: hsl(225 25% var(--border-brightness) / 1); + } + #logo { + height: 28px; + margin-right: 4px; + } + #authenticated, + #branding { + opacity: 0.5; + transition: 125ms opacity ease-in-out; + } + #authenticated:hover, + #branding:hover { + opacity: 1; + } + #branding > span { + padding: 8px; + } + body, + html { + margin: 0; + padding: 0; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; + } + * { + font-family: "Proxima Nova", "Ubiquity Nova", sans-serif; + color: #000000; + font-weight: 500; + } + @font-face { + font-family: "Ubiquity Nova"; + font-style: normal; + font-weight: 400; + src: url(fonts/ubiquity-nova-standard.eot); + src: + url(fonts/ubiquity-nova-standard.eot#iefix) format("embedded-opentype"), + url(fonts/ubiquity-nova-standard.woff) format("woff"), + url(fonts/ubiquity-nova-standard.ttf) format("truetype"); + } + #issues-container { + max-width: 640px; + scrollbar-width: none; + -ms-overflow-style: none; + padding: 56px 0; + transition: 0.25s all cubic-bezier(0, 1, 1, 1); + } + body.preview-active #issues-container { + transform: translateX(-50%); + } + &::-webkit-scrollbar { + display: none; + } + #issues-container .issue-element-inner { + transition: 125ms opacity ease-out 62.5ms; + } + #issues-container:hover .issue-element-inner { + opacity: 0.5; + } + #issues-container.keyboard-selection:hover .issue-element-inner { + opacity: 1; + } + #issues-container * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + #issues-container > div:first-child { + border-top: 1px solid #7f7f7f20; + } + #issues-container > div:last-child { + border-top: 1px solid #7f7f7f20; + } + #issues-container > div { + padding: 0 16px; + overflow: hidden; + background-size: 56px; + background-position: 0; + background-repeat: no-repeat; + opacity: 0.125; + margin: 3px auto; + border: 1px solid #7f7f7f20; + border-radius: 4px; + cursor: pointer; + margin: 4px; + filter: blur(4px); + display: block; + /* border-color: var(--border-color); */ + /* box-shadow: inset 0 0 24px #00bfff10; */ + } + #issues-container > div.selected, + #issues-container > div.selected .info, + #issues-container > div.selected h3 { + opacity: 1; + } + #issues-container.keyboard-selection > div.active { + opacity: 0.33; + } + #issues-container.keyboard-selection > div.active.selected { + opacity: 1; + } + #issues-container > div.active { + transition: 125ms all ease-in-out; + opacity: 1; + filter: blur(0); + } + #issues-container > div:hover { + opacity: 1; + transition: background-color 0s; + } + #issues-container > div:hover .info { + opacity: 1; + } + #issues-container > div:hover .issue-element-inner { + transition: 125ms opacity ease-in-out; + opacity: 1; + } + #issues-container > div:active { + background-color: #7f7f7f40; + } + #issues-container h3 { + line-height: 1; + font-size: 16px; + text-overflow: ellipsis; + margin: 0; + } + #issues-container p { + text-align: right; + } + p { + margin: 0; + line-height: 1; + color: #404040; + font-size: 12px; + letter-spacing: 0.5px; + text-rendering: geometricPrecision; + top: 0; + right: 0; + } + li { + margin: 0; + line-height: 1; + color: #404040; + font-size: 12px; + letter-spacing: 0.5px; + text-rendering: geometricPrecision; + top: 0; + right: 0; + } + .issue-element-inner { + position: relative; + text-align: left; + display: flex; + padding: 12px 0; + align-items: center; + } + p.organization-name { + opacity: 0.5; + display: inline-block; + } + p.repository-name { + display: inline-block; + } + label:first-child { + margin-left: 0; + } + label { + padding: 4px 6px; + border-radius: 4px; + margin: 0 4px 0; + font-size: 12px; + text-align: center; + white-space: nowrap; + background-color: #7f7f7f20; + width: 64px; + letter-spacing: 0.5px; + flex-grow: 4; + justify-content: center; + display: flex; + align-items: center; + height: 16px; + text-overflow: ellipsis; + overflow: hidden; + display: inline-block; + } + input[type="radio"] { + background-color: unset; + cursor: default; + appearance: unset; + display: none; + box-sizing: border-box; + margin: 0; + padding: 0; + border: none; + } + #filters label { + cursor: pointer; + min-width: fit-content; + } + #filters label:hover { + background-color: #7f7f7f40; + } + #filters label:active { + background-color: #7f7f7f80; + } + input[type="radio"]:checked + label { + background-color: #7f7f7f80 !important; + } + .labels { + display: flex; + margin-left: auto; + } + .partner { + bottom: 0; + margin: 0; + } + body { + display: flex; + align-items: center; + align-content: center; + justify-content: center; + } + .info { + opacity: 0.66; + transition: 125ms opacity ease-in-out; + align-items: center; + } + #issues-container > .issue-element-wrapper { + opacity: 0.5; + transition: 0.33s all cubic-bezier(0, 1, 1, 1); + filter: blur(8px); + } + button { + appearance: unset; + text-rendering: unset; + color: unset; + letter-spacing: unset; + word-spacing: unset; + line-height: unset; + text-transform: unset; + text-indent: unset; + text-shadow: unset; + display: unset; + text-align: unset; + align-items: unset; + cursor: pointer; + box-sizing: unset; + background-color: unset; + margin: unset; + padding-block: unset; + padding-inline: unset; + border-width: unset; + border-style: unset; + border-color: unset; + border-image: unset; + border: 1px solid #7f7f7f20; + padding: 8px 16px; + border-radius: 4px; + text-transform: uppercase; + letter-spacing: 1px; + background-color: #7f7f7f10; + } + button:hover { + background-color: #7f7f7f20; + } + button:active { + background-color: #7f7f7f40; + } + .toolbar { + position: fixed; + width: calc(100vw - 8px); + height: 48px; + top: 0; + backdrop-filter: blur(8px); + padding: 4px; + display: flex; + border-bottom: 1px solid #7f7f7f20; + justify-content: center; + -webkit-backdrop-filter: blur(8px); + justify-content: space-between; + justify-content: space-evenly; + } + .toolbar > * { + align-items: center; + display: inline-flex; + text-align: left; + margin: 0 16px; + } + #authenticated > * { + display: inline-flex; + align-items: center; + justify-content: center; + margin: 0 4px; + max-height: 48px; + } + #authenticated > img { + border-radius: 50%; + height: 40px; + padding: 4px 0; + } + .toolbar[data-authenticated="true"] > #github-login-button { + display: none; + } + .toolbar { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0; + transition: 0.5s opacity ease-in-out; + } + .toolbar.ready { + opacity: 1; + } + #branding { + text-transform: uppercase; + letter-spacing: 1.5px; + font-weight: 400; + text-rendering: geometricPrecision; + } + .full { + display: unset !important; + } + @media screen and (max-width: 804px) { + .mid { + display: none !important; + } + #branding > span { + padding: 0; + } + } + @media screen and (max-width: 1139px) { + .full { + display: none !important; + } + .issue-element-inner { + display: block; + } + #issues-container .labels { + margin-top: 4px; + } + #branding { + margin: auto; + margin-left: 12px; + } + .toolbar { + overflow-x: auto; + margin: 0; + padding-left: 0; + display: flex; + align-items: center; + justify-content: center; + } + .toolbar > * { + margin-left: 12px; + } + .toolbar button { + /* padding: 12px 16px; */ + height: 24px !important; + padding: 4px 16px; + line-height: 1; + } + } + @media screen and (max-width: 1280px) { + body.preview-active { + overflow: hidden; + } + .preview.active { + transform: translateX(0) !important; + } + body.preview-active #issues-container { + transform: translateX(0) !important; + } + body.preview-active > #issues-container > div, + body.preview-active > background { + filter: blur(8px); + pointer-events: none; + } + } + .toolbar > button { + text-align: center; + } + #filters button { + margin-top: 8px; + margin-right: 8px; + } + #issues-container img { + height: 24px; + border-radius: 24px; + display: flex; + align-items: center; + justify-content: center; + width: 24px; + opacity: 0; + transition: 0.25s opacity ease-in-out; + } + #issues-container img[src] { + opacity: 1; + } + + background, + background #grid { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + } + background #grid { + /* -webkit-mask-image: radial-gradient(#ffffff20 0, #ffffff80 100%); */ + /* mask-image: radial-gradient(#ffffff20 0, #ffffff80 100%); */ + pointer-events: none; + } + .preview blockquote { + margin-left: 16px; + opacity: 0.66; + } + .preview sup { + display: block; + } + .preview hr { + border-color: #00000040; + } + .preview p { + line-height: 1.25; + word-break: break-word; + margin-bottom: 12px; + letter-spacing: 0; + font-size: 16px; + } + .preview img { + max-width: 100%; + } + .preview pre { + position: relative; + display: inline-block; + width: 100%; + overflow: scroll; + height: 48px; + } + .preview pre code { + position: absolute; + font-family: monospace; + } + .preview ol, + .preview ul { + padding-left: 12px; + margin-left: 4px; + } + .preview h1 { + margin: 8px; + font-size: 24px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline: 0; + margin-inline-end: 0; + } + .preview a { + word-break: break-all; + } + .preview a[href*="//"] .open-new-link svg + { + fill: #00000080; + vertical-align: middle; + height: 20px; + } + .preview-body-inner { + line-height: 1.25; + } + .preview-body-inner > :last-child { + margin-bottom: 0; + } + .preview { + text-align: left; + position: fixed; + transition: 0.25s all cubic-bezier(0, 1, 1, 1); + max-width: 640px; + border: 1px solid #7f7f7f20; + border-radius: 4px; + opacity: 0; + top: 60px; + /* flex-direction: row; */ + /* display: flex; */ + /* transform: translateX(0); */ + /* flex-wrap: wrap; */ + pointer-events: none; + /* overflow: hidden; */ + width: calc(100vw - 14px); + } + .preview * { + pointer-events: none; + } + .preview.active { + pointer-events: all; + } + .preview.active * { + pointer-events: all; + } + .close-preview svg { + fill: #00000080; + vertical-align: middle; + height: 36px; + } + .preview.active { + opacity: 1; + pointer-events: all; + transform: translateX(50%); + /* box-shadow: 0 0px 16px #00000010; */ + } + .preview-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 16px; + } + .preview-header > a { + word-wrap: initial; + text-decoration: none; + opacity: 0.75; + display: flex; + justify-content: right; + align-items: center; + width: calc(100% - 72px); + } + .preview-header > a:hover { + opacity: 1; + } + .preview-header > a > h1 { + word-wrap: initial; + word-break: normal; + display: inline; + vertical-align: middle; + margin-right: 12px; + text-align: right; + font-size: 20px; + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .preview-body { + overflow: scroll; + margin: 0; + border-top: 1px solid #dfdfdf; + padding: 16px; + max-height: calc(100vh - (80px)); + max-height: calc(100vh - (242px)); + /* border-color: var(--border-color); */ + } + .preview-content { + width: 100%; + } + .preview button.close-preview { + right: 0; + top: 0; + margin-right: 8px; + padding: 8px 8px; + border: none; + background: 0 0; + padding: 0; + } + .preview button.close-preview:hover svg { + fill: #000000; + } + .preview li { + margin-bottom: 8px; + letter-spacing: 0; + font-size: 16px; + line-height: 1.25; + } + #filters input[type="text"] { + margin: 0 4px; + padding: 4px; + border: none; + border-radius: 4px; + background-color: #7f7f7f20; + width: 100%; + height: 16px; + text-align: center; + min-width: 80px; + } + #filters input[type="text"]::placeholder { + font-size: 12px; + letter-spacing: 0.5px; + } + #filters input[type="text"].hidden { + display: none; + } + button#github-login-button { + margin-left: 0; + } + + p.organization-name::after { + content: "/"; + } + #loader { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: #ffffff80; + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + } + + input[type="radio"][data-ordering="reverse"]:not(#leaderboard) + label::after { + margin-left: 6px; + content: "â–²"; + } + + input[type="radio"][data-ordering="normal"]:not(#leaderboard) + label::after { + margin-left: 6px; + content: "â–¼"; + } + + #bottom-bar { + top: unset; + bottom: 0; + opacity: 1; + border-top: 1px solid #7f7f7f20; + border-bottom: unset; + } + #bottom-bar a { + text-decoration: none; + } + #bottom-bar a button { + height: 30px; + } + .toolbar button { + white-space: nowrap; + } + + .info .entry-title { + font-size: 16px; + line-height: 1.25; + margin: 0; + margin-bottom: 4px; + display: grid; + grid-template-columns: 1fr 1fr; + } + + .info .entry-body { + width: 100%; + font-size: 12px; + line-height: 1.25; + margin: 0; + margin-bottom: 4px; + display: grid; + grid-template-columns: 1fr 1fr; + } + + background #grid { + pointer-events: none; + } + + background #grid canvas { + width: 100%; + height: 100%; + opacity: 0; + animation: background-grid-fade-in 3s ease-in-out forwards; + } + + background .gradient { + width: 200vw; + height: 200vh; + position: absolute; + opacity: 0; + } + .grid-loaded background .gradient { + background-image: radial-gradient(#00bfff00 0%, #00bfffff 15%, #00bfff00 34%, #00bfffff 58%, #00bfff00 75%, #00bfffff 100%); + animation: background-gradients-fade-in 3s ease-in-out forwards; + } + background > :nth-child(1) { + transform: translateX(-100vw); + } + background > :nth-child(2) { + transform: translateY(-50vh); + } + + @keyframes background-gradients-fade-in { + to { + opacity: 0.125; + } + } + @keyframes background-grid-fade-in { + to { + opacity: 0.5; + } + } +} diff --git a/static/style/special.css b/static/style/special.css new file mode 100644 index 0000000..cacf08d --- /dev/null +++ b/static/style/special.css @@ -0,0 +1,86 @@ +:root { + --dark-background: #000210; + --dark-background-half: #00021080; + --light-background: #f8f8f8; + --light-background-half: #f8f8f880; +} + +@media (prefers-color-scheme: dark) { + background { + background-color: var(--dark-background); + } + html, + #issues-container > div, + .preview { + background-color: var(--dark-background); + border-color: var(--border-color); + border-color: #80808020; + } + #issues-container > div, + .preview > .preview-content { + box-shadow: inset 0 0 24px #0080ff08; + } + + .toolbar.ready { + background-color: var(--dark-background-half); + } + body.preview-active button#github-login-button.highlight { + /* background-color: #008080; */ + /* border-width: 0; */ + animation: highlight-dark-mode 1s ease-in-out infinite alternate; + } + .grid-loaded #bottom-bar { + background-color: var(--dark-background-half); + } +} + +@media (prefers-color-scheme: light) { + #issues-container > div, + .preview > .preview-content { + box-shadow: inset 0 0 24px #00000008; + } + background { + /* background-color: var(--light-background); */ + } + #grid { + /* opacity: 0.25; */ + filter: invert(1); + } + #issues-container > div, + .preview { + background-color: var(--light-background); + } + .toolbar.ready { + background-color: var(--light-background-half); + } + .grid-loaded #bottom-bar { + background-color: var(--light-background-half); + } + body.preview-active button#github-login-button.highlight { + animation: highlight-light-mode 1s ease-in-out infinite alternate; + } + .grid-loaded background .gradient { + opacity: 0; + animation: none; + background-image: none; + } +} + +@keyframes highlight-dark-mode { + from { + background-color: #808080; + box-shadow: 0 0 24px 0px #808080; + } + to { + background-color: #000; + } +} +@keyframes highlight-light-mode { + from { + background-color: #bfbfbf; + } + to { + background-color: #fff; + box-shadow: 0 0 24px 12px #fff; + } +} diff --git a/static/style/style.css b/static/style/style.css new file mode 100644 index 0000000..41029b1 --- /dev/null +++ b/static/style/style.css @@ -0,0 +1,702 @@ +@media (prefers-color-scheme: dark) { + :root { + --grid-background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSAYG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAwf1XlwAAACNJREFUSA3t0IEAAAAMBKFHm7/UTaQQWnXDgAEDBgwYMGDgAXaJAz4RVVHYAAAAAElFTkSuQmCC"); + --background-color-default-brightness: 2%; + --background-color-light-brightness: 6%; + --border-brightness: 5%; + --background-color-default: hsl(225 50% var(--background-color-default-brightness) / 1); + --background-color-light: hsl(225 50% var(--background-color-light-brightness) / 1); + --border-color: hsl(225 25% var(--border-brightness) / 1); + } + #logo { + height: 28px; + margin-right: 4px; + } + #authenticated, + #branding { + opacity: 0.5; + transition: 125ms opacity ease-in-out; + } + #authenticated:hover, + #branding:hover { + opacity: 1; + } + #branding > span { + padding: 8px; + } + body, + html { + margin: 0; + padding: 0; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; + } + * { + font-family: "Proxima Nova", "Ubiquity Nova", sans-serif; + color: #fff; + font-weight: 500; + } + @font-face { + font-family: "Ubiquity Nova"; + font-style: normal; + font-weight: 400; + src: url(fonts/ubiquity-nova-standard.eot); + src: + url(fonts/ubiquity-nova-standard.eot#iefix) format("embedded-opentype"), + url(fonts/ubiquity-nova-standard.woff) format("woff"), + url(fonts/ubiquity-nova-standard.ttf) format("truetype"); + } + #issues-container { + max-width: 640px; + scrollbar-width: none; + -ms-overflow-style: none; + padding: 56px 0; + transition: 0.25s all cubic-bezier(0, 1, 1, 1); + } + body.preview-active #issues-container { + transform: translateX(-50%); + } + &::-webkit-scrollbar { + display: none; + } + #issues-container .issue-element-inner { + transition: 125ms opacity ease-out 62.5ms; + } + #issues-container:hover .issue-element-inner { + opacity: 0.5; + } + #issues-container.keyboard-selection:hover .issue-element-inner { + opacity: 1; + } + #issues-container * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + #issues-container > div:first-child { + border-top: 1px solid #80808020; + } + #issues-container > div:last-child { + border-top: 1px solid #80808020; + } + #issues-container > div { + padding: 0 16px; + overflow: hidden; + background-size: 56px; + background-position: 0; + background-repeat: no-repeat; + opacity: 0.125; + margin: 3px auto; + border: 1px solid #80808020; + border-radius: 4px; + cursor: pointer; + margin: 4px; + filter: blur(4px); + display: block; + /* border-color: var(--border-color); */ + /* box-shadow: inset 0 0 24px #00bfff10; */ + } + #issues-container > div.selected, + #issues-container > div.selected .info, + #issues-container > div.selected h3 { + opacity: 1; + } + #issues-container.keyboard-selection > div.active { + opacity: 0.33; + } + #issues-container.keyboard-selection > div.active.selected { + opacity: 1; + } + #issues-container > div.active { + transition: 125ms all ease-in-out; + opacity: 1; + filter: blur(0); + } + #issues-container > div:hover { + opacity: 1; + transition: background-color 0s; + } + #issues-container > div:hover .info { + opacity: 1; + } + #issues-container > div:hover .issue-element-inner { + transition: 125ms opacity ease-in-out; + opacity: 1; + } + #issues-container > div:active { + background-color: #80808040; + } + #issues-container h3 { + line-height: 1; + font-size: 16px; + text-overflow: ellipsis; + margin: 0; + } + #issues-container p { + text-align: right; + } + p { + margin: 0; + line-height: 1; + color: #bfbfbf; + font-size: 12px; + letter-spacing: 0.5px; + text-rendering: geometricPrecision; + top: 0; + right: 0; + } + li { + margin: 0; + line-height: 1; + color: #bfbfbf; + font-size: 12px; + letter-spacing: 0.5px; + text-rendering: geometricPrecision; + top: 0; + right: 0; + } + .issue-element-inner { + position: relative; + text-align: left; + display: flex; + padding: 12px 0; + align-items: center; + } + p.organization-name { + opacity: 0.5; + display: inline-block; + } + p.repository-name { + display: inline-block; + } + label:first-child { + margin-left: 0; + } + label { + padding: 4px 6px; + border-radius: 4px; + margin: 0 4px 0; + font-size: 12px; + text-align: center; + white-space: nowrap; + background-color: #80808020; + width: 64px; + letter-spacing: 0.5px; + flex-grow: 4; + justify-content: center; + display: flex; + align-items: center; + height: 16px; + text-overflow: ellipsis; + overflow: hidden; + display: inline-block; + } + input[type="radio"] { + background-color: unset; + cursor: default; + appearance: unset; + display: none; + box-sizing: border-box; + margin: 0; + padding: 0; + border: none; + } + #filters label { + cursor: pointer; + min-width: fit-content; + } + #filters label:hover { + background-color: #80808040; + } + #filters label:active { + background-color: #80808080; + } + input[type="radio"]:checked + label { + background-color: #80808080 !important; + } + .labels { + display: flex; + margin-left: auto; + } + .partner { + bottom: 0; + margin: 0; + } + body { + display: flex; + align-items: center; + align-content: center; + justify-content: center; + } + .info { + opacity: 0.66; + transition: 125ms opacity ease-in-out; + align-items: center; + } + #issues-container > .issue-element-wrapper { + opacity: 0.5; + transition: 0.33s all cubic-bezier(0, 1, 1, 1); + filter: blur(8px); + } + button { + appearance: unset; + text-rendering: unset; + color: unset; + letter-spacing: unset; + word-spacing: unset; + line-height: unset; + text-transform: unset; + text-indent: unset; + text-shadow: unset; + display: unset; + text-align: unset; + align-items: unset; + cursor: pointer; + box-sizing: unset; + background-color: unset; + margin: unset; + padding-block: unset; + padding-inline: unset; + border-width: unset; + border-style: unset; + border-color: unset; + border-image: unset; + border: 1px solid #80808020; + padding: 8px 16px; + border-radius: 4px; + text-transform: uppercase; + letter-spacing: 1px; + background-color: #80808010; + } + button:hover { + background-color: #80808020; + } + button:active { + background-color: #80808040; + } + .toolbar { + position: fixed; + width: calc(100vw - 8px); + height: 48px; + top: 0; + backdrop-filter: blur(8px); + padding: 4px; + display: flex; + border-bottom: 1px solid #80808020; + justify-content: center; + -webkit-backdrop-filter: blur(8px); + justify-content: space-between; + justify-content: space-evenly; + } + .toolbar > * { + align-items: center; + display: inline-flex; + text-align: left; + margin: 0 16px; + } + #authenticated > * { + display: inline-flex; + align-items: center; + justify-content: center; + margin: 0 4px; + max-height: 48px; + } + #authenticated > img { + border-radius: 50%; + height: 40px; + padding: 4px 0; + } + .toolbar[data-authenticated="true"] > #github-login-button { + display: none; + } + .toolbar { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0; + transition: 0.5s opacity ease-in-out; + } + .toolbar.ready { + opacity: 1; + } + #branding { + text-transform: uppercase; + letter-spacing: 1.5px; + font-weight: 400; + text-rendering: geometricPrecision; + } + .full { + display: unset !important; + } + @media screen and (max-width: 804px) { + .mid { + display: none !important; + } + #branding > span { + padding: 0; + } + } + @media screen and (max-width: 1139px) { + .full { + display: none !important; + } + .issue-element-inner { + display: block; + } + #issues-container .labels { + margin-top: 4px; + } + #branding { + margin: auto; + margin-left: 12px; + } + .toolbar { + overflow-x: auto; + margin: 0; + padding-left: 0; + display: flex; + align-items: center; + justify-content: center; + } + .toolbar > * { + margin-left: 12px; + } + .toolbar button { + /* padding: 12px 16px; */ + height: 24px !important; + padding: 4px 16px; + line-height: 1; + } + } + @media screen and (max-width: 1280px) { + body.preview-active { + overflow: hidden; + } + .preview.active { + transform: translateX(0) !important; + } + body.preview-active #issues-container { + transform: translateX(0) !important; + } + body.preview-active > #issues-container > div, + body.preview-active > background { + filter: blur(8px); + pointer-events: none; + } + } + .toolbar > button { + text-align: center; + } + #filters button { + margin-top: 8px; + margin-right: 8px; + } + #issues-container img { + height: 24px; + border-radius: 24px; + display: flex; + align-items: center; + justify-content: center; + width: 24px; + opacity: 0; + transition: 0.25s opacity ease-in-out; + } + #issues-container img[src] { + opacity: 1; + } + + background, + background #grid { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + } + background #grid { + /* -webkit-mask-image: radial-gradient(#00000020 0, #00000080 100%); */ + /* mask-image: radial-gradient(#00000020 0, #00000080 100%); */ + pointer-events: none; + } + .preview blockquote { + margin-left: 16px; + opacity: 0.66; + } + .preview sup { + display: block; + } + .preview hr { + border-color: #ffffff40; + } + .preview p { + line-height: 1.25; + word-break: break-word; + margin-bottom: 12px; + letter-spacing: 0; + font-size: 16px; + } + .preview img { + max-width: 100%; + } + .preview pre { + position: relative; + display: inline-block; + width: 100%; + overflow: scroll; + height: 48px; + } + .preview pre code { + position: absolute; + font-family: monospace; + } + .preview ol, + .preview ul { + padding-left: 12px; + margin-left: 4px; + } + .preview h1 { + margin: 8px; + font-size: 24px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline: 0; + margin-inline-end: 0; + } + .preview a { + word-break: break-all; + } + .preview a[href*="//"] .open-new-link svg + { + fill: #ffffff80; + vertical-align: middle; + height: 20px; + } + .preview-body-inner { + line-height: 1.25; + } + .preview-body-inner > :last-child { + margin-bottom: 0; + } + .preview { + text-align: left; + position: fixed; + transition: 0.25s all cubic-bezier(0, 1, 1, 1); + max-width: 640px; + border: 1px solid #80808020; + border-radius: 4px; + opacity: 0; + top: 60px; + /* flex-direction: row; */ + /* display: flex; */ + /* transform: translateX(0); */ + /* flex-wrap: wrap; */ + pointer-events: none; + /* overflow: hidden; */ + width: calc(100vw - 14px); + } + .preview * { + pointer-events: none; + } + .preview.active { + pointer-events: all; + } + .preview.active * { + pointer-events: all; + } + .close-preview svg { + fill: #ffffff80; + vertical-align: middle; + height: 36px; + } + .preview.active { + opacity: 1; + pointer-events: all; + transform: translateX(50%); + /* box-shadow: 0 0px 16px #ffffff10; */ + } + .preview-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 16px; + } + .preview-header > a { + word-wrap: initial; + text-decoration: none; + opacity: 0.75; + display: flex; + justify-content: right; + align-items: center; + width: calc(100% - 72px); + } + .preview-header > a:hover { + opacity: 1; + } + .preview-header > a > h1 { + word-wrap: initial; + word-break: normal; + display: inline; + vertical-align: middle; + margin-right: 12px; + text-align: right; + font-size: 20px; + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .preview-body { + overflow: scroll; + margin: 0; + border-top: 1px solid #202020; + padding: 16px; + max-height: calc(100vh - (80px)); + max-height: calc(100vh - (242px)); + /* border-color: var(--border-color); */ + } + .preview-content { + width: 100%; + } + .preview button.close-preview { + right: 0; + top: 0; + margin-right: 8px; + padding: 8px 8px; + border: none; + background: 0 0; + padding: 0; + } + .preview button.close-preview:hover svg { + fill: #fff; + } + .preview li { + margin-bottom: 8px; + letter-spacing: 0; + font-size: 16px; + line-height: 1.25; + } + #filters input[type="text"] { + margin: 0 4px; + padding: 4px; + border: none; + border-radius: 4px; + background-color: #80808020; + width: 100%; + height: 16px; + text-align: center; + min-width: 80px; + } + #filters input[type="text"]::placeholder { + font-size: 12px; + letter-spacing: 0.5px; + } + #filters input[type="text"].hidden { + display: none; + } + button#github-login-button { + margin-left: 0; + } + + p.organization-name::after { + content: "/"; + } + #loader { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: #00000080; + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + } + + input[type="radio"][data-ordering="reverse"]:not(#leaderboard) + label::after { + margin-left: 6px; + content: "â–²"; + } + + input[type="radio"][data-ordering="normal"]:not(#leaderboard) + label::after { + margin-left: 6px; + content: "â–¼"; + } + + #bottom-bar { + top: unset; + bottom: 0; + opacity: 1; + border-top: 1px solid #80808020; + border-bottom: unset; + } + #bottom-bar a { + text-decoration: none; + } + #bottom-bar a button { + height: 30px; + } + .toolbar button { + white-space: nowrap; + } + + .info .entry-title { + font-size: 16px; + line-height: 1.25; + margin: 0; + margin-bottom: 4px; + display: grid; + grid-template-columns: 1fr 1fr; + } + + .info .entry-body { + width: 100%; + font-size: 12px; + line-height: 1.25; + margin: 0; + margin-bottom: 4px; + display: grid; + grid-template-columns: 1fr 1fr; + } + + background #grid { + pointer-events: none; + } + + background #grid canvas { + width: 100%; + height: 100%; + opacity: 0; + animation: background-grid-fade-in 3s ease-in-out forwards; + } + + background .gradient { + width: 200vw; + height: 200vh; + position: absolute; + opacity: 0; + } + .grid-loaded background .gradient { + background-image: radial-gradient(#00bfff00 0%, #00bfffff 15%, #00bfff00 34%, #00bfffff 58%, #00bfff00 75%, #00bfffff 100%); + animation: background-gradients-fade-in 3s ease-in-out forwards; + } + background > :nth-child(1) { + transform: translateX(-100vw); + } + background > :nth-child(2) { + transform: translateY(-50vh); + } + + @keyframes background-gradients-fade-in { + to { + opacity: 0.125; + } + } + @keyframes background-grid-fade-in { + to { + opacity: 0.5; + } + } +} diff --git a/yarn.lock b/yarn.lock index 0c43b39..d4394af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1580,6 +1580,101 @@ dependencies: which "^4.0.0" +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^5.0.2": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/plugin-paginate-rest@11.3.1": + version "11.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" + integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== + +"@octokit/plugin-rest-endpoint-methods@13.2.2": + version "13.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" + integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^20.0.2": + version "20.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" + integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== + dependencies: + "@octokit/core" "^5.0.2" + "@octokit/plugin-paginate-rest" "11.3.1" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "13.2.2" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" + integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== + dependencies: + "@octokit/openapi-types" "^22.2.0" + "@open-draft/deferred-promise@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" @@ -1743,6 +1838,63 @@ ignore "^5.1.8" p-map "^4.0.0" +"@supabase/auth-js@2.64.2": + version "2.64.2" + resolved "https://registry.yarnpkg.com/@supabase/auth-js/-/auth-js-2.64.2.tgz#fe6828ed2c9844bf2e71b27f88ddfb635f24d1c1" + integrity sha512-s+lkHEdGiczDrzXJ1YWt2y3bxRi+qIUnXcgkpLSrId7yjBeaXBFygNjTaoZLG02KNcYwbuZ9qkEIqmj2hF7svw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/functions-js@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@supabase/functions-js/-/functions-js-2.3.1.tgz#bddc12a97872f3978a733b66bddac53370721589" + integrity sha512-QyzNle/rVzlOi4BbVqxLSH828VdGY1RElqGFAj+XeVypj6+PVtMlD21G8SDnsPQDtlqqTtoGRgdMlQZih5hTuw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": + version "2.6.15" + resolved "https://registry.yarnpkg.com/@supabase/node-fetch/-/node-fetch-2.6.15.tgz#731271430e276983191930816303c44159e7226c" + integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== + dependencies: + whatwg-url "^5.0.0" + +"@supabase/postgrest-js@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@supabase/postgrest-js/-/postgrest-js-1.15.2.tgz#c0a725706e3d534570d014d7b713cea12553ab98" + integrity sha512-9/7pUmXExvGuEK1yZhVYXPZnLEkDTwxgMQHXLrN5BwPZZm4iUCL1YEyep/Z2lIZah8d8M433mVAUEGsihUj5KQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/realtime-js@2.9.5": + version "2.9.5" + resolved "https://registry.yarnpkg.com/@supabase/realtime-js/-/realtime-js-2.9.5.tgz#22b7de952a7f37868ffc25d32d19f03f27bfcb40" + integrity sha512-TEHlGwNGGmKPdeMtca1lFTYCedrhTAv3nZVoSjrKQ+wkMmaERuCe57zkC5KSWFzLYkb5FVHW8Hrr+PX1DDwplQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + "@types/phoenix" "^1.5.4" + "@types/ws" "^8.5.10" + ws "^8.14.2" + +"@supabase/storage-js@2.5.5": + version "2.5.5" + resolved "https://registry.yarnpkg.com/@supabase/storage-js/-/storage-js-2.5.5.tgz#2958e2a2cec8440e605bb53bd36649288c4dfa01" + integrity sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/supabase-js@^2.39.0": + version "2.43.4" + resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-2.43.4.tgz#62c956b16bb01d5cb59e3ad73cf7628e3e9835c0" + integrity sha512-/pLPaxiIsn5Vaz3s32HC6O/VNwfeddnzS0bZRpOW0AKcPuXroD8pT9G8mpiBlZfpKsMmq6k7tlhW7Sr1PAQ1lw== + dependencies: + "@supabase/auth-js" "2.64.2" + "@supabase/functions-js" "2.3.1" + "@supabase/node-fetch" "2.6.15" + "@supabase/postgrest-js" "1.15.2" + "@supabase/realtime-js" "2.9.5" + "@supabase/storage-js" "2.5.5" + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1861,6 +2013,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/phoenix@^1.5.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.6.4.tgz#cceac93a827555473ad38057d1df7d06eef1ed71" + integrity sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA== + "@types/picomatch@2.3.3": version "2.3.3" resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-2.3.3.tgz#be60498568c19e989e43fb39aa84be1ed3655e92" @@ -1906,6 +2063,13 @@ resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -2335,6 +2499,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -3092,6 +3261,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3130,10 +3304,10 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -dotenv@^16.4.4: - version "16.4.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" - integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== +dotenv@^16.3.1, dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== eastasianwidth@^0.2.0: version "0.2.0" @@ -3293,6 +3467,13 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-plugin-env@^1.0.8: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esbuild-plugin-env/-/esbuild-plugin-env-1.1.1.tgz#6501270b83824aa1b8d21f31657e1bbeb4f78c70" + integrity sha512-xM8peq9LLzvrQ/1czyj1HLhbJgtD0UzlKuNuTvPySdFGc77ysYsqo3oxDBOyQVSaa4YQU4wjrPpbeeDX1z0eHA== + dependencies: + dotenv "^16.4.5" + esbuild@^0.20.1: version "0.20.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" @@ -5335,6 +5516,11 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +marked@^11.0.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-11.2.0.tgz#fc908aeca962b721b0392ee4205e6f90ebffb074" + integrity sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw== + md5@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -6816,6 +7002,11 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -7006,6 +7197,11 @@ unique-string@^3.0.0: dependencies: crypto-random-string "^4.0.0" +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -7130,6 +7326,19 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7232,6 +7441,11 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@^8.14.2: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + xdg-basedir@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" From 33d8c102bba20dfab5472f4fa57823252336ce59 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:03:52 +0100 Subject: [PATCH 2/7] chore: types and remove unused --- src/home/fetch-github/fetch-avatar.ts | 60 ------------------- src/home/getters/get-local-store.ts | 6 +- src/home/github-types.ts | 14 ++--- src/home/home.ts | 7 +++ src/home/rendering/display-leaderboard.ts | 14 +---- .../rendering/setup-keyboard-navigation.ts | 8 ++- 6 files changed, 22 insertions(+), 87 deletions(-) delete mode 100644 src/home/fetch-github/fetch-avatar.ts diff --git a/src/home/fetch-github/fetch-avatar.ts b/src/home/fetch-github/fetch-avatar.ts deleted file mode 100644 index d966a58..0000000 --- a/src/home/fetch-github/fetch-avatar.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Octokit } from "@octokit/rest"; -import { getGitHubAccessToken } from "../getters/get-github-access-token"; -import { getImageFromCache, saveImageToCache } from "../getters/get-indexed-db"; - -export const organizationImageCache = new Map(); - -export async function fetchAvatar(orgName: string) { - // Check local cache first - const cachedAvatar = organizationImageCache.get(orgName); - if (cachedAvatar) { - return Promise.resolve(); - } - - // If not in local cache, check IndexedDB - const avatarBlob = await getImageFromCache({ dbName: "GitHubAvatars", storeName: "ImageStore", orgName: `avatarUrl-${orgName}` }); - if (avatarBlob) { - // If the avatar Blob is found in IndexedDB, add it to the cache - organizationImageCache.set(orgName, avatarBlob); - return Promise.resolve(); - } - - // If not in IndexedDB, fetch from network - const octokit = new Octokit({ auth: await getGitHubAccessToken() }); - try { - const { - data: { avatar_url: avatarUrl }, - } = await octokit.rest.orgs.get({ org: orgName }); - if (avatarUrl) { - // Fetch the image as a Blob and save it to IndexedDB - const response = await fetch(avatarUrl); - const blob = await response.blob(); - await saveImageToCache({ - dbName: "GitHubAvatars", - storeName: "ImageStore", - keyName: "name", - orgName: `avatarUrl-${orgName}`, - avatarBlob: blob, - }); - organizationImageCache.set(orgName, blob); - } - } catch (error) { - console.error(`Failed to fetch avatar for organization ${orgName}: ${error}`); - const { - data: { avatar_url: avatarUrl }, - } = await octokit.rest.users.getByUsername({ username: orgName }); - if (avatarUrl) { - // Fetch the image as a Blob and save it to IndexedDB - const response = await fetch(avatarUrl); - const blob = await response.blob(); - await saveImageToCache({ - dbName: "GitHubAvatars", - storeName: "ImageStore", - keyName: "name", - orgName: `avatarUrl-${orgName}`, - avatarBlob: blob, - }); - organizationImageCache.set(orgName, blob); - } - } -} diff --git a/src/home/getters/get-local-store.ts b/src/home/getters/get-local-store.ts index 43bbdb1..698beb2 100644 --- a/src/home/getters/get-local-store.ts +++ b/src/home/getters/get-local-store.ts @@ -1,7 +1,7 @@ -import { TaskStorageItems } from "../github-types"; +import { LeaderboardStorage } from "../github-types"; import { OAuthToken } from "./get-github-access-token"; -export function getLocalStore(key: string): TaskStorageItems | OAuthToken | null { +export function getLocalStore(key: string): LeaderboardStorage | OAuthToken | null { const cachedIssues = localStorage.getItem(key); if (cachedIssues) { try { @@ -13,7 +13,7 @@ export function getLocalStore(key: string): TaskStorageItems | OAuthToken | null return null; } -export function setLocalStore(key: string, value: TaskStorageItems | OAuthToken) { +export function setLocalStore(key: string, value: LeaderboardStorage | OAuthToken) { // remove state from issues before saving to local storage localStorage[key] = JSON.stringify(value); } diff --git a/src/home/github-types.ts b/src/home/github-types.ts index 89d34e9..62b7759 100644 --- a/src/home/github-types.ts +++ b/src/home/github-types.ts @@ -1,16 +1,10 @@ import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; -import { TaskNoState } from "./fetch-github/preview-to-full-mapping"; +import { LeaderboardEntry } from "./rendering/display-leaderboard"; -export interface AvatarCache { - [organization: string]: string | null; -} +export const GITHUB_TASKS_STORAGE_KEY = "ubq-leaderboard"; -export const GITHUB_TASKS_STORAGE_KEY = "gitHubTasks"; - -export type TaskStorageItems = { - timestamp: number; - tasks: TaskNoState[]; - loggedIn: boolean; +export type LeaderboardStorage = { + leaderboard: LeaderboardEntry[]; }; export type GitHubUserResponse = RestEndpointMethodTypes["users"]["getByUsername"]["response"]; diff --git a/src/home/home.ts b/src/home/home.ts index 614fd56..1d2e3f3 100644 --- a/src/home/home.ts +++ b/src/home/home.ts @@ -1,5 +1,6 @@ import { grid } from "../the-grid"; import { authentication } from "./authentication"; +import { getGitHubUser } from "./getters/get-github-user"; import { readyToolbar } from "./ready-toolbar"; import { renderLeaderboard } from "./rendering/display-leaderboard"; import { displayPopupMessage } from "./rendering/display-popup-modal"; @@ -15,6 +16,12 @@ if (!container) { export const taskManager = new TaskManager(container); async function leaderboardLoaderWhileRendering() { + if (!(await getGitHubUser())) { + // TODO: remove this after using DB as data source + displayPopupMessage("No GitHub token found", "Please sign in to GitHub to view the leaderboard."); + return; + } + const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a moment if it's your first time."); await renderLeaderboard(); killPopup(); diff --git a/src/home/rendering/display-leaderboard.ts b/src/home/rendering/display-leaderboard.ts index 8fccb49..e44ed5c 100644 --- a/src/home/rendering/display-leaderboard.ts +++ b/src/home/rendering/display-leaderboard.ts @@ -4,21 +4,13 @@ import { getSupabase } from "./render-github-login-button"; import { getGitHubAccessToken } from "../getters/get-github-access-token"; import { Octokit } from "@octokit/rest"; -type SupabaseUser = { id: string; created: string; wallet_id: string }; -type LeaderboardData = { address: string; balance: number }; -type LeaderboardEntry = { address: string; username?: string; balance: number; created_at?: string }; +export type SupabaseUser = { id: string; created: string; wallet_id: string }; +export type LeaderboardData = { address: string; balance: number }; +export type LeaderboardEntry = { address: string; username?: string; balance: number; created_at?: string }; export async function renderLeaderboard() { const container = taskManager.getContainer(); - if (container.classList.contains("ready")) { - container.classList.remove("ready"); - const leaderboardFetchLoader = document.createElement("div"); - leaderboardFetchLoader.classList.add("loader"); - container.appendChild(leaderboardFetchLoader); - - container.innerHTML = ""; - } const existingAddresses = new Set(Array.from(container.querySelectorAll(".issue-element-inner")).map((element) => element.getAttribute("data-preview-id"))); const delay = 0; diff --git a/src/home/rendering/setup-keyboard-navigation.ts b/src/home/rendering/setup-keyboard-navigation.ts index f5e0324..c1ea104 100644 --- a/src/home/rendering/setup-keyboard-navigation.ts +++ b/src/home/rendering/setup-keyboard-navigation.ts @@ -1,6 +1,8 @@ import { taskManager } from "../home"; import { viewIssueDetails } from "./render-github-issues"; +const DATA_PREVIEW_ID = "data-preview-id"; + const keyDownHandlerCurried = keyDownHandler(); const disableKeyBoardNavigationCurried = disableKeyboardNavigationCurry; @@ -58,9 +60,9 @@ function keyDownHandler() { container.classList.add("keyboard-selection"); - const previewId = visibleIssues[newIndex].children[0].getAttribute("data-preview-id"); + const previewId = visibleIssues[newIndex].children[0].getAttribute(DATA_PREVIEW_ID); - const issueElement = visibleIssues.find((issue) => issue.children[0].getAttribute("data-preview-id") === previewId); + const issueElement = visibleIssues.find((issue) => issue.children[0].getAttribute(DATA_PREVIEW_ID) === previewId); if (issueElement) { const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; @@ -72,7 +74,7 @@ function keyDownHandler() { } else if (event.key === "Enter") { const selectedIssue = container.querySelector("#issues-container > div.selected"); if (selectedIssue) { - const previewId = selectedIssue.children[0].getAttribute("data-preview-id"); + const previewId = selectedIssue.children[0].getAttribute(DATA_PREVIEW_ID); if (previewId) { const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; From 63904bda7e133acebaf87e84044730693eb83e7d Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:39:36 +0100 Subject: [PATCH 3/7] chore: split methods --- src/home/leaderboard/data-fetching.ts | 124 ++++++++++++++ src/home/leaderboard/render.ts | 186 +++++++++++++++++++++ src/home/leaderboard/shared.ts | 3 + src/home/rendering/render-github-issues.ts | 15 -- 4 files changed, 313 insertions(+), 15 deletions(-) create mode 100644 src/home/leaderboard/data-fetching.ts create mode 100644 src/home/leaderboard/render.ts create mode 100644 src/home/leaderboard/shared.ts delete mode 100644 src/home/rendering/render-github-issues.ts diff --git a/src/home/leaderboard/data-fetching.ts b/src/home/leaderboard/data-fetching.ts new file mode 100644 index 0000000..868b260 --- /dev/null +++ b/src/home/leaderboard/data-fetching.ts @@ -0,0 +1,124 @@ +import { Octokit } from "@octokit/rest"; +import { getGitHubAccessToken } from "../getters/get-github-access-token"; +import { getSupabase } from "../rendering/render-github-login-button"; +import { makeLeaderboardEntries } from "./render"; +import { LeaderboardData, SupabaseUser } from "./shared"; + +export async function pullFromSupabase() { + const supabase = getSupabase(); + + // pull all wallets from the database + const { data, error } = await supabase.from("wallets").select("address, id"); + + if (error || !data?.length) { + console.error(error); + return; + } + + const walletMap = new Map(); + + for (const wallet of data) { + walletMap.set(wallet.id, wallet.address); + } + + // pull all users with wallets that are in the walletMap + const users = (await supabase.from("users").select("id, created, wallet_id").in("wallet_id", Array.from(walletMap.keys()))) as { data: SupabaseUser[] }; + + if (!users.data) { + return; + } + + return { walletMap, users }; +} + +export async function fetchAllLeaderboardDatas() { + const octokit = new Octokit({ auth: await getGitHubAccessToken() }); + const addrAndBalances = await fetchLeaderboardDataFromRepo(); + + const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; + + const USER_IDS = users.data.map((user) => user.id); + const githubUsers = await fetchUsernames(USER_IDS, octokit); + const wallets = await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers); + + return wallets.sort((a, b) => b.balance - a.balance); +} + +export async function fetchUsernames(userIds: string[], octokit: Octokit) { + const usernames = []; + + for (const userId of userIds) { + const { data, status } = await octokit.request(`GET /user/${userId}`); + + if (status !== 200) { + console.error(`Failed to fetch user data for ${userId}`); + continue; + } + + usernames.push({ + id: data.id, + username: data.login, + avatar: data.avatar_url, + name: data.name, + }); + } + + return usernames; +} + +export async function fetchLeaderboardDataFromRepo(): Promise { + try { + const token = await getGitHubAccessToken(); + const octokit = new Octokit({ auth: token }); + + // @TODO: create an action that updates this every 24hrs and pulls from a Ubiquity repo + + const path = "leaderboard.csv"; + const url = "https://github.com/keyrxng/ubq-airdrop-cli"; + + const { data, status } = await octokit.repos.getContent({ + owner: "keyrxng", + repo: "ubq-airdrop-cli", + path, + }); + + if (status !== 200) { + throw new Error(`Failed to fetch leaderboard data from ${url}`); + } + let parsedData; + + // TODO: remove in place of db pulled stats + if ("content" in data) { + parsedData = atob(data.content); + } else { + throw new Error("No content found in leaderboard data"); + } + + const entries = cvsToLeaderboardData(parsedData); + + if (entries.length === 0) { + throw new Error("No entries found in leaderboard data"); + } + + return entries; + } catch (err) { + console.log(err); + return []; + } +} + +function cvsToLeaderboardData(cvsData: string): { address: string; balance: number }[] { + const lines = cvsData.split("\n"); + const data = []; + for (const line of lines) { + const [address, balance] = line.split(","); + + if (balance === undefined || isNaN(parseInt(balance))) { + continue; + } + + data.push({ address: address.toUpperCase(), balance: parseInt(balance) }); + } + + return data.sort((a, b) => b.balance - a.balance); +} diff --git a/src/home/leaderboard/render.ts b/src/home/leaderboard/render.ts new file mode 100644 index 0000000..8783280 --- /dev/null +++ b/src/home/leaderboard/render.ts @@ -0,0 +1,186 @@ +import { Octokit } from "@octokit/rest"; +import { fetchAllLeaderboardDatas, fetchLeaderboardDataFromRepo, fetchUsernames, pullFromSupabase } from "./data-fetching"; +import { getGitHubAccessToken } from "../getters/get-github-access-token"; +import { taskManager } from "../home"; +import { preview, previewBodyInner, titleAnchor, titleHeader } from "../rendering/render-preview-modal"; +import { LeaderboardData, LeaderboardEntry, SupabaseUser } from "./shared"; + +export async function renderLeaderboard() { + const container = taskManager.getContainer(); + + const existingAddresses = new Set(Array.from(container.querySelectorAll(".issue-element-inner")).map((element) => element.getAttribute("data-preview-id"))); + + const delay = 0; + const baseDelay = 500 / 15; + + const cachedEntries = localStorage.getItem("ubq-leaderboard") || "[]"; + const lastUpdate = localStorage.getItem("ubq-leaderboard-last-update") || "0"; + const parsedEntries = JSON.parse(cachedEntries) as LeaderboardEntry[]; + + let entries: LeaderboardEntry[] | undefined = []; + let addrAndBalances: LeaderboardData[] = []; + + if (!cachedEntries || Date.now() - parseInt(lastUpdate) > 1000 * 60 * 60 * 24 * 7) { + // fetches the most up to date leaderboard data from the repo + entries = await fetchAllLeaderboardDatas(); + + if (!entries) { + return; + } + + return launchLeaderboard( + entries.sort((a, b) => b.balance - a.balance), + container, + existingAddresses, + delay, + baseDelay + ); + } else { + if (lastUpdate && Date.now() - parseInt(lastUpdate) < 1000 * 60 * 60 * 24) { + entries = parsedEntries.sort((a, b) => b.balance - a.balance); + + return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); + } + + addrAndBalances = await fetchLeaderboardDataFromRepo(); + + const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; + const USER_IDS = users.data.map((user) => user.id); + const githubUsers = await fetchUsernames(USER_IDS, new Octokit({ auth: await getGitHubAccessToken() })); + + entries = (await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers)).sort((a, b) => b.balance - a.balance); + + if (!entries) { + return; + } + + return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); + } +} + +async function launchLeaderboard( + entries: LeaderboardEntry[], + container: HTMLDivElement, + existingAddresses: Set, + delay: number, + baseDelay: number +) { + for (const entry of entries) { + if (!existingAddresses.has(entry.address)) { + const entryWrapper = await everyNewEntry({ entry, container }); + if (entryWrapper) { + setTimeout(() => entryWrapper?.classList.add("active"), delay); + delay += baseDelay; + } + } + } + container.classList.add("ready"); + container.setAttribute("data-leaderboard", "true"); + localStorage.setItem("ubq-leaderboard-last-update", Date.now().toString()); + + return true; +} + +async function everyNewEntry({ entry, container }: { entry: LeaderboardEntry; container: HTMLDivElement }) { + const entryWrapper = document.createElement("div"); + const issueElement = document.createElement("div"); + issueElement.setAttribute("data-preview-id", entry.id || ""); + issueElement.classList.add("issue-element-inner"); + + if (!entry.address) { + console.warn("No address found"); + return; + } + + taskManager.addEntry(entry); + + setUpIssueElement(issueElement, entry); + entryWrapper.appendChild(issueElement); + + container.appendChild(entryWrapper); + return entryWrapper; +} + +function setUpIssueElement(entryElement: HTMLDivElement, entry: LeaderboardEntry) { + entryElement.innerHTML = ` +
+
+

${entry.username ?? "Contributor"}

+

$${entry.balance.toLocaleString()}

+
+
+

${entry.address.toUpperCase()}

+
+
+ `; + + entryElement.addEventListener("click", () => { + const entryWrapper = entryElement.parentElement; + + if (!entryWrapper) { + throw new Error("No issue container found"); + } + + Array.from(entryWrapper.parentElement?.children || []).forEach((sibling) => { + sibling.classList.remove("selected"); + }); + + entryWrapper.classList.add("selected"); + + previewEntryAdditionalDetails(entry); + }); +} + +export async function makeLeaderboardEntries( + walletMap: Map, + users: { data: SupabaseUser[] }, + addrAndBalances: LeaderboardData[], + githubUsers: { id: string; username: string }[] +): Promise { + const wallets = users.data.map((user) => { + const wId = Number(user.wallet_id); + const uId = user.id; + + const username = githubUsers.find((user) => user.id === uId)?.username; + + const address = walletMap.get(wId); + + if (!address) { + console.warn(`No address found for wallet ID ${wId}`); + return { address: "", username: "", balance: 0, created_at: "" }; + } + + const balance = addrAndBalances.find((entry) => entry.address.toLowerCase() === address?.toLowerCase())?.balance || 0; + return { + address: address, + username: username, + balance: balance, + created_at: user.created, + id: user.id, + }; + }); + + localStorage.setItem("ubq-leaderboard", JSON.stringify(wallets)); + + return wallets; +} + +export function previewEntryAdditionalDetails(entry: LeaderboardEntry) { + titleHeader.textContent = entry.address; + titleAnchor.href = `https://etherscan.io/address/${entry.address}`; + previewBodyInner.innerHTML = ` +
+
+

${entry.username ?? "Contributor"}

+
+
+ ${entry.created_at ? `

Joined: ${new Date(entry.created_at).toLocaleDateString()}

` : ""} +

Earnings To Date: $${entry.balance.toLocaleString()}

+
+
+ `; + + // Show the preview + preview.classList.add("active"); + document.body.classList.add("preview-active"); +} diff --git a/src/home/leaderboard/shared.ts b/src/home/leaderboard/shared.ts new file mode 100644 index 0000000..960871b --- /dev/null +++ b/src/home/leaderboard/shared.ts @@ -0,0 +1,3 @@ +export type SupabaseUser = { id: string; created: string; wallet_id: string }; +export type LeaderboardData = { address: string; balance: number }; +export type LeaderboardEntry = { address: string; balance: number; username?: string; created_at?: string; id?: string }; diff --git a/src/home/rendering/render-github-issues.ts b/src/home/rendering/render-github-issues.ts deleted file mode 100644 index 222a43e..0000000 --- a/src/home/rendering/render-github-issues.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { marked } from "marked"; -import { GitHubIssue } from "../github-types"; -import { preview, previewBodyInner, titleAnchor, titleHeader } from "./render-preview-modal"; - -export function viewIssueDetails(full: GitHubIssue) { - // Update the title and body for the new issue - titleHeader.textContent = full.title; - titleAnchor.href = full.html_url; - if (!full.body) return; - previewBodyInner.innerHTML = marked(full.body) as string; - - // Show the preview - preview.classList.add("active"); - document.body.classList.add("preview-active"); -} From 2af987b4e2ee159e71a6daaf69ea5d750d28b8c0 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:40:06 +0100 Subject: [PATCH 4/7] chore: keyboard nav --- package.json | 2 +- src/home/getters/get-github-access-token.ts | 18 +- src/home/getters/get-github-user.ts | 4 +- src/home/getters/get-local-store.ts | 8 +- src/home/github-types.ts | 6 +- src/home/home.ts | 21 +- src/home/rendering/display-leaderboard.ts | 308 +----------------- .../rendering/setup-keyboard-navigation.ts | 98 +++--- src/home/task-manager.ts | 50 +-- 9 files changed, 89 insertions(+), 426 deletions(-) diff --git a/package.json b/package.json index 4b024af..8ea3793 100644 --- a/package.json +++ b/package.json @@ -81,4 +81,4 @@ "@commitlint/config-conventional" ] } -} \ No newline at end of file +} diff --git a/src/home/getters/get-github-access-token.ts b/src/home/getters/get-github-access-token.ts index 25585cb..b93563d 100644 --- a/src/home/getters/get-github-access-token.ts +++ b/src/home/getters/get-github-access-token.ts @@ -4,29 +4,23 @@ import { getLocalStore } from "./get-local-store"; export async function getGitHubAccessToken(): Promise { // better to use official function, looking up localstorage has flaws - const oauthToken = await checkSupabaseSession(); + const authToken = await checkSupabaseSession(); - const expiresAt = oauthToken?.expires_at; + const expiresAt = authToken?.expires_at; if (expiresAt && expiresAt < Date.now() / 1000) { localStorage.removeItem(`sb-${SUPABASE_STORAGE_KEY}-auth-token`); return null; } - return oauthToken?.provider_token ?? null; + return authToken?.provider_token ?? null; } export function getGitHubUserName(): string | null { - const oauthToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OAuthToken | null; - - const username = oauthToken?.user?.user_metadata?.user_name; - if (username) { - return username; - } - - return null; + const authToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OauthToken | null; + return authToken?.user?.user_metadata?.user_name ?? null; } -export interface OAuthToken { +export interface OauthToken { provider_token: string; access_token: string; expires_in: number; diff --git a/src/home/getters/get-github-user.ts b/src/home/getters/get-github-user.ts index 8d6a1a7..3cb9256 100644 --- a/src/home/getters/get-github-user.ts +++ b/src/home/getters/get-github-user.ts @@ -1,6 +1,6 @@ import { Octokit } from "@octokit/rest"; import { GitHubUser, GitHubUserResponse } from "../github-types"; -import { OAuthToken } from "./get-github-access-token"; +import { OauthToken } from "./get-github-access-token"; import { getLocalStore } from "./get-local-store"; declare const SUPABASE_STORAGE_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts @@ -14,7 +14,7 @@ export async function getGitHubUser(): Promise { } async function getSessionToken(): Promise { - const cachedSessionToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OAuthToken | null; + const cachedSessionToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OauthToken | null; if (cachedSessionToken) { return cachedSessionToken.provider_token; } diff --git a/src/home/getters/get-local-store.ts b/src/home/getters/get-local-store.ts index 698beb2..ae762f5 100644 --- a/src/home/getters/get-local-store.ts +++ b/src/home/getters/get-local-store.ts @@ -1,11 +1,11 @@ import { LeaderboardStorage } from "../github-types"; -import { OAuthToken } from "./get-github-access-token"; +import { OauthToken } from "./get-github-access-token"; -export function getLocalStore(key: string): LeaderboardStorage | OAuthToken | null { +export function getLocalStore(key: string): LeaderboardStorage | OauthToken | null { const cachedIssues = localStorage.getItem(key); if (cachedIssues) { try { - return JSON.parse(cachedIssues); // as OAuthToken; + return JSON.parse(cachedIssues); // as OauthToken; } catch (error) { console.error(error); } @@ -13,7 +13,7 @@ export function getLocalStore(key: string): LeaderboardStorage | OAuthToken | nu return null; } -export function setLocalStore(key: string, value: LeaderboardStorage | OAuthToken) { +export function setLocalStore(key: string, value: LeaderboardStorage | OauthToken) { // remove state from issues before saving to local storage localStorage[key] = JSON.stringify(value); } diff --git a/src/home/github-types.ts b/src/home/github-types.ts index 62b7759..520b834 100644 --- a/src/home/github-types.ts +++ b/src/home/github-types.ts @@ -1,11 +1,9 @@ import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; -import { LeaderboardEntry } from "./rendering/display-leaderboard"; +import { LeaderboardEntry } from "./leaderboard/shared"; export const GITHUB_TASKS_STORAGE_KEY = "ubq-leaderboard"; -export type LeaderboardStorage = { - leaderboard: LeaderboardEntry[]; -}; +export type LeaderboardStorage = Record; export type GitHubUserResponse = RestEndpointMethodTypes["users"]["getByUsername"]["response"]; export type GitHubUser = GitHubUserResponse["data"]; diff --git a/src/home/home.ts b/src/home/home.ts index 1d2e3f3..2696359 100644 --- a/src/home/home.ts +++ b/src/home/home.ts @@ -1,9 +1,8 @@ import { grid } from "../the-grid"; import { authentication } from "./authentication"; -import { getGitHubUser } from "./getters/get-github-user"; import { readyToolbar } from "./ready-toolbar"; -import { renderLeaderboard } from "./rendering/display-leaderboard"; -import { displayPopupMessage } from "./rendering/display-popup-modal"; +import { displayLeaderboard } from "./rendering/display-leaderboard"; +import { setupKeyboardNavigation } from "./rendering/setup-keyboard-navigation"; import { TaskManager } from "./task-manager"; grid(document.getElementById("grid") as HTMLElement, () => document.body.classList.add("grid-loaded")); // @DEV: display grid background @@ -12,26 +11,14 @@ const container = document.getElementById("issues-container") as HTMLDivElement; if (!container) { throw new Error("Could not find issues container"); } +setupKeyboardNavigation(container); export const taskManager = new TaskManager(container); - -async function leaderboardLoaderWhileRendering() { - if (!(await getGitHubUser())) { - // TODO: remove this after using DB as data source - displayPopupMessage("No GitHub token found", "Please sign in to GitHub to view the leaderboard."); - return; - } - - const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a moment if it's your first time."); - await renderLeaderboard(); - killPopup(); -} - void (async function home() { try { void authentication(); void readyToolbar(); - return await leaderboardLoaderWhileRendering(); + return await displayLeaderboard(); } catch (error) { console.error(error); } diff --git a/src/home/rendering/display-leaderboard.ts b/src/home/rendering/display-leaderboard.ts index e44ed5c..57c1043 100644 --- a/src/home/rendering/display-leaderboard.ts +++ b/src/home/rendering/display-leaderboard.ts @@ -1,301 +1,15 @@ -import { taskManager } from "../home"; -import { preview, previewBodyInner, titleAnchor, titleHeader } from "./render-preview-modal"; -import { getSupabase } from "./render-github-login-button"; -import { getGitHubAccessToken } from "../getters/get-github-access-token"; -import { Octokit } from "@octokit/rest"; - -export type SupabaseUser = { id: string; created: string; wallet_id: string }; -export type LeaderboardData = { address: string; balance: number }; -export type LeaderboardEntry = { address: string; username?: string; balance: number; created_at?: string }; - -export async function renderLeaderboard() { - const container = taskManager.getContainer(); - - const existingAddresses = new Set(Array.from(container.querySelectorAll(".issue-element-inner")).map((element) => element.getAttribute("data-preview-id"))); - - const delay = 0; - const baseDelay = 500 / 15; - - const cachedEntries = localStorage.getItem("ubq-leaderboard") || "[]"; - const lastUpdate = localStorage.getItem("ubq-leaderboard-last-update") || "0"; - const parsedEntries = JSON.parse(cachedEntries) as LeaderboardEntry[]; - - let entries: LeaderboardEntry[] | undefined = []; - let addrAndBalances: LeaderboardData[] = []; - - if (!cachedEntries || Date.now() - parseInt(lastUpdate) > 1000 * 60 * 60 * 24 * 7) { - // fetches the most up to date leaderboard data from the repo - entries = await fetchAllLeaderboardDatas(); - - if (!entries) { - return; - } - - return launchLeaderboard( - entries.sort((a, b) => b.balance - a.balance), - container, - existingAddresses, - delay, - baseDelay - ); - } else { - if (lastUpdate && Date.now() - parseInt(lastUpdate) < 1000 * 60 * 60 * 24) { - entries = parsedEntries.sort((a, b) => b.balance - a.balance); - - return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); - } - - addrAndBalances = await fetchLeaderboardDataFromRepo(); - - const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; - const USER_IDS = users.data.map((user) => user.id); - const githubUsers = await fetchUsernames(USER_IDS, new Octokit({ auth: await getGitHubAccessToken() })); - - entries = (await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers)).sort((a, b) => b.balance - a.balance); - - if (!entries) { - return; - } - - return launchLeaderboard(entries, container, existingAddresses, delay, baseDelay); - } -} - -async function launchLeaderboard( - entries: LeaderboardEntry[], - container: HTMLDivElement, - existingAddresses: Set, - delay: number, - baseDelay: number -) { - for (const entry of entries) { - if (!existingAddresses.has(entry.address)) { - const entryWrapper = await everyNewEntry({ entry, container }); - if (entryWrapper) { - setTimeout(() => entryWrapper?.classList.add("active"), delay); - delay += baseDelay; - } - } - } - container.classList.add("ready"); - container.setAttribute("data-leaderboard", "true"); - localStorage.setItem("ubq-leaderboard-last-update", Date.now().toString()); - - return true; -} - -async function pullFromSupabase() { - const supabase = getSupabase(); - - // pull all wallets from the database - const { data, error } = await supabase.from("wallets").select("address, id"); - - if (error || !data?.length) { - console.error(error); - return; - } - - const walletMap = new Map(); - - for (const wallet of data) { - walletMap.set(wallet.id, wallet.address); - } - - // pull all users with wallets that are in the walletMap - const users = (await supabase.from("users").select("id, created, wallet_id").in("wallet_id", Array.from(walletMap.keys()))) as { data: SupabaseUser[] }; - - if (!users.data) { - return; - } - - return { walletMap, users }; -} - -async function makeLeaderboardEntries( - walletMap: Map, - users: { data: SupabaseUser[] }, - addrAndBalances: LeaderboardData[], - githubUsers: { id: string; username: string }[] -): Promise { - const wallets = users.data.map((user) => { - const wId = Number(user.wallet_id); - const uId = user.id; - - const username = githubUsers.find((user) => user.id === uId)?.username; - - const address = walletMap.get(wId); - - if (!address) { - console.warn(`No address found for wallet ID ${wId}`); - return { address: "", username: "", balance: 0, created_at: "" }; - } - - const balance = addrAndBalances.find((entry) => entry.address.toLowerCase() === address?.toLowerCase())?.balance || 0; - - return { address, username, balance, created_at: user.created }; - }); - - localStorage.setItem("ubq-leaderboard", JSON.stringify(wallets)); - - return wallets; -} - -async function fetchAllLeaderboardDatas() { - const octokit = new Octokit({ auth: await getGitHubAccessToken() }); - const addrAndBalances = await fetchLeaderboardDataFromRepo(); - - const { walletMap, users } = (await pullFromSupabase()) || { walletMap: new Map(), users: { data: [] } }; - - const USER_IDS = users.data.map((user) => user.id); - const githubUsers = await fetchUsernames(USER_IDS, octokit); - const wallets = await makeLeaderboardEntries(walletMap, users, addrAndBalances, githubUsers); - - return wallets.sort((a, b) => b.balance - a.balance); -} - -async function fetchUsernames(userIds: string[], octokit: Octokit) { - const usernames = []; - - for (const userId of userIds) { - const { data, status } = await octokit.request(`GET /user/${userId}`); - - if (status !== 200) { - console.error(`Failed to fetch user data for ${userId}`); - continue; - } - - usernames.push({ - id: data.id, - username: data.login, - avatar: data.avatar_url, - name: data.name, - }); - } - - return usernames; -} - -async function everyNewEntry({ entry, container }: { entry: LeaderboardEntry; container: HTMLDivElement }) { - const entryWrapper = document.createElement("div"); - const issueElement = document.createElement("div"); - issueElement.setAttribute("data-preview-id", entry.balance.toFixed(0)); - issueElement.classList.add("issue-element-inner"); - - if (!entry.address) { - console.warn("No address found"); +import { getGitHubUser } from "../getters/get-github-user"; +import { renderLeaderboard } from "../leaderboard/render"; +import { displayPopupMessage } from "./display-popup-modal"; + +export async function displayLeaderboard() { + if (!(await getGitHubUser())) { + // TODO: remove this after using DB as data source + displayPopupMessage("No GitHub token found", "Please sign in to GitHub to view the leaderboard."); return; } - setUpIssueElement(issueElement, entry); - entryWrapper.appendChild(issueElement); - - container.appendChild(entryWrapper); - return entryWrapper; -} - -function setUpIssueElement(entryElement: HTMLDivElement, entry: LeaderboardEntry) { - entryElement.innerHTML = ` -
-
-

${entry.username ?? "Contributor"}

-

$${entry.balance.toLocaleString()}

-
-
-

${entry.address.toUpperCase()}

-
-
- `; - - entryElement.addEventListener("click", () => { - const entryWrapper = entryElement.parentElement; - - if (!entryWrapper) { - throw new Error("No issue container found"); - } - - Array.from(entryWrapper.parentElement?.children || []).forEach((sibling) => { - sibling.classList.remove("selected"); - }); - - entryWrapper.classList.add("selected"); - - previewEntryAdditionalDetails(entry); - }); -} - -function previewEntryAdditionalDetails(entry: LeaderboardEntry) { - titleHeader.textContent = entry.address; - titleAnchor.href = `https://etherscan.io/address/${entry.address}`; - previewBodyInner.innerHTML = ` -
-
-

${entry.username ?? "Contributor"}

-
-
- ${entry.created_at ? `

Joined: ${new Date(entry.created_at).toLocaleDateString()}

` : ""} -

Earnings To Date: $${entry.balance.toLocaleString()}

-
-
- `; - - // Show the preview - preview.classList.add("active"); - document.body.classList.add("preview-active"); -} - -async function fetchLeaderboardDataFromRepo(): Promise { - try { - const token = await getGitHubAccessToken(); - const octokit = new Octokit({ auth: token }); - - // @TODO: create an action that updates this every 24hrs and pulls from a Ubiquity repo - - const path = "leaderboard.csv"; - const url = "https://github.com/keyrxng/ubq-airdrop-cli"; - - const { data, status } = await octokit.repos.getContent({ - owner: "keyrxng", - repo: "ubq-airdrop-cli", - path, - }); - - if (status !== 200) { - throw new Error(`Failed to fetch leaderboard data from ${url}`); - } - let parsedData; - - // TODO: remove in place of db pulled stats - if ("content" in data) { - parsedData = atob(data.content); - } else { - throw new Error("No content found in leaderboard data"); - } - - const entries = cvsToLeaderboardData(parsedData); - - if (entries.length === 0) { - throw new Error("No entries found in leaderboard data"); - } - - return entries; - } catch (err) { - console.log(err); - return []; - } -} - -function cvsToLeaderboardData(cvsData: string): { address: string; balance: number }[] { - const lines = cvsData.split("\n"); - const data = []; - for (const line of lines) { - const [address, balance] = line.split(","); - - if (balance === undefined || isNaN(parseInt(balance))) { - continue; - } - - data.push({ address: address.toUpperCase(), balance: parseInt(balance) }); - } - - return data.sort((a, b) => b.balance - a.balance); + const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a moment if it's your first time."); + await renderLeaderboard(); + killPopup(); } diff --git a/src/home/rendering/setup-keyboard-navigation.ts b/src/home/rendering/setup-keyboard-navigation.ts index c1ea104..dc1c272 100644 --- a/src/home/rendering/setup-keyboard-navigation.ts +++ b/src/home/rendering/setup-keyboard-navigation.ts @@ -1,5 +1,5 @@ import { taskManager } from "../home"; -import { viewIssueDetails } from "./render-github-issues"; +import { previewEntryAdditionalDetails } from "../leaderboard/render"; const DATA_PREVIEW_ID = "data-preview-id"; @@ -33,58 +33,58 @@ function keyDownHandler() { const container = document.getElementById("issues-container") as HTMLDivElement; return function keyDownHandler(event: KeyboardEvent) { if (event.key === "ArrowUp" || event.key === "ArrowDown") { - const issues = Array.from(container.children) as HTMLElement[]; - const visibleIssues = issues.filter((issue) => issue.style.display !== "none"); - const activeIndex = visibleIssues.findIndex((issue) => issue.classList.contains("selected")); - const originalIndex = activeIndex === -1 ? -1 : activeIndex; - let newIndex = originalIndex; - - if (event.key === "ArrowUp" && originalIndex > 0) { - newIndex = originalIndex - 1; - event.preventDefault(); - } else if (event.key === "ArrowDown" && originalIndex < visibleIssues.length - 1) { - newIndex = originalIndex + 1; - event.preventDefault(); - } - - if (newIndex !== originalIndex) { - visibleIssues.forEach((issue) => { - issue.classList.remove("selected"); - }); - - visibleIssues[newIndex]?.classList.add("selected"); - visibleIssues[newIndex].scrollIntoView({ - behavior: "smooth", - block: "center", - }); - - container.classList.add("keyboard-selection"); - - const previewId = visibleIssues[newIndex].children[0].getAttribute(DATA_PREVIEW_ID); - - const issueElement = visibleIssues.find((issue) => issue.children[0].getAttribute(DATA_PREVIEW_ID) === previewId); - - if (issueElement) { - const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; - if (issueFull) { - viewIssueDetails(issueFull); - } - } - } + verticalKeys(event, container); } else if (event.key === "Enter") { const selectedIssue = container.querySelector("#issues-container > div.selected"); - if (selectedIssue) { - const previewId = selectedIssue.children[0].getAttribute(DATA_PREVIEW_ID); - - if (previewId) { - const issueFull = taskManager.getTaskByPreviewId(Number(previewId)).full; - if (issueFull) { - window.open(issueFull.html_url, "_blank"); - } - } - } + const previewId = selectedIssue?.children[0].getAttribute(DATA_PREVIEW_ID); + const issueFull = taskManager.getEntryById(Number(previewId)); + + previewEntryAdditionalDetails(issueFull); } else if (event.key === "Escape") { + console.log("ecapekey"); disableKeyboardNavigation(container); } }; } + +function verticalKeys(event: KeyboardEvent, container: HTMLDivElement) { + const issues = Array.from(container.children) as HTMLElement[]; + const visibleIssues = issues.filter((issue) => issue.style.display !== "none"); + const activeIndex = visibleIssues.findIndex((issue) => issue.classList.contains("selected")); + const originalIndex = activeIndex === -1 ? -1 : activeIndex; + let newIndex = originalIndex; + + if (event.key === "ArrowUp" && originalIndex > 0) { + newIndex = originalIndex - 1; + event.preventDefault(); + } else if (event.key === "ArrowDown" && originalIndex < visibleIssues.length - 1) { + newIndex = originalIndex + 1; + event.preventDefault(); + } + + if (newIndex !== originalIndex) { + visibleIssues.forEach((issue) => { + issue.classList.remove("selected"); + }); + + visibleIssues[newIndex]?.classList.add("selected"); + visibleIssues[newIndex].scrollIntoView({ + behavior: "smooth", + block: "center", + }); + + container.classList.add("keyboard-selection"); + + const previewId = visibleIssues[newIndex].children[0].getAttribute(DATA_PREVIEW_ID); + + const issueElement = visibleIssues.find((issue) => issue.children[0].getAttribute(DATA_PREVIEW_ID) === previewId); + + if (!issueElement) { + throw new Error("No issue found"); + } + + const issueFull = taskManager.getEntryById(Number(previewId)); + + previewEntryAdditionalDetails(issueFull); + } +} diff --git a/src/home/task-manager.ts b/src/home/task-manager.ts index 59bde85..c44a638 100644 --- a/src/home/task-manager.ts +++ b/src/home/task-manager.ts @@ -1,58 +1,28 @@ -import { TaskMaybeFull } from "./fetch-github/preview-to-full-mapping"; -import { getGitHubAccessToken } from "./getters/get-github-access-token"; import { setLocalStore } from "./getters/get-local-store"; import { GITHUB_TASKS_STORAGE_KEY } from "./github-types"; +import { LeaderboardEntry } from "./leaderboard/shared"; export class TaskManager { - private _tasks: TaskMaybeFull[] = []; + private _entries: Record = {}; private _container: HTMLDivElement; + constructor(container: HTMLDivElement) { this._container = container; } - public syncTasks(incoming: TaskMaybeFull[]) { - const incomingIds = new Set(incoming.map((task) => task.preview.id)); - const taskMap = new Map(); - - for (const task of incoming) { - const id = task.full?.id || task.preview.id; - taskMap.set(id, task); - } - - for (const task of this._tasks) { - const id = task.full?.id || task.preview.id; - if (!incomingIds.has(id)) { - continue; - } - if (!taskMap.has(id)) { - taskMap.set(id, task); - } else { - const existingTask = taskMap.get(id); - if (existingTask && !existingTask.full && task.full) { - taskMap.set(id, task); - } - } - } - - this._tasks = Array.from(taskMap.values()); - } - - public getTasks() { - return this._tasks; - } - - public getTaskByPreviewId(id: number) { - const task = this._tasks.find((task) => task.preview.id === id); - if (!task) throw new Error(`No task found for preview id ${id}`); - return task; + public addEntry(entry: LeaderboardEntry) { + if (!entry.id) throw new Error("Entry must have an id"); + this._entries[entry.id] = entry; } public getContainer() { return this._container; } + getEntryById(position: number) { + return this._entries[position]; + } public async writeToStorage() { - const _accessToken = await getGitHubAccessToken(); - setLocalStore(GITHUB_TASKS_STORAGE_KEY, { timestamp: Date.now(), tasks: this._tasks, loggedIn: _accessToken !== null }); + setLocalStore(GITHUB_TASKS_STORAGE_KEY, this._entries); } } From f95405c7e44f0d0b9ff5a0630ccd66be37168145 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:43:22 +0100 Subject: [PATCH 5/7] chore cspell, eslint --- .cspell.json | 16 +++++++++++++++- src/home/leaderboard/data-fetching.ts | 3 ++- src/home/leaderboard/render.ts | 4 ++-- src/home/rendering/setup-keyboard-navigation.ts | 1 - 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.cspell.json b/.cspell.json index dfd6093..61ced9c 100644 --- a/.cspell.json +++ b/.cspell.json @@ -4,7 +4,21 @@ "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log"], "useGitignore": true, "language": "en", - "words": ["dataurl", "devpool", "outdir", "servedir"], + "words": [ + "dataurl", + "devpool", + "outdir", + "servedir", + "Supabase", + "supabase", + "SUPABASE", + "Leaderboard", + "leaderboard", + "fract", + "Datas", + "greyscale", + "localstorage" + ], "dictionaries": ["typescript", "node", "software-terms"], "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], "ignoreRegExpList": ["[0-9a-fA-F]{6}"] diff --git a/src/home/leaderboard/data-fetching.ts b/src/home/leaderboard/data-fetching.ts index 868b260..19e1495 100644 --- a/src/home/leaderboard/data-fetching.ts +++ b/src/home/leaderboard/data-fetching.ts @@ -31,7 +31,7 @@ export async function pullFromSupabase() { return { walletMap, users }; } -export async function fetchAllLeaderboardDatas() { +export async function fetchAllLeaderboardData() { const octokit = new Octokit({ auth: await getGitHubAccessToken() }); const addrAndBalances = await fetchLeaderboardDataFromRepo(); @@ -74,6 +74,7 @@ export async function fetchLeaderboardDataFromRepo(): Promise // @TODO: create an action that updates this every 24hrs and pulls from a Ubiquity repo const path = "leaderboard.csv"; + // cspell: disable const url = "https://github.com/keyrxng/ubq-airdrop-cli"; const { data, status } = await octokit.repos.getContent({ diff --git a/src/home/leaderboard/render.ts b/src/home/leaderboard/render.ts index 8783280..fbbe9fa 100644 --- a/src/home/leaderboard/render.ts +++ b/src/home/leaderboard/render.ts @@ -1,5 +1,5 @@ import { Octokit } from "@octokit/rest"; -import { fetchAllLeaderboardDatas, fetchLeaderboardDataFromRepo, fetchUsernames, pullFromSupabase } from "./data-fetching"; +import { fetchAllLeaderboardData, fetchLeaderboardDataFromRepo, fetchUsernames, pullFromSupabase } from "./data-fetching"; import { getGitHubAccessToken } from "../getters/get-github-access-token"; import { taskManager } from "../home"; import { preview, previewBodyInner, titleAnchor, titleHeader } from "../rendering/render-preview-modal"; @@ -22,7 +22,7 @@ export async function renderLeaderboard() { if (!cachedEntries || Date.now() - parseInt(lastUpdate) > 1000 * 60 * 60 * 24 * 7) { // fetches the most up to date leaderboard data from the repo - entries = await fetchAllLeaderboardDatas(); + entries = await fetchAllLeaderboardData(); if (!entries) { return; diff --git a/src/home/rendering/setup-keyboard-navigation.ts b/src/home/rendering/setup-keyboard-navigation.ts index dc1c272..b7daf82 100644 --- a/src/home/rendering/setup-keyboard-navigation.ts +++ b/src/home/rendering/setup-keyboard-navigation.ts @@ -41,7 +41,6 @@ function keyDownHandler() { previewEntryAdditionalDetails(issueFull); } else if (event.key === "Escape") { - console.log("ecapekey"); disableKeyboardNavigation(container); } }; From 60d163f6044a9332af331b202b244d170a47314a Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:54:06 +0100 Subject: [PATCH 6/7] chore: readme --- .env.example | 3 +- README.md | 37 +++++------------------ package.json | 6 ++-- src/home/rendering/display-leaderboard.ts | 2 +- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/.env.example b/.env.example index e49d79a..f782743 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,2 @@ -MY_SECRET="MY_SECRET" +SUPABASE_URL="" +SUPABASE_ANON_KEY="" diff --git a/README.md b/README.md index 7b0867a..fa1c4ab 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,9 @@ -# `@ubiquity/ts-template` +# `@ubiquity/leaderboard.ubq.fi` -This template repository includes support for the following: +This is an up-to-date leaderboard of the top contributors to the Ubiquity ecosystem based on earnings from completed Devpool Directory bounties. -- TypeScript -- Environment Variables -- Conventional Commits -- Automatic deployment to Cloudflare Pages - -## Testing - -### Cypress - -To test with Cypress Studio UI, run - -```shell -yarn cy:open -``` - -Otherwise to simply run the tests through the console, run - -```shell -yarn cy:run -``` - -### Jest - -To start Jest tests, run - -```shell -yarn test -``` +### TODO +- [ ] Pull data from Supabase instead of from static repo file +- [ ] Improve the hunter metadata/markers displayed in the additional details modal +- [ ] Add filters based on markers such as XP, Karma, Top n, etc. +- [ ] Add pagination and cap displayed entries? \ No newline at end of file diff --git a/package.json b/package.json index 8ea3793..6a70727 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "ts-template", + "name": "leaderboard-ubq-fi", "version": "1.0.0", - "description": "Template repository with TypeScript support.", + "description": "Active contributor earnings leaderboard for Ubiquity DAO", "main": "build/index.ts", "author": "Ubiquity DAO", "license": "MIT", @@ -81,4 +81,4 @@ "@commitlint/config-conventional" ] } -} +} \ No newline at end of file diff --git a/src/home/rendering/display-leaderboard.ts b/src/home/rendering/display-leaderboard.ts index 57c1043..3624d75 100644 --- a/src/home/rendering/display-leaderboard.ts +++ b/src/home/rendering/display-leaderboard.ts @@ -9,7 +9,7 @@ export async function displayLeaderboard() { return; } - const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a moment if it's your first time."); + const killPopup = displayPopupMessage("Fetching leaderboard...", "This may take a couple of moments please wait."); await renderLeaderboard(); killPopup(); } From 46cda6361efa199bd904a44f0b9968cd41b99f51 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:45:33 +0100 Subject: [PATCH 7/7] fix: env vars --- .env.example | 5 +++-- README.md | 3 ++- build/esbuild-build.ts | 11 ++++++----- package.json | 2 +- src/home/getters/get-github-access-token.ts | 7 +++---- src/home/rendering/render-github-login-button.ts | 7 ++++--- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.env.example b/.env.example index f782743..7044b33 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,3 @@ -SUPABASE_URL="" -SUPABASE_ANON_KEY="" +SUPABASE_DB_PASSWORD= +SUPABASE_PROJECT_ID= +SUPABASE_ACCESS_TOKEN= \ No newline at end of file diff --git a/README.md b/README.md index fa1c4ab..0cdaa49 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ This is an up-to-date leaderboard of the top contributors to the Ubiquity ecosystem based on earnings from completed Devpool Directory bounties. ### TODO + - [ ] Pull data from Supabase instead of from static repo file - [ ] Improve the hunter metadata/markers displayed in the additional details modal - [ ] Add filters based on markers such as XP, Karma, Top n, etc. -- [ ] Add pagination and cap displayed entries? \ No newline at end of file +- [ ] Add pagination and cap displayed entries? diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts index 5c7e08a..e79535b 100644 --- a/build/esbuild-build.ts +++ b/build/esbuild-build.ts @@ -24,7 +24,7 @@ export const esBuildContext: esbuild.BuildOptions = { ".json": "file", }, outdir: "static/dist", - define: createEnvDefines(["SUPABASE_URL", "SUPABASE_ANON_KEY"], { + define: createEnvDefines(["SUPABASE_ACCESS_TOKEN", "SUPABASE_DB_PASSWORD", "SUPABASE_PROJECT_ID"], { SUPABASE_STORAGE_KEY: generateSupabaseStorageKey(), commitHash: execSync(`git rev-parse --short HEAD`).toString().trim(), }), @@ -54,13 +54,14 @@ function createEnvDefines(environmentVariables: string[], generatedAtBuild: Reco } export function generateSupabaseStorageKey(): string | null { - const SUPABASE_URL = process.env.SUPABASE_URL; - if (!SUPABASE_URL) { - console.error("SUPABASE_URL environment variable is not set"); + const id = process.env.SUPABASE_PROJECT_ID; + if (!id) { + console.error("SUPABASE_PROJECT_ID environment variable is not set"); return null; } + const url = `https://${id}.supabase.co`; - const urlParts = SUPABASE_URL.split("."); + const urlParts = url.split("."); if (urlParts.length === 0) { console.error("Invalid SUPABASE_URL environment variable"); return null; diff --git a/package.json b/package.json index 6a70727..9535881 100644 --- a/package.json +++ b/package.json @@ -81,4 +81,4 @@ "@commitlint/config-conventional" ] } -} \ No newline at end of file +} diff --git a/src/home/getters/get-github-access-token.ts b/src/home/getters/get-github-access-token.ts index b93563d..b557105 100644 --- a/src/home/getters/get-github-access-token.ts +++ b/src/home/getters/get-github-access-token.ts @@ -1,14 +1,13 @@ -declare const SUPABASE_STORAGE_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts import { checkSupabaseSession } from "../rendering/render-github-login-button"; import { getLocalStore } from "./get-local-store"; - +declare const SUPABASE_PROJECT_ID: string; // @DEV: passed in at build time check build/esbuild-build.ts export async function getGitHubAccessToken(): Promise { // better to use official function, looking up localstorage has flaws const authToken = await checkSupabaseSession(); const expiresAt = authToken?.expires_at; if (expiresAt && expiresAt < Date.now() / 1000) { - localStorage.removeItem(`sb-${SUPABASE_STORAGE_KEY}-auth-token`); + localStorage.removeItem(`sb-${SUPABASE_PROJECT_ID}-auth-token`); return null; } @@ -16,7 +15,7 @@ export async function getGitHubAccessToken(): Promise { } export function getGitHubUserName(): string | null { - const authToken = getLocalStore(`sb-${SUPABASE_STORAGE_KEY}-auth-token`) as OauthToken | null; + const authToken = getLocalStore(`sb-${SUPABASE_PROJECT_ID}-auth-token`) as OauthToken | null; return authToken?.user?.user_metadata?.user_name ?? null; } diff --git a/src/home/rendering/render-github-login-button.ts b/src/home/rendering/render-github-login-button.ts index a8b5f8f..50cb9b0 100644 --- a/src/home/rendering/render-github-login-button.ts +++ b/src/home/rendering/render-github-login-button.ts @@ -1,10 +1,11 @@ import { createClient } from "@supabase/supabase-js"; import { toolbar } from "../ready-toolbar"; -declare const SUPABASE_URL: string; // @DEV: passed in at build time check build/esbuild-build.ts -declare const SUPABASE_ANON_KEY: string; // @DEV: passed in at build time check build/esbuild-build.ts +declare const SUPABASE_PROJECT_ID: string; // @DEV: passed in at build time check build/esbuild-build.ts +declare const SUPABASE_DB_PASSWORD: string; // @DEV: passed in at build time check build/esbuild-build.ts -const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY); +const SUPABASE_URL = `https://${SUPABASE_PROJECT_ID}.supabase.co`; +const supabase = createClient(SUPABASE_URL, SUPABASE_DB_PASSWORD); export function getSupabase() { return supabase;