@ -27,6 +27,8 @@ import {
get ,
get ,
} from "idb-keyval" ;
} from "idb-keyval" ;
import { appJotaiStore , atom } from "excalidraw-app/app-jotai" ;
import type { LibraryPersistedData } from "@excalidraw/excalidraw/data/library" ;
import type { LibraryPersistedData } from "@excalidraw/excalidraw/data/library" ;
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types" ;
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types" ;
import type { ExcalidrawElement , FileId } from "@excalidraw/element/types" ;
import type { ExcalidrawElement , FileId } from "@excalidraw/element/types" ;
@ -45,6 +47,8 @@ import { updateBrowserStateVersion } from "./tabSync";
const filesStore = createStore ( "files-db" , "files-store" ) ;
const filesStore = createStore ( "files-db" , "files-store" ) ;
export const localStorageQuotaExceededAtom = atom ( false ) ;
class LocalFileManager extends FileManager {
class LocalFileManager extends FileManager {
clearObsoleteFiles = async ( opts : { currentFileIds : FileId [ ] } ) = > {
clearObsoleteFiles = async ( opts : { currentFileIds : FileId [ ] } ) = > {
await entries ( filesStore ) . then ( ( entries ) = > {
await entries ( filesStore ) . then ( ( entries ) = > {
@ -69,6 +73,9 @@ const saveDataStateToLocalStorage = (
elements : readonly ExcalidrawElement [ ] ,
elements : readonly ExcalidrawElement [ ] ,
appState : AppState ,
appState : AppState ,
) = > {
) = > {
const localStorageQuotaExceeded = appJotaiStore . get (
localStorageQuotaExceededAtom ,
) ;
try {
try {
const _appState = clearAppStateForLocalStorage ( appState ) ;
const _appState = clearAppStateForLocalStorage ( appState ) ;
@ -88,12 +95,22 @@ const saveDataStateToLocalStorage = (
JSON . stringify ( _appState ) ,
JSON . stringify ( _appState ) ,
) ;
) ;
updateBrowserStateVersion ( STORAGE_KEYS . VERSION_DATA_STATE ) ;
updateBrowserStateVersion ( STORAGE_KEYS . VERSION_DATA_STATE ) ;
if ( localStorageQuotaExceeded ) {
appJotaiStore . set ( localStorageQuotaExceededAtom , false ) ;
}
} catch ( error : any ) {
} catch ( error : any ) {
// Unable to access window.localStorage
// Unable to access window.localStorage
console . error ( error ) ;
console . error ( error ) ;
if ( isQuotaExceededError ( error ) && ! localStorageQuotaExceeded ) {
appJotaiStore . set ( localStorageQuotaExceededAtom , true ) ;
}
}
}
} ;
} ;
const isQuotaExceededError = ( error : any ) = > {
return error instanceof DOMException && error . name === "QuotaExceededError" ;
} ;
type SavingLockTypes = "collaboration" ;
type SavingLockTypes = "collaboration" ;
export class LocalData {
export class LocalData {