* fix(app): preserve native composer input semantics Native text was round-tripped through application state on every keystroke, which could overwrite an input method's in-flight edits. Keep native text ownership inside the input and reserve application-driven replacement for explicit draft mutations.\n\nRoute native clipboard images through the existing persisted attachment pipeline so keyboard and system paste actions behave like other image sources. * fix(nix): refresh dependency hash The native composer dependency changes the fixed npm dependency closure used by desktop builds. * fix(app): keep composer locked across image pastes Count concurrent native image persistence operations so submit remains disabled until every pasted image is attached. * fix(app): replace composer text through the DOM on web Web TextInput refs are DOM elements, so application-driven draft replacement must update their value and selection without native setNativeProps. * fix(app): preserve web IME composition Carry the Chinese IME fix from #2990 into the web composer input boundary. Co-authored-by: Jimmy Lee <jimersylee+github@gmail.com> --------- Co-authored-by: Jimmy Lee <jimersylee+github@gmail.com>
36 lines
937 B
TypeScript
36 lines
937 B
TypeScript
import { resolveRasterImageMimeType } from "@/attachments/file-types";
|
|
import type { PickedImageAttachmentInput } from "@/hooks/image-attachment-picker";
|
|
|
|
export interface NativePastedFile {
|
|
fileName: string;
|
|
fileSize: number;
|
|
type: string;
|
|
uri: string;
|
|
}
|
|
|
|
export class UnsupportedPastedImageError extends Error {
|
|
constructor(fileName: string) {
|
|
super(`Unsupported pasted image '${fileName}'.`);
|
|
this.name = "UnsupportedPastedImageError";
|
|
}
|
|
}
|
|
|
|
export function normalizeNativePastedImages(
|
|
files: readonly NativePastedFile[],
|
|
): PickedImageAttachmentInput[] {
|
|
return files.map((file) => {
|
|
const mimeType = resolveRasterImageMimeType({
|
|
mimeType: file.type,
|
|
path: file.fileName,
|
|
});
|
|
if (!mimeType) {
|
|
throw new UnsupportedPastedImageError(file.fileName);
|
|
}
|
|
return {
|
|
source: { kind: "file_uri", uri: file.uri },
|
|
mimeType,
|
|
fileName: file.fileName,
|
|
};
|
|
});
|
|
}
|