Files
y/client/src/loaders.ts
2023-12-17 12:01:27 +01:00

69 lines
1.7 KiB
TypeScript

import {
getAllPerson,
getFollowing,
getPersonByUsername,
getSelf,
} from "./api/Person";
import { deleteToken, getToken, getTokenUserUuid } from "./api/utils";
import { redirect } from "react-router-dom";
import { isError } from "./api/dto";
import { getPostsByAuthorUsername, getPostsByAuthorUuid } from "./api/Post";
export type LoaderToType<T extends (...args: any) => any> =
| Exclude<Awaited<ReturnType<T>>, Response>
| undefined;
export async function getCheckUserSelf() {
if (getToken() == null) {
return redirect("/login");
}
const ret = await getSelf();
if (isError(ret)) {
deleteToken();
return redirect("/");
}
return ret;
}
export async function homeLoader() {
return await getCheckUserSelf();
}
export async function userListLoader() {
return { people: await getAllPerson(), following: await getFollowing() };
}
export async function profileLoader({
params,
}: {
params: { username?: string };
}) {
const selfUuid = getTokenUserUuid();
if (!selfUuid) return redirect("/");
if (selfUuid == params.username) {
return redirect("/home/profile");
}
const posts = params.username
? await getPostsByAuthorUsername(params.username)
: await getPostsByAuthorUuid(selfUuid);
const retUser = params.username
? await getPersonByUsername(params.username)
: null;
if (
(params.username && !retUser) ||
retUser instanceof Response ||
isError(retUser)
) {
return retUser;
}
if (isError(posts)) {
return { user: retUser, posts: null };
}
return { user: retUser, posts };
}