Skip to content

Commit 949f224

Browse files
fix: wipe stale odometer fields on draft hydration
1 parent 8627fb4 commit 949f224

1 file changed

Lines changed: 23 additions & 30 deletions

File tree

src/libs/actions/OdometerTransactionUtils.ts

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -165,38 +165,31 @@ async function saveOdometerDraft({startReading, endReading, startImage, endImage
165165
await Onyx.set(ONYXKEYS.ODOMETER_DRAFT, odometerDraft);
166166
}
167167

168-
function buildOdometerCommentFromDraft(transactionID: string, odometerDraft: OnyxEntry<OdometerDraft>, currentComment?: Partial<Comment>): Partial<Comment> | undefined {
168+
type OdometerCommentUpdate = {
169+
odometerStart: number | null;
170+
odometerEnd: number | null;
171+
odometerStartImage: FileObject | string | null;
172+
odometerEndImage: FileObject | string | null;
173+
};
174+
175+
function buildOdometerCommentFromDraft(transactionID: string, odometerDraft: OnyxEntry<OdometerDraft>, currentComment?: Partial<Comment>): OdometerCommentUpdate | undefined {
169176
if (!odometerDraft) {
170177
return;
171178
}
172179

173-
const commentUpdate: Partial<Comment> = {};
174-
175-
if (odometerDraft.odometerStartReading !== undefined) {
176-
commentUpdate.odometerStart = odometerDraft.odometerStartReading;
177-
}
180+
const startImage = deserializeOdometerDraftImage(odometerDraft.odometerStartImage, transactionID, CONST.IOU.ODOMETER_IMAGE_TYPE.START) ?? null;
181+
const endImage = deserializeOdometerDraftImage(odometerDraft.odometerEndImage, transactionID, CONST.IOU.ODOMETER_IMAGE_TYPE.END) ?? null;
178182

179-
if (odometerDraft.odometerEndReading !== undefined) {
180-
commentUpdate.odometerEnd = odometerDraft.odometerEndReading;
181-
}
182-
183-
const startImage = deserializeOdometerDraftImage(odometerDraft.odometerStartImage, transactionID, CONST.IOU.ODOMETER_IMAGE_TYPE.START);
184-
if (startImage !== undefined) {
185-
revokeOdometerImageUri(currentComment?.odometerStartImage, startImage);
186-
commentUpdate.odometerStartImage = startImage;
187-
}
183+
// Free the previous blob URL before the merge drops the reference - covers both replace and wipe-to-null; helper no-ops if non-blob or unchanged.
184+
revokeOdometerImageUri(currentComment?.odometerStartImage, startImage);
185+
revokeOdometerImageUri(currentComment?.odometerEndImage, endImage);
188186

189-
const endImage = deserializeOdometerDraftImage(odometerDraft.odometerEndImage, transactionID, CONST.IOU.ODOMETER_IMAGE_TYPE.END);
190-
if (endImage !== undefined) {
191-
revokeOdometerImageUri(currentComment?.odometerEndImage, endImage);
192-
commentUpdate.odometerEndImage = endImage;
193-
}
194-
195-
if (Object.keys(commentUpdate).length === 0) {
196-
return;
197-
}
198-
199-
return commentUpdate;
187+
return {
188+
odometerStart: odometerDraft.odometerStartReading ?? null,
189+
odometerEnd: odometerDraft.odometerEndReading ?? null,
190+
odometerStartImage: startImage,
191+
odometerEndImage: endImage,
192+
};
200193
}
201194

202195
/**
@@ -223,10 +216,10 @@ function isOdometerDraftPendingHydration(odometerDraft: OnyxEntry<OdometerDraft>
223216
return false;
224217
}
225218
return (
226-
(odometerDraft.odometerStartReading !== undefined && comment?.odometerStart == null) ||
227-
(odometerDraft.odometerEndReading !== undefined && comment?.odometerEnd == null) ||
228-
(!!odometerDraft.odometerStartImage && !comment?.odometerStartImage) ||
229-
(!!odometerDraft.odometerEndImage && !comment?.odometerEndImage)
219+
(odometerDraft.odometerStartReading ?? null) !== (comment?.odometerStart ?? null) ||
220+
(odometerDraft.odometerEndReading ?? null) !== (comment?.odometerEnd ?? null) ||
221+
!!odometerDraft.odometerStartImage !== !!comment?.odometerStartImage ||
222+
!!odometerDraft.odometerEndImage !== !!comment?.odometerEndImage
230223
);
231224
}
232225

0 commit comments

Comments
 (0)