feat: Setup GraphQL with dynamic node routing logic

This commit is contained in:
2026-03-18 23:21:05 -04:00
parent 1838d59382
commit 3b72a16f86
9 changed files with 1291 additions and 73 deletions

View File

@@ -0,0 +1,3 @@
fragment NodePage on Page {
title @nonNull
}

View File

@@ -0,0 +1,8 @@
<script setup lang="ts">
import type { NodePageFragment } from "#graphql/types";
defineProps<{ node: NodePageFragment }>();
</script>
<template>
<div id="node-page">{{ node.title }}</div>
</template>

View File

@@ -0,0 +1,8 @@
query NodeByUri($uri: String!) {
nodeByUri(uri: $uri) @nonNull {
__typename
... on Page {
...NodePage
}
}
}

View File

@@ -1,5 +1,39 @@
<script setup lang="ts">
// Fetch node by URI and handle query errors
const { path: uri } = useRoute();
const { data: node, error } = await useAsyncGraphQLQuery(
"NodeByUri",
{ uri },
{
transform: ({ nodeByUri }) => nodeByUri,
},
);
// Handle errors and missing nodes
if (!node.value) {
console.error("NodeByUri query error:", error.value);
throw createError({
statusCode: 404,
message: `La page demandée est introuvable: ${uri}`,
fatal: true,
});
}
// Dynamically resolve component based on node type
const componentName = `Node${node.value.__typename}`;
if (!useNuxtApp().vueApp.component(componentName)) {
throw createError({
statusCode: 404,
message: `La page demandée ne peut pas être affichée correctement: ${componentName}`,
fatal: true,
});
}
</script>
<template>
<div id="page-node-from-uri">
<PageHeader title="TODO" />
<Component :is="componentName" :node="node" />
</div>
</template>