充值页面开发

This commit is contained in:
zeng 2025-07-26 09:29:29 +08:00
parent 6ff81c288b
commit c8681c3f1a
98 changed files with 2221 additions and 2 deletions

View File

@ -158,6 +158,20 @@
F39855272E322A7100E2D28D /* BRBaseAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855262E322A7100E2D28D /* BRBaseAlert.swift */; };
F39855292E322B1800E2D28D /* BRAlertWindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855282E322B1800E2D28D /* BRAlertWindowManager.swift */; };
F398552B2E322C7C00E2D28D /* BRAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398552A2E322C7C00E2D28D /* BRAlert.swift */; };
F398552D2E33126D00E2D28D /* BRMineCoinItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398552C2E33126D00E2D28D /* BRMineCoinItemView.swift */; };
F398552F2E33179800E2D28D /* BRMineVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398552E2E33179800E2D28D /* BRMineVipCell.swift */; };
F39855312E33620200E2D28D /* BRMineStoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855302E33620200E2D28D /* BRMineStoreCell.swift */; };
F39855332E33629000E2D28D /* BRMineStoreItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855322E33629000E2D28D /* BRMineStoreItemView.swift */; };
F39855372E33699900E2D28D /* BRStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855362E33699900E2D28D /* BRStoreViewController.swift */; };
F398553B2E336C5700E2D28D /* BRStoreAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398553A2E336C4F00E2D28D /* BRStoreAPI.swift */; };
F398553E2E336D3000E2D28D /* BRPayDateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398553D2E336D3000E2D28D /* BRPayDateModel.swift */; };
F39855402E336FD700E2D28D /* BRStoreVipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398553F2E336FD700E2D28D /* BRStoreVipView.swift */; };
F39855422E3374B500E2D28D /* BRStoreVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855412E3374B500E2D28D /* BRStoreVipCell.swift */; };
F39855442E33840500E2D28D /* AaHouDiHei-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F39855432E33840500E2D28D /* AaHouDiHei-Regular.ttf */; };
F39855462E338FDA00E2D28D /* BRStoreCoinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855452E338FDA00E2D28D /* BRStoreCoinView.swift */; };
F39855482E33928400E2D28D /* BRStoreCoinBigCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855472E33928400E2D28D /* BRStoreCoinBigCell.swift */; };
F398554A2E33929C00E2D28D /* BRStoreCoinCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855492E33929C00E2D28D /* BRStoreCoinCell.swift */; };
F398554C2E3392C200E2D28D /* BRStoreCoinSmallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398554B2E3392C200E2D28D /* BRStoreCoinSmallCell.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -327,6 +341,20 @@
F39855262E322A7100E2D28D /* BRBaseAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRBaseAlert.swift; sourceTree = "<group>"; };
F39855282E322B1800E2D28D /* BRAlertWindowManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAlertWindowManager.swift; sourceTree = "<group>"; };
F398552A2E322C7C00E2D28D /* BRAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAlert.swift; sourceTree = "<group>"; };
F398552C2E33126D00E2D28D /* BRMineCoinItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRMineCoinItemView.swift; sourceTree = "<group>"; };
F398552E2E33179800E2D28D /* BRMineVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRMineVipCell.swift; sourceTree = "<group>"; };
F39855302E33620200E2D28D /* BRMineStoreCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRMineStoreCell.swift; sourceTree = "<group>"; };
F39855322E33629000E2D28D /* BRMineStoreItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRMineStoreItemView.swift; sourceTree = "<group>"; };
F39855362E33699900E2D28D /* BRStoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreViewController.swift; sourceTree = "<group>"; };
F398553A2E336C4F00E2D28D /* BRStoreAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreAPI.swift; sourceTree = "<group>"; };
F398553D2E336D3000E2D28D /* BRPayDateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPayDateModel.swift; sourceTree = "<group>"; };
F398553F2E336FD700E2D28D /* BRStoreVipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreVipView.swift; sourceTree = "<group>"; };
F39855412E3374B500E2D28D /* BRStoreVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreVipCell.swift; sourceTree = "<group>"; };
F39855432E33840500E2D28D /* AaHouDiHei-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AaHouDiHei-Regular.ttf"; sourceTree = "<group>"; };
F39855452E338FDA00E2D28D /* BRStoreCoinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreCoinView.swift; sourceTree = "<group>"; };
F39855472E33928400E2D28D /* BRStoreCoinBigCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreCoinBigCell.swift; sourceTree = "<group>"; };
F39855492E33929C00E2D28D /* BRStoreCoinCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreCoinCell.swift; sourceTree = "<group>"; };
F398554B2E3392C200E2D28D /* BRStoreCoinSmallCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRStoreCoinSmallCell.swift; sourceTree = "<group>"; };
F70FA1F4169364C4C53534CE /* Pods-BeeReel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeReel.release.xcconfig"; path = "Target Support Files/Pods-BeeReel/Pods-BeeReel.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -418,6 +446,10 @@
BF02B81A2E2F8FDF00172177 /* BRMineUserInfoCell.swift */,
BF02B8232E2FAEB500172177 /* BRAboutUsCell.swift */,
BF02B8252E2FB36A00172177 /* BRAboutUsHeaderView.swift */,
F398552C2E33126D00E2D28D /* BRMineCoinItemView.swift */,
F398552E2E33179800E2D28D /* BRMineVipCell.swift */,
F39855302E33620200E2D28D /* BRMineStoreCell.swift */,
F39855322E33629000E2D28D /* BRMineStoreItemView.swift */,
);
path = View;
sourceTree = "<group>";
@ -556,6 +588,7 @@
BF692AF22E0A478D00A5C2DA /* Sources */ = {
isa = PBXGroup;
children = (
F39855432E33840500E2D28D /* AaHouDiHei-Regular.ttf */,
BF692AE22E0A475D00A5C2DA /* Assets.xcassets */,
BF692AE32E0A475D00A5C2DA /* Info.plist */,
BF692AE52E0A475D00A5C2DA /* LaunchScreen.storyboard */,
@ -592,6 +625,7 @@
BF692AF52E0A47D400A5C2DA /* Class */ = {
isa = PBXGroup;
children = (
F39855342E33697400E2D28D /* Store */,
BF02B8292E30851900172177 /* Search */,
BF02B8102E2F83A100172177 /* Mine */,
BF02B8052E2F612200172177 /* Favorites */,
@ -889,6 +923,7 @@
BF692B712E0D395300A5C2DA /* API */ = {
isa = PBXGroup;
children = (
F398553A2E336C4F00E2D28D /* BRStoreAPI.swift */,
BFC676882E122FDB006659E5 /* BRVideoAPI.swift */,
BFC676682E0E34D9006659E5 /* BRUserAPI.swift */,
BF692B722E0D396800A5C2DA /* BRHomeAPI.swift */,
@ -1003,6 +1038,45 @@
path = Alert;
sourceTree = "<group>";
};
F39855342E33697400E2D28D /* Store */ = {
isa = PBXGroup;
children = (
F39855352E33697F00E2D28D /* Controller */,
F39855382E336BFD00E2D28D /* View */,
F398553C2E336CC100E2D28D /* Model */,
);
path = Store;
sourceTree = "<group>";
};
F39855352E33697F00E2D28D /* Controller */ = {
isa = PBXGroup;
children = (
F39855362E33699900E2D28D /* BRStoreViewController.swift */,
);
path = Controller;
sourceTree = "<group>";
};
F39855382E336BFD00E2D28D /* View */ = {
isa = PBXGroup;
children = (
F398553F2E336FD700E2D28D /* BRStoreVipView.swift */,
F39855412E3374B500E2D28D /* BRStoreVipCell.swift */,
F39855452E338FDA00E2D28D /* BRStoreCoinView.swift */,
F39855492E33929C00E2D28D /* BRStoreCoinCell.swift */,
F39855472E33928400E2D28D /* BRStoreCoinBigCell.swift */,
F398554B2E3392C200E2D28D /* BRStoreCoinSmallCell.swift */,
);
path = View;
sourceTree = "<group>";
};
F398553C2E336CC100E2D28D /* Model */ = {
isa = PBXGroup;
children = (
F398553D2E336D3000E2D28D /* BRPayDateModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -1066,6 +1140,7 @@
files = (
BF692AEE2E0A475D00A5C2DA /* Assets.xcassets in Resources */,
BF692AF02E0A475D00A5C2DA /* LaunchScreen.storyboard in Resources */,
F39855442E33840500E2D28D /* AaHouDiHei-Regular.ttf in Resources */,
BF692B442E0A910E00A5C2DA /* Localizable.xcstrings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -1128,6 +1203,7 @@
BFC676A42E129D60006659E5 /* BRHomeTop10Cell.swift in Sources */,
BF02B8262E2FB36A00172177 /* BRAboutUsHeaderView.swift in Sources */,
BF692B3C2E0A8D0200A5C2DA /* BRNavigationController.swift in Sources */,
F39855332E33629000E2D28D /* BRMineStoreItemView.swift in Sources */,
BFC676B12E137D2F006659E5 /* BRPopularPicksViewController.swift in Sources */,
BF02B7FC2E2F262F00172177 /* BRGradientView.swift in Sources */,
BFC676692E0E34DA006659E5 /* BRUserAPI.swift in Sources */,
@ -1138,12 +1214,15 @@
BF02B8392E30B30400172177 /* AlignedCollectionViewFlowLayout.swift in Sources */,
BF3A56882E30E0DD009E5CF9 /* BREmpty.swift in Sources */,
BF3338F52E1616B200B10F76 /* BRExploreControlView.swift in Sources */,
F398552D2E33126D00E2D28D /* BRMineCoinItemView.swift in Sources */,
BF692B132E0A7B9000A5C2DA /* BRUserInfo.swift in Sources */,
BF692B042E0A76D200A5C2DA /* BRLoginManager.swift in Sources */,
BFC6769D2E129794006659E5 /* BRHomeTop10ViewController.swift in Sources */,
BF02B80D2E2F63ED00172177 /* BRFavoritesCell.swift in Sources */,
BF692AEB2E0A475D00A5C2DA /* AppDelegate.swift in Sources */,
F39855372E33699900E2D28D /* BRStoreViewController.swift in Sources */,
BF02B81B2E2F8FDF00172177 /* BRMineUserInfoCell.swift in Sources */,
F398554C2E3392C200E2D28D /* BRStoreCoinSmallCell.swift in Sources */,
BF02B8202E2F9B1000172177 /* BRWebViewController.swift in Sources */,
BF692B242E0A825B00A5C2DA /* BRCryptorService.swift in Sources */,
BF02B8242E2FAEB500172177 /* BRAboutUsCell.swift in Sources */,
@ -1171,6 +1250,7 @@
BF692B782E0D3A1200A5C2DA /* BRHomeModuleItem.swift in Sources */,
BF692B5A2E0AAADD00A5C2DA /* BRPlayerListCell.swift in Sources */,
BF02B8312E30897700172177 /* BRSearchHomeView.swift in Sources */,
F398554A2E33929C00E2D28D /* BRStoreCoinCell.swift in Sources */,
BF3A568C2E30EBA2009E5CF9 /* BRHomePlayRecordButton.swift in Sources */,
BF692B162E0A7CD600A5C2DA /* BRHUD.swift in Sources */,
BF3338F72E16176900B10F76 /* BRDetailPlayerCell.swift in Sources */,
@ -1204,6 +1284,7 @@
BF02B7FF2E2F2F2900172177 /* BRHomeCategoriesCell.swift in Sources */,
BF692B3A2E0A8C6000A5C2DA /* BRViewController.swift in Sources */,
BFC676BE2E13A8EB006659E5 /* UIScrollView+BRRefresh.swift in Sources */,
F39855312E33620200E2D28D /* BRMineStoreCell.swift in Sources */,
BF692B182E0A7D8900A5C2DA /* BRToast.swift in Sources */,
BF692B0E2E0A7AF300A5C2DA /* UserDefaults+BRAdd.swift in Sources */,
BF02B8082E2F616E00172177 /* BRFavoritesViewController.swift in Sources */,
@ -1212,6 +1293,8 @@
BF692B1F2E0A804600A5C2DA /* BRLocalizedManager.swift in Sources */,
F39855222E32227D00E2D28D /* BRPlayHistorysViewController.swift in Sources */,
BF02B7E92E2E29E900172177 /* BREpisodeSelectorCell.swift in Sources */,
F39855462E338FDA00E2D28D /* BRStoreCoinView.swift in Sources */,
F398553B2E336C5700E2D28D /* BRStoreAPI.swift in Sources */,
BF02B83B2E30BB4C00172177 /* BRHotSearchView.swift in Sources */,
BF02B8332E308E4300172177 /* BRSearchRecordTagCell.swift in Sources */,
BF692B612E0B814F00A5C2DA /* BRTabBarItemContentView.swift in Sources */,
@ -1232,11 +1315,13 @@
F39855202E32166300E2D28D /* BRFavoritesPageViewController.swift in Sources */,
BF02B80F2E2F6EEA00172177 /* BRFavoritesHeaderView.swift in Sources */,
BF692B632E0B9D4800A5C2DA /* BRTabBarItem.swift in Sources */,
F39855402E336FD700E2D28D /* BRStoreVipView.swift in Sources */,
BFC6768B2E123690006659E5 /* BRVideoRevolutionManager.swift in Sources */,
BFC6768F2E125D5B006659E5 /* BRSpotlightTopMainCell.swift in Sources */,
BF692B1C2E0A7DE800A5C2DA /* BRAppTool.swift in Sources */,
BFC676622E0E2C8E006659E5 /* WMZBannerView.m in Sources */,
BFC676632E0E2C8E006659E5 /* WMZBannerOverLayout.m in Sources */,
F39855482E33928400E2D28D /* BRStoreCoinBigCell.swift in Sources */,
BFC676642E0E2C8E006659E5 /* WMZBannerFlowLayout.m in Sources */,
BF02B81E2E2F99D900172177 /* BRWebView.swift in Sources */,
BFC676652E0E2C8E006659E5 /* WMZBannerControl.m in Sources */,
@ -1256,6 +1341,7 @@
BF0DBDD12E0D4E150035F6B4 /* BRTabBar.swift in Sources */,
BF692B562E0AA92100A5C2DA /* BRCollectionViewCell.swift in Sources */,
BF02B7E32E2E08BD00172177 /* BRDetailEpButton.swift in Sources */,
F398553E2E336D3000E2D28D /* BRPayDateModel.swift in Sources */,
BF692B072E0A771C00A5C2DA /* BRModel.swift in Sources */,
BF02B82F2E30895700172177 /* BRSearchRecordView.swift in Sources */,
BF692B752E0D39D000A5C2DA /* BRListModel.swift in Sources */,
@ -1263,8 +1349,10 @@
BFC676B92E1385FC006659E5 /* BRPopularPicksSmallCell.swift in Sources */,
BF692B512E0AA8C600A5C2DA /* BRPlayerListViewController.swift in Sources */,
BF02B8282E30821B00172177 /* BRSearchViewController.swift in Sources */,
F39855422E3374B500E2D28D /* BRStoreVipCell.swift in Sources */,
BFC676522E0D4EFD006659E5 /* BRHomeViewModel.swift in Sources */,
BFC676A72E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift in Sources */,
F398552F2E33179800E2D28D /* BRMineVipCell.swift in Sources */,
BF692B2A2E0A84F700A5C2DA /* JXUUID.m in Sources */,
BF692B2B2E0A84F700A5C2DA /* PDKeyChain.m in Sources */,
BF3A56852E30CA78009E5CF9 /* BRSearchResultCell.swift in Sources */,

View File

@ -107,6 +107,10 @@ extension UIColor {
return UIColor(rgb: 0xE4FEFF, alpha: alpha)
}
static func colorE4FFF2(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xE4FFF2, alpha: alpha)
}
static func colorFFFDF1(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xFFFDF1, alpha: alpha)
}
@ -126,4 +130,60 @@ extension UIColor {
static func colorC2C2C2(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xC2C2C2, alpha: alpha)
}
static func color005C10(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x005C10, alpha: alpha)
}
static func color5C4A00(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x5C4A00, alpha: alpha)
}
static func color761600(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x761600, alpha: alpha)
}
static func color430069(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x430069, alpha: alpha)
}
static func color2C042C(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x2C042C, alpha: alpha)
}
static func color868686(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x868686, alpha: alpha)
}
static func colorFFF799(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xFFF799, alpha: alpha)
}
static func colorFBDAD0(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xFBDAD0, alpha: alpha)
}
static func colorF3D3FC(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xF3D3FC, alpha: alpha)
}
static func colorB45A00(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xB45A00, alpha: alpha)
}
static func color44703E(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x44703E, alpha: alpha)
}
static func color635D1B(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x635D1B, alpha: alpha)
}
static func colorA86800(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xA86800, alpha: alpha)
}
static func colorFFB635(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xFFB635, alpha: alpha)
}
}

