reactjs - Hvordan tilpasse forhåndsvisningsmodus i Sanity Studio med Nextjs


Jeg har problemer med å vise forhåndsvisningsmodus fordi URL-en må inneholde noen få parametere som "category" og "slug". (eksempel i bildet mitt nedenfor).

Dette er feilen URL med udefinert parameter

Så, jeg får ikke parameteren for URL-en min

Dette er koden min

// structure.ts

interface Doc extends SanityDocument {
  slug: { current: any };
  categories: {
    title: string;
    description: string;
  };
}

function getPreviewUrl(doc: Doc) {
  return doc?.slug?.current
    ? `${process.env.NEXT_PUBLIC_VERCEL_URL || window.location.host}/articles/${
        doc.categories.title
      }/${doc.slug.current}`
    : `${process.env.NEXT_PUBLIC_VERCEL_URL || window.location.host}`;
}

export const defaultDocumentNode = (
  S,
  { schemaType },
) => {
  switch (schemaType) {
    case `article`:
      return 
        S.view
          .component(Iframe)
          .options({
            url: (doc: Doc) => getPreviewUrl(doc)
          })
      ]);

    default:
      return S.document().views([S.view.form()]);
  }
};

i koden min ovenfor har jeg implementert en tilpasset komponent for forhåndsvisningsmodus ved å bruke Iframe, og satt alternativet til å få getPreviewUrl, men doc-verdien i denne koden 'url: (doc: Doc) => getPreviewUrl(doc)', returnerer bare standard skjemastrukturdata som inneholder referanser, spesielt for kategoridataene. Så i dette tilfellet vil jeg hente data fra kategoriskjemaet via referanse fra artikkelskjemet mitt, slik at jeg kan bruke dataene i getPreviewUrl-funksjonen.

Dette er for artikkelskjemaet

{
  "author": {
    "_ref": "31c9cd97-6fc3-45d2-a13b-d0dbfa3e4681",
    "_type": "reference"
},
"categories": [
    {
        "_key": "111749138b41",
        "_ref": "581dfb13-ab8c-4da9-8a29-1e052f6ceb76",
        "_type": "reference"
    }
],
"description": "This is the first ever article on my platform!",
"slug": {
    "_type": "slug",
    "current": "my-first-article"
},
"title": "My First Article"

}

dette er mine kategoriskjema strukturddata

category : [ { _id : string, title : string } ]

Hvordan kan jeg hente data fra kategoriskjemaet ved referanse fra artikkelskjemaet mitt? Jeg har lest dokumentasjonen på sanity.io, men har fortsatt ikke fått det til.

Takk for hjelpen!

Svar #1

Jeg har løst problemet mitt ved å endre koden min slik:

import Iframe from 'sanity-plugin-iframe-pane';
import { DefaultDocumentNodeResolver } from 'sanity/desk';
import { SanityDocument } from 'sanity';
import { client } from './lib/sanity.client';

interface Doc extends SanityDocument {
  slug: { current: any };
}

async function getPreviewUrl(doc: Doc) {
  const query = `*[_type == 'article' && _id == $id] {
     categories[0] -> {
       title
     }
 }`;
  const [{ categories }] = await client.fetch(query, { id: doc._id });
  return doc?.slug?.current && categories
    ? `${
        process.env.NEXT_PUBLIC_VERCEL_URL ||
        window.location.protocol + '//' + window.location.host
      }/articles/${categories?.title}/${doc.slug.current}`
    : `${process.env.NEXT_PUBLIC_VERCEL_URL || window.location.host}`;
}

export const defaultDocumentNode: DefaultDocumentNodeResolver = (
  S,
  { schemaType },
) => {
  switch (schemaType) {
    case `article`:
      return S.document().views([
        S.view.form(),
        S.view
          .component(Iframe)
          .options({
            url: (doc: Doc) => getPreviewUrl(doc),
            defaultSize: 'desktop',
            reload: { button: true },
            attributes: {},
          })

          .title('Preview'),
      ]);

    default:
      return S.document().views([S.view.form()]);
  }
};

kanskje en annen bedre løsning for mitt tilfelle?