The next-tinacms-json package provides helpers to make local JSON content editable. This package is intended to be used with a Git-based workflow.
yarn add next-tinacms-jsonuseJsonForm( jsonFile, options? ):[values, form]: A React Hook that creates a Git formjsonForm( Component, options? ): Component: An HOC that creates and registers a Git formuseLocalJsonForm(deprecated)useGlobalJsonForm(deprecated)const [data, form] = useJsonForm(jsonFile, formOptions)As the first argument, this hook expects an object matching the following interface:
// A datastructure representing a JSON file stored in Git
interface JsonFile<T = any> {
fileRelativePath: string
data: T
}As with other Tina form helpers, this hook also accepts a second, optional argument — a form configuration object.
/pages/index.js
import * as React from 'react'
import { usePlugin } from 'tinacms'
import { useJsonForm } from 'next-tinacms-json'
export default function Index({ jsonFile }) {
// Create the Form
const [post, form] = useJsonForm(jsonFile)
// Register it with the CMS
usePlugin(form)
return <h1>{post.title}</h1>
}
export async function getStaticProps() {
const content = await import(`../../content/index.json`)
return {
props: {
jsonFile: {
fileRelativePath: `/content/index.json`,
data: content.default,
},
},
}
}jsonForm accepts two arguments: a component and an optional form configuration object. The component being passed is expected to receive data as props that matches the jsonFile interface outlined below.
// A datastructure representing a JSON file stored in Git
interface JsonFile<T = any> {
fileRelativePath: string
data: T
}jsonForm returns the original component connected with a new JSON form registered with Tina. Below is the same example from useJsonForm, but refactored to use the jsonForm HOC.
/pages/index.js
/**
* 1. import jsonForm
*/
import { jsonForm } from 'next-tinacms-json'
import * as React from 'react'
function Index(props) {
const post = props.jsonFile
return (
<>
<h1>{post.title}</h1>
</>
)
}
/**
* 2. Wrap and export the Page component with jsonForm
*/
export default jsonForm(Page)
export async function getStaticProps() {
const content = await import(`../../posts/index.json`)
return {
props: {
/**
* 3. Make sure your return object matches this shape
*/
jsonFile: {
fileRelativePath: `/posts/index.json`,
data: content.default,
},
},
}
}