- Update NewPartyClient and PartyPageClient to use correct Party props - Remove unstable_cache from all data fetching functions - Fix viewport metadata configuration in App Router - Restore ToastViewport component in layout - Fix import paths from 'types' to '~types' in Party components - Add comprehensive PRD documenting the fixes This addresses the interface mismatch between Party component and its client wrappers that occurred during the App Router migration.
148 lines
No EOL
3.6 KiB
TypeScript
148 lines
No EOL
3.6 KiB
TypeScript
import { fetchFromApi } from './api-utils';
|
|
|
|
// Server-side data fetching functions
|
|
// Next.js automatically deduplicates requests within the same render
|
|
|
|
// Get teams with optional filters
|
|
export async function getTeams({
|
|
element,
|
|
raid,
|
|
recency,
|
|
page = 1,
|
|
username,
|
|
}: {
|
|
element?: number;
|
|
raid?: string;
|
|
recency?: string;
|
|
page?: number;
|
|
username?: string;
|
|
}) {
|
|
const queryParams: Record<string, string> = {};
|
|
if (element) queryParams.element = element.toString();
|
|
if (raid) queryParams.raid_id = raid;
|
|
if (recency) queryParams.recency = recency;
|
|
if (page) queryParams.page = page.toString();
|
|
|
|
let endpoint = '/parties';
|
|
if (username) {
|
|
endpoint = `/users/${username}/parties`;
|
|
}
|
|
|
|
const queryString = new URLSearchParams(queryParams).toString();
|
|
if (queryString) endpoint += `?${queryString}`;
|
|
|
|
try {
|
|
const data = await fetchFromApi(endpoint);
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch teams', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get a single team by shortcode
|
|
export async function getTeam(shortcode: string) {
|
|
try {
|
|
const data = await fetchFromApi(`/parties/${shortcode}`);
|
|
return data;
|
|
} catch (error) {
|
|
console.error(`Failed to fetch team with shortcode ${shortcode}`, error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get user info
|
|
export async function getUserInfo(username: string) {
|
|
try {
|
|
const data = await fetchFromApi(`/users/info/${username}`);
|
|
return data;
|
|
} catch (error) {
|
|
console.error(`Failed to fetch user info for ${username}`, error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get raid groups
|
|
export async function getRaidGroups() {
|
|
try {
|
|
const data = await fetchFromApi('/raids/groups');
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch raid groups', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get version info
|
|
export async function getVersion() {
|
|
try {
|
|
const data = await fetchFromApi('/version');
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch version info', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get user's favorites/saved teams
|
|
export async function getFavorites() {
|
|
try {
|
|
const data = await fetchFromApi('/parties/favorites');
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch favorites', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get all jobs
|
|
export async function getJobs(element?: number) {
|
|
try {
|
|
const queryParams: Record<string, string> = {};
|
|
if (element) queryParams.element = element.toString();
|
|
|
|
let endpoint = '/jobs';
|
|
const queryString = new URLSearchParams(queryParams).toString();
|
|
if (queryString) endpoint += `?${queryString}`;
|
|
|
|
const data = await fetchFromApi(endpoint);
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch jobs', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get job by ID
|
|
export async function getJob(jobId: string) {
|
|
try {
|
|
const data = await fetchFromApi(`/jobs/${jobId}`);
|
|
return data;
|
|
} catch (error) {
|
|
console.error(`Failed to fetch job with ID ${jobId}`, error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get job skills
|
|
export async function getJobSkills(jobId?: string) {
|
|
try {
|
|
const endpoint = jobId ? `/jobs/${jobId}/skills` : '/jobs/skills';
|
|
const data = await fetchFromApi(endpoint);
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Failed to fetch job skills', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get job accessories
|
|
export async function getJobAccessories(jobId: string) {
|
|
try {
|
|
const data = await fetchFromApi(`/jobs/${jobId}/accessories`);
|
|
return data;
|
|
} catch (error) {
|
|
console.error(`Failed to fetch accessories for job ${jobId}`, error);
|
|
throw error;
|
|
}
|
|
} |