View File

@ -21,4 +21,8 @@ extension UIFont {
static func fontBold(ofSize: CGFloat) -> UIFont {
return .systemFont(ofSize: ofSize, weight: .bold)
}
static func aaHouDiHei(ofSize: CGFloat) -> UIFont {
return UIFont(name: "AaHouDiHei", size: ofSize) ?? fontMedium(ofSize: ofSize)
}
}

View File

@ -0,0 +1,29 @@
//
// BRStoreAPI.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
import SmartCodable
class BRStoreAPI {
enum BuyType: String, SmartCaseDefaultable {
case coins = "coins"
case subVip = "sub_vip"
}
///
static func requestPayTemplate(isLoding: Bool = false, isToast: Bool = true, completer: ((_ model: BRPayDateModel?) -> Void)?) {
var param = BRNetworkParameters(path: "/paySettingsV3")
param.method = .get
param.isToast = isToast
param.isLoding = isLoding
BRNetwork.request(parameters: param) { (response: BRNetworkResponse<BRPayDateModel>) in
completer?(response.data)
}
}
}

View File

@ -37,3 +37,14 @@ let kSBFeedBackListWebUrl = BRCampaignWebURL + "/pages/leave/list"
let kSBFeedBackDetailWebUrl = BRCampaignWebURL + "/pages/leave/detail"
///
let kSBRewardsWebUrl = BRCampaignWebURL + "/pages/reward/theme4"
/*
https://www.breeltv.com/
https://www.breeltv.com/xxxxx
https://campaign.breeltv.com/pages/leave/index {theme:theme_1} {theme:theme_2}
......
https://admin-beereel.guyantv.com/
w2ahttps://w2a.breeltv.com/
w2a联调地址https://w2a.breeltv.com/?short_play_id=8&type=fb&id=168&pixel_id=123&adj_campaign={{campaign.name}}%20({{campaign.id}})&adj_adgroup={{adset.name}}%20({{adset.id}})&adj_creative={{ad.name}}%20({{ad.id}})
*/

