|
1 | 1 | import FSItem from './FSItem.js'; |
2 | 2 | import PuterDialog from './PuterDialog.js'; |
3 | 3 | import EventListener from '../lib/EventListener.js'; |
| 4 | +import putility from '@heyputer/putility'; |
| 5 | + |
| 6 | +const FILE_SAVE_CANCELLED = Symbol('FILE_SAVE_CANCELLED'); |
4 | 7 |
|
5 | 8 | // AppConnection provides an API for interacting with another app. |
6 | 9 | // It's returned by UI methods, and cannot be constructed directly by user code. |
@@ -467,6 +470,10 @@ class UI extends EventListener { |
467 | 470 | // execute callback |
468 | 471 | this.#callbackFunctions[e.data.original_msg_id](new FSItem(e.data.saved_file)); |
469 | 472 | } |
| 473 | + else if(e.data.msg === "fileSaveCancelled"){ |
| 474 | + // execute callback |
| 475 | + this.#callbackFunctions[e.data.original_msg_id](FILE_SAVE_CANCELLED); |
| 476 | + } |
470 | 477 | else{ |
471 | 478 | // execute callback |
472 | 479 | this.#callbackFunctions[e.data.original_msg_id](e.data); |
@@ -726,7 +733,8 @@ class UI extends EventListener { |
726 | 733 | } |
727 | 734 |
|
728 | 735 | 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) => { |
730 | 738 | if (!globalThis.open) { |
731 | 739 | return reject("This API is not compatible in Web Workers."); |
732 | 740 | } |
@@ -782,8 +790,20 @@ class UI extends EventListener { |
782 | 790 | 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); |
783 | 791 | } |
784 | 792 | //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; |
787 | 807 | } |
788 | 808 |
|
789 | 809 | setWindowTitle = function(title, window_id, callback) { |
|
0 commit comments