export interface QuickNoteModalState { savedContent: string draftContent: string isDirty: boolean lastSaveFailed: boolean } export interface ComputeIsDirtyInput { savedContent: string draftContent: string } export function computeIsDirty(input: ComputeIsDirtyInput): boolean { return input.savedContent !== input.draftContent } export function createQuickNoteModalState(savedContent: string): QuickNoteModalState { return { savedContent, draftContent: savedContent, isDirty: false, lastSaveFailed: false, } } export function updateDraftContent(state: QuickNoteModalState, draftContent: string): QuickNoteModalState { return { ...state, draftContent, isDirty: computeIsDirty({ savedContent: state.savedContent, draftContent, }), lastSaveFailed: false, } } export function markSaveSucceeded(state: QuickNoteModalState): QuickNoteModalState { const nextSavedContent = state.draftContent return { ...state, savedContent: nextSavedContent, draftContent: nextSavedContent, isDirty: false, lastSaveFailed: false, } } export function markSaveFailed(state: QuickNoteModalState): QuickNoteModalState { return { ...state, isDirty: computeIsDirty({ savedContent: state.savedContent, draftContent: state.draftContent, }), lastSaveFailed: true, } }