diff --git a/MoviaBox/Base/Extension/UIColor+SPAdd.swift b/MoviaBox/Base/Extension/UIColor+SPAdd.swift index a516a76..8e89a61 100644 --- a/MoviaBox/Base/Extension/UIColor+SPAdd.swift +++ b/MoviaBox/Base/Extension/UIColor+SPAdd.swift @@ -364,5 +364,21 @@ extension UIColor { static func colorFF8E33(alpha: CGFloat = 1) -> UIColor { return color(hex: 0xFF8E33, alpha: alpha) } + + static func colorB2B2B2(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xB2B2B2, alpha: alpha) + } + + static func color8B8B8B(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0x8B8B8B, alpha: alpha) + } + + static func color272A30(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0x272A30, alpha: alpha) + } + + static func colorFF1F1F(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xFF1F1F, alpha: alpha) + } } diff --git a/MoviaBox/Base/Networking/API/SPUserAPI.swift b/MoviaBox/Base/Networking/API/SPUserAPI.swift index d991377..1976cc7 100644 --- a/MoviaBox/Base/Networking/API/SPUserAPI.swift +++ b/MoviaBox/Base/Networking/API/SPUserAPI.swift @@ -9,7 +9,7 @@ import UIKit class SPUserAPI: NSObject { - + ///获取用户信息 static func requestUserInfo(completer: ((_ userInfo: SPUserInfo?) -> Void)?) { var param = SPNetworkParameters(path: "/customer/info") @@ -20,4 +20,19 @@ class SPUserAPI: NSObject { } } + ///注销账户 + static func requestLogoff(completer: ((_ isFinish: Bool) -> Void)?) { + var param = SPNetworkParameters(path: "/customer/logoff") + param.isLoding = true + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + if response.code == SPNetworkCodeSucceed { + completer?(true) + } else { + completer?(false) + } + } + } + + } diff --git a/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift b/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift new file mode 100644 index 0000000..c763c61 --- /dev/null +++ b/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift @@ -0,0 +1,175 @@ +// +// SPDeleteAccountViewController.swift +// MoviaBox +// +// Created by 佳尔 on 2025/4/29. +// + +import UIKit + +class SPDeleteAccountViewController: SPViewController { + + + private lazy var imageArr: [UIImage] = { + let arr = [ + UIImage(named: "delete_account_image_01")!, + UIImage(named: "delete_account_image_02")!, + UIImage(named: "delete_account_image_03")!, + UIImage(named: "delete_account_image_04")!, + ] + return arr + }() + + private lazy var imageViewArr: [UIImageView] = [] + + //MARK: UI属性 + private lazy var scrollView: SPScrollView = { + let scrollView = SPScrollView() + return scrollView + }() + + private lazy var lineView: UIView = { + let view = UIView() + view.backgroundColor = .colorFFFFFF(alpha: 0.25) + return view + }() + + private lazy var checkButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "check_icon_01"), for: .normal) + button.setImage(UIImage(named: "check_icon_01_selected"), for: .selected) + button.setImage(UIImage(named: "check_icon_01_selected"), for: [.selected, .highlighted]) + button.addTarget(self, action: #selector(handleCheckButton), for: .touchUpInside) + return button + }() + + private lazy var checkLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 14) + label.textColor = .colorFFFFFF() + label.numberOfLines = 0 + label.text = "kDeleteAccountCheckText".localized + return label + }() + + private lazy var deleteButton: UIButton = { + let button = UIButton(type: .custom) + button.setTitle("Delete Account".localized, for: .normal) + button.setTitleColor(.color8B8B8B(), for: .disabled) + button.setTitleColor(.colorFFFFFF(), for: .normal) + button.setBackgroundImage(UIImage(color: .color272A30()), for: .disabled) + button.setBackgroundImage(UIImage(color: .colorFF1F1F()), for: .normal) + button.titleLabel?.font = .fontMedium(ofSize: 14) + button.layer.cornerRadius = 18 + button.layer.masksToBounds = true + button.isEnabled = false + button.addTarget(self, action: #selector(handleDeleteButton), for: .touchUpInside) + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "Account Deletion".localized + + setBackgroundView(isShowGradient: false, bgImage: nil) + + _setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + setNavigationNormalStyle() + } + + + +} + +extension SPDeleteAccountViewController { + + @objc private func handleCheckButton() { + self.checkButton.isSelected = !self.checkButton.isSelected + + self.deleteButton.isEnabled = self.checkButton.isSelected + } + + @objc private func handleDeleteButton() { + SPUserAPI.requestLogoff { isFinish in + + + } + } + +} + +extension SPDeleteAccountViewController { + + private func _setupUI() { + view.addSubview(scrollView) + scrollView.addSubview(lineView) + scrollView.addSubview(checkButton) + scrollView.addSubview(checkLabel) + scrollView.addSubview(deleteButton) + + imageArr.forEach { + let imageSize = $0.size + + let imageView = UIImageView(image: $0) + scrollView.addSubview(imageView) + + if let lastImageView = self.imageViewArr.last { + let width = kSPScreenWidth - 32 + let height = imageSize.height / imageSize.width * width + + imageView.snp.makeConstraints { make in + make.top.equalTo(lastImageView.snp.bottom).offset(18) + make.width.equalTo(width) + make.height.equalTo(height) + make.centerX.equalToSuperview() + } + } else { + imageView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(10) + make.width.equalTo(kSPMainW(imageSize.width)) + make.height.equalTo(kSPMainW(imageSize.height)) + make.centerX.equalToSuperview() + } + } + self.imageViewArr.append(imageView) + } + + + scrollView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + lineView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.width.equalTo(kSPScreenWidth - 32) + make.top.equalTo(self.imageViewArr.last!.snp.bottom).offset(18) + make.height.equalTo(1) + + } + + checkButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalTo(lineView.snp.bottom).offset(18) + } + + checkLabel.snp.makeConstraints { make in + make.left.equalTo(checkButton.snp.right).offset(10) +// make.right.lessThanOrEqualToSuperview().offset(-16) + make.right.lessThanOrEqualTo(lineView) + make.top.equalTo(checkButton).offset(2) + } + + deleteButton.snp.makeConstraints { make in + make.left.right.equalTo(lineView) + make.top.equalTo(checkLabel.snp.bottom).offset(18) + make.height.equalTo(36) + make.bottom.equalToSuperview().offset(-(kSPTabbarSafeBottomMargin + 15)) + } + } + +} diff --git a/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift b/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift index 75118f5..b3ae676 100644 --- a/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift +++ b/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift @@ -8,7 +8,15 @@ import UIKit class SPSettingsViewController: SPViewController { - + + private lazy var dataArr: [SPMineItem] = createDataArr() { + didSet { + self.tableView.reloadData() + } + } + + + //MARK: UI属性 private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .insetGrouped) @@ -25,6 +33,12 @@ class SPSettingsViewController: SPViewController { super.viewDidLoad() self.setBackgroundView(isShowGradient: false, bgImage: nil) self.title = "Settings".localized + + SPAppCacheManager.manager.getAllCache { [weak self] value in + guard let self = self else { return } + self.dataArr = self.createDataArr() + } + _setupUI() } @@ -54,6 +68,7 @@ extension SPSettingsViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = SPSettingsCell.dequeueReusableCell(tableView: tableView, indexPath: indexPath) + cell.item = dataArr[indexPath.section] return cell } @@ -62,7 +77,7 @@ extension SPSettingsViewController: UITableViewDelegate, UITableViewDataSource { } func numberOfSections(in tableView: UITableView) -> Int { - return 5 + return self.dataArr.count } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { @@ -73,4 +88,48 @@ extension SPSettingsViewController: UITableViewDelegate, UITableViewDataSource { return 0 } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let item = dataArr[indexPath.section] + + switch item.type { + case .aboutUs: + let vc = SPAboutUsViewController() + self.navigationController?.pushViewController(vc, animated: true) + + case .clearCache: + clearCache() + + case .deleteAccount: + let vc = SPDeleteAccountViewController() + self.navigationController?.pushViewController(vc, animated: true) + + default: + break + } + + } + } + + +extension SPSettingsViewController { + + private func clearCache() { + SPAppCacheManager.manager.cleanAllCache { [weak self] in + guard let self = self else { return } + self.dataArr = self.createDataArr() + } + } + + private func createDataArr() -> [SPMineItem] { + let cache = SPAppCacheManager.manager.allCache + + let arr = [ + SPMineItem(type: .clearCache, title: "Clear Cache".localized, subtitle: SPAppCacheManager.cacheToString(cache: cache)), + SPMineItem(type: .aboutUs, title: "About Us".localized), + SPMineItem(type: .deleteAccount, title: "Delete Account".localized), + ] + return arr + } +} + diff --git a/MoviaBox/Class/Mine/Model/SPMineItem.swift b/MoviaBox/Class/Mine/Model/SPMineItem.swift index b4c5029..63a1d5f 100644 --- a/MoviaBox/Class/Mine/Model/SPMineItem.swift +++ b/MoviaBox/Class/Mine/Model/SPMineItem.swift @@ -39,12 +39,17 @@ struct SPMineItem { case purchaseRecords ///赠币记录 case rewardCoins + ///清理缓存 + case clearCache + ///注销账户 + case deleteAccount } var type: ItemType? var iconImage: UIImage? var title: String? + var subtitle: String? } diff --git a/MoviaBox/Class/Mine/View/SPSettingsCell.swift b/MoviaBox/Class/Mine/View/SPSettingsCell.swift index ecaf6ab..aa82559 100644 --- a/MoviaBox/Class/Mine/View/SPSettingsCell.swift +++ b/MoviaBox/Class/Mine/View/SPSettingsCell.swift @@ -9,15 +9,64 @@ import UIKit class SPSettingsCell: SPTableViewCell { + var item: SPMineItem? { + didSet { + titleLabel.text = item?.title + + if let subtitle = item?.subtitle { + subtitleLabel.text = subtitle + showIndicator = false + subtitleLabel.isHidden = false + } else { + showIndicator = true + subtitleLabel.isHidden = true + } + } + } + //MARK: UI属性 + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 14) + label.textColor = .colorFFFFFF() + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 14) + label.textColor = .colorB2B2B2() + return label + }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.contentView.backgroundColor = .color202531() + self.showIndicator = true + _setupUI() } @MainActor required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } + +extension SPSettingsCell { + private func _setupUI() { + contentView.addSubview(titleLabel) + contentView.addSubview(subtitleLabel) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.centerY.equalToSuperview() + } + + subtitleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-16) + } + + } + +} diff --git a/MoviaBox/Libs/Cache/SPAppCacheManager.swift b/MoviaBox/Libs/Cache/SPAppCacheManager.swift new file mode 100644 index 0000000..6462b71 --- /dev/null +++ b/MoviaBox/Libs/Cache/SPAppCacheManager.swift @@ -0,0 +1,113 @@ +// +// SPAppCacheManager.swift +// MoviaBox +// +// Created by 佳尔 on 2025/4/29. +// + +import UIKit +import Kingfisher + +class SPAppCacheManager: NSObject { + + static let manager = SPAppCacheManager() + + private(set) var imageCache: Double = 0 + private(set) var videoCache: Double = 0 + var allCache: Double { + return imageCache + videoCache + } + + private var group = DispatchGroup() + + ///获取全部缓存 + func getAllCache(completer: ((_ value: Double) -> Void)?) { + + self.group.enter() + getImageCache { [weak self] value in + guard let self = self else { return } + self.group.leave() + } + + self.group.enter() + getVideoCache { [weak self] value in + guard let self = self else { return } + self.group.leave() + } + + self.group.notify(queue: DispatchQueue.main) { [weak self] in + guard let self = self else { return } + completer?(self.imageCache + self.videoCache) + } + } + + ///清理全部缓存 + func cleanAllCache(completer: (() -> Void)?) { + self.group.enter() + cleanImageCache { [weak self] in + self?.group.leave() + } + self.group.enter() + cleanVideoCache { [weak self] in + self?.group.leave() + } + + self.group.notify(queue: DispatchQueue.main) { [weak self] in + guard let self = self else { return } + completer?() + } + } + + ///获取图片缓存 + func getImageCache(completer: ((_ value: Double) -> Void)?) { + ImageCache.default.calculateDiskStorageSize { [weak self] result in + guard let self = self else { return } + switch result { + case .success(let value): + self.imageCache = Double(value) + default: + self.imageCache = 0 + break + } + completer?(self.imageCache) + } + } + + ///获取视频缓存 + func getVideoCache(completer: ((_ value: Double) -> Void)?) { + self.videoCache = Double(KTVHTTPCache.cacheTotalCacheLength()) + completer?(self.videoCache) + } + + ///清理图片缓存 + func cleanImageCache(completer: (() -> Void)?) { + DispatchQueue.global().async { + ImageCache.default.clearDiskCache { + self.imageCache = 0 + completer?() + } + } + } + + ///清理视频缓存 + func cleanVideoCache(completer: (() -> Void)?) { + KTVHTTPCache.cacheDeleteAllCaches() + self.videoCache = 0 + completer?() + } + + +} + +extension SPAppCacheManager { + + static func cacheToString(cache: Double) -> String { + let size = cache / 1024 / 1024 + if size > 100 { + return String(format: "%.0fM", size) + } else { + return String(format: "%.2fM", size) + } + } + +} diff --git a/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json new file mode 100644 index 0000000..7978ebd --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse 45@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse 45@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@2x.png b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@2x.png new file mode 100644 index 0000000..e9f12f4 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@3x.png b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@3x.png new file mode 100644 index 0000000..af7f56e Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01.imageset/Ellipse 45@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json new file mode 100644 index 0000000..6a4d508 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.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/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@2x.png b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@2x.png new file mode 100644 index 0000000..b6076f1 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@3x.png b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@3x.png new file mode 100644 index 0000000..093133f Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Vector@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Contents.json new file mode 100644 index 0000000..1eec423 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 481@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 481@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@2x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@2x.png new file mode 100644 index 0000000..0c7a15a Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@3x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@3x.png new file mode 100644 index 0000000..9126130 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_01.imageset/Group 481@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Contents.json new file mode 100644 index 0000000..77fe460 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 477@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 477@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@2x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@2x.png new file mode 100644 index 0000000..e966629 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@3x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@3x.png new file mode 100644 index 0000000..41785a7 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_02.imageset/Group 477@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Contents.json new file mode 100644 index 0000000..9ac9892 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 476@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 476@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@2x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@2x.png new file mode 100644 index 0000000..30d9277 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@3x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@3x.png new file mode 100644 index 0000000..e77da81 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_03.imageset/Group 476@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Contents.json new file mode 100644 index 0000000..0fb2866 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 478@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 478@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@2x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@2x.png new file mode 100644 index 0000000..96425ad Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@3x.png b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@3x.png new file mode 100644 index 0000000..b57c67e Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/delete_account_image_04.imageset/Group 478@3x.png differ diff --git a/MoviaBox/Source/en.lproj/Localizable.strings b/MoviaBox/Source/en.lproj/Localizable.strings index 4dd28a6..2ce907e 100644 --- a/MoviaBox/Source/en.lproj/Localizable.strings +++ b/MoviaBox/Source/en.lproj/Localizable.strings @@ -69,10 +69,14 @@ "Membership" = "Membership"; "%@ Bonus" = "%@ Bonus"; "+ Extra %@" = "+ Extra %@"; +"Clear Cache" = "Clear Cache"; +"Delete Account" = "Delete Account"; +"Account Deletion" = "Account Deletion"; "kLoginAgreementText" = "By continuing, you agree to the User Agreement and Privacy Policy"; "kBuyMemberTipText" = "Auto renew · Cancel anytime"; "kStoreTipTitle" = "Related terms and conditions:"; "kStoreTipText" = "1. Coins can only be used within this application.
2. Payment: The purchase will be charged to your iTunes account. 
3. Renewal: Your Apple iTunes account will be charged within 24 hours before the expiration and the subscription period will be extended for another subscription cycle upon successful deduction.
4. Cancellation: To cancel the subscription renewal, please turn off the automatic renewal function in the iTunes/Apple ID settings at least 24 hours before the current subscription period expires. If canceled within the last 24 hours before expiration, a subscription fee will still be charged. 
5. Payment successful but recharge not taking effect for an extended period? Click here to refresh or send an email to: cs.jiaer.developer@icloud.com. 
6. Manage your subscriptions: You can view, change, or cancel your subscriptions. 

Terms of Service | Privacy Policy 
Renewal Agreement"; +"kDeleteAccountCheckText" = "I accept the deletion risk and agree to delete my account";