@@ -5,6 +5,7 @@ import { atom } from "jotai"
5
5
import { atomWithMachine } from "jotai-xstate"
6
6
import { atomWithStorage , selectAtom } from "jotai/utils"
7
7
import { assign , createMachine } from "xstate"
8
+ import { z } from "zod"
8
9
import {
9
10
GitHubRepository ,
10
11
GitHubUser ,
@@ -26,6 +27,7 @@ import { removeTemplateFrontmatter } from "./utils/remove-template-frontmatter"
26
27
const ROOT_DIR = "/root"
27
28
const DEFAULT_BRANCH = "main"
28
29
const GITHUB_USER_KEY = "github_user"
30
+ const MARKDOWN_FILES_KEY = "markdown_files"
29
31
30
32
// -----------------------------------------------------------------------------
31
33
// State machine
@@ -118,7 +120,7 @@ function createGlobalStateMachine() {
118
120
src : "resolveRepo" ,
119
121
onDone : {
120
122
target : "cloned" ,
121
- actions : [ "setGitHubRepo" , "setMarkdownFiles" ] ,
123
+ actions : [ "setGitHubRepo" , "setMarkdownFiles" , "setMarkdownFilesLocalStorage" ] ,
122
124
} ,
123
125
onError : {
124
126
target : "empty" ,
@@ -137,7 +139,7 @@ function createGlobalStateMachine() {
137
139
src : "cloneRepo" ,
138
140
onDone : {
139
141
target : "cloned" ,
140
- actions : "setMarkdownFiles" ,
142
+ actions : [ "setMarkdownFiles" , "setMarkdownFilesLocalStorage" ] ,
141
143
} ,
142
144
onError : {
143
145
target : "empty" ,
@@ -158,7 +160,7 @@ function createGlobalStateMachine() {
158
160
on : {
159
161
WRITE_FILE : {
160
162
target : "writingFile" ,
161
- actions : "setMarkdownFile" ,
163
+ actions : [ "setMarkdownFile" , "setMarkdownFileLocalStorage" ] ,
162
164
} ,
163
165
} ,
164
166
} ,
@@ -174,7 +176,7 @@ function createGlobalStateMachine() {
174
176
on : {
175
177
WRITE_FILE : {
176
178
target : "writingFile" ,
177
- actions : "setMarkdownFile" ,
179
+ actions : [ "setMarkdownFile" , "setMarkdownFileLocalStorage" ] ,
178
180
} ,
179
181
} ,
180
182
} ,
@@ -193,7 +195,7 @@ function createGlobalStateMachine() {
193
195
src : "sync" ,
194
196
onDone : {
195
197
target : "idle" ,
196
- actions : "setMarkdownFiles" ,
198
+ actions : [ "setMarkdownFiles" , "setMarkdownFilesLocalStorage" ] ,
197
199
} ,
198
200
onError : {
199
201
target : "idle" ,
@@ -240,6 +242,8 @@ function createGlobalStateMachine() {
240
242
return { githubUser : githubUserSchema . parse ( githubUser ) }
241
243
} ,
242
244
resolveRepo : async ( ) => {
245
+ console . time ( "resolveRepo()" )
246
+
243
247
// Check git config for repo name
244
248
const remoteOriginUrl = await git . getConfig ( {
245
249
fs,
@@ -257,7 +261,10 @@ function createGlobalStateMachine() {
257
261
}
258
262
259
263
const githubRepo = { owner, name }
260
- const markdownFiles = await getMarkdownFilesFromFs ( ROOT_DIR )
264
+ const markdownFiles =
265
+ getMarkdownFilesFromLocalStorage ( ) ?? ( await getMarkdownFilesFromFs ( ROOT_DIR ) )
266
+
267
+ console . timeEnd ( "resolveRepo()" )
261
268
262
269
return { githubRepo, markdownFiles }
263
270
} ,
@@ -407,6 +414,18 @@ function createGlobalStateMachine() {
407
414
return { ...context . markdownFiles , [ filepath ] : content }
408
415
} ,
409
416
} ) ,
417
+ setMarkdownFilesLocalStorage : ( _ , event ) => {
418
+ // Cache markdown files in localStorage
419
+ localStorage . setItem ( MARKDOWN_FILES_KEY , JSON . stringify ( event . data . markdownFiles ) )
420
+ } ,
421
+ setMarkdownFileLocalStorage : ( context , event ) => {
422
+ // Update markdown file in localStorage
423
+ const { filepath, content } = event
424
+ localStorage . setItem (
425
+ MARKDOWN_FILES_KEY ,
426
+ JSON . stringify ( { ...context . markdownFiles , [ filepath ] : content } ) ,
427
+ )
428
+ } ,
410
429
setError : assign ( {
411
430
// TODO: Remove `as Error`
412
431
error : ( _ , event ) => event . data as Error ,
@@ -416,6 +435,13 @@ function createGlobalStateMachine() {
416
435
)
417
436
}
418
437
438
+ function getMarkdownFilesFromLocalStorage ( ) {
439
+ const markdownFiles = JSON . parse ( localStorage . getItem ( MARKDOWN_FILES_KEY ) ?? "null" )
440
+ if ( ! markdownFiles ) return null
441
+ const parsedMarkdownFiles = z . record ( z . string ( ) ) . safeParse ( markdownFiles )
442
+ return parsedMarkdownFiles . success ? parsedMarkdownFiles . data : null
443
+ }
444
+
419
445
/** Walk the file system and return the contents of all markdown files */
420
446
async function getMarkdownFilesFromFs ( dir : string ) {
421
447
console . time ( "getMarkdownFilesFromFs()" )
0 commit comments