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