Skip to content

Commit 736b833

Browse files
committed
fix: document renaming
- Remove obsolete `updateDocument` calls in AlwaysVisibleArtifact & SidebarDocuments - Simplify caching in useDocumentUtils by removing manual __DOCUMENT_CACHE updates and using SWR mutate - Fix SidebarDocuments’ React.memo guard so title changes always re-render - Centralize rename logic via a single `document-renamed` event - Enhance text-streaming prompts for improved Markdown support
1 parent c644cd6 commit 736b833

File tree

4 files changed

+15
-52
lines changed

4 files changed

+15
-52
lines changed

apps/snow-leopard/artifacts/text/server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ import { updateDocumentPrompt } from '@/lib/ai/prompts';
66
export const textDocumentHandler = createDocumentHandler<'text'>({
77
kind: 'text',
88
onCreateDocument: async ({ title, dataStream }) => {
9-
// No need to track draft content - we're just streaming to the client
10-
// Editor's auto-save will handle saving later
119

1210
const { fullStream } = streamText({
13-
model: myProvider.languageModel('artifact-model'),
14-
system: `'Write about the given topic. Markdown is supported. Use headings wherever appropriate.',
11+
model: myProvider.languageModel('chat-model-large'),
12+
system: `'Write about the given topic. Markdown is supported. Use headings wherever appropriate. Valid Markdown only, using headings (#, ##),
13+
lists, bold, italics, and code blocks as needed',
1514
`.trim(),
1615
experimental_transform: smoothStream({ chunking: 'line' }),
1716
prompt: title,

apps/snow-leopard/components/always-visible-artifact.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function AlwaysVisibleArtifact({
6868
}: AlwaysVisibleArtifactProps) {
6969
const router = useRouter();
7070
const { artifact, setArtifact, metadata, setMetadata } = useArtifact();
71-
const { documentId: contextDocumentId, updateDocument } = useDocumentContext();
71+
const { documentId: contextDocumentId } = useDocumentContext();
7272
const {
7373
isCreatingDocument,
7474
renameDocument,
@@ -119,7 +119,6 @@ export function AlwaysVisibleArtifact({
119119
status: 'idle'
120120
};
121121
setArtifact(artifactData as any);
122-
updateDocument(artifactData.documentId, artifactData.title, artifactData.content, artifactData.kind);
123122
setNewTitle(artifactData.title);
124123
} else if (initialDocumentId === 'init' || showCreateDocumentForId) {
125124
const initData: SettableArtifact = {
@@ -131,12 +130,11 @@ export function AlwaysVisibleArtifact({
131130
status: 'idle'
132131
};
133132
setArtifact(initData as any);
134-
updateDocument(initData.documentId, initData.title, initData.content, initData.kind);
135133
setNewTitle(initData.title);
136134
}
137135
});
138136

139-
}, [initialDocumentId, initialDocuments, setArtifact, updateDocument, showCreateDocumentForId, startTransition, artifact.documentId]);
137+
}, [initialDocumentId, initialDocuments, setArtifact, startTransition, artifact.documentId]);
140138

141139
useEffect(() => {
142140
const handleDocumentRenamed = (event: CustomEvent) => {
@@ -176,15 +174,17 @@ export function AlwaysVisibleArtifact({
176174
const trimmedNewTitle = newTitle.trim();
177175
if (trimmedNewTitle && trimmedNewTitle !== latestDocument.title) {
178176
const originalTitle = latestDocument.title;
179-
setArtifact(current => ({ ...current, title: trimmedNewTitle }));
180-
setDocuments(prevDocs => prevDocs.map(doc => doc.id === latestDocument.id ? { ...doc, title: trimmedNewTitle } : doc));
177+
const originalDocuments = [...documents];
178+
179+
setDocuments(prevDocs => prevDocs.map(doc =>
180+
doc.id === latestDocument.id ? { ...doc, title: trimmedNewTitle } : doc
181+
));
181182

182183
try {
183184
await renameDocument(trimmedNewTitle);
184185
} catch (error) {
185186
toast.error("Failed to rename document.");
186-
setArtifact(current => ({ ...current, title: originalTitle }));
187-
setDocuments(prevDocs => prevDocs.map(doc => doc.id === latestDocument.id ? { ...doc, title: originalTitle } : doc));
187+
setDocuments(originalDocuments);
188188
console.error("Rename failed:", error);
189189
} finally {
190190
setEditingTitle(false);
@@ -193,7 +193,7 @@ export function AlwaysVisibleArtifact({
193193
setEditingTitle(false);
194194
if (!trimmedNewTitle) setNewTitle(latestDocument.title);
195195
}
196-
}, [newTitle, latestDocument, renameDocument, setArtifact]);
196+
}, [newTitle, latestDocument, documents, renameDocument, setArtifact]);
197197

198198
const handleCancelEditTitle = useCallback(() => {
199199
if (!latestDocument) return;

apps/snow-leopard/components/sidebar/sidebar-documents.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,11 @@ const PureDocumentItem = ({
162162
};
163163

164164
export const DocumentItem = memo(PureDocumentItem, (prevProps, nextProps) => {
165+
if (prevProps.document.title !== nextProps.document.title) return false;
165166
if (prevProps.isActive !== nextProps.isActive) return false;
166167
if (prevProps.isSelectionMode !== nextProps.isSelectionMode) return false;
167168
if (prevProps.isSelected !== nextProps.isSelected) return false;
169+
if (prevProps.document.id !== nextProps.document.id) return false;
168170
return true;
169171
});
170172

@@ -179,7 +181,7 @@ export function SidebarDocuments({ user }: { user: User | undefined }) {
179181
deleteDocument,
180182
isCreatingDocument
181183
} = useDocumentUtils();
182-
const { updateDocument } = useDocumentContext();
184+
// const { updateDocument } = useDocumentContext();
183185

184186
const [searchTerm, setSearchTerm] = useState('');
185187
const [isExpanded, setIsExpanded] = useState(true);
@@ -248,18 +250,6 @@ export function SidebarDocuments({ user }: { user: User | undefined }) {
248250
return doc;
249251
});
250252
}, false);
251-
252-
try {
253-
const updateEvent = new CustomEvent('document-updated', {
254-
detail: {
255-
documentId: event.detail.documentId,
256-
title: event.detail.newTitle
257-
}
258-
});
259-
window.dispatchEvent(updateEvent);
260-
} catch (error) {
261-
console.error('[SidebarDocuments] Error dispatching document-updated event', error);
262-
}
263253
}
264254
};
265255

apps/snow-leopard/hooks/use-document-utils.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,6 @@ export function useDocumentUtils() {
179179
}));
180180
}
181181

182-
if (typeof window !== 'undefined' && (window as any).__DOCUMENT_CACHE) {
183-
const cachedDoc = (window as any).__DOCUMENT_CACHE.get(artifact.documentId);
184-
if (cachedDoc) {
185-
(window as any).__DOCUMENT_CACHE.set(artifact.documentId, {
186-
...cachedDoc,
187-
title: updatedDocumentData?.title || newTitle
188-
});
189-
}
190-
}
191-
192182
toast.success('Document renamed', {
193183
duration: 2000
194184
});
@@ -250,18 +240,6 @@ export function useDocumentUtils() {
250240
router.push(`/documents/${documentId}`);
251241
}
252242

253-
if (typeof window !== 'undefined') {
254-
if (!(window as any).__DOCUMENT_CACHE) {
255-
(window as any).__DOCUMENT_CACHE = new Map();
256-
}
257-
(window as any).__DOCUMENT_CACHE.set(documentId, {
258-
id: documentId,
259-
title: params.title,
260-
content: params.content,
261-
kind: params.kind,
262-
});
263-
}
264-
265243
return document;
266244
} catch (error) {
267245
console.error('[useDocumentUtils] Error creating document:', error);
@@ -345,10 +323,6 @@ export function useDocumentUtils() {
345323
router.refresh();
346324
}
347325

348-
if (typeof window !== 'undefined' && (window as any).__DOCUMENT_CACHE) {
349-
(window as any).__DOCUMENT_CACHE.delete(documentId);
350-
}
351-
352326
toast.success('Document deleted');
353327
return true;
354328
} catch (error) {

0 commit comments

Comments
 (0)