feat: local and federated timelines
This commit is contained in:
parent
7db5ec7fae
commit
c51a0b1e5d
3 changed files with 64 additions and 11 deletions
|
@ -243,11 +243,13 @@ export async function rejectFollowRequest(host, token, account_id) {
|
||||||
* @param {string} timeline - The name of the timeline to pull (default "home").
|
* @param {string} timeline - The name of the timeline to pull (default "home").
|
||||||
* @param {string} max_id - If provided, only shows posts after this ID.
|
* @param {string} max_id - If provided, only shows posts after this ID.
|
||||||
*/
|
*/
|
||||||
export async function getTimeline(host, token, timeline, max_id) {
|
export async function getTimeline(host, token, timeline, max_id, local_only, remote_only) {
|
||||||
let url = `https://${host}/api/v1/timelines/${timeline || "home"}`;
|
let url = `https://${host}/api/v1/timelines/${timeline || "home"}`;
|
||||||
|
|
||||||
let params = new URLSearchParams();
|
let params = new URLSearchParams();
|
||||||
if (max_id) params.append("max_id", max_id);
|
if (max_id) params.append("max_id", max_id);
|
||||||
|
if (remote_only) params.append("remote", remote_only);
|
||||||
|
if (local_only) params.append("local", local_only);
|
||||||
const params_string = params.toString();
|
const params_string = params.toString();
|
||||||
if (params_string) url += '?' + params_string;
|
if (params_string) url += '?' + params_string;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ const lang = Lang();
|
||||||
|
|
||||||
let loading = false;
|
let loading = false;
|
||||||
|
|
||||||
export async function getTimeline(clean) {
|
export async function getTimeline(timelineType = "home", clean, localOnly = false, remoteOnly = false) {
|
||||||
if (loading) return; // no spamming!!
|
if (loading) return; // no spamming!!
|
||||||
loading = true;
|
loading = true;
|
||||||
|
|
||||||
|
@ -22,8 +22,10 @@ export async function getTimeline(clean) {
|
||||||
const timeline_data = await api.getTimeline(
|
const timeline_data = await api.getTimeline(
|
||||||
get(server).host,
|
get(server).host,
|
||||||
get(app).token,
|
get(app).token,
|
||||||
"home",
|
timelineType,
|
||||||
last_post
|
last_post,
|
||||||
|
localOnly,
|
||||||
|
remoteOnly
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!timeline_data) {
|
if (!timeline_data) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import { page } from '$app/stores';
|
import { page } from '$app/stores';
|
||||||
import { account } from '$lib/stores/account.js';
|
import { account } from '$lib/stores/account.js';
|
||||||
import { timeline, getTimeline } from '$lib/timeline.js';
|
import { timeline, getTimeline } from '$lib/timeline.js';
|
||||||
|
import { app_name } from '$lib/config.js';
|
||||||
import Lang from '$lib/lang';
|
import Lang from '$lib/lang';
|
||||||
|
|
||||||
import LoginForm from '$lib/ui/LoginForm.svelte';
|
import LoginForm from '$lib/ui/LoginForm.svelte';
|
||||||
|
@ -11,23 +12,71 @@
|
||||||
|
|
||||||
const lang = Lang();
|
const lang = Lang();
|
||||||
|
|
||||||
|
// TODO: refactor to enum when moving to TS
|
||||||
|
let timelineType = localStorage.getItem(app_name + '_selected_timeline') || "home";
|
||||||
|
|
||||||
|
$: {
|
||||||
|
// awful hack to update timeline fresh
|
||||||
|
// when timelineType is updated
|
||||||
|
//
|
||||||
|
// TODO: migrate to $effect when migrating to svelte 5
|
||||||
|
timelineType = timelineType
|
||||||
|
|
||||||
|
// set in localStorage
|
||||||
|
localStorage.setItem(app_name + '_selected_timeline', timelineType);
|
||||||
|
|
||||||
|
// erase the timeline here so the ui reacts instantly
|
||||||
|
// mae: i could write an awesome undertale reference here
|
||||||
|
timeline.set([]);
|
||||||
|
|
||||||
|
getCurrentTimeline()
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentTimeline(clean = false) {
|
||||||
|
switch(timelineType) {
|
||||||
|
case "home":
|
||||||
|
getTimeline("home", clean);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "local":
|
||||||
|
getTimeline("public", clean, true)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "federated":
|
||||||
|
getTimeline("public", clean, false, true)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
account.subscribe(account => {
|
account.subscribe(account => {
|
||||||
if (account) getTimeline();
|
if (account) getCurrentTimeline();
|
||||||
});
|
});
|
||||||
|
|
||||||
document.addEventListener('scroll', () => {
|
document.addEventListener('scroll', () => {
|
||||||
if ($account && $page.url.pathname !== "/") return;
|
if ($account && $page.url.pathname !== "/") return;
|
||||||
if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 2048) {
|
if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 2048) {
|
||||||
getTimeline();
|
getCurrentTimeline();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if $account}
|
{#if $account}
|
||||||
<PageHeader title={lang.string('timeline.home')}>
|
<PageHeader title={lang.string(`timeline.${timelineType}`)}>
|
||||||
<Button centered active>{lang.string('timeline.home')}</Button>
|
<Button centered
|
||||||
<Button centered disabled>{lang.string('timeline.local')}</Button>
|
active={(timelineType == "home")}
|
||||||
<Button centered disabled>{lang.string('timeline.federated')}</Button>
|
on:click={() => timelineType = "home"}>
|
||||||
|
{lang.string('timeline.home')}
|
||||||
|
</Button>
|
||||||
|
<Button centered
|
||||||
|
active={(timelineType == "local")}
|
||||||
|
on:click={() => timelineType = "local"}>
|
||||||
|
{lang.string('timeline.local')}
|
||||||
|
</Button>
|
||||||
|
<Button centered
|
||||||
|
active={(timelineType == "federated")}
|
||||||
|
on:click={() => timelineType = "federated"}>
|
||||||
|
{lang.string('timeline.federated')}
|
||||||
|
</Button>
|
||||||
</PageHeader>
|
</PageHeader>
|
||||||
|
|
||||||
<div id="feed" role="feed">
|
<div id="feed" role="feed">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue