@@ -34,6 +34,8 @@ class DetailViewController: NSViewController {
34
34
35
35
private var isMultiFuncViewShowing = false
36
36
37
+ private var newTabURL : String ?
38
+
37
39
init ( session: Session ) {
38
40
self . session = session
39
41
super. init ( nibName: " DetailViewController " , bundle: Bundle . main)
@@ -82,7 +84,7 @@ class DetailViewController: NSViewController {
82
84
btnAction. isEnabled = true
83
85
containerViewActionInput. isHidden = false
84
86
containerViewActions. isHidden = true
85
-
87
+ txtfieldAction . placeholderString = " Session name "
86
88
txtfieldAction. stringValue = session. title
87
89
txtfieldAction. becomeFirstResponder ( )
88
90
}
@@ -92,6 +94,7 @@ class DetailViewController: NSViewController {
92
94
btnAction. isEnabled = false
93
95
containerViewActionInput. isHidden = false
94
96
containerViewActions. isHidden = true
97
+ txtfieldAction
. placeholderString
= " [email protected] "
95
98
txtfieldAction. becomeFirstResponder ( )
96
99
}
97
100
@@ -123,28 +126,30 @@ class DetailViewController: NSViewController {
123
126
}
124
127
125
128
private func share( with email: String ) {
126
- do {
127
- let jsonEncoder = JSONEncoder ( )
128
- jsonEncoder. outputFormatting = . prettyPrinted
129
- let data = try jsonEncoder. encode ( ImportExportData ( data: [ session] ) )
130
-
131
- let tempDir = try FileManager . default. url ( for: . cachesDirectory, in: . userDomainMask, appropriateFor: nil , create: false )
132
- let fileURL = tempDir. appendingPathComponent ( " \( Date ( ) . saveFileStringFormat ( ) ) .json " )
133
-
134
- try data. write ( to: fileURL)
135
-
136
- let sharingService = NSSharingService ( named: . composeEmail)
137
- sharingService? . delegate = self
138
-
139
- sharingService? . recipients = [ email]
140
- sharingService? . subject = " Sharing my Session Buddy session "
141
- let items : [ Any ] = [ " see attachment " , fileURL]
142
- sharingService? . perform ( withItems: items)
143
-
144
- } catch {
145
- NSLog ( error. localizedDescription)
146
- Util . showErrorDialog ( text: " Data is corrupted, please contact us for more support " )
147
- }
129
+ guard let session =
130
+ LocalStorage . sessions. first ( where: { $0. id == self . session. id } )
131
+ else { return }
132
+
133
+ let jsonEncoder = JSONEncoder ( )
134
+ jsonEncoder. outputFormatting = . prettyPrinted
135
+
136
+ guard
137
+ let subjectEncoded = " [Session Buddy] Share my session " . addingPercentEncoding ( withAllowedCharacters: . urlHostAllowed) ,
138
+ let bodyEncodedData = try ? jsonEncoder. encode ( session) ,
139
+ var body = String ( data: bodyEncodedData, encoding: . utf8)
140
+ else { return }
141
+
142
+ body = """
143
+ Please copy the content below and save it as file.json to import in Session Buddy
144
+
145
+ \( body)
146
+ """
147
+ guard
148
+ let bodyEncoded = body. addingPercentEncoding ( withAllowedCharacters: . alphanumerics) ,
149
+ let defaultUrl = URL ( string: " mailto: \( email) ?subject= \( subjectEncoded) &body= \( bodyEncoded) " )
150
+ else { return }
151
+
152
+ NSWorkspace . shared. open ( defaultUrl)
148
153
}
149
154
150
155
@IBAction func deleteSession( _ sender: Any ) {
@@ -167,9 +172,15 @@ class DetailViewController: NSViewController {
167
172
tab? . getActivePage ( completionHandler: { page in
168
173
page? . getPropertiesWithCompletionHandler { properties in
169
174
DispatchQueue . main. async {
170
- self . txtfieldURL. stringValue = properties? . url? . absoluteString ?? " "
175
+ guard
176
+ let title = properties? . title,
177
+ let url = properties? . url
178
+ else { return }
179
+
180
+ self . txtfieldURL. stringValue = title
171
181
self . txtfieldURL. becomeFirstResponder ( )
172
182
self . btnAdd. isEnabled = !self . txtfieldURL. stringValue. isEmpty
183
+ self . newTabURL = url. absoluteString
173
184
}
174
185
}
175
186
} )
@@ -187,9 +198,12 @@ class DetailViewController: NSViewController {
187
198
self . containerEditview. isHidden = true
188
199
self . btnAddUrl. isHidden = false
189
200
190
- guard !txtfieldURL. stringValue. isEmpty else { return }
201
+ guard
202
+ !txtfieldURL. stringValue. isEmpty,
203
+ let url = self . newTabURL
204
+ else { return }
191
205
192
- let newTab = Tab ( title: txtfieldURL. stringValue, url: txtfieldURL . stringValue )
206
+ let newTab = Tab ( title: txtfieldURL. stringValue, url: url )
193
207
self . tabs. append ( newTab)
194
208
self . updateSession ( with: self . tabs)
195
209
@@ -215,7 +229,7 @@ extension DetailViewController: NSTableViewDelegate {
215
229
216
230
cell. set (
217
231
title: tabs [ row] . title,
218
- onDelete: self . onDelete ( at : row)
232
+ onDelete: self . onDelete ( id : tabs [ row] . id )
219
233
)
220
234
221
235
return cell
@@ -231,13 +245,15 @@ extension DetailViewController: NSTableViewDelegate {
231
245
return false
232
246
}
233
247
234
- private func onDelete( at index : Int ) -> ( ( ) -> Void ) {
248
+ private func onDelete( id : String ) -> ( ( ) -> Void ) {
235
249
return {
236
- self . tabs. remove ( at: index)
250
+ guard let idx = self . tabs. firstIndex ( where: { $0. id == id } ) else { return }
251
+
252
+ self . tabs. remove ( at: idx)
237
253
self . updateSession ( with: self . tabs)
238
254
239
255
DispatchQueue . main. async {
240
- self . tableView. removeRows ( at: . init( integer: index ) , withAnimation: . effectFade)
256
+ self . tableView. removeRows ( at: . init( integer: idx ) , withAnimation: . effectFade)
241
257
}
242
258
243
259
self . shouldReload = true
0 commit comments