@@ -13,6 +13,7 @@ For license and copyright information please follow this link:
13
13
#include " ui/boxes/confirm_box.h"
14
14
#include " data/business/data_shortcut_messages.h"
15
15
#include " data/components/scheduled_messages.h"
16
+ #include " data/data_file_origin.h"
16
17
#include " data/data_histories.h"
17
18
#include " data/data_session.h"
18
19
#include " data/data_web_page.h"
@@ -252,12 +253,100 @@ mtpRequestId EditTextMessage(
252
253
Data::WebPageDraft webpage,
253
254
SendOptions options,
254
255
Fn<void (mtpRequestId requestId)> done,
255
- Fn<void(const QString &, mtpRequestId requestId)> fail) {
256
+ Fn<void(const QString &error, mtpRequestId requestId)> fail,
257
+ std::optional<bool> spoilerMediaOverride) {
258
+ if (spoilerMediaOverride) {
259
+ const auto spoiler = *spoilerMediaOverride;
260
+ if (const auto media = item->media ()) {
261
+ auto takeInputMedia = Fn<std::optional<MTPInputMedia>()>(nullptr );
262
+ auto takeFileReference = Fn<QByteArray ()>(nullptr );
263
+ if (const auto photo = media->photo ()) {
264
+ using Flag = MTPDinputMediaPhoto::Flag;
265
+ const auto flags = Flag ()
266
+ | (media->ttlSeconds () ? Flag::f_ttl_seconds : Flag ())
267
+ | (spoiler ? Flag::f_spoiler : Flag ());
268
+ takeInputMedia = [=] {
269
+ return MTP_inputMediaPhoto (
270
+ MTP_flags (flags),
271
+ photo->mtpInput (),
272
+ MTP_int (media->ttlSeconds ()));
273
+ };
274
+ takeFileReference = [=] { return photo->fileReference (); };
275
+ } else if (const auto document = media->document ()) {
276
+ using Flag = MTPDinputMediaDocument::Flag;
277
+ const auto flags = Flag ()
278
+ | (media->ttlSeconds () ? Flag::f_ttl_seconds : Flag ())
279
+ | (spoiler ? Flag::f_spoiler : Flag ());
280
+ takeInputMedia = [=] {
281
+ return MTP_inputMediaDocument (
282
+ MTP_flags (flags),
283
+ document->mtpInput (),
284
+ MTP_int (media->ttlSeconds ()),
285
+ MTPstring ()); // query
286
+ };
287
+ takeFileReference = [=] { return document->fileReference (); };
288
+ }
289
+
290
+ const auto usedFileReference = takeFileReference
291
+ ? takeFileReference ()
292
+ : QByteArray ();
293
+ const auto origin = item->fullId ();
294
+ const auto api = &item->history ()->session ().api ();
295
+ const auto performRequest = [=](
296
+ const auto &repeatRequest,
297
+ mtpRequestId originalRequestId) -> mtpRequestId {
298
+ const auto handleReference = [=](
299
+ const QString &error,
300
+ mtpRequestId requestId) {
301
+ if (error.startsWith (u" FILE_REFERENCE_" _q)) {
302
+ api->refreshFileReference (origin, [=](const auto &) {
303
+ if (takeFileReference &&
304
+ (takeFileReference () != usedFileReference)) {
305
+ repeatRequest (
306
+ repeatRequest,
307
+ originalRequestId
308
+ ? originalRequestId
309
+ : requestId);
310
+ } else {
311
+ fail (error, requestId);
312
+ }
313
+ });
314
+ } else {
315
+ fail (error, requestId);
316
+ }
317
+ };
318
+ const auto callback = [=](
319
+ Fn<void ()> applyUpdates,
320
+ mtpRequestId requestId) {
321
+ applyUpdates ();
322
+ done (originalRequestId ? originalRequestId : requestId);
323
+ };
324
+ const auto requestId = EditMessage (
325
+ item,
326
+ caption,
327
+ webpage,
328
+ options,
329
+ callback,
330
+ handleReference,
331
+ takeInputMedia ? takeInputMedia () : std::nullopt);
332
+ return originalRequestId ? originalRequestId : requestId;
333
+ };
334
+ return performRequest (performRequest, 0 );
335
+ }
336
+ }
337
+
256
338
const auto callback = [=](Fn<void ()> applyUpdates, mtpRequestId id) {
257
339
applyUpdates ();
258
340
done (id);
259
341
};
260
- return EditMessage (item, caption, webpage, options, callback, fail);
342
+ return EditMessage (
343
+ item,
344
+ caption,
345
+ webpage,
346
+ options,
347
+ callback,
348
+ fail,
349
+ std::nullopt);
261
350
}
262
351
263
352
} // namespace Api
0 commit comments