ordinarthur 9d172a4422 init
2026-04-05 12:11:46 +02:00

89 lines
2.5 KiB
TypeScript

import { createClient } from '@sanity/client';
import imageUrlBuilder from '@sanity/image-url';
import type { SanityImageSource } from '@sanity/image-url/lib/types/types';
export const sanityClient = createClient({
projectId: import.meta.env.PUBLIC_SANITY_PROJECT_ID || 'your-project-id',
dataset: import.meta.env.PUBLIC_SANITY_DATASET || 'production',
apiVersion: '2024-01-01',
useCdn: true,
});
const builder = imageUrlBuilder(sanityClient);
export function urlFor(source: SanityImageSource) {
return builder.image(source);
}
// --- Types ---
export interface Project {
_id: string;
title: string;
slug: { current: string };
category: 'perenne' | 'event';
client: string;
date: string;
location?: string;
description: string;
heroImage: SanityImageSource & { alt?: string };
gallery: Array<SanityImageSource & {
alt?: string;
size?: 'small' | 'medium' | 'large';
}>;
tags?: string[];
featured?: boolean;
order?: number;
}
export interface ProcessStep {
_id: string;
title: string;
stepNumber: number;
subtitle: string;
description: any; // Block content
icon?: SanityImageSource;
gallery?: Array<SanityImageSource & { alt?: string; caption?: string }>;
duration?: string;
}
// --- Queries ---
export async function getProjects(category?: 'perenne' | 'event'): Promise<Project[]> {
const filter = category
? `*[_type == "project" && category == "${category}"]`
: `*[_type == "project"]`;
return sanityClient.fetch(`${filter} | order(order asc, date desc) {
_id, title, slug, category, client, date, location, description,
heroImage { ..., alt },
gallery[] { ..., alt, size },
tags, featured, order
}`);
}
export async function getProjectBySlug(slug: string): Promise<Project | null> {
return sanityClient.fetch(
`*[_type == "project" && slug.current == $slug][0] {
_id, title, slug, category, client, date, location, description,
heroImage { ..., alt },
gallery[] { ..., alt, size },
tags, featured, order
}`,
{ slug }
);
}
export async function getProcessSteps(): Promise<ProcessStep[]> {
return sanityClient.fetch(`*[_type == "processStep"] | order(stepNumber asc) {
_id, title, stepNumber, subtitle, description, icon, duration,
gallery[] { ..., alt, caption }
}`);
}
export async function getFeaturedProjects(): Promise<Project[]> {
return sanityClient.fetch(`*[_type == "project" && featured == true] | order(order asc) {
_id, title, slug, category, client, date,
heroImage { ..., alt },
description, tags
}`);
}