generated from pascalmartineau/wp-skeleton
65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
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 });
|
|
}
|
|
}
|