View File

@ -15,6 +15,12 @@ class BRMineViewController: BRViewController {
[
BRMineItem(type: .userInfo),
],
[
BRMineItem(type: .vip),
],
[
BRMineItem(type: .store),
],
[
BRMineItem(type: .web, icon: UIImage(named: "mine_item_icon_01"), title: "Privacy Policy".localized, url: kSBPrivacyPolicyWebUrl),
// BRMineItem(type: .helpCenter, icon: UIImage(named: "mine_item_icon_02"), title: "Help Center".localized, url: ""),
@ -38,6 +44,8 @@ class BRMineViewController: BRViewController {
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.tabbarSafeBottomMargin + 10, right: 0)
tableView.register(BRMineCell.self, forCellReuseIdentifier: "cell")
tableView.register(BRMineUserInfoCell.self, forCellReuseIdentifier: "userInfo")
tableView.register(BRMineVipCell.self, forCellReuseIdentifier: "vip")
tableView.register(BRMineStoreCell.self, forCellReuseIdentifier: "store")
return tableView
}()
@ -103,6 +111,12 @@ extension BRMineViewController: UITableViewDelegate, UITableViewDataSource {
let cell = tableView.dequeueReusableCell(withIdentifier: "userInfo", for: indexPath) as! BRMineUserInfoCell
cell.userInfo = BRLoginManager.manager.userInfo
return cell
} else if item.type == .vip {
let cell = tableView.dequeueReusableCell(withIdentifier: "vip", for: indexPath) as! BRMineVipCell
return cell
} else if item.type == .store {
let cell = tableView.dequeueReusableCell(withIdentifier: "store", for: indexPath) as! BRMineStoreCell
return cell
}
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BRMineCell

View File

@ -14,6 +14,8 @@ class BRMineItem: BRModel {
case web
case helpCenter
case aboutUs
case vip
case store
}
var type: ItemType?

View File

@ -0,0 +1,84 @@
//
// BRMineCoinItemView.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRMineCoinItemView: UIView {
var title: String? {
didSet {
titleLabel.text = title
}
}
var coinCount: Int? {
didSet {
coinLabel.text = "\(coinCount ?? 0)"
}
}
private lazy var coinLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 15)
label.textColor = .color1C1C1C()
return label
}()
private lazy var coinImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "coins"))
return imageView
}()
private lazy var moreImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "arrow_right_icon_03"))
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .color777777()
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(coinLabel)
addSubview(coinImageView)
addSubview(moreImageView)
addSubview(titleLabel)
coinLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.centerY.equalTo(coinImageView)
}
coinImageView.snp.makeConstraints { make in
make.top.equalToSuperview()
make.left.equalTo(coinLabel.snp.right).offset(4)
}
moreImageView.snp.makeConstraints { make in
make.centerY.equalTo(coinImageView)
make.right.equalToSuperview()
make.left.equalTo(coinImageView.snp.right).offset(1)
}
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalTo(coinImageView.snp.bottom).offset(5)
make.bottom.equalToSuperview()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,66 @@
//
// BRMineStoreCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRMineStoreCell: BRTableViewCell {
private lazy var shortView: BRMineStoreItemView = {
let view = BRMineStoreItemView()
view.titleLabel.text = "Store".localized
view.subtitleLabel.text = "Unlock More".localized
view.imageView.image = UIImage(named: "Store")
view.addTarget(self, action: #selector(handleShortView), for: .touchUpInside)
return view
}()
private lazy var rewardsView: BRMineStoreItemView = {
let view = BRMineStoreItemView()
view.titleLabel.text = "Rewards".localized
view.subtitleLabel.text = "Daily Check-In".localized
view.imageView.image = UIImage(named: "Rewards")
view.addTarget(self, action: #selector(handleRewardsView), for: .touchUpInside)
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(shortView)
contentView.addSubview(rewardsView)
shortView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.bottom.equalToSuperview()
make.height.equalTo(60)
}
rewardsView.snp.makeConstraints { make in
make.right.top.bottom.equalToSuperview()
make.left.equalTo(shortView.snp.right).offset(11)
make.width.equalTo(shortView.snp.width)
}
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func handleShortView() {
let vc = BRStoreViewController()
self.viewController?.navigationController?.pushViewController(vc, animated: true)
}
@objc private func handleRewardsView() {
}
}

View File

@ -0,0 +1,62 @@
//
// BRMineStoreItemView.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRMineStoreItemView: UIControl {
private(set) lazy var imageView: UIImageView = {
let imageView = UIImageView()
return imageView
}()
private(set) lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 15)
label.textColor = .color000000()
return label
}()
private(set) lazy var subtitleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 10)
label.textColor = .color777777()
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .colorFFFFFF()
layer.cornerRadius = 10
layer.masksToBounds = true
addSubview(imageView)
addSubview(titleLabel)
addSubview(subtitleLabel)
imageView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
// make.width.height.equalTo(48)
make.left.equalToSuperview().offset(9)
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(imageView.snp.right).offset(10)
make.top.equalToSuperview().offset(13)
}
subtitleLabel.snp.makeConstraints { make in
make.left.equalTo(titleLabel)
make.top.equalTo(titleLabel.snp.bottom).offset(1)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -16,6 +16,9 @@ class BRMineUserInfoCell: BRTableViewCell {
nickLabel.text = userInfo?.family_name?.isEmpty != false ? "Visitor".localized : userInfo?.family_name
idLabel.text = "ID: \(userInfo?.customer_id ?? "")"
coinView.coinCount = userInfo?.coin_left_total ?? 0
donateView.coinCount = userInfo?.send_coin_left_total ?? 0
}
}
@ -53,6 +56,20 @@ class BRMineUserInfoCell: BRTableViewCell {
return label
}()
private lazy var coinView: BRMineCoinItemView = {
let view = BRMineCoinItemView()
view.title = "Coins".localized
view.coinCount = 0
return view
}()
private lazy var donateView: BRMineCoinItemView = {
let view = BRMineCoinItemView()
view.title = "Donate".localized
view.coinCount = 0
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
@ -73,12 +90,15 @@ extension BRMineUserInfoCell {
avatarBgView.addSubview(avatarImageView)
contentView.addSubview(nickLabel)
contentView.addSubview(idLabel)
contentView.addSubview(coinView)
contentView.addSubview(donateView)
avatarBgView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalToSuperview().offset(39)
make.width.height.equalTo(68)
make.bottom.equalToSuperview().offset(-6)
// make.bottom.equalToSuperview().offset(-6)
make.bottom.equalToSuperview().offset(-76)
}
avatarIconImageView.snp.makeConstraints { make in
@ -101,6 +121,16 @@ extension BRMineUserInfoCell {
make.left.equalTo(nickLabel)
make.bottom.equalTo(avatarBgView).offset(-13)
}
coinView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalTo(avatarBgView.snp.bottom).offset(23)
}
donateView.snp.makeConstraints { make in
make.top.equalTo(coinView)
make.left.equalTo(coinView.snp.right).offset(35)
}
}
}

