diff --git a/apps/web/public/placeholder.svg b/apps/web/public/placeholder.svg new file mode 100644 index 000000000..ec79d8588 --- /dev/null +++ b/apps/web/public/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/src/components/editor/editor.css b/apps/web/src/components/editor/editor.css index 67aeda9f5..3a81a2cb2 100644 --- a/apps/web/src/components/editor/editor.css +++ b/apps/web/src/components/editor/editor.css @@ -159,7 +159,7 @@ span.attachment em::before { img { border-radius: 5px; max-width: 100% !important; - height: auto !important; + /* height: auto !important; */ background-color: var(--bgSecondary); } diff --git a/apps/web/src/components/editor/plugins/picker.js b/apps/web/src/components/editor/plugins/picker.js index 5e1728451..8982dd426 100644 --- a/apps/web/src/components/editor/plugins/picker.js +++ b/apps/web/src/components/editor/plugins/picker.js @@ -81,7 +81,7 @@ async function pickImage() { hash: output.hash, filename: selectedImage.name, type: selectedImage.type, - size: selectedImage.length, + size: selectedImage.size, dataurl, }; } diff --git a/apps/web/src/components/editor/tinymce.js b/apps/web/src/components/editor/tinymce.js index 23df86b51..3a05a34fb 100644 --- a/apps/web/src/components/editor/tinymce.js +++ b/apps/web/src/components/editor/tinymce.js @@ -235,6 +235,7 @@ function TinyMCE(props) { invalid_styles: { span: "--progress", }, + extended_valid_elements: `img[*|src=placeholder.svg]`, }} onBeforeExecCommand={async (command) => { const isPremiumCommand = premiumCommands.some((cmd) => { diff --git a/apps/web/src/interfaces/fs.js b/apps/web/src/interfaces/fs.js index 01c89239f..b1312ab27 100644 --- a/apps/web/src/interfaces/fs.js +++ b/apps/web/src/interfaces/fs.js @@ -71,7 +71,7 @@ async function readEncrypted(filename, key, cipherData) { async function uploadFile(filename, requestOptions) { console.log("Request to upload file", filename, requestOptions); - const { url } = requestOptions; + const { url, cancellationToken } = requestOptions; let cipher = await fs.getItem(filename); if (!cipher) throw new Error(`File not found. Filename: ${filename}`); @@ -86,6 +86,7 @@ async function uploadFile(filename, requestOptions) { headers: { "Content-Type": "", }, + cancelToken: cancellationToken, data: new Blob([cipher.buffer]), onUploadProgress: (ev) => { console.log("Uploading file", filename, ev); @@ -103,13 +104,14 @@ async function uploadFile(filename, requestOptions) { } async function downloadFile(filename, requestOptions) { - const { url, headers } = requestOptions; + const { url, headers, cancellationToken } = requestOptions; console.log("Request to download file", filename, url, headers); if (await fs.hasItem(filename)) return true; const response = await axios.get(url, { headers: headers, responseType: "blob", + cancelToken: cancellationToken, onDownloadProgress: (ev) => { console.log("Downloading file", filename, ev); AppEventManager.publish(AppEvents.UPDATE_ATTACHMENT_PROGRESS, { @@ -128,15 +130,16 @@ async function downloadFile(filename, requestOptions) { } async function deleteFile(filename, requestOptions) { - const { url, headers } = requestOptions; + const { url, headers, cancellationToken } = requestOptions; console.log("Request to delete file", filename, url, headers); if (!(await fs.hasItem(filename))) return true; const response = await axios.delete(url, { + cancelToken: cancellationToken, headers: headers, }); const result = isSuccessStatusCode(response.status); - // if (result) await fs.removeItem(filename); + if (result) await fs.removeItem(filename); return result; } @@ -147,8 +150,8 @@ function exists(filename) { const FS = { writeEncrypted, readEncrypted, - uploadFile, - downloadFile, + uploadFile: cancellable(uploadFile), + downloadFile: cancellable(downloadFile), deleteFile, exists, }; @@ -157,3 +160,14 @@ export default FS; function isSuccessStatusCode(statusCode) { return statusCode >= 200 && statusCode <= 299; } + +function cancellable(operation) { + const source = axios.CancelToken.source(); + return function (filename, requestOptions) { + requestOptions.cancellationToken = source.token; + return { + execute: () => operation(filename, requestOptions), + cancel: (message) => source.cancel(message), + }; + }; +} diff --git a/apps/web/src/stores/editor-store.js b/apps/web/src/stores/editor-store.js index 699733170..388200f94 100644 --- a/apps/web/src/stores/editor-store.js +++ b/apps/web/src/stores/editor-store.js @@ -92,7 +92,7 @@ class EditorStore extends BaseStore { if (note.conflicted) return hashNavigate(`/notes/${noteId}/conflict`, { replace: true }); - let content = await db.content.raw(note.contentId); + let content = await db.content.raw(note.contentId, false); this.set((state) => { const defaultSession = getDefaultSession();