@@ -15,72 +15,64 @@ const path = require('path');
15
15
class FilesystemProxy {
16
16
constructor ( ) {
17
17
this . _exportHandler = this . _exportHandler . bind ( this ) ;
18
- this . _fileSavedHandler = this . _fileSavedHandler . bind ( this ) ;
19
18
}
20
19
21
20
listen ( ) {
22
21
window . addEventListener ( 'file-data-save' , this . _exportHandler ) ;
23
- ipc . on ( 'saved-file' , this . _fileSavedHandler ) ;
24
22
}
25
23
26
24
unlisten ( ) {
27
25
window . removeEventListener ( 'file-data-save' , this . _exportHandler ) ;
28
- ipc . removeListener ( 'saved-file' , this . _fileSavedHandler ) ;
29
- }
30
-
31
- _clear ( ) {
32
- this . lastType = undefined ;
33
- this . lastContent = undefined ;
34
- this . lastResolve = undefined ;
35
- this . lastReject = undefined ;
36
26
}
37
27
38
28
_exportHandler ( e ) {
39
29
if ( e . defaultPrevented ) {
40
30
return ;
41
31
}
42
32
e . preventDefault ( ) ;
43
- const { content, file, options } = e . detail ;
44
- e . detail . result = this . exportFileData ( content , options && options . contentType , file ) ;
33
+ const { content, file, options= { } } = e . detail ;
34
+ e . detail . result = this . exportFileData ( content , options . contentType , file ) ;
45
35
}
46
-
47
- exportFileData ( content , mime , file ) {
48
- ipc . send ( 'save-dialog' , {
36
+ /**
37
+ * Requests a save file dialog and saves the data to selected path if not cancelled.
38
+ * This does nothing when dialog is canceled.
39
+ *
40
+ * @param {String|Object|Buffer } content Data to write
41
+ * @param {String= } mime Content media type. Currently only `application/json` is
42
+ * supported when the `content` is an object or an array.
43
+ * @param {String= } file Suggested file name
44
+ * @return {Promise }
45
+ */
46
+ async exportFileData ( content , mime , file ) {
47
+ const opts = {
49
48
file
50
- } ) ;
51
- this . lastContent = content ;
52
- this . lastType = mime ;
53
- new Promise ( ( resolve , reject ) => {
54
- this . lastResolve = resolve ;
55
- this . lastReject = reject ;
56
- } ) ;
57
- }
58
-
59
- _fileSavedHandler ( e , selectedPath ) {
60
- if ( ! selectedPath ) {
61
- this . lastResolve ( ) ;
62
- this . _clear ( ) ;
49
+ } ;
50
+ const result = await ipc . invoke ( 'save-dialog' , opts )
51
+ const { filePath, canceled } = result ;
52
+ if ( canceled ) {
63
53
return ;
64
54
}
65
- return this . _writeContent ( selectedPath )
66
- . then ( ( ) => this . lastResolve ( ) )
67
- . catch ( ( cause ) => this . lastReject ( cause ) )
68
- . then ( ( ) => this . _clear ( ) ) ;
55
+ await this . _writeContent ( filePath , content , mime ) ;
69
56
}
70
-
71
- _writeContent ( path ) {
72
- let data = this . lastContent ;
73
- if ( typeof data !== 'string' ) {
74
- data = this . _prepareData ( data ) ;
57
+ /**
58
+ * Writes content to a file
59
+ * @param {String } path Absolute path to a file
60
+ * @param {String|Object|Buffer } content Data to be written
61
+ * @param {String= } mime Content media type.
62
+ * @return {Promise }
63
+ */
64
+ _writeContent ( path , content , mime ) {
65
+ if ( typeof content !== 'string' ) {
66
+ content = this . _prepareData ( content , mime ) ;
75
67
}
76
- return fs . writeFile ( path , data , 'utf8' ) ;
68
+ return fs . writeFile ( path , content , 'utf8' ) ;
77
69
}
78
70
79
- _prepareData ( data ) {
80
- switch ( this . lastType ) {
71
+ _prepareData ( data , mime ) {
72
+ switch ( mime ) {
81
73
case 'application/json' : return JSON . stringify ( data ) ;
74
+ default : return String ( data ) ;
82
75
}
83
- return String ( data ) ;
84
76
}
85
77
/**
86
78
* Allows to read file from user filesystem.
0 commit comments