import { LoaderFunctionArgs, useLoaderData } from "react-router"; import { parseOffset } from "#lib/pagination"; import { createPostsPageURL } from "#lib/urls"; import { fetchPosts } from "#api/posts"; import { PageSkeleton } from "#components/pages"; import { Paginator } from "#components/pagination"; import { FooterAd, HeaderAd, SliderAd } from "#components/advs"; import { CardList, PostCard } from "#components/cards"; import { FormRouter, FormSection } from "#components/forms"; import { IPost } from "#entities/posts"; import { findFavouritePosts, findFavouriteProfiles } from "#entities/account"; interface IProps { count: number; trueCount: number; offset?: number; posts: IPost[]; query?: string; tags?: string[]; } export function PostsPage() { const { count, trueCount, offset, query, posts, tags } = useLoaderData() as IProps; const title = "Posts"; const heading = "Posts"; return (
String(createPostsPageURL(offset, query, tags)) } />
{count === 0 ? (

Nobody here but us chickens!

There are no posts for your query.

) : ( posts.map((post) => ( )) )}
String(createPostsPageURL(offset, query, tags)) } />
); } export async function loader({ request }: LoaderFunctionArgs): Promise { const searchParams = new URL(request.url).searchParams; let offset: number | undefined = undefined; { const parsedOffset = searchParams.get("o")?.trim(); if (parsedOffset) { offset = parseOffset(parsedOffset); } } const query = searchParams.get("q")?.trim(); const tags = searchParams.getAll("tag"); const { count, true_count, posts } = await fetchPosts(offset, query, tags); const postsData = posts.map(({ service, user, id }) => ({ service, user, id, })); const profilesData = posts.reduce<{ service: string; id: string }[]>( (profilesData, post) => { const match = profilesData.find( (profileData) => profileData.id === post.user && profileData.service === post.service ); if (!match) { profilesData.push({ service: post.service, id: post.user }); } return profilesData; }, [] ); const favPosts = await findFavouritePosts(postsData); const favProfiles = await findFavouriteProfiles(profilesData); const postsWithFavs = posts.map((post) => { const isFavPost = Boolean( favPosts.find( ({ service, user, id }) => id === post.id && user === post.user && service === post.service ) ); const isFavProfile = Boolean( favProfiles.find( ({ service, id }) => id === post.user && service === post.service ) ); if (!isFavPost && !isFavProfile) { return post; } return { ...post, isFavourite: isFavPost, isFavouriteProfile: isFavProfile, }; }); return { offset, query, tags, count, trueCount: true_count, posts: postsWithFavs, }; }