8 Commits

10 changed files with 422 additions and 360 deletions

View File

@@ -1,5 +1,65 @@
# Changelog # Changelog
## v0.1.5
[compare changes](https://gitea.websimple.com/templates/wp-headless/compare/v0.1.4...v0.1.5)
### 🩹 Fixes
- Auth server utils upgrade to latest nuxt-graphql (fd61895)
- Immutable extractNodes (baa3061)
- Type issue with NodePage (3b706c0)
## v0.1.4
[compare changes](https://gitea.websimple.com/templates/wp-headless/compare/v0.1.2...v0.1.4)
### 🚀 Enhancements
- Initial NodeByUri logic and frontend (688c4e3)
- BuilderSections component (2b9a875)
- LaoutContained (c7f6cca)
- LayoutContained section wrapper (12048ff)
- Initial typography / prose styles (764bc6a)
- UiProse prose component with link highjacking (40becf1)
- TinyMCE WYSIWYG editor styles (8e26f19)
- Login / logout toast (2d0b176)
- Hide title on front page (5e0df22)
### 🩹 Fixes
- Fatal 404 (bfb5ae3)
### 💅 Refactors
- Update to nuxt-graphql 0.5.x (e383255)
- /api/login route (9d99770)
## v0.1.3
[compare changes](https://gitea.websimple.com/templates/wp-headless/compare/v0.1.2...v0.1.3)
### 🚀 Enhancements
- Initial NodeByUri logic and frontend (688c4e3)
- BuilderSections component (2b9a875)
- LaoutContained (c7f6cca)
- LayoutContained section wrapper (12048ff)
- Initial typography / prose styles (764bc6a)
- UiProse prose component with link highjacking (40becf1)
- TinyMCE WYSIWYG editor styles (8e26f19)
- Login / logout toast (2d0b176)
- Hide title on front page (5e0df22)
### 🩹 Fixes
- Fatal 404 (bfb5ae3)
### 💅 Refactors
- Update to nuxt-graphql 0.5.x (e383255)
- /api/login route (9d99770)
## v0.1.2 ## v0.1.2
[compare changes](https://gitea.websimple.com/templates/wp-headless/compare/v0.1.1...v0.1.2) [compare changes](https://gitea.websimple.com/templates/wp-headless/compare/v0.1.1...v0.1.2)

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { BuilderSectionsFragment } from "#graphql/fragments"; import type { BuilderSectionsFragment } from "#graphql/operations";
const props = defineProps<BuilderSectionsFragment>(); const props = defineProps<BuilderSectionsFragment>();
const sections = computed(() => { const sections = computed(() => {

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { LayoutContainedFragment } from "#graphql/fragments"; import type { LayoutContainedFragment } from "#graphql/operations";
import { tv, type VariantProps } from "tailwind-variants"; import { tv, type VariantProps } from "tailwind-variants";
const props = defineProps<LayoutContainedFragment>(); const props = defineProps<LayoutContainedFragment>();

View File

@@ -1,5 +1,6 @@
fragment NodePage on Page { fragment NodePage on Page {
title title
isFrontPage
groupPostPage { groupPostPage {
... BuilderSections ... BuilderSections
} }

View File

@@ -1,14 +1,14 @@
<script setup lang="ts"> <script setup lang="ts">
import type { NodePageFragment } from "#graphql/fragments"; import type { NodePageFragment } from "#graphql/operations";
defineProps<NodePageFragment>(); defineProps<NodePageFragment>();
</script> </script>
<template> <template>
<div id="node-page"> <div id="node-page">
<h1 class="font-bold text-4xl"> <h1 v-if="!isFrontPage" class="font-bold text-4xl">
{{ title }} {{ title }}
</h1> </h1>
<BuilderSections v-bind="groupPostPage" /> <BuilderSections :sections="groupPostPage?.sections || []" />
</div> </div>
</template> </template>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { SectionTextBlockFragment } from "#graphql/fragments"; import type { SectionTextBlockFragment } from "#graphql/operations";
defineProps<SectionTextBlockFragment>(); defineProps<SectionTextBlockFragment>();
</script> </script>

View File

@@ -1,7 +1,7 @@
{ {
"name": "@lewebsimple/moonshine", "name": "@lewebsimple/moonshine",
"description": "Headless WordPress theme based on Nuxt.", "description": "Headless WordPress theme based on Nuxt.",
"version": "0.1.2", "version": "0.1.5",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -12,12 +12,12 @@
"postinstall": "pnpm --sequential /postinstall:.*/", "postinstall": "pnpm --sequential /postinstall:.*/",
"postinstall:nuxt": "nuxt prepare", "postinstall:nuxt": "nuxt prepare",
"preview": "nuxt preview", "preview": "nuxt preview",
"release": "pnpm lint && pnpm typecheck && changelogen --noAuthors --release --push", "release": "pnpm lint && changelogen --noAuthors --release --push",
"typecheck": "nuxt typecheck" "typecheck": "nuxt typecheck"
}, },
"dependencies": { "dependencies": {
"@iconify-json/lucide": "^1.2.86", "@iconify-json/lucide": "^1.2.86",
"@lewebsimple/nuxt-graphql": "^0.5.2", "@lewebsimple/nuxt-graphql": "^0.5.10",
"@nuxt/ui": "4.3.0", "@nuxt/ui": "4.3.0",
"@nuxtjs/seo": "^3.3.0", "@nuxtjs/seo": "^3.3.0",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
@@ -46,4 +46,4 @@
"chore": false "chore": false
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -2,15 +2,15 @@ import type { H3Event } from "h3";
import { GraphQLClient } from "graphql-request"; import { GraphQLClient } from "graphql-request";
import { jwtDecode } from "jwt-decode"; import { jwtDecode } from "jwt-decode";
import type { User } from "#auth-utils"; import type { User } from "#auth-utils";
import type { AuthUserFragment } from "#graphql/fragments"; import type { AuthUserFragment, AuthLoginMutationResult } from "#graphql/operations";
import { AuthRefreshTokenDocument, type AuthLoginResult } from "#graphql/operations"; import { AuthRefreshTokenDocument } from "#graphql/operations";
// Handle login result and store user session // Handle login result and store user session
export async function handleLogin(event: H3Event, loginData: AuthLoginResult) { export async function handleLogin(event: H3Event, loginResult: AuthLoginMutationResult) {
if (!loginData?.login) { if (!loginResult?.login) {
return false; return false;
} }
const { user, authToken, refreshToken } = loginData.login; const { user, authToken, refreshToken } = loginResult.login;
if (!user || !authToken || !refreshToken) { if (!user || !authToken || !refreshToken) {
return false; return false;
} }

View File

@@ -1,4 +1,4 @@
// Helper: Extracts nodes from a GraphQL connection object, returning an empty array if nodes are absent. // Helper: Extracts nodes from a GraphQL connection object, returning an empty array if nodes are absent.
export function extractNodes<T>(connection: { nodes?: T[] } | null | undefined): T[] { export function extractNodes<T>(connection: { nodes?: readonly T[] } | null | undefined): readonly T[] {
return connection?.nodes || [] as T[]; return connection?.nodes ?? [];
} }