import Foundation import UIKit import Postbox import SwiftSignalKit import TelegramUIPreferences private struct WebSearchRecentQueryItemId { public let rawValue: MemoryBuffer var value: String { return String(data: self.rawValue.makeData(), encoding: .utf8) ?? "" } init(_ rawValue: MemoryBuffer) { self.rawValue = rawValue } init?(_ value: String) { if let data = value.data(using: .utf8) { self.rawValue = MemoryBuffer(data: data) } else { return nil } } } public final class RecentWebSearchQueryItem: OrderedItemListEntryContents { init() { } public init(decoder: PostboxDecoder) { } public func encode(_ encoder: PostboxEncoder) { } } func addRecentWebSearchQuery(postbox: Postbox, string: String) -> Signal { return postbox.transaction { transaction in if let itemId = WebSearchRecentQueryItemId(string) { transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentWebSearchQueryItem()), removeTailIfCountExceeds: 100) } } } func removeRecentWebSearchQuery(postbox: Postbox, string: String) -> Signal { return postbox.transaction { transaction -> Void in if let itemId = WebSearchRecentQueryItemId(string) { transaction.removeOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries, itemId: itemId.rawValue) } } } func clearRecentWebSearchQueries(postbox: Postbox) -> Signal { return postbox.transaction { transaction -> Void in transaction.replaceOrderedItemListItems(collectionId: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries, items: []) } } func webSearchRecentQueries(postbox: Postbox) -> Signal<[String], NoError> { return postbox.combinedView(keys: [.orderedItemList(id: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries)]) |> mapToSignal { view -> Signal<[String], NoError> in return postbox.transaction { transaction -> [String] in var result: [String] = [] if let view = view.views[.orderedItemList(id: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries)] as? OrderedItemListView { for item in view.items { let value = WebSearchRecentQueryItemId(item.id).value result.append(value) } } return result } } }