From 40d2260102e2147c6182246e89d74f1be14ad02f Mon Sep 17 00:00:00 2001 From: zeng Date: Thu, 19 Mar 2026 10:34:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XSeri.xcodeproj/project.pbxproj | 84 ++++++- .../Base/Controller/XSTabBarController.swift | 19 ++ XSeri/Base/Extension/String+XS.swift | 9 + XSeri/Base/Networking/API/XSSettingAPI.swift | 10 + XSeri/Base/Networking/API/XSStoreAPI.swift | 15 ++ XSeri/Base/View/XSScrollView.swift | 13 ++ .../Controller/XSHomeViewController.swift | 16 ++ .../Home/View/XSHomeCoinsPackButton.swift | 51 +++++ .../Controller/XSMineViewController.swift | 5 + XSeri/Class/Mine/Model/XSMineItem.swift | 1 + .../Mine/Model/XSVersionUpdateModel.swift | 36 +++ XSeri/Class/Mine/View/XSLoginView.swift | 175 ++++++++++++++ .../Class/Mine/View/XSMineCoinsPackView.swift | 8 + .../Class/Mine/View/XSMineUserInfoView.swift | 25 ++ .../FACoinsRecordViewController.swift | 29 --- .../FAVipRecordViewController.swift | 29 --- .../XSCoinsOrderRecordViewController.swift | 108 +++++++++ .../XSCoinsPackViewController.swift | 25 ++ .../XSOrderRecordsViewController.swift | 97 ++++++-- .../Controller/XSStoreViewController.swift | 85 +++++++ .../XSVipOrderRecordViewController.swift | 107 +++++++++ .../Controller/XSWalletViewController.swift | 4 + .../Store/Model/XSOrderRecordModel.swift | 16 ++ .../Store/View/XSCoinsOrderRecordCell.swift | 80 +++++++ .../XSSegmentedGradientIndicatorView.swift | 57 +++++ XSeri/Class/Store/View/XSStoreCell.swift | 15 ++ .../Store/View/XSStoreCoinsBigCell.swift | 29 +++ .../Store/View/XSStoreCoinsSmallCell.swift | 12 + .../Store/View/XSStoreCoinsSpreadCell.swift | 12 + XSeri/Class/Store/View/XSStoreCoinsView.swift | 214 +++++++++++++++--- XSeri/Class/Store/View/XSStoreVipCell.swift | 12 + XSeri/Class/Store/View/XSStoreVipView.swift | 133 ++++++++++- .../Store/View/XSVipOrderRecordCell.swift | 71 ++++++ XSeri/Libs/Alert/XSAlert.swift | 159 +++++++++++++ XSeri/Libs/Alert/XSBaseAlert.swift | 143 ++++++++++++ XSeri/Libs/DeviceId/XSDeviceId.swift | 16 +- .../Color/#00181A.colorset/Contents.json | 20 ++ .../Color/#0866FF.colorset/Contents.json | 20 ++ .../Color/#0C0701.colorset/Contents.json | 20 ++ .../Color/#16110E.colorset/Contents.json | 20 ++ .../Color/#333333.colorset/Contents.json | 20 ++ .../Color/#574537.colorset/Contents.json | 20 ++ .../Contents.json | 22 ++ .../Rectangle 346272052@2x.png | Bin 0 -> 5971 bytes .../Rectangle 346272052@3x.png | Bin 0 -> 12751 bytes .../icon/apple_icon_01.imageset/Contents.json | 22 ++ .../icon/apple_icon_01.imageset/Vector@2x.png | Bin 0 -> 722 bytes .../icon/apple_icon_01.imageset/Vector@3x.png | Bin 0 -> 1020 bytes .../button_bg_image_02.imageset/Contents.json | 22 ++ .../button_bg_image_02.imageset/按钮@2x.png | Bin 0 -> 5667 bytes .../button_bg_image_02.imageset/按钮@3x.png | Bin 0 -> 11361 bytes .../calendar_icon_01.imageset/Contents.json | 22 ++ .../签到板+飞舞的金币@2x.png | Bin 0 -> 27828 bytes .../签到板+飞舞的金币@3x.png | Bin 0 -> 54608 bytes .../icon/close_icon_02.imageset/Contents.json | 22 ++ .../close_icon_02.imageset/Frame 126@2x.png | Bin 0 -> 1193 bytes .../close_icon_02.imageset/Frame 126@3x.png | Bin 0 -> 1679 bytes .../icon/coins_icon_03.imageset/Contents.json | 22 ++ .../coins_icon_03.imageset/新APP金币@2x.png | Bin 0 -> 2043 bytes .../coins_icon_03.imageset/新APP金币@3x.png | Bin 0 -> 3910 bytes .../facebook_icon_01.imageset/Contents.json | 22 ++ .../facebook_icon_01.imageset/Vector@2x.png | Bin 0 -> 609 bytes .../facebook_icon_01.imageset/Vector@3x.png | Bin 0 -> 830 bytes .../wallet_icon_01.imageset/Contents.json | 22 ++ .../Wallet-three (钱包3)@2x.png | Bin 0 -> 696 bytes .../Wallet-three (钱包3)@3x.png | Bin 0 -> 853 bytes XSeri/Source/en.lproj/Localizable.strings | 4 + 67 files changed, 2093 insertions(+), 127 deletions(-) create mode 100644 XSeri/Class/Home/View/XSHomeCoinsPackButton.swift create mode 100644 XSeri/Class/Mine/Model/XSVersionUpdateModel.swift create mode 100644 XSeri/Class/Mine/View/XSLoginView.swift delete mode 100644 XSeri/Class/Store/Controller/FACoinsRecordViewController.swift delete mode 100644 XSeri/Class/Store/Controller/FAVipRecordViewController.swift create mode 100644 XSeri/Class/Store/Controller/XSCoinsOrderRecordViewController.swift create mode 100644 XSeri/Class/Store/Controller/XSCoinsPackViewController.swift create mode 100644 XSeri/Class/Store/Controller/XSVipOrderRecordViewController.swift create mode 100644 XSeri/Class/Store/Model/XSOrderRecordModel.swift create mode 100644 XSeri/Class/Store/View/XSCoinsOrderRecordCell.swift create mode 100644 XSeri/Class/Store/View/XSSegmentedGradientIndicatorView.swift create mode 100644 XSeri/Class/Store/View/XSStoreCell.swift create mode 100644 XSeri/Class/Store/View/XSStoreCoinsBigCell.swift create mode 100644 XSeri/Class/Store/View/XSStoreCoinsSmallCell.swift create mode 100644 XSeri/Class/Store/View/XSStoreCoinsSpreadCell.swift create mode 100644 XSeri/Class/Store/View/XSStoreVipCell.swift create mode 100644 XSeri/Class/Store/View/XSVipOrderRecordCell.swift create mode 100644 XSeri/Libs/Alert/XSAlert.swift create mode 100644 XSeri/Libs/Alert/XSBaseAlert.swift create mode 100644 XSeri/Source/Assets.xcassets/Color/#00181A.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Color/#0866FF.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Color/#0C0701.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Color/#16110E.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Color/#333333.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Color/#574537.colorset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/button_bg_image_02.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/button_bg_image_02.imageset/按钮@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/button_bg_image_02.imageset/按钮@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Frame 126@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Frame 126@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@3x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Contents.json create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Wallet-three (钱包3)@2x.png create mode 100644 XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Wallet-three (钱包3)@3x.png diff --git a/XSeri.xcodeproj/project.pbxproj b/XSeri.xcodeproj/project.pbxproj index 8c48c38..1fbd819 100644 --- a/XSeri.xcodeproj/project.pbxproj +++ b/XSeri.xcodeproj/project.pbxproj @@ -162,8 +162,23 @@ F3F389062F6939EE001B0E15 /* XSRewardCoinsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389052F6939EE001B0E15 /* XSRewardCoinsViewController.swift */; }; F3F389082F6940BB001B0E15 /* XSRewardCoinsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389072F6940BB001B0E15 /* XSRewardCoinsCell.swift */; }; F3F3890A2F694109001B0E15 /* XSSendCoinRecordModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389092F694109001B0E15 /* XSSendCoinRecordModel.swift */; }; - F3F3890C2F695055001B0E15 /* FACoinsRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3890B2F695055001B0E15 /* FACoinsRecordViewController.swift */; }; - F3F3890E2F695068001B0E15 /* FAVipRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3890D2F695068001B0E15 /* FAVipRecordViewController.swift */; }; + F3F3890C2F695055001B0E15 /* XSCoinsOrderRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3890B2F695055001B0E15 /* XSCoinsOrderRecordViewController.swift */; }; + F3F3890E2F695068001B0E15 /* XSVipOrderRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3890D2F695068001B0E15 /* XSVipOrderRecordViewController.swift */; }; + F3F389102F695C5A001B0E15 /* XSSegmentedGradientIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3890F2F695C5A001B0E15 /* XSSegmentedGradientIndicatorView.swift */; }; + F3F389122F6A37E3001B0E15 /* XSCoinsOrderRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389112F6A37E3001B0E15 /* XSCoinsOrderRecordCell.swift */; }; + F3F389142F6A3812001B0E15 /* XSOrderRecordModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389132F6A3812001B0E15 /* XSOrderRecordModel.swift */; }; + F3F389162F6A3AD3001B0E15 /* XSVipOrderRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389152F6A3AD3001B0E15 /* XSVipOrderRecordCell.swift */; }; + F3F389182F6A4407001B0E15 /* XSStoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389172F6A4407001B0E15 /* XSStoreCell.swift */; }; + F3F3891A2F6A444D001B0E15 /* XSStoreCoinsBigCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389192F6A444D001B0E15 /* XSStoreCoinsBigCell.swift */; }; + F3F3891C2F6A4465001B0E15 /* XSStoreCoinsSmallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3891B2F6A4465001B0E15 /* XSStoreCoinsSmallCell.swift */; }; + F3F3891E2F6A4484001B0E15 /* XSStoreCoinsSpreadCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3891D2F6A4484001B0E15 /* XSStoreCoinsSpreadCell.swift */; }; + F3F389202F6A487B001B0E15 /* XSStoreVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3891F2F6A487B001B0E15 /* XSStoreVipCell.swift */; }; + F3F389222F6A4B8F001B0E15 /* XSCoinsPackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389212F6A4B8F001B0E15 /* XSCoinsPackViewController.swift */; }; + F3F389242F6A8B89001B0E15 /* XSHomeCoinsPackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389232F6A8B89001B0E15 /* XSHomeCoinsPackButton.swift */; }; + F3F389272F6A9597001B0E15 /* XSBaseAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389262F6A9597001B0E15 /* XSBaseAlert.swift */; }; + F3F389292F6A98C9001B0E15 /* XSAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F389282F6A98C9001B0E15 /* XSAlert.swift */; }; + F3F3892B2F6AAC25001B0E15 /* XSVersionUpdateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3892A2F6AAC25001B0E15 /* XSVersionUpdateModel.swift */; }; + F3F3892D2F6B86F7001B0E15 /* XSLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F3892C2F6B86F7001B0E15 /* XSLoginView.swift */; }; F3F683ED2F56C380008AF250 /* XSHomeHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F683EC2F56C380008AF250 /* XSHomeHistoryView.swift */; }; /* End PBXBuildFile section */ @@ -327,8 +342,23 @@ F3F389052F6939EE001B0E15 /* XSRewardCoinsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSRewardCoinsViewController.swift; sourceTree = ""; }; F3F389072F6940BB001B0E15 /* XSRewardCoinsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSRewardCoinsCell.swift; sourceTree = ""; }; F3F389092F694109001B0E15 /* XSSendCoinRecordModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSSendCoinRecordModel.swift; sourceTree = ""; }; - F3F3890B2F695055001B0E15 /* FACoinsRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsRecordViewController.swift; sourceTree = ""; }; - F3F3890D2F695068001B0E15 /* FAVipRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAVipRecordViewController.swift; sourceTree = ""; }; + F3F3890B2F695055001B0E15 /* XSCoinsOrderRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSCoinsOrderRecordViewController.swift; sourceTree = ""; }; + F3F3890D2F695068001B0E15 /* XSVipOrderRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSVipOrderRecordViewController.swift; sourceTree = ""; }; + F3F3890F2F695C5A001B0E15 /* XSSegmentedGradientIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSSegmentedGradientIndicatorView.swift; sourceTree = ""; }; + F3F389112F6A37E3001B0E15 /* XSCoinsOrderRecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSCoinsOrderRecordCell.swift; sourceTree = ""; }; + F3F389132F6A3812001B0E15 /* XSOrderRecordModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSOrderRecordModel.swift; sourceTree = ""; }; + F3F389152F6A3AD3001B0E15 /* XSVipOrderRecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSVipOrderRecordCell.swift; sourceTree = ""; }; + F3F389172F6A4407001B0E15 /* XSStoreCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSStoreCell.swift; sourceTree = ""; }; + F3F389192F6A444D001B0E15 /* XSStoreCoinsBigCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSStoreCoinsBigCell.swift; sourceTree = ""; }; + F3F3891B2F6A4465001B0E15 /* XSStoreCoinsSmallCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSStoreCoinsSmallCell.swift; sourceTree = ""; }; + F3F3891D2F6A4484001B0E15 /* XSStoreCoinsSpreadCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSStoreCoinsSpreadCell.swift; sourceTree = ""; }; + F3F3891F2F6A487B001B0E15 /* XSStoreVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSStoreVipCell.swift; sourceTree = ""; }; + F3F389212F6A4B8F001B0E15 /* XSCoinsPackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSCoinsPackViewController.swift; sourceTree = ""; }; + F3F389232F6A8B89001B0E15 /* XSHomeCoinsPackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSHomeCoinsPackButton.swift; sourceTree = ""; }; + F3F389262F6A9597001B0E15 /* XSBaseAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSBaseAlert.swift; sourceTree = ""; }; + F3F389282F6A98C9001B0E15 /* XSAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSAlert.swift; sourceTree = ""; }; + F3F3892A2F6AAC25001B0E15 /* XSVersionUpdateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSVersionUpdateModel.swift; sourceTree = ""; }; + F3F3892C2F6B86F7001B0E15 /* XSLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSLoginView.swift; sourceTree = ""; }; F3F683EC2F56C380008AF250 /* XSHomeHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSHomeHistoryView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -482,6 +512,7 @@ F347D29C2F03A5A100786648 /* Libs */ = { isa = PBXGroup; children = ( + F3F389252F6A955D001B0E15 /* Alert */, F3F388EA2F680CC7001B0E15 /* IapManager */, F3B312B52F319CA50093B180 /* Empty */, F347D3042F0A12DB00786648 /* HUD */, @@ -560,6 +591,7 @@ F3B312B82F30B0A10093B180 /* XSSearchSuggestionCell.swift */, F3B312B92F30B0A10093B180 /* XSSearchResultCell.swift */, F3F683EC2F56C380008AF250 /* XSHomeHistoryView.swift */, + F3F389232F6A8B89001B0E15 /* XSHomeCoinsPackButton.swift */, ); path = View; sourceTree = ""; @@ -718,6 +750,7 @@ F3F388D42F67DDBC001B0E15 /* XSMineWalletView.swift */, F3F388D62F67EDEC001B0E15 /* XSMineCoinsPackView.swift */, F3F388D82F67F9E1001B0E15 /* XSMineVipView.swift */, + F3F3892C2F6B86F7001B0E15 /* XSLoginView.swift */, ); path = View; sourceTree = ""; @@ -727,6 +760,7 @@ children = ( F35547D92F3DAACB006F28CD /* XSMineItem.swift */, F355483E2F52BD07006F28CD /* XSFeedbackCountModel.swift */, + F3F3892A2F6AAC25001B0E15 /* XSVersionUpdateModel.swift */, ); path = Model; sourceTree = ""; @@ -846,8 +880,9 @@ F3F388FD2F6931D1001B0E15 /* XSConsumptionRecordsViewController.swift */, F3F389052F6939EE001B0E15 /* XSRewardCoinsViewController.swift */, F3F389032F6939C7001B0E15 /* XSOrderRecordsViewController.swift */, - F3F3890B2F695055001B0E15 /* FACoinsRecordViewController.swift */, - F3F3890D2F695068001B0E15 /* FAVipRecordViewController.swift */, + F3F3890B2F695055001B0E15 /* XSCoinsOrderRecordViewController.swift */, + F3F3890D2F695068001B0E15 /* XSVipOrderRecordViewController.swift */, + F3F389212F6A4B8F001B0E15 /* XSCoinsPackViewController.swift */, ); path = Controller; sourceTree = ""; @@ -857,10 +892,18 @@ children = ( F3F388E22F680316001B0E15 /* XSStoreCoinsView.swift */, F3F388E42F68032A001B0E15 /* XSStoreVipView.swift */, + F3F389172F6A4407001B0E15 /* XSStoreCell.swift */, + F3F389192F6A444D001B0E15 /* XSStoreCoinsBigCell.swift */, + F3F3891B2F6A4465001B0E15 /* XSStoreCoinsSmallCell.swift */, + F3F3891D2F6A4484001B0E15 /* XSStoreCoinsSpreadCell.swift */, + F3F3891F2F6A487B001B0E15 /* XSStoreVipCell.swift */, F3F388F92F69240E001B0E15 /* XSWalletHeaderView.swift */, F3F388FB2F692CEF001B0E15 /* XSWalletCell.swift */, F3F388FF2F693293001B0E15 /* XSConsumptionRecordsCell.swift */, F3F389072F6940BB001B0E15 /* XSRewardCoinsCell.swift */, + F3F3890F2F695C5A001B0E15 /* XSSegmentedGradientIndicatorView.swift */, + F3F389112F6A37E3001B0E15 /* XSCoinsOrderRecordCell.swift */, + F3F389152F6A3AD3001B0E15 /* XSVipOrderRecordCell.swift */, ); path = View; sourceTree = ""; @@ -872,6 +915,7 @@ F3F388E62F6805DE001B0E15 /* XSPayItem.swift */, F3F389012F693785001B0E15 /* XSBuyRecordsModel.swift */, F3F389092F694109001B0E15 /* XSSendCoinRecordModel.swift */, + F3F389132F6A3812001B0E15 /* XSOrderRecordModel.swift */, ); path = Model; sourceTree = ""; @@ -888,6 +932,15 @@ path = IapManager; sourceTree = ""; }; + F3F389252F6A955D001B0E15 /* Alert */ = { + isa = PBXGroup; + children = ( + F3F389262F6A9597001B0E15 /* XSBaseAlert.swift */, + F3F389282F6A98C9001B0E15 /* XSAlert.swift */, + ); + path = Alert; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1028,6 +1081,7 @@ F3F388EC2F680CEE001B0E15 /* XSIapManager.swift in Sources */, F347D3082F0A134500786648 /* XSHud.swift in Sources */, F347D29E2F03750000786648 /* XSTabBarItemContentView.swift in Sources */, + F3F3891E2F6A4484001B0E15 /* XSStoreCoinsSpreadCell.swift in Sources */, F347D2FE2F0A0D0700786648 /* XSUserDefaultsKey.swift in Sources */, F347D2EE2F0A06FB00786648 /* XSURLPath.swift in Sources */, F347D2DC2F04EE5F00786648 /* XSHomeRankingsCell.swift in Sources */, @@ -1044,21 +1098,24 @@ F347D2E82F0A03AB00786648 /* XSNetworkModel.swift in Sources */, F35547FE2F4EC450006F28CD /* XSMyCollectViewController.swift in Sources */, F347D29B2F03740000786648 /* XSConfig.swift in Sources */, + F3F3892D2F6B86F7001B0E15 /* XSLoginView.swift in Sources */, F3F388DF2F67FE6D001B0E15 /* XSStoreViewController.swift in Sources */, F35547F42F3EFC37006F28CD /* XSMyListCollectsCell.swift in Sources */, F347D2A72F03AAD700786648 /* XSViewController.swift in Sources */, F3585C342F148F0800EEC469 /* XSHomeViewModel.swift in Sources */, F347D2B02F03AE6700786648 /* XSHomeViewController.swift in Sources */, + F3F389242F6A8B89001B0E15 /* XSHomeCoinsPackButton.swift in Sources */, F304E6102F67A9B600E9B0A6 /* XSShortDetailLockView.swift in Sources */, F3585C3A2F14999700EEC469 /* XSProgressView.swift in Sources */, F3F389062F6939EE001B0E15 /* XSRewardCoinsViewController.swift in Sources */, F3585C382F1497AF00EEC469 /* XSDiscoverControlView.swift in Sources */, F3F388D52F67DDBC001B0E15 /* XSMineWalletView.swift in Sources */, + F3F389272F6A9597001B0E15 /* XSBaseAlert.swift in Sources */, F3F388D92F67F9E1001B0E15 /* XSMineVipView.swift in Sources */, F347D2D42F04BF3D00786648 /* XSHomeNewTitleView.swift in Sources */, F304E6122F67D74A00E9B0A6 /* XSVideoUnlockResult.swift in Sources */, F3F388FE2F6931D1001B0E15 /* XSConsumptionRecordsViewController.swift in Sources */, - F3F3890C2F695055001B0E15 /* FACoinsRecordViewController.swift in Sources */, + F3F3890C2F695055001B0E15 /* XSCoinsOrderRecordViewController.swift in Sources */, F347D28D2F03709200786648 /* AppDelegate.swift in Sources */, F3585C492F14EE8D00EEC469 /* XSShortDetailPlayerCell.swift in Sources */, F35548412F52BE6D006F28CD /* XSBaseWebViewController+Script.swift in Sources */, @@ -1095,19 +1152,23 @@ F347D2E02F04F7ED00786648 /* XSHomeCategoriesCell.swift in Sources */, F3F3890A2F694109001B0E15 /* XSSendCoinRecordModel.swift in Sources */, F347D3032F0A10B600786648 /* XSCryptorService.swift in Sources */, + F3F3891C2F6A4465001B0E15 /* XSStoreCoinsSmallCell.swift in Sources */, F35547D42F3DA7A8006F28CD /* XSTableViewCell.swift in Sources */, F3F388F62F68F746001B0E15 /* XSPayDataRequest.swift in Sources */, F347D30E2F0A39DE00786648 /* XSHomeAPI.swift in Sources */, + F3F3891A2F6A444D001B0E15 /* XSStoreCoinsBigCell.swift in Sources */, F3B312B72F319CBE0093B180 /* XSEmpty.swift in Sources */, F347D2F62F0A0B0B00786648 /* XSLoginToken.swift in Sources */, F347D2CA2F03DC9200786648 /* CGMutablePath+XS.swift in Sources */, F347D2BE2F03C24B00786648 /* XSCollectionView.swift in Sources */, F35547DA2F3DAACB006F28CD /* XSMineItem.swift in Sources */, + F3F389182F6A4407001B0E15 /* XSStoreCell.swift in Sources */, F347D2D62F04C7D500786648 /* XSHomeNewCell.swift in Sources */, F3F388E92F68062F001B0E15 /* XSPayDateModel.swift in Sources */, F347D2CC2F03E04400786648 /* AppDelegate+Config.swift in Sources */, F347D3202F0A57A300786648 /* XSDiscoverPlayerCell.swift in Sources */, F35548022F4ECD5C006F28CD /* UIScrollView+Refresh.swift in Sources */, + F3F3892B2F6AAC25001B0E15 /* XSVersionUpdateModel.swift in Sources */, F347D2EC2F0A060E00786648 /* XSNetworkTarget.swift in Sources */, F3F388E12F680090001B0E15 /* XSScrollView.swift in Sources */, F35547E92F3DDBDD006F28CD /* XSWebView.swift in Sources */, @@ -1121,24 +1182,31 @@ F3585C4B2F14FD1000EEC469 /* XSShortDetailPlayerControlView.swift in Sources */, F3F683ED2F56C380008AF250 /* XSHomeHistoryView.swift in Sources */, F347D2A12F03A84300786648 /* XSScreen.swift in Sources */, + F3F389202F6A487B001B0E15 /* XSStoreVipCell.swift in Sources */, F35548062F4FD6DA006F28CD /* XSMinePlayHistoryView.swift in Sources */, - F3F3890E2F695068001B0E15 /* FAVipRecordViewController.swift in Sources */, + F3F3890E2F695068001B0E15 /* XSVipOrderRecordViewController.swift in Sources */, F3F388E72F6805DE001B0E15 /* XSPayItem.swift in Sources */, + F3F389292F6A98C9001B0E15 /* XSAlert.swift in Sources */, F347D2992F03730E00786648 /* XSTabBarController.swift in Sources */, + F3F389122F6A37E3001B0E15 /* XSCoinsOrderRecordCell.swift in Sources */, F35547D22F3DA757006F28CD /* XSTableView.swift in Sources */, F355480A2F4FE99F006F28CD /* XSMinePlayHistoryCell.swift in Sources */, F3B312AD2F30ACF60093B180 /* XSSearchHotSectionView.swift in Sources */, F3B312AE2F30ACF60093B180 /* XSSearchTagsView.swift in Sources */, F3F389082F6940BB001B0E15 /* XSRewardCoinsCell.swift in Sources */, F3B312AF2F30ACF60093B180 /* XSSearchTagCell.swift in Sources */, + F3F389142F6A3812001B0E15 /* XSOrderRecordModel.swift in Sources */, F3B312B02F30ACF60093B180 /* XSSearchRecentView.swift in Sources */, F35548042F4EDF27006F28CD /* UIStackView+XS.swift in Sources */, F3B312B12F30ACF60093B180 /* XSSearchHeaderView.swift in Sources */, + F3F389162F6A3AD3001B0E15 /* XSVipOrderRecordCell.swift in Sources */, F3B312B22F30ACF60093B180 /* XSSearchHotListItemView.swift in Sources */, F3B312B32F30ACF60093B180 /* XSSearchGradientButton.swift in Sources */, F3B312B42F30ACF60093B180 /* XSSearchHotListCardView.swift in Sources */, F35547F62F3F0407006F28CD /* XSMyListHistoryView.swift in Sources */, F3B312BF2F30B2000093B180 /* XSSearchHistoryHotView.swift in Sources */, + F3F389222F6A4B8F001B0E15 /* XSCoinsPackViewController.swift in Sources */, + F3F389102F695C5A001B0E15 /* XSSegmentedGradientIndicatorView.swift in Sources */, F35548432F52BFB8006F28CD /* XSWebMessageModel.swift in Sources */, F3B312BD2F30B0A10093B180 /* XSSearchSuggestionCell.swift in Sources */, F3B312BE2F30B0A10093B180 /* XSSearchResultCell.swift in Sources */, diff --git a/XSeri/Base/Controller/XSTabBarController.swift b/XSeri/Base/Controller/XSTabBarController.swift index 0f562b0..a745366 100644 --- a/XSeri/Base/Controller/XSTabBarController.swift +++ b/XSeri/Base/Controller/XSTabBarController.swift @@ -102,3 +102,22 @@ class XSTabBarController: ESTabBarController { return nav } } + +extension XSTabBarController { + + func checkUpdates() { + + Task { + guard let model = await XSSettingAPI.requestVersionUpdateData() else { return } + + self.showUpdatesAlert(model) + } + + } + + private func showUpdatesAlert(_ model: XSVersionUpdateModel) { + + + + } +} diff --git a/XSeri/Base/Extension/String+XS.swift b/XSeri/Base/Extension/String+XS.swift index 1eded32..272db59 100644 --- a/XSeri/Base/Extension/String+XS.swift +++ b/XSeri/Base/Extension/String+XS.swift @@ -19,6 +19,15 @@ extension String: SmartCodable { func localizedReplace(text: String?) -> String { return self.localized.replacingOccurrences(of: "##", with: text ?? "") } + + func localizedReplace(text1: String, text2: String, text3: String? = nil) -> String { + var string = self.localized.replacingOccurrences(of: "#1#", with: text1) + string = string.replacingOccurrences(of: "#2#", with: text2) + if let text = text3 { + string = string.replacingOccurrences(of: "#3#", with: text) + } + return string + } } extension String { diff --git a/XSeri/Base/Networking/API/XSSettingAPI.swift b/XSeri/Base/Networking/API/XSSettingAPI.swift index 0f4168e..37d9b59 100644 --- a/XSeri/Base/Networking/API/XSSettingAPI.swift +++ b/XSeri/Base/Networking/API/XSSettingAPI.swift @@ -17,4 +17,14 @@ struct XSSettingAPI { let response: XSNetwork.Response = await XSNetwork.request(parameters: param) return response.data } + + static func requestVersionUpdateData() async -> XSVersionUpdateModel? { + + var param = XSNetwork.Parameters(path: "/customer/versionControl") + param.method = .get + param.isLoding = false + param.isToast = false + let response: XSNetwork.Response = await XSNetwork.request(parameters: param) + return response.data + } } diff --git a/XSeri/Base/Networking/API/XSStoreAPI.swift b/XSeri/Base/Networking/API/XSStoreAPI.swift index 88d7795..46b88aa 100644 --- a/XSeri/Base/Networking/API/XSStoreAPI.swift +++ b/XSeri/Base/Networking/API/XSStoreAPI.swift @@ -128,4 +128,19 @@ struct XSStoreAPI { let response: XSNetwork.Response> = await XSNetwork.request(parameters: param) return response.data } + + static func requestRechargeRecord(page: Int, buyType: BuyType) async -> XSNetwork.List? { + let parameters: [String : Any] = [ + "page_size" : 20, + "current_page" : page, + "buy_type" : buyType.rawValue + ] + + var param = XSNetwork.Parameters(path: "/getCustomerOrder") + param.method = .get + param.parameters = parameters + + let response: XSNetwork.Response> = await XSNetwork.request(parameters: param) + return response.data + } } diff --git a/XSeri/Base/View/XSScrollView.swift b/XSeri/Base/View/XSScrollView.swift index 1042ae6..f0d0da3 100644 --- a/XSeri/Base/View/XSScrollView.swift +++ b/XSeri/Base/View/XSScrollView.swift @@ -19,3 +19,16 @@ class XSScrollView: UIScrollView { } } + +class XSPagerScrollView: XSScrollView { + + override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + let result = super.gestureRecognizerShouldBegin(gestureRecognizer) + guard let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer else { return result } + let translation = panGestureRecognizer.translation(in: self) + if translation.x > 0, self.contentOffset.x == 0 { + return false + } + return result + } +} diff --git a/XSeri/Class/Home/Controller/XSHomeViewController.swift b/XSeri/Class/Home/Controller/XSHomeViewController.swift index 4abc69c..83eebf9 100644 --- a/XSeri/Class/Home/Controller/XSHomeViewController.swift +++ b/XSeri/Class/Home/Controller/XSHomeViewController.swift @@ -73,6 +73,16 @@ class XSHomeViewController: XSViewController { return view }() + private lazy var coinsPackButton: XSHomeCoinsPackButton = { + let view = XSHomeCoinsPackButton() + view.addAction(UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = XSCoinsPackViewController() + self.navigationController?.pushViewController(vc, animated: true) + }), for: .touchUpInside) + return view + }() + deinit { NotificationCenter.default.removeObserver(self) } @@ -121,6 +131,7 @@ extension XSHomeViewController { view.addSubview(searchButton) view.addSubview(segmentedView) view.addSubview(historyView) + view.addSubview(coinsPackButton) searchButton.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) @@ -150,6 +161,11 @@ extension XSHomeViewController { make.bottom.equalToSuperview().offset(-(XSScreen.customTabBarHeight + 5)) } + coinsPackButton.snp.makeConstraints { make in + make.right.equalToSuperview().inset(10) + make.bottom.equalTo(historyView.snp.top).offset(-20) + } + } } diff --git a/XSeri/Class/Home/View/XSHomeCoinsPackButton.swift b/XSeri/Class/Home/View/XSHomeCoinsPackButton.swift new file mode 100644 index 0000000..e3a2279 --- /dev/null +++ b/XSeri/Class/Home/View/XSHomeCoinsPackButton.swift @@ -0,0 +1,51 @@ +// +// XSHomeCoinsPackButton.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SnapKit + +class XSHomeCoinsPackButton: UIControl { + + private lazy var bgImageView = UIImageView(image: UIImage(named: "calendar_icon_01")) + private lazy var textBgImageView = UIImageView(image: UIImage(named: "button_bg_image_02")) + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 10, weight: .black).withBoldItalic() + label.textColor = ._783902 + label.text = "Daily Coins".localized + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(bgImageView) + addSubview(textBgImageView) + textBgImageView.addSubview(textLabel) + + bgImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + + textBgImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalToSuperview().offset(50) + } + + textLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/XSeri/Class/Mine/Controller/XSMineViewController.swift b/XSeri/Class/Mine/Controller/XSMineViewController.swift index c9c267f..96b9764 100644 --- a/XSeri/Class/Mine/Controller/XSMineViewController.swift +++ b/XSeri/Class/Mine/Controller/XSMineViewController.swift @@ -135,6 +135,10 @@ extension XSMineViewController: UITableViewDelegate, UITableViewDataSource { let vc = XSFeedbackViewController() self.navigationController?.pushViewController(vc, animated: true) + case .wallet: + let vc = XSWalletViewController() + self.navigationController?.pushViewController(vc, animated: true) + default: break } @@ -145,6 +149,7 @@ extension XSMineViewController { private func createDataArr() { let arr = [ + XSMineItem(type: .wallet, iconImage: UIImage(named: "wallet_icon_01"), title: "My Wallet".localized), // XSMineItem(type: .setting, iconImage: UIImage(named: "setting_icon_01"), title: "Setting".localized), XSMineItem(type: .about, iconImage: UIImage(named: "about_icon_01"), title: "About".localized), XSMineItem(type: .feedback, iconImage: UIImage(named: "feedback_icon_01"), title: "Feedback".localized) diff --git a/XSeri/Class/Mine/Model/XSMineItem.swift b/XSeri/Class/Mine/Model/XSMineItem.swift index 792d9fe..b8b0a7a 100644 --- a/XSeri/Class/Mine/Model/XSMineItem.swift +++ b/XSeri/Class/Mine/Model/XSMineItem.swift @@ -15,6 +15,7 @@ struct XSMineItem { case feedback case web case safari + case wallet ///消费记录 case consumptionRecords ///购买记录 diff --git a/XSeri/Class/Mine/Model/XSVersionUpdateModel.swift b/XSeri/Class/Mine/Model/XSVersionUpdateModel.swift new file mode 100644 index 0000000..53969c8 --- /dev/null +++ b/XSeri/Class/Mine/Model/XSVersionUpdateModel.swift @@ -0,0 +1,36 @@ +// +// XSVersionUpdateModel.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SmartCodable + +struct XSVersionUpdateModel: SmartCodable { + + var version_code: String? + var des: String? + var version_name: String? + var force: Bool? + + + func canUpdate() -> Bool { + guard let version = version_code else { return false } + + let result = kXSVersion.compare(version, options: .numeric) + if result == .orderedAscending { + return true + } else { + return false + } + } + + static func mappingForKey() -> [SmartKeyTransformer]? { + return [ + CodingKeys.des <--- ["description"] + ] + } + +} diff --git a/XSeri/Class/Mine/View/XSLoginView.swift b/XSeri/Class/Mine/View/XSLoginView.swift new file mode 100644 index 0000000..08fdab4 --- /dev/null +++ b/XSeri/Class/Mine/View/XSLoginView.swift @@ -0,0 +1,175 @@ +// +// XSLoginView.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/19. +// + +import UIKit +import SnapKit +import YYText + +class XSLoginView: XSPanModalContentView { + + + private lazy var bgView: UIImageView = { + let view = UIImageView(image: UIImage(named: "bg_image_01")) + return view + }() + + private lazy var closeButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.dismiss(animated: true) { } + })) + button.setImage(UIImage(named: "close_icon_02"), for: .normal) + return button + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .semibold) + label.textColor = .white + label.text = "Welcome to XSeri" + return label + }() + + private lazy var stackView: UIStackView = { + let view = UIStackView(arrangedSubviews: [facebookButton, appleButton]) + view.axis = .vertical + view.spacing = 18 + return view + }() + + private lazy var facebookButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.cornerRadius = 8 + configuration.background.backgroundColor = ._0866_FF + configuration.imagePadding = 12 + configuration.image = UIImage(named: "facebook_icon_01") + configuration.attributedTitle = AttributedString("Login with Facebook".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .semibold), + .foregroundColor : UIColor.white + ])) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + + })) + button.snp.makeConstraints { make in + make.height.equalTo(48) + } + + return button + }() + + private lazy var appleButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.cornerRadius = 8 + configuration.background.backgroundColor = .white + configuration.imagePadding = 12 + configuration.image = UIImage(named: "apple_icon_01") + configuration.attributedTitle = AttributedString("Login with Apple".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .semibold), + .foregroundColor : UIColor._333333 + ])) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + + })) + button.snp.makeConstraints { make in + make.height.equalTo(48) + } + + return button + }() + + private lazy var agreementLabel: YYLabel = { + let userAgreementText = "User Agreement".localized + let privacyPolicyText = "Privacy Policy".localized + let text = "By continuing, you agree to the\n#1# and #2#".localizedReplace(text1: userAgreementText, text2: privacyPolicyText) + + let userAgreementRange = (text as NSString).range(of: userAgreementText) + let privacyPolicyRange = (text as NSString).range(of: privacyPolicyText) + + let string = NSMutableAttributedString(string: text, attributes: [ + .font : UIFont.font(ofSize: 10, weight: .semibold), + .foregroundColor : UIColor.FFDAA_4 + ]) + + string.yy_setTextHighlight(userAgreementRange, color: .white, backgroundColor: nil) { [weak self] _, _, _, _ in + guard let self = self else { return } + let vc = XSBaseWebViewController() + vc.webUrl = kXSUserAgreementWebUrl + XSTool.topViewController?.navigationController?.pushViewController(vc, animated: true) + self.dismiss(animated: true) { + + } + } + + string.yy_setTextHighlight(privacyPolicyRange, color: .white, backgroundColor: nil) { [weak self] _, _, _, _ in + guard let self = self else { return } + let vc = XSBaseWebViewController() + vc.webUrl = kXSPrivacyPolicyWebUrl + XSTool.topViewController?.navigationController?.pushViewController(vc, animated: true) + self.dismiss(animated: true) { + + } + } + + let label = YYLabel() + label.attributedText = string + label.textAlignment = .center + label.numberOfLines = 0 + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.contentHeight = XSScreen.safeBottom + 320 + + xs_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + + +extension XSLoginView { + private func xs_setupUI() { + addSubview(bgView) + addSubview(closeButton) + addSubview(titleLabel) + addSubview(stackView) + addSubview(agreementLabel) + + bgView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + + closeButton.snp.makeConstraints { make in + make.right.equalToSuperview().inset(23) + make.top.equalToSuperview().offset(20) + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(closeButton.snp.bottom).offset(12) + } + + stackView.snp.makeConstraints { make in + make.width.equalTo(300) + make.centerX.equalToSuperview() + make.top.equalTo(closeButton.snp.bottom).offset(75) + } + + agreementLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().inset(XSScreen.safeBottom + 20) + } + } +} diff --git a/XSeri/Class/Mine/View/XSMineCoinsPackView.swift b/XSeri/Class/Mine/View/XSMineCoinsPackView.swift index ae737ad..b1539c6 100644 --- a/XSeri/Class/Mine/View/XSMineCoinsPackView.swift +++ b/XSeri/Class/Mine/View/XSMineCoinsPackView.swift @@ -44,6 +44,14 @@ class XSMineCoinsPackView: UIView { override init(frame: CGRect) { super.init(frame: frame) + + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + let vc = XSCoinsPackViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + bgView.addGestureRecognizer(tap) + xs_setupUI() } diff --git a/XSeri/Class/Mine/View/XSMineUserInfoView.swift b/XSeri/Class/Mine/View/XSMineUserInfoView.swift index f37e714..ffc7fdc 100644 --- a/XSeri/Class/Mine/View/XSMineUserInfoView.swift +++ b/XSeri/Class/Mine/View/XSMineUserInfoView.swift @@ -15,6 +15,7 @@ class XSMineUserInfoView: UIView { avatarImageView.xs_setImage(userInfo?.avator, placeholder: UIImage(named: "avatar_placeholder_icon_01")) nickNameLabel.text = userInfo?.getNickName() idLabel.text = "ID: \(userInfo?.customer_id ?? "")" + loginButton.isHidden = !(userInfo?.is_tourist ?? true) } } @@ -38,6 +39,22 @@ class XSMineUserInfoView: UIView { return label }() + private lazy var loginButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let view = XSLoginView() + view.present(in: nil) + })) + button.layer.cornerRadius = 16 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.white.withAlphaComponent(0.14).cgColor + button.setTitle("Login".localized, for: .normal) + button.setTitleColor(.white.withAlphaComponent(0.7), for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .semibold) + return button + }() + override init(frame: CGRect) { super.init(frame: frame) @@ -56,6 +73,7 @@ extension XSMineUserInfoView { addSubview(avatarImageView) addSubview(nickNameLabel) addSubview(idLabel) + addSubview(loginButton) avatarImageView.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) @@ -74,6 +92,13 @@ extension XSMineUserInfoView { make.bottom.equalTo(avatarImageView).offset(-6) } + loginButton.snp.makeConstraints { make in + make.centerY.equalTo(avatarImageView) + make.right.equalToSuperview().inset(16) + make.width.equalTo(86) + make.height.equalTo(32) + } + } } diff --git a/XSeri/Class/Store/Controller/FACoinsRecordViewController.swift b/XSeri/Class/Store/Controller/FACoinsRecordViewController.swift deleted file mode 100644 index e6ea51f..0000000 --- a/XSeri/Class/Store/Controller/FACoinsRecordViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// FACoinsRecordViewController.swift -// XSeri -// -// Created by 长沙鸿瑶 on 2026/3/17. -// - -import UIKit - -class FACoinsRecordViewController: XSViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - /* - // 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/XSeri/Class/Store/Controller/FAVipRecordViewController.swift b/XSeri/Class/Store/Controller/FAVipRecordViewController.swift deleted file mode 100644 index dec6421..0000000 --- a/XSeri/Class/Store/Controller/FAVipRecordViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// FAVipRecordViewController.swift -// XSeri -// -// Created by 长沙鸿瑶 on 2026/3/17. -// - -import UIKit - -class FAVipRecordViewController: XSViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - /* - // 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/XSeri/Class/Store/Controller/XSCoinsOrderRecordViewController.swift b/XSeri/Class/Store/Controller/XSCoinsOrderRecordViewController.swift new file mode 100644 index 0000000..092c792 --- /dev/null +++ b/XSeri/Class/Store/Controller/XSCoinsOrderRecordViewController.swift @@ -0,0 +1,108 @@ +// +// XSCoinsOrderRecordViewController.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/17. +// + +import UIKit +import SnapKit + +class XSCoinsOrderRecordViewController: XSViewController { + + private lazy var dataArr: [XSOrderRecordModel] = [] + private lazy var page = 1 + + private lazy var tableView: XSTableView = { + let tableView = XSTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 70 + tableView.separatorColor = .white.withAlphaComponent(0.1) + tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + tableView.contentInset = .init(top: 10, left: 0, bottom: XSScreen.safeBottom + 10, right: 0) + tableView.register(XSCoinsOrderRecordCell.self, forCellReuseIdentifier: "cell") + tableView.ly_emptyView = XSEmpty.xs_emptyView() + + tableView.xs_addRefreshHeader(insetTop: tableView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.xs_addRefreshFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .clear + + xs_setupUI() + + Task { + await requestDataArr(page: 1) + } + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await requestDataArr(page: 1) + self.tableView.xs_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + Task { + await requestDataArr(page: self.page + 1) + self.tableView.xs_endFooterRefreshing() + } + } + +} + +extension XSCoinsOrderRecordViewController { + + private func xs_setupUI() { + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(1) + } + } + +} + + +//MARK: UITableViewDelegate UITableViewDataSource +extension XSCoinsOrderRecordViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! XSCoinsOrderRecordCell + cell.model = dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } + +} + +extension XSCoinsOrderRecordViewController { + + private func requestDataArr(page: Int) async { + + guard let listModel = await XSStoreAPI.requestRechargeRecord(page: page, buyType: .coins) else { return } + guard let list = listModel.list else { return } + + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + self.tableView.reloadData() + } + +} + diff --git a/XSeri/Class/Store/Controller/XSCoinsPackViewController.swift b/XSeri/Class/Store/Controller/XSCoinsPackViewController.swift new file mode 100644 index 0000000..53db6ef --- /dev/null +++ b/XSeri/Class/Store/Controller/XSCoinsPackViewController.swift @@ -0,0 +1,25 @@ +// +// XSCoinsPackViewController.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSCoinsPackViewController: XSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + + } + + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + xs_setNavigationStyle() + } + +} diff --git a/XSeri/Class/Store/Controller/XSOrderRecordsViewController.swift b/XSeri/Class/Store/Controller/XSOrderRecordsViewController.swift index b477d7b..01a9146 100644 --- a/XSeri/Class/Store/Controller/XSOrderRecordsViewController.swift +++ b/XSeri/Class/Store/Controller/XSOrderRecordsViewController.swift @@ -10,38 +10,65 @@ import SnapKit import JXSegmentedView class XSOrderRecordsViewController: XSViewController { - - + + private var segmentedItemWidth: CGFloat = 0 + private lazy var viewControllers: [XSViewController] = { - return [FACoinsRecordViewController(), FAVipRecordViewController()] + return [XSCoinsOrderRecordViewController(), XSVipOrderRecordViewController()] }() - + private lazy var bgImageView: UIImageView = { let imageView = UIImageView(image: UIImage(named: "bg_image_01")) return imageView }() - + + private lazy var segmentedContainerView: UIView = { + let view = UIView() + view.backgroundColor = .white.withAlphaComponent(0.16) + view.layer.cornerRadius = 16 + view.layer.masksToBounds = true + return view + }() + /// Segmented 数据源 private lazy var segmentedDataSource: JXSegmentedTitleDataSource = { let dataSource = JXSegmentedTitleDataSource() dataSource.titles = ["Coin Record".localized, "VIP Record".localized] dataSource.titleNormalColor = UIColor.white.withAlphaComponent(0.55) - dataSource.titleSelectedColor = .white - dataSource.titleNormalFont = .font(ofSize: 16, weight: .medium) + dataSource.titleSelectedColor = ._00181_A + dataSource.titleNormalFont = .font(ofSize: 16, weight: .semibold) dataSource.titleSelectedFont = .font(ofSize: 16, weight: .semibold) dataSource.isTitleColorGradientEnabled = true - dataSource.itemSpacing = 24 + dataSource.isItemSpacingAverageEnabled = false + dataSource.itemSpacing = 0 return dataSource }() - + + private lazy var segmentedIndicator: XSSegmentedGradientIndicatorView = { + let indicator = XSSegmentedGradientIndicatorView() + indicator.gradientColors = [ + UIColor.F_5_BD_7_E.cgColor, + UIColor.FFEABC.cgColor, + UIColor.FFCF_99.cgColor + ] + indicator.gradientLocations = [0, 0.5, 1] + indicator.startPoint = CGPoint(x: 0, y: 0.5) + indicator.endPoint = CGPoint(x: 1, y: 0.5) + indicator.indicatorHeight = 36 + indicator.indicatorCornerRadius = 18 + indicator.indicatorWidthIncrement = 0 + return indicator + }() + /// Segmented 视图 (Tab 栏) private lazy var segmentedView: JXSegmentedView = { let view = JXSegmentedView() view.dataSource = segmentedDataSource view.delegate = self view.listContainer = listContainerView - view.contentEdgeInsetLeft = 16 - view.contentEdgeInsetRight = 16 + view.contentEdgeInsetLeft = 6 + view.contentEdgeInsetRight = 6 + view.indicators = [segmentedIndicator] view.backgroundColor = .clear return view }() @@ -53,42 +80,67 @@ class XSOrderRecordsViewController: XSViewController { override func viewDidLoad() { super.viewDidLoad() - + self.title = "Order Records".localized + self.view.backgroundColor = .black xs_setupUI() } - - + + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(false, animated: true) xs_setNavigationStyle() } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + let horizontalInset = segmentedView.contentEdgeInsetLeft + segmentedView.contentEdgeInsetRight + let availableWidth = segmentedContainerView.bounds.width - horizontalInset + let itemWidth = floor(availableWidth / CGFloat(max(segmentedDataSource.titles.count, 1))) + guard itemWidth > 0, segmentedItemWidth != itemWidth else { return } + segmentedItemWidth = itemWidth + segmentedDataSource.itemWidth = itemWidth + segmentedView.reloadDataWithoutListContainer() + } + } extension XSOrderRecordsViewController { - + private func xs_setupUI() { view.addSubview(bgImageView) + view.addSubview(segmentedContainerView) + segmentedContainerView.addSubview(segmentedView) view.addSubview(listContainerView) - + bgImageView.snp.makeConstraints { make in make.left.right.top.equalToSuperview() } - + + segmentedContainerView.snp.makeConstraints { make in + make.left.right.equalToSuperview().inset(16) + make.top.equalTo(self.view.safeAreaLayoutGuide).offset(10) + make.height.equalTo(48) + } + + segmentedView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + listContainerView.snp.makeConstraints { make in make.left.right.bottom.equalToSuperview() - make.top.equalTo(self.view.safeAreaLayoutGuide) + make.top.equalTo(segmentedContainerView.snp.bottom).offset(8) } } - + } // MARK: - JXSegmentedViewDelegate extension XSOrderRecordsViewController: JXSegmentedViewDelegate { func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) { - + } } @@ -101,4 +153,9 @@ extension XSOrderRecordsViewController: JXSegmentedListContainerViewDataSource { func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate { return viewControllers[index] } + + func scrollViewClass(in listContainerView: JXSegmentedListContainerView) -> AnyClass { + return XSPagerScrollView.self + } } + diff --git a/XSeri/Class/Store/Controller/XSStoreViewController.swift b/XSeri/Class/Store/Controller/XSStoreViewController.swift index 3fc6384..dfe8631 100644 --- a/XSeri/Class/Store/Controller/XSStoreViewController.swift +++ b/XSeri/Class/Store/Controller/XSStoreViewController.swift @@ -9,6 +9,9 @@ import UIKit class XSStoreViewController: XSViewController { + private var payRequest: XSPayDataRequest? + + private var payDataModel: XSPayDateModel? = XSIapManager.manager.payDateModel private lazy var scrollView: XSScrollView = { let scrollView = XSScrollView() @@ -22,12 +25,32 @@ class XSStoreViewController: XSViewController { return view }() + private lazy var coinsView: XSStoreCoinsView = { + let view = XSStoreCoinsView() + view.buyFinishHandle = { [weak self] in + self?.buyFinish() + } + return view + }() + + private lazy var vipView: XSStoreVipView = { + let view = XSStoreVipView() + view.buyFinishHandle = { [weak self] in + self?.buyFinish() + } + return view + }() + override func viewDidLoad() { super.viewDidLoad() self.title = "Store".localized xs_setupUI() + + reloadData() + + requestPayData() } @@ -36,6 +59,50 @@ class XSStoreViewController: XSViewController { self.navigationController?.setNavigationBarHidden(false, animated: true) xs_setNavigationStyle() } + + func reloadData() { + self.stackView.xs_removeAllArrangedSubview() + guard let model = self.payDataModel else { return } + + if let sort = model.sort, sort.count > 0 { + sort.forEach { + if $0 == .vip { + self.addVipView() + } else if $0 == .coin { + self.addCoinsView() + } + } + } else { + self.addVipView() + self.addCoinsView() + } +// self.stackView.addArrangedSubview(tipView) + } + + private func addCoinsView() { + guard let model = self.payDataModel else { return } + + var newList: [XSPayItem] = [] + if let list = model.list_coins, list.count > 0 { + newList = list + } + if newList.count > 0 { + coinsView.setDataArr(newList) + self.stackView.addArrangedSubview(coinsView) + } + } + + private func addVipView() { + guard let list = payDataModel?.list_sub_vip else { return } + guard list.count > 0 else { return } + + self.vipView.dataArr = list + self.stackView.addArrangedSubview(self.vipView) + } + + private func buyFinish() { + self.requestPayData() + } } @@ -58,3 +125,21 @@ extension XSStoreViewController { } } + + +extension XSStoreViewController { + + private func requestPayData() { + payRequest = XSPayDataRequest() + + payRequest?.requestProducts { [weak self] model in + guard let self = self else { return } + guard let model = model else { return } + + self.payDataModel = model + + self.reloadData() + } + + } +} diff --git a/XSeri/Class/Store/Controller/XSVipOrderRecordViewController.swift b/XSeri/Class/Store/Controller/XSVipOrderRecordViewController.swift new file mode 100644 index 0000000..96b65ba --- /dev/null +++ b/XSeri/Class/Store/Controller/XSVipOrderRecordViewController.swift @@ -0,0 +1,107 @@ +// +// XSVipOrderRecordViewController.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/17. +// + +import UIKit + +class XSVipOrderRecordViewController: XSViewController { + + private lazy var dataArr: [XSOrderRecordModel] = [] + private lazy var page = 1 + + private lazy var tableView: XSTableView = { + let tableView = XSTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 70 + tableView.separatorColor = .white.withAlphaComponent(0.1) + tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + tableView.contentInset = .init(top: 10, left: 0, bottom: XSScreen.safeBottom + 10, right: 0) + tableView.register(XSVipOrderRecordCell.self, forCellReuseIdentifier: "cell") + tableView.ly_emptyView = XSEmpty.xs_emptyView() + + tableView.xs_addRefreshHeader(insetTop: tableView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.xs_addRefreshFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .clear + + xs_setupUI() + + Task { + await requestDataArr(page: 1) + } + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await requestDataArr(page: 1) + self.tableView.xs_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + Task { + await requestDataArr(page: self.page + 1) + self.tableView.xs_endFooterRefreshing() + } + } + +} + +extension XSVipOrderRecordViewController { + + private func xs_setupUI() { + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(1) + } + } + +} + + +//MARK: UITableViewDelegate UITableViewDataSource +extension XSVipOrderRecordViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! XSVipOrderRecordCell + cell.model = dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } + +} + +extension XSVipOrderRecordViewController { + + private func requestDataArr(page: Int) async { + + guard let listModel = await XSStoreAPI.requestRechargeRecord(page: page, buyType: .vip) else { return } + guard let list = listModel.list else { return } + + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + self.tableView.reloadData() + } + + +} diff --git a/XSeri/Class/Store/Controller/XSWalletViewController.swift b/XSeri/Class/Store/Controller/XSWalletViewController.swift index de70479..84202b4 100644 --- a/XSeri/Class/Store/Controller/XSWalletViewController.swift +++ b/XSeri/Class/Store/Controller/XSWalletViewController.swift @@ -46,6 +46,7 @@ class XSWalletViewController: XSViewController { override func viewDidLoad() { super.viewDidLoad() self.title = "Details".localized + self.view.backgroundColor = .black NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: XSLoginManager.loginStateDidChangeNotification, object: nil) xs_setupUI() @@ -124,6 +125,9 @@ extension XSWalletViewController: UITableViewDelegate, UITableViewDataSource { case .rewardCoins: vc = XSRewardCoinsViewController() + case .feedback: + vc = XSFeedbackViewController() + default: break } diff --git a/XSeri/Class/Store/Model/XSOrderRecordModel.swift b/XSeri/Class/Store/Model/XSOrderRecordModel.swift new file mode 100644 index 0000000..0ae7a53 --- /dev/null +++ b/XSeri/Class/Store/Model/XSOrderRecordModel.swift @@ -0,0 +1,16 @@ +// +// XSOrderRecordModel.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SmartCodable + +struct XSOrderRecordModel: SmartCodable { + + var type: String? + var value: String? + var created_at: String? +} diff --git a/XSeri/Class/Store/View/XSCoinsOrderRecordCell.swift b/XSeri/Class/Store/View/XSCoinsOrderRecordCell.swift new file mode 100644 index 0000000..08ebba8 --- /dev/null +++ b/XSeri/Class/Store/View/XSCoinsOrderRecordCell.swift @@ -0,0 +1,80 @@ +// +// XSCoinsOrderRecordCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SnapKit + +class XSCoinsOrderRecordCell: XSTableViewCell { + + var model: XSOrderRecordModel? { + didSet { + titleLabel.text = model?.type + dateLabel.text = model?.created_at + coinsLabel.text = "+\(model?.value ?? "0")" + } + } + + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .white + return label + }() + + private lazy var dateLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .regular) + label.textColor = .FFDAA_4 + return label + }() + + private lazy var coinsIconImageView = UIImageView(image: UIImage(named: "coins_icon_03")) + + private lazy var coinsLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .white + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + + contentView.addSubview(titleLabel) + contentView.addSubview(dateLabel) + contentView.addSubview(coinsIconImageView) + contentView.addSubview(coinsLabel) + + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(32) + make.top.equalToSuperview().offset(15) + } + + dateLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-15) + } + + coinsLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-25) + } + + coinsIconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalTo(coinsLabel.snp.left).offset(-4) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/XSeri/Class/Store/View/XSSegmentedGradientIndicatorView.swift b/XSeri/Class/Store/View/XSSegmentedGradientIndicatorView.swift new file mode 100644 index 0000000..0e32060 --- /dev/null +++ b/XSeri/Class/Store/View/XSSegmentedGradientIndicatorView.swift @@ -0,0 +1,57 @@ +// +// XSSegmentedGradientIndicatorView.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/17. +// + +import UIKit +import JXSegmentedView + +class XSSegmentedGradientIndicatorView: JXSegmentedIndicatorBackgroundView { + + var gradientColors: [CGColor] = [] { + didSet { + gradientLayer.colors = gradientColors + } + } + + var gradientLocations: [NSNumber]? { + didSet { + gradientLayer.locations = gradientLocations + } + } + + var startPoint: CGPoint = CGPoint(x: 0, y: 0.5) { + didSet { + gradientLayer.startPoint = startPoint + } + } + + var endPoint: CGPoint = CGPoint(x: 1, y: 0.5) { + didSet { + gradientLayer.endPoint = endPoint + } + } + + private let gradientLayer = CAGradientLayer() + + override func commonInit() { + super.commonInit() + indicatorColor = .clear + backgroundColor = .clear + layer.insertSublayer(gradientLayer, at: 0) + } + + override func layoutSubviews() { + super.layoutSubviews() + backgroundColor = .clear + gradientLayer.frame = bounds + gradientLayer.cornerRadius = layer.cornerRadius + gradientLayer.colors = gradientColors + gradientLayer.locations = gradientLocations + gradientLayer.startPoint = startPoint + gradientLayer.endPoint = endPoint + } + +} diff --git a/XSeri/Class/Store/View/XSStoreCell.swift b/XSeri/Class/Store/View/XSStoreCell.swift new file mode 100644 index 0000000..b7462ba --- /dev/null +++ b/XSeri/Class/Store/View/XSStoreCell.swift @@ -0,0 +1,15 @@ +// +// XSStoreCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSStoreCell: UICollectionViewCell { + + var item: XSPayItem? + + var xs_isSelected: Bool? +} diff --git a/XSeri/Class/Store/View/XSStoreCoinsBigCell.swift b/XSeri/Class/Store/View/XSStoreCoinsBigCell.swift new file mode 100644 index 0000000..a64e29a --- /dev/null +++ b/XSeri/Class/Store/View/XSStoreCoinsBigCell.swift @@ -0,0 +1,29 @@ +// +// XSStoreCoinsBigCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSStoreCoinsBigCell: XSStoreCell { + + + private lazy var bgView: XSView = { + let view = XSView() + view.xs_colors = [] + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/XSeri/Class/Store/View/XSStoreCoinsSmallCell.swift b/XSeri/Class/Store/View/XSStoreCoinsSmallCell.swift new file mode 100644 index 0000000..26fea94 --- /dev/null +++ b/XSeri/Class/Store/View/XSStoreCoinsSmallCell.swift @@ -0,0 +1,12 @@ +// +// XSStoreCoinsSmallCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSStoreCoinsSmallCell: XSStoreCell { + +} diff --git a/XSeri/Class/Store/View/XSStoreCoinsSpreadCell.swift b/XSeri/Class/Store/View/XSStoreCoinsSpreadCell.swift new file mode 100644 index 0000000..2b5941c --- /dev/null +++ b/XSeri/Class/Store/View/XSStoreCoinsSpreadCell.swift @@ -0,0 +1,12 @@ +// +// XSStoreCoinsSpreadCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSStoreCoinsSpreadCell: XSStoreCell { + +} diff --git a/XSeri/Class/Store/View/XSStoreCoinsView.swift b/XSeri/Class/Store/View/XSStoreCoinsView.swift index bc14eaa..0ec3dc3 100644 --- a/XSeri/Class/Store/View/XSStoreCoinsView.swift +++ b/XSeri/Class/Store/View/XSStoreCoinsView.swift @@ -10,6 +10,14 @@ import SnapKit class XSStoreCoinsView: UIView { + var buyFinishHandle: (() -> Void)? + + var shortPlayId: String? + var videoId: String? + + private lazy var dataArr: [[XSPayItem]] = [] + private var selectedIndexPath: IndexPath? + private lazy var titleLabel: UILabel = { let label = UILabel() label.font = .font(ofSize: 16, weight: .bold) @@ -18,39 +26,43 @@ class XSStoreCoinsView: UIView { return label }() -// 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: FACollectionView = { -// let collectionView = FACollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) -// collectionView.delegate = self -// collectionView.dataSource = self -// collectionView.clipsToBounds = false -// collectionView.isScrollEnabled = false -// collectionView.register(FAStoreCoinsBigCell.self, forCellWithReuseIdentifier: "FAStoreCoinsBigCell") -// collectionView.register(FAStoreCoinsSmallCell.self, forCellWithReuseIdentifier: "FAStoreCoinsSmallCell") -// collectionView.register(FAStoreCoinsPackCell.self, forCellWithReuseIdentifier: "FAStoreCoinsPackCell") -// collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) -// return collectionView -// }() + private lazy var collectionViewLayout: UICollectionViewCompositionalLayout = { + let config = UICollectionViewCompositionalLayoutConfiguration() + config.interSectionSpacing = 12 + + let layout = UICollectionViewCompositionalLayout { [weak self] section, environment in + guard let self = self else { return nil} + guard let model = dataArr[section].first else { return nil } + + if model.size == .spread { + return self.spreadLayoutSection(environment) + } else if model.size == .big { + return self.bigLayoutSection(environment) + } else { + return self.smallLayoutSection(environment) + } + } + layout.configuration = config + + return layout + }() + + private lazy var collectionView: XSCollectionView = { + let collectionView = XSCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.clipsToBounds = false + collectionView.isScrollEnabled = false + collectionView.register(XSStoreCoinsBigCell.self, forCellWithReuseIdentifier: XSPayItem.SizeType.big.rawValue) + collectionView.register(XSStoreCoinsSmallCell.self, forCellWithReuseIdentifier: XSPayItem.SizeType.small.rawValue) + collectionView.register(XSStoreCoinsSpreadCell.self, forCellWithReuseIdentifier: XSPayItem.SizeType.spread.rawValue) + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + return collectionView + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } override init(frame: CGRect) { super.init(frame: frame) @@ -61,17 +73,153 @@ class XSStoreCoinsView: UIView { fatalError("init(coder:) has not been implemented") } + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + let height = self.collectionView.contentSize.height + 1 + self.collectionView.snp.updateConstraints { make in + make.height.equalTo(height) + } + } + } + + func setDataArr(_ arr: [XSPayItem]) { + self.dataArr.removeAll() + var bigArr: [XSPayItem] = [] + var smallArr: [XSPayItem] = [] + var spreadArr: [XSPayItem] = [] + + arr.forEach { + if $0.size == .spread { + spreadArr.append($0) + } else if $0.size == .big { + bigArr.append($0) + } else { + smallArr.append($0) + } + } + + if bigArr.count > 0 { + self.dataArr.append(bigArr) + } + if spreadArr.count > 0 { + self.dataArr.append(spreadArr) + } + if smallArr.count > 0 { + self.dataArr.append(smallArr) + } + self.collectionView.reloadData() + } + } extension XSStoreCoinsView { private func xs_setupUI() { addSubview(titleLabel) + addSubview(collectionView) titleLabel.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) make.top.equalToSuperview() } + + collectionView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(36) + make.left.right.equalToSuperview().inset(16) + make.height.equalTo(1) + } } } + +extension XSStoreCoinsView { + + private func bigLayoutSection(_ environment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { + let contentWidth = environment.container.effectiveContentSize.width + let itemWidth = floor((contentWidth - 15) / 2) + + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .absolute(itemWidth), heightDimension: .fractionalHeight(1))) + + let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(84)), subitems: [item]) + group.interItemSpacing = .fixed(15) + + let layoutSection = NSCollectionLayoutSection(group: group) + layoutSection.interGroupSpacing = 12 + layoutSection.contentInsets = .zero + return layoutSection + } + + private func smallLayoutSection(_ environment: NSCollectionLayoutEnvironment) -> 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 = .zero + return layoutSection + } + + private func spreadLayoutSection(_ environment: NSCollectionLayoutEnvironment) -> 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 = .zero + return layoutSection + } +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension XSStoreCoinsView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let item = dataArr[indexPath.section][indexPath.row] + var identifier = item.size?.rawValue ?? "" + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! XSStoreCell + cell.item = item + cell.xs_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 } +// FALogin.manager.requestUserInfo(completer: nil) +// self.buyFinishHandle?() +// } +// view.present(in: nil) +// } else { +// FAIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in +// guard let self = self else { return } +// if finish { +// FALogin.manager.requestUserInfo(completer: nil) +// self.buyFinishHandle?() +// } +// } +// } + + + } +} diff --git a/XSeri/Class/Store/View/XSStoreVipCell.swift b/XSeri/Class/Store/View/XSStoreVipCell.swift new file mode 100644 index 0000000..57b3a35 --- /dev/null +++ b/XSeri/Class/Store/View/XSStoreVipCell.swift @@ -0,0 +1,12 @@ +// +// XSStoreVipCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSStoreVipCell: XSStoreCell { + +} diff --git a/XSeri/Class/Store/View/XSStoreVipView.swift b/XSeri/Class/Store/View/XSStoreVipView.swift index 57e9861..2921c44 100644 --- a/XSeri/Class/Store/View/XSStoreVipView.swift +++ b/XSeri/Class/Store/View/XSStoreVipView.swift @@ -6,9 +6,140 @@ // import UIKit +import SnapKit class XSStoreVipView: UIView { - + var buyFinishHandle: (() -> Void)? + var shortPlayId: String? + var videoId: String? + + var dataArr: [XSPayItem] = [] { + didSet { + collectionView.reloadData() + } + } + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .bold) + label.textColor = .white + label.text = "VIP Membership".localized + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .regular) + label.textColor = .white.withAlphaComponent(0.5) + label.text = "Auto renew,cancel anytime".localized + return label + }() + + 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: XSCollectionView = { + let collectionView = XSCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isScrollEnabled = false + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + collectionView.register(XSStoreVipCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + + override init(frame: CGRect) { + super.init(frame: frame) + xs_setupUI() + } + + 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" { + let height = self.collectionView.contentSize.height + 1 + self.collectionView.snp.updateConstraints { make in + make.height.equalTo(height) + } + } + } } + +extension XSStoreVipView { + + private func xs_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.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(0) + } + + collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(54) + make.height.equalTo(1) + } + } + +} + + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension XSStoreVipView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! XSStoreVipCell + cell.item = 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] + +// FAIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in +// guard let self = self else { return } +// if finish { +// FALogin.manager.requestUserInfo(completer: nil) +// self.buyFinishHandle?() +// } +// } + } +} + diff --git a/XSeri/Class/Store/View/XSVipOrderRecordCell.swift b/XSeri/Class/Store/View/XSVipOrderRecordCell.swift new file mode 100644 index 0000000..ec2f142 --- /dev/null +++ b/XSeri/Class/Store/View/XSVipOrderRecordCell.swift @@ -0,0 +1,71 @@ +// +// XSVipOrderRecordCell.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit + +class XSVipOrderRecordCell: XSTableViewCell { + + var model: XSOrderRecordModel? { + didSet { + titleLabel.text = model?.type + dateLabel.text = model?.created_at + countLabel.text = "+\(model?.value ?? "0")" + } + } + + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .white + return label + }() + + private lazy var dateLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .regular) + label.textColor = .FFDAA_4 + return label + }() + + private lazy var countLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 16, weight: .semibold) + label.textColor = .white + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + + contentView.addSubview(titleLabel) + contentView.addSubview(dateLabel) + contentView.addSubview(countLabel) + + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(32) + make.top.equalToSuperview().offset(15) + } + + dateLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-15) + } + + countLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-25) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/XSeri/Libs/Alert/XSAlert.swift b/XSeri/Libs/Alert/XSAlert.swift new file mode 100644 index 0000000..4cbf266 --- /dev/null +++ b/XSeri/Libs/Alert/XSAlert.swift @@ -0,0 +1,159 @@ +// +// XSAlert.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SnapKit + +class XSAlert: XSBaseAlert { + + private var contentBorderImage = UIImage(named: "alert_bg_border_color_image") + + private var buttonText: String? { + didSet { + self.highlightButton.updateConfiguration() + } + } + + private lazy var titleBgView: UIView = { + let view = XSView() + view.xs_colors = [UIColor.black.withAlphaComponent(0).cgColor, UIColor.FFDAA_4.withAlphaComponent(0.34).cgColor, UIColor.black.withAlphaComponent(0).cgColor] + view.xs_startPoint = .init(x: 0, y: 0.5) + view.xs_endPoint = .init(x: 1, y: 0.5) + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .semibold) + label.textColor = .FFDAA_4 + return label + }() + + private lazy var imageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .white + label.numberOfLines = 0 + label.textAlignment = .center + return label + }() + + private lazy var highlightButton: UIButton = { + var configuration = UIButton.Configuration.plain() + + let button = XSButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.handleHighlightButton() + })) + button.xs_colors = [UIColor._0_C_0701.withAlphaComponent(0).cgColor, UIColor._16110_E.cgColor, UIColor._574537.cgColor] + button.xs_startPoint = .init(x: 0.5, y: 0) + button.xs_endPoint = .init(x: 0.5, y: 1) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.FFDAA_4.cgColor + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + var configuration = button.configuration + + configuration?.attributedTitle = AttributedString(self.buttonText ?? "", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .semibold), + .foregroundColor : UIColor.FFDAA_4 + ])) + + button.configuration = configuration + + } + return button + }() + + deinit { + self.contentView.removeObserver(self, forKeyPath: "bounds") + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.contentView.backgroundColor = .black + self.contentView.layer.cornerRadius = 36 + self.contentView.layer.masksToBounds = true + self.contentView.layer.borderWidth = 1 + self.contentView.addObserver(self, forKeyPath: "bounds", context: nil) + + xs_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "bounds" { + self.contentBorderImage = self.contentBorderImage?.xs_resized(to: self.contentView.bounds.size) + self.contentView.layer.borderColor = UIColor(patternImage: self.contentBorderImage!).cgColor + } + } + + func show(title: String, text: String, image: UIImage?, buttonText: String) -> Self { + self.titleLabel.text = title + self.textLabel.text = text + self.imageView.image = image + self.buttonText = buttonText + return self + } + +} + +extension XSAlert { + + private func xs_setupUI() { + contentView.addSubview(titleBgView) + titleBgView.addSubview(titleLabel) + contentView.addSubview(imageView) + contentView.addSubview(textLabel) + contentView.addSubview(highlightButton) + + titleBgView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.right.equalToSuperview().inset(23) + make.height.equalTo(48) + make.width.equalTo(256) + } + + titleLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalTo(self.contentView.snp.top).inset(131) + } + + textLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-45) + make.top.equalTo(titleBgView.snp.bottom).offset(152) + make.height.greaterThanOrEqualTo(36) + } + + highlightButton.snp.makeConstraints { make in + make.right.left.equalToSuperview().inset(40) + make.top.equalTo(textLabel.snp.bottom).offset(18) + make.bottom.equalToSuperview().offset(-17) + make.height.equalTo(48) + } + } + +} diff --git a/XSeri/Libs/Alert/XSBaseAlert.swift b/XSeri/Libs/Alert/XSBaseAlert.swift new file mode 100644 index 0000000..86e4d41 --- /dev/null +++ b/XSeri/Libs/Alert/XSBaseAlert.swift @@ -0,0 +1,143 @@ +// +// XSBaseAlert.swift +// XSeri +// +// Created by 长沙鸿瑶 on 2026/3/18. +// + +import UIKit +import SnapKit + +class XSBaseAlert: UIView { + + var clickHighlightButton: (() -> Void)? + + private(set) var containerView: UIView = { + let view = UIView() + return view + }() + + private(set) var contentView: UIView = { + let view = UIView() + return view + }() + + private(set) lazy var closeButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "close_icon_02"), for: .normal) + button.addTarget(self, action: #selector(dismiss), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .black.withAlphaComponent(0.5) + + + addSubview(containerView) + containerView.addSubview(contentView) + containerView.addSubview(closeButton) + + containerView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + contentView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.bottom.equalToSuperview().offset(-76) + } + + closeButton.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @discardableResult + @objc func show(in view: UIView? = nil) -> Self { + guard self.superview == nil else { return self } + + var inView: UIView + if let view = view { + inView = view + } else { + inView = XSBaseAlert.Window.manager.createWindow() + } + + inView.addSubview(self) + self.frame = inView.bounds + showAnimation() + + return self + } + @objc func dismiss() { + dismissAnimation() + } + + @objc func handleHighlightButton() { + self.dismissAnimation() + self.clickHighlightButton?() + } +} + +extension XSBaseAlert { + private func showAnimation() { + containerView.transform = CGAffineTransform(translationX: 0, y: 200) + + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0) { + self.containerView.transform = CGAffineTransform.identity + } + } + + private func dismissAnimation() { + + UIView.animate(withDuration: 0.3) { + self.alpha = 0 + self.containerView.transform = CGAffineTransform(translationX: 0, y: 500) + } completion: { _ in + self.removeFromSuperview() + XSBaseAlert.Window.manager.dismissWindow() + } + } +} + +extension XSBaseAlert { + class Window { + static let manager = Window() + + private(set) var window: UIWindow? + + func createWindow() -> UIWindow { + guard let window = window else { + let window = UIWindow(windowScene: XSTool.windowScene!) + window.backgroundColor = .clear + window.windowLevel = .alert + window.isHidden = false + self.window = window + return window + } + return window + } + + func dismissWindow() { + guard let window = self.window else { return } + + var isHidden = true + + window.subviews.forEach { + if $0.isKind(of: XSBaseAlert.self) { + isHidden = false + } + } + if isHidden { + window.isHidden = true + self.window = nil + } + } + } +} + diff --git a/XSeri/Libs/DeviceId/XSDeviceId.swift b/XSeri/Libs/DeviceId/XSDeviceId.swift index 9376b9e..3a8b9a4 100644 --- a/XSeri/Libs/DeviceId/XSDeviceId.swift +++ b/XSeri/Libs/DeviceId/XSDeviceId.swift @@ -8,18 +8,20 @@ import UIKit class XSDeviceId: NSObject { - + static let shared = XSDeviceId() private let key = "com.xseri.deviceid" - - - lazy var id: String = { + + let id: String + + private override init() { if let savedID = XSKeychain.shared.read(key: key) { - return savedID + self.id = savedID } else { let newID = UIDevice.current.identifierForVendor?.uuidString ?? UUID().uuidString XSKeychain.shared.save(key: key, value: newID) - return newID + self.id = newID } - }() + super.init() + } } diff --git a/XSeri/Source/Assets.xcassets/Color/#00181A.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#00181A.colorset/Contents.json new file mode 100644 index 0000000..3d03f3b --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#00181A.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1A", + "green" : "0x18", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Color/#0866FF.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#0866FF.colorset/Contents.json new file mode 100644 index 0000000..08df283 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#0866FF.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0x66", + "red" : "0x08" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Color/#0C0701.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#0C0701.colorset/Contents.json new file mode 100644 index 0000000..c175283 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#0C0701.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x01", + "green" : "0x07", + "red" : "0x0C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Color/#16110E.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#16110E.colorset/Contents.json new file mode 100644 index 0000000..0a28d62 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#16110E.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x0E", + "green" : "0x11", + "red" : "0x16" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Color/#333333.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#333333.colorset/Contents.json new file mode 100644 index 0000000..be3a0c9 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#333333.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x33", + "green" : "0x33", + "red" : "0x33" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Color/#574537.colorset/Contents.json b/XSeri/Source/Assets.xcassets/Color/#574537.colorset/Contents.json new file mode 100644 index 0000000..4b6c343 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Color/#574537.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x37", + "green" : "0x45", + "red" : "0x57" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Contents.json new file mode 100644 index 0000000..9e6ce69 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 346272052@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle 346272052@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b615d2a1793c0e32b41aa1764f27190f78bc067 GIT binary patch literal 5971 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 Bmh1ok literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@3x.png b/XSeri/Source/Assets.xcassets/Image/icon/alert_bg_border_color_image.imageset/Rectangle 346272052@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f0b63ec80c4ca84056be4b3141077269b36fbeb GIT binary patch literal 12751 zcmV;=F)+@FP)s=jjuj2)Fq!72{Z(ig+w6J047`fbgLC39^6w{v3MMSLb9F$!e-X*(hz6D8pWa&)*H(}DYWn*?BnZ>(IOa)N>Bk(?N2q}`r8 z-M%gxT4gBl1X46vi7oS1(B~T4A>`w>u)Q2 zJ^xBEQ<7!ljPihPHR_-5jwqYPeY}dm4Op!7ZsW2vw2_Na!~u~T6$qigI94c?z$~BV zJm>XN{-jUKewq8a;7HC4ILL_iqB2c6tZbL7(aHwtLof@sOdXJc;a6!|1esmG zxyP{Db*+*s_cfy)=ep3QQnqAaY^4RPmRG#?=LW7bKElfiPVN{N`S7@dQZ83mbhTH0 z2tme!Lvxk7dS_h24LLrh>)EM(t(DRRz^!z3@-cHhGJFDpGRh9&X!@EZFUXCDYy;22 zz!r^!9bB0?bu(IYQK}z_0oy`9?{pi1zR(&}R<_k!0!Y~^44cDD zKe=5Fqz;XY5b8d{+{)YyeL5SXqoC`A*2aC?Uvc%rk-Mbp53|NhdK-j|KyA zEcKPQnKn_cbB$j8FPGRg~s!^)1@IpS!;PH9SNjV?Wv-NngTU-{gV?KrUmF42LP zJpLjd1ZKf#Uv?15L_Tin8{9-}o`A87Jo3Iqs|vH0x_!$$pB4rTGE)j+L#sJwX7o(t zGY=p|=Vp`h(EB$BFYeP5Thxs+=rX`KuX6iYE-`H5gK{m<2|^w< zg1wU5n~)`oc$aJ*GYDihZFlXI^WtF)>Rh(HlIE>o8@##f8R(rP%k7%Cm%J3JeOyx? zh=RDerrF$&ohogYPrSyM zb9%Xr$^_kohF6e={bjddCp&i4T3GY9%VMZ5_kJAedDwzjclFQ; ztA3{Xxp(=Eo6_23ddN(IzMy1X$AR=ep_E43Z45^fjJ46nI}Y3kIRYz>V*W z&%h%$vLwU$Tw!yq7kiz537|Rmusu8(I|pi`cr7N?ALd(nhR^SB|4pWzqfxPoR3Txo zP4&BdM|C*&F8Sh?vCG9YJk*K1iZa(rp}-3%gL|AznC~;H=`jsr23`>1GS$dT%^Wx9 z$v_3`BR{mOx}E{(aMu01_VP9=pSUPe0O_Yv(S1%!Ow_I~i(V~xt%=fN;!vFT+vc*3 zzf^VEdBEhMHPVjR--KgF(+}r+w1(&r?sH8VQ%_+8e&aW`CkJ46jjY>Kp>i(&&bkYM zy?K66*5W`V&(N(DW#CrPI`gb*kXqC2-l!JF@ec5W-PaKga#tUoRKq52$d2{u*sx^= z<1SKm?*}?z^6FIF&2yKdS1WsiB}0%wHQRB_&|c-*QzP)jj`^y$m)yi8Svur`Z55Yun82sItp)_*mZ3 z;JW}!T(pw^9Li3{GQxR}_nEui62xlAN|Ill$B-2(v;5y9M3>2e(Gf zn*|~pR=^L9+4kf>+U)DU|NX8(9#Svgt&f|KUj29SXr{xDkTaFtDn0l*@=o39E4EF_W6N?V&CH^qLkacog&>KAGJMTI@i*

