From b8ff7c81c5b82f02792a78a891d593341de9a80b Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Fri, 11 Nov 2022 16:53:48 +0530 Subject: [PATCH 01/10] subscribe ongoing --- .../Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Search/WEVDiscoverSearchView.swift | 21 +- .../WEVDiscover/WEVDiscoverRootNode.swift | 19 +- .../Sources/WEVRootViewController.swift | 4 +- .../WEVSubscribeController.swift | 138 ++++++ .../WEVSubscribeControllerNode.swift | 407 ++++++++++++++++++ .../WEVSubscribeTableViewCell.swift | 170 ++++++++ .../RSS_Feed.imageset/Contents.json | 23 + .../RSS_Feed.imageset/RSS Feed.png | Bin 0 -> 725 bytes .../RSS_Feed.imageset/RSS Feed@2x.png | Bin 0 -> 1267 bytes .../RSS_Feed.imageset/RSS Feed@3x.png | Bin 0 -> 1829 bytes .../clock.imageset/Contents.json | 23 + .../Images.xcassets/clock.imageset/clock.png | Bin 0 -> 500 bytes .../clock.imageset/clock@2x.png | Bin 0 -> 954 bytes .../clock.imageset/clock@3x.png | Bin 0 -> 1393 bytes 15 files changed, 795 insertions(+), 11 deletions(-) create mode 100644 submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift create mode 100644 submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift create mode 100644 submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift create mode 100644 submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed.png create mode 100644 submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/clock.imageset/clock.png create mode 100644 submodules/TelegramUI/Images.xcassets/clock.imageset/clock@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/clock.imageset/clock@3x.png diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 96d86509c3f..4875972883a 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7210,6 +7210,7 @@ Sorry for the inconvenience."; "ChatSettings.StickersAndReactions" = "Stickers and Emoji"; "WEV.ShareAndEarn" = "Share to Earn"; "WEV.WatchLater" = "Watch Later"; +"WEV.Subscribe" = "Subscribed" "Localization.TranslateMessages" = "Translate Messages"; "Localization.ShowTranslate" = "Show Translate Button"; diff --git a/submodules/ContactListUI/Sources/Search/WEVDiscoverSearchView.swift b/submodules/ContactListUI/Sources/Search/WEVDiscoverSearchView.swift index 3ef815ee4e2..4169ec57aab 100644 --- a/submodules/ContactListUI/Sources/Search/WEVDiscoverSearchView.swift +++ b/submodules/ContactListUI/Sources/Search/WEVDiscoverSearchView.swift @@ -256,9 +256,15 @@ class WEVDiscoverSearchBar: UIView { guard let presentationData = self.presentationData else { return } - textField.backgroundColor = presentationData.theme.chatList.backgroundColor - textField.textColor = presentationData.theme.list.itemPrimaryTextColor + textField.textColor = presentationData.theme.rootController.navigationSearchBar.inputPlaceholderTextColor //presentationData.theme.list.itemPrimaryTextColor textField.tintColor = presentationData.theme.rootController.tabBar.selectedIconColor + //self.theme?.rootController.navigationBar.opaqueBackgroundColor ?? .clear + let fillColor = presentationData.theme.rootController.navigationSearchBar.inputFillColor + /*if fillColor.distance(to: presentationData.theme.list.blocksBackgroundColor) < 100 { + fillColor = fillColor.withMultipliedBrightnessBy(1.0) + }*/ + textField.backgroundColor = fillColor + filterButton.backgroundColor = fillColor cancelSearchButton.setTitleColor(presentationData.theme.rootController.tabBar.selectedIconColor, for: .normal) } /// 筛选按键 @@ -341,8 +347,9 @@ class WEVDiscoverSearchBar: UIView { /// 筛选按键 private lazy var filterButton: UIButton = { let button = UIButton.init(type: .custom) - button.setImage(UIImage.init(named: "discover_search_filter"), for: .normal) + button.setImage(UIImage.init(named: "RSS_Feed"), for: .normal) button.addTarget(self, action: #selector(filterButtonAction), for: .touchUpInside) + button.layer.cornerRadius = 5 return button }() @@ -357,12 +364,12 @@ class WEVDiscoverSearchBar: UIView { }() private func initView() { - /*addSubview(filterButton) + addSubview(filterButton) filterButton.snp.makeConstraints { (make) in make.right.equalToSuperview().offset(-10) make.size.equalTo(CGSize(width: 40, height: 40)) make.centerY.equalToSuperview() - }*/ + } addSubview(cancelSearchButton) cancelSearchButton.snp.makeConstraints { (make) in @@ -374,7 +381,7 @@ class WEVDiscoverSearchBar: UIView { addSubview(textField) textField.snp.makeConstraints { (make) in make.left.equalToSuperview().offset(10) - make.right.equalToSuperview().offset(-10) + make.right.equalToSuperview().offset(-60) make.centerY.equalToSuperview() make.height.equalTo(40) } @@ -391,7 +398,7 @@ class WEVDiscoverSearchBar: UIView { cancelSearchButton.isHidden = true filterButton.isHidden = false textField.snp.updateConstraints { (make) in - make.right.equalToSuperview().offset(-10) + make.right.equalToSuperview().offset(-60) } case .searching, .searchCompleted: cancelSearchButton.isHidden = false diff --git a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift index 7cf22122387..d4d14cfa122 100644 --- a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift +++ b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift @@ -205,7 +205,7 @@ public class WEVDiscoverRootNode: ASDisplayNode { view.presentationData = self.presentationData view.filterAction = {[weak self] in guard let self = self else {return} - let vc = WEVDiscoverFilterViewController(allChannel: WEVChannel.allCases, selectedArray: self.selectedChannelArray) + /*let vc = WEVDiscoverFilterViewController(allChannel: WEVChannel.allCases, selectedArray: self.selectedChannelArray) vc.selectedArray = self.selectedChannelArray vc.didSelected = {[weak self] channelArray in guard let self = self else {return} @@ -225,8 +225,23 @@ public class WEVDiscoverRootNode: ASDisplayNode { //fetch filter data self.selectedChannelArray = channelArray self.scrollViewLoadData(isHeadRefesh: true) + }*/ + let push: (ViewController) -> Void = { [weak self] c in + guard let strongSelf = self, let navigationController = strongSelf.controller?.navigationController as? NavigationController else { + return + } + var updatedControllers = navigationController.viewControllers + for controller in navigationController.viewControllers.reversed() { + if controller !== strongSelf && !(controller is TabBarController) { + updatedControllers.removeLast() + } else { + break + } + } + updatedControllers.append(c) + navigationController.setViewControllers(updatedControllers, animated: true) } - self.controller.present(vc, animated: true, completion: nil) + push(WEVSubscribeController(context: self.context)) } view.cancelAction = {[weak self] in diff --git a/submodules/ContactListUI/Sources/WEVRootViewController.swift b/submodules/ContactListUI/Sources/WEVRootViewController.swift index c7ad5ce3cd3..a3722f12176 100644 --- a/submodules/ContactListUI/Sources/WEVRootViewController.swift +++ b/submodules/ContactListUI/Sources/WEVRootViewController.swift @@ -103,7 +103,7 @@ public class WEVRootViewController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style - self.title = "Discover"//self.presentationData.strings.Contacts_Title + self.title = "" //"Discover"//self.presentationData.strings.Contacts_Title self.tabBarItem.title = "Discover" /*if !self.presentationData.reduceMotion { self.tabBarItem.animationName = "discover" @@ -192,7 +192,7 @@ public class WEVRootViewController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) - self.title = "Discover" //self.presentationData.strings.Contacts_Title + self.title = "" //"Discover" //self.presentationData.strings.Contacts_Title self.tabBarItem.title = "Discover"//self.presentationData.strings.Contacts_Title /*if !self.presentationData.reduceMotion { diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift new file mode 100644 index 00000000000..da6af29a0d3 --- /dev/null +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift @@ -0,0 +1,138 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import SwiftSignalKit +import TelegramCore +import TelegramPresentationData +import AccountContext +import SearchUI + +public class WEVSubscribeController: ViewController { + private let context: AccountContext + + private var controllerNode: WEVSubscribeControllerNode { + return self.displayNode as! WEVSubscribeControllerNode + } + + private var _ready = Promise() + override public var ready: Promise { + return self._ready + } + + private var presentationData: PresentationData + private var presentationDataDisposable: Disposable? + + private var editItem: UIBarButtonItem! + private var doneItem: UIBarButtonItem! + + private var previousContentOffset: ListViewVisibleContentOffset? + + + public init(context: AccountContext) { + self.context = context + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) + + self.editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + self.doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + + self.title = self.presentationData.strings.WEV_Subscribe + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + + self.presentationDataDisposable = (context.sharedContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + let previousTheme = strongSelf.presentationData.theme + let previousStrings = strongSelf.presentationData.strings + + strongSelf.presentationData = presentationData + + if previousTheme !== presentationData.theme || previousStrings !== presentationData.strings { + strongSelf.updateThemeAndStrings() + } + } + }) + + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + self.presentationDataDisposable?.dispose() + } + + private func updateThemeAndStrings() { + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) + //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) + self.title = self.presentationData.strings.Settings_AppLanguage + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.controllerNode.updatePresentationData(self.presentationData) + + let editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + let doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + if self.navigationItem.rightBarButtonItem === self.editItem { + self.navigationItem.rightBarButtonItem = editItem + } else if self.navigationItem.rightBarButtonItem === self.doneItem { + self.navigationItem.rightBarButtonItem = doneItem + } + self.editItem = editItem + self.doneItem = doneItem + } + + override public func loadDisplayNode() { + self.displayNode = WEVSubscribeControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!,controller: self, requestActivateSearch: { [weak self] in + self?.activateSearch() + }, requestDeactivateSearch: { [weak self] in + self?.deactivateSearch() + }, updateCanStartEditing: { [weak self] value in + guard let strongSelf = self else { + return + } + let item: UIBarButtonItem? + if let value = value { + item = value ? strongSelf.editItem : strongSelf.doneItem + } else { + item = nil + } + if strongSelf.navigationItem.rightBarButtonItem !== item { + strongSelf.navigationItem.setRightBarButton(item, animated: true) + } + }, present: { [weak self] c, a in + self?.present(c, in: .window(.root), with: a) + }, push: { [weak self] c in + self?.push(c) + }) + + self._ready.set(self.controllerNode._ready.get()) + + self.navigationBar?.updateBackgroundAlpha(1.0, transition: .immediate) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.cleanNavigationHeight, transition: transition) + } + + @objc private func editPressed() { + self.controllerNode.toggleEditing() + } + + private func activateSearch() { + } + + private func deactivateSearch() { + } +} diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift new file mode 100644 index 00000000000..5ec18caa917 --- /dev/null +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift @@ -0,0 +1,407 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import TelegramCore +import SwiftSignalKit +import TelegramPresentationData +import MergeLists +import ItemListUI +import PresentationDataUtils +import AccountContext +import ShareController +import SearchBarNode +import SearchUI +import UndoUI +import TelegramUIPreferences +import TranslateUI +import PostgREST +import GalleryUI + +final class WEVSubscribeControllerNode: ASDisplayNode { + private let context: AccountContext + private var presentationData: PresentationData + private weak var navigationBar: NavigationBar? + private var controller: WEVSubscribeController! + private let requestActivateSearch: () -> Void + private let requestDeactivateSearch: () -> Void + private let present: (ViewController, Any?) -> Void + private let push: (ViewController) -> Void + + private var didSetReady = false + let _ready = ValuePromise() + + private var containerLayout: (ContainerViewLayout, CGFloat)? + private let presentationDataValue = Promise() + private let isEditing = ValuePromise(false) + private var isEditingValue: Bool = false { + didSet { + self.isEditing.set(self.isEditingValue) + } + } + + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey + var arrSubsribedVideo: [Subs] = [] + private let tableView = UITableView(frame: CGRect.zero, style: .plain) + private var currentLayout: CGSize = .zero + private var client: PostgrestClient? + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVSubscribeController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + self.context = context + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.navigationBar = navigationBar + self.requestActivateSearch = requestActivateSearch + self.requestDeactivateSearch = requestDeactivateSearch + self.present = present + self.push = push + self.controller = controller + print(context.account.id.int64) + print(context.account.peerId.id._internalGetInt64Value()) + print(context.account.peerId) + super.init() + + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + private var navigationController: NavigationController? { + if let navigationController = self.controller.navigationController as? NavigationController { + return navigationController + } + return nil + } + + deinit { + } + + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + let hadValidLayout = self.containerLayout != nil + self.containerLayout = (layout, navigationBarHeight) + + if !hadValidLayout { + self.dequeueTransitions(navigationBarHeight: navigationBarHeight) + } else { + if self.currentLayout != layout.size { + self.updateConstriant(navigationBarHeight: navigationBarHeight) + } + } + self.currentLayout = layout.size + } + + private func dequeueTransitions(navigationBarHeight: CGFloat) { + guard let _ = self.containerLayout else { + return + } + + if !self.didSetReady { + client = PostgrestClient( + url: "\(supabaseUrl)/rest/v1", + headers: ["apikey": supabaseKey], + schema: "public") + self.didSetReady = true + self._ready.set(true) + self.initView(navigationBarHeight: navigationBarHeight) + } + } + + func toggleEditing() { + self.isEditingValue = !self.isEditingValue + } + + private func updateConstriant(navigationBarHeight: CGFloat) { + tableView.snp.remakeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight + 2) + make.left.bottom.right.equalToSuperview() + } + } + + private func initView(navigationBarHeight: CGFloat) { + let tableViewNode = ASDisplayNode { () -> UIView in + return self.tableView + } + self.addSubnode(tableViewNode) + tableView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight + 2) + make.left.bottom.right.equalToSuperview() + } + tableView.backgroundColor = presentationData.theme.chatList.backgroundColor + tableView.delegate = self + tableView.dataSource = self + tableView.separatorStyle = .none + tableView.rowHeight = UITableView.automaticDimension + tableView.estimatedRowHeight = UITableView.automaticDimension + tableView.estimatedSectionHeaderHeight = 0 + tableView.estimatedSectionFooterHeight = 0 + if #available(iOS 11.0, *) { + tableView.contentInsetAdjustmentBehavior = .never + } + tableView.register(WEVWatchLaterTableViewCell.self, forCellReuseIdentifier: "WEVWatchLaterTableViewCell") + + self.arrWatchLater = fetchWatchList() + DispatchQueue.main.async { + self.tableView.reloadData() + } + } +} +extension WEVSubscribeControllerNode: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return arrWatchLater.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "WEVWatchLaterTableViewCell", for: indexPath) as? WEVWatchLaterTableViewCell else { + return UITableViewCell() + } + cell.configureCell(watchLater: arrWatchLater[indexPath.row], presentationData: self.presentationData) + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + print("PlayVideo") + self.playVideo(video: arrWatchLater[indexPath.row]) + } +} +extension WEVSubscribeControllerNode { + + /*func watchLaterRealTimeSync() { + let rt = RealtimeClient(endPoint: "\(supabaseUrl)/realtime/v1", params: ["apikey": supabaseKey]) + + rt.onOpen { + print("Socket opened.") + let allUsersUpdateChanges = rt.channel(.table(LJConfig.SupabaseTablesName.watchLater, schema: "public")) + + allUsersUpdateChanges.on(.all) { message in + } + allUsersUpdateChanges.subscribe() + } + + rt.onError{error in + print("Socket error: ", error.localizedDescription) + } + + rt.onClose { + print("Socket closed") + } + + rt.onMessage{message in + switch message.event { + case .insert, .update, .delete: + self.doWatchLaterFetch() + default: + break + } + } + rt.connect() + }*/ + + func doWatchLaterFetch() { + Task { + await fetchWatchLater() + } + } + + + func fetchWatchLater() async { + guard let client = self.client else { + return + } + + var errMsg = "" + // Get twitch videos + do { + let watchLater = try await client + .from("watch_later_view") + .select() + .eq(column: "user_id", value: "\(context.account.peerId.id._internalGetInt64Value())") + .execute() + .decoded(to: [WatchLaterVideo].self) + + //assign watch later data to array + self.arrWatchLater = watchLater + //get watch later object + for index in 0..>>>>>") + } + } + + func doPerformAddWatchLater(videoObj: NewWatchLaterVideo) { + Task { + await performAddWatchLater(videoObj: videoObj) + } + } + + func performAddWatchLater(videoObj: NewWatchLaterVideo) async { + guard let client = self.client else { + return + } + do { + let insertedVideo = try await client.from("watch_later") + .insert( + values: videoObj, + returning: .representation + ) + .execute() + print(insertedVideo) + self.doWatchLaterFetch() + } catch { + print(error.localizedDescription) + } + } + + func doPerformRemoveWatchLater(id: Int64) { + Task { + await performRemoveWatchLater(id: id) + } + } + + func performRemoveWatchLater(id: Int64) async { + guard let client = self.client else { + return + } + do { + try await client.from("watch_later").delete().eq(column: "id", value: "\(id)").execute() + self.doWatchLaterFetch() + } catch { + print(error.localizedDescription) + } + } + + func playVideo(video: WatchLaterVideo) { + + var videoTitle = "" + var videoDescription = "" + let websiteName = "YouTube" + var url = "" + let isLikedVideo = true + switch video.videoType { + case 1: + guard let title = video.youTubeTitle, let ytId = video.youtubeId else { + return + } + videoTitle = title + videoDescription = video.youTubeDescription ?? "" + url = "https://www.youtube.com/watch?v=" + ytId + case 2: + guard let clipURL = video.clipEmbedUrl, let title = video.clipTitle else { + return + } + url = clipURL + "&autoplay=true&parent=streamernews.example.com&parent=embed.example.com" + videoTitle = title + case 3: + guard let clipURL = video.rumbleEmbedUrl, let title = video.rumbleTitle else { + return + } + url = clipURL + videoTitle = title + default: + return + } + + /*let thumbnail = UIImage(named: "channel_youtube") + var previewRepresentations: [TelegramMediaImageRepresentation] = [] + var finalDimensions = CGSize(width:1280,height:720) + finalDimensions = TGFitSize(finalDimensions,CGSize(width:1280,height:720))*/ + + let size = CGSize(width:1280,height:720) + let updatedContent: TelegramMediaWebpageContent = .Loaded(TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: nil, websiteName: websiteName, title: videoTitle, text: videoDescription, embedUrl: url, embedType: "iframe", embedSize: PixelDimensions(size), duration: nil, author: nil, image: nil, file: nil, attributes: [], instantPage: nil)) + + + /*if let thumbnail = thumbnail { + let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max)) + let thumbnailSize = finalDimensions.aspectFitted(CGSize(width:1280,height:720)) + let thumbnailImage = TGScaleImageToPixelSize(thumbnail, thumbnailSize)! + if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) { + //account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData) + previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource, progressiveSizes: [], immediateThumbnailData: nil)) + //} + //let data = thumbnail.pngData() + let media = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: previewRepresentations, immediateThumbnailData: thumbnailData, reference: nil, partialReference: nil, flags: []) + + updatedContent = .Loaded(TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: nil, websiteName: websiteName, title: videoTitle, text: videoDescription, embedUrl: url, embedType: "iframe", embedSize: PixelDimensions(size), duration: nil, author: nil, image: media, file: nil, attributes: [], instantPage: nil)) + } + + }*/ + + // let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: Int64.random(in: Int64.min ... Int64.max)), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, videoThumbnails: [], immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: fileAttributes) + + + + let webPage = TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.CloudWebpage, id: 0), content: updatedContent) + + //let messageAttribute = MessageAttribute + //JP HACK + // attributes = ishdidden / type = Url / reactions + let message = Message(stableId: 1, stableVersion: 1, id: MessageId(peerId: PeerId(0), namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 0, flags: [MessageFlags(rawValue: 64)], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: url, attributes: [], media: [webPage], peers: SimpleDictionary(), associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:]) + + + // Source is message? + let source = GalleryControllerItemSource.standaloneMessage(message) + let context = self.context + let galleryVC = GalleryController(context: context, source: source , invertItemOrder: false, streamSingleVideo: true, fromPlayingVideo: false, landscape: false, timecode: nil, playbackRate: 1, synchronousLoad: false, isShowLike: true, isVideoLiked: isLikedVideo, replaceRootController: { controller, ready in + print("👹 we're in replaceRootController....") + if let baseNavigationController = self.navigationController { + baseNavigationController.replaceTopController(controller, animated: false, ready: ready) + } + }, baseNavigationController: navigationController, actionInteraction: nil) + galleryVC.temporaryDoNotWaitForReady = true + galleryVC.temporaryDoNotWaitForReady = true + galleryVC.useSimpleAnimation = true + + /*navigationController?.view.endEditing(true) + + (navigationController?.topViewController as? ViewController)?.present(galleryVC, in: .window(.root), with: GalleryControllerPresentationArguments(transitionArguments: { id, media in + return nil + }))*/ + + + galleryVC.onLike = { + print("user liked video") + self.doPerformAddWatchLater(videoObj: NewWatchLaterVideo(videoType: video.videoType, userId: self.context.account.peerId.id._internalGetInt64Value(), twitchId: video.twitchId, youtubeId: video.youtubeId, rumbleId: video.rumbleId)) + } + + galleryVC.onDislike = { + print("user unliked video") + self.doPerformRemoveWatchLater(id: video.id) + } + + self.controller.present(galleryVC, in: .window(.root)) + } +} diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift new file mode 100644 index 00000000000..237a237850d --- /dev/null +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift @@ -0,0 +1,170 @@ +// +// WEVWatchLaterTableViewCell.swift +// _idx_SettingsUI_2FC3AEFB_ios_min13.0 +// +// Created by Apple on 01/11/22. +// + +import UIKit +import TelegramPresentationData +import Kingfisher + +class WEVWatchLaterTableViewCell: UITableViewCell { + + /// 图片 + let imgView: UIImageView = { + let view = UIImageView() + return view + }() + + let imgTypeView: UIImageView = { + let view = UIImageView() + view.contentMode = .scaleAspectFit + return view + }() + + /// 标题 + let titleLabel: UILabel = { + let label = UILabel.lj.configure(font: LJFont.regular(14), textColor: LJColor.black) + label.numberOfLines = 2 + return label + }() + + /// 标题 + let videoTypeLabel: UILabel = { + let label = UILabel.lj.configure(font: LJFont.regular(12), textColor: LJColor.black) + label.numberOfLines = 1 + return label + }() + + /// 标题 + let lblViews: UILabel = { + let label = UILabel.lj.configure(font: LJFont.regular(12), textColor: LJColor.black) + label.numberOfLines = 1 + return label + }() + + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + initStyleView() + initView() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + initStyleView() + initView() + } + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + + private func initStyleView() { + selectionStyle = .none + backgroundColor = .clear + } + + func configureCell(watchLater: WatchLaterVideo, presentationData: PresentationData) { + switch watchLater.videoType { + case 1: + titleLabel.text = watchLater.youTubeTitle ?? "" + if let imageURL = watchLater.youTubeThumbnail { + imgView.kf.setImage(with: URL(string: imageURL)) + } + imgTypeView.image = UIImage(named: "segment_youtube") + videoTypeLabel.text = "Youtube" + self.setViews(count: watchLater.youTubeViewCounts) + case 2: + titleLabel.text = watchLater.clipTitle ?? "" + if let imageURL = watchLater.clipThumbnailUrl { + imgView.kf.setImage(with: URL(string: imageURL)) + } + imgTypeView.image = UIImage(named: "segemnt_twitch") + videoTypeLabel.text = "Twitch" + self.setViews(count: watchLater.clipViewCount) + case 3: + titleLabel.text = watchLater.rumbleTitle ?? "" + if let imageURL = watchLater.rumbleThumbnailUrl { + imgView.kf.setImage(with: URL(string: imageURL)) + } + imgTypeView.image = UIImage(named: "segment-rumble") + videoTypeLabel.text = "Rumble" + self.setViews(count: watchLater.rumbleViewerCount) + default: + titleLabel.text = "" + } + imgView.layer.cornerRadius = 5 + imgView.layer.masksToBounds = true + titleLabel.textColor = presentationData.theme.list.itemPrimaryTextColor + videoTypeLabel.textColor = presentationData.theme.list.itemSecondaryTextColor + lblViews.textColor = presentationData.theme.list.itemSecondaryTextColor + } + + func setViews(count: Int64?) { + var numberStr = "\(count ?? 0)" + var unit = "views" + if count == 1 { + unit = "view" + } + if count ?? 0 >= 1000 { + numberStr = String.init(format: "%.1fk", Double(count ?? 0) / 1000.0) + } + lblViews.text = "\(numberStr) \(unit)" + } + + private func initView() { + contentView.addSubview(imgView) + imgView.snp.makeConstraints { (make) in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(8) + make.bottom.equalToSuperview().offset(-8) + make.height.equalTo(80) + make.width.equalTo(120) + } + + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { (make) in + make.left.equalTo(imgView.snp.right).offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(imgView.snp.top) + } + + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { (make) in + make.left.equalTo(imgView.snp.right).offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(imgView.snp.top) + } + + contentView.addSubview(imgTypeView) + imgTypeView.snp.makeConstraints { make in + make.left.equalTo(imgView.snp.right).offset(15) + make.width.height.equalTo(15) + make.top.equalTo(titleLabel.snp.bottom).offset(2) + } + + contentView.addSubview(videoTypeLabel) + videoTypeLabel.snp.makeConstraints { make in + make.left.equalTo(imgTypeView.snp.right).offset(5) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(imgTypeView.snp.top) + make.bottom.equalTo(imgTypeView.snp.bottom) + } + + contentView.addSubview(lblViews) + lblViews.snp.makeConstraints { make in + make.left.equalTo(imgView.snp.right).offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(videoTypeLabel.snp.bottom).offset(2) + } + } +} diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json new file mode 100644 index 00000000000..3e10edcef90 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "RSS Feed.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "RSS Feed@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "RSS Feed@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed.png b/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed.png new file mode 100644 index 0000000000000000000000000000000000000000..d0df625255a3375cefc23ec4467601674720a2e9 GIT binary patch literal 725 zcmV;`0xJE9P)}=wzj#~bJmu`(!{0;!srJfH|O4SzI#r-doI8dR~oroE(!k_ENr4sc$}3a`RU|a z2;Pw-*7iK!uJf0TG&Q4KP6e#(bde7_#6-Q>M>vu~?WT9|Oe6~p>hG8ayS)80WE@hfXusnV$ z0FsqTt=GEU?qC5zQ$a#?q)K0%ns(=5Dy6=g1SL|#FormHpVlbK>L9GNk%Z)glCR+V z&@`{o?4lwS_~K{^!QVt?H~S=N1i#1j);I?kHo80vpCXx7GUW zOxEDJb*c0?RB%Hda6`T6I1bn z2chRd!4C@R%F4|L5Xi(Q;MaqG*wn`*70FnHc!b^G7D_NJ0PLNj-S0y!Xq07t-K_gG zw9||`$N^=CWqV((zAD2UAdiw*pA_5}OP1{2>3eky>S}+Eek6qbfW6ZE(C(Wz?>ld10TL1t5)u*; zK3W(EvbMICk)$P+KHK(5e}8|!2Ol6p2G(j{S0qXPk#n9IE$7_nFqZ0ZZg)6`zXpR- z>wOz8WZ?R`@rW_VMQm<44w#phV7+)z@4}pkZQ$LzMs8sN9)SRi@h0cY+}o>LFeijO zxUpeu;iU}XSi>Rg%)_G+2ypwhZlzK{0z-ejRO-KRQeyl>PLjaTw9+#ER{QnqRv%`B zu!_1NRlRW|pB)bS%Zy2@ShNx)PEm}y*luT5({^eGdO`83D2@S;s)QTMpYHALK7lDS zQv*lY+%&4Fqz{4&bsXL_&D|ZCB6BnFntS)YF&rml_!&xT>G}EF?P;x_LLxH>M@NUP zJ9qR06qy2k9W#BeM+Q0-%6oa%hsOr*Z^jVhe-s$P-82pbrbaN~bVQQ-GRqtS`}d)`LUI(dG6@=#QCgr}&c=|AIT*E}t$&iOs70N*=8F^BzmePs6CGS*>*Hlk1!6E$ z1Bq)Ry}Xf5^FU=pMQwT%mnnmSh|JtTf{gU?2Ht)(=wYw=jeB2Jm%o6B%*8;W-#^)P zdy&$-bb4tuxF;LiQE)z7fr!W;2%fB!F^+1ui0AOyvu$=@n)Rk%d&(u(*S|yI0AsXV zk~lrAZ$DY)ZQK5T86I*)J(Csl;Ks(c6gyj#q2RTQ*9s-d@5+6_f$-ShvB2X;&M!O? zc2+U!BO7hx&La za8xA~n4(+_tmP~lTtBXgVGoO^ZDYHT>o;3r#5NE`q8nV#--PrxUG1B*d;=BRKrgu; zWiViYhqst4KgAO@+!Ce!#IH|!y?-7<2<}0pSrGNThT!`_qbf=42lsIWKJ??~&ws1K zl({+~hb_usX>jqrzeGK!5#BDndyPitC^_49`iin>HX6T1K7$c~V)a9Plbn!{kdTm& dkdTnz=3f#X=xf=U!%_eM002ovPDHLkV1lr)S6=`C literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@3x.png b/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ad89ab0cbe24b3845b25d10991b693292126c9df GIT binary patch literal 1829 zcmV+=2io|FP)A}7fQV$Wv0FKZR0>kmND$JXxK&%JxhBWO?2p-w6e!ZAUCLxnZ*!6l{-?i=S-PP6AI-GKZ3pzFRS+>zQxQAaB zj(gp4pvD-~9LKKedh)Mk)2{CBZdXr>*g^#*t27LlM!_<`Pnkq!On`H z$>QhubO$0rR;+0b3e1*zOcOpDTnp{E>2PuaFLsA-7-jOK%F9~l|OoaK7`pV_#i zUD5;%0*S6^dKN_=g9yHttkp2=nfdwouDgM*3i>t^6H{ZDhhD{{JOQC_9xg6Enu9J9 zD?vL@fsjf;q0xXlyuKK7*V5z1KhHv!h^3%Mxpk{J&MU0rG^>`S%{+Nhs=)~pdqF$! zR$=5CQu9q>-UDox(O3c?bx+DR4yJtHVV!l1Crrg;ek zVpsf*?}$1)Jg~gAwPnEx&{KkT*xcM$Cu=3KS{0N#^m-zZe1CX2vvLxm_N1T$St~7P zU3aj6VCTG!WsIHG^}cghuC9S(dR9=P?E-$q+CJmg3^-q^AY#fR^`L z5K%GqU%7ZOU&f0dE%M8rDPfa@W$F87)4@Q}+|@Mp8k6q|{-`W^^l{@x@e98yi_)pR zz3uz5YJVvfN@Di)v9IvU5oopYj8g?=R9-v-2}ltX8^QPRgXaStp6N7@FI~!wV)U+r%^N9-4-E~hBob#n@QVKQ z*<>w!4J3e;Sm6I1$e=42ry<|ugk(|NL;JKu!XA2ULVxf5Ti+=f`8=cNP zS!~!UXJg}!e@)YDcqRYzJ~E=dq$QtELB!co%h$1S(|orP=8vZ2pZqg;l&Sb0xuK!+ z3nCMKDS}en9W0IU#b~8EIY#FMPS78heP&z+21YB)x!sVKhf;2s&6-ulv_Gkxrt1u! zp^mH;~~H9UB?Rt?)#D%uTDwWa>k3cQqMNd8w2Uje~3>H{PRaA zO(iXGK)EUYUdj8s%`p%_Yy>4})589~bD!#MpF<0sxqncwZ}7;6sD%8vJeozWl!g$ycHr4Ye9oV=SD;4iq05(o_f8W zO1%^K0v&sPkO*CEYBtjYLPF8m=Mc_iy7%1cRjisK^&b)-fp)aKL*tK5$%o^K!+rDn z`)rP9HwRfMo{wsHw}5fDOoNUzc6N4ZXoVg}*pUPkZlO1Ceq6+-X?zrp*3U;9$h;Qo zw@mx{`v)K(EjQwx=Q@rSpCwP*5wYU9>vaqXOQP~QfA3{_aG>*A)$eXEFy_Q3C^4qr z4R#!4aM|64fY37adR^0ax1TfDJ^)&8q^<121SP-8(~3j?S`2zDEmN=b30DP|Rq49+ z+UxZwK~$Kaw6&Y(c=E42AG|f!cYANfB`9OIwB2~I&O?KOV#nq_QDK5M8V7#^Cp_sB zx)awj)Uq_LZo6%JceCg&Y6yuiLHGCnEBkebjzYJ?00-1Bb*b&=cy}pln&r9V>6UZ| ziLj16jT-!B;YT?*VBhf0+>Z|a&}XlqAN~=A<{n)P4h}ZlI{1{ME-d`=J%mK~kS@rE zEo83Uq3;?rD70;B`px2l)v3W9WnaFOsVCiFfLD6r?KCQGw-dJR?{5|{jY{F5utt4@ zsJrr{jghGm>g($-BofI1N>eBh^zwf!pin3j3WY+UP$(1%g+ifFC=?2XqL=s|X<6k< T+P|4x00000NkvXXu0mjfISg~! literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json new file mode 100644 index 00000000000..f1ae6d1f5b2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "clock.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "clock@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "clock@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/clock.png b/submodules/TelegramUI/Images.xcassets/clock.imageset/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..243c787de6742e77ae49297e0c246906971ffa75 GIT binary patch literal 500 zcmV2*5=XK?45BlM-$AR^%n2nk8$|2~bWJWcn^LW! zYfq8;qJTQqBnOcGRULYXfZ5ib5JZ|k0*w5`=`D<84MA{|e;P#LBKU}WjMPSbpTijY1%*8j;q)MFHq*lpyY=(R?qK(MbUD4^aVQE4~Am_ zft-_v><7n{{fIpf3AZP9m}>x+`i}ys{4## z!$~3gVX90BxM!i_`@adn#qCmF3?tt4-iVsxcyV17x$9l>Rs9NlQ7dva_-_M#(Ua-OI}A|qF>tc*miL?Yj3>}NcQL_UeEL?Ty4u0-P4OqoDBowg)oOStER(u7Xt zCX-~CX#ojvKA%f_d9!6<%bczy6^A30Zz`rJiX%LT0wO_5SGFiBF+d`Fcz{eW0Z(x( zC8Wc_mO7M35CN;ahV+VaAc^|kAKyj5Dvox&f{ShU!2sDdT~Ah#6FrZF=Wtse3Wm)N zXJK>CY>X1Hoxj`5668@w1<{80PT6}wgQ9HFa3Lni{%_@e4aq4+I?>dDBpj!D4+%hn zq(LS!Xi~+1Pz|#3dlDKn;$xs0(YCw`&AlXw9$~nruY{&us!{KQ?Hf0VrO<@tbl{bR zAOJ_=FSKnQM|*1p7?=Q72VCfDL5F{QVb6r;`GbhfRLUc4U$~2HSvBg^v5FP}vU|Re zb|i38(17h&^@4P~;*a~{Eg~O>Sev)m z;bQ*|&XsA<5FnO(`wI3;egibpHLI@ZbidAkVm~-aTh_BcW-QKvBT%ttYRC_KEh_w& zk@;{Z%|L$W5I{4+8BnajU)()(2j{ cQpBKs04P6Qn;*i!zW@LL07*qoM6N<$f;r8n@&Et; literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/clock@3x.png b/submodules/TelegramUI/Images.xcassets/clock.imageset/clock@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b9aef7fae624897409ed774d54bb66eb82b706ab GIT binary patch literal 1393 zcmV-%1&;cOP)o5#fdIkmy3j+r)91Og0aBy&svB$WuaB#3Nu&{8@a4@i}*GlA`G_w@DvGe2hJICv( zmo&;3NwyWq8H|Y2>GY^S*1F~NiETswUUv?!bURY}q3=IgmMIt!8AJw=@<+EPXvlbk z;ZV9A@KY03K}19$s6$E)aiMfOXrc}f0YM2OVxFmm&=en_CLu|OkXjXlpoxj;q9#g{ zR6+m@CPyH=s?PRA061CGreZv4;O%Q2K0gcx907oSSG%8U$cFjWnz8U54I_TVU zxX#J%bu0DnAK?mIMGy)92JTve!l9sQ=rBzh`$Wz4`bhrv8sFqi5DEASZckD{^Yj!% z0LfB-+enEI>C4yTya>_)p*j6^I8;GIV!9xWM!B9G4oAPV2S+#)q=hJ;d0G-sg}=t0 z?HXtqaqd+>zv-2(qnr~#j+!&b8HNIBQvuCHRf3Zy^%A5nh-&*P9D;YOtzTd30|EkNr-8?29j3o*cV1`^oy^T2Dv+PR zQcwc#w4b|L)HN|Ahtr;NNq&a|O=Q2Af19}088(7!_>L9QoB}jCRLs9GwCGF_tz$Ut z*+F_JnSK*buhG^ZPJ2`erqxA{7M-I4H9_Q@bLQX@(nZPi=f=#82Ib6w)l{L2F+lgm zO&)8DTD8AeFeu=?5ODLl+RXYi=oSc4O#cSWY{jiXpn21vAaMw0R_76*25p#g7q{LT z0LAp@NYL8zq!htTW9}M6;O@01ND8Ok3OIr`819fls?Oj-77GEZ46F}Iae2W(xYxB5 zlfDDwp#2?iC#V-lkk$TZg?|$e?zMUl&htuC3LRh{8SI-^)F5^a0Jj5nF36e~+!jIX zYCVq&=w4xVjoTJVmeQ##?A(ZCXHyJq^&7tk>Pb;U6qLcfD3Huz_O7kd8gixg z)tsrB?DWN~_DNQ$-ek|!kx4P>68cm4XHSwtb)=ZR%MwJUwgowb|836ZMzXzwT+FhS zO1NCgp>k-RfCR59zA-=!xd1t~{+acZXof7P!}-JHxzrxj*kKClS{E+Btt7LYDyQ0` zhCggcW=jAUO+ujB?#9w4&+6wmMZGOya1Db`X^CawpT4q;wXpzd5^B|Vpp6Bv`Ro%i z-o^q3r(s)DU<_Q*Cw{M(ttrg56xdAsX8v1Kv_U3^erax##vnEP!S)ZLQBEp|84D&N zvCjh3@Q2=D$rR*GK~zv;45IB}Mo~L#ImCs6W&k*35q5nTW0N=ITtks%oP0D=+K5h2 z7c@+pQORtWWVR1%!;ETXi$H7&nh`H5DQ)}*9MK2Y+Qlgu00000NkvXXu0mjfv<_}e literal 0 HcmV?d00001 From 2d423818a5913c79640383d3a62a32f055d41c49 Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Fri, 11 Nov 2022 23:20:46 +0530 Subject: [PATCH 02/10] subscribe feature implemented subscribe video feature of youtube into dev env --- .../Telegram-iOS/en.lproj/Localizable.strings | 3 +- .../Sources/Model/WEVSubscribeActivity.swift | 81 +++++++ .../Model/WEVVideoSubscribeModel.swift | 2 +- .../WEVDiscover/WEVDiscoverRootNode.swift | 4 +- .../Sources/WEVRootViewController.swift | 4 +- .../WEVSubscribeController.swift | 2 +- .../WEVSubscribeControllerNode.swift | 217 ++++++------------ .../WEVSubscribeTableViewCell.swift | 36 +++ .../WEVWatchLaterControllerNode.swift | 4 +- 9 files changed, 191 insertions(+), 162 deletions(-) create mode 100644 submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 4875972883a..c31b3cc7fb6 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7210,8 +7210,7 @@ Sorry for the inconvenience."; "ChatSettings.StickersAndReactions" = "Stickers and Emoji"; "WEV.ShareAndEarn" = "Share to Earn"; "WEV.WatchLater" = "Watch Later"; -"WEV.Subscribe" = "Subscribed" - +"WEV.Subscribe" = "Subscribed"; "Localization.TranslateMessages" = "Translate Messages"; "Localization.ShowTranslate" = "Show Translate Button"; "Localization.ShowTranslateInfo" = "Show a 'Translate' button in the message action menu."; diff --git a/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift b/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift new file mode 100644 index 00000000000..3f8cbcc9ff6 --- /dev/null +++ b/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift @@ -0,0 +1,81 @@ +// +// WEVSubscribeActivity.swift +// _idx_ContactListUI_AE77A1D0_ios_min13.0 +// +// Created by Apple on 11/11/22. +// + +import Foundation +// This file was generated from JSON Schema using quicktype, do not modify it directly. +// To parse the JSON, add this file to your project and do: +// +// let projectRegionCrews = try? newJSONDecoder().decode(ProjectRegionCrews.self, from: jsonData) + +import Foundation + +// MARK: - ProjectRegionCrews +struct WEVSubscribeActivity: Codable { + let kind, etag: String + let items: [Item] + let nextPageToken: String + let pageInfo: PageInfo +} + +// MARK: - Item +struct Item: Codable { + let kind, etag, id: String + let snippet: Snippet + let contentDetails: ContentDetails +} + +// MARK: - ContentDetails +struct ContentDetails: Codable { + let upload: Upload +} + +// MARK: - Upload +struct Upload: Codable { + let videoID: String + + enum CodingKeys: String, CodingKey { + case videoID = "videoId" + } +} + +// MARK: - Snippet +struct Snippet: Codable { + let publishedAt: Date + let channelID, title, snippetDescription: String + let thumbnails: Thumbnails + let type: String + + enum CodingKeys: String, CodingKey { + case publishedAt + case channelID = "channelId" + case title + case snippetDescription = "description" + case thumbnails, type + } +} + +// MARK: - Thumbnails +struct Thumbnails: Codable { + let thumbnailsDefault, medium, high, standard: Default + let maxres: Default + + enum CodingKeys: String, CodingKey { + case thumbnailsDefault = "default" + case medium, high, standard, maxres + } +} + +// MARK: - Default +struct Default: Codable { + let url: String + let width, height: Int +} + +// MARK: - PageInfo +struct PageInfo: Codable { + let totalResults, resultsPerPage: Int +} diff --git a/submodules/ContactListUI/Sources/Model/WEVVideoSubscribeModel.swift b/submodules/ContactListUI/Sources/Model/WEVVideoSubscribeModel.swift index 53723f35580..c794d9f8998 100644 --- a/submodules/ContactListUI/Sources/Model/WEVVideoSubscribeModel.swift +++ b/submodules/ContactListUI/Sources/Model/WEVVideoSubscribeModel.swift @@ -70,7 +70,7 @@ func saveSubscribedVideoList(_ videowatchList: [SubscribedVideo]) { UserDefaults.standard.set(data, forKey: KeySubsribeForUserDefaults) } -func fetchWatchList() -> [SubscribedVideo] { +func fetchSubscribedList() -> [SubscribedVideo] { guard let encodedData = UserDefaults.standard.array(forKey: KeySubsribeForUserDefaults) as? [Data] else { return [] } diff --git a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift index d4d14cfa122..e61a61a1b67 100644 --- a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift +++ b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift @@ -61,8 +61,8 @@ public class WEVDiscoverRootNode: ASDisplayNode { var arrWatchLater: [WatchLaterVideo] = [] var arrSubscribedVideos: [SubscribedVideo] = [] - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev /// 根据状态返回该显示的视频 private var showDataArray: [WEVVideoModel] { diff --git a/submodules/ContactListUI/Sources/WEVRootViewController.swift b/submodules/ContactListUI/Sources/WEVRootViewController.swift index a3722f12176..c1ce9e6b7d4 100644 --- a/submodules/ContactListUI/Sources/WEVRootViewController.swift +++ b/submodules/ContactListUI/Sources/WEVRootViewController.swift @@ -65,8 +65,8 @@ public class WEVRootViewController: ViewController { //var realtimeClient:RealtimeClient? //var allUsersUpdateChanges:Realtime.Channel? - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev public init(context: AccountContext) { self.context = context diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift index da6af29a0d3..af2dc305b4a 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeController.swift @@ -74,7 +74,7 @@ public class WEVSubscribeController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) - self.title = self.presentationData.strings.Settings_AppLanguage + self.title = self.presentationData.strings.WEV_Subscribe self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) self.controllerNode.updatePresentationData(self.presentationData) diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift index 5ec18caa917..6feee5c9828 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift @@ -18,6 +18,7 @@ import TelegramUIPreferences import TranslateUI import PostgREST import GalleryUI +import Alamofire final class WEVSubscribeControllerNode: ASDisplayNode { private let context: AccountContext @@ -41,12 +42,14 @@ final class WEVSubscribeControllerNode: ASDisplayNode { } } - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey - var arrSubsribedVideo: [Subs] = [] + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev + var arrSubsribedVideo: [Item] = [] + var activity: WEVSubscribeActivity? = nil private let tableView = UITableView(frame: CGRect.zero, style: .plain) private var currentLayout: CGSize = .zero private var client: PostgrestClient? + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVSubscribeController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { self.context = context self.presentationData = presentationData @@ -144,175 +147,85 @@ final class WEVSubscribeControllerNode: ASDisplayNode { } tableView.register(WEVWatchLaterTableViewCell.self, forCellReuseIdentifier: "WEVWatchLaterTableViewCell") - self.arrWatchLater = fetchWatchList() - DispatchQueue.main.async { + //self.arrSubsribedVideo = fetchSubscribedList() + + /*DispatchQueue.main.async { self.tableView.reloadData() + }*/ + let subscribes = fetchSubscribedList() + var totalVideos = subscribes.count + var arrSubVideo: [Item] = [] + for index in 0.. Int { - return arrWatchLater.count + return arrSubsribedVideo.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "WEVWatchLaterTableViewCell", for: indexPath) as? WEVWatchLaterTableViewCell else { return UITableViewCell() } - cell.configureCell(watchLater: arrWatchLater[indexPath.row], presentationData: self.presentationData) + cell.configureCell(video: arrSubsribedVideo[indexPath.item], presentationData: self.presentationData) return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("PlayVideo") - self.playVideo(video: arrWatchLater[indexPath.row]) + self.playVideo(video: arrSubsribedVideo[indexPath.row]) } } extension WEVSubscribeControllerNode { - /*func watchLaterRealTimeSync() { - let rt = RealtimeClient(endPoint: "\(supabaseUrl)/realtime/v1", params: ["apikey": supabaseKey]) - - rt.onOpen { - print("Socket opened.") - let allUsersUpdateChanges = rt.channel(.table(LJConfig.SupabaseTablesName.watchLater, schema: "public")) - - allUsersUpdateChanges.on(.all) { message in - } - allUsersUpdateChanges.subscribe() - } - - rt.onError{error in - print("Socket error: ", error.localizedDescription) - } - - rt.onClose { - print("Socket closed") - } - - rt.onMessage{message in - switch message.event { - case .insert, .update, .delete: - self.doWatchLaterFetch() - default: - break - } - } - rt.connect() - }*/ - - func doWatchLaterFetch() { - Task { - await fetchWatchLater() - } - } - - - func fetchWatchLater() async { - guard let client = self.client else { - return - } - - var errMsg = "" - // Get twitch videos - do { - let watchLater = try await client - .from("watch_later_view") - .select() - .eq(column: "user_id", value: "\(context.account.peerId.id._internalGetInt64Value())") - .execute() - .decoded(to: [WatchLaterVideo].self) - - //assign watch later data to array - self.arrWatchLater = watchLater - //get watch later object - for index in 0..>>>>>") - } - } - - func doPerformAddWatchLater(videoObj: NewWatchLaterVideo) { - Task { - await performAddWatchLater(videoObj: videoObj) - } - } - - func performAddWatchLater(videoObj: NewWatchLaterVideo) async { - guard let client = self.client else { - return - } - do { - let insertedVideo = try await client.from("watch_later") - .insert( - values: videoObj, - returning: .representation - ) - .execute() - print(insertedVideo) - self.doWatchLaterFetch() - } catch { - print(error.localizedDescription) - } - } - - func doPerformRemoveWatchLater(id: Int64) { - Task { - await performRemoveWatchLater(id: id) - } - } - - func performRemoveWatchLater(id: Int64) async { - guard let client = self.client else { - return - } - do { - try await client.from("watch_later").delete().eq(column: "id", value: "\(id)").execute() - self.doWatchLaterFetch() - } catch { - print(error.localizedDescription) - } - } +} +extension WEVSubscribeControllerNode { - func playVideo(video: WatchLaterVideo) { + func playVideo(video: Item) { - var videoTitle = "" - var videoDescription = "" + let videoTitle = video.snippet.title + let videoDescription = "" let websiteName = "YouTube" - var url = "" - let isLikedVideo = true - switch video.videoType { - case 1: + let url = "https://www.youtube.com/watch?v=" + video.contentDetails.upload.videoID + let isLikedVideo = false + //switch video.videoType { + /*case 1: guard let title = video.youTubeTitle, let ytId = video.youtubeId else { return } @@ -333,7 +246,7 @@ extension WEVSubscribeControllerNode { videoTitle = title default: return - } + }*/ /*let thumbnail = UIImage(named: "channel_youtube") var previewRepresentations: [TelegramMediaImageRepresentation] = [] @@ -375,7 +288,7 @@ extension WEVSubscribeControllerNode { // Source is message? let source = GalleryControllerItemSource.standaloneMessage(message) let context = self.context - let galleryVC = GalleryController(context: context, source: source , invertItemOrder: false, streamSingleVideo: true, fromPlayingVideo: false, landscape: false, timecode: nil, playbackRate: 1, synchronousLoad: false, isShowLike: true, isVideoLiked: isLikedVideo, replaceRootController: { controller, ready in + let galleryVC = GalleryController(context: context, source: source , invertItemOrder: false, streamSingleVideo: true, fromPlayingVideo: false, landscape: false, timecode: nil, playbackRate: 1, synchronousLoad: false, isShowLike: false, isVideoLiked: isLikedVideo, replaceRootController: { controller, ready in print("👹 we're in replaceRootController....") if let baseNavigationController = self.navigationController { baseNavigationController.replaceTopController(controller, animated: false, ready: ready) @@ -394,12 +307,12 @@ extension WEVSubscribeControllerNode { galleryVC.onLike = { print("user liked video") - self.doPerformAddWatchLater(videoObj: NewWatchLaterVideo(videoType: video.videoType, userId: self.context.account.peerId.id._internalGetInt64Value(), twitchId: video.twitchId, youtubeId: video.youtubeId, rumbleId: video.rumbleId)) + //self.doPerformAddWatchLater(videoObj: NewWatchLaterVideo(videoType: video.videoType, userId: self.context.account.peerId.id._internalGetInt64Value(), twitchId: video.twitchId, youtubeId: video.youtubeId, rumbleId: video.rumbleId)) } galleryVC.onDislike = { print("user unliked video") - self.doPerformRemoveWatchLater(id: video.id) + //self.doPerformRemoveWatchLater(id: video.id) } self.controller.present(galleryVC, in: .window(.root)) diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift index 237a237850d..a14717d1f97 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift @@ -109,6 +109,42 @@ class WEVWatchLaterTableViewCell: UITableViewCell { lblViews.textColor = presentationData.theme.list.itemSecondaryTextColor } + func configureCell(video: Item, presentationData: PresentationData) { + //switch watchLater.videoType { + //case 1: + titleLabel.text = video.snippet.title + //if let imageURL = video.snippet.thumbnails.maxres { + imgView.kf.setImage(with: URL(string: video.snippet.thumbnails.maxres.url)) + //} + imgTypeView.image = UIImage(named: "segment_youtube") + videoTypeLabel.text = "Youtube" + //self.setViews(count: watchLater.youTubeViewCounts) + /*case 2: + titleLabel.text = watchLater.clipTitle ?? "" + if let imageURL = watchLater.clipThumbnailUrl { + imgView.kf.setImage(with: URL(string: imageURL)) + } + imgTypeView.image = UIImage(named: "segemnt_twitch") + videoTypeLabel.text = "Twitch" + self.setViews(count: watchLater.clipViewCount) + case 3: + titleLabel.text = watchLater.rumbleTitle ?? "" + if let imageURL = watchLater.rumbleThumbnailUrl { + imgView.kf.setImage(with: URL(string: imageURL)) + } + imgTypeView.image = UIImage(named: "segment-rumble") + videoTypeLabel.text = "Rumble" + self.setViews(count: watchLater.rumbleViewerCount) + default: + titleLabel.text = "" + }*/ + imgView.layer.cornerRadius = 5 + imgView.layer.masksToBounds = true + titleLabel.textColor = presentationData.theme.list.itemPrimaryTextColor + videoTypeLabel.textColor = presentationData.theme.list.itemSecondaryTextColor + lblViews.textColor = presentationData.theme.list.itemSecondaryTextColor + } + func setViews(count: Int64?) { var numberStr = "\(count ?? 0)" var unit = "views" diff --git a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift index 83e5758c2b4..45a18511fe9 100644 --- a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift @@ -42,8 +42,8 @@ final class WEVWatchLaterControllerNode: ASDisplayNode { } } - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev var arrWatchLater: [WatchLaterVideo] = [] private let tableView = UITableView(frame: CGRect.zero, style: .plain) private var currentLayout: CGSize = .zero From ada0bfe0ab36ae1f6369ed994ca7b4d51a60333c Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Sun, 13 Nov 2022 20:01:22 +0530 Subject: [PATCH 03/10] updated icons into media players --- .../{ => wweevv}/RSS_Feed.imageset/Contents.json | 0 .../{ => wweevv}/RSS_Feed.imageset/RSS Feed.png | Bin .../RSS_Feed.imageset/RSS Feed@2x.png | Bin .../RSS_Feed.imageset/RSS Feed@3x.png | Bin .../{ => wweevv}/clock.imageset/Contents.json | 0 .../{ => wweevv}/clock.imageset/clock.png | Bin .../{ => wweevv}/clock.imageset/clock@2x.png | Bin .../{ => wweevv}/clock.imageset/clock@3x.png | Bin .../wweevv/notification.imageset/Contents.json | 6 +++--- .../wweevv/notification.imageset/RSS Feed.png | Bin 0 -> 401 bytes .../wweevv/notification.imageset/RSS Feed@2x.png | Bin 0 -> 708 bytes .../wweevv/notification.imageset/RSS Feed@3x.png | Bin 0 -> 997 bytes .../notification.imageset/notification.png | Bin 1147 -> 0 bytes .../notification.imageset/notification@2x.png | Bin 3155 -> 0 bytes .../notification.imageset/notification@3x.png | Bin 3053 -> 0 bytes .../notification_selected.imageset/Contents.json | 6 +++--- .../notification_selected.imageset/RSS Feed.png | Bin 0 -> 612 bytes .../RSS Feed@2x.png | Bin 0 -> 1180 bytes .../RSS Feed@3x.png | Bin 0 -> 1733 bytes .../notification_selected.png | Bin 1030 -> 0 bytes .../notification_selected@2x.png | Bin 2548 -> 0 bytes .../notification_selected@3x.png | Bin 2500 -> 0 bytes .../watchlater_selected.imageset/Contents.json | 6 +++--- .../watchlater_selected.imageset/RSS Feed.png | Bin 0 -> 674 bytes .../watchlater_selected.imageset/RSS Feed@2x.png | Bin 0 -> 1292 bytes .../watchlater_selected.imageset/RSS Feed@3x.png | Bin 0 -> 1830 bytes .../watchlater_selected.png | Bin 1745 -> 0 bytes .../watchlater_selected@2x.png | Bin 3959 -> 0 bytes .../watchlater_selected@3x.png | Bin 6202 -> 0 bytes .../watchlater_unselected.imageset/Contents.json | 6 +++--- .../watchlater_unselected.imageset/RSS Feed.png | Bin 0 -> 436 bytes .../RSS Feed@2x.png | Bin 0 -> 782 bytes .../RSS Feed@3x.png | Bin 0 -> 1138 bytes .../watchlater.png | Bin 1564 -> 0 bytes .../watchlater@2x.png | Bin 2842 -> 0 bytes .../watchlater@3x.png | Bin 3785 -> 0 bytes 36 files changed, 12 insertions(+), 12 deletions(-) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/RSS_Feed.imageset/Contents.json (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/RSS_Feed.imageset/RSS Feed.png (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/RSS_Feed.imageset/RSS Feed@2x.png (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/RSS_Feed.imageset/RSS Feed@3x.png (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/clock.imageset/Contents.json (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/clock.imageset/clock.png (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/clock.imageset/clock@2x.png (100%) rename submodules/TelegramUI/Images.xcassets/{ => wweevv}/clock.imageset/clock@3x.png (100%) create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/RSS Feed.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/RSS Feed@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/RSS Feed@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/RSS Feed.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/RSS Feed@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/RSS Feed@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater@3x.png diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/Contents.json similarity index 100% rename from submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/Contents.json rename to submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/Contents.json diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed.png b/submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed.png rename to submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed.png diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed@2x.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@2x.png rename to submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed@2x.png diff --git a/submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed@3x.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/RSS_Feed.imageset/RSS Feed@3x.png rename to submodules/TelegramUI/Images.xcassets/wweevv/RSS_Feed.imageset/RSS Feed@3x.png diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/Contents.json similarity index 100% rename from submodules/TelegramUI/Images.xcassets/clock.imageset/Contents.json rename to submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/Contents.json diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/clock.png b/submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/clock.imageset/clock.png rename to submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock.png diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/clock@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock@2x.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/clock.imageset/clock@2x.png rename to submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock@2x.png diff --git a/submodules/TelegramUI/Images.xcassets/clock.imageset/clock@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock@3x.png similarity index 100% rename from submodules/TelegramUI/Images.xcassets/clock.imageset/clock@3x.png rename to submodules/TelegramUI/Images.xcassets/wweevv/clock.imageset/clock@3x.png diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/Contents.json index 89b322335ce..3e10edcef90 100644 --- a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "notification.png", + "filename" : "RSS Feed.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "notification@2x.png", + "filename" : "RSS Feed@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "notification@3x.png", + "filename" : "RSS Feed@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed.png new file mode 100644 index 0000000000000000000000000000000000000000..05de075a9067626eacca0c93849d81a14d091082 GIT binary patch literal 401 zcmV;C0dD?@P)l9!^_-u13W zA(|LFQInCG6B%Mr8AVY^Ln6TrT&EIUMQf3we(m zr=ifB5amv`TN)aiWnq_?hDM*E6SQBZXpB3$GxIfxCumAtfFmEd_;cGBR)KYQpWj(SOxuy7?>jWa3uEjv&co~ICQ3~Jxu74$pudfh!A5UF vo-fY2662HFfCe~1s^!`hJMZbl#CUiE!&K0iSKosf00000NkvXXu0mjf`?R4Z literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/RSS Feed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1a89baddfcec55166c35428941cb7ed2046c64 GIT binary patch literal 708 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 N002ovPDHLkV1l|PAJYH; diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@2x.png deleted file mode 100644 index 58620983522a99895101a4818d6691f408ad6025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3155 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 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification.imageset/notification@3x.png deleted file mode 100644 index 787add3674f577da4a5c1b12cdb12b374a0a0663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3053 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 va%XIV5 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 bKYaZGe6y9C3_Af}00000NkvXXu0mjfWx+6_ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected.png deleted file mode 100644 index b5250631c26242ccc8c7d4f9f16f36e9c4fbbcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1030 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 KMNUMnLSTY*pXT%c diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/notification_selected.imageset/notification_selected@3x.png deleted file mode 100644 index 01959c39d17dbde3a3817350b31918b59a15a791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 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 IM6N<$g3{(7cK`qY literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/RSS Feed@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/RSS Feed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..24fa91dd2a72a911f7f19bc16541089a87577ecf GIT binary patch literal 1292 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 Utg;%Jo&W#<07*qoM6N<$f+Pn?-v9sr literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected.png deleted file mode 100644 index a09a0d15f6f8f98faba83d0eee53ab1dca85e4ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 zcmY*Z3pkWn7(SDPaVxAe&1OvHmbtkb!=^?Vm)x%z(HQ(Pmu5y7i8LwKR)t7ziHB_| ziW-uTtp`)v^eok*l3Gc3H6pVA#A^4P=R4nfzVm+XcfS8Q&!6eFW4k&Mg#-Yo(_E-N zu-BEF@(OtExfEv)yXDbN9!>yUJf=Dup$P9W3>O~{0EC7Bq=^8SfkSC80f;98@G2Yt z@+kmTb4$hE6!<{I45CGOcmPuvD+5J@7Epi@0-gYY0&+DN0awJ@CG3MRUgRtT;0Oek zFLFX)FCQ+j$#WLGLIvW7V#Ts0wr+*O4=hi6w>B&ob}C$#U_Jn<+HymHl2ScbEg13( z5(Ig;lNlTqJ|dE{n~6_kaphTnl1PRjiz$e}B(mbzd~%`#_B(?NV|kc>#eAm-_BddJ zJiIVlIXouD8c)O%v5rU#21DURMv;A}+ZNN|odY&TAmEY-goK0ye1Zj@!;2=6?Ck6a zM00| zV)GZ!jgRxQJKq}u1^>g(s7U$5Wo4@vxrlqE) z=5^MyH=!0rWqy|N1J*mW>^ir%C(X?wL!UH`Sj`C?V7% zJ*(r(?n=A#Gu#fx4q5Wy1#451X_y_vhtix3Xj6H;7UGt9bNUQ(u#j zd7e#Y>N&-&8p#)GMT$zHJr))gMu*?`^iW9$1G-h`$6t5ZjMo`W4vl4gj{k5!_fq14 zKL@+7x8G|vh~C|aSdD_{yAIa0x3tLeyGL%#jhEY>zgFe?crwaBDuoK0S*JfcbKCK& zC&~1+yiTCHBRQ#HcJd3|&>o$1r`+MISHtghke6jHy|lcb-mTB9Dl%z}5wm(t;qYrc zuKk$4+ui!%wpOQo$&{b6v$|w$p+2+&2cO<@=QbojT-CG&=nhL&#W?_W(ccJv0k%rVWhWqi7g#uZxGZTc8C&i+eSQTFqE zo99vA1eLuC1kAkM-l7wH zry9TAY#1)rNh(DSsqN)#e1;CGp5CmHlP428tdr5aN&2;(R;;s@j4wu&;<*9t( z%@r9dFW^#&&K|WL;a;PH>rM#<^`o~A1dBpwzzy7>{K^La|lg`_y z>1(yM<1viUlXZ&ci5s4Vmt}O1=!#3YcY*_@UN2YaBb9Di9iBjDOl(4{m35VCg}Sna zxw72OYsnmS*;M&aPD=4(J+xj-?_pJ^Q)jZjq>k!6ij@$L$I5@yH0K@EhArXg{{X|w Btt!;7(j|NS#>EYf=ZVn zNHH`)i2_OuASm4xkaENB-ralWd(L;>IrELms>wdL^<`@Hv5Jmt{o5g|_O|s;mP0SDTiqcM{dLK?nKKDxc`gd5vivOR@{N3qaQCh3|AU)W>$EFVwxiZTF035p(CPofUY)_nHQ4UlAgV^=O;?OH3 zMn3N(HVbp>jl{9Jz?V*zQrcq*#g2YGf~#jv=VqQ`3W>*uDJ}E+KmOtT-jSDm0vX0* zw;&LADTjxZhsnC`+IRTYgx;TbKEFCVZ2NpKG?0}o#(!)3)w*M}D+E zY!ch0a@PN6W@hHD)^r@kC?VnaFz`4;Mff0ML`4_%V@CYi>)|uohroWV!P>kvWWlU$ zahuZi)V;-#!M?hmbq2&Grv0p{q2Z_a1j|+HG-jRfoVzi<`TF@AM1*-NWmVo!?o*>96Q<@3r>eDLxx-1M0WWbGIi*345{! z1_o9XAFQmbfY`VYqErMk_Wk3fs5wKi>-Ab%TGJ&31$(xkp`r3Ai5Qd#<%wX{bWLRQ z{>$0>616{nSW@s-ZdbB)8R%+Pnm>AbOH204G|9{Jl@jI7h4ptjRci?E{GvnL9MwRy zLTr+|zPgp>O@;b*%^Lo=#NrjL{9PdES*m2@*K)0o(B^Kl2GV#;1vCO}gu|qF-eM#2OW1h`< zIu73bL6#2;BdgW<&JKk3TUrRZh8CHGG~@2O=k+SNA0BR94@h%}j?8FGGY#$Es%|Cw zzH7B}c5r|?BF=Q`y^FkQy1KeLSzK7y%*W#@iMj=auxOSWbK%43MphXT0qdtBr{iDk zlh3?=%l?OcUcFIX&L5A+86@(?CktD#Ns58#VQdbY-=pL z!IE^vjXv$WQqSn%F!o5-CVh74cZxSth<^FKyIQF$(}`EXs`}tK z?1pRIp3eNa*mEt+aFs!v@g9&1_vCHlM<&8WN^&SZnfhcpl_vWAqXPRL>Tsy~SujK^ zJf6xlpAEB_59|B=Q`VQTByb4zo-J&lP}jG3fq z7Vlm#H|A9E#cCHT#$AEo_bcl<0+a?lU-a_?&K!M@5FR}L*;gBcJYR&_%Dg44+%P#4 z303Rdc4yyxGSMb*Kv5vrLRd!+>1J4=nB^sWBhS+smdPFE$oNnGPJeyQ)>?`BIp zDp!Nac`&nEy!~(AHcRU3x8?Zbi4~V;tY3QQP+2y1SOnue)OcaMbGZz)$0m${YT6uG z(e>4erNd@elP$8fCH?Um%OOZ#?2oQwdXID{*Gy$!UteRfUizub5H{};!AB1sOmPx9 z7RTc~igE@w_CMweJ8u`8lGr0;eH0n3;T%f0SoumHJe|KV$jH#271y7jvG7rR9Y&0w zxd|sQ;0cX9qso#<>C;thBA?`48`5iHaZb}WwI|fH#j_mUq%TVnyKV_F277yXY-aWO zx@i2`vg{Ch4xk}bjduN?Cvk2uQ(eu>dgk!FaSG*fZB1%XsdmJd)=6!{F|3uO+F0tN zF*O4v_v={dhi{TXqr?^UHQ$19;q2orMM1fy)q6wcKCacTjotkG{2KWFi2C-imXGmR zktdgPA?6k2t35H&aX>NKO2x)PrBhpOdMCL*A$9N(ALqIGJB}?p+*f(ebO;7nyKv7Fu!I+GP+M1rzJE7A zU${=gg-5|xR*%%AFKH@G3@X4tdF;c^g_$*7DsZmb4$XV*lgTnvt=^dI!Z=^`5}H6B zDRaqDp?Ihpsd-aBZuI@C9cNpYi}rHVL~)pdH+U{L`tU}e_watTgw=~NXh$?!j&bu1 zc2Ut#fkLnSxV#6jA(%CC8+$mSL4en0a=JPnhr&Y!ta9fgzEj?XZ>XE;sCTz?y2{Q+ zf`aaV97IhAW~++XQA4Kc$N~YXjB(qtqX?>+5Eqy#3@>Dczy0F7!flr#^N#1WAB2z+ zgG31S%0b2hb<#H|%geTLkLWcX=%?6hl*LU1GUA?DgV-9J$}9EHlz!~5y84R8x0yYN zG0grHzf1e*Jt6Pg``J@g)Y5bXaMU{KR3`F`Ygn4xvfhIQLr5-sZ-l=*S-_`DuqP%l zdPBiatxFJm^NB?uAwgnM?3BfU6EczBgk&Z-eb&liW7=RX+M-ggRfk)Qwtw)HY$Ie@;Z*uK! zJQ?~eAJon?lg-t;Aj(C)?`CFDZ!RU)?A!I0Yf=v3e^jmjC)~2$WOM=^W=P6la>ytKhVU-MwKY8VV zzH;^J-LS|sevUDdrB3yr=c6ik0k1Xvt7L9!vkntTidvw_zNxjaPP{z*S&6&+siBzB zj8}VVYHGucY=yh!<>k?zAvUoc#O0mF-44W?horoGsrG7vvuTBG4l?r@N8T3l^!RLB zWH}sxAf4IUI+P`Dr%6VV0<1{u4SBNGowr`pY!;~~;NQ(t=%l5uVwggU;T z$A$IrzoIm@zI}S`YAX?H$dhUG$DNj^uaMzIccddE)Iz81C6Q;*eYocS3->{#tna0^ zBn-Bsj}wfBpi()d%B@JbQf>TF`seV3Vjt@w^_vrUKBaB1!OmKS4<8&1k5z;5ln4CI zT7fHTnroAPrdC-!Bciq43RG8_xzdckhj!Y|+FuHYp|-{UI;(l_$@RfP4Ut;aTFMOB z%r?2s;lc2;xQyUguI_$8x9x0uX_l6YW7(2j+@iU2I7p=Bz(u}cF&{{&XXy{txwX5R zEjgVACDm>+l!ZYrLT^n-^M~(I2FZn#Y@n*fwPDDRE+)s%7a?ChE}$Us;r@6enLG@> zSWz@E@!|_^<<&N&Imd;!Mg}_G<0ScOzC`rWx#wl0_Jr5Wd&$rc_m+*Y;IF}gUb~$> z*{s|Z^3GRL7gZchQ&MYL-|7C^-x-vPYsFSw{N}`e*{~)0ZqEG-ZLRW*3dvZ)-MsfW z;KwK41j8x)8tjih->$)I$RV=|-jJ$v#U;W1w*(4#AjiQWIN7MrOQ2TM%{2682ZQ+% z-p|-1O^jpeR?Js#R;~{L$(LvJnT zr;cob9sC_lP0dzWL#nnuuSU7rcs@P-CTh?9v1@e;;G6CW6=o{DgvrAQ6bdNDF}Squ zk*uBX=E3ro7A)E5ue-z@I8ni-+F6uevMCk4iT7nMw6T3X@Z6I@8`|5CWo_DcMY_37 z38>d}(m&UjD}AkUB;PUME~mzgYYo2E|H{EG^p>y8gl|-ERd=s!g9P z$*d|`w-~&&z1>ivcv+%o(<_gCRECvbZj_M$AYU1YXhgYM|b zCgFH|mjhPvF7aXayLJsR!`C+1ng>s=y?@MC{xvBfL^&OdFQD>!Mx_caz8@d|GD(?? z2EH?BKQd<6k`B diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_selected.imageset/watchlater_selected@3x.png deleted file mode 100644 index aa8dd82b5ab346006a97c746113b27ed2f075dde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6202 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 CgKek) diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/Contents.json index 4b4d88ebcc7..3e10edcef90 100644 --- a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "watchlater.png", + "filename" : "RSS Feed.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "watchlater@2x.png", + "filename" : "RSS Feed@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "watchlater@3x.png", + "filename" : "RSS Feed@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed.png new file mode 100644 index 0000000000000000000000000000000000000000..16e879aedc9273a861c1532de11732e24abcc232 GIT binary patch literal 436 zcmV;l0ZaagP);9!EVL1BVm3rCoe-uPuuFj$4s4@lNbv=w?inHU2sIT#VPl&Ql;5s}Dz0b@Xp z9AN7r@(_3IvxFS*i3uHKLR@o|p+i%5PB=2N((TJ>s%M`A#96qnxBdys6DhK^%LR-OOX$Ll_5^5I$YX4^ObU zRNxhTK|ZKLcTp=*H1U%5$51&%^T%tvr2Y8ebrZGB{E|7x#cMj(ZXD3<_f03+|D|~Sy0w%a~Z}KM3_Dy5{bJ3iDq3h egD?u6An62gCWt!$bOO48$pmpH08e0Va6LWLmy3+7!l#!%>BD^y(0$2YH~w8s5W?qeHPJ*^}(7dkQ{=uT4+#OrcxDT%4)328T8% z)l-nv4qY#h8WWORhhqvZM3;3q`lf9{DvUwSVM>h&^p`kvI-D(}U?eO%jL`F$+U$~s zt9i50on!XKoP2~Bj2MgRoMrc5HHYx+5r?sfQ%)?;JCAB&*&=GFnzx9TKA_Q2Us=Af zo#^xV(=|NJ?>mUx}n_`!K!+iW==_Lxr zUP%oWEPb4FT4QV<*`+&Q8Hs}{mfpeqv@BitGD{p(Ed2`evuEj*FY|Zsqgc9kWfFA# z_YejiMc$!8;-K`ap@j5!pG`VU+$@qB)V-FZ7Hg0bsx2RV8Kyeu?3Squ{{d-GEZzGu zOG0$#P(ByDv)cPIOB{T4D4z=+Mc#3FY7L4$k78kL^ZuZP5Lgq=24=#VlXegaQnt3{ zVhR!yVorKa`O;FJycY3vML|JGNa4mZP(UK^bg?U3?J*-uJYD=z5E)Fl*hPvTtv4CZ z7&w;=ONhxxs77(p;oJsNfT#NsUC1|!!!n`0$M^=RFzwOapU_lz{pL$EqIZiaH(%HT zZE&0lr*EG%4qaD;Wrz*X5{7kCHF8_eMD(Yg{+{ivdn;3>0Qcsp-T+P0?#_YkeZ5QB z%o375n4=v|M|Udg(2m9ajYP};P}IVIBjMq@yNTaOGMP*!lesbe0W@&dgMo+@p#T5? M07*qoM6N<$f}vYo2LJ#7 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/RSS Feed@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..87573a3154dce6dd9f026ee15bcdac113514767b GIT binary patch literal 1138 zcmV-&1daQNP)FO4}KhhQ6s{Vj-K{&_rE9 z^q{0~FC1wFDzg1mvSJ=+5p}i} z^aeWKZzdz=0Vk^O;TM=2vZIi6pEv{g`_w(=L_2WiaqI>oK=y^d$qpkx_Kkx>VJ?Vo z>eX0HC$gYxkN<;e=_dr@o@BvXGUMeMiR0!6eleHSkXjlnsAkKQ)j3T*XkYJOCt;dw z5lE1ru1PEA(k1eP^V!tWpb=DP4duq-S=G)1+UF8>ny^XGTS};)KbW%L$QRD{?+Bo` zp!Bjj+2juSa?6wjHT#en%8h>N93s09=X=duQs_yDpo%Fgkw1T!vI0E`5%h#9dqn;` zFl8s`Nr<59j?Uyp$&~e;-1&_D6iiu#4g?GvgCcDp+^bXXpfrl0x>Ns)ZUm1&CV&&P zKu?AYJr~7T$z~$x$c!Q=rMz-DF(G|ujrV=a7w~;hlQAYwN<_djhg+j3A%b$kebv?) zm~=n2L%I}9S&g2AGyNBKbmJmT}rc5D!6jN3rHg0i? z;~O%CY;FNZ{OLRQ0$eheej;DE6^L@Ooh6>--6v#wbg73RQGODoD?Y)}5I!A^6#v7GYN(&TqqkUwj1-WEpw z4P7axGoE{V9wlpVsB@<2__Bg?O1P~km0cm^Phia{C47UFAb$dD4x1LPks_4twwm)J zexor~uATY}hZ_*@PtvZ;3UA9mif7{G$ znhh0cM)W>V`>x>F>}iRo;R>+=)vnRVWGi&rt?Wi_0L{+fC z=5S0~(fDc&8(>V(dUT(sTTl}OK@bE%5ClOG1YuG92Ri%DKJJPuUH||907*qoM6N<$ Ef{YLaWB>pF literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater.png deleted file mode 100644 index 383c8e9150c6824237bb5150adac5097c09efa65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 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 P{PCg9Fs2nJJ>vcY7gFmu diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/watchlater_unselected.imageset/watchlater@3x.png deleted file mode 100644 index 90a99e534a2a1f2a399eebd1b620612d2e71535c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3785 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 Date: Mon, 14 Nov 2022 21:12:17 +0530 Subject: [PATCH 04/10] applied refaral code --- .../ContactListUI/Sources/Model/WEVUser.swift | 86 +++++++++++++++++++ .../WEVDiscover/WEVDiscoverRootNode.swift | 68 ++++++++++++++- .../Sources/WEVRootViewController.swift | 6 +- 3 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 submodules/ContactListUI/Sources/Model/WEVUser.swift diff --git a/submodules/ContactListUI/Sources/Model/WEVUser.swift b/submodules/ContactListUI/Sources/Model/WEVUser.swift new file mode 100644 index 00000000000..30aed154da0 --- /dev/null +++ b/submodules/ContactListUI/Sources/Model/WEVUser.swift @@ -0,0 +1,86 @@ +// +// WEVChannel.swift +// _idx_ContactListUI_1D7887AF_ios_min13.0 +// +// Created by Apple on 15/09/22. +// + +import Foundation +import UIKit + +// MARK: - Crew +struct WevUser: Codable { + let userId: Int64 + let firstname: String? + let lastname: String? + let username: String? + let phone: String? + let referralcode: String? + + enum CodingKeys: String, CodingKey { + case userId = "user_id" + case firstname = "first_name" + case lastname = "last_name" + case username = "username" + case phone = "phone" + case referralcode = "referral_code" + } +} +/** + * Generate a random referral code + */ +class referalCode { + static let digits = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + + static let letters = [ + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + ]; + + static func generateRefferalCode() -> String { + var code = "" + for _ in 0..<4 { + code += letters.randomElement() ?? "" + } + for _ in 0..<1 { + code += digits.randomElement() ?? "" + } + return code + } + +} diff --git a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift index e61a61a1b67..786f807dd53 100644 --- a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift +++ b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift @@ -573,7 +573,20 @@ public class WEVDiscoverRootNode: ASDisplayNode { }) self.backgroundColor = presentationData.theme.chatList.backgroundColor - + } + + private func getUserPeer(engine: TelegramEngine, peerId: EnginePeer.Id) -> Signal { + return engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) + |> mapToSignal { peer -> Signal in + guard let peer = peer else { + return .single(nil) + } + if case let .secretChat(secretChat) = peer { + return engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: secretChat.regularPeerId)) + } else { + return .single(peer) + } + } } func twitchRealTimeSync() { @@ -1581,6 +1594,59 @@ extension WEVDiscoverRootNode: UICollectionViewDataSource { } } } +extension WEVDiscoverRootNode { + + func fetchTelegramUserInfo() { + let _ = (getUserPeer(engine: self.context.engine, peerId: self.context.account.peerId) + |> deliverOnMainQueue).start(next: { [weak self] peer in + guard let strongSelf = self else { + return + } + + if case let .user(peer) = peer { + print(peer.lastName ?? "") + strongSelf.doSaveUserData(peer: peer) + } + }) + } + + func doSaveUserData(peer: TelegramUser) { + Task { + await saveUserData(peer: peer) + } + } + + func saveUserData(peer: TelegramUser) async { + //check client is not a nil + guard let client = await self.controller.database else { + return + } + do { + + let cuurentUser = try await client + .from("user") + .select() + .eq(column: "user_id", value: "\(peer.id.id._internalGetInt64Value())") + .execute() + .decoded(to: [WevUser].self) + + //if referralcode is there use existing otherwise create a new code + let refralCode = cuurentUser.first?.referralcode ?? referalCode.generateRefferalCode() + + let _ = try await client.from("user") + .upsert( + values: WevUser(userId: peer.id.id._internalGetInt64Value(), firstname: peer.firstName, lastname: peer.lastName, username: peer.username, phone: peer.phone, referralcode: refralCode), + onConflict: "user_id", + returning: .representation, + ignoreDuplicates: false + ) + .execute() + .json() + } catch { + print(error.localizedDescription) + } + } +} extension WEVDiscoverRootNode { /// 搜索状态 enum SearchStatus { diff --git a/submodules/ContactListUI/Sources/WEVRootViewController.swift b/submodules/ContactListUI/Sources/WEVRootViewController.swift index c1ce9e6b7d4..2f0eddc4f26 100644 --- a/submodules/ContactListUI/Sources/WEVRootViewController.swift +++ b/submodules/ContactListUI/Sources/WEVRootViewController.swift @@ -87,9 +87,9 @@ public class WEVRootViewController: ViewController { self.contactsNode.refreshEmptyView() } } - //self.contactsNode.arrVideoWatchLists.append(contentsOf: fetchWatchList()) - //Need to Fix delete issues for real time - //May be that should be crash + //save current user to supabase + self.contactsNode.fetchTelegramUserInfo() + //real time sync self.contactsNode.youTubeRealTimeSync() self.contactsNode.twitchRealTimeSync() self.contactsNode.rumbleRealTimeSync() From faa89558e85fac89b1ef5d6c52e6963c0569daae Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Tue, 15 Nov 2022 23:55:37 +0530 Subject: [PATCH 05/10] apply referral code --- .../Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Sources/Search/SettingsSearchItem.swift | 2 + .../Search/SettingsSearchableItems.swift | 9 +- .../WEVApplyReferalController.swift | 136 ++++++ .../WEVApplyReferalControllerNode.swift | 393 ++++++++++++++++++ .../WEVSetting/WEVShareEarnController.swift | 2 +- .../WEVShareEarnControllerNode.swift | 65 ++- .../Sources/WEVSetting/WEVUser.swift | 86 ++++ .../WEVWatchLaterController.swift | 2 +- .../WEVWatchLaterControllerNode.swift | 2 +- .../PresentationResourcesSettings.swift | 1 + .../Sources/PeerInfo/PeerInfoScreen.swift | 7 + 12 files changed, 683 insertions(+), 23 deletions(-) create mode 100644 submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift create mode 100644 submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift create mode 100644 submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index c31b3cc7fb6..7663868d6bc 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7211,6 +7211,7 @@ Sorry for the inconvenience."; "WEV.ShareAndEarn" = "Share to Earn"; "WEV.WatchLater" = "Watch Later"; "WEV.Subscribe" = "Subscribed"; +"WEV.ApplyReferral" = "Apply Referral Code"; "Localization.TranslateMessages" = "Translate Messages"; "Localization.ShowTranslate" = "Show Translate Button"; "Localization.ShowTranslateInfo" = "Show a 'Translate' button in the message action menu."; diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift index 394cc4ca627..0402eb28492 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift @@ -55,6 +55,8 @@ extension SettingsSearchableItemIcon { return PresentationResourcesSettings.watchLater case .shareEarn: return PresentationResourcesSettings.shareEarn + case .applyReferral: + return PresentationResourcesSettings.applyReferral } } } diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift index c6bdd8e3e5a..1ecd639a69f 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift @@ -38,6 +38,7 @@ enum SettingsSearchableItemIcon { case deleteAccount case watchLater case shareEarn + case applyReferral } public enum SettingsSearchableItemId: Hashable { @@ -60,6 +61,7 @@ public enum SettingsSearchableItemId: Hashable { case deleteAccount(Int32) case watchLater(Int32) case shareEarn(Int32) + case applyReferral(Int32) private var namespace: Int32 { switch self { @@ -101,6 +103,8 @@ public enum SettingsSearchableItemId: Hashable { return 18 case .shareEarn: return 19 + case .applyReferral: + return 20 } } @@ -124,7 +128,8 @@ public enum SettingsSearchableItemId: Hashable { let .chatFolders(id), let .deleteAccount(id), let .watchLater(id), - let .shareEarn(id): + let .shareEarn(id), + let .applyReferral(id): return id } } @@ -175,6 +180,8 @@ public enum SettingsSearchableItemId: Hashable { self = .watchLater(id) case 19: self = .shareEarn(id) + case 20: + self = .applyReferral(id) default: return nil } diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift new file mode 100644 index 00000000000..5b84ead1478 --- /dev/null +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift @@ -0,0 +1,136 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import SwiftSignalKit +import TelegramCore +import TelegramPresentationData +import AccountContext +import SearchUI + +public class WEVApplyReferalController: ViewController { + private let context: AccountContext + + private var controllerNode: WEVApplyReferalControllerNode { + return self.displayNode as! WEVApplyReferalControllerNode + } + + private var _ready = Promise() + override public var ready: Promise { + return self._ready + } + + private var presentationData: PresentationData + private var presentationDataDisposable: Disposable? + + private var editItem: UIBarButtonItem! + private var doneItem: UIBarButtonItem! + + public init(context: AccountContext) { + self.context = context + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) + + self.editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + self.doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + + self.title = self.presentationData.strings.WEV_ApplyReferral + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + + self.presentationDataDisposable = (context.sharedContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + let previousTheme = strongSelf.presentationData.theme + let previousStrings = strongSelf.presentationData.strings + + strongSelf.presentationData = presentationData + + if previousTheme !== presentationData.theme || previousStrings !== presentationData.strings { + strongSelf.updateThemeAndStrings() + } + } + }) + + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + self.presentationDataDisposable?.dispose() + } + + private func updateThemeAndStrings() { + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) + //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) + self.title = self.presentationData.strings.WEV_ApplyReferral + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.controllerNode.updatePresentationData(self.presentationData) + + let editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + let doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + if self.navigationItem.rightBarButtonItem === self.editItem { + self.navigationItem.rightBarButtonItem = editItem + } else if self.navigationItem.rightBarButtonItem === self.doneItem { + self.navigationItem.rightBarButtonItem = doneItem + } + self.editItem = editItem + self.doneItem = doneItem + } + + override public func loadDisplayNode() { + self.displayNode = WEVApplyReferalControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, requestActivateSearch: { [weak self] in + self?.activateSearch() + }, requestDeactivateSearch: { [weak self] in + self?.deactivateSearch() + }, updateCanStartEditing: { [weak self] value in + guard let strongSelf = self else { + return + } + let item: UIBarButtonItem? + if let value = value { + item = value ? strongSelf.editItem : strongSelf.doneItem + } else { + item = nil + } + if strongSelf.navigationItem.rightBarButtonItem !== item { + strongSelf.navigationItem.setRightBarButton(item, animated: true) + } + }, present: { [weak self] c, a in + self?.present(c, in: .window(.root), with: a) + }, push: { [weak self] c in + self?.push(c) + }) + + + self._ready.set(self.controllerNode._ready.get()) + + self.navigationBar?.updateBackgroundAlpha(0.0, transition: .immediate) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.cleanNavigationHeight, transition: transition) + } + + @objc private func editPressed() { + self.controllerNode.toggleEditing() + } + + private func activateSearch() { + } + + private func deactivateSearch() { + } +} diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift new file mode 100644 index 00000000000..7162a05e989 --- /dev/null +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -0,0 +1,393 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import TelegramCore +import SwiftSignalKit +import TelegramPresentationData +import MergeLists +import ItemListUI +import PresentationDataUtils +import AccountContext +import ShareController +import SearchBarNode +import SearchUI +import UndoUI +import TelegramUIPreferences +import TranslateUI +import ContactListUI +import Realtime + +final class WEVApplyReferalControllerNode: ViewControllerTracingNode { + private let context: AccountContext + private var presentationData: PresentationData + private weak var navigationBar: NavigationBar? + private let requestActivateSearch: () -> Void + private let requestDeactivateSearch: () -> Void + private let present: (ViewController, Any?) -> Void + private let push: (ViewController) -> Void + + private var didSetReady = false + let _ready = ValuePromise() + + private var containerLayout: (ContainerViewLayout, CGFloat)? + private let presentationDataValue = Promise() + private let isEditing = ValuePromise(false) + private var isEditingValue: Bool = false { + didSet { + self.isEditing.set(self.isEditingValue) + } + } + + private var nodeView = UIView(frame: .zero) + private var currentLayout: CGSize = .zero + + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + self.context = context + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.navigationBar = navigationBar + self.requestActivateSearch = requestActivateSearch + self.requestDeactivateSearch = requestDeactivateSearch + self.present = present + self.push = push + super.init() + + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + deinit { + } + + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + let hadValidLayout = self.containerLayout != nil + self.containerLayout = (layout, navigationBarHeight) + + if !hadValidLayout { + self.dequeueTransitions(navigationBarHeight: navigationBarHeight) + } else { + if self.currentLayout != layout.size { + self.updateConstriant(navigationBarHeight: navigationBarHeight) + } + } + self.currentLayout = layout.size + } + + + private func updateConstriant(navigationBarHeight: CGFloat) { + nodeView.snp.remakeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.left.bottom.right.equalToSuperview() + } + } + + + private func dequeueTransitions(navigationBarHeight: CGFloat) { + guard let _ = self.containerLayout else { + return + } + + if !self.didSetReady { + self.didSetReady = true + self._ready.set(true) + self.initView(navigationBarHeight: navigationBarHeight) + self.updateView() + } + } + + func toggleEditing() { + self.isEditingValue = !self.isEditingValue + } + + private lazy var applyCodeTextField: UITextField = { + //let view = UIlable.lj.configure(font: LJFont.medium(28 * LJScreen.scaleWidthLessOfIX), textColor: LJColor.black) + + let view = UITextField(frame: CGRect.zero) + view.textColor = LJColor.black + view.font = LJFont.medium(28 * LJScreen.scaleWidthLessOfIX) + view.textAlignment = .center + view.returnKeyType = .done + view.tintColor = self.presentationData.theme.rootController.tabBar.selectedIconColor + view.delegate = self + return view + }() + + /// 编辑按键 + private lazy var inviteCodeEditButton: UIButton = { + let view = UIButton.init(type: .custom) + view.setImage(UIImage.init(named: "share_invite_code_edit"), for: .normal) + view.addTarget(self, action: #selector(editButtonAction), for: .touchUpInside) + return view + }() + + private func initView(navigationBarHeight: CGFloat) { + + let shareView = ASDisplayNode { () -> UIView in + return self.nodeView + } + self.addSubnode(shareView) + self.nodeView.backgroundColor = .clear + nodeView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.bottom.left.right.equalToSuperview() + } + + + let shareButton = UIButton.lj.configure(title: "Submit", fontSize: 14) + shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) + //view.addSubview(shareButton) + //Filter view to select channel + /*let shareButtonNode = ASDisplayNode { () -> UIView in + return shareButton + }*/ + self.nodeView.addSubview(shareButton) + shareButton.snp.makeConstraints { (make) in + make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight - 8) + make.width.equalTo(LJScreen.width * 0.9) + make.centerX.equalToSuperview() + make.height.equalTo(48) + } + + let scrollView = UIScrollView() + //view.addSubview(scrollView) + /*let scrollViewNode = ASDisplayNode { () -> UIView in + return scrollView + }*/ + self.nodeView.addSubview(scrollView) + scrollView.snp.makeConstraints { (make) in + make.top.equalToSuperview()//.offset(LJScreen.navigationBarHeight) + make.bottom.equalTo(shareButton.snp.top) + make.left.right.equalToSuperview() + } + + let containView = UIView() + scrollView.addSubview(containView) + containView.snp.makeConstraints { (make) in + make.edges.equalToSuperview() + make.width.equalTo(view) + } + + let imageView = UIImageView(image: UIImage.init(named: "share_invite_contact_bg")) + containView.addSubview(imageView) + imageView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(16) + make.size.equalTo(CGSize(width: 243, height: 194)) + make.centerX.equalToSuperview() + } + + let codeBgView: UIView = { + let codeBgView = UIView() + codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) + codeBgView.layer.cornerRadius = 16 + + let descLabel = UILabel.lj.configure(font: LJFont.regular(14), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Share your code with a friend. When they use it to register to Wweevv you will earn points!\nThe more you refer, the better the points.") + descLabel.lj.setLineSpacing() + descLabel.textAlignment = .center + descLabel.numberOfLines = 0 + codeBgView.addSubview(descLabel) + descLabel.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(24) + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + } + let youCode = UILabel.lj.configure(font: LJFont.medium(16), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Apply referral code") + codeBgView.addSubview(youCode) + youCode.snp.makeConstraints { (make) in + make.top.equalTo(descLabel.snp.bottom).offset(24) + make.centerX.equalToSuperview() + } + + let codeImageBgView: UIImageView = { + let imageView = UIImageView(image: UIImage.init(named: "share_invite_code_bg")) + imageView.addSubview(applyCodeTextField) + imageView.isUserInteractionEnabled = true + applyCodeTextField.snp.makeConstraints { (make) in + make.top.bottom.left.right.equalToSuperview() + } + + imageView.addSubview(inviteCodeEditButton) + inviteCodeEditButton.snp.makeConstraints { (make) in + make.left.equalTo(applyCodeTextField.snp.right).offset(0) + make.size.equalTo(CGSize(width: 40, height: 40)) + make.centerY.equalToSuperview() + } + return imageView + }() + + codeBgView.addSubview(codeImageBgView) + codeImageBgView.snp.makeConstraints { (make) in + make.top.equalTo(youCode.snp.bottom).offset(12) + //make.left.equalToSuperview().offset(24) + //make.right.bottom.equalToSuperview().offset(-24) + make.bottom.equalToSuperview().offset(-24) + make.width.equalTo(LJScreen.width * 0.8) + make.centerX.equalToSuperview() + make.height.equalTo(64) + } + return codeBgView + }() + + containView.addSubview(codeBgView) + codeBgView.snp.makeConstraints { (make) in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(imageView.snp.bottom).offset(32) + } + + let descPointLabel = UILabel.lj.configure(font: LJFont.regular(12), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "1 invite = 2 points, 10 invites = 25 points, 50 invites = 200 points, 100 invites = 500 points and 250 invites = 3,000 points!") + descPointLabel.lj.setLineSpacing() + descPointLabel.textAlignment = .center + descPointLabel.numberOfLines = 0 + containView.addSubview(descPointLabel) + descPointLabel.snp.makeConstraints { (make) in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(codeBgView.snp.bottom).offset(24) + make.bottom.equalToSuperview().offset(-50) + } + + applyCodeTextField.becomeFirstResponder() + } + + private func updateView() { + applyCodeTextField.text = "" //LJUser.user.inviteCode + inviteCodeEditButton.isHidden = true //LJUser.user.editInviteCode + } + + //MARK: - Action + + @objc private func shareButtonAction() { + /*MBProgressHUD.showAdded(to: self.view, animated: true) + WEVShareManager.manger.shareApp(from: self) {[weak self] (isSuccess) in + guard let self = self else {return} + MBProgressHUD.hide(for: self.view, animated: true) + }*/ + } + + weak var editAlertAction: UIAlertAction? + + /// 点击编辑按键 + @objc private func editButtonAction() { + /*let alert = UIAlertController.init(title: "Please note that each account is only allowed to edit the Referral code once.", message: nil, preferredStyle: .alert) + alert.addAction(.init(title: "OK", style: .default, handler: { (_) in + self.showEditInviteCodeAlert(code: LJUser.user.inviteCode) + })) + present(alert, animated: true, completion: nil)*/ + } + + /// 显示编辑弹窗 + /// - Parameter code: 已经填写的邀请码 + private func showEditInviteCodeAlert(code: String?) { + /*let editAlert = UIAlertController.init(title: "Referral Code", message: nil, preferredStyle: .alert) + editAlert.addTextField { (textField) in + textField.textColor = LJColor.hex(0x141419) + textField.font = LJFont.regular(13) + textField.addTarget(self, action: #selector(self.textFieldDidChanged(_:)), for: .editingChanged) + textField.text = code + } + let editAction = UIAlertAction.init(title: "Save", style: .default, handler: {[weak editAlert] (_) in + guard let code = editAlert?.textFields?.first?.text else {return} + self.editInvieteCodeRequest(code) { (isSuccess) in + if !isSuccess { + // 修改接口失败,重新显示旧的弹窗 + self.showEditInviteCodeAlert(code: code) + } + } + }) + editAlert.addAction(.init(title: "Cancel", style: .cancel, handler: nil)) + editAlert.addAction(editAction) + editAlertAction = editAction + present(editAlert, animated: true, completion: nil) + checkEditingInviteCode(code ?? "")*/ + } + + @objc private func textFieldDidChanged(_ textField: UITextField) { + guard let text = textField.text else { return } + let max = 10 + if text.count > max { + textField.text = String(text.prefix(max)) + } + checkEditingInviteCode(text) + } + + @discardableResult + private func checkEditingInviteCode(_ code: String) -> Bool { + let min = 4 + let isEnabled = code.count >= min + editAlertAction?.isEnabled = isEnabled + return isEnabled + } + + //MARK: - Request + + /// 更改邀请码请求 + private func editInvieteCodeRequest(_ code: String, completion: @escaping (Bool) -> ()) { + /*MBProgressHUD.showAdded(to: self.view, animated: true) + LJNetManager.Profile.editInviteCode(inviteCode: code) {[weak self] (result) in + guard let self = self else {return} + MBProgressHUD.hide(for: self.view, animated: true) + if result.isSuccess { + LJUser.user.inviteCode = code + LJUser.user.editInviteCode = true + LJUser.user.saveLocalData() + self.updateView() + }else { + MBProgressHUD.lj.showHint(result.message) + } + completion(result.isSuccess) + }*/ + } + +} + +extension WEVApplyReferalControllerNode: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return false + } + + func doSaveUserData(peer: TelegramUser) { + Task { + await saveUserData(peer: peer) + } + } + + func saveUserData(peer: TelegramUser) async { + //check client is not a nil + guard let client = await self.controller.database else { + return + } + do { + + let cuurentUser = try await client + .from("user") + .select() + .eq(column: "user_id", value: "\(peer.id.id._internalGetInt64Value())") + .execute() + .decoded(to: [WevUser].self) + + //if referralcode is there use existing otherwise create a new code + let refralCode = cuurentUser.first?.referralcode ?? referalCode.generateRefferalCode() + + let _ = try await client.from("user") + .upsert( + values: WevUser(userId: peer.id.id._internalGetInt64Value(), firstname: peer.firstName, lastname: peer.lastName, username: peer.username, phone: peer.phone, referralcode: refralCode), + onConflict: "user_id", + returning: .representation, + ignoreDuplicates: false + ) + .execute() + .json() + } catch { + print(error.localizedDescription) + } + } + +} diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift index e1daa725ef5..2338c6f6685 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift @@ -71,7 +71,7 @@ public class WEVShareEarnController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) - self.title = self.presentationData.strings.Settings_AppLanguage + self.title = self.presentationData.strings.WEV_ShareAndEarn self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) self.controllerNode.updatePresentationData(self.presentationData) diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift index 46464613f4f..2fc2e5c9b17 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift @@ -19,7 +19,7 @@ import TranslateUI import ContactListUI -final class WEVShareEarnControllerNode: ASDisplayNode { +final class WEVShareEarnControllerNode: ViewControllerTracingNode { private let context: AccountContext private var presentationData: PresentationData private weak var navigationBar: NavigationBar? @@ -34,6 +34,9 @@ final class WEVShareEarnControllerNode: ASDisplayNode { private var containerLayout: (ContainerViewLayout, CGFloat)? private let presentationDataValue = Promise() private let isEditing = ValuePromise(false) + private var nodeView = UIView(frame: .zero) + private var currentLayout: CGSize = .zero + private var isEditingValue: Bool = false { didSet { self.isEditing.set(self.isEditingValue) @@ -49,9 +52,6 @@ final class WEVShareEarnControllerNode: ASDisplayNode { self.requestDeactivateSearch = requestDeactivateSearch self.present = present self.push = push - print(context.account.id.int64) - print(context.account.peerId.id._internalGetInt64Value()) - print(context.account.peerId) super.init() self.backgroundColor = presentationData.theme.list.blocksBackgroundColor @@ -71,11 +71,16 @@ final class WEVShareEarnControllerNode: ASDisplayNode { self.containerLayout = (layout, navigationBarHeight) if !hadValidLayout { - self.dequeueTransitions() + self.dequeueTransitions(navigationBarHeight: navigationBarHeight) + } else { + if self.currentLayout != layout.size { + self.updateConstriant(navigationBarHeight: navigationBarHeight) + } } + self.currentLayout = layout.size } - private func dequeueTransitions() { + private func dequeueTransitions(navigationBarHeight: CGFloat) { guard let _ = self.containerLayout else { return } @@ -83,10 +88,17 @@ final class WEVShareEarnControllerNode: ASDisplayNode { if !self.didSetReady { self.didSetReady = true self._ready.set(true) - self.initView() + self.initView(navigationBarHeight: navigationBarHeight) self.updateView() } } + + private func updateConstriant(navigationBarHeight: CGFloat) { + nodeView.snp.remakeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.left.bottom.right.equalToSuperview() + } + } func toggleEditing() { self.isEditingValue = !self.isEditingValue @@ -106,30 +118,42 @@ final class WEVShareEarnControllerNode: ASDisplayNode { return view }() - private func initView() { + private func initView(navigationBarHeight: CGFloat) { + + let shareView = ASDisplayNode { () -> UIView in + return self.nodeView + } + self.addSubnode(shareView) + self.nodeView.backgroundColor = .clear + nodeView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.bottom.left.right.equalToSuperview() + } + + let shareButton = UIButton.lj.configure(title: "Share my code", fontSize: 14) shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) //view.addSubview(shareButton) //Filter view to select channel - let shareButtonNode = ASDisplayNode { () -> UIView in + /*let shareButtonNode = ASDisplayNode { () -> UIView in return shareButton - } - self.addSubnode(shareButtonNode) + }*/ + self.nodeView.addSubview(shareButton) shareButton.snp.makeConstraints { (make) in make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight - 8) - make.left.equalToSuperview().offset(30) - make.right.equalToSuperview().offset(-30) + make.width.equalTo(LJScreen.width * 0.9) + make.centerX.equalToSuperview() make.height.equalTo(48) } let scrollView = UIScrollView() //view.addSubview(scrollView) - let scrollViewNode = ASDisplayNode { () -> UIView in + /*let scrollViewNode = ASDisplayNode { () -> UIView in return scrollView - } - self.addSubnode(scrollViewNode) + }*/ + self.nodeView.addSubview(scrollView) scrollView.snp.makeConstraints { (make) in - make.top.equalToSuperview().offset(LJScreen.navigationBarHeight) + make.top.equalToSuperview()//.offset(LJScreen.navigationBarHeight) make.bottom.equalTo(shareButton.snp.top).offset(-30) make.left.right.equalToSuperview() } @@ -191,8 +215,11 @@ final class WEVShareEarnControllerNode: ASDisplayNode { codeBgView.addSubview(codeImageBgView) codeImageBgView.snp.makeConstraints { (make) in make.top.equalTo(youCode.snp.bottom).offset(12) - make.left.equalToSuperview().offset(24) - make.right.bottom.equalToSuperview().offset(-24) + //make.left.equalToSuperview().offset(24) + //make.right.bottom.equalToSuperview().offset(-24) + make.bottom.equalToSuperview().offset(-24) + make.width.equalTo(LJScreen.width * 0.8) + make.centerX.equalToSuperview() make.height.equalTo(64) } return codeBgView diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift new file mode 100644 index 00000000000..30aed154da0 --- /dev/null +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift @@ -0,0 +1,86 @@ +// +// WEVChannel.swift +// _idx_ContactListUI_1D7887AF_ios_min13.0 +// +// Created by Apple on 15/09/22. +// + +import Foundation +import UIKit + +// MARK: - Crew +struct WevUser: Codable { + let userId: Int64 + let firstname: String? + let lastname: String? + let username: String? + let phone: String? + let referralcode: String? + + enum CodingKeys: String, CodingKey { + case userId = "user_id" + case firstname = "first_name" + case lastname = "last_name" + case username = "username" + case phone = "phone" + case referralcode = "referral_code" + } +} +/** + * Generate a random referral code + */ +class referalCode { + static let digits = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + + static let letters = [ + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + ]; + + static func generateRefferalCode() -> String { + var code = "" + for _ in 0..<4 { + code += letters.randomElement() ?? "" + } + for _ in 0..<1 { + code += digits.randomElement() ?? "" + } + return code + } + +} diff --git a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift index b55e70cc473..353b5d76266 100644 --- a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift +++ b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift @@ -74,7 +74,7 @@ public class WEVWatchLaterController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) - self.title = self.presentationData.strings.Settings_AppLanguage + self.title = self.presentationData.strings.WEV_WatchLater self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) self.controllerNode.updatePresentationData(self.presentationData) diff --git a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift index 45a18511fe9..da05103a1bb 100644 --- a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift @@ -20,7 +20,7 @@ import ContactListUI import PostgREST import GalleryUI -final class WEVWatchLaterControllerNode: ASDisplayNode { +final class WEVWatchLaterControllerNode: ViewControllerTracingNode { private let context: AccountContext private var presentationData: PresentationData private weak var navigationBar: NavigationBar? diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift index e3aa8f48b53..0e0f8da7811 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift @@ -39,6 +39,7 @@ public struct PresentationResourcesSettings { public static let watchLater = renderIcon(name: "Settings/Menu/watchLater") public static let shareEarn = renderIcon(name: "Settings/Menu/shareEarn") + public static let applyReferral = renderIcon(name: "Settings/Menu/shareEarn") public static let deleteAccount = renderIcon(name: "Chat/Info/GroupRemovedIcon") diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index b0bac1ab73e..827e2f33c0f 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -445,6 +445,7 @@ private enum PeerInfoSettingsSection { case rememberPassword case watchLater case shareEarn + case applyReferral } private final class PeerInfoInteraction { @@ -762,6 +763,10 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p interaction.openSettings(.shareEarn) })) + items[.wev]!.append(PeerInfoScreenDisclosureItem(id: 20, text: presentationData.strings.WEV_ApplyReferral, icon: PresentationResourcesSettings.applyReferral, action: { + interaction.openSettings(.applyReferral) + })) + //add share and earn @@ -6301,6 +6306,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate push(WEVWatchLaterController(context: self.context)) case .shareEarn: push(WEVShareEarnController(context: self.context)) + case .applyReferral: + push(WEVApplyReferalController(context: self.context)) case .passport: self.controller?.push(SecureIdAuthController(context: self.context, mode: .list)) case .watch: From ba1f960aeb8107e22e600e7138ecc10c5ec6bc18 Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Wed, 16 Nov 2022 23:43:30 +0530 Subject: [PATCH 06/10] applied referral code feature --- .../WEVApplyReferalController.swift | 2 +- .../WEVApplyReferalControllerNode.swift | 159 +++++++- .../WEVSetting/WEVPointsController.swift | 136 +++++++ .../WEVSetting/WEVPointsControllerNode.swift | 381 ++++++++++++++++++ .../WEVShareEarnControllerNode.swift | 53 ++- .../Sources/WEVSetting/WEVUser.swift | 103 +++-- .../WEVWatchLaterController.swift | 1 + .../Contents.json | 23 ++ .../rewards_wallet_point.png | Bin 0 -> 3291 bytes .../rewards_wallet_point@2x.png | Bin 0 -> 7968 bytes .../rewards_wallet_point@3x.png | Bin 0 -> 14165 bytes .../wallet_bubble.imageset/Contents.json | 23 ++ .../wweevv/wallet_bubble.imageset/Group 5.png | Bin 0 -> 5442 bytes .../wallet_bubble.imageset/Group 5@2x.png | Bin 0 -> 13335 bytes .../wallet_bubble.imageset/Group 5@3x.png | Bin 0 -> 22537 bytes .../wallet_clap_icon.imageset/Contents.json | 23 ++ .../Rectangle 15.png | Bin 0 -> 17770 bytes .../Rectangle 15@2x.png | Bin 0 -> 42375 bytes .../Rectangle 15@3x.png | Bin 0 -> 51748 bytes 19 files changed, 823 insertions(+), 81 deletions(-) create mode 100644 submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift create mode 100644 submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_clap_icon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_clap_icon.imageset/Rectangle 15.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_clap_icon.imageset/Rectangle 15@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/wweevv/wallet_clap_icon.imageset/Rectangle 15@3x.png diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift index 5b84ead1478..ea13fa0fd54 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalController.swift @@ -87,7 +87,7 @@ public class WEVApplyReferalController: ViewController { } override public func loadDisplayNode() { - self.displayNode = WEVApplyReferalControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, requestActivateSearch: { [weak self] in + self.displayNode = WEVApplyReferalControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, controller: self, requestActivateSearch: { [weak self] in self?.activateSearch() }, requestDeactivateSearch: { [weak self] in self?.deactivateSearch() diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift index 7162a05e989..5515dfb670c 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -17,7 +17,8 @@ import UndoUI import TelegramUIPreferences import TranslateUI import ContactListUI -import Realtime +import PostgREST +import MBProgressHUD final class WEVApplyReferalControllerNode: ViewControllerTracingNode { private let context: AccountContext @@ -42,8 +43,13 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { private var nodeView = UIView(frame: .zero) private var currentLayout: CGSize = .zero + private var client: PostgrestClient? + private var shareButton = UIButton(frame: .zero) + private let controller: WEVApplyReferalController? + private var descLabel = UILabel(frame: .zero) - init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVApplyReferalController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + self.controller = controller self.context = context self.presentationData = presentationData self.presentationDataValue.set(.single(presentationData)) @@ -97,8 +103,15 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { if !self.didSetReady { self.didSetReady = true self._ready.set(true) + //set postgress client + client = PostgrestClient( + url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + schema: "public") + self.initView(navigationBarHeight: navigationBarHeight) self.updateView() + self.doGetUserData() } } @@ -140,7 +153,7 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { } - let shareButton = UIButton.lj.configure(title: "Submit", fontSize: 14) + shareButton = UIButton.lj.configure(title: "Submit", fontSize: 14) shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) //view.addSubview(shareButton) //Filter view to select channel @@ -187,11 +200,12 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) codeBgView.layer.cornerRadius = 16 - let descLabel = UILabel.lj.configure(font: LJFont.regular(14), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Share your code with a friend. When they use it to register to Wweevv you will earn points!\nThe more you refer, the better the points.") + descLabel = UILabel.lj.configure(font: LJFont.medium(28 * LJScreen.scaleWidthLessOfIX), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Points") descLabel.lj.setLineSpacing() descLabel.textAlignment = .center descLabel.numberOfLines = 0 codeBgView.addSubview(descLabel) + descLabel.snp.makeConstraints { (make) in make.top.equalToSuperview().offset(24) make.left.equalToSuperview().offset(15) @@ -269,6 +283,16 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { guard let self = self else {return} MBProgressHUD.hide(for: self.view, animated: true) }*/ + + guard let code = applyCodeTextField.text, code.count >= 5 else { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("Please enter valid referral code") + } + return + } + //call function to apply referral code + self.shareButton.isEnabled = false + self.doApplyReferralCode(code: code) } weak var editAlertAction: UIAlertAction? @@ -344,7 +368,6 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { completion(result.isSuccess) }*/ } - } extension WEVApplyReferalControllerNode: UITextFieldDelegate { @@ -353,41 +376,135 @@ extension WEVApplyReferalControllerNode: UITextFieldDelegate { return false } - func doSaveUserData(peer: TelegramUser) { + func doApplyReferralCode(code: String) { Task { - await saveUserData(peer: peer) + await applyReferralCode(code: code) } } - func saveUserData(peer: TelegramUser) async { + func applyReferralCode(code: String) async { //check client is not a nil - guard let client = await self.controller.database else { + guard let client = client else { + DispatchQueue.main.async { + self.shareButton.isEnabled = true + } return } do { - let cuurentUser = try await client + let currentUser = try await client .from("user") .select() - .eq(column: "user_id", value: "\(peer.id.id._internalGetInt64Value())") + .eq(column: "referral_code", value: code.uppercased()) .execute() .decoded(to: [WevUser].self) - //if referralcode is there use existing otherwise create a new code - let refralCode = cuurentUser.first?.referralcode ?? referalCode.generateRefferalCode() + guard let user = currentUser.first else { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("Please enter valid referral code") + self.shareButton.isEnabled = true + } + return + } + + if user.userId == self.context.account.peerId.id._internalGetInt64Value() { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("You can't use your referral code your self") + self.shareButton.isEnabled = true + } + return + } - let _ = try await client.from("user") - .upsert( - values: WevUser(userId: peer.id.id._internalGetInt64Value(), firstname: peer.firstName, lastname: peer.lastName, username: peer.username, phone: peer.phone, referralcode: refralCode), - onConflict: "user_id", - returning: .representation, - ignoreDuplicates: false - ) + let point = try await client.from("points") + .select() + .match(query: ["user_id":"\(self.context.account.peerId.id._internalGetInt64Value())","point_type": 1]) .execute() - .json() + .decoded(to: [Points].self) + + guard point.isEmpty else { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("You have already used redeem points") + self.shareButton.isEnabled = true + } + return + } + + let pointType = try await client.from("points_type") + .select() + .execute() + .decoded(to: [PointsType].self) + + guard let type1 = pointType.first(where: {$0.type == 1}), let type2 = pointType.first(where: {$0.type == 2}) else { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("Point type data are missing") + self.shareButton.isEnabled = true + } + return + } + + let insertedPoints = try await client.from("points") + .insert( + values:[ + PointsInsert(userId: self.context.account.peerId.id._internalGetInt64Value(), pointType: type1.type, points: type1.points, friendUserId: user.userId), + PointsInsert(userId: user.userId, pointType: type2.type, points: type2.points, friendUserId: self.context.account.peerId.id._internalGetInt64Value()), + ], + returning: .representation + ) + .execute() + .decoded(to: [Points].self).first + + guard let pointIds = insertedPoints else { + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("something went wrong") + self.shareButton.isEnabled = true + } + return + } + + print(pointIds) + DispatchQueue.main.async { + MBProgressHUD.lj.showHint("You have successfully applied referral code.") + self.shareButton.isEnabled = true + self.applyCodeTextField.text = "" + /*guard let navController = self.controller?.navigationController else { + return + }*/ + //navController.popViewController(animated: true) + self.doGetUserData() + } } catch { print(error.localizedDescription) } } +} +extension WEVApplyReferalControllerNode { + + func doGetUserData() { + Task { + await getUserData() + } + } + func getUserData() async { + //check client is not a nil + guard let client = client else { + return + } + + do { + let currentUser = try await client + .from("fetch_pointscount_view") + .select() + .eq(column: "user_id", value: "\(self.context.account.peerId.id._internalGetInt64Value())") + .execute() + .decoded(to: [UserPoints].self).first + + DispatchQueue.main.async { + self.descLabel.text = "\(currentUser?.points ?? 0) Points" + } + + } catch { + print(error.localizedDescription) + } + } } diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift new file mode 100644 index 00000000000..0b017930f6e --- /dev/null +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift @@ -0,0 +1,136 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import SwiftSignalKit +import TelegramCore +import TelegramPresentationData +import AccountContext +import SearchUI + +public class WEVPointsController: ViewController { + private let context: AccountContext + + private var controllerNode: WEVPointsControllerNode { + return self.displayNode as! WEVPointsControllerNode + } + + private var _ready = Promise() + override public var ready: Promise { + return self._ready + } + + private var presentationData: PresentationData + private var presentationDataDisposable: Disposable? + + private var editItem: UIBarButtonItem! + private var doneItem: UIBarButtonItem! + + public init(context: AccountContext) { + self.context = context + + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + + super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) + + self.editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + self.doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + + self.title = self.presentationData.strings.WEV_ShareAndEarn + + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + + self.presentationDataDisposable = (context.sharedContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + let previousTheme = strongSelf.presentationData.theme + let previousStrings = strongSelf.presentationData.strings + + strongSelf.presentationData = presentationData + + if previousTheme !== presentationData.theme || previousStrings !== presentationData.strings { + strongSelf.updateThemeAndStrings() + } + } + }) + + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + self.presentationDataDisposable?.dispose() + } + + private func updateThemeAndStrings() { + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) + //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) + self.title = self.presentationData.strings.WEV_ShareAndEarn + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.controllerNode.updatePresentationData(self.presentationData) + + let editItem = UIBarButtonItem(title: self.presentationData.strings.Common_Done, style: .done, target: self, action: #selector(self.editPressed)) + let doneItem = UIBarButtonItem(title: self.presentationData.strings.Common_Edit, style: .plain, target: self, action: #selector(self.editPressed)) + if self.navigationItem.rightBarButtonItem === self.editItem { + self.navigationItem.rightBarButtonItem = editItem + } else if self.navigationItem.rightBarButtonItem === self.doneItem { + self.navigationItem.rightBarButtonItem = doneItem + } + self.editItem = editItem + self.doneItem = doneItem + } + + override public func loadDisplayNode() { + self.displayNode = WEVPointsControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, requestActivateSearch: { [weak self] in + self?.activateSearch() + }, requestDeactivateSearch: { [weak self] in + self?.deactivateSearch() + }, updateCanStartEditing: { [weak self] value in + guard let strongSelf = self else { + return + } + let item: UIBarButtonItem? + if let value = value { + item = value ? strongSelf.editItem : strongSelf.doneItem + } else { + item = nil + } + if strongSelf.navigationItem.rightBarButtonItem !== item { + strongSelf.navigationItem.setRightBarButton(item, animated: true) + } + }, present: { [weak self] c, a in + self?.present(c, in: .window(.root), with: a) + }, push: { [weak self] c in + self?.push(c) + }) + + + self._ready.set(self.controllerNode._ready.get()) + + self.navigationBar?.updateBackgroundAlpha(0.0, transition: .immediate) + + self.displayNodeDidLoad() + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.cleanNavigationHeight, transition: transition) + } + + @objc private func editPressed() { + self.controllerNode.toggleEditing() + } + + private func activateSearch() { + } + + private func deactivateSearch() { + } +} diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift new file mode 100644 index 00000000000..e05ddaccc81 --- /dev/null +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift @@ -0,0 +1,381 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import Postbox +import TelegramCore +import SwiftSignalKit +import TelegramPresentationData +import MergeLists +import ItemListUI +import PresentationDataUtils +import AccountContext +import ShareController +import SearchBarNode +import SearchUI +import UndoUI +import TelegramUIPreferences +import TranslateUI +import ContactListUI +import PostgREST + +final class WEVShareEarnControllerNode: ViewControllerTracingNode { + private let context: AccountContext + private var presentationData: PresentationData + private weak var navigationBar: NavigationBar? + private let requestActivateSearch: () -> Void + private let requestDeactivateSearch: () -> Void + private let present: (ViewController, Any?) -> Void + private let push: (ViewController) -> Void + + private var didSetReady = false + let _ready = ValuePromise() + + private var containerLayout: (ContainerViewLayout, CGFloat)? + private let presentationDataValue = Promise() + private let isEditing = ValuePromise(false) + private var nodeView = UIView(frame: .zero) + private var currentLayout: CGSize = .zero + private var client: PostgrestClient? + + private var isEditingValue: Bool = false { + didSet { + self.isEditing.set(self.isEditingValue) + } + } + + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + self.context = context + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.navigationBar = navigationBar + self.requestActivateSearch = requestActivateSearch + self.requestDeactivateSearch = requestDeactivateSearch + self.present = present + self.push = push + super.init() + + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + deinit { + } + + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + self.presentationDataValue.set(.single(presentationData)) + self.backgroundColor = presentationData.theme.list.blocksBackgroundColor + } + + func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + let hadValidLayout = self.containerLayout != nil + self.containerLayout = (layout, navigationBarHeight) + + if !hadValidLayout { + self.dequeueTransitions(navigationBarHeight: navigationBarHeight) + } else { + if self.currentLayout != layout.size { + self.updateConstriant(navigationBarHeight: navigationBarHeight) + } + } + self.currentLayout = layout.size + } + + private func dequeueTransitions(navigationBarHeight: CGFloat) { + guard let _ = self.containerLayout else { + return + } + + if !self.didSetReady { + self.didSetReady = true + self._ready.set(true) + //set postgress client + client = PostgrestClient( + url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + schema: "public") + //get user Data and set referral code + self.doGetUserData() + self.initView(navigationBarHeight: navigationBarHeight) + } + } + + private func updateConstriant(navigationBarHeight: CGFloat) { + nodeView.snp.remakeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.left.bottom.right.equalToSuperview() + } + } + + func toggleEditing() { + self.isEditingValue = !self.isEditingValue + } + + private lazy var inviteCodeLabel: UILabel = { + let view = UILabel.lj.configure(font: LJFont.medium(28 * LJScreen.scaleWidthLessOfIX), textColor: LJColor.black) + view.textAlignment = .center + return view + }() + + /// 编辑按键 + private lazy var inviteCodeEditButton: UIButton = { + let view = UIButton.init(type: .custom) + view.setImage(UIImage.init(named: "share_invite_code_edit"), for: .normal) + view.addTarget(self, action: #selector(editButtonAction), for: .touchUpInside) + view.isHidden = true + return view + }() + + private func initView(navigationBarHeight: CGFloat) { + + let shareView = ASDisplayNode { () -> UIView in + return self.nodeView + } + self.addSubnode(shareView) + self.nodeView.backgroundColor = .clear + nodeView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.bottom.left.right.equalToSuperview() + } + + + let shareButton = UIButton.lj.configure(title: "Share my code", fontSize: 14) + shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) + //view.addSubview(shareButton) + //Filter view to select channel + /*let shareButtonNode = ASDisplayNode { () -> UIView in + return shareButton + }*/ + self.nodeView.addSubview(shareButton) + shareButton.snp.makeConstraints { (make) in + make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight - 8) + make.width.equalTo(LJScreen.width * 0.9) + make.centerX.equalToSuperview() + make.height.equalTo(48) + } + + let scrollView = UIScrollView() + //view.addSubview(scrollView) + /*let scrollViewNode = ASDisplayNode { () -> UIView in + return scrollView + }*/ + self.nodeView.addSubview(scrollView) + scrollView.snp.makeConstraints { (make) in + make.top.equalToSuperview()//.offset(LJScreen.navigationBarHeight) + make.bottom.equalTo(shareButton.snp.top).offset(-30) + make.left.right.equalToSuperview() + } + + let containView = UIView() + scrollView.addSubview(containView) + containView.snp.makeConstraints { (make) in + make.edges.equalToSuperview() + make.width.equalTo(view) + } + + let imageView = UIImageView(image: UIImage.init(named: "share_invite_contact_bg")) + containView.addSubview(imageView) + imageView.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(16) + make.size.equalTo(CGSize(width: 243, height: 194)) + make.centerX.equalToSuperview() + } + + let codeBgView: UIView = { + let codeBgView = UIView() + codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) + codeBgView.layer.cornerRadius = 16 + + let descLabel = UILabel.lj.configure(font: LJFont.regular(14), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Share your code with a friend. When they use it to register to Wweevv you will earn points!\nThe more you refer, the better the points.") + descLabel.lj.setLineSpacing() + descLabel.textAlignment = .center + descLabel.numberOfLines = 0 + codeBgView.addSubview(descLabel) + descLabel.snp.makeConstraints { (make) in + make.top.equalToSuperview().offset(24) + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + } + let youCode = UILabel.lj.configure(font: LJFont.medium(16), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Your code") + codeBgView.addSubview(youCode) + youCode.snp.makeConstraints { (make) in + make.top.equalTo(descLabel.snp.bottom).offset(24) + make.centerX.equalToSuperview() + } + + let codeImageBgView: UIImageView = { + let imageView = UIImageView(image: UIImage.init(named: "share_invite_code_bg")) + imageView.addSubview(inviteCodeLabel) + imageView.isUserInteractionEnabled = true + inviteCodeLabel.snp.makeConstraints { (make) in + make.center.equalToSuperview() + } + + imageView.addSubview(inviteCodeEditButton) + inviteCodeEditButton.snp.makeConstraints { (make) in + make.left.equalTo(inviteCodeLabel.snp.right).offset(0) + make.size.equalTo(CGSize(width: 40, height: 40)) + make.centerY.equalToSuperview() + } + return imageView + }() + + codeBgView.addSubview(codeImageBgView) + codeImageBgView.snp.makeConstraints { (make) in + make.top.equalTo(youCode.snp.bottom).offset(12) + //make.left.equalToSuperview().offset(24) + //make.right.bottom.equalToSuperview().offset(-24) + make.bottom.equalToSuperview().offset(-24) + make.width.equalTo(LJScreen.width * 0.8) + make.centerX.equalToSuperview() + make.height.equalTo(64) + } + return codeBgView + }() + + containView.addSubview(codeBgView) + codeBgView.snp.makeConstraints { (make) in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(imageView.snp.bottom).offset(32) + } + + let descPointLabel = UILabel.lj.configure(font: LJFont.regular(12), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "1 invite = 2 points, 10 invites = 25 points, 50 invites = 200 points, 100 invites = 500 points and 250 invites = 3,000 points!") + descPointLabel.lj.setLineSpacing() + descPointLabel.textAlignment = .center + descPointLabel.numberOfLines = 0 + containView.addSubview(descPointLabel) + descPointLabel.snp.makeConstraints { (make) in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalTo(codeBgView.snp.bottom).offset(24) + make.bottom.equalToSuperview().offset(-20) + } + } + + private func updateView(code: String) { + inviteCodeLabel.text = code //LJUser.user.inviteCode + inviteCodeEditButton.isHidden = true //LJUser.user.editInviteCode + } + + //MARK: - Action + + @objc private func shareButtonAction() { + /*MBProgressHUD.showAdded(to: self.view, animated: true) + WEVShareManager.manger.shareApp(from: self) {[weak self] (isSuccess) in + guard let self = self else {return} + MBProgressHUD.hide(for: self.view, animated: true) + }*/ + } + + weak var editAlertAction: UIAlertAction? + + /// 点击编辑按键 + @objc private func editButtonAction() { + /*let alert = UIAlertController.init(title: "Please note that each account is only allowed to edit the Referral code once.", message: nil, preferredStyle: .alert) + alert.addAction(.init(title: "OK", style: .default, handler: { (_) in + self.showEditInviteCodeAlert(code: LJUser.user.inviteCode) + })) + present(alert, animated: true, completion: nil)*/ + } + + /// 显示编辑弹窗 + /// - Parameter code: 已经填写的邀请码 + private func showEditInviteCodeAlert(code: String?) { + /*let editAlert = UIAlertController.init(title: "Referral Code", message: nil, preferredStyle: .alert) + editAlert.addTextField { (textField) in + textField.textColor = LJColor.hex(0x141419) + textField.font = LJFont.regular(13) + textField.addTarget(self, action: #selector(self.textFieldDidChanged(_:)), for: .editingChanged) + textField.text = code + } + let editAction = UIAlertAction.init(title: "Save", style: .default, handler: {[weak editAlert] (_) in + guard let code = editAlert?.textFields?.first?.text else {return} + self.editInvieteCodeRequest(code) { (isSuccess) in + if !isSuccess { + // 修改接口失败,重新显示旧的弹窗 + self.showEditInviteCodeAlert(code: code) + } + } + }) + editAlert.addAction(.init(title: "Cancel", style: .cancel, handler: nil)) + editAlert.addAction(editAction) + editAlertAction = editAction + present(editAlert, animated: true, completion: nil) + checkEditingInviteCode(code ?? "")*/ + } + + @objc private func textFieldDidChanged(_ textField: UITextField) { + guard let text = textField.text else { return } + let max = 10 + if text.count > max { + textField.text = String(text.prefix(max)) + } + checkEditingInviteCode(text) + } + + @discardableResult + private func checkEditingInviteCode(_ code: String) -> Bool { + let min = 4 + let isEnabled = code.count >= min + editAlertAction?.isEnabled = isEnabled + return isEnabled + } + + //MARK: - Request + + /// 更改邀请码请求 + private func editInvieteCodeRequest(_ code: String, completion: @escaping (Bool) -> ()) { + /*MBProgressHUD.showAdded(to: self.view, animated: true) + LJNetManager.Profile.editInviteCode(inviteCode: code) {[weak self] (result) in + guard let self = self else {return} + MBProgressHUD.hide(for: self.view, animated: true) + if result.isSuccess { + LJUser.user.inviteCode = code + LJUser.user.editInviteCode = true + LJUser.user.saveLocalData() + self.updateView() + }else { + MBProgressHUD.lj.showHint(result.message) + } + completion(result.isSuccess) + }*/ + } + +} + +extension WEVShareEarnControllerNode { + + func doGetUserData() { + Task { + await getUserData() + } + } + + func getUserData() async { + //check client is not a nil + guard let client = client else { + return + } + + do { + let currentUser = try await client + .from("user") + .select() + .eq(column: "user_id", value: "\(self.context.account.peerId.id._internalGetInt64Value())") + .execute() + .decoded(to: [WevUser].self).first + + guard let code = currentUser?.referralcode else { + return + } + //Set referral code + DispatchQueue.main.async { + self.updateView(code: code) + } + + } catch { + print(error.localizedDescription) + } + } +} diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift index 2fc2e5c9b17..cae1de8535b 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift @@ -17,9 +17,9 @@ import UndoUI import TelegramUIPreferences import TranslateUI import ContactListUI +import PostgREST - -final class WEVShareEarnControllerNode: ViewControllerTracingNode { +final class WEVPointsControllerNode: ViewControllerTracingNode { private let context: AccountContext private var presentationData: PresentationData private weak var navigationBar: NavigationBar? @@ -36,6 +36,7 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { private let isEditing = ValuePromise(false) private var nodeView = UIView(frame: .zero) private var currentLayout: CGSize = .zero + private var client: PostgrestClient? private var isEditingValue: Bool = false { didSet { @@ -88,8 +89,14 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { if !self.didSetReady { self.didSetReady = true self._ready.set(true) + //set postgress client + client = PostgrestClient( + url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + schema: "public") + //get user Data and set referral code + self.doGetUserData() self.initView(navigationBarHeight: navigationBarHeight) - self.updateView() } } @@ -115,6 +122,7 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { let view = UIButton.init(type: .custom) view.setImage(UIImage.init(named: "share_invite_code_edit"), for: .normal) view.addTarget(self, action: #selector(editButtonAction), for: .touchUpInside) + view.isHidden = true return view }() @@ -245,8 +253,8 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { } } - private func updateView() { - inviteCodeLabel.text = "hl9prv" //LJUser.user.inviteCode + private func updateView(code: String) { + inviteCodeLabel.text = code //LJUser.user.inviteCode inviteCodeEditButton.isHidden = true //LJUser.user.editInviteCode } @@ -336,3 +344,38 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { } +extension WEVPointsControllerNode { + + func doGetUserData() { + Task { + await getUserData() + } + } + + func getUserData() async { + //check client is not a nil + guard let client = client else { + return + } + + do { + let currentUser = try await client + .from("user") + .select() + .eq(column: "user_id", value: "\(self.context.account.peerId.id._internalGetInt64Value())") + .execute() + .decoded(to: [WevUser].self).first + + guard let code = currentUser?.referralcode else { + return + } + + DispatchQueue.main.async { + self.updateView(code: code) + } + + } catch { + print(error.localizedDescription) + } + } +} diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift index 30aed154da0..46c6c2e0395 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVUser.swift @@ -26,61 +26,56 @@ struct WevUser: Codable { case referralcode = "referral_code" } } -/** - * Generate a random referral code - */ -class referalCode { - static let digits = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - - static let letters = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - ]; +// MARK: - Crew +struct Points: Codable { + let id: Int64 + let userId: Int64? + let pointType: Int? + let points: Int64? + let friendUserId: Int64? - static func generateRefferalCode() -> String { - var code = "" - for _ in 0..<4 { - code += letters.randomElement() ?? "" - } - for _ in 0..<1 { - code += digits.randomElement() ?? "" - } - return code + enum CodingKeys: String, CodingKey { + case id + case userId = "user_id" + case pointType = "point_type" + case points = "points" + case friendUserId = "friend_user_id" } +} + +struct PointsInsert: Codable { + let userId: Int64? + let pointType: Int? + let points: Int64? + let friendUserId: Int64? + enum CodingKeys: String, CodingKey { + case userId = "user_id" + case pointType = "point_type" + case points = "points" + case friendUserId = "friend_user_id" + } +} + +struct PointsType: Codable { + let id: Int64 + let type: Int + let message: String + let points: Int64 + let isdeleted: Bool + + enum CodingKeys: String, CodingKey { + case id + case type + case message + case points + case isdeleted = "is_deleted" + } +} +struct UserPoints: Codable { + let points: Int64? + + enum CodingKeys: String, CodingKey { + case points = "sum" + } } diff --git a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift index 353b5d76266..05eac6aa2a1 100644 --- a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift +++ b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterController.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import AccountContext import SearchUI +import PostgREST public class WEVWatchLaterController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/Contents.json new file mode 100644 index 00000000000..7baac05f022 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "rewards_wallet_point.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "rewards_wallet_point@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "rewards_wallet_point@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point.png b/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point.png new file mode 100644 index 0000000000000000000000000000000000000000..2525b8c5a231ce3e9f1dd549e3aa28895687be53 GIT binary patch literal 3291 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 Z{{g*5Muv4TXjA|I002ovPDHLkV1l<9QLO*~ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/rewards_wallet_point.imageset/rewards_wallet_point@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6745ae950ea07c14d0b26c2e890d9bb3f28f33b9 GIT binary patch literal 7968 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Contents.json new file mode 100644 index 00000000000..614720fabce --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 5.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 5@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 5@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5.png b/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5.png new file mode 100644 index 0000000000000000000000000000000000000000..607914b36972a34817d00a2787bb20f2a1496fb4 GIT binary patch literal 5442 zcmbVQ=QkV?jM2Q}Cg{aZ}5UYjNqxTY7UG&~X3DIlxPV^S5_vqc~oeUO7U=>u|fNU=$Qb{iUw|I zXar>c8|Y}6*;LO(bT>@}8MK;7I{0&fWi72LjfPeqPw-%YjfO_P2$qx9_C`mp1Kf@D zGSIf3B#~K^1D>D6O-bK;R?id$D#NCK3G{?50H38N$*CqoINYhWQVh(4UqIOTAi)`M z_h8Hn^wFeJ)gw`+0_Bxr)y&_^4nxWvifLR%_gx6M$+6C%uqt9Hu1WI#$<>`}B&q5E z)wUXR5`c!s6hd6Y<+ znm7yij0^mI>K=9uBd#$bK^Fv4g^8RxL|#e)?FNSa!c!RX%5%ydpBf)fL9*?xXU|W!|`NX}?Ei{C4WZgM~H4^SD z!+3F7d(>@ihZRF78nWVz# zUw4xCej}zjHT!W+Re8-SEa}o+)1J)PO};9BNel$ur!+Q?*=he<)2krNoYIEt5X8^` z*&+N}HqaViIO>2py94KIrPbVS5$B zdq)>B*{JeP$_2!G;REl->Dw6`(Cqwz?JEBkexeLN%-jwErKdXYKm~l;iS^r`(T?u; zW~TtPiH}Vu>&1^ zc0JAzqD;)GPM=|$3Y^KA@UC$*OKjKi%(&?mZnKHX$eio1CCWgBknLo76@n zG!v@oLkMCd%J4K71b*h3bbc`xNX^B67-HqbKb8JZqN=gWqI_=~<%*6)mSj5?Oem2uKDQqQR1+k>} z7rIKWX=)L1IZ00L#P`%mJq#iU_lTfUJld z7s(1`yv??l_s#g=v)>iB9V+tf%V3ow85DZ0gZEYzI0V#|816UDW^mllpq(GtGa8-4 zPbiGwmz>V_EcLa*S(9F>t7CS{LFLU!tbuEZLVk~DGCIJU=7!~N_nVZyAS9}NtEIVl z^`;}lIf44Tf@-w4`&F;Aj0X{-YHh091A90twqVGkl#4W$85jB<4TbiBHlu5UVFKd_ zu7&;eFq@%CKoL~C(efQqtimb#Hepw~EiI<>Rr&Ux?``a1mPbh@uaFKEh-Z5i zY305YkZ~r*O|Q_=wD6;KicA#*pjX#6PR1A66J6TWyvo(d`+NGT;IC2xMRRH#Y1#tiqjyHxHHWG+px@ zZ3`IKY^{tEOO7Unr5`)%>T3$sm^e>Yi6cXfRz=|bE#k*$`kCv?M!7bmzS)5qqu%;5 zev@7Lq)CEfN%=@QnWqt(iJppM6=-aaj{hikh2g+|O!;4az~Udi z^SLt)sYq;!{{PtKf4Lhu2=-{MNE?|N$ONTCa&^x%+o- zl`>heCjR0uE3Gu0wArIk3BI2j{zQmuW6zt-md=LRe7@n^rwEB;ITD(t=qc4p%qb`q z(&fFiYu}L3%61|pk8HCz*7EfI#Ae^=)FamIZ=CZ*9omALiwQbGPT+DFUId{xZzaEj z9g?n#^8Dw)*SeC$HfX6_J6?2;PiBetjSa4ZYUN?Zf%lEIxzrL-_$+AkyMqkY(_KC^ z78<#H!_@CP{WkUd<#16Uu}lW&Sj5h4k*%Ft*LT{A*|`@heDFVR!rCdY3ao1MW{xk- z-ppanQS!$Sq+FgMtV5;iYQ=Nhc%DM3U&=HtR4lV|&dD+A)nHlE?Wgkb7hg(c%95g( zJBZJV58`Wdfq9SY=UnHRdck>_f1JltN7uSKRd8Yrs;HNyOQ>_~~ zUB%Wgd^8`V+4nE`aC6Q8r)FPWM7P1xJoToY^wnvR9ZaXQbDMpdCZ$R>bGDn&qw=CFscJk_Tk*C92(9!~x1mQzf$B zK~Z3eEOKQQX9=?Ymr2dMK{L1(q8v+0*`g^%C5M$-JHv>mal!59%a%8rFM+`ysp$Ev z#AXY%bg=Wa8$^8iBVGRO%htmY~SC5*&Ao9YLxA_uxjis+pf-VAz#<%SL*7{d>N~gty$; zkrIh=Q!x5ish42<&6z#+pmC*Oc`f#r1|)IeJ9Qv4W9n=NYO}Y!g9KojIGJ2UW;|Hb z1({^r77OiR3`7HDXow-4+TDu!FpchPM;s88tP*PANeP1KvfEX0=$E#(VfE0&csA1D zoy(C*x45C0gN&|+|I|1?h^LBeNcO%`?1?vh2U(F{oZPfpH0Vb;i7fQ*_~3bc zDkpcBLLGdiy^DPQv>FQJlv0x|+*-O3u>hEA8>@f~q(Tz-r9VR3zV_A<$i`W<1wG4tA8{C{Ziac~C z4eq9=+c0k4txMwplZa(=!Eb>J9UU|7Eil)q){iFy2+9-@_PyD)sdDj@h%F(5mrz%o zfyS*rAbF>s@bGor`g^#C&+9HH2LL=@{Gsz+cY*%-u#HVUhcfS^4Vk|LdFXo|Uxg2{ zbt?I0(Mp2;^)Xo-8szh16Z1N8hRo8*v#iGa+xc+cOsr`v5=!iNdQ3Ve^?cxK2aHKMiNp^ z_6ns+uCW!Gsh^@^l8>n@nBb}Bg%b5eyPOwQ7E?7%)B2BAY(>5lJ&wfFgO99aRIi)@5y<#C_U$LGAIITN#T-E<1!vmuqgMI-JD(&lj4VysBq09c~3xR*xwRTiP|z%@A>Yid6^Dgh}xc zouLr@3fb}gOfucez@s#~gZo3M*NdKv72Seh79*vt-n$2nh9xxu$m3w)!Amn`S84WQ z*qfz=mez(k6~YP5imj5VFJWdi#&rr8x1r@TTSyt*9;hxk4IennR?{_qlM~7O+`Lxr zZkrJ2B}uJBzE0`;VdtQr2X#i^T}qKD0sgL}hc zFZjK0CpB+Y_z7(qy*)AXSc&Ms-B|L9NzyI$9y+3|VOipX4@Gc;HonKkSUXW)1%N|f zKsiDM_aJAxg|m=!5^b~wWwPLvSKopJghcFc$tz$ewu{JHF=vtw7i=Uxg);-;ts3Hb zi#hf3GFfT{YYIyd?>{GLCOV?*&tI+M4G`9!pFpW=IO}nWLKzc=3KS7)-wAqVt=P) zH`k!g*T&h6PCv-d#AI#j0WL!svZh`m#eF$o_vl-e`)r*~_xksEfhqsf93#%P}2 zvvy<+!W^$q(SHUD?uKJ?DmH9Tnbp$ga=sJ%2bZic(bPAh&b1Jj))8ACu_c_zxUCOif%;1P!StX+bdO={1W=}K1W8FU*%rX}X|OU;Z6v>=oJTv*P?S49N|eG7Tz|BMV}F3zbV zs-hx^uPZeP591F~&ef-26~cP(c^XeO>uOCRe5gGo>Z$%gR2(Kgc2h^j>{|%V<4h8z zRxZx#I8{M1c%A%Zm6SB%msX@*xxIhI$uqbf|sjTvG8H`-{kPt6Oa&3-+(mtTi#M(5%rJ6}|KZH8e5+v1X2=e)}(t z2e*Dx@j8d(Z-cy#-eTA^8lmuQ)^Hn@K{7H~#!Xo7#suSQq(yAB>Q*QbEg zGEBNL!`NnLAtrr;T@A6=9`XI^DjOPBRMt-Ew&?kx>~}GMp)-c@f!nxc))`1@NyZU| z_SN^G38HBC{k$qpe*k3F!v0uCN*`Y+>`o4zX( z`}GB>M(VplcXHxbNW&!p(5Kg2TVOMSG%<#@P$mJm`4S}?>ezhf5m0L0eVdpfdIMF-(=aAWchc*}b58~5{8&LU1WU+!1qZ0a^jz#Oko0O06RPo-u7CGz7T z`kaM#z0cA_4V4t$b{t-^LOaQ0Q7+`EglPzqQ7sqt897}2WvPP{ht97kNR)l46#CLO zgOJy<^`6*y1WY6!(2ibm?(x^Wa|t6#H@!E*(z)8Hl6}98mou zt>nEsm#ba&Ty`xRplsc)G^M-DF#Inv`so*f{aTH|)APFj-zuK46$cvLyI;;bciE59{Di&UN!3{c!mD%% z>AiNDS-^nF;VX2f8`A2x0@sP)t61>&!ux2+Q{rH&&JH$JuM@V1G~5qQeLuB$h}dAG z9zuKZv_hlfTsoOer)6@5+qT1l;TMU4eg`weRpqw0VXp9$WmLfzg)O=LA3>W1#|1c` i|Bo^Fe|{qV_LLvfR=qT0Q1{vLL<7sK$<@f1hyD*Rd5@+5 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@2x.png b/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..196a29288e527f5dfe18638ee391b14b4044eca9 GIT binary patch literal 13335 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@3x.png b/submodules/TelegramUI/Images.xcassets/wweevv/wallet_bubble.imageset/Group 5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2302cb55ec6086c9a72aea2208b55510d8bccbf GIT binary patch literal 22537 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 Date: Thu, 17 Nov 2022 23:13:14 +0530 Subject: [PATCH 07/10] added reward screen new UI and it's functionality --- .../Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Sources/Model/WEVSubscribeActivity.swift | 5 +- .../WEVSubscribeControllerNode.swift | 7 + .../WEVSubscribeTableViewCell.swift | 2 +- .../WEVApplyReferalControllerNode.swift | 42 +-- .../WEVSetting/WEVPointsController.swift | 6 +- .../WEVSetting/WEVPointsControllerNode.swift | 268 ++++++------------ .../WEVSetting/WEVShareEarnController.swift | 2 +- .../WEVShareEarnControllerNode.swift | 138 ++------- .../Sources/PeerInfo/PeerInfoScreen.swift | 4 +- 10 files changed, 134 insertions(+), 341 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 7663868d6bc..06fa7eda7a7 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7209,6 +7209,7 @@ Sorry for the inconvenience."; "ChatSettings.StickersAndReactions" = "Stickers and Emoji"; "WEV.ShareAndEarn" = "Share to Earn"; +"WEV.Reward" = "Rewards"; "WEV.WatchLater" = "Watch Later"; "WEV.Subscribe" = "Subscribed"; "WEV.ApplyReferral" = "Apply Referral Code"; diff --git a/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift b/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift index 3f8cbcc9ff6..0b9506c8e1d 100644 --- a/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift +++ b/submodules/ContactListUI/Sources/Model/WEVSubscribeActivity.swift @@ -60,8 +60,9 @@ struct Snippet: Codable { // MARK: - Thumbnails struct Thumbnails: Codable { - let thumbnailsDefault, medium, high, standard: Default - let maxres: Default + let thumbnailsDefault, medium, high: Default + let standard: Default? + let maxres: Default? enum CodingKeys: String, CodingKey { case thumbnailsDefault = "default" diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift index 6feee5c9828..90538eb862b 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift @@ -180,6 +180,13 @@ final class WEVSubscribeControllerNode: ASDisplayNode { } } catch let error { print(error) + totalVideos -= 1 + if totalVideos == 0 { + self.arrSubsribedVideo = arrSubVideo.sorted(by: {$0.snippet.publishedAt.timeIntervalSince1970 < $1.snippet.publishedAt.timeIntervalSince1970}) + DispatchQueue.main.async { + self.tableView.reloadData() + } + } } } } else { diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift index a14717d1f97..8bcd5b21492 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeTableViewCell.swift @@ -114,7 +114,7 @@ class WEVWatchLaterTableViewCell: UITableViewCell { //case 1: titleLabel.text = video.snippet.title //if let imageURL = video.snippet.thumbnails.maxres { - imgView.kf.setImage(with: URL(string: video.snippet.thumbnails.maxres.url)) + imgView.kf.setImage(with: URL(string: video.snippet.thumbnails.maxres?.url ?? video.snippet.thumbnails.standard?.url ?? video.snippet.thumbnails.high.url)) //} imgTypeView.image = UIImage(named: "segment_youtube") videoTypeLabel.text = "Youtube" diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift index 5515dfb670c..0b8e34dc96a 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -46,7 +46,6 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { private var client: PostgrestClient? private var shareButton = UIButton(frame: .zero) private let controller: WEVApplyReferalController? - private var descLabel = UILabel(frame: .zero) init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVApplyReferalController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { self.controller = controller @@ -111,7 +110,6 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { self.initView(navigationBarHeight: navigationBarHeight) self.updateView() - self.doGetUserData() } } @@ -200,7 +198,7 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) codeBgView.layer.cornerRadius = 16 - descLabel = UILabel.lj.configure(font: LJFont.medium(28 * LJScreen.scaleWidthLessOfIX), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Points") + let descLabel = UILabel.lj.configure(font: LJFont.regular(16), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Apply your friend referral code. You and your friend will earn points!\nThe more you refer, the better the points.") descLabel.lj.setLineSpacing() descLabel.textAlignment = .center descLabel.numberOfLines = 0 @@ -466,43 +464,11 @@ extension WEVApplyReferalControllerNode: UITextFieldDelegate { MBProgressHUD.lj.showHint("You have successfully applied referral code.") self.shareButton.isEnabled = true self.applyCodeTextField.text = "" - /*guard let navController = self.controller?.navigationController else { + guard let navController = self.controller?.navigationController else { return - }*/ - //navController.popViewController(animated: true) - self.doGetUserData() - } - } catch { - print(error.localizedDescription) - } - } -} -extension WEVApplyReferalControllerNode { - - func doGetUserData() { - Task { - await getUserData() - } - } - - func getUserData() async { - //check client is not a nil - guard let client = client else { - return - } - - do { - let currentUser = try await client - .from("fetch_pointscount_view") - .select() - .eq(column: "user_id", value: "\(self.context.account.peerId.id._internalGetInt64Value())") - .execute() - .decoded(to: [UserPoints].self).first - - DispatchQueue.main.async { - self.descLabel.text = "\(currentUser?.points ?? 0) Points" + } + navController.popViewController(animated: true) } - } catch { print(error.localizedDescription) } diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift index 0b017930f6e..3ac750b989a 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsController.swift @@ -39,7 +39,7 @@ public class WEVPointsController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style - self.title = self.presentationData.strings.WEV_ShareAndEarn + self.title = self.presentationData.strings.WEV_Reward self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) @@ -71,7 +71,7 @@ public class WEVPointsController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) //self.searchContentNode?.updateThemeAndPlaceholder(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Common_Search) - self.title = self.presentationData.strings.WEV_ShareAndEarn + self.title = self.presentationData.strings.WEV_Reward self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) self.controllerNode.updatePresentationData(self.presentationData) @@ -87,7 +87,7 @@ public class WEVPointsController: ViewController { } override public func loadDisplayNode() { - self.displayNode = WEVPointsControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, requestActivateSearch: { [weak self] in + self.displayNode = WEVPointsControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, controller: self, requestActivateSearch: { [weak self] in self?.activateSearch() }, requestDeactivateSearch: { [weak self] in self?.deactivateSearch() diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift index e05ddaccc81..2f30e195dac 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift @@ -19,7 +19,7 @@ import TranslateUI import ContactListUI import PostgREST -final class WEVShareEarnControllerNode: ViewControllerTracingNode { +final class WEVPointsControllerNode: ViewControllerTracingNode { private let context: AccountContext private var presentationData: PresentationData private weak var navigationBar: NavigationBar? @@ -37,18 +37,20 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { private var nodeView = UIView(frame: .zero) private var currentLayout: CGSize = .zero private var client: PostgrestClient? - + private var descLabel = UILabel(frame: .zero) + private let controller: WEVPointsController? private var isEditingValue: Bool = false { didSet { self.isEditing.set(self.isEditingValue) } } - init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVPointsController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { self.context = context self.presentationData = presentationData self.presentationDataValue.set(.single(presentationData)) self.navigationBar = navigationBar + self.controller = controller self.requestActivateSearch = requestActivateSearch self.requestDeactivateSearch = requestDeactivateSearch self.present = present @@ -111,21 +113,6 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { self.isEditingValue = !self.isEditingValue } - private lazy var inviteCodeLabel: UILabel = { - let view = UILabel.lj.configure(font: LJFont.medium(28 * LJScreen.scaleWidthLessOfIX), textColor: LJColor.black) - view.textAlignment = .center - return view - }() - - /// 编辑按键 - private lazy var inviteCodeEditButton: UIButton = { - let view = UIButton.init(type: .custom) - view.setImage(UIImage.init(named: "share_invite_code_edit"), for: .normal) - view.addTarget(self, action: #selector(editButtonAction), for: .touchUpInside) - view.isHidden = true - return view - }() - private func initView(navigationBarHeight: CGFloat) { let shareView = ASDisplayNode { () -> UIView in @@ -139,30 +126,11 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { } - let shareButton = UIButton.lj.configure(title: "Share my code", fontSize: 14) - shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) - //view.addSubview(shareButton) - //Filter view to select channel - /*let shareButtonNode = ASDisplayNode { () -> UIView in - return shareButton - }*/ - self.nodeView.addSubview(shareButton) - shareButton.snp.makeConstraints { (make) in - make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight - 8) - make.width.equalTo(LJScreen.width * 0.9) - make.centerX.equalToSuperview() - make.height.equalTo(48) - } - let scrollView = UIScrollView() - //view.addSubview(scrollView) - /*let scrollViewNode = ASDisplayNode { () -> UIView in - return scrollView - }*/ self.nodeView.addSubview(scrollView) scrollView.snp.makeConstraints { (make) in make.top.equalToSuperview()//.offset(LJScreen.navigationBarHeight) - make.bottom.equalTo(shareButton.snp.top).offset(-30) + make.bottom.equalToSuperview() make.left.right.equalToSuperview() } @@ -172,179 +140,117 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { make.edges.equalToSuperview() make.width.equalTo(view) } - - let imageView = UIImageView(image: UIImage.init(named: "share_invite_contact_bg")) + + let imageView = UIImageView(image: UIImage.init(named: "rewards_wallet_point")) containView.addSubview(imageView) imageView.snp.makeConstraints { (make) in - make.top.equalToSuperview().offset(16) - make.size.equalTo(CGSize(width: 243, height: 194)) + make.top.equalToSuperview().offset(20) + make.size.equalTo(CGSize(width: 80, height: 67)) make.centerX.equalToSuperview() } + descLabel = UILabel.lj.configure(font: LJFont.medium(32 * LJScreen.scaleWidthOfIX), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "0") + descLabel.lj.setLineSpacing() + descLabel.textAlignment = .center + descLabel.numberOfLines = 0 + containView.addSubview(descLabel) + descLabel.snp.makeConstraints { (make) in + make.top.equalTo(imageView.snp.bottom).offset(8) + make.centerX.equalToSuperview() + } + + let youCode = UILabel.lj.configure(font: LJFont.medium(16), textColor: presentationData.theme.list.itemSecondaryTextColor, text: "My Wweevv points") + containView.addSubview(youCode) + youCode.snp.makeConstraints { (make) in + make.top.equalTo(descLabel.snp.bottom).offset(8) + make.centerX.equalToSuperview() + } + + let button = UIButton.init(type: .custom) + button.titleLabel?.font = LJFont.medium(16) + button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) + let att = NSAttributedString.init(string: "How to gain?", attributes: [NSAttributedString.Key.foregroundColor : UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), .font: LJFont.medium(16), .underlineStyle: NSNumber.init(value: 1)]) + button.setAttributedTitle(att, for: .normal) + containView.addSubview(button) + button.snp.makeConstraints { (make) in + make.top.equalTo(youCode.snp.bottom).offset(2) + make.centerX.equalToSuperview() + make.height.equalTo(30) + } + + + let imgBubble = UIImageView(image: UIImage.init(named: "wallet_bubble")) + containView.insertSubview(imgBubble, belowSubview: button) + imgBubble.snp.makeConstraints { (make) in + make.top.equalTo(button.snp.bottom).offset(-10) + make.size.equalTo(CGSize(width: 161, height: 166)) + make.centerX.equalToSuperview() + } + + let imgPeople = UIImageView(image: UIImage.init(named: "wallet_clap_icon")) + containView.addSubview(imgPeople) + imgPeople.snp.makeConstraints { (make) in + make.top.equalTo(imgBubble.snp.bottom).offset(-10) + make.size.equalTo(CGSize(width: 220, height: 161)) + make.centerX.equalToSuperview() + } + + let codeBgView: UIView = { let codeBgView = UIView() - codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) + codeBgView.backgroundColor = presentationData.theme.rootController.tabBar.backgroundColor codeBgView.layer.cornerRadius = 16 - let descLabel = UILabel.lj.configure(font: LJFont.regular(14), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Share your code with a friend. When they use it to register to Wweevv you will earn points!\nThe more you refer, the better the points.") + let descLabel = UILabel.lj.configure(font: LJFont.medium(16), textColor: UIColor(red: 0, green: 122/255, blue: 1, alpha: 1), text: "Invite your froends and earn up to 3000 points.") descLabel.lj.setLineSpacing() descLabel.textAlignment = .center descLabel.numberOfLines = 0 codeBgView.addSubview(descLabel) descLabel.snp.makeConstraints { (make) in - make.top.equalToSuperview().offset(24) + make.top.equalToSuperview().offset(30) make.left.equalToSuperview().offset(15) make.right.equalToSuperview().offset(-15) - } - let youCode = UILabel.lj.configure(font: LJFont.medium(16), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Your code") - codeBgView.addSubview(youCode) - youCode.snp.makeConstraints { (make) in - make.top.equalTo(descLabel.snp.bottom).offset(24) - make.centerX.equalToSuperview() - } - - let codeImageBgView: UIImageView = { - let imageView = UIImageView(image: UIImage.init(named: "share_invite_code_bg")) - imageView.addSubview(inviteCodeLabel) - imageView.isUserInteractionEnabled = true - inviteCodeLabel.snp.makeConstraints { (make) in - make.center.equalToSuperview() - } - - imageView.addSubview(inviteCodeEditButton) - inviteCodeEditButton.snp.makeConstraints { (make) in - make.left.equalTo(inviteCodeLabel.snp.right).offset(0) - make.size.equalTo(CGSize(width: 40, height: 40)) - make.centerY.equalToSuperview() - } - return imageView - }() - - codeBgView.addSubview(codeImageBgView) - codeImageBgView.snp.makeConstraints { (make) in - make.top.equalTo(youCode.snp.bottom).offset(12) - //make.left.equalToSuperview().offset(24) - //make.right.bottom.equalToSuperview().offset(-24) - make.bottom.equalToSuperview().offset(-24) - make.width.equalTo(LJScreen.width * 0.8) - make.centerX.equalToSuperview() - make.height.equalTo(64) + make.bottom.equalToSuperview().offset(-50) } return codeBgView }() containView.addSubview(codeBgView) codeBgView.snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(15) - make.right.equalToSuperview().offset(-15) - make.top.equalTo(imageView.snp.bottom).offset(32) + make.left.equalToSuperview().offset(30) + make.right.equalToSuperview().offset(-30) + make.top.equalTo(imgPeople.snp.bottom).offset(-10) } - let descPointLabel = UILabel.lj.configure(font: LJFont.regular(12), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "1 invite = 2 points, 10 invites = 25 points, 50 invites = 200 points, 100 invites = 500 points and 250 invites = 3,000 points!") - descPointLabel.lj.setLineSpacing() - descPointLabel.textAlignment = .center - descPointLabel.numberOfLines = 0 - containView.addSubview(descPointLabel) - descPointLabel.snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(15) - make.right.equalToSuperview().offset(-15) - make.top.equalTo(codeBgView.snp.bottom).offset(24) - make.bottom.equalToSuperview().offset(-20) + let shareButton = UIButton.lj.configure(font: LJFont.medium(14), titleColor: .white, backgroundColor: UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), title: "Find out more") + shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) + containView.addSubview(shareButton) + shareButton.snp.makeConstraints { (make) in + make.top.equalTo(codeBgView.snp.bottom).offset(-20) + make.width.equalTo((LJScreen.width * 220) / 375) + make.height.equalTo(40) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight) } } - private func updateView(code: String) { - inviteCodeLabel.text = code //LJUser.user.inviteCode - inviteCodeEditButton.isHidden = true //LJUser.user.editInviteCode + @objc private func buttonAction() { + let alert = UIAlertController.init(title: "How to gain?", message: "Wweevv points are earned every time you watch a live video and when inviting friends.", preferredStyle: .alert) + alert.addAction(.init(title: "OK", style: .default, handler: nil)) + self.controller?.present(alert, animated: true, completion: nil) } //MARK: - Action @objc private func shareButtonAction() { - /*MBProgressHUD.showAdded(to: self.view, animated: true) - WEVShareManager.manger.shareApp(from: self) {[weak self] (isSuccess) in - guard let self = self else {return} - MBProgressHUD.hide(for: self.view, animated: true) - }*/ - } - - weak var editAlertAction: UIAlertAction? - - /// 点击编辑按键 - @objc private func editButtonAction() { - /*let alert = UIAlertController.init(title: "Please note that each account is only allowed to edit the Referral code once.", message: nil, preferredStyle: .alert) - alert.addAction(.init(title: "OK", style: .default, handler: { (_) in - self.showEditInviteCodeAlert(code: LJUser.user.inviteCode) - })) - present(alert, animated: true, completion: nil)*/ - } - - /// 显示编辑弹窗 - /// - Parameter code: 已经填写的邀请码 - private func showEditInviteCodeAlert(code: String?) { - /*let editAlert = UIAlertController.init(title: "Referral Code", message: nil, preferredStyle: .alert) - editAlert.addTextField { (textField) in - textField.textColor = LJColor.hex(0x141419) - textField.font = LJFont.regular(13) - textField.addTarget(self, action: #selector(self.textFieldDidChanged(_:)), for: .editingChanged) - textField.text = code - } - let editAction = UIAlertAction.init(title: "Save", style: .default, handler: {[weak editAlert] (_) in - guard let code = editAlert?.textFields?.first?.text else {return} - self.editInvieteCodeRequest(code) { (isSuccess) in - if !isSuccess { - // 修改接口失败,重新显示旧的弹窗 - self.showEditInviteCodeAlert(code: code) - } - } - }) - editAlert.addAction(.init(title: "Cancel", style: .cancel, handler: nil)) - editAlert.addAction(editAction) - editAlertAction = editAction - present(editAlert, animated: true, completion: nil) - checkEditingInviteCode(code ?? "")*/ - } - - @objc private func textFieldDidChanged(_ textField: UITextField) { - guard let text = textField.text else { return } - let max = 10 - if text.count > max { - textField.text = String(text.prefix(max)) + guard let navController = self.controller?.navigationController else { + return } - checkEditingInviteCode(text) + navController.pushViewController(WEVShareEarnController(context: self.context), animated: true) } - - @discardableResult - private func checkEditingInviteCode(_ code: String) -> Bool { - let min = 4 - let isEnabled = code.count >= min - editAlertAction?.isEnabled = isEnabled - return isEnabled - } - - //MARK: - Request - - /// 更改邀请码请求 - private func editInvieteCodeRequest(_ code: String, completion: @escaping (Bool) -> ()) { - /*MBProgressHUD.showAdded(to: self.view, animated: true) - LJNetManager.Profile.editInviteCode(inviteCode: code) {[weak self] (result) in - guard let self = self else {return} - MBProgressHUD.hide(for: self.view, animated: true) - if result.isSuccess { - LJUser.user.inviteCode = code - LJUser.user.editInviteCode = true - LJUser.user.saveLocalData() - self.updateView() - }else { - MBProgressHUD.lj.showHint(result.message) - } - completion(result.isSuccess) - }*/ - } - } -extension WEVShareEarnControllerNode { +extension WEVPointsControllerNode { func doGetUserData() { Task { @@ -360,18 +266,14 @@ extension WEVShareEarnControllerNode { do { let currentUser = try await client - .from("user") + .from("fetch_pointscount_view") .select() .eq(column: "user_id", value: "\(self.context.account.peerId.id._internalGetInt64Value())") .execute() - .decoded(to: [WevUser].self).first - - guard let code = currentUser?.referralcode else { - return - } - //Set referral code + .decoded(to: [UserPoints].self).first + DispatchQueue.main.async { - self.updateView(code: code) + self.descLabel.text = "\(currentUser?.points ?? 0)" } } catch { diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift index 2338c6f6685..7ee8690e308 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnController.swift @@ -87,7 +87,7 @@ public class WEVShareEarnController: ViewController { } override public func loadDisplayNode() { - self.displayNode = WEVShareEarnControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, requestActivateSearch: { [weak self] in + self.displayNode = WEVShareEarnControllerNode(context: self.context, presentationData: self.presentationData, navigationBar: self.navigationBar!, controller: self, requestActivateSearch: { [weak self] in self?.activateSearch() }, requestDeactivateSearch: { [weak self] in self?.deactivateSearch() diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift index cae1de8535b..8332e3ea867 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift @@ -19,7 +19,7 @@ import TranslateUI import ContactListUI import PostgREST -final class WEVPointsControllerNode: ViewControllerTracingNode { +final class WEVShareEarnControllerNode: ViewControllerTracingNode { private let context: AccountContext private var presentationData: PresentationData private weak var navigationBar: NavigationBar? @@ -37,18 +37,19 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { private var nodeView = UIView(frame: .zero) private var currentLayout: CGSize = .zero private var client: PostgrestClient? - + private let controller: WEVShareEarnController? private var isEditingValue: Bool = false { didSet { self.isEditing.set(self.isEditingValue) } } - init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { + init(context: AccountContext, presentationData: PresentationData, navigationBar: NavigationBar, controller: WEVShareEarnController, requestActivateSearch: @escaping () -> Void, requestDeactivateSearch: @escaping () -> Void, updateCanStartEditing: @escaping (Bool?) -> Void, present: @escaping (ViewController, Any?) -> Void, push: @escaping (ViewController) -> Void) { self.context = context self.presentationData = presentationData self.presentationDataValue.set(.single(presentationData)) self.navigationBar = navigationBar + self.controller = controller self.requestActivateSearch = requestActivateSearch self.requestDeactivateSearch = requestDeactivateSearch self.present = present @@ -101,12 +102,12 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { } private func updateConstriant(navigationBarHeight: CGFloat) { - nodeView.snp.remakeConstraints { (make) in - make.top.equalToSuperview().offset(navigationBarHeight) - make.left.bottom.right.equalToSuperview() - } + nodeView.snp.remakeConstraints { (make) in + make.top.equalToSuperview().offset(navigationBarHeight) + make.left.bottom.right.equalToSuperview() } - + } + func toggleEditing() { self.isEditingValue = !self.isEditingValue } @@ -117,14 +118,6 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { return view }() - /// 编辑按键 - private lazy var inviteCodeEditButton: UIButton = { - let view = UIButton.init(type: .custom) - view.setImage(UIImage.init(named: "share_invite_code_edit"), for: .normal) - view.addTarget(self, action: #selector(editButtonAction), for: .touchUpInside) - view.isHidden = true - return view - }() private func initView(navigationBarHeight: CGFloat) { @@ -139,13 +132,13 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { } - let shareButton = UIButton.lj.configure(title: "Share my code", fontSize: 14) + let shareButton = UIButton.lj.configure(font: LJFont.medium(14), backgroundColor: UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), title: "Share my code") shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) //view.addSubview(shareButton) //Filter view to select channel /*let shareButtonNode = ASDisplayNode { () -> UIView in - return shareButton - }*/ + return shareButton + }*/ self.nodeView.addSubview(shareButton) shareButton.snp.makeConstraints { (make) in make.bottom.equalToSuperview().offset(-LJScreen.safeAreaBottomHeight - 8) @@ -157,15 +150,15 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { let scrollView = UIScrollView() //view.addSubview(scrollView) /*let scrollViewNode = ASDisplayNode { () -> UIView in - return scrollView - }*/ + return scrollView + }*/ self.nodeView.addSubview(scrollView) scrollView.snp.makeConstraints { (make) in make.top.equalToSuperview()//.offset(LJScreen.navigationBarHeight) make.bottom.equalTo(shareButton.snp.top).offset(-30) make.left.right.equalToSuperview() } - + let containView = UIView() scrollView.addSubview(containView) containView.snp.makeConstraints { (make) in @@ -185,7 +178,7 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { let codeBgView = UIView() codeBgView.backgroundColor = .clear //LJColor.hex(0xEFF0F2, 0.79) codeBgView.layer.cornerRadius = 16 - + let descLabel = UILabel.lj.configure(font: LJFont.regular(14), textColor: presentationData.theme.list.itemPrimaryTextColor, text: "Share your code with a friend. When they use it to register to Wweevv you will earn points!\nThe more you refer, the better the points.") descLabel.lj.setLineSpacing() descLabel.textAlignment = .center @@ -210,13 +203,6 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { inviteCodeLabel.snp.makeConstraints { (make) in make.center.equalToSuperview() } - - imageView.addSubview(inviteCodeEditButton) - inviteCodeEditButton.snp.makeConstraints { (make) in - make.left.equalTo(inviteCodeLabel.snp.right).offset(0) - make.size.equalTo(CGSize(width: 40, height: 40)) - make.centerY.equalToSuperview() - } return imageView }() @@ -255,96 +241,26 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { private func updateView(code: String) { inviteCodeLabel.text = code //LJUser.user.inviteCode - inviteCodeEditButton.isHidden = true //LJUser.user.editInviteCode } //MARK: - Action - + @objc private func shareButtonAction() { /*MBProgressHUD.showAdded(to: self.view, animated: true) - WEVShareManager.manger.shareApp(from: self) {[weak self] (isSuccess) in - guard let self = self else {return} - MBProgressHUD.hide(for: self.view, animated: true) - }*/ - } - - weak var editAlertAction: UIAlertAction? - - /// 点击编辑按键 - @objc private func editButtonAction() { - /*let alert = UIAlertController.init(title: "Please note that each account is only allowed to edit the Referral code once.", message: nil, preferredStyle: .alert) - alert.addAction(.init(title: "OK", style: .default, handler: { (_) in - self.showEditInviteCodeAlert(code: LJUser.user.inviteCode) - })) - present(alert, animated: true, completion: nil)*/ - } - - /// 显示编辑弹窗 - /// - Parameter code: 已经填写的邀请码 - private func showEditInviteCodeAlert(code: String?) { - /*let editAlert = UIAlertController.init(title: "Referral Code", message: nil, preferredStyle: .alert) - editAlert.addTextField { (textField) in - textField.textColor = LJColor.hex(0x141419) - textField.font = LJFont.regular(13) - textField.addTarget(self, action: #selector(self.textFieldDidChanged(_:)), for: .editingChanged) - textField.text = code - } - let editAction = UIAlertAction.init(title: "Save", style: .default, handler: {[weak editAlert] (_) in - guard let code = editAlert?.textFields?.first?.text else {return} - self.editInvieteCodeRequest(code) { (isSuccess) in - if !isSuccess { - // 修改接口失败,重新显示旧的弹窗 - self.showEditInviteCodeAlert(code: code) - } - } - }) - editAlert.addAction(.init(title: "Cancel", style: .cancel, handler: nil)) - editAlert.addAction(editAction) - editAlertAction = editAction - present(editAlert, animated: true, completion: nil) - checkEditingInviteCode(code ?? "")*/ - } - - @objc private func textFieldDidChanged(_ textField: UITextField) { - guard let text = textField.text else { return } - let max = 10 - if text.count > max { - textField.text = String(text.prefix(max)) + WEVShareManager.manger.shareApp(from: self) {[weak self] (isSuccess) in + guard let self = self else {return} + MBProgressHUD.hide(for: self.view, animated: true) + }*/ + guard let referralCode = inviteCodeLabel.text else { + return } - checkEditingInviteCode(text) + let code = "I’m inviting you to use Wweevv. Here’s my code (\(referralCode)) - just enter it settings apply referral code." + let controller = ShareController(context: self.context, subject: .text(code), preferredAction: .default) + self.controller?.present(controller, in: .window(.root), blockInteraction: true) } - - @discardableResult - private func checkEditingInviteCode(_ code: String) -> Bool { - let min = 4 - let isEnabled = code.count >= min - editAlertAction?.isEnabled = isEnabled - return isEnabled - } - - //MARK: - Request - - /// 更改邀请码请求 - private func editInvieteCodeRequest(_ code: String, completion: @escaping (Bool) -> ()) { - /*MBProgressHUD.showAdded(to: self.view, animated: true) - LJNetManager.Profile.editInviteCode(inviteCode: code) {[weak self] (result) in - guard let self = self else {return} - MBProgressHUD.hide(for: self.view, animated: true) - if result.isSuccess { - LJUser.user.inviteCode = code - LJUser.user.editInviteCode = true - LJUser.user.saveLocalData() - self.updateView() - }else { - MBProgressHUD.lj.showHint(result.message) - } - completion(result.isSuccess) - }*/ - } - } -extension WEVPointsControllerNode { +extension WEVShareEarnControllerNode { func doGetUserData() { Task { diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 827e2f33c0f..37b4f71f1e8 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -759,7 +759,7 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p interaction.openSettings(.watchLater) })) - items[.wev]!.append(PeerInfoScreenDisclosureItem(id: 19, text: presentationData.strings.WEV_ShareAndEarn, icon: PresentationResourcesSettings.shareEarn, action: { + items[.wev]!.append(PeerInfoScreenDisclosureItem(id: 19, text: presentationData.strings.WEV_Reward, icon: PresentationResourcesSettings.shareEarn, action: { interaction.openSettings(.shareEarn) })) @@ -6305,7 +6305,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate case .watchLater: push(WEVWatchLaterController(context: self.context)) case .shareEarn: - push(WEVShareEarnController(context: self.context)) + push(WEVPointsController(context: self.context)) case .applyReferral: push(WEVApplyReferalController(context: self.context)) case .passport: From cf5bb49c9b1080cbdd04bcd94cf39fc71a67c443 Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Thu, 17 Nov 2022 23:15:36 +0530 Subject: [PATCH 08/10] Update WEVApplyReferalControllerNode.swift --- .../Sources/WEVSetting/WEVApplyReferalControllerNode.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift index 0b8e34dc96a..d8327730e83 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -151,7 +151,7 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { } - shareButton = UIButton.lj.configure(title: "Submit", fontSize: 14) + shareButton = let shareButton = UIButton.lj.configure(font: LJFont.medium(14), backgroundColor: UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), title: "Share my code") shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) //view.addSubview(shareButton) //Filter view to select channel From 57e4442bc9c7dbee3bfa1f28bc788ba07da01602 Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Thu, 17 Nov 2022 23:21:02 +0530 Subject: [PATCH 09/10] apply new UI tint color --- .../Sources/WEVSetting/WEVApplyReferalControllerNode.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift index d8327730e83..b3385640515 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -151,7 +151,7 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { } - shareButton = let shareButton = UIButton.lj.configure(font: LJFont.medium(14), backgroundColor: UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), title: "Share my code") + shareButton = UIButton.lj.configure(font: LJFont.medium(14), backgroundColor: UIColor(red: 191/255, green: 48/255, blue: 113/255, alpha: 1), title: "Share my code") shareButton.addTarget(self, action: #selector(shareButtonAction), for: .touchUpInside) //view.addSubview(shareButton) //Filter view to select channel From 9318626f335a0a87833a11cb49a26bbb8871e52d Mon Sep 17 00:00:00 2001 From: Bernard Garekani Date: Fri, 18 Nov 2022 14:25:02 +0530 Subject: [PATCH 10/10] updated it to prod environment --- .../Sources/WEVDiscover/WEVDiscoverRootNode.swift | 4 ++-- submodules/ContactListUI/Sources/WEVRootViewController.swift | 4 ++-- .../Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift | 4 ++-- .../Sources/WEVSetting/WEVApplyReferalControllerNode.swift | 4 ++-- .../Sources/WEVSetting/WEVPointsControllerNode.swift | 4 ++-- .../Sources/WEVSetting/WEVShareEarnControllerNode.swift | 4 ++-- .../Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift index 786f807dd53..18716781246 100644 --- a/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift +++ b/submodules/ContactListUI/Sources/WEVDiscover/WEVDiscoverRootNode.swift @@ -61,8 +61,8 @@ public class WEVDiscoverRootNode: ASDisplayNode { var arrWatchLater: [WatchLaterVideo] = [] var arrSubscribedVideos: [SubscribedVideo] = [] - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey /// 根据状态返回该显示的视频 private var showDataArray: [WEVVideoModel] { diff --git a/submodules/ContactListUI/Sources/WEVRootViewController.swift b/submodules/ContactListUI/Sources/WEVRootViewController.swift index 2f0eddc4f26..0b96dd2adab 100644 --- a/submodules/ContactListUI/Sources/WEVRootViewController.swift +++ b/submodules/ContactListUI/Sources/WEVRootViewController.swift @@ -65,8 +65,8 @@ public class WEVRootViewController: ViewController { //var realtimeClient:RealtimeClient? //var allUsersUpdateChanges:Realtime.Channel? - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey public init(context: AccountContext) { self.context = context diff --git a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift index 90538eb862b..a64071dd402 100644 --- a/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift +++ b/submodules/ContactListUI/Sources/WEVSubcriveVideo/WEVSubscribeControllerNode.swift @@ -42,8 +42,8 @@ final class WEVSubscribeControllerNode: ASDisplayNode { } } - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey var arrSubsribedVideo: [Item] = [] var activity: WEVSubscribeActivity? = nil private let tableView = UITableView(frame: CGRect.zero, style: .plain) diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift index b3385640515..e77e35558d6 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVApplyReferalControllerNode.swift @@ -104,8 +104,8 @@ final class WEVApplyReferalControllerNode: ViewControllerTracingNode { self._ready.set(true) //set postgress client client = PostgrestClient( - url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", - headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + url: "\(LJConfig.SupabaseKeys.supabaseUrl)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKey], schema: "public") self.initView(navigationBarHeight: navigationBarHeight) diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift index 2f30e195dac..4c734c7497c 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVPointsControllerNode.swift @@ -93,8 +93,8 @@ final class WEVPointsControllerNode: ViewControllerTracingNode { self._ready.set(true) //set postgress client client = PostgrestClient( - url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", - headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + url: "\(LJConfig.SupabaseKeys.supabaseUrl)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKey], schema: "public") //get user Data and set referral code self.doGetUserData() diff --git a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift index 8332e3ea867..c65b40860aa 100644 --- a/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVSetting/WEVShareEarnControllerNode.swift @@ -92,8 +92,8 @@ final class WEVShareEarnControllerNode: ViewControllerTracingNode { self._ready.set(true) //set postgress client client = PostgrestClient( - url: "\(LJConfig.SupabaseKeys.supabaseUrlDev)/rest/v1", - headers: ["apikey": LJConfig.SupabaseKeys.supabaseKeyDev], + url: "\(LJConfig.SupabaseKeys.supabaseUrl)/rest/v1", + headers: ["apikey": LJConfig.SupabaseKeys.supabaseKey], schema: "public") //get user Data and set referral code self.doGetUserData() diff --git a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift index da05103a1bb..1420d0b8b4f 100644 --- a/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift +++ b/submodules/SettingsUI/Sources/WEVWatchLater/WEVWatchLaterControllerNode.swift @@ -42,8 +42,8 @@ final class WEVWatchLaterControllerNode: ViewControllerTracingNode { } } - private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrlDev - private let supabaseKey = LJConfig.SupabaseKeys.supabaseKeyDev + private let supabaseUrl = LJConfig.SupabaseKeys.supabaseUrl + private let supabaseKey = LJConfig.SupabaseKeys.supabaseKey var arrWatchLater: [WatchLaterVideo] = [] private let tableView = UITableView(frame: CGRect.zero, style: .plain) private var currentLayout: CGSize = .zero