diff --git a/BeeReel.xcodeproj/project.pbxproj b/BeeReel.xcodeproj/project.pbxproj index 7fe2690..d8c640b 100644 --- a/BeeReel.xcodeproj/project.pbxproj +++ b/BeeReel.xcodeproj/project.pbxproj @@ -155,6 +155,9 @@ F39855202E32166300E2D28D /* BRFavoritesPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F398551F2E32166300E2D28D /* BRFavoritesPageViewController.swift */; }; F39855222E32227D00E2D28D /* BRPlayHistorysViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855212E32227D00E2D28D /* BRPlayHistorysViewController.swift */; }; F39855242E3222BE00E2D28D /* BRPlayHistorysCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39855232E3222BE00E2D28D /* BRPlayHistorysCell.swift */; }; + 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 */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -321,6 +324,9 @@ F398551F2E32166300E2D28D /* BRFavoritesPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRFavoritesPageViewController.swift; sourceTree = ""; }; F39855212E32227D00E2D28D /* BRPlayHistorysViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayHistorysViewController.swift; sourceTree = ""; }; F39855232E3222BE00E2D28D /* BRPlayHistorysCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayHistorysCell.swift; sourceTree = ""; }; + F39855262E322A7100E2D28D /* BRBaseAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRBaseAlert.swift; sourceTree = ""; }; + F39855282E322B1800E2D28D /* BRAlertWindowManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAlertWindowManager.swift; sourceTree = ""; }; + F398552A2E322C7C00E2D28D /* BRAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAlert.swift; sourceTree = ""; }; 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 = ""; }; /* End PBXFileReference section */ @@ -599,6 +605,7 @@ BF692AF62E0A480000A5C2DA /* Lib */ = { isa = PBXGroup; children = ( + F39855252E32294C00E2D28D /* Alert */, BF3A56862E30E0C2009E5CF9 /* Empty */, BF692B452E0A9B5800A5C2DA /* Player */, BF692B1D2E0A803000A5C2DA /* LocalizedManager */, @@ -986,6 +993,16 @@ name = Frameworks; sourceTree = ""; }; + F39855252E32294C00E2D28D /* Alert */ = { + isa = PBXGroup; + children = ( + F398552A2E322C7C00E2D28D /* BRAlert.swift */, + F39855262E322A7100E2D28D /* BRBaseAlert.swift */, + F39855282E322B1800E2D28D /* BRAlertWindowManager.swift */, + ); + path = Alert; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1133,9 +1150,12 @@ BF692B342E0A87C800A5C2DA /* UIDevice+BRAdd.swift in Sources */, BF692B3E2E0A8D2300A5C2DA /* BRTabBarController.swift in Sources */, BF02B7E12E2DE64200172177 /* BRVideoProgressView.swift in Sources */, + F39855272E322A7100E2D28D /* BRBaseAlert.swift in Sources */, BF692B542E0AA8FA00A5C2DA /* BRCollectionView.swift in Sources */, BF3338E82E15219500B10F76 /* UINavigationBar+BRAdd.swift in Sources */, + F39855292E322B1800E2D28D /* BRAlertWindowManager.swift in Sources */, BF02B82D2E30855300172177 /* BRSearchTextView.swift in Sources */, + F398552B2E322C7C00E2D28D /* BRAlert.swift in Sources */, BF692B472E0A9B7900A5C2DA /* BRPlayer.swift in Sources */, BF692B6E2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift in Sources */, BF692AFA2E0A6F0900A5C2DA /* BRNetwork.swift in Sources */, diff --git a/BeeReel/Base/Extension/UIColor+BRAdd.swift b/BeeReel/Base/Extension/UIColor+BRAdd.swift index 83d8533..3f2fea6 100644 --- a/BeeReel/Base/Extension/UIColor+BRAdd.swift +++ b/BeeReel/Base/Extension/UIColor+BRAdd.swift @@ -122,4 +122,8 @@ extension UIColor { static func colorFFEFA1(alpha: CGFloat = 1) -> UIColor { return UIColor(rgb: 0xFFEFA1, alpha: alpha) } + + static func colorC2C2C2(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xC2C2C2, alpha: alpha) + } } diff --git a/BeeReel/Base/Network/API/BRVideoAPI.swift b/BeeReel/Base/Network/API/BRVideoAPI.swift index 83882ff..b00610f 100644 --- a/BeeReel/Base/Network/API/BRVideoAPI.swift +++ b/BeeReel/Base/Network/API/BRVideoAPI.swift @@ -140,4 +140,25 @@ class BRVideoAPI { extension BRVideoAPI { ///更新短剧关注状态 [ "state" : isFavorite, "id" : shortPlayId,] @objc static let updateShortFavoriteStateNotification = NSNotification.Name(rawValue: "BRVideoAPI.updateShortFavoriteStateNotification") + + + static func favoriteOrCancelFavorite(isFavorite: Bool, shortPlayId: String, videoId: String?) { + + if isFavorite { + BRVideoAPI.requestFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: videoId) { + + } + } else { + + let alert = BRAlert(title: "kRemoveFavoritesAlertTitle".localized, detail: "kRemoveFavoritesAlertDetail".localized, image: nil, normalButtonText: "Cancel".localized, highlightButtonText: "Remove".localized).show() + alert.highlightButtonImage = UIImage(named: "delete_icon_02") + + alert.clickHighlightButton = { + BRVideoAPI.requestFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: videoId) { + + } + } + } + + } } diff --git a/BeeReel/Base/Network/Base/BRNetwork.swift b/BeeReel/Base/Network/Base/BRNetwork.swift index 247117f..9122452 100644 --- a/BeeReel/Base/Network/Base/BRNetwork.swift +++ b/BeeReel/Base/Network/Base/BRNetwork.swift @@ -81,7 +81,7 @@ struct BRNetwork { completion?(res) } else { if code == 402, parameters.isToast { - BRToast.show(text: "veloria_network_error_1".localized) + BRToast.show(text: "beereel_network_error_1".localized) } ///重新获取token self.requestToken { token in @@ -138,7 +138,7 @@ struct BRNetwork { var res = BRNetworkResponse() res.code = -1 if parameters.isToast { - BRToast.show(text: "veloria_network".localized) + BRToast.show(text: "beereel_network".localized) } completion?(res) break diff --git a/BeeReel/Class/Favorites/View/BRFavoritesCell.swift b/BeeReel/Class/Favorites/View/BRFavoritesCell.swift index d02b734..6c770b9 100644 --- a/BeeReel/Class/Favorites/View/BRFavoritesCell.swift +++ b/BeeReel/Class/Favorites/View/BRFavoritesCell.swift @@ -76,9 +76,8 @@ class BRFavoritesCell: BRCollectionViewCell { guard let shortPlayId = self.model?.short_play_id else { return } let isFavorite = !(self.model?.is_collect ?? false) - BRVideoAPI.requestFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: model?.short_play_video_id) { - - } + BRVideoAPI.favoriteOrCancelFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: model?.short_play_video_id) + } diff --git a/BeeReel/Class/Favorites/View/BRFavoritesHeaderView.swift b/BeeReel/Class/Favorites/View/BRFavoritesHeaderView.swift index 4cee43c..43f1dde 100644 --- a/BeeReel/Class/Favorites/View/BRFavoritesHeaderView.swift +++ b/BeeReel/Class/Favorites/View/BRFavoritesHeaderView.swift @@ -114,10 +114,7 @@ class BRFavoritesHeaderView: UICollectionReusableView { guard let shortPlayId = self.model?.short_play_id else { return } let isFavorite = !(self.model?.is_collect ?? false) - BRVideoAPI.requestFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: model?.short_play_video_id) { - - } - + BRVideoAPI.favoriteOrCancelFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: model?.short_play_video_id) } @objc private func updateShortFavoriteStateNotification(sender: Notification) { diff --git a/BeeReel/Lib/Alert/BRAlert.swift b/BeeReel/Lib/Alert/BRAlert.swift new file mode 100644 index 0000000..9415ccb --- /dev/null +++ b/BeeReel/Lib/Alert/BRAlert.swift @@ -0,0 +1,183 @@ +// +// BRAlert.swift +// BeeReel +// +// Created by 长沙鸿瑶 on 2025/7/24. +// + +import UIKit + +class BRAlert: BRBaseAlert { + + var normalButtonTitle: String? { + didSet { + normalButton.setNeedsUpdateConfiguration() + } + } + + var highlightButtonTitle: String? { + didSet { + highlightButton.setNeedsUpdateConfiguration() + } + } + + var highlightButtonImage: UIImage? { + didSet { + highlightButton.setNeedsUpdateConfiguration() + } + } + + var clickNormalButton: (() -> Void)? + var clickHighlightButton: (() -> Void)? + + + + private lazy var bgView: UIView = { + let view = UIImageView(image: UIImage(named: "alert_bg_image")) + view.isUserInteractionEnabled = true + return view + }() + + private lazy var normalButton: UIButton = { + var config = UIButton.Configuration.plain() + + let button = UIButton(configuration: config) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.layer.borderColor = UIColor.colorC2C2C2().cgColor + button.layer.borderWidth = 1 + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + button.configuration?.attributedTitle = AttributedString.br_createAttributedString(string: normalButtonTitle ?? "", color: .colorC2C2C2(), font: .fontRegular(ofSize: 14)) + } + + + button.addTarget(self, action: #selector(handleNormalButton), for: .touchUpInside) + return button + }() + + private lazy var highlightButton: UIButton = { + var config = UIButton.Configuration.plain() + config.background.image = UIImage(named: "选中光效") + config.background.backgroundColor = .color1C1C1C() + config.imagePadding = 4 + + let button = UIButton(configuration: config) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + button.configuration?.image = highlightButtonImage + button.configuration?.attributedTitle = AttributedString.br_createAttributedString(string: highlightButtonTitle ?? "", color: .colorFFFFFF(), font: .fontMedium(ofSize: 14)) + + } + button.addTarget(self, action: #selector(handleHighlightButton), for: .touchUpInside) + return button + }() + + + init(title: String, detail: String?, image: UIImage?, normalButtonText: String?, highlightButtonText: String?) { + super.init(frame: .zero) + let titleLabel = UILabel() + titleLabel.font = .fontBold(ofSize: 18) + titleLabel.textColor = .color000000() + titleLabel.text = title + + let titleIconImageView = UIImageView(image: UIImage(named: "Vector 22")) + + let stackView = UIStackView() + stackView.axis = .vertical + + if let image = image { + let imageView = UIImageView(image: image) + stackView.addArrangedSubview(imageView) + } + + if let detail = detail { + let label = UILabel() + label.text = detail + label.font = .fontRegular(ofSize: 15) + label.textColor = .color1C1C1C() + label.textAlignment = .center + label.numberOfLines = 0 + stackView.addArrangedSubview(label) + } + + let buttonStackView = UIStackView() + buttonStackView.axis = .horizontal + buttonStackView.spacing = 19 + buttonStackView.distribution = .fillEqually + + if let normalButtonText = normalButtonText { + self.normalButtonTitle = normalButtonText + buttonStackView.addArrangedSubview(normalButton) + } + + if let highlightButtonText = highlightButtonText { + self.highlightButtonTitle = highlightButtonText + buttonStackView.addArrangedSubview(highlightButton) + } + + + + contentView.addSubview(bgView) + bgView.addSubview(titleIconImageView) + bgView.addSubview(titleLabel) + bgView.addSubview(stackView) + bgView.addSubview(buttonStackView) + + + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + make.width.equalTo(305) + } + + titleIconImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(42) + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(30) + } + + stackView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.left.equalToSuperview().offset(30) + make.top.equalToSuperview().offset(73) + make.bottom.equalToSuperview().offset(-111) + } + + + buttonStackView.snp.makeConstraints { make in + make.bottom.equalToSuperview().offset(-30) + make.height.equalTo(48) + make.centerX.equalToSuperview() + if buttonStackView.arrangedSubviews.count == 1 { + make.left.equalToSuperview().offset(28) + } else { + make.left.equalToSuperview().offset(15) + } + } + + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func handleNormalButton() { + self.dismiss() + self.clickNormalButton?() + } + + @objc private func handleHighlightButton() { + self.dismiss() + self.clickHighlightButton?() + } + +} + diff --git a/BeeReel/Lib/Alert/BRAlertWindowManager.swift b/BeeReel/Lib/Alert/BRAlertWindowManager.swift new file mode 100644 index 0000000..fc5a637 --- /dev/null +++ b/BeeReel/Lib/Alert/BRAlertWindowManager.swift @@ -0,0 +1,43 @@ +// +// BRAlertWindowManager.swift +// BeeReel +// +// Created by 长沙鸿瑶 on 2025/7/24. +// + +import UIKit + +class BRAlertWindowManager: NSObject { + + static let manager = BRAlertWindowManager() + + private(set) var window: UIWindow? + + func createWindow() -> UIWindow { + guard let window = window else { + let window = UIWindow(windowScene: BRAppTool.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: BRBaseAlert.self) { + isHidden = false + } + } + if isHidden { + window.isHidden = true + self.window = nil + } + } +} diff --git a/BeeReel/Lib/Alert/BRBaseAlert.swift b/BeeReel/Lib/Alert/BRBaseAlert.swift new file mode 100644 index 0000000..6dd2ac6 --- /dev/null +++ b/BeeReel/Lib/Alert/BRBaseAlert.swift @@ -0,0 +1,73 @@ +// +// BRBaseAlert.swift +// BeeReel +// +// Created by 长沙鸿瑶 on 2025/7/24. +// + +import UIKit + +class BRBaseAlert: UIView { + + private(set) var contentView: UIView = { + let view = UIView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .color000000(alpha: 0.4) + + addSubview(contentView) + contentView.snp.makeConstraints { make in + make.center.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 = BRAlertWindowManager.manager.createWindow() + } + + inView.addSubview(self) + self.frame = inView.bounds + showAnimation() + + return self + } + @objc func dismiss() { + dismissAnimation() + } + +} + +extension BRBaseAlert { + private func showAnimation() { + contentView.transform = CGAffineTransform(translationX: 0, y: 200) + + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0) { + self.contentView.transform = CGAffineTransform.identity + } + } + + private func dismissAnimation() { + + UIView.animate(withDuration: 0.3) { + self.alpha = 0 + self.contentView.transform = CGAffineTransform(translationX: 0, y: 500) + } completion: { _ in + self.removeFromSuperview() + BRAlertWindowManager.manager.dismissWindow() + } + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Contents.json new file mode 100644 index 0000000..c878b89 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector 22@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector 22@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@2x.png b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@2x.png new file mode 100644 index 0000000..b147c03 Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@2x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@3x.png b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@3x.png new file mode 100644 index 0000000..cca822e Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/Vector 22.imageset/Vector 22@3x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json @@ -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 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@2x.png b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@2x.png new file mode 100644 index 0000000..c9fe0a3 Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@2x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@3x.png b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@3x.png new file mode 100644 index 0000000..ee0bf9c Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/delete_icon_02.imageset/Frame@3x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/Contents.json new file mode 100644 index 0000000..23637d5 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/Contents.json @@ -0,0 +1,44 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "选中光效@2x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "left" : 62, + "right" : 158 + }, + "center" : { + "mode" : "tile", + "width" : 1 + }, + "mode" : "3-part-horizontal" + }, + "scale" : "2x" + }, + { + "filename" : "选中光效@3x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "left" : 98, + "right" : 233 + }, + "center" : { + "mode" : "tile", + "width" : 2 + }, + "mode" : "3-part-horizontal" + }, + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@2x.png b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@2x.png new file mode 100644 index 0000000..cb778d8 Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@2x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@3x.png b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@3x.png new file mode 100644 index 0000000..16296ad Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/icon/选中光效.imageset/选中光效@3x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Contents.json new file mode 100644 index 0000000..e3724c7 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Contents.json @@ -0,0 +1,44 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 85@2x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 67, + "top" : 203 + }, + "center" : { + "height" : 1, + "mode" : "tile" + }, + "mode" : "3-part-vertical" + }, + "scale" : "2x" + }, + { + "filename" : "Rectangle 85@3x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 79, + "top" : 259 + }, + "center" : { + "height" : 1, + "mode" : "tile" + }, + "mode" : "3-part-vertical" + }, + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@2x.png b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@2x.png new file mode 100644 index 0000000..6ca17f3 Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@2x.png differ diff --git a/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@3x.png b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@3x.png new file mode 100644 index 0000000..d474588 Binary files /dev/null and b/BeeReel/Sources/Assets.xcassets/image/alert_bg_image.imageset/Rectangle 85@3x.png differ diff --git a/BeeReel/Sources/Localizable.xcstrings b/BeeReel/Sources/Localizable.xcstrings index 8ca4d88..c033e2f 100644 --- a/BeeReel/Sources/Localizable.xcstrings +++ b/BeeReel/Sources/Localizable.xcstrings @@ -23,6 +23,28 @@ } } }, + "beereel_network" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The service is abnormal. Check the network." + } + } + } + }, + "beereel_network_error_1" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your account is already logged in on another device~" + } + } + } + }, "Browse Genres" : { "extractionState" : "manual", "localizations" : { @@ -34,6 +56,17 @@ } } }, + "Cancel" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" + } + } + } + }, "Categories" : { "extractionState" : "manual", "localizations" : { @@ -67,6 +100,17 @@ } } }, + "Error" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error" + } + } + } + }, "Expand Your Favorites" : { "extractionState" : "manual", "localizations" : { @@ -144,6 +188,28 @@ } } }, + "kRemoveFavoritesAlertDetail" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You may not find this collection after you unncollect it." + } + } + } + }, + "kRemoveFavoritesAlertTitle" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remove from favorites?" + } + } + } + }, "kSearchEmptyDetail" : { "extractionState" : "manual", "localizations" : { @@ -221,6 +287,17 @@ } } }, + "Remove" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remove" + } + } + } + }, "Search Results" : { "extractionState" : "manual", "localizations" : {