From e14d8e2c6bf605bc31a0c5bd030b80dc0af8bb33 Mon Sep 17 00:00:00 2001 From: zeng Date: Thu, 11 Dec 2025 11:33:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReaderHive.xcodeproj/project.pbxproj | 215 ++++++++++++- ReaderHive/Base/Define/NRDefine.swift | 5 + .../Base/Define/NRUserDefaultsKey.swift | 2 + .../Base/Extension/Dictionary+NRAdd.swift | 23 ++ .../Base/Networking/API/NRStoreAPI.swift | 130 ++++++++ ReaderHive/Base/Networking/NRTargetType.swift | 2 +- ReaderHive/Base/Networking/NRUrlPath.swift | 13 + ReaderHive/Base/View/NRTableViewCell.swift | 16 +- .../Base/WebView/NRAppWebViewController.swift | 78 +++++ ReaderHive/Base/WebView/NRWebView.swift | 2 +- .../WebView/NRWebViewController+Script.swift | 2 +- .../Base/WebView/NRWebViewController.swift | 2 +- ReaderHive/Class/Me/M/NRMeItem.swift | 4 + .../Class/Me/V/NRMeCoinsContentView.swift | 17 +- ReaderHive/Class/Me/V/NRMeCoinsPackView.swift | 95 ++++++ ReaderHive/Class/Me/V/NRMeHeaderView.swift | 28 +- ReaderHive/Class/Me/V/NRMeVipView.swift | 92 ++++++ .../Me/VC/NRFeedbackViewController.swift | 30 ++ .../Class/Me/VC/NRMeViewController.swift | 7 +- .../Class/Store/M/NRBuyRecordsModel.swift | 23 ++ .../Class/Store/M/NROrderRecordsModel.swift | 18 ++ ReaderHive/Class/Store/M/NRPayDateModel.swift | 156 ++++++++++ .../Class/Store/M/NRRewardCoinsModel.swift | 23 ++ .../Store/V/NRConsumptionRecordsCell.swift | 41 +++ .../Store/V/NRConsumptionRecordsCell.xib | 77 +++++ .../Class/Store/V/NROrderRecordsCell.swift | 68 ++++ .../Class/Store/V/NRRewardCoinsCell.swift | 119 +++++++ .../Class/Store/V/NRStoreCoinsBigCell.swift | 12 + .../Class/Store/V/NRStoreCoinsCell.swift | 19 ++ .../Class/Store/V/NRStoreCoinsPackCell.swift | 12 + .../Class/Store/V/NRStoreCoinsSmallCell.swift | 12 + .../Class/Store/V/NRStoreCoinsView.swift | 253 +++++++++++++++ ReaderHive/Class/Store/V/NRStoreVipCell.swift | 16 + ReaderHive/Class/Store/V/NRStoreVipView.swift | 166 ++++++++++ ReaderHive/Class/Store/V/NRWalletCell.swift | 49 +++ .../Class/Store/V/NRWalletHeaderView.swift | 186 +++++++++++ .../NRConsumptionRecordsViewController.swift | 117 +++++++ .../VC/NROrderRecordsPageViewController.swift | 118 +++++++ .../VC/NROrderRecordsViewController.swift | 108 +++++++ .../VC/NRRewardCoinsViewController.swift | 107 +++++++ .../Store/VC/NRStoreViewController.swift | 82 +++++ .../Store/VC/NRWalletViewController.swift | 114 +++++++ ReaderHive/Delegate/AppDelegate.swift | 6 + ReaderHive/Libs/IAP/NRIAPOrderModel.swift | 41 +++ ReaderHive/Libs/IAP/NRIAPVerifyModel.swift | 19 ++ ReaderHive/Libs/IAP/NRIapManager.swift | 293 ++++++++++++++++++ ReaderHive/Libs/IAP/NRPayDataRequest.swift | 179 +++++++++++ ReaderHive/Libs/IAP/NRWaitRestoreModel.swift | 48 +++ .../Contents.json | 22 ++ .../arrow_right_icon_07.imageset/arrow@2x.png | Bin 0 -> 233 bytes .../arrow_right_icon_07.imageset/arrow@3x.png | Bin 0 -> 330 bytes .../feedback_icon_01.imageset/Contents.json | 22 ++ .../My Wallet@2x.png | Bin 0 -> 1168 bytes .../My Wallet@3x.png | Bin 0 -> 1670 bytes .../Image/gift_icon_01.imageset/Contents.json | 22 ++ .../Image/gift_icon_01.imageset/Gift@2x.png | Bin 0 -> 11405 bytes .../Image/gift_icon_01.imageset/Gift@3x.png | Bin 0 -> 23030 bytes .../Banner-DailyReward@2x.png | Bin 0 -> 58949 bytes .../Banner-DailyReward@3x.png | Bin 0 -> 134870 bytes .../me_pack_bg_image.imageset/Contents.json | 22 ++ .../Image/time_icon_01.imageset/Contents.json | 22 ++ .../Image/time_icon_01.imageset/Vector@2x.png | Bin 0 -> 406 bytes .../Image/time_icon_01.imageset/Vector@3x.png | Bin 0 -> 554 bytes .../Image/time_icon_02.imageset/Contents.json | 22 ++ .../time_icon_02.imageset/time icon@2x.png | Bin 0 -> 790 bytes .../time_icon_02.imageset/time icon@3x.png | Bin 0 -> 1063 bytes .../Source/en.lproj/Localizable.strings | 28 ++ .../JXIAPManager/JXIAPManager.swift | 223 +++++++++++++ 68 files changed, 3602 insertions(+), 26 deletions(-) create mode 100644 ReaderHive/Base/Extension/Dictionary+NRAdd.swift create mode 100644 ReaderHive/Base/Networking/API/NRStoreAPI.swift create mode 100644 ReaderHive/Base/WebView/NRAppWebViewController.swift create mode 100644 ReaderHive/Class/Me/V/NRMeCoinsPackView.swift create mode 100644 ReaderHive/Class/Me/V/NRMeVipView.swift create mode 100644 ReaderHive/Class/Me/VC/NRFeedbackViewController.swift create mode 100644 ReaderHive/Class/Store/M/NRBuyRecordsModel.swift create mode 100644 ReaderHive/Class/Store/M/NROrderRecordsModel.swift create mode 100644 ReaderHive/Class/Store/M/NRPayDateModel.swift create mode 100644 ReaderHive/Class/Store/M/NRRewardCoinsModel.swift create mode 100644 ReaderHive/Class/Store/V/NRConsumptionRecordsCell.swift create mode 100644 ReaderHive/Class/Store/V/NRConsumptionRecordsCell.xib create mode 100644 ReaderHive/Class/Store/V/NROrderRecordsCell.swift create mode 100644 ReaderHive/Class/Store/V/NRRewardCoinsCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreCoinsBigCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreCoinsCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreCoinsPackCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreCoinsSmallCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreCoinsView.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreVipCell.swift create mode 100644 ReaderHive/Class/Store/V/NRStoreVipView.swift create mode 100644 ReaderHive/Class/Store/V/NRWalletCell.swift create mode 100644 ReaderHive/Class/Store/V/NRWalletHeaderView.swift create mode 100644 ReaderHive/Class/Store/VC/NRConsumptionRecordsViewController.swift create mode 100644 ReaderHive/Class/Store/VC/NROrderRecordsPageViewController.swift create mode 100644 ReaderHive/Class/Store/VC/NROrderRecordsViewController.swift create mode 100644 ReaderHive/Class/Store/VC/NRRewardCoinsViewController.swift create mode 100644 ReaderHive/Class/Store/VC/NRStoreViewController.swift create mode 100644 ReaderHive/Class/Store/VC/NRWalletViewController.swift create mode 100644 ReaderHive/Libs/IAP/NRIAPOrderModel.swift create mode 100644 ReaderHive/Libs/IAP/NRIAPVerifyModel.swift create mode 100644 ReaderHive/Libs/IAP/NRIapManager.swift create mode 100644 ReaderHive/Libs/IAP/NRPayDataRequest.swift create mode 100644 ReaderHive/Libs/IAP/NRWaitRestoreModel.swift create mode 100644 ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/arrow@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/arrow@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_icon_01.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_icon_01.imageset/My Wallet@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_icon_01.imageset/My Wallet@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/gift_icon_01.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/gift_icon_01.imageset/Gift@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/gift_icon_01.imageset/Gift@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_01.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_01.imageset/Vector@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_01.imageset/Vector@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@3x.png create mode 100644 ReaderHive/Thirdparty/JXIAPManager/JXIAPManager.swift diff --git a/ReaderHive.xcodeproj/project.pbxproj b/ReaderHive.xcodeproj/project.pbxproj index ab58e3e..c070ddf 100644 --- a/ReaderHive.xcodeproj/project.pbxproj +++ b/ReaderHive.xcodeproj/project.pbxproj @@ -178,6 +178,41 @@ F3B8593E2EE677740095A9CC /* NRLocalizedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8593D2EE677740095A9CC /* NRLocalizedModel.swift */; }; F3B859402EE6787E0095A9CC /* NRLocalizedManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8593F2EE6787E0095A9CC /* NRLocalizedManager.swift */; }; F3B859422EE678FB0095A9CC /* NRSettingAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859412EE678FB0095A9CC /* NRSettingAPI.swift */; }; + F3B859442EE902BF0095A9CC /* NRStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859432EE902BF0095A9CC /* NRStoreViewController.swift */; }; + F3B8594C2EE904980095A9CC /* NRPayDateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8594B2EE904980095A9CC /* NRPayDateModel.swift */; }; + F3B8594E2EE905A70095A9CC /* NRStoreAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */; }; + F3B859522EE906A90095A9CC /* JXIAPManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859512EE906A80095A9CC /* JXIAPManager.swift */; }; + F3B859572EE9072C0095A9CC /* NRIapManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859562EE907280095A9CC /* NRIapManager.swift */; }; + F3B859592EE9073B0095A9CC /* NRIAPOrderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859582EE907350095A9CC /* NRIAPOrderModel.swift */; }; + F3B8595B2EE907600095A9CC /* NRWaitRestoreModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8595A2EE907600095A9CC /* NRWaitRestoreModel.swift */; }; + F3B8595D2EE907710095A9CC /* NRIAPVerifyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8595C2EE907710095A9CC /* NRIAPVerifyModel.swift */; }; + F3B8595F2EE910020095A9CC /* NRPayDataRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8595E2EE910020095A9CC /* NRPayDataRequest.swift */; }; + F3B859612EE9126E0095A9CC /* Dictionary+NRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859602EE9126A0095A9CC /* Dictionary+NRAdd.swift */; }; + F3B859632EE91B850095A9CC /* NRStoreCoinsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859622EE91B850095A9CC /* NRStoreCoinsView.swift */; }; + F3B859652EE91BB70095A9CC /* NRStoreCoinsBigCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859642EE91BB70095A9CC /* NRStoreCoinsBigCell.swift */; }; + F3B859672EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859662EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift */; }; + F3B859692EE91BD70095A9CC /* NRStoreCoinsPackCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859682EE91BD70095A9CC /* NRStoreCoinsPackCell.swift */; }; + F3B8596B2EE91C9F0095A9CC /* NRStoreCoinsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8596A2EE91C9F0095A9CC /* NRStoreCoinsCell.swift */; }; + F3B8596D2EE944DE0095A9CC /* NRStoreVipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8596C2EE944DE0095A9CC /* NRStoreVipView.swift */; }; + F3B8596F2EE9456E0095A9CC /* NRStoreVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8596E2EE9456E0095A9CC /* NRStoreVipCell.swift */; }; + F3B859712EE94A1B0095A9CC /* NRFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859702EE94A1B0095A9CC /* NRFeedbackViewController.swift */; }; + F3B859732EE94A760095A9CC /* NRAppWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859722EE94A760095A9CC /* NRAppWebViewController.swift */; }; + F3B859752EE9515B0095A9CC /* NRMeCoinsPackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859742EE9515B0095A9CC /* NRMeCoinsPackView.swift */; }; + F3B859772EE95B220095A9CC /* NRMeVipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859762EE95B220095A9CC /* NRMeVipView.swift */; }; + F3B859792EE960D20095A9CC /* NRWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859782EE960D20095A9CC /* NRWalletViewController.swift */; }; + F3B8597B2EE961EF0095A9CC /* NRWalletCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8597A2EE961EF0095A9CC /* NRWalletCell.swift */; }; + F3B8597D2EE9627B0095A9CC /* NRWalletHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8597C2EE9627B0095A9CC /* NRWalletHeaderView.swift */; }; + F3B8597F2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8597E2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift */; }; + F3B859812EE9716E0095A9CC /* NRBuyRecordsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859802EE9716E0095A9CC /* NRBuyRecordsModel.swift */; }; + F3B859862EE972F70095A9CC /* NRConsumptionRecordsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859842EE972F70095A9CC /* NRConsumptionRecordsCell.swift */; }; + F3B859872EE972F70095A9CC /* NRConsumptionRecordsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3B859852EE972F70095A9CC /* NRConsumptionRecordsCell.xib */; }; + F3B859892EE97E1F0095A9CC /* NRRewardCoinsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859882EE97E1F0095A9CC /* NRRewardCoinsViewController.swift */; }; + F3B8598B2EEA51540095A9CC /* NRRewardCoinsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8598A2EEA51540095A9CC /* NRRewardCoinsModel.swift */; }; + F3B8598D2EEA51FE0095A9CC /* NRRewardCoinsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8598C2EEA51FE0095A9CC /* NRRewardCoinsCell.swift */; }; + F3B8598F2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8598E2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift */; }; + F3B859912EEA627F0095A9CC /* NROrderRecordsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859902EEA627F0095A9CC /* NROrderRecordsViewController.swift */; }; + F3B859932EEA63CD0095A9CC /* NROrderRecordsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859922EEA63CD0095A9CC /* NROrderRecordsModel.swift */; }; + F3B859952EEA64430095A9CC /* NROrderRecordsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859942EEA64430095A9CC /* NROrderRecordsCell.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -358,6 +393,41 @@ F3B8593D2EE677740095A9CC /* NRLocalizedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRLocalizedModel.swift; sourceTree = ""; }; F3B8593F2EE6787E0095A9CC /* NRLocalizedManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRLocalizedManager.swift; sourceTree = ""; }; F3B859412EE678FB0095A9CC /* NRSettingAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRSettingAPI.swift; sourceTree = ""; }; + F3B859432EE902BF0095A9CC /* NRStoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreViewController.swift; sourceTree = ""; }; + F3B8594B2EE904980095A9CC /* NRPayDateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRPayDateModel.swift; sourceTree = ""; }; + F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreAPI.swift; sourceTree = ""; }; + F3B859512EE906A80095A9CC /* JXIAPManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JXIAPManager.swift; sourceTree = ""; }; + F3B859562EE907280095A9CC /* NRIapManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRIapManager.swift; sourceTree = ""; }; + F3B859582EE907350095A9CC /* NRIAPOrderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRIAPOrderModel.swift; sourceTree = ""; }; + F3B8595A2EE907600095A9CC /* NRWaitRestoreModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRWaitRestoreModel.swift; sourceTree = ""; }; + F3B8595C2EE907710095A9CC /* NRIAPVerifyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRIAPVerifyModel.swift; sourceTree = ""; }; + F3B8595E2EE910020095A9CC /* NRPayDataRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRPayDataRequest.swift; sourceTree = ""; }; + F3B859602EE9126A0095A9CC /* Dictionary+NRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+NRAdd.swift"; sourceTree = ""; }; + F3B859622EE91B850095A9CC /* NRStoreCoinsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreCoinsView.swift; sourceTree = ""; }; + F3B859642EE91BB70095A9CC /* NRStoreCoinsBigCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreCoinsBigCell.swift; sourceTree = ""; }; + F3B859662EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreCoinsSmallCell.swift; sourceTree = ""; }; + F3B859682EE91BD70095A9CC /* NRStoreCoinsPackCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreCoinsPackCell.swift; sourceTree = ""; }; + F3B8596A2EE91C9F0095A9CC /* NRStoreCoinsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreCoinsCell.swift; sourceTree = ""; }; + F3B8596C2EE944DE0095A9CC /* NRStoreVipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreVipView.swift; sourceTree = ""; }; + F3B8596E2EE9456E0095A9CC /* NRStoreVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreVipCell.swift; sourceTree = ""; }; + F3B859702EE94A1B0095A9CC /* NRFeedbackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRFeedbackViewController.swift; sourceTree = ""; }; + F3B859722EE94A760095A9CC /* NRAppWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRAppWebViewController.swift; sourceTree = ""; }; + F3B859742EE9515B0095A9CC /* NRMeCoinsPackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRMeCoinsPackView.swift; sourceTree = ""; }; + F3B859762EE95B220095A9CC /* NRMeVipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRMeVipView.swift; sourceTree = ""; }; + F3B859782EE960D20095A9CC /* NRWalletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRWalletViewController.swift; sourceTree = ""; }; + F3B8597A2EE961EF0095A9CC /* NRWalletCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRWalletCell.swift; sourceTree = ""; }; + F3B8597C2EE9627B0095A9CC /* NRWalletHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRWalletHeaderView.swift; sourceTree = ""; }; + F3B8597E2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRConsumptionRecordsViewController.swift; sourceTree = ""; }; + F3B859802EE9716E0095A9CC /* NRBuyRecordsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRBuyRecordsModel.swift; sourceTree = ""; }; + F3B859842EE972F70095A9CC /* NRConsumptionRecordsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRConsumptionRecordsCell.swift; sourceTree = ""; }; + F3B859852EE972F70095A9CC /* NRConsumptionRecordsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NRConsumptionRecordsCell.xib; sourceTree = ""; }; + F3B859882EE97E1F0095A9CC /* NRRewardCoinsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRRewardCoinsViewController.swift; sourceTree = ""; }; + F3B8598A2EEA51540095A9CC /* NRRewardCoinsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRRewardCoinsModel.swift; sourceTree = ""; }; + F3B8598C2EEA51FE0095A9CC /* NRRewardCoinsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRRewardCoinsCell.swift; sourceTree = ""; }; + F3B8598E2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROrderRecordsPageViewController.swift; sourceTree = ""; }; + F3B859902EEA627F0095A9CC /* NROrderRecordsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROrderRecordsViewController.swift; sourceTree = ""; }; + F3B859922EEA63CD0095A9CC /* NROrderRecordsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROrderRecordsModel.swift; sourceTree = ""; }; + F3B859942EEA64430095A9CC /* NROrderRecordsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROrderRecordsCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -375,6 +445,7 @@ 0373D93C2ED578FC0017DCC7 /* API */ = { isa = PBXGroup; children = ( + F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */, F34991022EE160E50039E939 /* NRUserAPI.swift */, F343492B2EDE72EE00AA7E70 /* NRHomeAPI.swift */, 0373D94A2ED582E10017DCC7 /* NRNovelAPI.swift */, @@ -485,6 +556,7 @@ 039810752ED054090006E317 /* Class */, 03980F8E2ED00ABC0006E317 /* Source */, 039810742ED053F40006E317 /* Libs */, + F3B8594F2EE9068E0095A9CC /* Thirdparty */, ); path = ReaderHive; sourceTree = ""; @@ -559,6 +631,7 @@ 0398106E2ED053630006E317 /* Extension */ = { isa = PBXGroup; children = ( + F3B859602EE9126A0095A9CC /* Dictionary+NRAdd.swift */, F34990B62EDE78680039E939 /* UIScrollView+Refresh.swift */, F34348E62ED7F91500AA7E70 /* NSNumber+NRAdd.swift */, 0373D95B2ED598830017DCC7 /* UIStackView+NRAdd.swift */, @@ -576,6 +649,7 @@ 039810742ED053F40006E317 /* Libs */ = { isa = PBXGroup; children = ( + F3B859552EE907220095A9CC /* IAP */, F3B8593A2EE676B30095A9CC /* LocalizedManager */, F349911D2EE26B020039E939 /* Alert */, F34990EF2EE00F460039E939 /* KeyedArchiver */, @@ -598,6 +672,7 @@ F34348A92ED5B59C00AA7E70 /* Explore */, 0373D93D2ED57A500017DCC7 /* Novel */, F34990C02EDFCD180039E939 /* Me */, + F3B859452EE904390095A9CC /* Store */, ); path = Class; sourceTree = ""; @@ -905,6 +980,8 @@ F34990FE2EE158790039E939 /* NRMeCell.swift */, F34991002EE1593A0039E939 /* NRMeHeaderView.swift */, F3B859322EE66DD10095A9CC /* NRMeCoinsContentView.swift */, + F3B859762EE95B220095A9CC /* NRMeVipView.swift */, + F3B859742EE9515B0095A9CC /* NRMeCoinsPackView.swift */, F3B859342EE66F530095A9CC /* NRMeCoinsView.swift */, F34991082EE169C60039E939 /* NRAboutHeaderView.swift */, F349910A2EE16B520039E939 /* NRAboutCell.swift */, @@ -922,6 +999,7 @@ F34991132EE175E30039E939 /* NRHistoryViewController.swift */, F34991152EE176640039E939 /* NRNovelHistoryViewController.swift */, F3B859362EE6750B0095A9CC /* NRLanguageViewController.swift */, + F3B859702EE94A1B0095A9CC /* NRFeedbackViewController.swift */, ); path = VC; sourceTree = ""; @@ -938,6 +1016,7 @@ isa = PBXGroup; children = ( F349910D2EE1707C0039E939 /* NRWebViewController.swift */, + F3B859722EE94A760095A9CC /* NRAppWebViewController.swift */, F349910F2EE170850039E939 /* NRWebViewController+Script.swift */, F34991112EE170DD0039E939 /* NRWebView.swift */, ); @@ -963,6 +1042,88 @@ path = LocalizedManager; sourceTree = ""; }; + F3B859452EE904390095A9CC /* Store */ = { + isa = PBXGroup; + children = ( + F3B8594A2EE9045C0095A9CC /* VC */, + F3B859482EE9044F0095A9CC /* V */, + F3B859492EE904580095A9CC /* M */, + ); + path = Store; + sourceTree = ""; + }; + F3B859482EE9044F0095A9CC /* V */ = { + isa = PBXGroup; + children = ( + F3B859622EE91B850095A9CC /* NRStoreCoinsView.swift */, + F3B8596C2EE944DE0095A9CC /* NRStoreVipView.swift */, + F3B8596A2EE91C9F0095A9CC /* NRStoreCoinsCell.swift */, + F3B859642EE91BB70095A9CC /* NRStoreCoinsBigCell.swift */, + F3B859662EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift */, + F3B859682EE91BD70095A9CC /* NRStoreCoinsPackCell.swift */, + F3B8596E2EE9456E0095A9CC /* NRStoreVipCell.swift */, + F3B8597A2EE961EF0095A9CC /* NRWalletCell.swift */, + F3B8597C2EE9627B0095A9CC /* NRWalletHeaderView.swift */, + F3B859842EE972F70095A9CC /* NRConsumptionRecordsCell.swift */, + F3B859852EE972F70095A9CC /* NRConsumptionRecordsCell.xib */, + F3B8598C2EEA51FE0095A9CC /* NRRewardCoinsCell.swift */, + F3B859942EEA64430095A9CC /* NROrderRecordsCell.swift */, + ); + path = V; + sourceTree = ""; + }; + F3B859492EE904580095A9CC /* M */ = { + isa = PBXGroup; + children = ( + F3B8594B2EE904980095A9CC /* NRPayDateModel.swift */, + F3B859802EE9716E0095A9CC /* NRBuyRecordsModel.swift */, + F3B8598A2EEA51540095A9CC /* NRRewardCoinsModel.swift */, + F3B859922EEA63CD0095A9CC /* NROrderRecordsModel.swift */, + ); + path = M; + sourceTree = ""; + }; + F3B8594A2EE9045C0095A9CC /* VC */ = { + isa = PBXGroup; + children = ( + F3B859432EE902BF0095A9CC /* NRStoreViewController.swift */, + F3B859782EE960D20095A9CC /* NRWalletViewController.swift */, + F3B8597E2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift */, + F3B859882EE97E1F0095A9CC /* NRRewardCoinsViewController.swift */, + F3B8598E2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift */, + F3B859902EEA627F0095A9CC /* NROrderRecordsViewController.swift */, + ); + path = VC; + sourceTree = ""; + }; + F3B8594F2EE9068E0095A9CC /* Thirdparty */ = { + isa = PBXGroup; + children = ( + F3B859502EE906A40095A9CC /* JXIAPManager */, + ); + path = Thirdparty; + sourceTree = ""; + }; + F3B859502EE906A40095A9CC /* JXIAPManager */ = { + isa = PBXGroup; + children = ( + F3B859512EE906A80095A9CC /* JXIAPManager.swift */, + ); + path = JXIAPManager; + sourceTree = ""; + }; + F3B859552EE907220095A9CC /* IAP */ = { + isa = PBXGroup; + children = ( + F3B859562EE907280095A9CC /* NRIapManager.swift */, + F3B8595E2EE910020095A9CC /* NRPayDataRequest.swift */, + F3B859582EE907350095A9CC /* NRIAPOrderModel.swift */, + F3B8595C2EE907710095A9CC /* NRIAPVerifyModel.swift */, + F3B8595A2EE907600095A9CC /* NRWaitRestoreModel.swift */, + ); + path = IAP; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1027,6 +1188,7 @@ files = ( 03980F8A2ED009EB0006E317 /* Assets.xcassets in Resources */, 039810732ED053BE0006E317 /* Localizable.strings in Resources */, + F3B859872EE972F70095A9CC /* NRConsumptionRecordsCell.xib in Resources */, 03980F8C2ED009EB0006E317 /* LaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1094,10 +1256,15 @@ F34348FF2ED85BF200AA7E70 /* NRReadBatteryView.swift in Sources */, F3B8593C2EE677170095A9CC /* NRLanguageModel.swift in Sources */, 039810BA2ED4377E0006E317 /* NRHomeNovelReadWhatCell.swift in Sources */, + F3B8596B2EE91C9F0095A9CC /* NRStoreCoinsCell.swift in Sources */, + F3B859712EE94A1B0095A9CC /* NRFeedbackViewController.swift in Sources */, F34348C72ED6CCBC00AA7E70 /* NRExploreNovelContentListViewController.swift in Sources */, 039810B82ED431780006E317 /* NRHomeNovelReadWhatView.swift in Sources */, F34349142EDA9AE900AA7E70 /* NRNovelReadSettingView.swift in Sources */, + F3B859632EE91B850095A9CC /* NRStoreCoinsView.swift in Sources */, F34348BD2ED68F2B00AA7E70 /* NRExploreNovelViewModel.swift in Sources */, + F3B8595F2EE910020095A9CC /* NRPayDataRequest.swift in Sources */, + F3B859692EE91BD70095A9CC /* NRStoreCoinsPackCell.swift in Sources */, F34991102EE1708C0039E939 /* NRWebViewController+Script.swift in Sources */, F34348B12ED5B9A400AA7E70 /* NRExploreNovelViewController.swift in Sources */, F34348BF2ED691C100AA7E70 /* NRExploreNovelGenresViewController.swift in Sources */, @@ -1112,26 +1279,33 @@ F34348C32ED6A20700AA7E70 /* NRExploreNovelContentViewController.swift in Sources */, F34991292EE285660039E939 /* NRShowRecommendPop.swift in Sources */, 0373D9642ED5ABBC0017DCC7 /* NREmpty.swift in Sources */, + F3B859572EE9072C0095A9CC /* NRIapManager.swift in Sources */, 039810B62ED42D840006E317 /* NRHomeNovelNewArrivalsCell.swift in Sources */, 0373D95A2ED593D50017DCC7 /* NRSearchRecordCell.swift in Sources */, 0373D9582ED5935D0017DCC7 /* NRSearchRecordView.swift in Sources */, F343490C2ED9751800AA7E70 /* NRReadChapterCatalogModel.swift in Sources */, + F3B859862EE972F70095A9CC /* NRConsumptionRecordsCell.swift in Sources */, F34990C72EDFCE500039E939 /* NRNovelReadGradeView.swift in Sources */, 039810B42ED428F20006E317 /* NRHomeNovelNewArrivalsView.swift in Sources */, F34991012EE1593A0039E939 /* NRMeHeaderView.swift in Sources */, + F3B8598F2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift in Sources */, F34991052EE165EA0039E939 /* NRMeItem.swift in Sources */, 039810CC2ED477CD0006E317 /* UIView+NRAdd.swift in Sources */, F3B859312EE66B950095A9CC /* NRDetailRechargeView.swift in Sources */, F34348B92ED5C7E400AA7E70 /* NRExploreNovelMenuCell.swift in Sources */, F343490A2ED96EE600AA7E70 /* NRNovelReadView.swift in Sources */, 039810B22ED3F5FB0006E317 /* NRGradientView.swift in Sources */, + F3B8596D2EE944DE0095A9CC /* NRStoreVipView.swift in Sources */, 039810852ED056D70006E317 /* UserDefaults+NRAdd.swift in Sources */, + F3B8595B2EE907600095A9CC /* NRWaitRestoreModel.swift in Sources */, 039810CA2ED469D50006E317 /* NRWaterfallFlowLayout.swift in Sources */, F34348F72ED84B0D00AA7E70 /* NRNovelReaderViewController+Page.swift in Sources */, 039810902ED060EF0006E317 /* NRViewController.swift in Sources */, 039810702ED053910006E317 /* String+NRAdd.swift in Sources */, 039810932ED062CE0006E317 /* NRHomeViewController.swift in Sources */, + F3B859652EE91BB70095A9CC /* NRStoreCoinsBigCell.swift in Sources */, 039810BC2ED43C8E0006E317 /* NRReadWhatViewTransformer.swift in Sources */, + F3B859932EEA63CD0095A9CC /* NROrderRecordsModel.swift in Sources */, 039810D02ED54D370006E317 /* NRHomeCategoryTagView.swift in Sources */, F34348E32ED70D2F00AA7E70 /* NRNovelDetailHeaderView+Data.swift in Sources */, 0398107F2ED055D10006E317 /* NRLoginManager.swift in Sources */, @@ -1148,6 +1322,7 @@ 0373D9472ED57F3F0017DCC7 /* UINavigationBar+NRAdd.swift in Sources */, 0373D94D2ED583A80017DCC7 /* NRNovelModel.swift in Sources */, F34348AF2ED5B85300AA7E70 /* NRExploreViewController.swift in Sources */, + F3B859732EE94A760095A9CC /* NRAppWebViewController.swift in Sources */, 0373D9602ED59DA10017DCC7 /* NRSearchResultCell.swift in Sources */, 039810952ED066710006E317 /* UIScreen+NRAdd.swift in Sources */, 039810662ED04F940006E317 /* NRUrlPath.swift in Sources */, @@ -1155,16 +1330,20 @@ F34991232EE26EAC0039E939 /* NRAlert.swift in Sources */, F34348B72ED5C75800AA7E70 /* NRTableViewCell.swift in Sources */, F34349102ED9A77A00AA7E70 /* NRPanModalContentView.swift in Sources */, + F3B859892EE97E1F0095A9CC /* NRRewardCoinsViewController.swift in Sources */, 039810CE2ED47A130006E317 /* CGMutablePath+NRRoundedCorner.swift in Sources */, F34348E72ED7F91C00AA7E70 /* NSNumber+NRAdd.swift in Sources */, + F3B8597F2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift in Sources */, F34349122EDA84F100AA7E70 /* NRProgressView.swift in Sources */, F349910B2EE16B520039E939 /* NRAboutCell.swift in Sources */, + F3B859592EE9073B0095A9CC /* NRIAPOrderModel.swift in Sources */, 039810A22ED070400006E317 /* NRHomeNovelHeaderView.swift in Sources */, F34349082ED945DA00AA7E70 /* NRCoreText.swift in Sources */, F349911F2EE26C350039E939 /* NRAlertWindowManager.swift in Sources */, F34991072EE167E80039E939 /* NRAboutViewController.swift in Sources */, F34348ED2ED82B6300AA7E70 /* NRNovelReadSetManager.swift in Sources */, F34990FF2EE158790039E939 /* NRMeCell.swift in Sources */, + F3B859752EE9515B0095A9CC /* NRMeCoinsPackView.swift in Sources */, F34348DD2ED6F9F900AA7E70 /* NRNovelDetailMoreLikeCell.swift in Sources */, 039810AC2ED3EF640006E317 /* NRHomeNovelHeaderContentView.swift in Sources */, 0398106D2ED053000006E317 /* NRDefine.swift in Sources */, @@ -1173,16 +1352,21 @@ F343492C2EDE72F300AA7E70 /* NRHomeAPI.swift in Sources */, F3B859372EE6750B0095A9CC /* NRLanguageViewController.swift in Sources */, F34348E12ED70A2700AA7E70 /* NRNovelDetailHeaderView+NovelCoverInfo.swift in Sources */, + F3B859522EE906A90095A9CC /* JXIAPManager.swift in Sources */, F34349012ED93A9B00AA7E70 /* NRReadChapterModel.swift in Sources */, F34348DF2ED7049E00AA7E70 /* NRNovelDetailHeaderView.swift in Sources */, F34348BB2ED5CD8100AA7E70 /* NRExploreNovelMenuItem.swift in Sources */, 0398109B2ED0692A0006E317 /* NRImageView.swift in Sources */, 0398108A2ED0582F0006E317 /* NRDeviceId.swift in Sources */, + F3B859812EE9716E0095A9CC /* NRBuyRecordsModel.swift in Sources */, + F3B859952EEA64430095A9CC /* NROrderRecordsCell.swift in Sources */, 0373D9542ED58AF00017DCC7 /* NRSearchInputView.swift in Sources */, F34348EB2ED82B4100AA7E70 /* NRNovelReadSet.swift in Sources */, 039810682ED050390006E317 /* NRResponseCryptor.swift in Sources */, 039810C62ED45AE30006E317 /* NRHomeNovelHotTagCell.swift in Sources */, + F3B859912EEA627F0095A9CC /* NROrderRecordsViewController.swift in Sources */, F34348D92ED6F01900AA7E70 /* NRNovelDetailBottomView.swift in Sources */, + F3B8597B2EE961EF0095A9CC /* NRWalletCell.swift in Sources */, F34348CB2ED6DADA00AA7E70 /* NRNovelGenresViewController.swift in Sources */, F3B859422EE678FB0095A9CC /* NRSettingAPI.swift in Sources */, 0373D9522ED58A950017DCC7 /* NRSearchViewModel.swift in Sources */, @@ -1200,14 +1384,18 @@ 0373D9562ED5933F0017DCC7 /* NRSearchHomeView.swift in Sources */, F3B859352EE66F530095A9CC /* NRMeCoinsView.swift in Sources */, 0398108C2ED0584F0006E317 /* NRKeychain.swift in Sources */, + F3B859792EE960D20095A9CC /* NRWalletViewController.swift in Sources */, 039810A02ED06B7C0006E317 /* NRHomeNovelViewController.swift in Sources */, F34990FB2EE121490039E939 /* NRLabel.swift in Sources */, F3B859332EE66DD10095A9CC /* NRMeCoinsContentView.swift in Sources */, F34348F22ED8388F00AA7E70 /* NRNovelReadTopView.swift in Sources */, + F3B859612EE9126E0095A9CC /* Dictionary+NRAdd.swift in Sources */, F34349182EDAA02900AA7E70 /* NRNovelReadSettingItemView.swift in Sources */, 039810812ED056090006E317 /* NRLoginToken.swift in Sources */, + F3B859442EE902BF0095A9CC /* NRStoreViewController.swift in Sources */, F343491A2EDAC2E500AA7E70 /* NRReadSettingThemeView.swift in Sources */, 0373D9402ED57B1C0017DCC7 /* NRNovelDetailViewController.swift in Sources */, + F3B8598B2EEA51540095A9CC /* NRRewardCoinsModel.swift in Sources */, 039810A62ED072820006E317 /* NRCollectionView.swift in Sources */, 039810602ED04D950006E317 /* NRNetworkModel.swift in Sources */, F34348C92ED6CDD900AA7E70 /* NRExploreNovelContentListCell.swift in Sources */, @@ -1221,23 +1409,30 @@ 039810A82ED3E7DB0006E317 /* NRHomeNovelListCell.swift in Sources */, F34991212EE26C660039E939 /* NRBaseAlert.swift in Sources */, F34990FD2EE124CF0039E939 /* NRNovelReadStarGradeView.swift in Sources */, + F3B8594C2EE904980095A9CC /* NRPayDateModel.swift in Sources */, F34991182EE1780A0039E939 /* NRNovelHistoryCell.swift in Sources */, F34990F12EE00F5A0039E939 /* NRKeyedArchiver.swift in Sources */, F34349162EDA9FC700AA7E70 /* NRReadSettingBrightnessView.swift in Sources */, + F3B8598D2EEA51FE0095A9CC /* NRRewardCoinsCell.swift in Sources */, F34990F52EE0346B0039E939 /* NRNovelReadBaseViewController.swift in Sources */, 039810642ED04F480006E317 /* NRTargetType.swift in Sources */, + F3B8595D2EE907710095A9CC /* NRIAPVerifyModel.swift in Sources */, F343491E2EDAD0AA00AA7E70 /* NRReadTheme.swift in Sources */, + F3B8597D2EE9627B0095A9CC /* NRWalletHeaderView.swift in Sources */, 039810872ED057260006E317 /* NRUserDefaultsKey.swift in Sources */, F34349222EDD227A00AA7E70 /* NRReadSettingSpacingView.swift in Sources */, F34990F32EE02FD60039E939 /* NRNovelReadFinishViewController.swift in Sources */, F34348F92ED855AA00AA7E70 /* NRNovelReadContentViewController.swift in Sources */, 039810A42ED072380006E317 /* NRHomeNovelListViewController.swift in Sources */, 039810BE2ED44C210006E317 /* NRHomeNovelHotGridView.swift in Sources */, + F3B859672EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift in Sources */, F3B859392EE676610095A9CC /* NRLanguageCell.swift in Sources */, 0373D95E2ED59C430017DCC7 /* NRSearchResultView.swift in Sources */, F34991142EE175E30039E939 /* NRHistoryViewController.swift in Sources */, F3B8593E2EE677740095A9CC /* NRLocalizedModel.swift in Sources */, 039810AA2ED3EC2E0006E317 /* NRScrollView.swift in Sources */, + F3B859772EE95B220095A9CC /* NRMeVipView.swift in Sources */, + F3B8594E2EE905A70095A9CC /* NRStoreAPI.swift in Sources */, 0373D94F2ED58A1E0017DCC7 /* NRSearchViewController.swift in Sources */, 0398108E2ED060020006E317 /* UIFont+NRAdd.swift in Sources */, F34348D32ED6E0F400AA7E70 /* NRMyListViewController.swift in Sources */, @@ -1247,6 +1442,7 @@ F34348D72ED6E7C600AA7E70 /* NRMyListNovelCell.swift in Sources */, F34349052ED9442300AA7E70 /* NRReadPageModel.swift in Sources */, F34990F92EE118FC0039E939 /* NRNovelReadFinishHeaderView.swift in Sources */, + F3B8596F2EE9456E0095A9CC /* NRStoreVipCell.swift in Sources */, F34990C52EDFCD4A0039E939 /* NRMeViewController.swift in Sources */, F349911C2EE190590039E939 /* NRNovelDetailCatalogViewController.swift in Sources */, F34348F02ED8381E00AA7E70 /* NRNovelReadViewModel.swift in Sources */, @@ -1282,13 +1478,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 8NNUR9HPV3; + DEVELOPMENT_TEAM = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ReaderHive/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ReaderHive; + INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1300,8 +1498,9 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.ReaderHive; + PRODUCT_BUNDLE_IDENTIFIER = com.lssj.ReaderHive; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -1320,12 +1519,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 8NNUR9HPV3; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9JR2Y32ZU3; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ReaderHive/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ReaderHive; + INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1337,8 +1540,10 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.ReaderHive; + PRODUCT_BUNDLE_IDENTIFIER = com.lssj.ReaderHive; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = readerdev; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; diff --git a/ReaderHive/Base/Define/NRDefine.swift b/ReaderHive/Base/Define/NRDefine.swift index eeab36b..afb3c03 100644 --- a/ReaderHive/Base/Define/NRDefine.swift +++ b/ReaderHive/Base/Define/NRDefine.swift @@ -6,6 +6,11 @@ // import UIKit + +///当前系统版本号 +let kNROsVersion: String = UIDevice.current.systemVersion +let kNRAPPBundleIdentifier: String = (Bundle.main.infoDictionary!["CFBundleIdentifier"] as? String) ?? "0" + ///app版本号 let kNRAPPVersion: String = (Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String) ?? "0" let kNRAPPBundleVersion: String = (Bundle.main.infoDictionary!["CFBundleVersion"] as? String) ?? "0" diff --git a/ReaderHive/Base/Define/NRUserDefaultsKey.swift b/ReaderHive/Base/Define/NRUserDefaultsKey.swift index 119fb72..66cbc14 100644 --- a/ReaderHive/Base/Define/NRUserDefaultsKey.swift +++ b/ReaderHive/Base/Define/NRUserDefaultsKey.swift @@ -11,3 +11,5 @@ let kNRLoginTokenDefaultsKey = "kNRLoginTokenDefaultsKey" let kNRUserInfoDefaultsKey = "kNRUserInfoDefaultsKey" ///阅读设置 let kNRNovelReadSetDefaultsKey = "kNRNovelReadSetDefaultsKey" + +let kNRWaitRestoreIAPDefaultsKey = "kNRWaitRestoreIAPDefaultsKey" diff --git a/ReaderHive/Base/Extension/Dictionary+NRAdd.swift b/ReaderHive/Base/Extension/Dictionary+NRAdd.swift new file mode 100644 index 0000000..6f0451c --- /dev/null +++ b/ReaderHive/Base/Extension/Dictionary+NRAdd.swift @@ -0,0 +1,23 @@ +// +// Dictionary+NRAdd.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +extension Dictionary { + + func toJsonString() -> String? { + do { + let data = try JSONSerialization.data(withJSONObject: self) + let jsonStr = String(data: data, encoding: .utf8) + return jsonStr + } catch { + + } + return nil + } + +} diff --git a/ReaderHive/Base/Networking/API/NRStoreAPI.swift b/ReaderHive/Base/Networking/API/NRStoreAPI.swift new file mode 100644 index 0000000..facac2b --- /dev/null +++ b/ReaderHive/Base/Networking/API/NRStoreAPI.swift @@ -0,0 +1,130 @@ +// +// NRStoreAPI.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SmartCodable +import Alamofire + + +struct NRStoreAPI { + + enum BuyType: String, SmartCaseDefaultable { + case coins = "coins" + case subVip = "sub_vip" + case subCoins = "sub_coins" + } + + ///获取支付模版 + static func requestPayTemplate(isLoding: Bool = false, isToast: Bool = true, completer: ((_ model: NRPayDateModel?) -> Void)?) { + + var param = NRNetwork.Parameters(path: "/paySettingsV4") + param.method = .get + param.isToast = isToast + param.isLoding = isLoding + param.parameters = [ + "discount" : "1", + "purchases_token" : JXIAPManager.manager.getAppStoreReceipt() ?? "", + ] + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + if response.isSuccess { + completer?(response.data) + } else { + completer?(nil) + } + } + } + + + ///创建内购订单 + static func requestCreateOrder(payId: String, shortPlayId: String, videoId: String, isDiscount: Bool = false, identifierDiscount: String? = nil, completer: ((_ orderModel: NRIAPOrderModel?) -> Void)?) { + var param = NRNetwork.Parameters(path: "/createOrder") + param.isToast = false + param.parameters = [ + "payment_channel" : "apple", + "short_play_id" : shortPlayId, + "video_id" : videoId, + "pay_setting_id" : payId, + "is_discount" : isDiscount ? 1 : 0, + "product_discount" : identifierDiscount ?? "", + ] + + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + guard let data = response.data else { + NRToast.show(text: "network_error_2".localized) + completer?(nil) + return + } + + if let message = data.message, message.count > 0 { + if response.data?.code == 30007 { + NRToast.show(text: "pay_error_1".localized) + } else { + NRToast.show(text: message) + } + completer?(nil) + } else { + completer?(data) + } + } + } + + ///校验内购 + static func requestVerifyOrder(parameters: [String : Any], completer: ((_ response: NRNetwork.Response) -> Void)?) { + var param = NRNetwork.Parameters(path: "/applePaid") + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + completer?(response) + } + } + + + static func requestBuyRecords(page: Int, completer: ((_ listModel: NRNetwork.List?) -> Void)?) { + var param = NRNetwork.Parameters(path: "/getCustomerBuyRecords") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page, + ] + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response>) in + completer?(response.data) + } + } + + static func requestRechargeRecord(page: Int, buyType: BuyType, completer: ((_ listModel: NRNetwork.List?) -> Void)?) { + + var param = NRNetwork.Parameters(path: "/getCustomerOrder") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page, + "buy_type" : buyType.rawValue + ] + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response>) in + completer?(response.data) + } + } + + static func reuqestSendCoinRecord(page: Int, completer: ((_ listModel: NRNetwork.List?) -> Void)?) { + + var param = NRNetwork.Parameters(path: "/sendCoinList") + param.method = .post + param.parameters = [ + "page_size" : 20, + "current_page" : page, + ] + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response>) in + completer?(response.data) + } + } + +} diff --git a/ReaderHive/Base/Networking/NRTargetType.swift b/ReaderHive/Base/Networking/NRTargetType.swift index 92f827d..6c78b4f 100644 --- a/ReaderHive/Base/Networking/NRTargetType.swift +++ b/ReaderHive/Base/Networking/NRTargetType.swift @@ -57,7 +57,7 @@ extension NRTargetType: TargetType { "model" : UIDevice.current.machineModelName ?? "", "authorization" : NRLoginManager.manager.token?.token ?? "", "device-gaid" : UIDevice.current.identifierForVendor?.uuidString ?? "", - "product-prefix" : "ReaderHive" + "product-prefix" : NRIapManager.IAPPrefix ] #if DEBUG dic["security"] = "false" diff --git a/ReaderHive/Base/Networking/NRUrlPath.swift b/ReaderHive/Base/Networking/NRUrlPath.swift index ee34441..f14fa7d 100644 --- a/ReaderHive/Base/Networking/NRUrlPath.swift +++ b/ReaderHive/Base/Networking/NRUrlPath.swift @@ -11,6 +11,7 @@ let NRBaseURL = "https://api-readerhive.readerhive.net" let NRWebBaseURL = "https://www.readerhive.net" +let NRCampaignWebURL = "https://campaign.readerhive.com" @@ -18,3 +19,15 @@ let NRWebBaseURL = "https://www.readerhive.net" let kNRUserAgreementWebUrl = NRWebBaseURL + "/user_policy" ///隐私协议 let kNRPrivacyPolicyWebUrl = NRWebBaseURL + "/private" + + + +///反馈首页 +let kNRFeedBackHomeWebUrl = NRCampaignWebURL + "/pages/leave/index" +///反馈列表 +let kNRFeedBackListWebUrl = NRCampaignWebURL + "/pages/leave/list" +///反馈详情 +let kNRFeedBackDetailWebUrl = NRCampaignWebURL + "/pages/leave/detail" + +///注销账号 +let kNRLogoutWebUrl = NRCampaignWebURL + "/pages/setting/logout" diff --git a/ReaderHive/Base/View/NRTableViewCell.swift b/ReaderHive/Base/View/NRTableViewCell.swift index afbf0da..e554091 100644 --- a/ReaderHive/Base/View/NRTableViewCell.swift +++ b/ReaderHive/Base/View/NRTableViewCell.swift @@ -16,15 +16,12 @@ class NRTableViewCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - - self.layer.rasterizationScale = UIScreen.main.scale - self.layer.shouldRasterize = true - self.selectionStyle = .none - self.backgroundColor = .clear + _init() } required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") + super.init(coder: coder) + _init() } override func awakeFromNib() { @@ -37,6 +34,13 @@ class NRTableViewCell: UITableViewCell { // Configure the view for the selected state } + + private func _init() { + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + self.selectionStyle = .none + self.backgroundColor = .clear + } } diff --git a/ReaderHive/Base/WebView/NRAppWebViewController.swift b/ReaderHive/Base/WebView/NRAppWebViewController.swift new file mode 100644 index 0000000..a31c573 --- /dev/null +++ b/ReaderHive/Base/WebView/NRAppWebViewController.swift @@ -0,0 +1,78 @@ +// +// NRAppWebViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +internal import WebKit + +class NRAppWebViewController: NRWebViewController { + + var id: String? + + private var receiveDataCount = 0 + + var theme: String? = "theme_3" + + override func viewDidLoad() { + super.viewDidLoad() + + if webUrl == kNRFeedBackListWebUrl { + self.title = "Feedback History".localized + } else if webUrl == kNRFeedBackHomeWebUrl { + self.title = "Feedback".localized + } else if webUrl == kNRFeedBackDetailWebUrl { + self.title = "Feedback Details".localized + } else if webUrl == kNRLogoutWebUrl { + self.title = "Account Deletion".localized + } + + } + + override func nr_webViewDidFinishLoad(_ webView: NRWebView) { + super.nr_webViewDidFinishLoad(webView) + receiveDataCount = 0 + receiveDataFromNative() + } + +} + +extension NRAppWebViewController { + + func receiveDataFromNative() { + receiveDataCount += 1 + if receiveDataCount > 10 { return } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + guard let self = self else { return } + var dic = [ + "token" : NRLoginManager.manager.token?.token ?? "", + "time_zone" : NRTargetType.timeZone(), + "lang" : NRLocalizedManager.shared.currentLocalizedKey, + "type" : "ios", + "device-id" : NRDeviceId.shared.id + ] + + if let theme = theme { + dic["theme"] = theme + } + + if let id = id { + dic["id"] = id + } + + if let json = dic.toJsonString() { + let js = "receiveDataFromNative(\(json))" + self.webView.evaluateJavaScript(js) { [weak self] _, error in + guard let self = self else { return } + if error != nil { + self.receiveDataFromNative() + } + } + } + } + + } +} diff --git a/ReaderHive/Base/WebView/NRWebView.swift b/ReaderHive/Base/WebView/NRWebView.swift index f029ef0..516e34c 100644 --- a/ReaderHive/Base/WebView/NRWebView.swift +++ b/ReaderHive/Base/WebView/NRWebView.swift @@ -6,7 +6,7 @@ // import UIKit -@preconcurrency import WebKit +internal import WebKit import YYText //MARK:-------------- VPWebViewDelegate -------------- diff --git a/ReaderHive/Base/WebView/NRWebViewController+Script.swift b/ReaderHive/Base/WebView/NRWebViewController+Script.swift index 9a56e80..a88686c 100644 --- a/ReaderHive/Base/WebView/NRWebViewController+Script.swift +++ b/ReaderHive/Base/WebView/NRWebViewController+Script.swift @@ -6,7 +6,7 @@ // import UIKit -import WebKit +internal import WebKit ///APP交互 let kNRWebMessageAPP = "js2app" diff --git a/ReaderHive/Base/WebView/NRWebViewController.swift b/ReaderHive/Base/WebView/NRWebViewController.swift index 41d3f22..ae4c766 100644 --- a/ReaderHive/Base/WebView/NRWebViewController.swift +++ b/ReaderHive/Base/WebView/NRWebViewController.swift @@ -6,7 +6,7 @@ // import UIKit -import WebKit +internal import WebKit import SnapKit class NRWebViewController: NRViewController { diff --git a/ReaderHive/Class/Me/M/NRMeItem.swift b/ReaderHive/Class/Me/M/NRMeItem.swift index 752c961..73a6446 100644 --- a/ReaderHive/Class/Me/M/NRMeItem.swift +++ b/ReaderHive/Class/Me/M/NRMeItem.swift @@ -15,6 +15,10 @@ struct NRMeItem { case about case settings case web + case feedback + case consumptionRecords + case purchaseRecords + case rewardCoins } var type: ItemType diff --git a/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift b/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift index 45b1d93..e9769e1 100644 --- a/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift +++ b/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift @@ -7,6 +7,7 @@ import UIKit import SnapKit +import YYCategories class NRMeCoinsContentView: UIView { @@ -24,12 +25,22 @@ class NRMeCoinsContentView: UIView { private lazy var coinsView: NRMeCoinsView = { let view = NRMeCoinsView() view.title = "Coins".localized + view.addGestureRecognizer(UITapGestureRecognizer(actionBlock: { [weak self] _ in + guard let self = self else { return } + let vc = NRWalletViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + })) return view }() private lazy var sendCoinsView: NRMeCoinsView = { let view = NRMeCoinsView() view.title = "Bonus".localized + view.addGestureRecognizer(UITapGestureRecognizer(actionBlock: { [weak self] _ in + guard let self = self else { return } + let vc = NRWalletViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + })) return view }() @@ -40,7 +51,11 @@ class NRMeCoinsContentView: UIView { }() private lazy var topUpButton: UIButton = { - let button = NRGradientButton(type: .custom) + let button = NRGradientButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = NRStoreViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + })) button.colors = [UIColor.F_3912_F.cgColor, UIColor.FF_4_A_4_A.cgColor, UIColor.FA_9_B_1_F.cgColor] button.startPoint = .init(x: 0, y: 0.5) button.endPoint = .init(x: 1, y: 0.5) diff --git a/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift b/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift new file mode 100644 index 0000000..7a05927 --- /dev/null +++ b/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift @@ -0,0 +1,95 @@ +// +// NRMeCoinsPackView.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit +import YYCategories + +class NRMeCoinsPackView: UIView { + + + private lazy var bgView: UIImageView = { + let view = UIImageView(image: UIImage(named: "me_pack_bg_image")) + view.layer.cornerRadius = 30 + view.layer.masksToBounds = true + view.layer.borderWidth = 1 + view.layer.borderColor = UIColor.FFEFD_4.cgColor + return view + }() + + private lazy var iconImageView = UIImageView(image: UIImage(named: "gift_icon_01")) + + private lazy var titleLabel: UILabel = { + let label = NRLabel() + label.font = .font(ofSize: 14, weight: .semibold) + label.textColors = [UIColor.F_3912_F.cgColor, UIColor.FF_4_A_4_A.cgColor, UIColor.FA_9_B_1_F.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + label.text = "me_coins_pack_title".localized + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular).withItalic() + label.textColor = .F_9710_D + label.text = "me_coins_pack_subtitle".localized + return label + }() + + private lazy var indicatorImageView = UIImageView(image: UIImage(named: "arrow_right_icon_07")) + + override init(frame: CGRect) { + super.init(frame: frame) + + nr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension NRMeCoinsPackView { + + private func nr_setupUI() { + addSubview(bgView) + addSubview(iconImageView) + addSubview(titleLabel) + addSubview(subtitleLabel) + addSubview(indicatorImageView) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + make.height.equalTo(60) + } + + iconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(24) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(iconImageView.snp.right).offset(8) + make.top.equalToSuperview().offset(12) + make.right.lessThanOrEqualToSuperview().offset(-48) + } + + subtitleLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-12) + make.right.lessThanOrEqualToSuperview().offset(-48) + } + + indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-16) + } + } + +} diff --git a/ReaderHive/Class/Me/V/NRMeHeaderView.swift b/ReaderHive/Class/Me/V/NRMeHeaderView.swift index 8f97b7b..652446f 100644 --- a/ReaderHive/Class/Me/V/NRMeHeaderView.swift +++ b/ReaderHive/Class/Me/V/NRMeHeaderView.swift @@ -45,7 +45,6 @@ class NRMeHeaderView: UITableViewHeaderFooterView { private lazy var copyButton: UIButton = { let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in guard let self = self else { return } - UIPasteboard.general.string = NRLoginManager.manager.userInfo?.customer_id NRToast.show(text: "Success") })) @@ -65,6 +64,16 @@ class NRMeHeaderView: UITableViewHeaderFooterView { return view }() + private lazy var coinsPackView: NRMeCoinsPackView = { + let view = NRMeCoinsPackView() + return view + }() + + private lazy var vipView: NRMeVipView = { + let view = NRMeVipView() + return view + }() + deinit { NotificationCenter.default.removeObserver(self) } @@ -72,12 +81,13 @@ class NRMeHeaderView: UITableViewHeaderFooterView { override init(reuseIdentifier: String?) { super.init(reuseIdentifier: reuseIdentifier) NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: NRLoginManager.userInfoUpdateNotification, object: nil) - nr_setupUI() userInfoUpdateNotification() stackView.addArrangedSubview(coinsView) + stackView.addArrangedSubview(vipView) + stackView.addArrangedSubview(coinsPackView) } @@ -105,13 +115,13 @@ extension NRMeHeaderView { contentView.addSubview(idBgView) idBgView.addSubview(idLabel) idBgView.addSubview(copyButton) -// contentView.addSubview(stackView) + contentView.addSubview(stackView) avatarImageView.snp.makeConstraints { make in make.left.equalToSuperview() make.top.equalToSuperview().offset(48) make.width.height.equalTo(60) - make.bottom.equalToSuperview().offset(-16) +// make.bottom.equalToSuperview().offset(-16) } nickLabel.snp.makeConstraints { make in @@ -136,11 +146,11 @@ extension NRMeHeaderView { make.left.equalTo(idLabel.snp.right).offset(8) } -// stackView.snp.makeConstraints { make in -// make.left.right.equalToSuperview() -// make.top.equalTo(avatarImageView.snp.bottom).offset(16) -// make.bottom.equalToSuperview().offset(-16) -// } + stackView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(avatarImageView.snp.bottom).offset(16) + make.bottom.equalToSuperview().offset(-16) + } } } diff --git a/ReaderHive/Class/Me/V/NRMeVipView.swift b/ReaderHive/Class/Me/V/NRMeVipView.swift new file mode 100644 index 0000000..2957d04 --- /dev/null +++ b/ReaderHive/Class/Me/V/NRMeVipView.swift @@ -0,0 +1,92 @@ +// +// NRMeVipView.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRMeVipView: UIView { + + private lazy var contentView: UIView = { + let view = UIView() + view.backgroundColor = .F_2_EFEE + view.layer.cornerRadius = 10 + view.layer.masksToBounds = true + return view + }() + + private lazy var titleLabel: NRLabel = { + let label = NRLabel() + label.font = .font(ofSize: 12, weight: .semibold) + label.textColors = [UIColor.F_3912_F.cgColor, UIColor.FF_4_A_4_A.cgColor, UIColor.FA_9_B_1_F.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + label.setContentHuggingPriority(.required, for: .horizontal) + label.setContentCompressionResistancePriority(.required, for: .horizontal) + return label + }() + + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "time_icon_01")) + imageView.setContentHuggingPriority(.required, for: .horizontal) + imageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return imageView + }() + + private lazy var timeLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .black.withAlphaComponent(0.5) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + titleLabel.text = "Weekly VIP".localized + timeLabel.text = "Expiration Time:2023-11-23" + + nr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension NRMeVipView { + + private func nr_setupUI() { + addSubview(contentView) + contentView.addSubview(titleLabel) + contentView.addSubview(iconImageView) + contentView.addSubview(timeLabel) + + contentView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.height.equalTo(20) + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + } + + titleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(8) + } + + iconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(titleLabel.snp.right).offset(8) + } + + timeLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(iconImageView.snp.right).offset(4) + make.right.equalToSuperview().offset(-8) + } + } + +} diff --git a/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift new file mode 100644 index 0000000..e73c2d3 --- /dev/null +++ b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift @@ -0,0 +1,30 @@ +// +// NRFeedbackViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRFeedbackViewController: NRAppWebViewController { + + override func viewDidLoad() { + self.webUrl = kNRFeedBackHomeWebUrl + super.viewDidLoad() + + + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/ReaderHive/Class/Me/VC/NRMeViewController.swift b/ReaderHive/Class/Me/VC/NRMeViewController.swift index 87c6b90..68a498d 100644 --- a/ReaderHive/Class/Me/VC/NRMeViewController.swift +++ b/ReaderHive/Class/Me/VC/NRMeViewController.swift @@ -14,7 +14,8 @@ class NRMeViewController: NRViewController { let arr = [ NRMeItem(type: .history, icon: UIImage(named: "history_icon_01"), title: "History".localized), // NRMeItem(type: .language, icon: UIImage(named: "language_icon_01"), title: "Language".localized), - NRMeItem(type: .about, icon: UIImage(named: "about_icon_01"), title: "About".localized) + NRMeItem(type: .about, icon: UIImage(named: "about_icon_01"), title: "About".localized), + NRMeItem(type: .feedback, icon: UIImage(named: "feedback_icon_01"), title: "Feedback".localized) ] return arr }() @@ -101,6 +102,10 @@ extension NRMeViewController: UITableViewDelegate, UITableViewDataSource { let vc = NRLanguageViewController() self.navigationController?.pushViewController(vc, animated: true) + case .feedback: + let vc = NRFeedbackViewController() + self.navigationController?.pushViewController(vc, animated: true) + default: break } diff --git a/ReaderHive/Class/Store/M/NRBuyRecordsModel.swift b/ReaderHive/Class/Store/M/NRBuyRecordsModel.swift new file mode 100644 index 0000000..f512f02 --- /dev/null +++ b/ReaderHive/Class/Store/M/NRBuyRecordsModel.swift @@ -0,0 +1,23 @@ +// +// NRBuyRecordsModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SmartCodable + +class NRBuyRecordsModel: NSObject, SmartCodable { + + required override init() { } + + var created_at: String? + var short_play_id: String? + var coins: Int? + var short_play_video_id: String? + var coin_type: Int? + var image_url: String? + var name: String? + var episode: String? +} diff --git a/ReaderHive/Class/Store/M/NROrderRecordsModel.swift b/ReaderHive/Class/Store/M/NROrderRecordsModel.swift new file mode 100644 index 0000000..f705452 --- /dev/null +++ b/ReaderHive/Class/Store/M/NROrderRecordsModel.swift @@ -0,0 +1,18 @@ +// +// NROrderRecordsModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import SmartCodable + +class NROrderRecordsModel: NSObject, SmartCodable { + required override init() { } + + var type: String? + var value: String? + var created_at: String? + +} diff --git a/ReaderHive/Class/Store/M/NRPayDateModel.swift b/ReaderHive/Class/Store/M/NRPayDateModel.swift new file mode 100644 index 0000000..825fade --- /dev/null +++ b/ReaderHive/Class/Store/M/NRPayDateModel.swift @@ -0,0 +1,156 @@ +// +// NRPayDateModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SmartCodable +import StoreKit + +class NRPayDateModel: NSObject, SmartCodable { + + enum SortName: String, SmartCaseDefaultable { + case coin = "list_coins" + case vip = "list_sub_vip" + } + + required override init() { } + + var list_coins: [NRPayItem]? + var list_sub_vip: [NRPayItem]? + var list_sub_coins: [NRPayItem]? + var sort: [SortName]? + + ///0: 老版支付 1:新版支付 + var pay_mode: Int? + ///0: 普通金币 1:金币包模式 + var show_type: Int? + +} + +class NRPayItem: NSObject, SmartCodable { + + enum VipTypeKey: String, SmartCaseDefaultable { + case week = "week" + case month = "month" + case quarter = "quarter" + case year = "year" + } + + enum SizeType: String, SmartCaseDefaultable { + case big = "big" + case small = "small" + } + + required override init() { } + + var id: String? + var status: String? + var price: String? + var origin_price: String? + var backhaul_price: String? + var coins: Int? + var send_coins: Int? + var buy_type: NRStoreAPI.BuyType? + + var vip_type: String? + var vip_type_key: VipTypeKey? + + var sort: String? + var nr_description: String? + var brief: String? + var title: String? + + var send_coin_ttl: Int? + + var size: SizeType? + + + + var ios_template_id: String? + ///角标 + var corner_marker: String? + ///平台 + var platform: String? + ///货币符号 + var currency: String? + + var ext_info: NRPayExtInfo? + + ///0 无优惠 1 首次购买优惠 2 二次购买优惠 + var discount_type: Int? + + @IgnoredKey + var product: SKProduct? + + ///首冲优惠数据 + var introductionaryOffer: SKProductDiscount? { + return product?.introductoryPrice + } + + ///促销优惠数据 + var promotionalOffers: [SKProductDiscount]? { + return product?.discounts + } + + + static func mappingForKey() -> [SmartKeyTransformer]? { + return [ + CodingKeys.nr_description <--- ["description"] + ] + } + + + + func getTimeString() -> String? { + switch self.vip_type_key { + case .week: + return "week".localized + + case .month: + return "month".localized + + case .quarter: + return "quarter".localized + + case .year: + return "year".localized + + default: + return nil + } + } + + func getVipTitle() -> String? { + switch self.vip_type_key { + case .week: + return "Weekly VIP".localized + + case .month: + return "Monthly VIP".localized + + case .quarter: + return "Quarterly VIP".localized + + case .year: + return "Yearly VIP".localized + + default: + return nil + } + } + +} + +class NRPayExtInfo: NSObject, SmartCodable { + + required override init() { } + + var receive_coins_rate: String? + var max_total_coins: Int? + var extra_day_coins: Int? + var sub_coins_txt_list: [String]? + +} diff --git a/ReaderHive/Class/Store/M/NRRewardCoinsModel.swift b/ReaderHive/Class/Store/M/NRRewardCoinsModel.swift new file mode 100644 index 0000000..706532f --- /dev/null +++ b/ReaderHive/Class/Store/M/NRRewardCoinsModel.swift @@ -0,0 +1,23 @@ +// +// NRRewardCoinsModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import SmartCodable + +class NRRewardCoinsModel: NSObject, SmartCodable { + + required override init() { } + + var id: String? + var left_coins: String? + var expired_time: TimeInterval? + var is_effective: Int? + var created_at: String? + var type: String? + var coins: Int? + var diff_datetime: String? +} diff --git a/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.swift b/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.swift new file mode 100644 index 0000000..6821c22 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.swift @@ -0,0 +1,41 @@ +// +// NRConsumptionRecordsCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRConsumptionRecordsCell: NRTableViewCell { + + + var model: NRBuyRecordsModel? { + didSet { + titleLabel.text = "Purchase Single Episode".localized + subtitleLabel.text = "Ch.##".localizedReplace(text: "\(model?.episode ?? "")") + " " + "\(model?.name ?? "")" + timeLabel.text = model?.created_at + coinsLabel.text = "-\(model?.coins ?? 0)" + "Coins".localized + } + } + + @IBOutlet weak var titleLabel: UILabel! + + @IBOutlet weak var subtitleLabel: UILabel! + + @IBOutlet weak var timeLabel: UILabel! + + @IBOutlet weak var coinsLabel: UILabel! + + 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 + } + +} diff --git a/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.xib b/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.xib new file mode 100644 index 0000000..9decfbb --- /dev/null +++ b/ReaderHive/Class/Store/V/NRConsumptionRecordsCell.xib @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReaderHive/Class/Store/V/NROrderRecordsCell.swift b/ReaderHive/Class/Store/V/NROrderRecordsCell.swift new file mode 100644 index 0000000..4081963 --- /dev/null +++ b/ReaderHive/Class/Store/V/NROrderRecordsCell.swift @@ -0,0 +1,68 @@ +// +// NROrderRecordsCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import SnapKit + +class NROrderRecordsCell: NRTableViewCell { + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .black + return label + }() + + lazy var timeLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = ._999999 + return label + }() + + lazy var countLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .F_9710_D + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + nr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension NROrderRecordsCell { + + private func nr_setupUI() { + contentView.addSubview(titleLabel) + contentView.addSubview(timeLabel) + contentView.addSubview(countLabel) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(28) + make.top.equalToSuperview().offset(16) + } + + timeLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-16) + } + + countLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-28) + } + } + +} diff --git a/ReaderHive/Class/Store/V/NRRewardCoinsCell.swift b/ReaderHive/Class/Store/V/NRRewardCoinsCell.swift new file mode 100644 index 0000000..ed319bb --- /dev/null +++ b/ReaderHive/Class/Store/V/NRRewardCoinsCell.swift @@ -0,0 +1,119 @@ +// +// NRRewardCoinsCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import SnapKit + +class NRRewardCoinsCell: NRTableViewCell { + + var model: NRRewardCoinsModel? { + didSet { + + timeLabel.text = model?.created_at + nameLabel.text = model?.type + countLabel.text = "+\(model?.coins ?? 0)" + remainingLabel.text = model?.left_coins + + if model?.is_effective == 1 { + expiresLabel.text = "Expires in ## days".localizedReplace(text: model?.diff_datetime ?? "") + } else { + expiresLabel.text = "Expired".localized + } + } + } + + + private lazy var timeLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = ._999999 + return label + }() + + private lazy var nameLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .black + return label + }() + + private lazy var countLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .F_9710_D + return label + }() + + private lazy var remainingLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = ._999999 + return label + }() + + private lazy var expiresIconImageView = UIImageView(image: UIImage(named: "time_icon_02")) + + private lazy var expiresLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .F_9710_D + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension NRRewardCoinsCell { + + private func nr_setupUI() { + contentView.addSubview(timeLabel) + contentView.addSubview(nameLabel) + contentView.addSubview(countLabel) + contentView.addSubview(remainingLabel) + contentView.addSubview(expiresIconImageView) + contentView.addSubview(expiresLabel) + + timeLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(28) + make.top.equalToSuperview().offset(16) + } + + nameLabel.snp.makeConstraints { make in + make.left.equalTo(timeLabel) + make.centerY.equalToSuperview() + } + + expiresIconImageView.snp.makeConstraints { make in + make.left.equalTo(timeLabel) + make.bottom.equalToSuperview().offset(-16) + } + + expiresLabel.snp.makeConstraints { make in + make.centerY.equalTo(expiresIconImageView) + make.left.equalTo(expiresIconImageView.snp.right).offset(4) + } + + countLabel.snp.makeConstraints { make in + make.centerY.equalTo(nameLabel) + make.right.equalToSuperview().offset(-28) + } + + remainingLabel.snp.makeConstraints { make in + make.centerY.equalTo(expiresIconImageView) + make.right.equalTo(countLabel) + } + } + +} diff --git a/ReaderHive/Class/Store/V/NRStoreCoinsBigCell.swift b/ReaderHive/Class/Store/V/NRStoreCoinsBigCell.swift new file mode 100644 index 0000000..02ec095 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreCoinsBigCell.swift @@ -0,0 +1,12 @@ +// +// NRStoreCoinsBigCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRStoreCoinsBigCell: NRStoreCoinsCell { + +} diff --git a/ReaderHive/Class/Store/V/NRStoreCoinsCell.swift b/ReaderHive/Class/Store/V/NRStoreCoinsCell.swift new file mode 100644 index 0000000..95f4231 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreCoinsCell.swift @@ -0,0 +1,19 @@ +// +// NRStoreCoinsCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRStoreCoinsCell: UICollectionViewCell { + + var model: NRPayItem? { + didSet { + + } + } + + var nr_isSelected: Bool = false +} diff --git a/ReaderHive/Class/Store/V/NRStoreCoinsPackCell.swift b/ReaderHive/Class/Store/V/NRStoreCoinsPackCell.swift new file mode 100644 index 0000000..e24a0c3 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreCoinsPackCell.swift @@ -0,0 +1,12 @@ +// +// NRStoreCoinsPackCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRStoreCoinsPackCell: NRStoreCoinsCell { + +} diff --git a/ReaderHive/Class/Store/V/NRStoreCoinsSmallCell.swift b/ReaderHive/Class/Store/V/NRStoreCoinsSmallCell.swift new file mode 100644 index 0000000..db8c071 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreCoinsSmallCell.swift @@ -0,0 +1,12 @@ +// +// NRStoreCoinsSmallCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRStoreCoinsSmallCell: NRStoreCoinsCell { + +} diff --git a/ReaderHive/Class/Store/V/NRStoreCoinsView.swift b/ReaderHive/Class/Store/V/NRStoreCoinsView.swift new file mode 100644 index 0000000..c9b95dd --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreCoinsView.swift @@ -0,0 +1,253 @@ +// +// NRStoreCoinsView.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRStoreCoinsView: UIView { + + var shortPlayId: String? + var videoId: String? + + var buyFinishHandle: (() -> Void)? + + var isShowTitle = false { + didSet { + updateLayout() + } + } + + private lazy var dataArr: [[NRPayItem]] = [] + + private var selectedIndexPath: IndexPath? + + private lazy var collectionViewLayout: UICollectionViewCompositionalLayout = { + let config = UICollectionViewCompositionalLayoutConfiguration() + config.interSectionSpacing = 10 + + let layout = UICollectionViewCompositionalLayout { [weak self] section, _ in + guard let self = self else { return nil} + guard let model = dataArr[section].first else { return nil } + + if model.buy_type == .subCoins { + return self.coinsBigLayoutSection() + } else if model.size == .big { + return self.bigLayoutSection() + } else { + return self.smallLayoutSection() + } + } + layout.configuration = config + + return layout + }() + + private lazy var collectionView: NRCollectionView = { + let collectionView = NRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.clipsToBounds = false + collectionView.isScrollEnabled = false + collectionView.register(NRStoreCoinsBigCell.self, forCellWithReuseIdentifier: "NRStoreCoinsBigCell") + collectionView.register(NRStoreCoinsSmallCell.self, forCellWithReuseIdentifier: "NRStoreCoinsSmallCell") + collectionView.register(NRStoreCoinsPackCell.self, forCellWithReuseIdentifier: "NRStoreCoinsPackCell") + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + return collectionView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .black + label.text = "Coins Purchase".localized + return label + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + override init(frame: CGRect) { + super.init(frame: frame) + nr_setupUI() + updateLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + updateLayout() + } + } + + func setDataArr(_ arr: [NRPayItem]) { + self.dataArr.removeAll() + var bigArr: [NRPayItem] = [] + var smallArr: [NRPayItem] = [] + var coinPackArr: [NRPayItem] = [] + + arr.forEach { + if $0.buy_type == .subCoins { + coinPackArr.append($0) + } else if $0.size == .big { + bigArr.append($0) + } else { + smallArr.append($0) + } + } + + if bigArr.count > 0 { + self.dataArr.append(bigArr) + } + if coinPackArr.count > 0 { + self.dataArr.append(coinPackArr) + } + if smallArr.count > 0 { + self.dataArr.append(smallArr) + } + self.collectionView.reloadData() + } + + private func updateLayout() { + titleLabel.isHidden = !self.isShowTitle + + let height = self.collectionView.contentSize.height + 1 + + if self.isShowTitle { + self.collectionView.snp.remakeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(12) + make.left.right.bottom.equalToSuperview() + make.height.equalTo(height) + } + } else { + self.collectionView.snp.remakeConstraints { make in + make.top.equalToSuperview().offset(8) + make.left.right.bottom.equalToSuperview() + make.height.equalTo(height) + } + } + } + +} + +extension NRStoreCoinsView { + + private func nr_setupUI() { + addSubview(titleLabel) + addSubview(collectionView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalToSuperview() + } + + + } + +} + +extension NRStoreCoinsView { + + private func bigLayoutSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(0.5), heightDimension: .fractionalHeight(1))) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(100)), subitems: [item]) + group.interItemSpacing = .fixed(1) + + let layoutSection = NSCollectionLayoutSection(group: group) + layoutSection.interGroupSpacing = 10 + layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16) + return layoutSection + } + + private func smallLayoutSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1 / 3), heightDimension: .fractionalHeight(1))) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(121)), subitems: [item]) + group.interItemSpacing = .fixed(8) + + let layoutSection = NSCollectionLayoutSection(group: group) + layoutSection.interGroupSpacing = 10 + layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16) + return layoutSection + } + + private func coinsBigLayoutSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(84)), subitems: [item]) + + + let layoutSection = NSCollectionLayoutSection(group: group) + layoutSection.interGroupSpacing = 10 + layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16) + return layoutSection + } +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension NRStoreCoinsView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let model = dataArr[indexPath.section][indexPath.row] + + var identifier = "NRStoreCoinsBigCell" + if model.buy_type == .subCoins { + identifier = "NRStoreCoinsPackCell" + } else if model.size == .small { + identifier = "NRStoreCoinsSmallCell" + } + + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! NRStoreCoinsCell + cell.model = model + cell.nr_isSelected = selectedIndexPath == indexPath + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr[section].count + } + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.section][indexPath.row] + self.selectedIndexPath = indexPath + collectionView.reloadData() + + if model.buy_type == .subCoins { +// let view = FACoinPackConfirmView() +// view.shortPlayId = self.shortPlayId +// view.videoId = self.videoId +// view.model = model +// view.buyFinishHandle = { [weak self] in +// guard let self = self else { return } +// NRLoginManager.manager.updateUserInfo() +// self.buyFinishHandle?() +// } +// view.present(in: nil) + } else { + NRIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in + guard let self = self else { return } + if finish { + Task { + await NRLoginManager.manager.updateUserInfo() + } + self.buyFinishHandle?() + } + } + } + + + } + +} diff --git a/ReaderHive/Class/Store/V/NRStoreVipCell.swift b/ReaderHive/Class/Store/V/NRStoreVipCell.swift new file mode 100644 index 0000000..64bdf1a --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreVipCell.swift @@ -0,0 +1,16 @@ +// +// NRStoreVipCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRStoreVipCell: UICollectionViewCell { + var model: NRPayItem? { + didSet { + + } + } +} diff --git a/ReaderHive/Class/Store/V/NRStoreVipView.swift b/ReaderHive/Class/Store/V/NRStoreVipView.swift new file mode 100644 index 0000000..e2a1c48 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRStoreVipView.swift @@ -0,0 +1,166 @@ +// +// NRStoreVipView.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRStoreVipView: UIView { + + var dataArr: [NRPayItem] = [] { + didSet { + collectionView.reloadData() + } + } + + var shortPlayId: String? + var videoId: String? + + var buyFinishHandle: (() -> Void)? + + var isShowTitle = false { + didSet { + updateLayout() + } + } + + private lazy var collectionViewLayout: UICollectionViewCompositionalLayout = { + + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(110)), subitems: [item]) + + let layoutSection = NSCollectionLayoutSection(group: group) + layoutSection.interGroupSpacing = 14 + layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16) + + + let config = UICollectionViewCompositionalLayoutConfiguration() + + let layout = UICollectionViewCompositionalLayout(section: layoutSection) + layout.configuration = config + + return layout + }() + + private lazy var collectionView: NRCollectionView = { + let collectionView = NRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isScrollEnabled = false + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + collectionView.register(NRStoreVipCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .black + label.text = "VIP Membership".localized + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .black.withAlphaComponent(0.25) + label.text = "Auto renew,cancel anytime".localized + return label + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + override init(frame: CGRect) { + super.init(frame: frame) + nr_setupUI() + updateLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + self.updateLayout() + } + } + + private func updateLayout() { + titleLabel.isHidden = !self.isShowTitle + subtitleLabel.isHidden = !self.isShowTitle + + let height = self.collectionView.contentSize.height + 1 + + if self.isShowTitle { + self.collectionView.snp.remakeConstraints { make in + make.top.equalTo(subtitleLabel.snp.bottom).offset(12) + make.left.right.bottom.equalToSuperview() + make.height.equalTo(height) + } + } else { + self.collectionView.snp.remakeConstraints { make in + make.top.equalToSuperview().offset(8) + make.left.right.bottom.equalToSuperview() + make.height.equalTo(height) + } + } + } +} + +extension NRStoreVipView { + + private func nr_setupUI() { + addSubview(titleLabel) + addSubview(subtitleLabel) + addSubview(collectionView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalToSuperview() + } + + subtitleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalTo(titleLabel.snp.bottom).offset(5) + } + + } + +} + + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension NRStoreVipView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! NRStoreVipCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr[indexPath.row] + + NRIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in + guard let self = self else { return } + if finish { + Task { + await NRLoginManager.manager.updateUserInfo() + } + self.buyFinishHandle?() + } + } + } + +} diff --git a/ReaderHive/Class/Store/V/NRWalletCell.swift b/ReaderHive/Class/Store/V/NRWalletCell.swift new file mode 100644 index 0000000..852e1fe --- /dev/null +++ b/ReaderHive/Class/Store/V/NRWalletCell.swift @@ -0,0 +1,49 @@ +// +// NRWalletCell.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRWalletCell: NRTableViewCell { + + var item: NRMeItem? { + didSet { + titleLabel.text = item?.title + } + } + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .black + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + nr_indicatorImageView.image = UIImage(named: "arrow_right_icon_06") + + contentView.addSubview(titleLabel) + contentView.addSubview(nr_indicatorImageView) + + titleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(16) + } + + nr_indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-16) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/ReaderHive/Class/Store/V/NRWalletHeaderView.swift b/ReaderHive/Class/Store/V/NRWalletHeaderView.swift new file mode 100644 index 0000000..ac85a66 --- /dev/null +++ b/ReaderHive/Class/Store/V/NRWalletHeaderView.swift @@ -0,0 +1,186 @@ +// +// NRWalletHeaderView.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit +import YYCategories + +class NRWalletHeaderView: UITableViewHeaderFooterView { + + var userInfo: NRUserInfo? { + didSet { + coinsView.count = userInfo?.coin_left_total + bonusCoinsView.count = userInfo?.send_coin_left_total + } + } + + private lazy var bgView: UIView = { + let view = UIView() + view.backgroundColor = .F_2_EFEE + view.layer.cornerRadius = 12 + view.layer.masksToBounds = true + return view + }() + + private lazy var storeButton: UIButton = { + let button = NRGradientButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = NRStoreViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + })) + button.colors = [UIColor.F_3912_F.cgColor, UIColor.FF_4_A_4_A.cgColor, UIColor.FA_9_B_1_F.cgColor] + button.startPoint = .init(x: 0, y: 0.5) + button.endPoint = .init(x: 1, y: 0.5) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.setTitle("Store".localized, for: .normal) + button.setTitleColor(.white, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .medium) + return button + }() + + private lazy var coinsView: CoinsView = { + let view = CoinsView() + view.title = "Coins".localized + return view + }() + + private lazy var bonusCoinsView: CoinsView = { + let view = CoinsView() + view.title = "Bonus".localized + return view + }() + + override init(reuseIdentifier: String?) { + super.init(reuseIdentifier: reuseIdentifier) + + nr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension NRWalletHeaderView { + + private func nr_setupUI() { + contentView.addSubview(bgView) + bgView.addSubview(storeButton) + bgView.addSubview(coinsView) + bgView.addSubview(bonusCoinsView) + + bgView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.right.equalToSuperview().offset(-16) + make.top.equalToSuperview().offset(24) + make.bottom.equalToSuperview().offset(-12) + make.height.equalTo(144) + } + + storeButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.right.equalToSuperview().offset(-12) + make.bottom.equalToSuperview().offset(-16) + make.height.equalTo(48) + } + + coinsView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.top.equalToSuperview().offset(24) + } + + bonusCoinsView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-12) + make.top.equalTo(coinsView) + make.width.equalTo(coinsView) + make.left.equalTo(coinsView.snp.right).offset(0) + } + } + +} + + +extension NRWalletHeaderView { + + class CoinsView: UIView { + + var title: String? { + didSet { + titleLabel.text = title + } + } + + var count: Int? { + didSet { + coinsLabel.text = "\(count ?? 0)" + } + } + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .semibold) + label.textColor = .black.withAlphaComponent(0.5) + return label + }() + + lazy var coinsBgView: UIView = { + let view = UIView() + return view + }() + + lazy var coinsImageView = UIImageView(image: UIImage(named: "coins_icon_01")) + + lazy var coinsLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .regular) + label.textColor = .F_9710_D + label.text = "0" + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(titleLabel) + addSubview(coinsBgView) + coinsBgView.addSubview(coinsImageView) + coinsBgView.addSubview(coinsLabel) + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + } + + coinsBgView.snp.makeConstraints { make in + make.bottom.equalToSuperview() + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(10) + } + + coinsImageView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.left.equalToSuperview() + } + + coinsLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(coinsImageView.snp.right).offset(4) + make.right.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + } + +} diff --git a/ReaderHive/Class/Store/VC/NRConsumptionRecordsViewController.swift b/ReaderHive/Class/Store/VC/NRConsumptionRecordsViewController.swift new file mode 100644 index 0000000..71b6c76 --- /dev/null +++ b/ReaderHive/Class/Store/VC/NRConsumptionRecordsViewController.swift @@ -0,0 +1,117 @@ +// +// NRConsumptionRecordsViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit +import LYEmptyView + +class NRConsumptionRecordsViewController: NRViewController { + + private lazy var dataArr: [NRBuyRecordsModel] = [] + private lazy var page = 1 + + private lazy var tableView: NRTableView = { + let tableView = NRTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 74 + tableView.separatorColor = .F_2_EFEE + tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + tableView.contentInset = .init(top: 16, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + tableView.register(UINib(nibName: "NRConsumptionRecordsCell", bundle: nil), forCellReuseIdentifier: "cell") + tableView.ly_emptyView = NREmpty.nr_emptyView() + tableView.nr_addRefreshHeader(insetTop: tableView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.nr_addRefreshFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "Consumption Records".localized + self.backgroundImageView.isHidden = true + configNavigationBack("arrow_left_icon_05") + + nr_setupUI() + + requestDataArr(page: 1, completer: nil) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.nr_setNavigationStyle(titleColor: UINavigationBar.titleBlackColor) + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: 1) { [weak self] in + self?.tableView.nr_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.nr_endFooterRefreshing() + } + } + +} + +extension NRConsumptionRecordsViewController { + + private func nr_setupUI() { + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + } + } + +} + + +//MARK: UITableViewDelegate UITableViewDataSource +extension NRConsumptionRecordsViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NRConsumptionRecordsCell + cell.model = dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataArr.count + } +} + +extension NRConsumptionRecordsViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + NRStoreAPI.requestBuyRecords(page: page) { [weak self] listModel in + guard let self = self else { return } + guard let listModel = listModel, let list = listModel.list else { + completer?() + return + } + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + + self.page = page + self.tableView.reloadData() + + completer?() + } + + } + +} diff --git a/ReaderHive/Class/Store/VC/NROrderRecordsPageViewController.swift b/ReaderHive/Class/Store/VC/NROrderRecordsPageViewController.swift new file mode 100644 index 0000000..7a0ff60 --- /dev/null +++ b/ReaderHive/Class/Store/VC/NROrderRecordsPageViewController.swift @@ -0,0 +1,118 @@ +// +// NROrderRecordsViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import JXSegmentedView +import SnapKit + +class NROrderRecordsPageViewController: NRViewController { + + private lazy var titles = ["Coin Record".localized, "VIP Record".localized] + private lazy var viewControllers: [NROrderRecordsViewController] = { + let vc1 = NROrderRecordsViewController() + vc1.type = .coins + let vc2 = NROrderRecordsViewController() + vc2.type = .subVip + return [vc1, vc2] + }() + + private lazy var segmentedDataSource: JXSegmentedTitleDataSource = { + let dataSource = JXSegmentedTitleDataSource() + dataSource.itemWidth = (UIScreen.width - 32 - 18) / 2 + dataSource.titles = titles + dataSource.isTitleMaskEnabled = true + dataSource.titleNormalColor = .black.withAlphaComponent(0.5) + dataSource.titleSelectedColor = .white + dataSource.titleNormalFont = .font(ofSize: 14, weight: .medium) + dataSource.titleSelectedFont = .font(ofSize: 14, weight: .medium) + dataSource.itemSpacing = 0 + return dataSource + }() + + private lazy var segmentedIndicator: JXSegmentedIndicatorBackgroundView = { + let indicator = JXSegmentedIndicatorBackgroundView() + indicator.indicatorHeight = 36 + indicator.indicatorWidthIncrement = 0 + indicator.indicatorColor = .F_9710_D + return indicator + }() + + private lazy var segmentedView: JXSegmentedView = { + let view = JXSegmentedView() + view.backgroundColor = .black.withAlphaComponent(0.05) + view.layer.cornerRadius = 24 + view.layer.masksToBounds = true + view.dataSource = segmentedDataSource + view.delegate = self + view.indicators = [segmentedIndicator] + view.listContainer = listContainerView + return view + }() + + private lazy var listContainerView: JXSegmentedListContainerView = { + let view = JXSegmentedListContainerView(dataSource: self) + return view + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "Order Records".localized + self.backgroundImageView.isHidden = true + configNavigationBack("arrow_left_icon_05") + + nr_setupUI() + } + + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.nr_setNavigationStyle(titleColor: UINavigationBar.titleBlackColor) + } + +} + +extension NROrderRecordsPageViewController { + + private func nr_setupUI() { + view.addSubview(segmentedView) + view.addSubview(listContainerView) + + segmentedView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(16 + UIScreen.navBarHeight) + make.height.equalTo(48) + } + + listContainerView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalTo(segmentedView.snp.bottom) + } + } + + +} + +//MARK: JXSegmentedViewDelegate +extension NROrderRecordsPageViewController: JXSegmentedViewDelegate { + func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) { + + } +} + +//MARK: JXSegmentedViewDelegate +extension NROrderRecordsPageViewController: JXSegmentedListContainerViewDataSource { + func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> any JXSegmentedListContainerViewListDelegate { + return viewControllers[index] + } + + func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int { + return self.titles.count + } + +} diff --git a/ReaderHive/Class/Store/VC/NROrderRecordsViewController.swift b/ReaderHive/Class/Store/VC/NROrderRecordsViewController.swift new file mode 100644 index 0000000..6d7bdd8 --- /dev/null +++ b/ReaderHive/Class/Store/VC/NROrderRecordsViewController.swift @@ -0,0 +1,108 @@ +// +// NROrderRecordsViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/11. +// + +import UIKit +import LYEmptyView +import SnapKit + +class NROrderRecordsViewController: NRViewController { + + var type: NRStoreAPI.BuyType = .coins + + private lazy var dataArr: [NROrderRecordsModel] = [] + private lazy var page = 1 + + private lazy var tableView: NRTableView = { + let tableView = NRTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 74 + tableView.separatorColor = .F_2_EFEE + tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + tableView.contentInset = .init(top: 6, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + tableView.register(NROrderRecordsCell.self, forCellReuseIdentifier: "cell") + tableView.ly_emptyView = NREmpty.nr_emptyView() + tableView.nr_addRefreshHeader(insetTop: tableView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.nr_addRefreshFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.backgroundImageView.isHidden = true + self.view.backgroundColor = .clear + + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(10) + } + + requestDataArr(page: 1, completer: nil) + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: 1) { [weak self] in + self?.tableView.nr_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.nr_endFooterRefreshing() + } + } +} + + +//MARK: UITableViewDelegate UITableViewDataSource +extension NROrderRecordsViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let model = self.dataArr[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NROrderRecordsCell + cell.titleLabel.text = model.type + cell.timeLabel.text = model.created_at + cell.countLabel.text = "+\(model.value ?? "0")" + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } + +} + +extension NROrderRecordsViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + NRStoreAPI.requestRechargeRecord(page: page, buyType: self.type) { [weak self] listModel in + guard let self = self else { return } + guard let listModel = listModel, let list = listModel.list else { + completer?() + return + } + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + + self.page = page + self.tableView.reloadData() + + completer?() + } + + } + +} + diff --git a/ReaderHive/Class/Store/VC/NRRewardCoinsViewController.swift b/ReaderHive/Class/Store/VC/NRRewardCoinsViewController.swift new file mode 100644 index 0000000..287762d --- /dev/null +++ b/ReaderHive/Class/Store/VC/NRRewardCoinsViewController.swift @@ -0,0 +1,107 @@ +// +// NRRewardCoinsViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import LYEmptyView +import SnapKit + +class NRRewardCoinsViewController: NRViewController { + + private lazy var dataArr: [NRRewardCoinsModel] = [] + private lazy var page = 1 + + private lazy var tableView: NRTableView = { + let tableView = NRTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 98 + tableView.separatorColor = .F_2_EFEE + tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + tableView.contentInset = .init(top: 16, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + tableView.register(NRRewardCoinsCell.self, forCellReuseIdentifier: "cell") + tableView.ly_emptyView = NREmpty.nr_emptyView() + tableView.nr_addRefreshHeader(insetTop: tableView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.nr_addRefreshFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "Reward Coins".localized + self.backgroundImageView.isHidden = true + configNavigationBack("arrow_left_icon_05") + + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + } + + requestDataArr(page: 1, completer: nil) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.nr_setNavigationStyle(titleColor: UINavigationBar.titleBlackColor) + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: 1) { [weak self] in + self?.tableView.nr_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.nr_endFooterRefreshing() + } + } +} + +//MARK: UITableViewDelegate UITableViewDataSource +extension NRRewardCoinsViewController: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NRRewardCoinsCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } +} + +extension NRRewardCoinsViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + NRStoreAPI.reuqestSendCoinRecord(page: page) { [weak self] listModel in + guard let self = self else { return } + guard let listModel = listModel, let list = listModel.list else { + completer?() + return + } + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + + self.page = page + self.tableView.reloadData() + + completer?() + } + + } + +} + diff --git a/ReaderHive/Class/Store/VC/NRStoreViewController.swift b/ReaderHive/Class/Store/VC/NRStoreViewController.swift new file mode 100644 index 0000000..c010706 --- /dev/null +++ b/ReaderHive/Class/Store/VC/NRStoreViewController.swift @@ -0,0 +1,82 @@ +// +// NRStoreViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRStoreViewController: NRViewController { + + + private lazy var scrollView: NRScrollView = { + let scrollView = NRScrollView() + return scrollView + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 12 + return stackView + }() + + private lazy var coinsView: NRStoreCoinsView = { + let view = NRStoreCoinsView() + view.isShowTitle = true + view.buyFinishHandle = { [weak self] in + + } + return view + }() + + private lazy var vipView: NRStoreVipView = { + let view = NRStoreVipView() + view.isShowTitle = true + view.buyFinishHandle = { [weak self] in + + } + return view + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "Store".localized + configNavigationBack("arrow_left_icon_05") + + stackView.addArrangedSubview(coinsView) + stackView.addArrangedSubview(vipView) + + nr_setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.nr_setNavigationStyle(titleColor: UINavigationBar.titleBlackColor) + } + +} + +extension NRStoreViewController { + + private func nr_setupUI() { + view.addSubview(scrollView) + scrollView.addSubview(stackView) + + scrollView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + } + + stackView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(12) + make.left.equalToSuperview() + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 10)) + } + } + +} diff --git a/ReaderHive/Class/Store/VC/NRWalletViewController.swift b/ReaderHive/Class/Store/VC/NRWalletViewController.swift new file mode 100644 index 0000000..324b499 --- /dev/null +++ b/ReaderHive/Class/Store/VC/NRWalletViewController.swift @@ -0,0 +1,114 @@ +// +// NRWalletViewController.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SnapKit + +class NRWalletViewController: NRViewController { + + private lazy var dataArr: [NRMeItem] = { + let arr = [ + NRMeItem(type: .consumptionRecords, title: "Consumption Records".localized), + NRMeItem(type: .purchaseRecords, title: "Purchase Records".localized), + NRMeItem(type: .rewardCoins, title: "Reward Coins".localized), + ] + return arr + }() + + + private lazy var tableView: NRTableView = { + let tableView = NRTableView(frame: .zero, style: .grouped) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 60 + tableView.separatorStyle = .none + tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + tableView.register(NRWalletCell.self, forCellReuseIdentifier: "cell") + tableView.register(NRWalletHeaderView.self, forHeaderFooterViewReuseIdentifier: "header") + return tableView + }() + + deinit { + NotificationCenter.default.removeObserver(self) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "My Wallet".localized + self.backgroundImageView.isHidden = true + configNavigationBack("arrow_left_icon_05") + + NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: NRLoginManager.userInfoUpdateNotification, object: nil) + + nr_setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.nr_setNavigationStyle(titleColor: UINavigationBar.titleBlackColor) + } + + @objc private func userInfoUpdateNotification() { + self.tableView.reloadData() + } +} + +extension NRWalletViewController { + + private func nr_setupUI() { + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + } + } + +} + +//MARK: UITableViewDelegate UITableViewDataSource +extension NRWalletViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NRWalletCell + cell.item = dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataArr.count + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") as! NRWalletHeaderView + view.userInfo = NRLoginManager.manager.userInfo + return view + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let item = self.dataArr[indexPath.row] + + switch item.type { + case .consumptionRecords: + let vc = NRConsumptionRecordsViewController() + self.navigationController?.pushViewController(vc, animated: true) + + case .rewardCoins: + let vc = NRRewardCoinsViewController() + self.navigationController?.pushViewController(vc, animated: true) + + case .purchaseRecords: + let vc = NROrderRecordsPageViewController() + self.navigationController?.pushViewController(vc, animated: true) + + default: + break + } + + } +} diff --git a/ReaderHive/Delegate/AppDelegate.swift b/ReaderHive/Delegate/AppDelegate.swift index 65bd1d9..08714c9 100644 --- a/ReaderHive/Delegate/AppDelegate.swift +++ b/ReaderHive/Delegate/AppDelegate.swift @@ -23,6 +23,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { Task { await NRLoginManager.manager.updateUserInfo() } + NRIapManager.manager.preloadingProducts() return true } @@ -43,9 +44,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { @objc private func networkStatusDidChangeNotification() { + guard NRNetworkReachableManager.manager.isReachable == true else { + return + } + Task { await NRLoginManager.manager.updateUserInfo() } + NRIapManager.manager.preloadingProducts() } } diff --git a/ReaderHive/Libs/IAP/NRIAPOrderModel.swift b/ReaderHive/Libs/IAP/NRIAPOrderModel.swift new file mode 100644 index 0000000..0af2aff --- /dev/null +++ b/ReaderHive/Libs/IAP/NRIAPOrderModel.swift @@ -0,0 +1,41 @@ +// +// NRIAPOrderModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SmartCodable + +class NRIAPOrderModel: NSObject, SmartCodable { + + required override init() { } + + var code: Int? + var message: String? + var money: String? + var order_code: String? + var is_backhaul: String? + var discount: NRIAPOrderDiscountModel? +} + +class NRIAPOrderDiscountModel: NSObject, SmartCodable { + + required override init() { } + + var is_discount: Bool? + var discount_code: String? + var sign_data: NRIAPOrderDiscountSign? +} + +class NRIAPOrderDiscountSign: NSObject, SmartCodable { + + required override init() { } + + var keyIdentifier: String? + var nonce: String? + var timestamp: TimeInterval? + var signature: String? + var applicationUsername: String? +} diff --git a/ReaderHive/Libs/IAP/NRIAPVerifyModel.swift b/ReaderHive/Libs/IAP/NRIAPVerifyModel.swift new file mode 100644 index 0000000..342408a --- /dev/null +++ b/ReaderHive/Libs/IAP/NRIAPVerifyModel.swift @@ -0,0 +1,19 @@ +// +// NRIAPVerifyModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import SmartCodable + +class NRIAPVerifyModel: NSObject, SmartCodable { + + required override init() { } + + var code: String? + var is_backhaul: String? + var money: String? + var status: String? +} diff --git a/ReaderHive/Libs/IAP/NRIapManager.swift b/ReaderHive/Libs/IAP/NRIapManager.swift new file mode 100644 index 0000000..b573220 --- /dev/null +++ b/ReaderHive/Libs/IAP/NRIapManager.swift @@ -0,0 +1,293 @@ +// +// NRIapManager.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import StoreKit + +class NRIapManager { + typealias CompletionHandler = ((_ finish: Bool) -> Void) + ///内购模版前缀 + static let IAPPrefix = "readerhive" + + + static let manager = NRIapManager() + + ///成功回调 + private var completionHandler: CompletionHandler? + + private var shortPlayId: String? + private var videoId: String? + + private lazy var iapManager: JXIAPManager = { + let manager = JXIAPManager() + manager.delegate = self + return manager + }() + + private var orderCode: String? + private var payId: String? + + ///预加载数据 + private var payRequest: NRPayDataRequest? + var payDateModel: NRPayDateModel? + + + ///恢复购买使用 + ///等待恢复的数据 + private var waitRestoreModel: NRWaitRestoreModel? = UserDefaults.nr_object(forKey: kNRWaitRestoreIAPDefaultsKey, as: NRWaitRestoreModel.self) + + + ///开始内购 + func start(model: NRPayItem, shortPlayId: String? = nil, videoId: String? = nil, hudShowView: UIView? = nil, handler: CompletionHandler? = nil) { + + if let _ = self.waitRestoreModel { + NRToast.show(text: "pay_error_2".localized) + handler?(false) + return + } + + guard let payId = model.id else { + handler?(false) + return + } + self.shortPlayId = shortPlayId + self.videoId = videoId + self.completionHandler = handler + self.waitRestoreModel = NRWaitRestoreModel() + self.waitRestoreModel?.buyType = model.buy_type + let productId = getProductId(templateId: model.ios_template_id) ?? "" + var isDiscount = false + var identifierDiscount: String? = nil + if model.discount_type == 1, let _ = model.introductionaryOffer { + isDiscount = true + } else if model.discount_type == 2, let discount = model.promotionalOffers?.first { + isDiscount = true + identifierDiscount = discount.identifier + } + + NRHud.show(containerView: hudShowView) + + NRStoreAPI.requestCreateOrder(payId: payId, shortPlayId: shortPlayId ?? "0", videoId: videoId ?? "0", isDiscount: isDiscount, identifierDiscount: identifierDiscount) { orderModel in + guard let orderModel = orderModel else { + NRHud.dismiss() + self.waitRestoreModel = nil + self.completionHandler?(false) + self.clean() + return + } + self.orderCode = orderModel.order_code + self.payId = payId + self.waitRestoreModel?.payId = payId + self.waitRestoreModel?.orderCode = orderModel.order_code + + var discount: SKPaymentDiscount? = nil + + if let identifierDiscount = identifierDiscount, + let signData = orderModel.discount?.sign_data, + let keyIdentifier = signData.keyIdentifier, + let nonce = UUID(uuidString: signData.nonce ?? ""), + let signature = signData.signature, + let timestamp = signData.timestamp + { + discount = SKPaymentDiscount(identifier: identifierDiscount, + keyIdentifier: keyIdentifier, + nonce: nonce, + signature: signature, + timestamp: NSNumber(value: timestamp)) + } + + self.iapManager.start(productId: productId, orderId: self.orderCode ?? "", applicationUsername: orderModel.discount?.sign_data?.applicationUsername, discount: discount) + + } + + } + + func restore(isLoding: Bool = true, shortPlayId: String? = nil, videoId: String? = nil, completer: ((_ isFinish: Bool, _ buyType: NRStoreAPI.BuyType?) -> Void)?) { + let buyType = self.waitRestoreModel?.buyType + + guard let waitRestoreModel = self.waitRestoreModel, + let orderCode = waitRestoreModel.orderCode, + let payId = waitRestoreModel.payId, + let receipt = waitRestoreModel.receipt, + let transactionId = waitRestoreModel.transactionId + else { + if isLoding { + NRToast.show(text: "pay_error_3".localized) + } + completer?(false, buyType) + return + } + + if isLoding { + NRHud.show() + } + + let verifyData = self.getVerifyOrderParameters(orderCode: orderCode, payId: payId, transactionId: transactionId, purchaseToken: receipt) + + let statParamenters: [String : Any] = [ + "type" : isLoding ? "manual" : "auto", + "pay_data" : verifyData.toJsonString() ?? "" + ] +// NRStatAPI.requestEventStat(orderCode: orderCode, shortPlayId: shortPlayId, videoId: videoId, eventKey: .payRestore, errorMsg: "restore", otherParamenters: statParamenters) + + NRStoreAPI.requestVerifyOrder(parameters: verifyData) { response in + if isLoding { + NRHud.dismiss() + } + + guard let model = response.data else { + completer?(false, buyType) + return + } + self.waitRestoreModel = nil + UserDefaults.nr_setObject(nil, forKey: kNRWaitRestoreIAPDefaultsKey) + + if model.status == "success" { + if buyType == .subVip { + NRLoginManager.manager.userInfo?.is_vip = true + } + + if isLoding { + NRToast.show(text: "Success".localized) + } + completer?(true, buyType) + if buyType == .subVip { + NotificationCenter.default.post(name: NRIapManager.buyVipFinishNotification, object: nil) + } + } else { + completer?(false, buyType) + } + } + + } + + + func getProductId(templateId: String?) -> String? { + guard let templateId = templateId else { return nil } + return NRIapManager.IAPPrefix + "." + templateId + } + + func clean() { + self.orderCode = nil + self.payId = nil + self.shortPlayId = nil + self.videoId = nil + self.completionHandler = nil + } +} + +//MARK: JXIAPManagerDelegate +extension NRIapManager: JXIAPManagerDelegate { + + func jx_iapPaySuccess(productId: String, receipt: String, transactionIdentifier: String) { + guard let orderCode = self.orderCode, let payId = self.payId else { + self.waitRestoreModel = nil + self.completionHandler?(false) + self.clean() + NRHud.dismiss() + return + } + + self.waitRestoreModel?.productId = productId + self.waitRestoreModel?.receipt = receipt + self.waitRestoreModel?.transactionId = transactionIdentifier + + UserDefaults.nr_setObject(self.waitRestoreModel, forKey: kNRWaitRestoreIAPDefaultsKey) + + #if DEBUG + let verifyData = self.getVerifyOrderParameters(orderCode: orderCode, payId: payId, transactionId: transactionIdentifier, purchaseToken: receipt) + #else + let verifyData = self.getVerifyOrderParameters(orderCode: orderCode, payId: payId, transactionId: transactionIdentifier, purchaseToken: receipt) + #endif + + NRStoreAPI.requestVerifyOrder(parameters: verifyData) { response in + NRHud.dismiss() + + guard let model = response.data else { +// FAStatAPI.requestEventStat(orderCode: self.orderCode, shortPlayId: self.shortPlayId, videoId: self.videoId, eventKey: .payCallback, errorMsg: verifyData.toJsonString()) + self.completionHandler?(false) + self.clean() + return + } + + let buyType = self.waitRestoreModel?.buyType + self.waitRestoreModel = nil + UserDefaults.nr_setObject(nil, forKey: kNRWaitRestoreIAPDefaultsKey) + + if model.status == "success" { + if buyType == .subVip { + NRLoginManager.manager.userInfo?.is_vip = true + } + + NRToast.show(text: "Success".localized) + self.completionHandler?(true) + if buyType == .subVip { + NotificationCenter.default.post(name: NRIapManager.buyVipFinishNotification, object: nil) + } + } else { + NRToast.show(text: "pay_error_4".localized) +// FAStatAPI.requestEventStat(orderCode: self.orderCode, shortPlayId: self.shortPlayId, videoId: self.videoId, eventKey: .payCallback, errorMsg: verifyData.toJsonString()) + self.completionHandler?(false) + } + self.clean() + } + + } + + func jx_iapPayFailed(productId: String, code: JXIAPManagerCode, msg: String?) { + NRHud.dismiss() + + if code == .noProduct { + NRToast.show(text: "pay_error_5".localized) + } else if code == .cancelled { + NRToast.show(text: "pay_error_6".localized) + } + +// if code == .cancelled { +// FAStatAPI.requestEventStat(orderCode: self.orderCode, shortPlayId: self.shortPlayId, videoId: self.videoId, eventKey: .payCancel, errorMsg: "user cancel") +// } else { +// FAStatAPI.requestEventStat(orderCode: self.orderCode, shortPlayId: self.shortPlayId, videoId: self.videoId, eventKey: .payError, errorMsg: msg) +// } + + self.completionHandler?(false) + + self.waitRestoreModel = nil + self.clean() + } +} + +extension NRIapManager { + + func getVerifyOrderParameters(orderCode: String, payId: String, transactionId: String, purchaseToken: String) -> [String : Any] { + let parameters: [String : Any] = [ + "order_code" : orderCode, + "pay_setting_id" : payId, + "pkg_name" : kNRAPPBundleIdentifier, + "transaction_id": transactionId, + "purchases_token" : purchaseToken + ] + return parameters + } + + ///预加载支付项 + func preloadingProducts() { + JXIAPManager.manager.fetchReceipt { _ in + self.payRequest = NRPayDataRequest() + self.payRequest?.requestProducts(isLoding: false, isToast: false) { model in + + } + } + } + +} + +extension NRIapManager { + ///成功购买会员 + @objc static let buyVipFinishNotification = Notification.Name(rawValue: "NRIapManager.buyVipFinishNotification") + +} + diff --git a/ReaderHive/Libs/IAP/NRPayDataRequest.swift b/ReaderHive/Libs/IAP/NRPayDataRequest.swift new file mode 100644 index 0000000..d8cf123 --- /dev/null +++ b/ReaderHive/Libs/IAP/NRPayDataRequest.swift @@ -0,0 +1,179 @@ +// +// NRPayDataRequest.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import StoreKit + +class NRPayDataRequest: NSObject { + + private var oldTemplateModel: NRPayDateModel? + private(set) var newTemplateModel: NRPayDateModel? + +// private var payAlertModel: NRPayAlertModel? + + private var completerBlock: ((_ model: NRPayDateModel?) -> Void)? +// private var payAlertBlock: ((_ model: FAPayAlertModel?) -> Void)? + + private var isLoding = false + private var isToast = false + + + func requestProducts(isLoding: Bool = false, isToast: Bool = true, completer: @escaping ((_ model: NRPayDateModel?) -> Void)) { +// self.payAlertBlock = nil + self.completerBlock = completer + self.isLoding = isLoding + self.isToast = isToast + + if isLoding { NRHud.show() } + + NRStoreAPI.requestPayTemplate(isToast: isToast) { [weak self] model in + guard let self = self else { return } + guard let model = model else { + if isLoding { NRHud.dismiss() } + self.completerBlock?(nil) + return + } + + self.oldTemplateModel = model + + var productIdArr: [String] = [] + model.list_sub_vip?.forEach { item in + productIdArr.append(NRIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "") + } + model.list_coins?.forEach { item in + productIdArr.append(NRIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "") + } + + let set = Set(productIdArr) + let productsRequest = SKProductsRequest(productIdentifiers: set) + productsRequest.delegate = self + productsRequest.start() + + } + } + +// func requestCoinAlertData(completer: @escaping ((_ model: FAPayAlertModel?) -> Void)) { +// self.completerBlock = nil +// self.payAlertBlock = completer + +// BRStoreAPI.requestCoinAlertInfo { [weak self] model in +// guard let self = self else { return } +// +// guard let model = model else { +// self.payAlertBlock?(nil) +// return +// } +// self.payAlertModel = model +// +// let productId = BRIAP.manager.getProductId(templateId: model.info?.ios_template_id) ?? "" +// +// let set = Set([productId]) +// let productsRequest = SKProductsRequest(productIdentifiers: set) +// productsRequest.delegate = self +// productsRequest.start() +// } + +// } + + ///挽留信息 +// func requestVipRetainPayInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) { +// self.completerBlock = nil +// self.payAlertBlock = completer +// +// FAStoreAPI.requestVipRetainPayInfo { [weak self] model in +// guard let self = self else { return } +// guard let model = model else { +// self.payAlertBlock?(nil) +// return +// } +// self.payAlertModel = model +// +// let productId = FAIapManager.manager.getProductId(templateId: model.info?.ios_template_id) ?? "" +// +// let set = Set([productId]) +// let productsRequest = SKProductsRequest(productIdentifiers: set) +// productsRequest.delegate = self +// productsRequest.start() +// } +// } +} + +//MARK: SKProductsRequestDelegate +extension NRPayDataRequest: SKProductsRequestDelegate { + + func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { + if isLoding { + NRHud.dismiss() + } + let products = response.products + + if let block = self.completerBlock { + guard let templateModel = self.oldTemplateModel else { return } + + var newCoinList: [NRPayItem] = [] + var newVipList: [NRPayItem] = [] + + templateModel.list_coins?.forEach { item in + let productId = NRIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "" + for product in products { + if productId == product.productIdentifier { + item.price = product.price.stringValue + item.currency = product.priceLocale.currencySymbol + item.product = product + newCoinList.append(item) + break + } + } + } + + templateModel.list_sub_vip?.forEach { item in + let productId = NRIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "" + for product in products { + if productId == product.productIdentifier { + item.price = product.price.stringValue + item.currency = product.priceLocale.currencySymbol + item.product = product + newVipList.append(item) + break + } + } + } + + + + templateModel.list_coins = newCoinList + templateModel.list_sub_vip = newVipList + + self.newTemplateModel = templateModel + NRIapManager.manager.payDateModel = templateModel + + DispatchQueue.main.async { + block(templateModel) + } + + } +// else if let block = self.payAlertBlock { +// guard let coinalertModel = self.payAlertModel else { return } +// let productId = FAIapManager.manager.getProductId(templateId: coinalertModel.info?.ios_template_id) ?? "" +// +// for product in products { +// if productId == product.productIdentifier { +// coinalertModel.info?.price = product.price.stringValue +// coinalertModel.info?.currency = product.priceLocale.currencySymbol +// coinalertModel.info?.product = product +// break +// } +// } +// +// DispatchQueue.main.async { +// block(coinalertModel) +// } +// } + + } +} + diff --git a/ReaderHive/Libs/IAP/NRWaitRestoreModel.swift b/ReaderHive/Libs/IAP/NRWaitRestoreModel.swift new file mode 100644 index 0000000..3dc9612 --- /dev/null +++ b/ReaderHive/Libs/IAP/NRWaitRestoreModel.swift @@ -0,0 +1,48 @@ +// +// NRWaitRestoreModel.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit + +class NRWaitRestoreModel: NSObject, NSSecureCoding{ + + var orderCode: String? + var buyType: NRStoreAPI.BuyType? + var payId: String? + var productId: String? + var transactionId: String? + var receipt: String? + + + required override init() { } + + static var supportsSecureCoding: Bool { + get { + return true + } + } + + func encode(with coder: NSCoder) { + coder.encode(orderCode, forKey: "orderCode") + coder.encode(payId, forKey: "payId") + coder.encode(productId, forKey: "productId") + coder.encode(receipt, forKey: "receipt") + coder.encode(buyType?.rawValue, forKey: "buyType") + coder.encode(transactionId, forKey: "transactionId") + } + + required init?(coder: NSCoder) { + super.init() + orderCode = coder.decodeObject(of: NSString.self, forKey: "orderCode") as? String + payId = coder.decodeObject(of: NSString.self, forKey: "payId") as? String + productId = coder.decodeObject(of: NSString.self, forKey: "productId") as? String + receipt = coder.decodeObject(of: NSString.self, forKey: "receipt") as? String + transactionId = coder.decodeObject(of: NSString.self, forKey: "transactionId") as? String + if let type = coder.decodeObject(of: NSString.self, forKey: "buyType") as? String { + buyType = NRStoreAPI.BuyType(rawValue: type) + } + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/Contents.json new file mode 100644 index 0000000..397060f --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "arrow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "arrow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/arrow@2x.png b/ReaderHive/Source/Assets.xcassets/Image/arrow_right_icon_07.imageset/arrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb473555cce22c46579e07afd37de6b6ed110b38 GIT binary patch literal 233 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 bALRJ|)p*_CB-%(j00000NkvXXu0mjfTo?Z@ literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/gift_icon_01.imageset/Gift@3x.png b/ReaderHive/Source/Assets.xcassets/Image/gift_icon_01.imageset/Gift@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b4093671fe9bbca82f15e69f45c8a047695e7e5b GIT binary patch literal 23030 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 literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@2x.png b/ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd2391aacdb79a3a65dbb3ad91e2089ba564c45 GIT binary patch literal 58949 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 literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@3x.png b/ReaderHive/Source/Assets.xcassets/Image/me_pack_bg_image.imageset/Banner-DailyReward@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9329048e1c091c7277e3ea438a05d083b1b116ca GIT binary patch literal 134870 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ⅅbZ;tgL> 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 literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/Contents.json new file mode 100644 index 0000000..6efec3a --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "time icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "time icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@2x.png b/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20cb186dd92ca89411fe079de9b0bcefaad64fe6 GIT binary patch literal 790 zcmV+x1L^#UP)OYg4h)VR}goQP=O^U|Azk<%N1Z(V5b7(3PJ}_2hqXgV8FYRnbksw z06}8kuhnWbcV2r(2nFDIZsv@cOLqh6hWgFpA)sEP2y~;_fo7+?gT*uFMy`hvTf>GJ5Zx01bgD& zC;JzVckn`JQ)uVudO|iNLjI7^;|;tLnDN1xWPVQ)%Ar13vORb$1l)H-0Cg?$#^U8M z-S7<>oA{+8$Vi`e(xQ(_(t5r_q|eQ*YmRjUuse4^Qsh4pHYoDSbqF1M61_L~MI;_6 z5pa@G*~1NoK`&08L|ZX`PU_jnB7r_FRvflKj%0N$oCpe$$T==bfDQP#{Iyuz<~F?N zdA%BcuAP82x6YnQiY_Km<=$(5B06)F|L9*Zj;cRYS#?J2bsn3piwp;Pz13)aO6C&& z6O*&*Otw=UK)UA$G_TCoZLsK4c5r*RG@n(vGFrpThMiBhzXr}IJZQNl{1b^>AT%vMJT@Ym+d*@yp`RyGIakH?qUfW-1m%M2&p-)w;-aqm4T5A; U#GBP7`v3p{07*qoM6N<$g6A1q^#A|> literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@3x.png b/ReaderHive/Source/Assets.xcassets/Image/time_icon_02.imageset/time icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6301807a60baa82d935ef069f8924f346ea2b0 GIT binary patch literal 1063 zcmV+?1laqDP)`+Xb3uSy|FTf3TT%IeSYKeYj^fJLcoxaLIn7sjT3ASq7WJY z>kfQA+c|OwJ`;cs4ZsTo{NMM^*U`6{$>ndVP3GvamFUnjJ z(MiGQh-U_5@PQOXU?`NA3eW|GU7o!Q6z`1sMxnXS8439ppKc9CchCY$h!v8`5Rzk>p!sP} zlwH{*=Tq5^jL+ReB<+^@$8^{A&<+ZY$j41mJ=?ajCyCG4WDIb0^hdoiG7^1Y^eqt# z$7k=amW`905L;q%{!UzCx@HPx8@3%-c4oUjI)VzQI2X<5(1)t=Vlz$!b5gwK^Tj)V zfe;(EnTDF2V|XKo3o!jKSzF^ULnz*M+iwW2n`YQ1h+Tl_)OzJjVh%Gxl7X#{VP{Y; ztF8ixSo`Q;#zBeqXFQ*G2i61*gq!4gZ>;O`h z53okWzJ%$qiGol_=p_RXA7RaqdYC+O{ZnM8bEDQzNQ!d`SE4Mb$Y$fUvS5~5$F7v0 zCQ~+y6GD#AY9KDW$s?BnF3e3y*$_g>t~drgXowD|ffUKMq>Q8OaS{6vCWMR#tcH+C zi7R$nQiPV~!cd_d>O?-YKpCm(*{m+pIlmQ$T4IFB?YBMuWuzu2ZntzIrB#BD>yG~^ zTLrokr&(7~K`PXikLEEg>S>f~&fH3>x?SYZ=r6DWgjA>hXU`DzI^^t?sRmo}#QKZJ z#$m6?R&n5u&vy=CMQjiL29-+FPRcV5iKZT(zW-$n2<6w+=`7lyppgi-`lFBXkR(P! z##V^l3+h{VBZ%0~3&QzxLP)llqaveESj7$DKSONV`b*ZdCC@?|6el#RK@?{beZ8ur zo!aK^Bzrfo;2N1)CLc7Zi~tt{3ibV5^R|HmiS&DUGSVpK{d8$7UC_P8M(SJ`2;!!b zbDE@){Edm^Df!{GT4~$h7+ELY=7BhgZRuAZCo|F zY_L&sVbBzOM06~{Q#Ppng%uNXu;qmnC%wAOLv2DSG1ueV?sIo=AbNZzfs-peHW?vO hU<^J&%;k5t&002ovPDHLkV1gdS<~#rZ literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/en.lproj/Localizable.strings b/ReaderHive/Source/en.lproj/Localizable.strings index 411e747..5816cab 100644 --- a/ReaderHive/Source/en.lproj/Localizable.strings +++ b/ReaderHive/Source/en.lproj/Localizable.strings @@ -83,8 +83,36 @@ "Top Up" = "Top Up"; "Language" = "Language"; "Loading" = "Loading"; +"Store" = "Store"; +"Coins Purchase" = "Coins Purchase"; +"VIP Membership" = "VIP Membership"; +"Auto renew,cancel anytime" = "Auto renew,cancel anytime"; +"Feedback" = "Feedback"; +"Feedback History" = "Feedback History"; +"Feedback Details" = "Feedback Details"; +"Account Deletion" = "Account Deletion"; +"me_coins_pack_title" = "Daily reward ready!"; +"me_coins_pack_subtitle" = "Claim your rewards now."; +"Weekly VIP" = "Weekly VIP"; +"My Wallet" = "My Wallet"; +"Consumption Records" = "Consumption Records"; +"Purchase Records" = "Purchase Records"; +"Reward Coins" = "Reward Coins"; +"Purchase Single Episode" = "Purchase Single Episode"; +"Expired" = "Expired"; +"Expires in ## days" = "Expires in ## days"; +"Order Records" = "Order Records"; +"Coin Record" = "Coin Record"; +"VIP Record" = "VIP Record"; +"pay_error_1" = "You are already a member!"; +"pay_error_2" = "You have unfinished in-app purchases, please restore them first."; +"pay_error_3" = "There are no recoverable in-app purchases."; +"pay_error_4" = "Purchase Failed"; +"pay_error_5" = "Invalid in-app purchase"; +"pay_error_6" = "Payment has been cancelled"; "network_error_1" = "Your account is already logged in on another device~"; "network_error_2" = "The service is abnormal. Check the network."; + diff --git a/ReaderHive/Thirdparty/JXIAPManager/JXIAPManager.swift b/ReaderHive/Thirdparty/JXIAPManager/JXIAPManager.swift new file mode 100644 index 0000000..0f593ee --- /dev/null +++ b/ReaderHive/Thirdparty/JXIAPManager/JXIAPManager.swift @@ -0,0 +1,223 @@ +// +// JXIAPManager.swift +// ReaderHive +// +// Created by 长沙鸿瑶 on 2025/12/10. +// + +import UIKit +import StoreKit + +@objc protocol JXIAPManagerDelegate { + /// 购买成功 + @objc optional func jx_iapPaySuccess(productId: String, receipt: String, transactionIdentifier: String) + /// 购买失败 + @objc optional func jx_iapPayFailed(productId: String, code: JXIAPManagerCode, msg: String?) + /// 恢复商品(仅限永久有效商品) + @objc optional func iapPayRestore(productIds: [String], transactionIds: [String]) +// /// 加载 +// @objc optional func iapPayShowHud() +// /// 系统错误 +// @objc optional func iapSysWrong() +// /// 验证成功 +// @objc optional func verifySuccess() +// /// 验证失败 +// @objc optional func verifyFailed() +} + +@objc enum JXIAPManagerCode: Int { + ///未知错误 + case unknown + ///取消交易 + case cancelled + ///没有商品 + case noProduct +} + +class JXIAPManager: NSObject { + + + static let manager: JXIAPManager = JXIAPManager() + + weak var delegate: JXIAPManagerDelegate? + + private var payment: SKPayment? + + private var product: SKProduct? + private var productId: String? + + private var discount: SKPaymentDiscount? + private var orderId: String? + private var applicationUsername: String? + + private var receiptCompletion: ((URL?) -> Void)? + + override init() { + super.init() + SKPaymentQueue.default().add(self) + } + + + func start(productId: String, orderId: String, applicationUsername: String?, discount: SKPaymentDiscount? = nil) { + self.product = nil + self.productId = productId + self.orderId = orderId + self.discount = discount + self.applicationUsername = applicationUsername + + let set = Set([productId]) + let productsRequest = SKProductsRequest(productIdentifiers: set) + productsRequest.delegate = self + productsRequest.start() + } + + /// 购买商品 + private func buyProduct() { + guard let product = self.product else { return } + + // 要购买商品,开个小票 + let payment = SKMutablePayment(product: product) + payment.applicationUsername = self.applicationUsername + if let discount = self.discount { + payment.paymentDiscount = discount + self.discount = nil + } + + self.payment = payment + + // 去收银台排队,准备购买 + SKPaymentQueue.default().add(payment) + } + +} + +//MARK: -------------- SKProductsRequestDelegate -------------- +extension JXIAPManager: SKProductsRequestDelegate { + func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { + guard let product = response.products.first else { + DispatchQueue.main.async { + if let productId = self.productId { + self.productId = nil + self.delegate?.jx_iapPayFailed?(productId: productId, code: .noProduct, msg: nil) + } + } + return + } + self.product = product + + self.buyProduct() + + } +} + +//MARK: -------------- SKPaymentTransactionObserver -------------- +extension JXIAPManager: SKPaymentTransactionObserver { + ///购买回调 + func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { + + for transaction in transactions { + switch transaction.transactionState { + case .purchased: + DispatchQueue.main.async { + self.completeTransaction(transaction: transaction) + } + SKPaymentQueue.default().finishTransaction(transaction) + + case .failed: + DispatchQueue.main.async { + self.failedTransaction(transaction: transaction) + } + SKPaymentQueue.default().finishTransaction(transaction) +// case .restored: +// self.restoreTransaction(transaction: transaction) + + case .purchasing: + break + default: + SKPaymentQueue.default().finishTransaction(transaction) + break + } + + + } + } + +// func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool { +// return true +// } + + /// 恢复购买回调 + func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { + + } + +} + +extension JXIAPManager { + + + private func completeTransaction(transaction: SKPaymentTransaction) { + guard let encodeStr = getAppStoreReceipt() else { return } + guard let transactionIdentifier = transaction.transactionIdentifier else { return } + + guard let productId = self.productId, productId == transaction.payment.productIdentifier else { return } + self.productId = nil + self.delegate?.jx_iapPaySuccess?(productId: productId, receipt: encodeStr, transactionIdentifier: transactionIdentifier) + + } + + private func failedTransaction(transaction: SKPaymentTransaction) { + let error = transaction.error as? SKError + guard let productId = self.productId else { return } + self.productId = nil + + switch error?.code { + case SKError.paymentCancelled: + self.delegate?.jx_iapPayFailed?(productId: productId, code: .cancelled, msg: error?.localizedDescription) + default: + self.delegate?.jx_iapPayFailed?(productId: productId, code: .unknown, msg: error?.localizedDescription) + } + + } + + + +} + +extension JXIAPManager: SKRequestDelegate { + + func getAppStoreReceipt() -> String? { + guard let receiptURL = Bundle.main.appStoreReceiptURL else { return nil } + let receiptData = NSData(contentsOf: receiptURL) + return receiptData?.base64EncodedString(options: .endLineWithLineFeed) + } + + ///获取凭证 + func fetchReceipt(completion: @escaping (URL?) -> Void) { + let receiptURL = Bundle.main.appStoreReceiptURL + if let url = receiptURL, FileManager.default.fileExists(atPath: url.path) { + completion(url) + return + } + + let request = SKReceiptRefreshRequest() + request.delegate = self + request.start() + // 在 delegate 回调里处理 + self.receiptCompletion = completion + } + + func requestDidFinish(_ request: SKRequest) { + let receiptURL = Bundle.main.appStoreReceiptURL + if let url = receiptURL, FileManager.default.fileExists(atPath: url.path) { + receiptCompletion?(url) + } else { + receiptCompletion?(nil) + } + } + + func request(_ request: SKRequest, didFailWithError error: Error) { + print("Receipt request failed: \(error)") + receiptCompletion?(nil) + } +}