Skip to content

Commit cfb1fde

Browse files
authored
Add Set as Status to the emoji pack preview (#120)
* Add Set as Status to the emoji pack preview menu * Keep the emoji status request alive after the menu closes * Update the emoji status menu tests for the preview menu and kept requests
1 parent aaae7e9 commit cfb1fde

3 files changed

Lines changed: 15 additions & 8 deletions

File tree

‎packages/EntertainmentUI/Sources/EntertainmentUI/EmojiStatusMenuAction.swift‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ final class EmojiStatusMenuAction {
2020
self.operationId = operationId
2121
let pending = MetaDisposable()
2222
self.disposable.set(pending)
23-
let signal = context.engine.accountData.setEmojiStatus(file: file, expirationDate: nil)
23+
let applied = ValuePromise<Bool>(false, ignoreRepeated: true)
24+
_ = context.engine.accountData.setEmojiStatus(file: file, expirationDate: nil).startStandalone(completed: {
25+
applied.set(true)
26+
})
27+
let signal = applied.get()
28+
|> filter { $0 }
29+
|> take(1)
30+
|> ignoreValues
2431
|> deliverOnMainQueue
2532
|> afterDisposed { [weak self] in
2633
Queue.mainQueue().justDispatch { [weak self] in

‎packages/EntertainmentUI/Sources/EntertainmentUI/EmojiesSectionRowItem.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ public final class EmojiesSectionRowItem : GeneralRowItem {
340340
if context.isPremium {
341341
if let view = self.view as? EmojiesSectionRowView, let file = view.itemUnderMouse?.0.file, file.isCustomEmoji {
342342
switch mode {
343-
case .panel:
343+
case .panel, .preview:
344344
setStatus = .init(strings().emojiContextSetStatus, handler: { [weak self] in
345345
guard let self else { return }
346346
let window = self.context.window

‎tools/tests/emoji-status-menu/EmojiStatusMenuTests.swift‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,22 @@ final class EmojiStatusMenuTests: XCTestCase {
7373
func testDuplicateClicksSharePendingRequest() { let c = Context(); let r = Row(c); let menu = r.menu()!; menu.handler(); menu.handler(); XCTAssertEqual(c.engine.accountData.requests.count, 1) }
7474
func testNewChoiceAfterCompletion() { let c = Context(); let r = Row(c); let menu = r.menu()!; menu.handler(); c.engine.accountData.requests[0].accept(); menu.handler(); XCTAssertEqual(c.engine.accountData.requests.count, 2); c.engine.accountData.requests[1].accept(); XCTAssertEqual(c.window.messages, ["Success", "Success"]) }
7575
func testOldDisposalCannotClearNewRequest() { let c = Context(); let r = Row(c); let menu = r.menu()!; menu.handler(); c.engine.accountData.requests[0].accept(); menu.handler(); Queue.main.drain(); menu.handler(); XCTAssertEqual(c.engine.accountData.requests.count, 2) }
76-
func testProgressCancellationIsSilentAndRetryable() { let c = Context(); let r = Row(c); let menu = r.menu()!; menu.handler(); XCTAssertEqual(Progress.pending.count, 1); Progress.pending.first?.dispose(); Queue.main.drain(); menu.handler(); XCTAssertEqual(c.engine.accountData.requests.count, 2); XCTAssertTrue(c.engine.accountData.requests[0].disposed); XCTAssertTrue(c.window.messages.isEmpty) }
76+
func testProgressCancellationIsSilentAndRetryable() { let c = Context(); let r = Row(c); let menu = r.menu()!; menu.handler(); XCTAssertEqual(Progress.pending.count, 1); Progress.pending.first?.dispose(); Queue.main.drain(); menu.handler(); XCTAssertEqual(c.engine.accountData.requests.count, 2); XCTAssertFalse(c.engine.accountData.requests[0].disposed); XCTAssertTrue(c.window.messages.isEmpty) }
7777
func testLateSuccessAfterCancellationIsIgnored() { let c = Context(); let r = Row(c); r.menu()!.handler(); Progress.pending.first?.dispose(); Queue.main.drain(); c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.window.messages.isEmpty) }
78-
func testRowReleaseCancelsRequest() { let c = Context(); var r: Row? = Row(c); weak var weakRow = r; r!.menu()!.handler(); r = nil; XCTAssertNil(weakRow); XCTAssertTrue(c.engine.accountData.requests[0].disposed); c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.window.messages.isEmpty) }
78+
func testRowReleaseKeepsRequest() { let c = Context(); var r: Row? = Row(c); weak var weakRow = r; r!.menu()!.handler(); r = nil; XCTAssertNil(weakRow); XCTAssertFalse(c.engine.accountData.requests[0].disposed); c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.window.messages.isEmpty) }
7979
func testRetainedMenuDoesNotKeepRowOrContextAlive() { var c: Context? = Context(); var r: Row? = Row(c!); weak var weakContext = c; weak var weakRow = r; let menu = r!.menu()!; r = nil; c = nil; XCTAssertNil(weakRow); XCTAssertNil(weakContext); menu.handler() }
80-
func testPendingRequestDoesNotKeepContextAlive() { var c: Context? = Context(); var r: Row? = Row(c!); let engine = c!.engine; weak var weakContext = c; r!.menu()!.handler(); r = nil; c = nil; XCTAssertNil(weakContext); XCTAssertTrue(engine.accountData.requests[0].disposed) }
80+
func testPendingRequestDoesNotKeepContextAlive() { var c: Context? = Context(); var r: Row? = Row(c!); let engine = c!.engine; weak var weakContext = c; r!.menu()!.handler(); r = nil; c = nil; XCTAssertNil(weakContext); XCTAssertFalse(engine.accountData.requests[0].disposed) }
8181
func testWindowReplacementSuppressesFeedback() { let c = Context(); let r = Row(c); let old = c.window; r.menu()!.handler(); c.window = Window(); c.engine.accountData.requests[0].accept(); XCTAssertTrue(old.messages.isEmpty); XCTAssertTrue(c.window.messages.isEmpty) }
8282
func testPremiumIsCheckedAtInvocation() { let c = Context(); let r = Row(c); let menu = r.menu()!; c.isPremium = false; menu.handler(); XCTAssertTrue(c.engine.accountData.requests.isEmpty) }
8383
func testNonPremiumHasNoMenuAction() { let c = Context(); c.isPremium = false; XCTAssertNil(Row(c).menu()) }
84-
func testOnlyPanelOffersAction() { let r = Row(Context()); for mode in [Row.Mode.preview, .statuses] { r.mode = mode; XCTAssertNil(r.menu()) } }
84+
func testPanelAndPreviewOfferAction() { let r = Row(Context()); for mode in [Row.Mode.panel, .preview] { r.mode = mode; XCTAssertNotNil(r.menu()) }; r.mode = .statuses; XCTAssertNil(r.menu()) }
8585
func testBuiltinEmojiHasNoStatusAction() { let r = Row(Context()); (r.view as! EmojiesSectionRowView).itemUnderMouse = (.init(file: TelegramMediaFile(custom: false)), 0); XCTAssertNil(r.menu()) }
8686
func testFileRevalidatedAtInvocation() { let c = Context(); let r = Row(c); let file = (r.view as! EmojiesSectionRowView).itemUnderMouse!.0.file; let menu = r.menu()!; file.isCustomEmoji = false; menu.handler(); XCTAssertTrue(c.engine.accountData.requests.isEmpty) }
8787
func testExactFileAndIndefiniteExpiration() { let c = Context(); let r = Row(c); r.menu()!.handler(); XCTAssertEqual(c.engine.accountData.requests[0].file?.id, 10); XCTAssertNil(c.engine.accountData.requests[0].expiry) }
8888
func testSynchronousSuccessAllowsNextChoice() { let c = Context(); let r = Row(c); c.engine.accountData.onSubscribe = { $0.accept() }; let menu = r.menu()!; menu.handler(); menu.handler(); XCTAssertEqual(c.window.messages, ["Success", "Success"]); XCTAssertTrue(c.engine.accountData.requests.allSatisfy { $0.disposed }) }
8989
func testDuplicateTerminalEventsDoNotRepeatToast() { let c = Context(); let r = Row(c); r.menu()!.handler(); let q = c.engine.accountData.requests[0]; q.accept(); q.accept(); q.reject(); XCTAssertEqual(c.window.messages, ["Success"]) }
90-
func testResetDuringDisposalSuppressesFeedback() { let c = Context(); let a = EmojiStatusMenuAction(); a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { true }); c.engine.accountData.requests[0].onDispose = { a.reset() }; c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.window.messages.isEmpty) }
90+
func testCompletedRequestIsReleased() { let c = Context(); let a = EmojiStatusMenuAction(); a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { true }); c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.engine.accountData.requests[0].disposed); XCTAssertEqual(c.window.messages, ["Success"]) }
9191
func testResetDuringPresentationCheckSuppressesFeedback() { let c = Context(); let a = EmojiStatusMenuAction(); var checks = 0; a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { checks += 1; if checks > 1 { a.reset() }; return true }); c.engine.accountData.requests[0].accept(); XCTAssertTrue(c.window.messages.isEmpty) }
92-
func testReentrantNewRequestSurvivesOldCompletion() { let c = Context(); let a = EmojiStatusMenuAction(); a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { true }); c.engine.accountData.requests[0].onDispose = { a.reset(); a.perform(context: c, file: TelegramMediaFile(20), window: c.window, canPresent: { true }) }; c.engine.accountData.requests[0].accept(); Queue.main.drain(); XCTAssertEqual(c.engine.accountData.requests.count, 2); XCTAssertFalse(c.engine.accountData.requests[1].disposed); XCTAssertTrue(c.window.messages.isEmpty); c.engine.accountData.requests[1].accept(); XCTAssertEqual(c.window.messages, ["Success"]) }
92+
func testReentrantNewRequestSurvivesOldCompletion() { let c = Context(); let a = EmojiStatusMenuAction(); var checks = 0; a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { checks += 1; if checks == 2 { a.reset(); a.perform(context: c, file: TelegramMediaFile(20), window: c.window, canPresent: { true }) }; return true }); c.engine.accountData.requests[0].accept(); Queue.main.drain(); XCTAssertEqual(c.engine.accountData.requests.count, 2); XCTAssertFalse(c.engine.accountData.requests[1].disposed); XCTAssertTrue(c.window.messages.isEmpty); c.engine.accountData.requests[1].accept(); XCTAssertEqual(c.window.messages, ["Success"]) }
9393
func testUnavailablePresentationDoesNotStart() { let c = Context(); let a = EmojiStatusMenuAction(); a.perform(context: c, file: TelegramMediaFile(), window: c.window, canPresent: { false }); XCTAssertTrue(c.engine.accountData.requests.isEmpty) }
9494
}

0 commit comments

Comments
 (0)