View File

@ -0,0 +1,100 @@
//
// BRMineVipCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRMineVipCell: BRTableViewCell {
private lazy var bgView: UIView = {
let view = UIImageView(image: UIImage(named: "vip bg"))
return view
}()
private lazy var vipIconView: UIView = {
let view = UIImageView(image: UIImage(named: "Frame"))
return view
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorFFFFFF()
label.text = "VIP Unlocks All Dramas!".localized
return label
}()
private lazy var goView: UIView = {
let view = UIImageView(image: UIImage(named: "Frame 1508"))
return view
}()
private lazy var markView: UIView = {
let view = UIImageView(image: UIImage(named: "Rectangle 87"))
let label = UILabel()
label.font = .fontMedium(ofSize: 9)
label.textColor = .colorFFFFFF()
label.text = "SALE"
view.addSubview(label)
label.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(1)
}
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
br_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension BRMineVipCell {
private func br_setupUI() {
contentView.addSubview(bgView)
bgView.addSubview(vipIconView)
bgView.addSubview(titleLabel)
bgView.addSubview(goView)
contentView.addSubview(markView)
bgView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(4)
make.height.equalTo(52)
}
vipIconView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(12)
}
titleLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(vipIconView.snp.right).offset(5)
}
goView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalToSuperview().offset(-10)
}
markView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-15)
make.top.equalToSuperview()
}
}
}

