From 4139e286834c385e4de60d46784a6e30cd3b5549 Mon Sep 17 00:00:00 2001 From: Cody Olsen Date: Thu, 29 Jun 2023 02:14:31 +0200 Subject: [PATCH] feat: use `perspective` features (#389) Co-authored-by: Martin Jacobsen <174970+mmgj@users.noreply.github.com> --- MIGRATION.md | 12 +++ .../app/DraftModeButton.tsx | 14 +++ .../app/PreviewProvider.tsx | 4 +- .../app/RefreshButton.tsx | 32 +++++-- .../ViewPublishedButtonWithLoadingStatus.tsx | 11 --- .../next-app-router-groq-store/app/actions.ts | 7 ++ .../app/api/disable-draft/route.ts | 8 ++ .../app/api/draft/route.ts | 14 +-- apps/next-app-router-groq-store/app/page.tsx | 59 ++++++------ .../app/sanity.client.ts | 24 ++--- .../app/sanity.env.ts | 7 -- .../next.config.mjs | 9 ++ .../app/DraftModeButton.tsx | 14 +++ .../app/PreviewFooter.tsx | 4 +- .../app/PreviewProvider.tsx | 13 +-- .../app/PreviewTable.tsx | 4 +- .../app/RefreshButton.tsx | 32 +++++-- .../ViewPublishedButtonWithLoadingStatus.tsx | 11 --- .../next-app-router-live-store/app/actions.ts | 7 ++ .../app/api/disable-draft/route.ts | 8 ++ .../app/api/draft/route.ts | 14 +-- apps/next-app-router-live-store/app/page.tsx | 69 ++++++-------- .../app/sanity.client.ts | 49 ++++++---- .../app/sanity.env.ts | 5 - .../next.config.mjs | 9 ++ .../app/DraftModeButton.tsx | 14 +++ .../app/RefreshButton.tsx | 32 +++++-- .../ViewPublishedButtonWithLoadingStatus.tsx | 11 --- apps/next-app-router-no-store/app/actions.ts | 7 ++ .../app/api/disable-draft/route.ts | 8 ++ .../app/api/draft/route.ts | 14 +-- apps/next-app-router-no-store/app/page.tsx | 58 ++++++------ .../app/sanity.client.ts | 50 +++++----- .../app/sanity.env.ts | 5 - apps/next-app-router-no-store/next.config.mjs | 9 ++ apps/next-app-router/app/DraftModeButton.tsx | 14 +++ apps/next-app-router/app/RefreshButton.tsx | 30 ++++-- apps/next-app-router/app/actions.ts | 7 ++ .../app/api/disable-draft/route.ts | 8 ++ apps/next-app-router/app/api/draft/route.ts | 14 +-- apps/next-app-router/app/page.tsx | 30 +++--- apps/next-app-router/app/sanity.client.ts | 52 +++++----- apps/next-app-router/next.config.mjs | 9 ++ .../src/Footer.tsx | 4 +- .../src/PreviewProvider.tsx | 17 ++-- .../src/Table.tsx | 4 +- .../src/pages/api/disable-draft.ts} | 2 +- .../src/pages/api/{preview.ts => draft.ts} | 2 +- .../src/pages/index.tsx | 94 ++++++++----------- .../src/sanity.client.ts | 35 +++++-- .../src/sanity.env.ts | 5 - .../src/Footer.tsx | 4 +- .../src/PreviewProvider.tsx | 13 +-- .../src/Table.tsx | 4 +- .../api/{exit-preview.ts => disable-draft.ts} | 2 +- .../src/pages/api/draft.ts} | 2 +- .../src/pages/index.tsx | 88 ++++++++--------- .../src/sanity.client.ts | 48 ++++++---- .../src/sanity.env.ts | 5 - .../src/pages/api/disable-draft.ts} | 2 +- .../src/pages/api/draft.ts} | 2 +- apps/next-pages-router/src/pages/index.tsx | 66 ++++++------- apps/next-pages-router/src/sanity.client.ts | 34 +++++-- apps/remix-groq-store-lazy/app/Footer.tsx | 4 +- .../app/PreviewProvider.tsx | 23 ++--- apps/remix-groq-store-lazy/app/Table.tsx | 4 +- apps/remix-groq-store-lazy/app/getClient.tsx | 29 ++++++ .../app/routes/index.tsx | 53 ++--------- apps/remix-groq-store-lazy/tsconfig.json | 2 +- apps/remix-groq-store/app/Footer.tsx | 4 +- apps/remix-groq-store/app/PreviewProvider.tsx | 23 ++--- apps/remix-groq-store/app/Table.tsx | 4 +- apps/remix-groq-store/app/getClient.tsx | 29 ++++++ apps/remix-groq-store/app/routes/index.tsx | 77 +++++---------- apps/remix-live-store-lazy/app/Footer.tsx | 4 +- .../app/PreviewProvider.tsx | 21 ++--- apps/remix-live-store-lazy/app/Table.tsx | 4 +- apps/remix-live-store-lazy/app/getClient.tsx | 33 +++++++ .../app/routes/index.tsx | 49 ++-------- apps/remix-live-store-lazy/app/utils.ts | 39 -------- apps/remix-live-store/app/Footer.tsx | 4 +- apps/remix-live-store/app/PreviewProvider.tsx | 21 ++--- apps/remix-live-store/app/Table.tsx | 4 +- apps/remix-live-store/app/getClient.tsx | 33 +++++++ apps/remix-live-store/app/routes/index.tsx | 71 +++++--------- apps/remix-live-store/app/utils.ts | 39 -------- apps/remix/app/routes/index.tsx | 57 ++++++----- packages/preview-kit/README.md | 58 +++++++++++- .../preview-kit/src/LiveQueryProvider.tsx | 57 +++++------ .../preview-kit/src/client/createClient.ts | 4 +- packages/preview-kit/src/client/request.ts | 15 +-- packages/preview-kit/src/client/sourcemap.ts | 4 +- packages/preview-kit/src/client/transcode.ts | 3 +- packages/preview-kit/src/client/types.ts | 8 +- packages/ui/src/react/components.tsx | 2 +- 95 files changed, 1043 insertions(+), 984 deletions(-) create mode 100644 apps/next-app-router-groq-store/app/DraftModeButton.tsx delete mode 100644 apps/next-app-router-groq-store/app/ViewPublishedButtonWithLoadingStatus.tsx create mode 100644 apps/next-app-router-groq-store/app/actions.ts create mode 100644 apps/next-app-router-groq-store/app/api/disable-draft/route.ts delete mode 100644 apps/next-app-router-groq-store/app/sanity.env.ts create mode 100644 apps/next-app-router-groq-store/next.config.mjs create mode 100644 apps/next-app-router-live-store/app/DraftModeButton.tsx delete mode 100644 apps/next-app-router-live-store/app/ViewPublishedButtonWithLoadingStatus.tsx create mode 100644 apps/next-app-router-live-store/app/actions.ts create mode 100644 apps/next-app-router-live-store/app/api/disable-draft/route.ts delete mode 100644 apps/next-app-router-live-store/app/sanity.env.ts create mode 100644 apps/next-app-router-live-store/next.config.mjs create mode 100644 apps/next-app-router-no-store/app/DraftModeButton.tsx delete mode 100644 apps/next-app-router-no-store/app/ViewPublishedButtonWithLoadingStatus.tsx create mode 100644 apps/next-app-router-no-store/app/actions.ts create mode 100644 apps/next-app-router-no-store/app/api/disable-draft/route.ts delete mode 100644 apps/next-app-router-no-store/app/sanity.env.ts create mode 100644 apps/next-app-router-no-store/next.config.mjs create mode 100644 apps/next-app-router/app/DraftModeButton.tsx create mode 100644 apps/next-app-router/app/actions.ts create mode 100644 apps/next-app-router/app/api/disable-draft/route.ts create mode 100644 apps/next-app-router/next.config.mjs rename apps/{next-pages-router/src/pages/api/exit-preview.ts => next-pages-router-groq-store/src/pages/api/disable-draft.ts} (84%) rename apps/next-pages-router-groq-store/src/pages/api/{preview.ts => draft.ts} (84%) delete mode 100644 apps/next-pages-router-groq-store/src/sanity.env.ts rename apps/next-pages-router-live-store/src/pages/api/{exit-preview.ts => disable-draft.ts} (84%) rename apps/{next-pages-router/src/pages/api/preview.ts => next-pages-router-live-store/src/pages/api/draft.ts} (84%) delete mode 100644 apps/next-pages-router-live-store/src/sanity.env.ts rename apps/{next-pages-router-groq-store/src/pages/api/exit-preview.ts => next-pages-router/src/pages/api/disable-draft.ts} (84%) rename apps/{next-pages-router-live-store/src/pages/api/preview.ts => next-pages-router/src/pages/api/draft.ts} (84%) create mode 100644 apps/remix-groq-store-lazy/app/getClient.tsx create mode 100644 apps/remix-groq-store/app/getClient.tsx create mode 100644 apps/remix-live-store-lazy/app/getClient.tsx delete mode 100644 apps/remix-live-store-lazy/app/utils.ts create mode 100644 apps/remix-live-store/app/getClient.tsx delete mode 100644 apps/remix-live-store/app/utils.ts diff --git a/MIGRATION.md b/MIGRATION.md index 85d8366c..55c93813 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -72,6 +72,10 @@ export interface LiveQueryProviderProps { /** @defaultValue true */ listen?: boolean } + /** @defaultValue 10000 */ + refreshInterval?: number + /** @defaultValue true */ + turboSourceMap?: boolean } export function LiveQueryProvider( @@ -112,6 +116,7 @@ export function getClient({ dataset, apiVersion: '2023-06-20', useCdn: true, + perspective: 'published', }) if (preview) { if (!preview.token) { @@ -121,6 +126,7 @@ export function getClient({ token: preview.token, useCdn: false, ignoreBrowserTokenWarning: true, + perspective: 'previewDrafts', }) } return client @@ -192,6 +198,7 @@ export function getClient({ dataset, apiVersion: '2023-06-20', useCdn: true, + perspective: 'published', }) if (preview) { if (!preview.token) { @@ -201,6 +208,7 @@ export function getClient({ token: preview.token, useCdn: false, ignoreBrowserTokenWarning: true, + perspective: 'previewDrafts', }) } return client @@ -281,6 +289,7 @@ export function getClient({ dataset, apiVersion: '2023-06-20', useCdn: true, + perspective: 'published', }) if (preview) { if (!preview.token) { @@ -290,6 +299,7 @@ export function getClient({ token: preview.token, useCdn: false, ignoreBrowserTokenWarning: true, + perspective: 'previewDrafts', }) } return client @@ -360,6 +370,7 @@ export function getClient({ dataset, apiVersion: '2023-06-20', useCdn: true, + perspective: 'published', }) if (preview) { if (!preview.token) { @@ -369,6 +380,7 @@ export function getClient({ token: preview.token, useCdn: false, ignoreBrowserTokenWarning: true, + perspective: 'previewDrafts', }) } return client diff --git a/apps/next-app-router-groq-store/app/DraftModeButton.tsx b/apps/next-app-router-groq-store/app/DraftModeButton.tsx new file mode 100644 index 00000000..54c7aed6 --- /dev/null +++ b/apps/next-app-router-groq-store/app/DraftModeButton.tsx @@ -0,0 +1,14 @@ +import { draftMode } from 'next/headers' +import { PreviewDraftsButton, ViewPublishedButton } from 'ui/react' + +export default function DraftModeButton() { + return ( +
+ {draftMode().isEnabled ? ( + + ) : ( + + )} + + ) +} diff --git a/apps/next-app-router-groq-store/app/PreviewProvider.tsx b/apps/next-app-router-groq-store/app/PreviewProvider.tsx index 451eb08c..a84b95a8 100644 --- a/apps/next-app-router-groq-store/app/PreviewProvider.tsx +++ b/apps/next-app-router-groq-store/app/PreviewProvider.tsx @@ -11,12 +11,12 @@ export default function PreviewProvider({ children: React.ReactNode token: string }) { - const client = useMemo(() => getClient({ preview: true, token }), [token]) + const client = useMemo(() => getClient({ token }), [token]) return ( {children} diff --git a/apps/next-app-router-groq-store/app/RefreshButton.tsx b/apps/next-app-router-groq-store/app/RefreshButton.tsx index 7d5d2776..60159cfb 100644 --- a/apps/next-app-router-groq-store/app/RefreshButton.tsx +++ b/apps/next-app-router-groq-store/app/RefreshButton.tsx @@ -1,20 +1,32 @@ 'use client' -import { Button } from 'ui/react' +import { useListeningQueryStatus } from '@sanity/preview-kit' import { useRouter } from 'next/navigation' +import { useEffect, useTransition } from 'react' +import { experimental_useFormStatus as useFormStatus } from 'react-dom' +import { Button, tableQuery } from 'ui/react' +import { revalidate } from './actions' -export default function RefreshButton() { +function useRefresh() { + const { pending } = useFormStatus() const router = useRouter() + const [loading, startTransition] = useTransition() + const status = useListeningQueryStatus(tableQuery) + useEffect(() => { + if (!pending) { + startTransition(() => router.refresh()) + } + }, [pending, router]) + + return pending || loading || status === 'loading' +} + +export default function RefreshButton() { + const loading = useRefresh() return ( -
{ - event.preventDefault() - router.refresh() - }} - > - + +
) } diff --git a/apps/next-app-router-groq-store/app/ViewPublishedButtonWithLoadingStatus.tsx b/apps/next-app-router-groq-store/app/ViewPublishedButtonWithLoadingStatus.tsx deleted file mode 100644 index 8f798a09..00000000 --- a/apps/next-app-router-groq-store/app/ViewPublishedButtonWithLoadingStatus.tsx +++ /dev/null @@ -1,11 +0,0 @@ -'use client' - -import { tableQuery } from 'ui/react' -import { ViewPublishedButton } from 'ui/react' -import { useListeningQueryStatus } from '@sanity/preview-kit' - -export default function ViewPublishedButtonWithLoadingStatus() { - const status = useListeningQueryStatus(tableQuery) - - return -} diff --git a/apps/next-app-router-groq-store/app/actions.ts b/apps/next-app-router-groq-store/app/actions.ts new file mode 100644 index 00000000..a678db66 --- /dev/null +++ b/apps/next-app-router-groq-store/app/actions.ts @@ -0,0 +1,7 @@ +'use server' + +import { revalidatePath } from 'next/cache' + +export async function revalidate() { + await revalidatePath('/') +} diff --git a/apps/next-app-router-groq-store/app/api/disable-draft/route.ts b/apps/next-app-router-groq-store/app/api/disable-draft/route.ts new file mode 100644 index 00000000..389033f7 --- /dev/null +++ b/apps/next-app-router-groq-store/app/api/disable-draft/route.ts @@ -0,0 +1,8 @@ +import { redirect } from 'next/navigation' + +import { draftMode } from 'next/headers' + +export async function GET(request: Request) { + draftMode().disable() + redirect('/') +} diff --git a/apps/next-app-router-groq-store/app/api/draft/route.ts b/apps/next-app-router-groq-store/app/api/draft/route.ts index 67c940b9..f2ba7797 100644 --- a/apps/next-app-router-groq-store/app/api/draft/route.ts +++ b/apps/next-app-router-groq-store/app/api/draft/route.ts @@ -1,12 +1,8 @@ +import { redirect } from 'next/navigation' + import { draftMode } from 'next/headers' -import { NextRequest, NextResponse } from 'next/server' -export function GET(req: NextRequest) { - if (draftMode().isEnabled) { - draftMode().disable() - } else { - draftMode().enable() - } - const url = new URL(req.nextUrl) - return NextResponse.redirect(new URL('/', url.origin)) +export async function GET(request: Request) { + draftMode().enable() + redirect('/') } diff --git a/apps/next-app-router-groq-store/app/page.tsx b/apps/next-app-router-groq-store/app/page.tsx index 23cf8f7a..d0b0a566 100644 --- a/apps/next-app-router-groq-store/app/page.tsx +++ b/apps/next-app-router-groq-store/app/page.tsx @@ -1,42 +1,37 @@ -import { draftMode } from 'next/headers' -import { PreviewDraftsButton, Footer, footerQuery } from 'ui/react' -import RefreshButton from './RefreshButton' import { unstable__adapter, unstable__environment } from '@sanity/client' -import { Table, Timestamp, tableQuery } from 'ui/react' -import { getClient } from './sanity.client' +import { draftMode } from 'next/headers' +import { Footer, Table, Timestamp, footerQuery, tableQuery } from 'ui/react' +import DraftModeButton from './DraftModeButton' +import PreviewFooter from './PreviewFooter' import PreviewProvider from './PreviewProvider' import PreviewTable from './PreviewTable' -import PreviewFooter from './PreviewFooter' -import ViewPublishedButtonWithLoadingStatus from './ViewPublishedButtonWithLoadingStatus' +import RefreshButton from './RefreshButton' +import { getClient } from './sanity.client' export default async function Page() { - const isDraftMode = draftMode().isEnabled - const button = isDraftMode ? ( - - ) : ( - - ) - const client = getClient({ preview: isDraftMode }) - const table = client.fetch(tableQuery) - const footer = client.fetch(footerQuery) + const token = process.env.SANITY_API_READ_TOKEN! + const preview = draftMode().isEnabled ? { token } : undefined + const client = getClient(preview) + const [table, footer] = await Promise.all([ + client.fetch(tableQuery), + client.fetch(footerQuery), + ]) return ( <> -
- {isDraftMode ? ( - - {button} - - - - ) : ( - <> - {button} - -
- - )} - - + {preview ? ( + + + + + + ) : ( + <> + +
+
+ + )} +