Skip to content

Commit 9008e0e

Browse files
committed
fix: extract shared isGeneratedNoteTitle, fix filename using default title
- Extract UUID_TITLE_RE, ISO_TITLE_RE, and generated-title detection into a shared utility at services/enhancer/title.ts. - In getEnhancedNoteFilename (persister), skip the title when it is a generated placeholder ('Summary', UUID, ISO, or template_id) and fall back to template_id for the filename. This prevents all template-based notes from being saved as Summary.md before async title hydration. - Remove duplicated regex constants and logic from enhancer/index.ts and header.tsx; both now import isGeneratedNoteTitle from the shared module.
1 parent 58ce98f commit 9008e0e

4 files changed

Lines changed: 29 additions & 27 deletions

File tree

apps/desktop/src/services/enhancer/index.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { LanguageModel } from "ai";
33
import { commands as analyticsCommands } from "@hypr/plugin-analytics";
44

55
import { getEligibility } from "./eligibility";
6+
import { isGeneratedNoteTitle } from "./title";
67

78
import type { Store as MainStore } from "~/store/tinybase/store/main";
89
import { INDEXES } from "~/store/tinybase/store/main";
@@ -37,25 +38,11 @@ type EnhancerDeps = {
3738
getSelectedTemplateId: () => string | undefined;
3839
};
3940

40-
const UUID_TITLE_RE =
41-
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
42-
const ISO_TITLE_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/;
43-
4441
function shouldHydrateTemplateTitle(
4542
currentTitle: string | null | undefined,
4643
templateId: string,
4744
) {
48-
const title = currentTitle?.trim();
49-
if (!title) {
50-
return true;
51-
}
52-
53-
return (
54-
title === "Summary" ||
55-
title === templateId ||
56-
UUID_TITLE_RE.test(title) ||
57-
ISO_TITLE_RE.test(title)
58-
);
45+
return isGeneratedNoteTitle(currentTitle, templateId);
5946
}
6047

6148
let instance: EnhancerService | null = null;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const UUID_TITLE_RE =
2+
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
3+
const ISO_TITLE_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/;
4+
5+
export function isGeneratedNoteTitle(
6+
title: string | null | undefined,
7+
templateId?: string,
8+
): boolean {
9+
const trimmed = title?.trim();
10+
if (!trimmed) {
11+
return true;
12+
}
13+
14+
return (
15+
trimmed === "Summary" ||
16+
(!!templateId && trimmed === templateId) ||
17+
UUID_TITLE_RE.test(trimmed) ||
18+
ISO_TITLE_RE.test(trimmed)
19+
);
20+
}

apps/desktop/src/session/components/note-input/header.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { useAITaskTask } from "~/ai/hooks";
3737
import { useLanguageModel, useLLMConnectionStatus } from "~/ai/hooks";
3838
import { extractPlainText } from "~/search/contexts/engine/utils";
3939
import { getEnhancerService } from "~/services/enhancer";
40+
import { isGeneratedNoteTitle } from "~/services/enhancer/title";
4041
import { useHasTranscript } from "~/session/components/shared";
4142
import { useEnsureDefaultSummary } from "~/session/hooks/useEnhancedNotes";
4243
import {
@@ -90,10 +91,6 @@ function getStoredNoteMarkdown(content: string | undefined) {
9091
return json2md(parseJsonContent(trimmed)).trim();
9192
}
9293

93-
const UUID_TITLE_RE =
94-
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
95-
const ISO_TITLE_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/;
96-
9794
function getEnhancedNoteTitle({
9895
rawTitle,
9996
templateTitle,
@@ -108,13 +105,7 @@ function getEnhancedNoteTitle({
108105
return templateTitle || "Summary";
109106
}
110107

111-
const isGeneratedTitle =
112-
title === "Summary" ||
113-
title === templateId ||
114-
UUID_TITLE_RE.test(title) ||
115-
ISO_TITLE_RE.test(title);
116-
117-
if (isGeneratedTitle && templateTitle) {
108+
if (isGeneratedNoteTitle(title, templateId) && templateTitle) {
118109
return templateTitle;
119110
}
120111

apps/desktop/src/store/tinybase/persister/session/save/note.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
type TablesContent,
1313
type WriteOperation,
1414
} from "~/store/tinybase/persister/shared";
15+
import { isGeneratedNoteTitle } from "~/services/enhancer/title";
1516
import type { Store } from "~/store/tinybase/store/main";
1617

1718
type DocumentItem = [ParsedDocument, string];
@@ -142,8 +143,11 @@ function getEnhancedNoteFilename(
142143
enhancedNote: ReturnType<typeof iterateTableRows<"enhanced_notes">>[number],
143144
): string {
144145
if (enhancedNote.template_id) {
146+
const title = enhancedNote.title as string | undefined;
147+
const useTitle =
148+
title && !isGeneratedNoteTitle(title, enhancedNote.template_id);
145149
const safeName = sanitizeFilename(
146-
enhancedNote.title || enhancedNote.template_id,
150+
useTitle ? title : enhancedNote.template_id,
147151
);
148152
return `${safeName}.md`;
149153
}

0 commit comments

Comments
 (0)