fp/packages/next/app/lib/vtubers.ts

151 lines
3.6 KiB
TypeScript
Raw Normal View History

2024-01-20 16:16:14 +00:00
import { IVod } from './vods'
import { strapiUrl, siteUrl } from './constants';
import qs from 'qs';
import { IMeta } from './types';
const fetchVtubersOptions = {
next: {
tags: ['vtubers']
}
}
export interface IVtuber {
id: number;
attributes: {
slug: string;
displayName: string;
chaturbate?: string;
twitter?: string;
patreon?: string;
twitch?: string;
tiktok?: string;
onlyfans?: string;
youtube?: string;
linktree?: string;
carrd?: string;
fansly?: string;
pornhub?: string;
discord?: string;
reddit?: string;
throne?: string;
instagram?: string;
facebook?: string;
merch?: string;
vods: IVod[];
description1: string;
description2?: string;
image: string;
imageBlur?: string;
themeColor: string;
2024-06-13 01:38:11 +00:00
fanslyId?: string;
chaturbateId?: string;
twitterId?: string;
2024-01-20 16:16:14 +00:00
}
}
export interface IVtuberResponse {
data: IVtuber;
meta: IMeta;
}
export interface IVtubersResponse {
data: IVtuber[];
meta: IMeta;
}
export function getUrl(slug: string): string {
return `${siteUrl}/vt/${slug}`
}
export async function getVtuberBySlug(slug: string): Promise<IVtuber|null> {
const query = qs.stringify(
{
filters: {
slug: {
$eq: slug
}
}
}
)
const res = await fetch(`${strapiUrl}/api/vtubers?${query}`);
if (!res.ok) {
console.error(`error inside getVtuberBySlug-- ${res.statusText}`);
return null;
}
const vtuber = await res.json();
return vtuber.data[0];
}
export async function getVtuberById(id: number): Promise<IVtuber|null> {
const res = await fetch(`${strapiUrl}/api/vtubers?filters[id][$eq]=${id}`);
if (!res.ok) {
console.error(`error inside getVtuberById-- ${res.statusText}`);
return null;
}
const vtuber = await res.json();
return vtuber
}
export async function getVtubers(): Promise<IVtubersResponse|null> {
const res = await fetch(`${strapiUrl}/api/vtubers`);
if (!res.ok) {
console.error(`error inside getVtubers-- ${res.statusText}`);
return null;
}
const vtubers = await res.json();
return vtubers;
}
export async function getAllVtubers(): Promise<IVtuber[] | null> {
const pageSize = 100;
const allVtubers: IVtuber[] = [];
let currentPage = 1;
while (true) {
const query = qs.stringify({
pagination: {
pageSize,
page: currentPage,
},
});
try {
2024-02-27 19:53:57 +00:00
console.log(`Getting ${strapiUrl}/api/vtubers page=${currentPage}`);
2024-01-20 16:16:14 +00:00
const response = await fetch(`${strapiUrl}/api/vtubers?${query}`, fetchVtubersOptions);
if (!response.ok) {
// Handle non-successful response (e.g., HTTP error)
throw new Error(`HTTP error! Status: ${response.status}`);
}
const responseData = await response.json();
if (!responseData.data || responseData.data.length === 0) {
// No more data to fetch
break;
}
allVtubers.push(...responseData.data);
currentPage++;
} catch (error) {
// Handle fetch error
if (error instanceof Error) {
console.error('Error fetching data:', error.message);
}
return null;
}
}
return allVtubers;
}