import type { ThePageFragment, TheArticleFragment, TheEventFragment, TheLocationFragment, TheMembershipFragment, TheProjectFragment, TheResourceFragment } from "#graphql-operations"; import { ThePage, TheArticle, TheEvent, TheLocation, TheMembership, TheProject, TheResource } from "#components"; export async function useNodeByUri(uri: string) { const { data, error } = await useAsyncGraphqlQuery("nodeByUri", { uri }, { graphqlCaching: { client: true } }); if (error.value) { throw createError({ statusCode: 500, statusMessage: "Erreur interne", message: error.value.message }); } if (!data.value) { throw createError({ statusCode: 500, statusMessage: "Erreur interne", message: "La page n'a retourné aucunes données." }); } if (data.value.errors.length) { throw createError({ statusCode: 500, statusMessage: "Erreur interne", message: data.value.errors.map((error) => error.message).join("\n") }); } const node = data.value?.data.nodeByUri; const breadcrumbs = node?.breadcrumbs?.map(({ label, to }) => ({ label, to: to || undefined })) || []; switch (node?.__typename) { 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 "Page": return { component: ThePage, node: node as ThePageFragment, breadcrumbs }; case "Post": return { component: TheArticle, node: node as TheArticleFragment, 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, statusMessage: "Page non trouvée", message: "La page que vous cherchez n'existe pas." }); } }