forked from tinacms/tina-starter-alpaca
-
Notifications
You must be signed in to change notification settings - Fork 0
/
useCreateMainDoc.js
119 lines (112 loc) · 3.56 KB
/
useCreateMainDoc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { useCMS, usePlugins } from "tinacms"
import { useRouter } from "next/router"
import slugify from "slugify"
import { FORM_ERROR } from "final-form"
import { toMarkdownString, flatDocs, getRandID } from "@utils"
const useCreateMainDoc = (allDocs) => {
const router = useRouter()
const cms = useCMS()
usePlugins([
{
__type: "content-creator",
name: "Create Main Doc Page",
fields: [
{
name: "title",
label: "Title",
component: "text",
required: true,
validate(value, allValues, meta, field) {
if (!value) {
return "A title is required"
}
const valSlug = `${slugify(value, { lower: true })}`
// make sure slug is unique
const slugMatches = (el) => {
return el.slug === valSlug
}
// some function reference can be found here
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some
const validTitle = !flatDocs(allDocs).some(slugMatches)
if (!validTitle) return "titles must be unique, maybe add a number to the end?"
},
},
],
onSubmit: async ({ title }) => {
const slug = slugify(title, { lower: true })
// get json file from github
const github = cms.api.github
// this is getting the defult branch and not the current working branch
const configFile = await github.fetchFile("docs/config.json", true)
const sha = configFile.sha
const allNestedDocsRemote = JSON.parse(configFile.content)
const fileRelativePath = `docs/${slug}.md`
// add the new file to the begining of the array (This will also be the begining of the navigation)
allNestedDocsRemote.config.unshift({
type: "link",
slug: slug,
title,
id: getRandID(),
children: [],
})
let err = false
// commit the config file to github
await github
.commit(
"docs/config.json",
sha,
JSON.stringify(allNestedDocsRemote, null, 2),
"Update from TinaCMS"
)
.then((response) => {
setCachedFormData("docs/config", {
sha: response.content.sha,
})
})
.catch((error) => {
err = true
cms.events.dispatch({ type: "github:error", error })
return { [FORM_ERROR]: error }
})
if (err) {
return
}
// commit the markdown file to github
return await github
.commit(
fileRelativePath,
getCachedFormData(fileRelativePath).sha,
toMarkdownString({
fileRelativePath,
rawFrontmatter: {
title,
},
}),
"Update from TinaCMS"
)
.then((response) => {
setCachedFormData(fileRelativePath, {
sha: response.content.sha,
})
setTimeout(() => router.push(`/docs/${slug}`), 1500)
})
.catch((e) => {
return { [FORM_ERROR]: e }
})
},
},
])
}
const getCachedFormData = (id) => {
if (typeof localStorage === "undefined") {
return {}
}
return JSON.parse(localStorage.getItem(id) || "{}")
}
const setCachedFormData = (id, data) => {
if (typeof localStorage === "undefined") {
return
}
localStorage.setItem(id, JSON.stringify(data))
}
export default useCreateMainDoc