View File

@ -0,0 +1,131 @@
//
// BRStoreViewController.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreViewController: BRViewController {
private var payData: BRPayDateModel?
private lazy var scrollView: BRScrollView = {
let scrollView = BRScrollView()
return scrollView
}()
private lazy var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 14
return stackView
}()
private lazy var vipView: BRStoreVipView = {
let view = BRStoreVipView()
return view
}()
private lazy var coinView: BRStoreCoinView = {
let view = BRStoreCoinView()
return view
}()
private lazy var tipView: UIView = {
let view = UIView()
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorD3D3D3()
label.numberOfLines = 0
label.text = "kStoreTipText".localized
view.addSubview(label)
label.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.bottom.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-15)
}
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Store".localized
self.statusBarStyle = .lightContent
self.view.backgroundColor = .color1C1C1C()
configNavigationBack("nav_back_icon_03")
br_setupUI()
requestPayData()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: true)
br_setNavigation(style: .dark)
}
}
extension BRStoreViewController {
private func br_setupUI() {
view.addSubview(scrollView)
scrollView.addSubview(stackView)
scrollView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
stackView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(10)
make.left.equalToSuperview()
make.width.equalTo(UIScreen.width)
make.bottom.equalToSuperview().offset(-(UIScreen.tabbarSafeBottomMargin + 10))
}
}
}
extension BRStoreViewController {
private func requestPayData() {
BRStoreAPI.requestPayTemplate { [weak self] model in
guard let self = self else { return }
guard let model = model else { return }
self.stackView.br_removeAllArrangedSubview()
self.payData = model
self.vipView.list = model.list_sub_vip ?? []
self.coinView.list = model.list_coins ?? []
if let sort = model.sort, sort.count > 0 {
sort.forEach {
if $0 == .vip, model.list_sub_vip?.isEmpty == false {
self.stackView.addArrangedSubview(self.vipView)
} else if $0 == .coin, model.list_coins?.isEmpty == false {
self.stackView.addArrangedSubview(self.coinView)
}
}
} else {
if model.list_sub_vip?.isEmpty == false {
self.stackView.addArrangedSubview(self.vipView)
}
if model.list_coins?.isEmpty == false {
self.stackView.addArrangedSubview(self.coinView)
}
}
self.stackView.addArrangedSubview(self.tipView)
}
}
}

View File

