11import type { Storage } from 'unstorage'
22import { joinURL } from 'ufo'
3- import type { DraftItem , StudioHost , GithubFile , DatabaseItem , MediaItem } from '../types'
3+ import type { DraftItem , StudioHost , GithubFile , DatabaseItem , MediaItem , BaseItem } from '../types'
4+ import { ContentFileExtension } from '../types'
5+ import { studioFlags } from './useStudio'
46import { DraftStatus } from '../types/draft'
5- import { checkConflict , findDescendantsFromFsPath , getDraftStatus } from '../utils/draft'
7+ import { checkConflict , findDescendantsFromFsPath } from '../utils/draft'
68import type { useGit } from './useGit'
79import { useHooks } from './useHooks'
810import { ref } from 'vue'
@@ -20,6 +22,7 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
2022 const ghPathPrefix = type === 'media' ? 'public' : 'content'
2123 const hostDb = type === 'media' ? host . media : host . document . db
2224 const hookName = `studio:draft:${ type } :updated` as const
25+ const areDocumentsEqual = host . document . utils . areEqual
2326
2427 const hooks = useHooks ( )
2528
@@ -38,7 +41,7 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
3841 const draftItem : DraftItem < T > = {
3942 fsPath,
4043 githubFile,
41- status : getDraftStatus ( item , original ! , host . document . utils . areEqual ) ,
44+ status : getStatus ( item , original ! ) ,
4245 modified : item ,
4346 }
4447
@@ -135,7 +138,7 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
135138 // @ts -expect-error upsert type is wrong, second param should be DatabaseItem | MediaItem
136139 await hostDb . upsert ( draftItem . fsPath , existingItem . original )
137140 existingItem . modified = existingItem . original
138- existingItem . status = getDraftStatus ( existingItem . modified as DatabaseItem , existingItem . original as DatabaseItem , host . document . utils . areEqual )
141+ existingItem . status = getStatus ( existingItem . modified as DatabaseItem , existingItem . original as DatabaseItem )
139142 await storage . setItem ( draftItem . fsPath , existingItem )
140143 }
141144 }
@@ -211,6 +214,42 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
211214 await hooks . callHook ( hookName , { caller : 'useDraftBase.load' , selectItem : false } )
212215 }
213216
217+ function getStatus ( modified : BaseItem , original : BaseItem ) : DraftStatus {
218+ if ( studioFlags . dev ) {
219+ return DraftStatus . Pristine
220+ }
221+
222+ if ( ! modified && ! original ) {
223+ throw new Error ( 'Unconsistent state: both modified and original are undefined' )
224+ }
225+
226+ if ( ! modified ) {
227+ return DraftStatus . Deleted
228+ }
229+
230+ if ( ! original || original . id !== modified . id ) {
231+ return DraftStatus . Created
232+ }
233+
234+ if ( original . extension === ContentFileExtension . Markdown ) {
235+ if ( ! areDocumentsEqual ( original as DatabaseItem , modified as DatabaseItem ) ) {
236+ return DraftStatus . Updated
237+ }
238+ }
239+ else if ( typeof original === 'object' && typeof modified === 'object' ) {
240+ if ( ! areDocumentsEqual ( original as DatabaseItem , modified as DatabaseItem ) ) {
241+ return DraftStatus . Updated
242+ }
243+ }
244+ else {
245+ if ( JSON . stringify ( original ) !== JSON . stringify ( modified ) ) {
246+ return DraftStatus . Updated
247+ }
248+ }
249+
250+ return DraftStatus . Pristine
251+ }
252+
214253 return {
215254 isLoading,
216255 list,
@@ -224,5 +263,6 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
224263 unselect,
225264 load,
226265 checkConflict,
266+ getStatus,
227267 }
228268}
0 commit comments