finishes feed

This commit is contained in:
Christian Beutel
2025-07-12 16:36:40 +02:00
parent e8c7e7721a
commit 03bf5aa5ad
33 changed files with 800 additions and 232 deletions

View File

@@ -3,23 +3,28 @@
import { page } from "$app/state";
import emptyStateTrailDark from "$lib/assets/svgs/empty_states/empty_state_trail_dark.svg";
import emptyStateTrailLight from "$lib/assets/svgs/empty_states/empty_state_trail_light.svg";
import ActivityCard from "$lib/components/profile/activity_card.svelte";
import FeedCard from "$lib/components/profile/feed_card.svelte";
import type { FeedItem } from "$lib/models/feed.js";
import type { TimelineItem } from "$lib/models/timeline.js";
import { profile_timeline_index } from "$lib/stores/profile_store.js";
import { profile_feed_index } from "$lib/stores/profile_store.js";
import { theme } from "$lib/stores/theme_store.js";
import { getFileURL } from "$lib/util/file_util.js";
import { _ } from "svelte-i18n";
let { data } = $props();
let timeline = $state(data.timeline);
$effect(() => {
data.feed;
feed = data.feed
})
let feed = $state(data.feed);
let loading: boolean = false;
let pagination = $derived({
page: timeline.page,
totalPages: timeline.totalItems,
page: feed.page,
totalPages: feed.totalItems,
});
async function onListScroll(e: Event) {
@@ -37,19 +42,19 @@
async function loadNextPage() {
pagination.page += 1;
timeline = await profile_timeline_index(
page.params.handle,
pagination.page,
);
feed = await profile_feed_index(page.params.handle, pagination.page);
}
function handleTimeLineItemClick(item: TimelineItem) {
if (item.trail_iri.length) {
function handleFeedItemClick(f: FeedItem) {
const author = f.expand.item.expand?.author;
if (f.type == "trail") {
goto(
`/trail/view/@${item.trail_author_username}@${item.trail_author_domain}/${item.trail_id}`,
`/trail/view/@${author?.preferred_username}@${author?.domain}/${f.item}`,
);
} else {
goto(`/trail/view/${page.params.handle}/${item.trail_id}`);
goto(
`/lists/@${author?.preferred_username}@${author?.domain}/${f.item}`,
);
}
}
</script>
@@ -130,24 +135,24 @@
</div>
<div class="space-y-4">
<h4 class="text-xl font-semibold">Timeline</h4>
{#if !timeline.items?.length && data.isOwnProfile}
{#if !feed.items?.length && data.isOwnProfile}
<a class="btn-primary inline-block" href="/trails/edit/new"
>+ {$_("new-trail")}</a
>
{:else if !timeline.items?.length}
{:else if !feed.items?.length}
<p class="w-full text-center text-gray-500 text-sm">
{$_("empty-activities", {
values: { username: data.profile.preferredUsername },
})}
</p>
{/if}
{#each timeline.items as item}
{#each feed.items as item}
<div
class="py-1 cursor-pointer"
role="presentation"
onclick={() => handleTimeLineItemClick(item)}
onclick={() => handleFeedItemClick(item)}
>
<ActivityCard activity={item} actor={data.actor}></ActivityCard>
<FeedCard feedItem={item}></FeedCard>
</div>
{/each}
</div>

View File

@@ -1,5 +1,5 @@
import type { ListFilter } from "$lib/models/list";
import { profile_lists_index, profile_timeline_index } from "$lib/stores/profile_store";
import { profile_lists_index, profile_feed_index } from "$lib/stores/profile_store";
import { error, type Load } from "@sveltejs/kit";
export const load: Load = async ({ params, fetch, parent }) => {
@@ -19,10 +19,10 @@ export const load: Load = async ({ params, fetch, parent }) => {
try {
const lists = await profile_lists_index(params.handle, filter, 1, 6, fetch)
const timeline = await profile_timeline_index(params.handle, 1, 10, fetch);
return { lists: lists.items, timeline }
const feed = await profile_feed_index(params.handle, 1, 10, fetch);
return { lists: lists.items, feed }
} catch(e) {
return {lists: [], timeline: {items: [], page: 1, perPage: 1, totalItems: 0, totalPages: 0}}
return {lists: [], feed: {items: [], page: 1, perPage: 1, totalItems: 0, totalPages: 0}}
}