PVef2yYzHy)@X77ExT~Dgw4Fp8GVNaj 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 VIZ}y}dyD`8002ovPDHLkV1hfW0k8l7 literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Contents.json new file mode 100644 index 0000000..6a4d508 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9b922c9f6a60529faefdfbd297c3b24a21c40fa3 GIT binary patch literal 722 zcmV;@0xkWCP)5bX?M&yJ;W4`sYTJb`)wxq*5DI z;RNW;9a*|F6tFg1cI^52I%KMbVIUNtc~uli&-A?M&vZ{bIuXJ!tSy(z7Jj#Qt&K*b z>wWWmIt^*KSS)(0)hftENs&%z;%2jXH=oaYrp)uaLSjWF07C=(eK>}`igZg6!@VzX zZ_Sj!+H^P^eirE-P0ZGUv}KV_E0xO4A^JxX!`jeAnj}ejh<+JYn=Xz)dJWRTq|(@% z)qFN*vsu8;)oL}xx>G#{q8QnH4y!5O+;8~=<_VG9|VwBP> z>y<&;7baz^gS_ahiSt4bkSvls^V4h-yaOc19|?l1nSI8UPJdyv?ZU#Yz9m8AwYy`> zm2_-zF&MbyY;j0}*wvd$wZ$?JCq^hQTyn+1CqXEsBBvZXN=Xo$yp2X9vgPdR0miZ7|l7B zK2{oVd6)mq0wQiT8;1*EXM;HJATbGot<~*OSp&}`1hy6-ebw(9#97dl5+S!gZ7TMJ z$z<|Vuh%c>gzb_&iBNu$8L#0p_$Qze-^)UjW*CR9$QT1Mk2bdXhIsT>t<807*qoM6N<$ Eg2hcb*8l(j literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@3x.png b/XSeri/Source/Assets.xcassets/Image/icon/apple_icon_01.imageset/Vector@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1304ee817d55302d09c4b7e95051fce6d01d31 GIT binary patch literal 1020 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 literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/Contents.json new file mode 100644 index 0000000..16d0592 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "签到板+飞舞的金币@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "签到板+飞舞的金币@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e9c2a56486283de0855998cc3b5c180216d63f GIT binary patch literal 27828 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 X&KP~+Z7aw000000NkvXXu0mjfW=0v~ literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@3x.png b/XSeri/Source/Assets.xcassets/Image/icon/calendar_icon_01.imageset/签到板+飞舞的金币@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a3829a68c95a4fb1477b616d8e9f8036c2ccff70 GIT binary patch literal 54608 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 literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Contents.json new file mode 100644 index 0000000..fc17345 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 126@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 126@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Frame 126@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/close_icon_02.imageset/Frame 126@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..442e7b673adf482bfb07bb0a81c4f808a960e687 GIT binary patch literal 1193 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 ZyalmIGH%+oXb1oR002ovPDHLkV1n^j6)^w+ literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/Contents.json new file mode 100644 index 0000000..014d81b --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "新APP金币@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "新APP金币@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd03b6e230e8edda78ff2589756def36271670b GIT binary patch literal 2043 zcmVIK&gY$b&bjx#2mGH8_FufmpWG6uy>+Fy zvaNMqJ!i74oB7GVbPl||t25Et)dh3rU5<}%h}*Ysubv!v?w>~DX|88_Ej<_I_Ry3# zHwsB^sA+DQ6K3J!iYVu^CHT>fyU*szSr?_3dN~qC2NcZoD zmQKJW%kbAW!*kP@A%$AOO_M|WeO3zGAE56g8pibiN>4npvGS?!Y>cakGnTiqSrGj- zi0}IrEEYy+$wtVb1~ADBT}dPHZWjjk{t9&!3C!R00_4Vf071h`JHEE)p>2l;uLQjk zPhykuKKUrQLqQ8}XNV;sVx)r!5`lZ5Wuo}=!=J(G zH9l0|cM3)^Ywi5$LkqS(zAt90bxnq;6ZiA?2T!B6Z5^2CCh77h3Aa%wr4Z<6gGt^1 z`gU$Y^8*K9nHo((_ZfreF2nw3H{xR@-MI0IQF?X}lDqXX4B=AWl%CILW4%W)zl8uS z9mT{D+&47QWMrVF!Qz^u(3ziYfmNcRklaN$wpHBunZ*p&J^32Ws4Ecr;Zj&d&Zjba z&t8i2;RXB6Gt1iFAJ6y=H4lxvF*5y-t5<JBxXLj96PFai-=RYYonKooF; zz^sD9^8DTxzybmSk>$i-0)-2&lFu?Y*KLk8ESQB1Hvha6L$Cb=ZjUV7{q?)LKD5sP z+_Ze2oYu;ub3-x6J{PgdLy$wH>J;3vMJi?;#_CuHN=nC3)7nN!QGlh!;F)_Ll<0S1 zr2YzC7$c_SDHEw=LWt$&VzTc5ypmXtnTFs1-nnUQo9`49eim@$$`viH;6lnOM#krz^tW_krDRZ5S%$8c_CP)LJha4aSm|TLY>ZSO zsjVr;Up>_gec}*-AID_RHUt)Zk4i>CUCS*P?<3ZN$=cU6ESm-N_$n(TPXz%ImRTgV z1!9PvvjH`GM~P1CKH$eZ^(nWZ4u1z3pn)Kv&68Ef-2BZorHohMU$r> zm3Wcp`5nnSo!O28lxzZ(ltu4ay6Tz*?CT$h>A3{l-ZBUxWg1Na$9w~>5{5u+ImB=U zlzb7o;c}kA&PvMK>9Wa_cQWQIyW7cJZW3!^ZZq}xD1*t*GlLVcS-{Ty$Ny$2=XhOn zGkK`N$e*W|CTUWVjz9&%@Ru_bO$)L|bdt&*jGj}sCQu4eOG3+@cFMykB?>~F7(zuP zY_~Za?1{cR3;6vPJI;xQ4);~(IiUmt-IJ4o{TradKf1QapZ-v@8FoPwnK znW@9s#Zu8+9cvb-kNW~L(-Z|RP$Gm^kW^Wkq<{-UlL(Z1VI6~VKN&R zrC}d63Q|r_A)k{Gs5c?{e8!f0|8yg+u{=49U2D5pAYihp$Xp&fNz%Igl=Z`qDq2a} zyt8a^V>+>5Qnu21Xy3EXmYM-CTaD7vQ3}Rm7UIdrUfCTxhf6kASKDIPL0IPD^*nl3 zF;ip1V$-THG*y9ERt>=$p+p>-_Le@kS9|7dgkbM!@;$^bhmv5>Ob$(Kt-GUhr#;tY zjBxFPMc=sN6+gr;jh;Ng!t*^WSRW!H_7;U0k<2!jy=2*4N08{h?6-Wbg0N%9VBNQW zF%rimTZ`)foMk(_?~A*u1LEh#-g*lf`4+4VqBK-SJ<&z=Z_%DfgV!I_4jj?GdFNAy zU!IZhs{7OH-3U8J`|8HZZ>*oQba8{Psoagwg|wRf`#^f|kG;8LySrlPnfX4_M)-ez Z{0oo-)TFyo-_!sA002ovPDHLkV1o03&JzFt literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@3x.png b/XSeri/Source/Assets.xcassets/Image/icon/coins_icon_03.imageset/新APP金币@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c40b429ad9c553e7cc6f2f17533d6462afee3d GIT binary patch literal 3910 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 literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Contents.json new file mode 100644 index 0000000..6a4d508 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e824b5ebe91ef2681cd243fdc7eeb458baada4c0 GIT binary patch literal 609 zcmV-n0-pVeP)IpJM2JleuzVU_@oz*lGso7`OZ#+K!`~3&zv=7C9K#<$XLc{$NGt) z$e<6{$da|CaQ5;px`G=^SekA}-(-wmj#;17Jb}rqW3jOrP5q;u_@H7w(|wIjAto9c5|(l=kD)i* zj$tjhRAgw!%kfHfnRmgmY0p$$g46?Sq3nXx>r|$0iF4uok1B5hb20Rc4k)SWD^xA% zYNirH3im^DZ-!zq6jpirB?h%)jh2v2nw7{1wapuCsar(Z7>1IXdqxcHFc3T=Qr+uf z_E+-I0eRYP&a)p!oQKw4=Lw3VF-1LTXQjh$SqxJ+YT`0%it#y!m%Q44V|+GpIT~VT zU$EPUu`tfV#h&^VPyDcrCP%qAZlpm^$7!={0uFs{!N7lz#SbAe&v$*^Yr zme(Jle4{l(zorh(jPY+w%AR%)KB1qO+Ekfo1lc2!zLsK3-t#lHrm_QJTb!|d3qxB9 vIFUpMgwCJzWM8A4VxEG?drm5Q7CJS57>#KJTW9w;00000NkvXXu0mjf-$M#W literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@3x.png b/XSeri/Source/Assets.xcassets/Image/icon/facebook_icon_01.imageset/Vector@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd67bc3273297ac8e33c395b501e600e88f24df4 GIT binary patch literal 830 zcmV-E1Ht@>P)eUKb=ajP6&-~yRCXvqg{Y7} z{-G#^d_c;w&s>sahZ|=V2X5hyC_#KZyWfr?M#WRUUyoyt{NoARi}~J!h*;I^d*G-& zRqmnU2|pC_z+JOloE=nDK26t~SDmz^;Yg`NiA2r9gf*@ht&}>}ebg>&UmiO%Cqy_O z47%dsvxabjSy?rLY*&As@`< z!c6Y_((N~qmG|*s76&ry?T#pRE8VZ2d9ZQw6Qz8@9AX6}0j|2T@4 zP*vUkfL|#ozTTZ~JQHSSX?;q`jn&LD6>maRX=p2=ZmiJ-J~1Xml!e9UgQhq|VKFoy zrL=^Our)N{3*J-DB}eEdOn=GIfdlg5Ev1g2yRa>}S|oPj$g+z-*b8$Pr6z0zHe4sF z5M=e@-3i9Am|E_^mh)AY&IVA1J{CL6>#1^~bC@?)Gd19XH`xRjsMGWd1ONa407*qo IM6N<$g4=C%KL7v# literal 0 HcmV?d00001 diff --git a/XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Contents.json b/XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Contents.json new file mode 100644 index 0000000..f841473 --- /dev/null +++ b/XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Wallet-three (钱包3)@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Wallet-three (钱包3)@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Wallet-three (钱包3)@2x.png b/XSeri/Source/Assets.xcassets/Image/icon/wallet_icon_01.imageset/Wallet-three (钱包3)@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd68dc27ec7efe6423b43389545c53de08c3ea14 GIT binary patch literal 696 zcmV;p0!RIcP)6ZA}h=d$PL1h!W8id zY)*i40*4deMO-X_6F9j+SW$$cEKYzI#3UJyJ2R5wj1(!Bqeon^zm>XYB>kFh^*n$T z_Z*6H@^QBcqIcl2gM43qNE>fDH}(iS_;9RCzUsYP3v)`=84Ni_?^G zKKvBdxE8R)s2Lj64)WtAv^Wj%Hut|cQKJ|X$mC4*jq#11)#}Iz{-L5(lKrXUbfEM7 znm{Y|2^Rih0kE*(EWE%qWQb05h~ajk&Lkc1>~5I}CPm?o;XHwanY0^WY3F&L27|saZfMqk}}Rtc1%b55X(_DP~2syLYu)b&4Q2jd+-al z9tw2cT73abD6W6p{WhRW5@T319{5L(^ja#wYM6LoM{JagH66Qf-9xRB5S(=jZ4fST9)H zQ(KBUZPwgyw@k~-T~050^asQ>Z^b$Hx9&-9IS>(`>v0{_U8*?m@ospk8fb z|-9EhBm8o7lf-Z(E}1^AjB6ydTk3|CsX0#6Jpxa?TLWv2!i zK-a@PcBw50X`9&GfekP!I1)yB~3S@4o_$T8(Kya zM~o4TrND?_nsH=A-aicNLavnjdr()jXFc;?i-^F8(%E<2eC)-8VN-AkVP$}sc{qsP;7 z7MlFq3H=^kKpObL8%e9Q2%ZfnF?LFGht z$%x>2@vCwSrXV_2<=e)bR#bgNYJ)hU@OXG)3~YWJs5%%8JmUT0Mk*Weh+-?&S!|;R z_oM}xL|XBrrmzKcH4>iLfivtmi(S124f(CH-=93MiPLUHg^$wCsf)2jRXPz=#5w%XP$&K3KBIMD?>d*QBg fK-^-nSPI2|g@NjL+hV+!00000NkvXXu0mjf6pDH1 literal 0 HcmV?d00001 diff --git a/XSeri/Source/en.lproj/Localizable.strings b/XSeri/Source/en.lproj/Localizable.strings index 82fb18a..2cf1419 100644 --- a/XSeri/Source/en.lproj/Localizable.strings +++ b/XSeri/Source/en.lproj/Localizable.strings @@ -59,6 +59,10 @@ "Expires in ## days" = "Expires in ## days"; "Coin Record" = "Coin Record"; "VIP Record" = "VIP Record"; +"Order Records" = "Order Records"; +"VIP Membership" = "VIP Membership"; +"Auto renew,cancel anytime" = "Auto renew,cancel anytime"; +"Daily Coins" = "Daily Coins"; "me_daily_1" = "Daily reward ready!"; "me_daily_2" = "Claim your rewards now.";