@ -0,0 +1,100 @@
//
// BRPayDateModel.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
import SmartCodable
class BRPayDateModel: BRModel, SmartCodable {
enum SortName: String, SmartCaseDefaultable {
case coin = "list_coins"
case vip = "list_sub_vip"
}
var list_coins: [BRPayItem]?
var list_sub_vip: [BRPayItem]?
var sort: [SortName]?
}
class BRPayItem: BRModel, SmartCodable {
enum VipTypeKey: String, SmartCaseDefaultable {
case week = "week"
case month = "month"
case quarter = "quarter"
case year = "year"
}
enum SizeType: String, SmartCaseDefaultable {
case big = "big"
case small = "small"
}
var id: String?
var status: String?
var price: String?
var origin_price: String?
var backhaul_price: String?
var coins: Int?
var send_coins: Int?
var buy_type: BRStoreAPI.BuyType?
var vip_type: String?
var vip_type_key: VipTypeKey?
var sort: String?
var sp_description: String?
var brief: String?
var title: String?
var send_coin_ttl: Int?
var size: SizeType?
var ios_template_id: String?
///
var corner_marker: String?
///
var platform: String?
///
var currency: String?
static func mappingForKey() -> [SmartKeyTransformer]? {
return [
CodingKeys.sp_description <--- ["description"]
]
}
func getTimeString() -> String? {
switch self.vip_type_key {
case .week:
return "week".localized
case .month:
return "month".localized
case .quarter:
return "quarter".localized
case .year:
return "year".localized
default:
return nil
}
}
}

View File

@ -0,0 +1,69 @@
//
// BRStoreCoinBigCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreCoinBigCell: BRStoreCoinCell {
override var item: BRPayItem? {
didSet {
if item?.corner_marker?.isEmpty == false {
self.hotView.isHidden = false
} else {
self.hotView.isHidden = true
}
}
}
lazy var hotView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "hot_icon_04"))
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
bgView.image = UIImage(named: "Frame 89")
coinLabel.font = .fontBold(ofSize: 20)
coinLabel.textColor = .color2C042C()
sendCoinLabel.textColor = .colorB45A00()
sendCoinLabel.font = .fontMedium(ofSize: 14)
unitLabel.textColor = .colorA86800()
unitLabel.font = .fontMedium(ofSize: 14).withBoldItalic()
priceLabel.textColor = .colorA86800()
priceLabel.font = .fontBold(ofSize: 20).withBoldItalic()
sendRatioBgView.backgroundColor = .colorFFB635()
bgView.addSubview(hotView)
hotView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-5)
make.top.equalToSuperview().offset(4)
}
coinBgView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(9)
make.top.equalToSuperview().offset(27)
}
sendCoinLabel.snp.makeConstraints { make in
make.centerY.equalTo(coinBgView)
make.left.equalTo(coinBgView.snp.right).offset(4)
}
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,150 @@
//
// BRStoreCoinCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreCoinCell: BRCollectionViewCell {
var item: BRPayItem? {
didSet {
coinLabel.text = "\(item?.coins ?? 0)"
if let sendCoins = item?.send_coins, sendCoins > 0, let coins = item?.coins {
sendCoinLabel.isHidden = false
sendRatioBgView.isHidden = false
sendCoinLabel.text = "+\(sendCoins)"
let ratio = String(format: "%.0f", CGFloat(sendCoins) / CGFloat(coins) * 100)
sendRatioLabel.text = "+\(ratio)%"
} else {
sendCoinLabel.isHidden = true
sendRatioBgView.isHidden = true
}
unitLabel.text = item?.currency
priceLabel.text = item?.price
}
}
private(set) lazy var bgView: UIImageView = {
let view = UIImageView()
return view
}()
lazy var coinBgView: UIView = {
let view = UIView()
return view
}()
private lazy var coinIconView: UIView = {
let view = UIImageView(image: UIImage(named: "coins"))
return view
}()
lazy var coinLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var sendCoinLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var priceBgView: UIView = {
let view = UIView()
return view
}()
lazy var unitLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var priceLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var sendRatioBgView: UIView = {
let view = UIView()
view.br_setRoundedCorner(topLeft: 10, topRight: 0, bottomLeft: 0, bottomRight: 10)
return view
}()
lazy var sendRatioLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 10)
label.textColor = .colorFFFFFF()
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
contentView.addSubview(bgView)
bgView.addSubview(coinBgView)
coinBgView.addSubview(coinIconView)
coinBgView.addSubview(coinLabel)
bgView.addSubview(sendCoinLabel)
bgView.addSubview(priceBgView)
priceBgView.addSubview(unitLabel)
priceBgView.addSubview(priceLabel)
bgView.addSubview(sendRatioBgView)
sendRatioBgView.addSubview(sendRatioLabel)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
coinIconView.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview()
}
coinLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(coinIconView.snp.right).offset(4)
make.right.equalToSuperview()
}
priceBgView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.bottom.equalToSuperview()
make.height.equalTo(24)
}
unitLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.centerY.equalToSuperview().offset(1)
}
priceLabel.snp.makeConstraints { make in
make.left.equalTo(unitLabel.snp.right).offset(0)
make.centerY.equalToSuperview()
make.right.equalToSuperview()
}
sendRatioBgView.snp.makeConstraints { make in
make.left.top.equalToSuperview()
make.height.equalTo(16)
}
sendRatioLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(8)
make.right.equalToSuperview().offset(-8)
}
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,46 @@
//
// BRStoreCoinSmallCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreCoinSmallCell: BRStoreCoinCell {
override init(frame: CGRect) {
super.init(frame: frame)
bgView.image = UIImage(named: "Frame 1517")
coinLabel.font = .fontMedium(ofSize: 20)
coinLabel.textColor = .color2C042C()
sendCoinLabel.textColor = .color44703E()
sendCoinLabel.font = .fontMedium(ofSize: 12)
unitLabel.textColor = .color635D1B()
unitLabel.font = .fontMedium(ofSize: 12).withBoldItalic()
priceLabel.textColor = .color635D1B()
priceLabel.font = .fontBold(ofSize: 16).withBoldItalic()
sendRatioBgView.backgroundColor = .color44703E()
coinBgView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(23)
}
sendCoinLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(coinBgView.snp.bottom).offset(2)
}
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,176 @@
//
// BRStoreCoinView.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreCoinView: UIView {
var list: [BRPayItem] = [] {
didSet {
var bigList: [BRPayItem] = []
var smallList: [BRPayItem] = []
list.forEach {
if $0.size == .big {
bigList.append($0)
} else {
smallList.append($0)
}
}
self.newList = [bigList, smallList]
self.collectionView.reloadData()
}
}
private var newList: [[BRPayItem]] = []
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textColor = .colorFFFFFF()
label.font = .fontMedium(ofSize: 14)
label.text = "kCoinTipText".localized
return label
}()
private lazy var collectionViewLayout: WaterfallMutiSectionFlowLayout = {
let layout = WaterfallMutiSectionFlowLayout()
layout.delegate = self
return layout
}()
private lazy var collectionView: BRCollectionView = {
let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.showsVerticalScrollIndicator = false
collectionView.showsHorizontalScrollIndicator = false
collectionView.layer.masksToBounds = false
collectionView.addObserver(self, forKeyPath: "contentSize", context: nil)
collectionView.register(BRStoreCoinBigCell.self, forCellWithReuseIdentifier: "big")
collectionView.register(BRStoreCoinSmallCell.self, forCellWithReuseIdentifier: "small")
return collectionView
}()
deinit {
collectionView.removeObserver(self, forKeyPath: "contentSize")
}
override init(frame: CGRect) {
super.init(frame: frame)
br_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
collectionView.snp.updateConstraints { make in
make.height.equalTo(height + 1)
}
}
}
}
extension BRStoreCoinView {
private func br_setupUI() {
addSubview(titleLabel)
addSubview(collectionView)
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalToSuperview()
}
collectionView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(19)
make.height.equalTo(1)
}
}
}
//MARK: UICollectionViewDelegate UICollectionViewDataSource
extension BRStoreCoinView: UICollectionViewDelegate, UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
self.newList.count
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
self.newList[section].count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let item = self.newList[indexPath.section][indexPath.row]
let identifier: String
if item.size == .big {
identifier = "big"
} else {
identifier = "small"
}
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! BRStoreCoinCell
cell.item = item
return cell
}
}
//MARK: WaterfallMutiSectionDelegate
extension BRStoreCoinView: WaterfallMutiSectionDelegate {
func heightForRowAtIndexPath(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, indexPath: IndexPath, itemWidth: CGFloat) -> CGFloat {
let item = self.newList[indexPath.section].first
if item?.size == .big {
return 80
} else {
return 90
}
}
func columnNumber(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> Int {
let item = self.newList[section].first
if item?.size == .big {
return 2
} else {
return 3
}
}
func insetForSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> UIEdgeInsets {
return .init(top: 0, left: 15, bottom: 0, right: 15)
}
func lineSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 10
}
func interitemSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 10
}
func spacingWithLastSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 10
}
}

