Clear time unit dirty state before save navigation

This commit is contained in:
karilint
2026-05-27 18:31:50 +03:00
parent bae2f2e1f4
commit ef3b7cbe96
4 changed files with 40 additions and 7 deletions
@@ -139,6 +139,7 @@ export type DetailContextType<T> = {
setFieldsWithErrors: SetFieldsWithErrorsType
isDirty: boolean
resetEditData: () => void
markEditDataClean?: (editData?: unknown) => void
}
export type SetEditDataType<T> = (editData: EditDataType<T>) => void
@@ -191,6 +192,14 @@ export const DetailContextProvider = <T extends object>({
setEditData(cloneDeep(initialEditData))
setIsDirty(false)
}
const markEditDataClean = (nextEditData?: unknown) => {
const cleanEditData = cloneDeep((nextEditData as EditDataType<T> | undefined) ?? editData)
setInitialEditData(cleanEditData)
setEditData(cloneDeep(cleanEditData))
setIsDirty(false)
}
return (
<DetailContext.Provider
value={{
@@ -199,6 +208,7 @@ export const DetailContextProvider = <T extends object>({
setEditData: handleSetEditData,
isDirty,
resetEditData,
markEditDataClean,
validator: (editData: unknown, fieldName: keyof EditDataType<T>) =>
contextState.validator(editData as EditDataType<T>, fieldName),
}}
@@ -118,7 +118,11 @@ export const DetailView = <T extends object>({
}: {
tabs: TabType[]
data: T
onWrite?: (editData: EditDataType<T>, setEditData: (editData: EditDataType<T>) => void) => Promise<void>
onWrite?: (
editData: EditDataType<T>,
setEditData: (editData: EditDataType<T>) => void,
markEditDataClean?: (editData?: EditDataType<T>) => void
) => Promise<void>
validator: (editData: EditDataType<T>, field: keyof EditDataType<T>) => ValidationObject
isNew?: boolean
isUserPage?: boolean
@@ -23,13 +23,27 @@ export const WriteButton = <T,>({
hasStagingMode = false,
disabled = false,
}: {
onWrite: (editData: EditDataType<T>, setEditData: (editData: EditDataType<T>) => void) => Promise<void>
onWrite: (
editData: EditDataType<T>,
setEditData: (editData: EditDataType<T>) => void,
markEditDataClean?: (editData?: EditDataType<T>) => void
) => Promise<void>
taxonomy?: boolean
hasStagingMode?: boolean
disabled?: boolean
}) => {
const { data, editData, setEditData, mode, setMode, validator, fieldsWithErrors, setFieldsWithErrors, isDirty } =
useDetailContext<T>()
const {
data,
editData,
setEditData,
mode,
setMode,
validator,
fieldsWithErrors,
setFieldsWithErrors,
isDirty,
markEditDataClean,
} = useDetailContext<T>()
const user = useUser()
const [loading, setLoading] = useState(false)
const { notify } = useNotify()
@@ -173,7 +187,7 @@ export const WriteButton = <T,>({
}
}
await onWrite((speciesEditData as EditDataType<T>) ?? editData, setEditData)
await onWrite((speciesEditData as EditDataType<T>) ?? editData, setEditData, markEditDataClean)
setMode('read')
}
@@ -193,7 +207,7 @@ export const WriteButton = <T,>({
}
setLoading(true)
await onWrite(editData, setEditData)
await onWrite(editData, setEditData, markEditDataClean)
setLoading(false)
setMode('read')
}
@@ -53,11 +53,16 @@ export const TimeUnitDetails = ({
const onWrite = async (
editData: EditDataType<TimeUnitDetailsType>,
setEditData: (editData: EditDataType<TimeUnitDetailsType>) => void
setEditData: (editData: EditDataType<TimeUnitDetailsType>) => void,
markEditDataClean?: (editData?: EditDataType<TimeUnitDetailsType>) => void
) => {
try {
const normalizedEditData = normalizeRank(editData)
const { tu_name } = await editTimeUnitRequest(normalizedEditData).unwrap()
markEditDataClean?.({
...normalizedEditData,
tu_name,
})
unsavedChanges?.setDirty(false)
setTimeout(() => navigate(`/time-unit/${tu_name}`), 15)
notify('Edited item successfully.')