import type { ThePageFragment, TheArticleFragment, TheEventFragment, TheLocationFragment, TheMembershipFragment, TheProjectFragment, TheResourceFragment, } from "#graphql-operations"; import { ThePage, TheArticle, TheEvent, TheLocation, TheMembership, TheProject, TheResource, } from "#components"; interface BreadcrumbItem { label: string; to?: string; } export async function useNodeByUri() { const route = useRoute(); const uri = computed(() => route.path); const { data } = await useAsyncGraphqlQuery("nodeByUri", { uri: uri.value }, { graphqlCaching: { client: true } }); if (data.value?.errors?.length) { throw createError({ statusCode: 500, message: "Erreur lors de la récupération du contenu", fatal: true }); } const node = data.value?.data.nodeByUri; const breadcrumbs: BreadcrumbItem[] = []; if (node?.breadcrumbs) { breadcrumbs.push( ...node.breadcrumbs .filter((item: any) => item.label) .map((item: any) => ({ label: item.label, to: item.uri || undefined, })), ); } switch (node?.__typename) { case "Page": return { component: ThePage, node: node as ThePageFragment, breadcrumbs }; case "Post": return { component: TheArticle, node: node as TheArticleFragment, breadcrumbs }; case "Event": return { component: TheEvent, node: node as TheEventFragment, breadcrumbs }; case "Location": return { component: TheLocation, node: node as TheLocationFragment, breadcrumbs }; case "Membership": return { component: TheMembership, node: node as TheMembershipFragment, breadcrumbs }; case "Project": return { component: TheProject, node: node as TheProjectFragment, breadcrumbs }; case "Resource": return { component: TheResource, node: node as TheResourceFragment, breadcrumbs }; default: throw createError({ statusCode: 404, message: "Page non trouvée", fatal: true }); } }