View File

@ -0,0 +1,216 @@
//
// BRStoreVipCell.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreVipCell: BRCollectionViewCell {
var item: BRPayItem? {
didSet {
vipNameLabel.text = item?.title
unitLabel.text = item?.currency
priceLabel.text = item?.price
timeLabel.text = "/\(item?.getTimeString() ?? "")"
descLabel.text = item?.sp_description
if let coins = item?.send_coins, coins > 0 {
coinLabel.text = "+Extra".localized + " \(coins)"
coinBgView.isHidden = false
} else {
coinBgView.isHidden = true
}
switch item?.vip_type_key {
case .week:
bgView.image = UIImage(named: "Rectangle 89")
bgIconView.image = UIImage(named: "vip-week")
vipIconView.image = UIImage(named: "")
vipNameLabel.textColor = .color005C10()
coinBgView.backgroundColor = .colorE4FFF2()
case .month:
bgView.image = UIImage(named: "Rectangle 90")
bgIconView.image = UIImage(named: "vip-month")
vipIconView.image = UIImage(named: "")
vipNameLabel.textColor = .color5C4A00()
coinBgView.backgroundColor = .colorFFF799()
case .quarter:
bgView.image = UIImage(named: "Rectangle 91")
bgIconView.image = UIImage(named: "vip-quarter")
vipIconView.image = UIImage(named: "Frame 1")
vipNameLabel.textColor = .color761600()
coinBgView.backgroundColor = .colorFBDAD0()
case .year:
bgView.image = UIImage(named: "Rectangle 92")
bgIconView.image = UIImage(named: "vip-year")
vipIconView.image = UIImage(named: "Frame 2")
vipNameLabel.textColor = .color430069()
coinBgView.backgroundColor = .colorF3D3FC()
default:
break
}
coinLabel.textColor = vipNameLabel.textColor
}
}
private lazy var bgView: UIImageView = {
let view = UIImageView()
return view
}()
private lazy var bgIconView: UIImageView = {
let view = UIImageView()
return view
}()
private lazy var vipIconView: UIImageView = {
let view = UIImageView()
return view
}()
private lazy var vipNameLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 12)
return label
}()
private lazy var unitLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 16)
label.textColor = .color2C042C()
return label
}()
private lazy var priceLabel: UILabel = {
let label = UILabel()
label.font = .aaHouDiHei(ofSize: 28)
label.textColor = .color2C042C()
return label
}()
private lazy var timeLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 14)
label.textColor = .color2C042C()
return label
}()
private lazy var descLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 10)
label.textColor = .color868686()
return label
}()
private lazy var coinBgView: UIView = {
let view = UIView()
view.br_setRoundedCorner(topLeft: 10, topRight: 0, bottomLeft: 0, bottomRight: 10)
return view
}()
private lazy var coinLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
return label
}()
private lazy var coinIconView: UIImageView = {
let view = UIImageView(image: UIImage(named: "coins 1"))
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
br_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension BRStoreVipCell {
private func br_setupUI() {
contentView.addSubview(bgView)
contentView.addSubview(bgIconView)
bgView.addSubview(vipIconView)
bgView.addSubview(vipNameLabel)
bgView.addSubview(unitLabel)
bgView.addSubview(priceLabel)
bgView.addSubview(timeLabel)
bgView.addSubview(descLabel)
bgView.addSubview(coinBgView)
coinBgView.addSubview(coinLabel)
coinBgView.addSubview(coinIconView)
bgView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(10)
}
bgIconView.snp.makeConstraints { make in
make.top.equalToSuperview()
make.right.equalToSuperview().offset(-2)
}
vipIconView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(11)
make.top.equalToSuperview().offset(8)
}
vipNameLabel.snp.makeConstraints { make in
make.centerY.equalTo(vipIconView)
make.left.equalTo(vipIconView.snp.right).offset(3)
}
unitLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(13)
make.top.equalToSuperview().offset(37)
}
priceLabel.snp.makeConstraints { make in
make.left.equalTo(unitLabel.snp.right).offset(1)
make.bottom.equalTo(unitLabel).offset(5)
}
timeLabel.snp.makeConstraints { make in
make.left.equalTo(priceLabel.snp.right).offset(1)
make.bottom.equalTo(unitLabel).offset(-2)
}
descLabel.snp.makeConstraints { make in
make.left.equalTo(unitLabel)
make.bottom.equalToSuperview().offset(-15)
}
coinBgView.snp.makeConstraints { make in
make.right.bottom.equalToSuperview()
make.height.equalTo(20)
}
coinLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(9)
make.centerY.equalToSuperview()
}
coinIconView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(coinLabel.snp.right).offset(3)
make.right.equalToSuperview().offset(-6)
}
}
}

