Skip to content

Commit e8d6381

Browse files
committed
fix: add .undefinedOnCancel to showSaveFilePicker
1 parent 6b0865e commit e8d6381

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

src/gui/src/IPC.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,6 +1315,13 @@ const ipc_listener = async (event, handled) => {
13151315
$(el_filedialog_window).close();
13161316
window.show_save_account_notice_if_needed();
13171317
};
1318+
1319+
const tell_caller_its_cancelled = async () => {
1320+
target_iframe.contentWindow.postMessage({
1321+
msg: "fileSaveCancelled",
1322+
original_msg_id: msg_id,
1323+
}, '*');
1324+
};
13181325

13191326
const write_file_tell_caller_and_update_views = async ({
13201327
target_path, el_filedialog_window,
@@ -1468,6 +1475,7 @@ const ipc_listener = async (event, handled) => {
14681475
iframe_msg_uid: msg_id,
14691476
center: true,
14701477
initiating_app_uuid: app_uuid,
1478+
onDialogCancel: () => tell_caller_its_cancelled(),
14711479
onSaveFileDialogSave: async function(target_path, el_filedialog_window){
14721480
$(el_filedialog_window).find('.window-disable-mask, .busy-indicator').show();
14731481
let busy_init_ts = Date.now();

src/gui/src/UI/UIWindow.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ async function UIWindow(options) {
896896
$(`.window[data-element_uuid="${options.parent_uuid}"]`).find('.window-disable-mask').hide();
897897
$(el_window).close();
898898
})
899+
if ( options.onDialogCancel ) options.onDialogCancel.call(el_window);
899900
})
900901
}
901902

src/puter-js/src/modules/UI.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import FSItem from './FSItem.js';
22
import PuterDialog from './PuterDialog.js';
33
import EventListener from '../lib/EventListener.js';
4+
import putility from '@heyputer/putility';
5+
6+
const FILE_SAVE_CANCELLED = Symbol('FILE_SAVE_CANCELLED');
47

58
// AppConnection provides an API for interacting with another app.
69
// It's returned by UI methods, and cannot be constructed directly by user code.
@@ -467,6 +470,10 @@ class UI extends EventListener {
467470
// execute callback
468471
this.#callbackFunctions[e.data.original_msg_id](new FSItem(e.data.saved_file));
469472
}
473+
else if(e.data.msg === "fileSaveCancelled"){
474+
// execute callback
475+
this.#callbackFunctions[e.data.original_msg_id](FILE_SAVE_CANCELLED);
476+
}
470477
else{
471478
// execute callback
472479
this.#callbackFunctions[e.data.original_msg_id](e.data);
@@ -726,7 +733,8 @@ class UI extends EventListener {
726733
}
727734

728735
showSaveFilePicker = function(content, suggestedName, type){
729-
return new Promise((resolve, reject) => {
736+
const undefinedOnCancel = new putility.libs.promise.TeePromise();
737+
const resolveOnlyPromise = new Promise((resolve, reject) => {
730738
if (!globalThis.open) {
731739
return reject("This API is not compatible in Web Workers.");
732740
}
@@ -782,8 +790,20 @@ class UI extends EventListener {
782790
'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
783791
}
784792
//register callback
785-
this.#callbackFunctions[msg_id] = resolve;
786-
})
793+
this.#callbackFunctions[msg_id] = (maybe_result) => {
794+
// Only resolve cancel events if this was called with `.undefinedOnCancel`
795+
if ( maybe_result === FILE_SAVE_CANCELLED ) {
796+
undefinedOnCancel.resolve(undefined);
797+
return;
798+
}
799+
undefinedOnCancel.resolve(maybe_result);
800+
resolve(maybe_result);
801+
};
802+
});
803+
804+
resolveOnlyPromise.undefinedOnCancel = undefinedOnCancel;
805+
806+
return resolveOnlyPromise;
787807
}
788808

789809
setWindowTitle = function(title, window_id, callback) {

0 commit comments

Comments
 (0)