From 3ae05b3f9fa315898f40d807d8561ffc0b4d7747 Mon Sep 17 00:00:00 2001 From: ari melody Date: Sat, 29 Jun 2024 14:48:34 +0100 Subject: [PATCH] finish sk restructure, a11y and optimisations --- package-lock.json | 13 +- package.json | 1 + {static => src}/font/inter/Inter-Black.woff2 | 0 .../font/inter/Inter-BlackItalic.woff2 | 0 {static => src}/font/inter/Inter-Bold.woff2 | 0 .../font/inter/Inter-BoldItalic.woff2 | 0 .../font/inter/Inter-ExtraBold.woff2 | 0 .../font/inter/Inter-ExtraBoldItalic.woff2 | 0 .../font/inter/Inter-ExtraLight.woff2 | 0 .../font/inter/Inter-ExtraLightItalic.woff2 | 0 {static => src}/font/inter/Inter-Italic.woff2 | 0 {static => src}/font/inter/Inter-Light.woff2 | 0 .../font/inter/Inter-LightItalic.woff2 | 0 {static => src}/font/inter/Inter-Medium.woff2 | 0 .../font/inter/Inter-MediumItalic.woff2 | 0 .../font/inter/Inter-Regular.woff2 | 0 .../font/inter/Inter-SemiBold.woff2 | 0 .../font/inter/Inter-SemiBoldItalic.woff2 | 0 {static => src}/font/inter/Inter-Thin.woff2 | 0 .../font/inter/Inter-ThinItalic.woff2 | 0 .../font/inter/InterDisplay-Black.woff2 | 0 .../font/inter/InterDisplay-BlackItalic.woff2 | 0 .../font/inter/InterDisplay-Bold.woff2 | 0 .../font/inter/InterDisplay-BoldItalic.woff2 | 0 .../font/inter/InterDisplay-ExtraBold.woff2 | 0 .../inter/InterDisplay-ExtraBoldItalic.woff2 | 0 .../font/inter/InterDisplay-ExtraLight.woff2 | 0 .../inter/InterDisplay-ExtraLightItalic.woff2 | 0 .../font/inter/InterDisplay-Italic.woff2 | 0 .../font/inter/InterDisplay-Light.woff2 | 0 .../font/inter/InterDisplay-LightItalic.woff2 | 0 .../font/inter/InterDisplay-Medium.woff2 | 0 .../inter/InterDisplay-MediumItalic.woff2 | 0 .../font/inter/InterDisplay-Regular.woff2 | 0 .../font/inter/InterDisplay-SemiBold.woff2 | 0 .../inter/InterDisplay-SemiBoldItalic.woff2 | 0 .../font/inter/InterDisplay-Thin.woff2 | 0 .../font/inter/InterDisplay-ThinItalic.woff2 | 0 .../font/inter/InterVariable-Italic.woff2 | 0 .../font/inter/InterVariable.woff2 | 0 {static => src}/font/inter/LICENSE.txt | 0 {static => src}/font/inter/inter.css | 0 src/lib/App.svelte | 221 ------------------ src/lib/app.css | 28 ++- src/lib/client/api.js | 38 ++- src/lib/post.js | 1 + src/lib/sound.js | 9 +- src/lib/timeline.js | 43 ++++ src/lib/ui/Feed.svelte | 101 ++------ src/lib/ui/Navigation.svelte | 33 +-- src/lib/ui/post/BoostContext.svelte | 14 +- src/lib/ui/post/Post.svelte | 50 ++-- src/lib/ui/post/ReplyContext.svelte | 29 ++- src/routes/+page.svelte | 119 ++++++---- src/routes/post/[id]/+layout.svelte | 50 ++++ src/routes/post/[id]/+page.js | 46 ++++ src/routes/post/[id]/+page.svelte | 38 +++ {static => src}/sound/hello.ogg | Bin {static => src}/sound/log.ogg | Bin {static => src}/sound/success.ogg | Bin svelte.config.js | 11 +- 61 files changed, 416 insertions(+), 429 deletions(-) rename {static => src}/font/inter/Inter-Black.woff2 (100%) rename {static => src}/font/inter/Inter-BlackItalic.woff2 (100%) rename {static => src}/font/inter/Inter-Bold.woff2 (100%) rename {static => src}/font/inter/Inter-BoldItalic.woff2 (100%) rename {static => src}/font/inter/Inter-ExtraBold.woff2 (100%) rename {static => src}/font/inter/Inter-ExtraBoldItalic.woff2 (100%) rename {static => src}/font/inter/Inter-ExtraLight.woff2 (100%) rename {static => src}/font/inter/Inter-ExtraLightItalic.woff2 (100%) rename {static => src}/font/inter/Inter-Italic.woff2 (100%) rename {static => src}/font/inter/Inter-Light.woff2 (100%) rename {static => src}/font/inter/Inter-LightItalic.woff2 (100%) rename {static => src}/font/inter/Inter-Medium.woff2 (100%) rename {static => src}/font/inter/Inter-MediumItalic.woff2 (100%) rename {static => src}/font/inter/Inter-Regular.woff2 (100%) rename {static => src}/font/inter/Inter-SemiBold.woff2 (100%) rename {static => src}/font/inter/Inter-SemiBoldItalic.woff2 (100%) rename {static => src}/font/inter/Inter-Thin.woff2 (100%) rename {static => src}/font/inter/Inter-ThinItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Black.woff2 (100%) rename {static => src}/font/inter/InterDisplay-BlackItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Bold.woff2 (100%) rename {static => src}/font/inter/InterDisplay-BoldItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-ExtraBold.woff2 (100%) rename {static => src}/font/inter/InterDisplay-ExtraBoldItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-ExtraLight.woff2 (100%) rename {static => src}/font/inter/InterDisplay-ExtraLightItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Italic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Light.woff2 (100%) rename {static => src}/font/inter/InterDisplay-LightItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Medium.woff2 (100%) rename {static => src}/font/inter/InterDisplay-MediumItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Regular.woff2 (100%) rename {static => src}/font/inter/InterDisplay-SemiBold.woff2 (100%) rename {static => src}/font/inter/InterDisplay-SemiBoldItalic.woff2 (100%) rename {static => src}/font/inter/InterDisplay-Thin.woff2 (100%) rename {static => src}/font/inter/InterDisplay-ThinItalic.woff2 (100%) rename {static => src}/font/inter/InterVariable-Italic.woff2 (100%) rename {static => src}/font/inter/InterVariable.woff2 (100%) rename {static => src}/font/inter/LICENSE.txt (100%) rename {static => src}/font/inter/inter.css (100%) delete mode 100644 src/lib/App.svelte create mode 100644 src/lib/timeline.js create mode 100644 src/routes/post/[id]/+layout.svelte create mode 100644 src/routes/post/[id]/+page.js create mode 100644 src/routes/post/[id]/+page.svelte rename {static => src}/sound/hello.ogg (100%) rename {static => src}/sound/log.ogg (100%) rename {static => src}/sound/success.ogg (100%) diff --git a/package-lock.json b/package-lock.json index ce03001..d80f2aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,9 +7,10 @@ "": { "name": "spacesocial-client", "version": "0.2.0_rev2", - "license": "ISC", + "license": "GPL-3.0", "devDependencies": { "@sveltejs/adapter-auto": "^3.2.2", + "@sveltejs/adapter-static": "^3.0.2", "@sveltejs/kit": "^2.5.17", "@sveltejs/vite-plugin-svelte": "^3.1.1", "svelte": "^4.2.18", @@ -718,6 +719,16 @@ "@sveltejs/kit": "^2.0.0" } }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.2.tgz", + "integrity": "sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, "node_modules/@sveltejs/kit": { "version": "2.5.17", "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.17.tgz", diff --git a/package.json b/package.json index 406243b..cb454e0 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "license": "GPL-3.0", "devDependencies": { "@sveltejs/adapter-auto": "^3.2.2", + "@sveltejs/adapter-static": "^3.0.2", "@sveltejs/kit": "^2.5.17", "@sveltejs/vite-plugin-svelte": "^3.1.1", "svelte": "^4.2.18", diff --git a/static/font/inter/Inter-Black.woff2 b/src/font/inter/Inter-Black.woff2 similarity index 100% rename from static/font/inter/Inter-Black.woff2 rename to src/font/inter/Inter-Black.woff2 diff --git a/static/font/inter/Inter-BlackItalic.woff2 b/src/font/inter/Inter-BlackItalic.woff2 similarity index 100% rename from static/font/inter/Inter-BlackItalic.woff2 rename to src/font/inter/Inter-BlackItalic.woff2 diff --git a/static/font/inter/Inter-Bold.woff2 b/src/font/inter/Inter-Bold.woff2 similarity index 100% rename from static/font/inter/Inter-Bold.woff2 rename to src/font/inter/Inter-Bold.woff2 diff --git a/static/font/inter/Inter-BoldItalic.woff2 b/src/font/inter/Inter-BoldItalic.woff2 similarity index 100% rename from static/font/inter/Inter-BoldItalic.woff2 rename to src/font/inter/Inter-BoldItalic.woff2 diff --git a/static/font/inter/Inter-ExtraBold.woff2 b/src/font/inter/Inter-ExtraBold.woff2 similarity index 100% rename from static/font/inter/Inter-ExtraBold.woff2 rename to src/font/inter/Inter-ExtraBold.woff2 diff --git a/static/font/inter/Inter-ExtraBoldItalic.woff2 b/src/font/inter/Inter-ExtraBoldItalic.woff2 similarity index 100% rename from static/font/inter/Inter-ExtraBoldItalic.woff2 rename to src/font/inter/Inter-ExtraBoldItalic.woff2 diff --git a/static/font/inter/Inter-ExtraLight.woff2 b/src/font/inter/Inter-ExtraLight.woff2 similarity index 100% rename from static/font/inter/Inter-ExtraLight.woff2 rename to src/font/inter/Inter-ExtraLight.woff2 diff --git a/static/font/inter/Inter-ExtraLightItalic.woff2 b/src/font/inter/Inter-ExtraLightItalic.woff2 similarity index 100% rename from static/font/inter/Inter-ExtraLightItalic.woff2 rename to src/font/inter/Inter-ExtraLightItalic.woff2 diff --git a/static/font/inter/Inter-Italic.woff2 b/src/font/inter/Inter-Italic.woff2 similarity index 100% rename from static/font/inter/Inter-Italic.woff2 rename to src/font/inter/Inter-Italic.woff2 diff --git a/static/font/inter/Inter-Light.woff2 b/src/font/inter/Inter-Light.woff2 similarity index 100% rename from static/font/inter/Inter-Light.woff2 rename to src/font/inter/Inter-Light.woff2 diff --git a/static/font/inter/Inter-LightItalic.woff2 b/src/font/inter/Inter-LightItalic.woff2 similarity index 100% rename from static/font/inter/Inter-LightItalic.woff2 rename to src/font/inter/Inter-LightItalic.woff2 diff --git a/static/font/inter/Inter-Medium.woff2 b/src/font/inter/Inter-Medium.woff2 similarity index 100% rename from static/font/inter/Inter-Medium.woff2 rename to src/font/inter/Inter-Medium.woff2 diff --git a/static/font/inter/Inter-MediumItalic.woff2 b/src/font/inter/Inter-MediumItalic.woff2 similarity index 100% rename from static/font/inter/Inter-MediumItalic.woff2 rename to src/font/inter/Inter-MediumItalic.woff2 diff --git a/static/font/inter/Inter-Regular.woff2 b/src/font/inter/Inter-Regular.woff2 similarity index 100% rename from static/font/inter/Inter-Regular.woff2 rename to src/font/inter/Inter-Regular.woff2 diff --git a/static/font/inter/Inter-SemiBold.woff2 b/src/font/inter/Inter-SemiBold.woff2 similarity index 100% rename from static/font/inter/Inter-SemiBold.woff2 rename to src/font/inter/Inter-SemiBold.woff2 diff --git a/static/font/inter/Inter-SemiBoldItalic.woff2 b/src/font/inter/Inter-SemiBoldItalic.woff2 similarity index 100% rename from static/font/inter/Inter-SemiBoldItalic.woff2 rename to src/font/inter/Inter-SemiBoldItalic.woff2 diff --git a/static/font/inter/Inter-Thin.woff2 b/src/font/inter/Inter-Thin.woff2 similarity index 100% rename from static/font/inter/Inter-Thin.woff2 rename to src/font/inter/Inter-Thin.woff2 diff --git a/static/font/inter/Inter-ThinItalic.woff2 b/src/font/inter/Inter-ThinItalic.woff2 similarity index 100% rename from static/font/inter/Inter-ThinItalic.woff2 rename to src/font/inter/Inter-ThinItalic.woff2 diff --git a/static/font/inter/InterDisplay-Black.woff2 b/src/font/inter/InterDisplay-Black.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Black.woff2 rename to src/font/inter/InterDisplay-Black.woff2 diff --git a/static/font/inter/InterDisplay-BlackItalic.woff2 b/src/font/inter/InterDisplay-BlackItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-BlackItalic.woff2 rename to src/font/inter/InterDisplay-BlackItalic.woff2 diff --git a/static/font/inter/InterDisplay-Bold.woff2 b/src/font/inter/InterDisplay-Bold.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Bold.woff2 rename to src/font/inter/InterDisplay-Bold.woff2 diff --git a/static/font/inter/InterDisplay-BoldItalic.woff2 b/src/font/inter/InterDisplay-BoldItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-BoldItalic.woff2 rename to src/font/inter/InterDisplay-BoldItalic.woff2 diff --git a/static/font/inter/InterDisplay-ExtraBold.woff2 b/src/font/inter/InterDisplay-ExtraBold.woff2 similarity index 100% rename from static/font/inter/InterDisplay-ExtraBold.woff2 rename to src/font/inter/InterDisplay-ExtraBold.woff2 diff --git a/static/font/inter/InterDisplay-ExtraBoldItalic.woff2 b/src/font/inter/InterDisplay-ExtraBoldItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-ExtraBoldItalic.woff2 rename to src/font/inter/InterDisplay-ExtraBoldItalic.woff2 diff --git a/static/font/inter/InterDisplay-ExtraLight.woff2 b/src/font/inter/InterDisplay-ExtraLight.woff2 similarity index 100% rename from static/font/inter/InterDisplay-ExtraLight.woff2 rename to src/font/inter/InterDisplay-ExtraLight.woff2 diff --git a/static/font/inter/InterDisplay-ExtraLightItalic.woff2 b/src/font/inter/InterDisplay-ExtraLightItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-ExtraLightItalic.woff2 rename to src/font/inter/InterDisplay-ExtraLightItalic.woff2 diff --git a/static/font/inter/InterDisplay-Italic.woff2 b/src/font/inter/InterDisplay-Italic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Italic.woff2 rename to src/font/inter/InterDisplay-Italic.woff2 diff --git a/static/font/inter/InterDisplay-Light.woff2 b/src/font/inter/InterDisplay-Light.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Light.woff2 rename to src/font/inter/InterDisplay-Light.woff2 diff --git a/static/font/inter/InterDisplay-LightItalic.woff2 b/src/font/inter/InterDisplay-LightItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-LightItalic.woff2 rename to src/font/inter/InterDisplay-LightItalic.woff2 diff --git a/static/font/inter/InterDisplay-Medium.woff2 b/src/font/inter/InterDisplay-Medium.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Medium.woff2 rename to src/font/inter/InterDisplay-Medium.woff2 diff --git a/static/font/inter/InterDisplay-MediumItalic.woff2 b/src/font/inter/InterDisplay-MediumItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-MediumItalic.woff2 rename to src/font/inter/InterDisplay-MediumItalic.woff2 diff --git a/static/font/inter/InterDisplay-Regular.woff2 b/src/font/inter/InterDisplay-Regular.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Regular.woff2 rename to src/font/inter/InterDisplay-Regular.woff2 diff --git a/static/font/inter/InterDisplay-SemiBold.woff2 b/src/font/inter/InterDisplay-SemiBold.woff2 similarity index 100% rename from static/font/inter/InterDisplay-SemiBold.woff2 rename to src/font/inter/InterDisplay-SemiBold.woff2 diff --git a/static/font/inter/InterDisplay-SemiBoldItalic.woff2 b/src/font/inter/InterDisplay-SemiBoldItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-SemiBoldItalic.woff2 rename to src/font/inter/InterDisplay-SemiBoldItalic.woff2 diff --git a/static/font/inter/InterDisplay-Thin.woff2 b/src/font/inter/InterDisplay-Thin.woff2 similarity index 100% rename from static/font/inter/InterDisplay-Thin.woff2 rename to src/font/inter/InterDisplay-Thin.woff2 diff --git a/static/font/inter/InterDisplay-ThinItalic.woff2 b/src/font/inter/InterDisplay-ThinItalic.woff2 similarity index 100% rename from static/font/inter/InterDisplay-ThinItalic.woff2 rename to src/font/inter/InterDisplay-ThinItalic.woff2 diff --git a/static/font/inter/InterVariable-Italic.woff2 b/src/font/inter/InterVariable-Italic.woff2 similarity index 100% rename from static/font/inter/InterVariable-Italic.woff2 rename to src/font/inter/InterVariable-Italic.woff2 diff --git a/static/font/inter/InterVariable.woff2 b/src/font/inter/InterVariable.woff2 similarity index 100% rename from static/font/inter/InterVariable.woff2 rename to src/font/inter/InterVariable.woff2 diff --git a/static/font/inter/LICENSE.txt b/src/font/inter/LICENSE.txt similarity index 100% rename from static/font/inter/LICENSE.txt rename to src/font/inter/LICENSE.txt diff --git a/static/font/inter/inter.css b/src/font/inter/inter.css similarity index 100% rename from static/font/inter/inter.css rename to src/font/inter/inter.css diff --git a/src/lib/App.svelte b/src/lib/App.svelte deleted file mode 100644 index 6f05334..0000000 --- a/src/lib/App.svelte +++ /dev/null @@ -1,221 +0,0 @@ - - -
- -
- -
- -
- {#if ready} - - {:else} -
-
-

Space Social

-

Welcome, fediverse user!

-

Please enter your instance domain to log in.

-
- - {#if instance_url_error} -

{instance_url_error}

- {/if} -
-
- -

- Please note this is - extremely experimental software; - things are likely to break! -
- If that's all cool with you, welcome aboard! -

- - -
-
- {/if} -
- -
- -
- -
- - diff --git a/src/lib/app.css b/src/lib/app.css index 6571118..c49cb44 100644 --- a/src/lib/app.css +++ b/src/lib/app.css @@ -1,4 +1,4 @@ -@import url("/font/inter/inter.css"); +@import url("../font/inter/inter.css"); :root { --bg-1000: #fff6de; @@ -40,6 +40,32 @@ body { box-sizing: border-box; } +a { + color: var(--accent); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +#spacesocial-app { + margin: auto 0; + padding: 0 16px; + display: flex; + flex-direction: row; + justify-content: center; + gap: 16px; +} + +header, #widgets { + width: 300px; +} + +main { + width: 732px; +} + .throb { animation: .25s throb alternate infinite ease-in; } diff --git a/src/lib/client/api.js b/src/lib/client/api.js index e063e75..403ea44 100644 --- a/src/lib/client/api.js +++ b/src/lib/client/api.js @@ -8,7 +8,7 @@ import { get } from 'svelte/store'; export async function createApp(host) { let form = new FormData(); form.append("client_name", "space social"); - form.append("redirect_uris", `${location.origin}/callback`); + form.append("redirect_uris", `${location.origin}`); form.append("scopes", "read write push"); form.append("website", "https://spacesocial.arimelody.me"); @@ -35,7 +35,7 @@ export function getOAuthUrl() { return `https://${client.instance.host}/oauth/authorize` + `?client_id=${client.app.id}` + "&scope=read+write+push" + - `&redirect_uri=${location.origin}/callback` + + `&redirect_uri=${location.origin}` + "&response_type=code"; } @@ -44,7 +44,7 @@ export async function getToken(code) { let form = new FormData(); form.append("client_id", client.app.id); form.append("client_secret", client.app.secret); - form.append("redirect_uri", `${location.origin}/callback`); + form.append("redirect_uri", `${location.origin}`); form.append("grant_type", "authorization_code"); form.append("code", code); form.append("scope", "read write push"); @@ -107,7 +107,7 @@ export async function getTimeline(last_post_id) { return data; } -export async function getPost(post_id, parent_replies) { +export async function getPost(post_id, ancestor_count) { let client = get(Client.get()); let url = `https://${client.instance.host}/api/v1/statuses/${post_id}`; const data = await fetch(url, { @@ -208,7 +208,7 @@ export async function unreactPost(post_id, shortcode) { return data; } -export async function parsePost(data, parent_replies, child_replies) { +export async function parsePost(data, ancestor_count, with_context) { let client = get(Client.get()); let post = new Post(); @@ -218,9 +218,12 @@ export async function parsePost(data, parent_replies, child_replies) { post.text = data.content; post.reply = null; - if ((data.in_reply_to_id || data.reply) && parent_replies !== 0) { - const reply_data = data.reply || await getPost(data.in_reply_to_id, parent_replies - 1); - post.reply = await parsePost(reply_data, parent_replies - 1, false); + if (!with_context && // ancestor replies are handled in full later + (data.in_reply_to_id || data.reply) && + ancestor_count !== 0 + ) { + const reply_data = data.reply || await getPost(data.in_reply_to_id, ancestor_count - 1); + post.reply = await parsePost(reply_data, ancestor_count - 1, false); // if the post returns false, we probably don't have permission to read it. // we'll respect the thread's privacy, and leave it alone :) if (post.reply === false) return false; @@ -228,11 +231,22 @@ export async function parsePost(data, parent_replies, child_replies) { post.boost = data.reblog ? await parsePost(data.reblog, 1, false) : null; post.replies = []; - if (child_replies) { + if (with_context) { const replies_data = await getPostContext(data.id); - if (replies_data && replies_data.descendants) { - for (let i in replies_data.descendants) { - post.replies.push(await parsePost(replies_data.descendants[i], 0, false)); + if (replies_data) { + // posts this is replying to + if (replies_data.ancestors) { + let head = post; + while (replies_data.ancestors.length > 0) { + head.reply = await parsePost(replies_data.ancestors.pop(), 0, false); + head = head.reply; + } + } + // posts in reply to this + if (replies_data.descendants) { + for (let i in replies_data.descendants) { + post.replies.push(await parsePost(replies_data.descendants[i], 0, false)); + } } } } diff --git a/src/lib/post.js b/src/lib/post.js index 9971daa..9b6d10f 100644 --- a/src/lib/post.js +++ b/src/lib/post.js @@ -17,6 +17,7 @@ export default class Post { files; url; reply; + reply_id; replies; boost; visibility; diff --git a/src/lib/sound.js b/src/lib/sound.js index aac2cef..3aa0e58 100644 --- a/src/lib/sound.js +++ b/src/lib/sound.js @@ -1,10 +1,13 @@ +import sound_log from '../sound/log.ogg'; +import sound_hello from '../sound/hello.ogg'; +import sound_success from '../sound/success.ogg'; let sounds; if (typeof Audio !== typeof undefined) { sounds = { - "default": new Audio("/sound/log.ogg"), - "post": new Audio("/sound/success.ogg"), - "boost": new Audio("/sound/hello.ogg"), + "default": new Audio(sound_log), + "post": new Audio(sound_hello), + "boost": new Audio(sound_success), }; } diff --git a/src/lib/timeline.js b/src/lib/timeline.js new file mode 100644 index 0000000..39d1b14 --- /dev/null +++ b/src/lib/timeline.js @@ -0,0 +1,43 @@ +import { Client } from '$lib/client/client.js'; +import { get, writable } from 'svelte/store'; +import { parsePost } from '$lib/client/api.js'; + +export let posts = writable([]); + +let client = get(Client.get()); +let loading = false; + +export async function getTimeline(clean) { + if (loading) return; // no spamming!! + loading = true; + + let timeline_data; + if (get(posts).length === 0) timeline_data = await client.getTimeline() + else timeline_data = await client.getTimeline(get(posts)[get(posts).length - 1].id); + + if (!timeline_data) { + console.error(`Failed to retrieve timeline.`); + loading = false; + return; + } + + if (clean) posts.set([]); + + for (let i in timeline_data) { + const post_data = timeline_data[i]; + const post = await parsePost(post_data, 1, false); + if (!post) { + if (post === null || post === undefined) { + if (post_data.id) { + console.warn("Failed to parse post #" + post_data.id); + } else { + console.warn("Failed to parse post:"); + console.warn(post_data); + } + } + continue; + } + posts.update(current => [...current, post]); + } + loading = false; +} diff --git a/src/lib/ui/Feed.svelte b/src/lib/ui/Feed.svelte index a3a7062..bd3cef4 100644 --- a/src/lib/ui/Feed.svelte +++ b/src/lib/ui/Feed.svelte @@ -2,104 +2,33 @@ import Button from './Button.svelte'; import Post from './post/Post.svelte'; import Error from './Error.svelte'; - import { Client } from '../client/client.js'; - import { parsePost } from '../client/api.js'; + import { Client } from '$lib/client/client.js'; + import { parsePost } from '$lib/client/api.js'; import { get } from 'svelte/store'; + import { posts, getTimeline } from '$lib/timeline.js'; - let params = new URLSearchParams(location.search); - - let client = get(Client.get()); - let posts = []; - let loading = false; - let focus_post_id = location.pathname.startsWith("/post/") ? location.pathname.substring(6) : false; - - let error; - - async function getTimeline() { - if (loading) return; // no spamming!! - loading = true; - - let timeline_data; - if (posts.length === 0) timeline_data = await client.getTimeline() - else timeline_data = await client.getTimeline(posts[posts.length - 1].id); - - if (!timeline_data) { - console.error(`Failed to retrieve timeline.`); - loading = false; - return; + getTimeline(); + document.addEventListener("scroll", event => { + if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 2048) { + getTimeline(); } - - for (let i in timeline_data) { - const post_data = timeline_data[i]; - const post = await parsePost(post_data, 1, false); - if (!post) { - if (post === null || post === undefined) { - if (post_data.id) { - console.warn("Failed to parse post #" + post_data.id); - } else { - console.warn("Failed to parse post:"); - console.warn(post_data); - } - } - continue; - } - posts = [...posts, post]; - } - loading = false; - } - - async function getPost(post_id) { - loading = true; - - const post_data = await client.getPost(post_id); - if (!post_data) { - console.error(`Failed to retrieve post ${post_id}.`); - loading = false; - return; - } - - const post = await parsePost(post_data, 10, true); - posts = [post]; - for (let i in post.replies) { - posts = [...posts, post.replies[i]]; - } - loading = false; - } - - if (focus_post_id) { - getPost(focus_post_id); - } else { - getTimeline(); - document.addEventListener("scroll", event => { - if (!loading && window.innerHeight + window.scrollY >= document.body.offsetHeight - 2048) { - getTimeline(); - } - }); - } + }); -
-

Home

- -
- -
+
{#if posts.length <= 0} -
- just a moment... +
+ getting the feed...
{/if} - {#each posts as post} - + {#each $posts as post} + {/each}
diff --git a/src/lib/ui/post/Post.svelte b/src/lib/ui/post/Post.svelte index 4dbd5e6..9b9959f 100644 --- a/src/lib/ui/post/Post.svelte +++ b/src/lib/ui/post/Post.svelte @@ -11,6 +11,7 @@ import { get } from 'svelte/store'; import { Client } from '../../client/client.js'; import * as api from '../../client/api.js'; + import { goto } from '$app/navigation'; export let post_data; export let focused = false; @@ -25,7 +26,9 @@ } function gotoPost() { - location = `/post/${post.id}`; + if (focused) return; + if (event.key && event.key !== "Enter") return; + goto(`/post/${post.id}`); } async function toggleBoost() { @@ -80,25 +83,30 @@ let el; onMount(() => { if (focused) { - window.scrollTo(0, el.scrollHeight - 700); + window.scrollTo(0, el.scrollHeight); } }); let aria_label = post.user.username + '; ' + post.text + '; ' + post.created_at; -
+
{#if post.reply} {/if} {#if is_boost && !post_context.text} {/if} -
+