From 1437e99cbb91b1ecb17290a4482c792f3267b735 Mon Sep 17 00:00:00 2001 From: billisdead Date: Tue, 23 Jun 2026 15:26:10 +0200 Subject: [PATCH] fix: title increment based on DB max, not stored template only After each incident save, query existing titles with the same prefix to find the real max number, then use max(dbMax, tplNum) + 1. Prevents duplicate counters when incidents were created before the template was configured. Co-Authored-By: Claude Sonnet 4.6 --- app/new.tsx | 17 +++++++++-------- lib/db.ts | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/new.tsx b/app/new.tsx index 1789009..95acbb6 100644 --- a/app/new.tsx +++ b/app/new.tsx @@ -16,6 +16,7 @@ import { updateIncident, getIncidentById, getDistinctServices, + getMaxTitleNumber, } from "@/lib/db"; import { Colors } from "@/constants/theme"; import { useVoice } from "@/hooks/useVoice"; @@ -50,13 +51,6 @@ const LABEL_STYLE = { type VoiceField = "title" | "service" | "symptom" | "rootCause" | "fix"; -function incrementTemplate(template: string): string { - const match = template.match(/^([\s\S]*?)(\d+)$/); - if (!match) return template; - const [, prefix, numStr] = match; - const next = (parseInt(numStr, 10) + 1).toString().padStart(numStr.length, "0"); - return prefix + next; -} export default function NewIncidentScreen() { const { editId } = useLocalSearchParams<{ editId?: string }>(); @@ -180,7 +174,14 @@ export default function NewIncidentScreen() { await createIncident(form); const tpl = await SecureStore.getItemAsync("pref_title_template"); if (tpl) { - await SecureStore.setItemAsync("pref_title_template", incrementTemplate(tpl)); + const match = tpl.match(/^([\s\S]*?)(\d+)$/); + if (match) { + const [, prefix, numStr] = match; + const dbMax = await getMaxTitleNumber(prefix); + const tplNum = parseInt(numStr, 10); + const next = (Math.max(dbMax, tplNum) + 1).toString().padStart(numStr.length, "0"); + await SecureStore.setItemAsync("pref_title_template", prefix + next); + } } } router.back(); diff --git a/lib/db.ts b/lib/db.ts index 5261abe..4283abc 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -163,6 +163,20 @@ export async function deleteIncident(id: string): Promise { await db.runAsync("DELETE FROM incidents WHERE id = ?", [id]); } +export async function getMaxTitleNumber(prefix: string): Promise { + const db = await getDb(); + const rows = await db.getAllAsync<{ title: string }>( + "SELECT title FROM incidents WHERE title LIKE ?", + [`${prefix}%`] + ); + let max = 0; + for (const row of rows) { + const n = parseInt(row.title.slice(prefix.length), 10); + if (!isNaN(n) && n > max) max = n; + } + return max; +} + export async function getDistinctServices(): Promise { const db = await getDb(); const rows = await db.getAllAsync<{ service: string }>(