char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Aleksander Grygierui: Clean up contexts, remove prop drilling from Chat Form Actions (#26951)d86c7d62d

char/aliceai-t5-moe
2.5 KiB102 linesraw
1import { setChatMessageEditContext } from '$lib/contexts';
2import { MessageRole } from '$lib/enums';
3import { parseFilesToMessageExtras } from '$lib/utils/convert-files-to-extra';
4
5interface UseChatMessageEditContextOptions {
6	getContent: () => string;
7	getExtras: () => DatabaseMessageExtra[];
8	showSaveOnlyOption?: boolean;
9	onSave: (content: string, extras?: DatabaseMessageExtra[]) => void;
10}
11
12export function useChatMessageEditContext(options: UseChatMessageEditContextOptions) {
13	let isEditing = $state(false);
14	let editedContent = $state('');
15	let editedExtras = $state<DatabaseMessageExtra[]>([]);
16	let editedUploadedFiles = $state<ChatUploadedFile[]>([]);
17
18	function handleEdit() {
19		editedContent = options.getContent();
20		editedExtras = [...options.getExtras()];
21		editedUploadedFiles = [];
22		isEditing = true;
23	}
24
25	async function handleSaveEdit() {
26		const trimmed = editedContent.trim();
27
28		if (!trimmed && editedExtras.length === 0 && editedUploadedFiles.length === 0) return;
29
30		let finalExtras: DatabaseMessageExtra[] = $state.snapshot(editedExtras);
31
32		if (editedUploadedFiles.length > 0) {
33			const plainFiles = $state.snapshot(editedUploadedFiles);
34			const result = await parseFilesToMessageExtras(plainFiles);
35			const newExtras = result?.extras || [];
36
37			finalExtras = [...finalExtras, ...newExtras];
38		}
39
40		options.onSave(trimmed, finalExtras.length > 0 ? finalExtras : undefined);
41		isEditing = false;
42	}
43
44	function handleCancelEdit() {
45		isEditing = false;
46	}
47
48	setChatMessageEditContext({
49		cancel: handleCancelEdit,
50		get editedContent() {
51			return editedContent;
52		},
53		get editedExtras() {
54			return editedExtras;
55		},
56		get editedUploadedFiles() {
57			return editedUploadedFiles;
58		},
59		get isEditing() {
60			return isEditing;
61		},
62		get messageRole() {
63			return MessageRole.USER;
64		},
65		get originalContent() {
66			return options.getContent();
67		},
68		get originalExtras() {
69			return options.getExtras();
70		},
71		save: handleSaveEdit,
72		saveOnly: handleSaveEdit,
73		setContent: (c: string) => {
74			editedContent = c;
75		},
76		setExtras: (e: DatabaseMessageExtra[]) => {
77			editedExtras = e;
78		},
79		setUploadedFiles: (f: ChatUploadedFile[]) => {
80			editedUploadedFiles = f;
81		},
82		get shouldBranchAfterEdit() {
83			return false;
84		},
85		get showBranchAfterEditOption() {
86			return false;
87		},
88		get showSaveOnlyOption() {
89			return options.showSaveOnlyOption ?? false;
90		},
91		startEdit: handleEdit
92	});
93
94	return {
95		handleCancelEdit,
96		handleEdit,
97		handleSaveEdit,
98		get isEditing() {
99			return isEditing;
100		}
101	};
102}