View File

@ -0,0 +1,103 @@
//
// BRStoreVipView.swift
// BeeReel
//
// Created by 鸿 on 2025/7/25.
//
import UIKit
class BRStoreVipView: UIView {
var list: [BRPayItem] = [] {
didSet {
self.collectionView.reloadData()
}
}
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textColor = .colorFFFFFF()
label.font = .fontMedium(ofSize: 14)
label.text = "kVipTipText".localized
return label
}()
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let layout = UICollectionViewFlowLayout()
layout.itemSize = .init(width: UIScreen.width - 30, height: 100)
layout.minimumLineSpacing = 5
layout.minimumInteritemSpacing = 5
return layout
}()
private lazy var collectionView: BRCollectionView = {
let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
collectionView.isScrollEnabled = false
collectionView.delegate = self
collectionView.dataSource = self
collectionView.addObserver(self, forKeyPath: "contentSize", context: nil)
collectionView.register(BRStoreVipCell.self, forCellWithReuseIdentifier: "cell")
return collectionView
}()
deinit {
collectionView.removeObserver(self, forKeyPath: "contentSize")
}
override init(frame: CGRect) {
super.init(frame: frame)
br_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
collectionView.snp.updateConstraints { make in
make.height.equalTo(height + 1)
}
}
}
}
extension BRStoreVipView {
private func br_setupUI() {
addSubview(titleLabel)
addSubview(collectionView)
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalToSuperview()
}
collectionView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(19)
make.height.equalTo(1)
}
}
}
//MARK: UICollectionViewDelegate UICollectionViewDataSource
extension BRStoreVipView: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
self.list.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRStoreVipCell
cell.item = list[indexPath.row]
return cell
}
}

Binary file not shown.

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "GleeStream 1.png",
"filename" : "GleeStream 1.jpg",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 1508@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 1508@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 1517@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 1517@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 89@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 89@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rectangle 87@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rectangle 87@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rectangle 89@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rectangle 89@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rectangle 89@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rectangle 89@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rectangle 89@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rectangle 89@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rectangle 89@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rectangle 89@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Rewards@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Rewards@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Store@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Store@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "coins@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "coins@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "coins@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "coins@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,25 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Component 46@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Component 46@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "original"
}
}

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "vip bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "vip-month@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip-month@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "vip-quarter@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip-quarter@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "vip-week@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip-week@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "vip-year@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip-year@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string>AaHouDiHei-Regular.ttf</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>

View File

@ -1,6 +1,17 @@
{
"sourceLanguage" : "en",
"strings" : {
"+Extra" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "+Extra"
}
}
}
},
"About Us" : {
"extractionState" : "manual",
"localizations" : {
@ -89,6 +100,17 @@
}
}
},
"Daily Check-In" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Daily Check-In"
}
}
}
},
"EP.##" : {
"extractionState" : "manual",
"localizations" : {
@ -166,6 +188,17 @@
}
}
},
"kCoinTipText" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stock Coins | Binge Freely"
}
}
}
},
"kNormalRmptyDetail" : {
"extractionState" : "manual",
"localizations" : {
@ -232,6 +265,28 @@
}
}
},
"kStoreTipText" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Coins are virtual items and cannot be refunded. Use it for this product. \n\n2. Gold coins will never expire, the reward coins will expire 24 hours a day.\n\r\n3. Coins will be used first when unlocking episodes. If the amount is insufficient, reward coins will automatically be used. \n\r\n4. The purchase has not been credited, click <Restore> torefresh. \n\r\n5. For other questions, contact us via Profile>Help &feedback."
}
}
}
},
"kVipTipText" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go VIP | Auto renew, cancel anytime "
}
}
}
},
"Last Searched" : {
"extractionState" : "manual",
"localizations" : {
@ -243,6 +298,17 @@
}
}
},
"month" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "month"
}
}
}
},
"Most Searched" : {
"extractionState" : "manual",
"localizations" : {
@ -287,6 +353,17 @@
}
}
},
"quarter" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "quarter"
}
}
}
},
"Remove" : {
"extractionState" : "manual",
"localizations" : {
@ -298,6 +375,17 @@
}
}
},
"Rewards" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rewards"
}
}
}
},
"Search Results" : {
"extractionState" : "manual",
"localizations" : {
@ -331,6 +419,17 @@
}
}
},
"Store" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Store"
}
}
}
},
"Third-party information sharing list" : {
"extractionState" : "manual",
"localizations" : {
@ -364,6 +463,17 @@
}
}
},
"Unlock More" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unlock More"
}
}
}
},
"User Agreement" : {
"extractionState" : "manual",
"localizations" : {
@ -375,6 +485,17 @@
}
}
},
"VIP Unlocks All Dramas!" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "VIP Unlocks All Dramas!"
}
}
}
},
"Visitor" : {
"extractionState" : "manual",
"localizations" : {
@ -386,6 +507,28 @@
}
}
},
"week" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "week"
}
}
}
},
"year" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "year"
}
}
}
},
"Youth Internet Civility Convention" : {
"extractionState" : "manual",
"localizations" : {