feat: Setup GraphQL with dynamic node routing logic
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
fragment NodePage on Page {
|
||||
title @nonNull
|
||||
}
|
||||
@@ -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>
|
||||
8
wp-content/themes/headless/app/pages/[...uri].gql
Normal file
8
wp-content/themes/headless/app/pages/[...uri].gql
Normal file
@@ -0,0 +1,8 @@
|
||||
query NodeByUri($uri: String!) {
|
||||
nodeByUri(uri: $uri) @nonNull {
|
||||
__typename
|
||||
... on Page {
|
||||
...NodePage
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user