From daaa32feb39bc5b5c182753983b66b3e7e6cfe0e Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 27 Dec 2023 17:52:44 +0900 Subject: [PATCH 001/370] =?UTF-8?q?feat:=20main=20tab=20bar=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxListViewController.swift | 29 ++++++++++++++++++++ iBox/Sources/FavoriteViewController.swift | 29 ++++++++++++++++++++ iBox/Sources/MainTabBarController.swift | 32 +++++++++++++++++++++++ iBox/Sources/MainViewController.swift | 18 ------------- iBox/Sources/ProfileViewController.swift | 29 ++++++++++++++++++++ iBox/Sources/SceneDelegate.swift | 7 +---- 6 files changed, 120 insertions(+), 24 deletions(-) create mode 100644 iBox/Sources/BoxListViewController.swift create mode 100644 iBox/Sources/FavoriteViewController.swift create mode 100644 iBox/Sources/MainTabBarController.swift delete mode 100644 iBox/Sources/MainViewController.swift create mode 100644 iBox/Sources/ProfileViewController.swift diff --git a/iBox/Sources/BoxListViewController.swift b/iBox/Sources/BoxListViewController.swift new file mode 100644 index 0000000..3ea9aa1 --- /dev/null +++ b/iBox/Sources/BoxListViewController.swift @@ -0,0 +1,29 @@ +// +// BoxListViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class BoxListViewController: BaseViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/iBox/Sources/FavoriteViewController.swift b/iBox/Sources/FavoriteViewController.swift new file mode 100644 index 0000000..7bdd6ab --- /dev/null +++ b/iBox/Sources/FavoriteViewController.swift @@ -0,0 +1,29 @@ +// +// FavoriteViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class FavoriteViewController: BaseViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/iBox/Sources/MainTabBarController.swift b/iBox/Sources/MainTabBarController.swift new file mode 100644 index 0000000..d5e0e6e --- /dev/null +++ b/iBox/Sources/MainTabBarController.swift @@ -0,0 +1,32 @@ +// +// MainTabBarController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class MainTabBarController: UITabBarController { + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + + setupTabBar() + } + + private func setupTabBar() { + viewControllers = [ + setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), + setupViewController(viewController: FavoriteViewController(), image: UIImage(systemName: "heart.fill")), + setupViewController(viewController: ProfileViewController(), image: UIImage(systemName: "person.fill")) + ] + } + + private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { + viewController.tabBarItem.image = image + return UINavigationController(rootViewController: viewController) + } + +} diff --git a/iBox/Sources/MainViewController.swift b/iBox/Sources/MainViewController.swift deleted file mode 100644 index ee81407..0000000 --- a/iBox/Sources/MainViewController.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// MainViewController.swift -// iBox -// -// Created by jiyeon on 12/26/23. -// - -import UIKit - -class MainViewController: BaseViewController { - - // MARK: - life cycle - - override func viewDidLoad() { - super.viewDidLoad() - } - -} diff --git a/iBox/Sources/ProfileViewController.swift b/iBox/Sources/ProfileViewController.swift new file mode 100644 index 0000000..673df10 --- /dev/null +++ b/iBox/Sources/ProfileViewController.swift @@ -0,0 +1,29 @@ +// +// ProfileViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class ProfileViewController: BaseViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index f820efc..77d235c 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -16,12 +16,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene - - let mainViewController = MainViewController() - - let navigationController = UINavigationController(rootViewController: mainViewController) - - window?.rootViewController = navigationController // 루트 뷰컨트롤러 설정 + window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 } From db070921d9c5838651d3b3b82b7dadaa67c6ad9f Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 3 Jan 2024 18:54:27 +0900 Subject: [PATCH 002/370] =?UTF-8?q?feat:=20BoxListView=20=EA=B0=84?= =?UTF-8?q?=EB=8B=A8=ED=9E=88=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BaseViewController.swift | 1 + iBox/Sources/BoxList/BoxListView.swift | 65 +++++++++++++++++++ .../BoxList/BoxListViewController.swift | 18 +++++ iBox/Sources/BoxListViewController.swift | 29 --------- iBox/Sources/ColorPalette.swift | 40 ++++++++++++ iBox/Sources/MainTabBarController.swift | 8 +++ 6 files changed, 132 insertions(+), 29 deletions(-) create mode 100644 iBox/Sources/BoxList/BoxListView.swift create mode 100644 iBox/Sources/BoxList/BoxListViewController.swift delete mode 100644 iBox/Sources/BoxListViewController.swift create mode 100644 iBox/Sources/ColorPalette.swift diff --git a/iBox/Sources/BaseViewController.swift b/iBox/Sources/BaseViewController.swift index fd38cb5..c4be0a0 100644 --- a/iBox/Sources/BaseViewController.swift +++ b/iBox/Sources/BaseViewController.swift @@ -15,4 +15,5 @@ class BaseViewController: UIViewController { super.viewDidLoad() view.addSubview(baseView) } + } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift new file mode 100644 index 0000000..ef023f0 --- /dev/null +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -0,0 +1,65 @@ +// +// BoxListView.swift +// iBox +// +// Created by 이지현 on 1/3/24. +// + +import UIKit + +class BoxListView: UIView { + + let folders = ["folder1", "folder2", "folder3"] + + private lazy var tableView = { + let tableView = UITableView() + tableView.dataSource = self + tableView.delegate = self + tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") + + tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: frame.width, height: 10)) + tableView.separatorInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + tableView.clipsToBounds = true + tableView.layer.cornerRadius = 20 + tableView.backgroundColor = ColorPalette.tableViewBackgroundColor + tableView.separatorColor = .secondaryLabel + return tableView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = ColorPalette.backgroundColor + + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupLayout() { + addSubview(tableView) + tableView.snp.makeConstraints { make in + make.top.equalTo(safeAreaLayoutGuide).inset(10) + make.leading.trailing.bottom.equalTo(safeAreaLayoutGuide).inset(20) + } + } +} + +extension BoxListView: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return folders.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + cell.textLabel?.text = folders[indexPath.row] + cell.backgroundColor = .clear + return cell + } + +} + +extension BoxListView: UITableViewDelegate { + +} diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift new file mode 100644 index 0000000..f753544 --- /dev/null +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -0,0 +1,18 @@ +// +// BoxListViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class BoxListViewController: BaseViewController { + + override func viewDidLoad() { + super.viewDidLoad() + title = "iBox" + navigationController?.navigationBar.prefersLargeTitles = true // BaseViewController에 추가해도 될 듯? + } + +} diff --git a/iBox/Sources/BoxListViewController.swift b/iBox/Sources/BoxListViewController.swift deleted file mode 100644 index 3ea9aa1..0000000 --- a/iBox/Sources/BoxListViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// BoxListViewController.swift -// iBox -// -// Created by 이지현 on 12/27/23. -// - -import UIKit - -class BoxListViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/iBox/Sources/ColorPalette.swift b/iBox/Sources/ColorPalette.swift new file mode 100644 index 0000000..5b290a4 --- /dev/null +++ b/iBox/Sources/ColorPalette.swift @@ -0,0 +1,40 @@ +// +// ColorPalette.swift +// iBox +// +// Created by 이지현 on 1/3/24. +// + +import UIKit + +struct ColorPalette { + + public static var backgroundColor = { + if #available(iOS 13, *) { + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return UIColor.black + } else { + return .systemGray5 + } + } + } else { + return .systemGray5 + } + }() + + public static var tableViewBackgroundColor = { + if #available(iOS 13, *) { + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return UIColor.systemGray5 + } else { + return .white + } + } + } else { + return .white + } + }() + +} diff --git a/iBox/Sources/MainTabBarController.swift b/iBox/Sources/MainTabBarController.swift index d5e0e6e..833df2f 100644 --- a/iBox/Sources/MainTabBarController.swift +++ b/iBox/Sources/MainTabBarController.swift @@ -14,6 +14,7 @@ class MainTabBarController: UITabBarController { view.backgroundColor = .systemBackground setupTabBar() + setupTabBarAppearance() } private func setupTabBar() { @@ -25,8 +26,15 @@ class MainTabBarController: UITabBarController { } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { + viewController.tabBarItem.title = "" viewController.tabBarItem.image = image return UINavigationController(rootViewController: viewController) } + + private func setupTabBarAppearance() { + let appearance = UITabBarItem.appearance() + appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal) + appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .selected) + } } From 3924a89c114dc5155881c217cfc1fe2ad23439e0 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 3 Jan 2024 20:21:33 +0900 Subject: [PATCH 003/370] =?UTF-8?q?feat:=20BaseNavigationViewController=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseNavigationBarViewController.swift | 180 ++++++++++++++++++ iBox/Sources/Base/BaseView.swift | 31 +++ .../{ => Base}/BaseViewController.swift | 0 .../Sources/Extension/UIColor+Extension.swift | 25 +++ iBox/Sources/Extension/UIView+Extension.swift | 21 ++ iBox/Sources/Profile/ProfileView.swift | 15 ++ .../Profile/ProfileViewController.swift | 20 ++ iBox/Sources/ProfileViewController.swift | 29 --- 8 files changed, 292 insertions(+), 29 deletions(-) create mode 100644 iBox/Sources/Base/BaseNavigationBarViewController.swift create mode 100644 iBox/Sources/Base/BaseView.swift rename iBox/Sources/{ => Base}/BaseViewController.swift (100%) create mode 100644 iBox/Sources/Extension/UIColor+Extension.swift create mode 100644 iBox/Sources/Extension/UIView+Extension.swift create mode 100644 iBox/Sources/Profile/ProfileView.swift create mode 100644 iBox/Sources/Profile/ProfileViewController.swift delete mode 100644 iBox/Sources/ProfileViewController.swift diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift new file mode 100644 index 0000000..71d4853 --- /dev/null +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -0,0 +1,180 @@ +// +// BaseNavigationBarViewController.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +import SnapKit + +class NavigationBar: UIView { + var backButton = UIButton() + var titleLabel = UILabel() + var addButton = UIButton() +} + +protocol BaseNavigationBarViewControllerProtocol { + var statusBar: UIView { get } + var navigationBar: NavigationBar { get } + var contentView: BaseView { get } + + func setupNavigationBar() + func setNavigationBarBackgroundColor(_ color: UIColor?) + func setNavigationBarTintColor(_ color: UIColor) + func setNavigationBarHidden(_ hidden: Bool) + func setNavigationBarBackButtonHidden(_ hidden: Bool) + func setNavigationBarAddButtonHidden(_ hidden: Bool) + func setNavigationBarTitleLabelText(_ text: String?) + func setNavigationBarTitleLabelFont(_ font: UIFont?) + func setNavigationBarTitleLabelTextColor(_ color: UIColor?) +} + +class BaseNavigationBarViewController: UIViewController, BaseNavigationBarViewControllerProtocol { + + // MARK: - UI + + let statusBar = UIView() + + let navigationBar = NavigationBar().then { + $0.backButton.configuration = .plain() + $0.backButton.configuration?.image = UIImage(systemName: "chevron.left") + $0.backButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.addButton.configuration = .plain() + $0.addButton.configuration?.image = UIImage(systemName: "plus") + $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + } + + let contentView: BaseView = View() + + // MARK: - properties + + let backgroundColor: UIColor = .systemBackground + let tintColor: UIColor = .black + let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) + + // MARK: - life cycle + + override func viewDidLoad() { + super.viewDidLoad() + configureUI() + setupNavigationBar() + setupProperties() + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + func setupNavigationBar() {} + + func setNavigationBarBackgroundColor(_ color: UIColor?) { + statusBar.backgroundColor = color + navigationBar.backgroundColor = color + } + + func setNavigationBarTintColor(_ color: UIColor) { + navigationBar.backButton.tintColor = color + navigationBar.addButton.tintColor = color + } + + func setNavigationBarHidden(_ hidden: Bool) { + navigationBar.isHidden = hidden + + if hidden { + contentView.snp.remakeConstraints { + $0.top.equalTo(statusBar.snp.bottom) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.bottom.equalToSuperview() + } + } else { + contentView.snp.remakeConstraints { + $0.top.equalTo(statusBar.snp.bottom).offset(60) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.bottom.equalToSuperview() + } + } + } + + func setNavigationBarBackButtonHidden(_ hidden: Bool) { + navigationBar.backButton.isHidden = hidden + + if hidden { + navigationBar.titleLabel.snp.remakeConstraints { + $0.left.equalToSuperview().inset(30) + $0.centerY.equalToSuperview() + } + } else { + navigationBar.titleLabel.snp.remakeConstraints { + $0.center.equalToSuperview() + } + } + } + + func setNavigationBarAddButtonHidden(_ hidden: Bool) { + navigationBar.addButton.isHidden = hidden + } + + func setNavigationBarTitleLabelText(_ text: String?) { + navigationBar.titleLabel.text = text + } + + func setNavigationBarTitleLabelFont(_ font: UIFont?) { + navigationBar.titleLabel.font = font + } + + func setNavigationBarTitleLabelTextColor(_ color: UIColor?) { + navigationBar.titleLabel.textColor = color + } + + // MARK: - functions + + private func configureUI() { + view.addSubview(statusBar) + view.addSubview(navigationBar) + navigationBar.addSubview(navigationBar.backButton) + navigationBar.addSubview(navigationBar.titleLabel) + navigationBar.addSubview(navigationBar.addButton) + view.addSubview(contentView) + + statusBar.snp.makeConstraints { + $0.left.top.right.equalToSuperview() + $0.bottom.equalTo(view.safeAreaLayoutGuide.snp.top) + } + + navigationBar.snp.makeConstraints { + $0.top.equalTo(statusBar.snp.bottom) + $0.left.right.equalToSuperview() + $0.height.equalTo(60) + } + + navigationBar.backButton.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(24) + } + + navigationBar.titleLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + navigationBar.addButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(24) + } + + contentView.snp.makeConstraints { + $0.top.equalTo(statusBar.snp.bottom).offset(60) + $0.left.bottom.right.equalToSuperview() + } + } + + private func setupProperties() { + navigationController?.setNavigationBarHidden(true, animated: false) + setNavigationBarTintColor(tintColor) + setNavigationBarTitleLabelFont(titleFont) + setNavigationBarBackButtonHidden(true) + setNavigationBarAddButtonHidden(true) + } + +} diff --git a/iBox/Sources/Base/BaseView.swift b/iBox/Sources/Base/BaseView.swift new file mode 100644 index 0000000..7ee908e --- /dev/null +++ b/iBox/Sources/Base/BaseView.swift @@ -0,0 +1,31 @@ +// +// BaseView.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +protocol BaseViewProtocol { + func configureUI() +} + +class BaseView: UIView, BaseViewProtocol { + + // MARK: - initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - BaseViewProtocol + + func configureUI() {} + +} diff --git a/iBox/Sources/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift similarity index 100% rename from iBox/Sources/BaseViewController.swift rename to iBox/Sources/Base/BaseViewController.swift diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift new file mode 100644 index 0000000..76986cf --- /dev/null +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -0,0 +1,25 @@ +// +// UIColor+Extension.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +extension UIColor { + + convenience init(hex: UInt, alpha: CGFloat = 1.0) { + self.init( + red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, + green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(hex & 0x0000FF) / 255.0, + alpha: CGFloat(alpha) + ) + } + + class var box: UIColor { UIColor(hex: 0xFF7F29) } + class var box2: UIColor { UIColor(hex: 0xFF9548) } + class var box3: UIColor { UIColor(hex: 0xFFDC6E) } + +} diff --git a/iBox/Sources/Extension/UIView+Extension.swift b/iBox/Sources/Extension/UIView+Extension.swift new file mode 100644 index 0000000..5841271 --- /dev/null +++ b/iBox/Sources/Extension/UIView+Extension.swift @@ -0,0 +1,21 @@ +// +// UIView+Extension.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +protocol Then {} + +extension Then where Self: AnyObject { + + func then(block: (Self) -> Void) -> Self { + block(self) + return self + } + +} + +extension UIView: Then {} diff --git a/iBox/Sources/Profile/ProfileView.swift b/iBox/Sources/Profile/ProfileView.swift new file mode 100644 index 0000000..6d019ea --- /dev/null +++ b/iBox/Sources/Profile/ProfileView.swift @@ -0,0 +1,15 @@ +// +// ProfileView.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +class ProfileView: BaseView { + + override func configureUI() { + } + +} diff --git a/iBox/Sources/Profile/ProfileViewController.swift b/iBox/Sources/Profile/ProfileViewController.swift new file mode 100644 index 0000000..5cbcbb6 --- /dev/null +++ b/iBox/Sources/Profile/ProfileViewController.swift @@ -0,0 +1,20 @@ +// +// ProfileViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class ProfileViewController: BaseNavigationBarViewController { + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("Profile") + } + +} diff --git a/iBox/Sources/ProfileViewController.swift b/iBox/Sources/ProfileViewController.swift deleted file mode 100644 index 673df10..0000000 --- a/iBox/Sources/ProfileViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// ProfileViewController.swift -// iBox -// -// Created by 이지현 on 12/27/23. -// - -import UIKit - -class ProfileViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} From abc5772c7ec98113fed2393599156f08a9c698ea Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 3 Jan 2024 21:45:08 +0900 Subject: [PATCH 004/370] =?UTF-8?q?feat:=20ProfileItemCell=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseNavigationBarViewController.swift | 3 +- iBox/Sources/Profile/ProfileItem.swift | 18 +++++ iBox/Sources/Profile/ProfileItemCell.swift | 67 +++++++++++++++++++ iBox/Sources/Profile/ProfileView.swift | 57 ++++++++++++++++ .../Profile/ProfileViewController.swift | 37 +++++++++- 5 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 iBox/Sources/Profile/ProfileItem.swift create mode 100644 iBox/Sources/Profile/ProfileItemCell.swift diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index 71d4853..ee8f117 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -165,7 +165,8 @@ class BaseNavigationBarViewController: UIViewController, BaseNav contentView.snp.makeConstraints { $0.top.equalTo(statusBar.snp.bottom).offset(60) - $0.left.bottom.right.equalToSuperview() + $0.left.right.equalToSuperview() + $0.bottom.equalToSuperview().inset(tabBarController?.tabBar.frame.height ?? 0) } } diff --git a/iBox/Sources/Profile/ProfileItem.swift b/iBox/Sources/Profile/ProfileItem.swift new file mode 100644 index 0000000..7ae4b58 --- /dev/null +++ b/iBox/Sources/Profile/ProfileItem.swift @@ -0,0 +1,18 @@ +// +// ProfileItem.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +struct ProfileSection { + var title: String + var items: [ProfileItem] +} + +struct ProfileItem { + var title: String + var viewController: UIViewController? +} diff --git a/iBox/Sources/Profile/ProfileItemCell.swift b/iBox/Sources/Profile/ProfileItemCell.swift new file mode 100644 index 0000000..38f7943 --- /dev/null +++ b/iBox/Sources/Profile/ProfileItemCell.swift @@ -0,0 +1,67 @@ +// +// ProfileItemCell.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +import SnapKit + +class ProfileItemCell: UITableViewCell, BaseViewProtocol { + + // MARK: - UI + + let titleLabel = UILabel().then { + $0.font = .systemFont(ofSize: 17, weight: .semibold) + $0.textColor = .black + } + + let descriptionLabel = UILabel().then { + $0.font = .systemFont(ofSize: 15, weight: .regular) + $0.textColor = .gray + } + + let chevronButton = UIButton().then { + $0.configuration = .plain() + $0.configuration?.image = UIImage(named: "chevron.right") + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 15, weight: .bold) + $0.tintColor = .gray + } + + // MARK: - initializer + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: BaseViewProtocol + + func configureUI() { + addSubview(titleLabel) + addSubview(descriptionLabel) + addSubview(chevronButton) + + titleLabel.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + chevronButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(20) + } + + descriptionLabel.snp.makeConstraints { + $0.right.equalTo(chevronButton.snp.left).offset(20) + $0.centerY.equalToSuperview() + } + } + +} diff --git a/iBox/Sources/Profile/ProfileView.swift b/iBox/Sources/Profile/ProfileView.swift index 6d019ea..0a976a1 100644 --- a/iBox/Sources/Profile/ProfileView.swift +++ b/iBox/Sources/Profile/ProfileView.swift @@ -8,8 +8,65 @@ import UIKit class ProfileView: BaseView { + + let profileView = UIView()/*.then { + $0.backgroundColor = .systemPink + }*/ + + let profileImageView = UIImageView().then { + $0.image = UIImage(systemName: "person.crop.circle") + $0.tintColor = .box + } + + let profileLabel = UILabel().then { + $0.text = "예시입니당" + $0.font = .systemFont(ofSize: 17, weight: .semibold) + } + + let chevronButton = UIButton().then { + $0.configuration = .plain() + $0.configuration?.image = UIImage(systemName: "chevron.right") + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 15, weight: .bold) + $0.tintColor = .systemGray3 + } + let tableView = UITableView().then { + $0.register(ProfileItemCell.self, forCellReuseIdentifier: "ProfileItemCell") + } + override func configureUI() { + addSubview(profileView) + profileView.addSubview(profileImageView) + profileView.addSubview(profileLabel) + profileView.addSubview(chevronButton) + addSubview(tableView) + + profileView.snp.makeConstraints { + $0.left.top.right.equalToSuperview() + $0.height.equalTo(90) + } + + profileImageView.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(60) + } + + profileLabel.snp.makeConstraints { + $0.left.equalTo(profileImageView.snp.right).offset(10) + $0.centerY.equalToSuperview() + } + + chevronButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(20) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(profileView.snp.bottom).offset(10) + $0.left.bottom.right.equalToSuperview() + } } } diff --git a/iBox/Sources/Profile/ProfileViewController.swift b/iBox/Sources/Profile/ProfileViewController.swift index 5cbcbb6..0979856 100644 --- a/iBox/Sources/Profile/ProfileViewController.swift +++ b/iBox/Sources/Profile/ProfileViewController.swift @@ -8,9 +8,27 @@ import UIKit class ProfileViewController: BaseNavigationBarViewController { - + + // MARK: - properties + + var profileSections: [ProfileSection] = [ + .init(title: "settings", items: [ + ProfileItem(title: "다크 모드") + ]), + .init(title: "help", items: [ + ProfileItem(title: "이용 가이드"), + ProfileItem(title: "앱 피드백"), + ProfileItem(title: "개발자 정보") + ]) + ] + + // MARK: - life cycle + override func viewDidLoad() { super.viewDidLoad() + guard let contentView = contentView as? ProfileView else { return } + contentView.tableView.delegate = self + contentView.tableView.dataSource = self } override func setupNavigationBar() { @@ -18,3 +36,20 @@ class ProfileViewController: BaseNavigationBarViewController { } } + +extension ProfileViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return profileSections[section].items.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileItemCell") + as? ProfileItemCell else { return UITableViewCell() } + let item = profileSections[indexPath.section].items[indexPath.row] + cell.titleLabel.text = item.title + print("item.title : \(item.title)") + return cell + } + +} From 0461b44f1cd008bf0e23db66fb9e35c2b9fab4f1 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 3 Jan 2024 22:02:23 +0900 Subject: [PATCH 005/370] =?UTF-8?q?feat:=20ProfileItemCell=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=B1=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Profile => Model}/ProfileItem.swift | 0 .../BoxListViewController.swift | 0 .../FavoriteViewController.swift | 0 .../MainTabBarController.swift | 0 iBox/Sources/{ => Presenter}/MainView.swift | 0 .../Profile/ProfileItemCell.swift | 14 ++++--- .../{ => Presenter}/Profile/ProfileView.swift | 3 +- .../Profile/ProfileViewController.swift | 37 +++++++++++++++++-- 8 files changed, 44 insertions(+), 10 deletions(-) rename iBox/Sources/{Profile => Model}/ProfileItem.swift (100%) rename iBox/Sources/{ => Presenter}/BoxListViewController.swift (100%) rename iBox/Sources/{ => Presenter}/FavoriteViewController.swift (100%) rename iBox/Sources/{ => Presenter}/MainTabBarController.swift (100%) rename iBox/Sources/{ => Presenter}/MainView.swift (100%) rename iBox/Sources/{ => Presenter}/Profile/ProfileItemCell.swift (79%) rename iBox/Sources/{ => Presenter}/Profile/ProfileView.swift (96%) rename iBox/Sources/{ => Presenter}/Profile/ProfileViewController.swift (51%) diff --git a/iBox/Sources/Profile/ProfileItem.swift b/iBox/Sources/Model/ProfileItem.swift similarity index 100% rename from iBox/Sources/Profile/ProfileItem.swift rename to iBox/Sources/Model/ProfileItem.swift diff --git a/iBox/Sources/BoxListViewController.swift b/iBox/Sources/Presenter/BoxListViewController.swift similarity index 100% rename from iBox/Sources/BoxListViewController.swift rename to iBox/Sources/Presenter/BoxListViewController.swift diff --git a/iBox/Sources/FavoriteViewController.swift b/iBox/Sources/Presenter/FavoriteViewController.swift similarity index 100% rename from iBox/Sources/FavoriteViewController.swift rename to iBox/Sources/Presenter/FavoriteViewController.swift diff --git a/iBox/Sources/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift similarity index 100% rename from iBox/Sources/MainTabBarController.swift rename to iBox/Sources/Presenter/MainTabBarController.swift diff --git a/iBox/Sources/MainView.swift b/iBox/Sources/Presenter/MainView.swift similarity index 100% rename from iBox/Sources/MainView.swift rename to iBox/Sources/Presenter/MainView.swift diff --git a/iBox/Sources/Profile/ProfileItemCell.swift b/iBox/Sources/Presenter/Profile/ProfileItemCell.swift similarity index 79% rename from iBox/Sources/Profile/ProfileItemCell.swift rename to iBox/Sources/Presenter/Profile/ProfileItemCell.swift index 38f7943..91a3714 100644 --- a/iBox/Sources/Profile/ProfileItemCell.swift +++ b/iBox/Sources/Presenter/Profile/ProfileItemCell.swift @@ -14,26 +14,28 @@ class ProfileItemCell: UITableViewCell, BaseViewProtocol { // MARK: - UI let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 17, weight: .semibold) + $0.font = .systemFont(ofSize: 16) $0.textColor = .black } let descriptionLabel = UILabel().then { - $0.font = .systemFont(ofSize: 15, weight: .regular) + $0.text = "예시입니당" + $0.font = .systemFont(ofSize: 13, weight: .regular) $0.textColor = .gray } let chevronButton = UIButton().then { $0.configuration = .plain() - $0.configuration?.image = UIImage(named: "chevron.right") - $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 15, weight: .bold) - $0.tintColor = .gray + $0.configuration?.image = UIImage(systemName: "chevron.right") + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 10, weight: .bold) + $0.tintColor = .systemGray3 } // MARK: - initializer override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + configureUI() } required init?(coder: NSCoder) { @@ -59,7 +61,7 @@ class ProfileItemCell: UITableViewCell, BaseViewProtocol { } descriptionLabel.snp.makeConstraints { - $0.right.equalTo(chevronButton.snp.left).offset(20) + $0.right.equalTo(chevronButton.snp.left).offset(-10) $0.centerY.equalToSuperview() } } diff --git a/iBox/Sources/Profile/ProfileView.swift b/iBox/Sources/Presenter/Profile/ProfileView.swift similarity index 96% rename from iBox/Sources/Profile/ProfileView.swift rename to iBox/Sources/Presenter/Profile/ProfileView.swift index 0a976a1..5a31981 100644 --- a/iBox/Sources/Profile/ProfileView.swift +++ b/iBox/Sources/Presenter/Profile/ProfileView.swift @@ -26,12 +26,13 @@ class ProfileView: BaseView { let chevronButton = UIButton().then { $0.configuration = .plain() $0.configuration?.image = UIImage(systemName: "chevron.right") - $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 15, weight: .bold) + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 10, weight: .bold) $0.tintColor = .systemGray3 } let tableView = UITableView().then { $0.register(ProfileItemCell.self, forCellReuseIdentifier: "ProfileItemCell") + $0.separatorStyle = .none } override func configureUI() { diff --git a/iBox/Sources/Profile/ProfileViewController.swift b/iBox/Sources/Presenter/Profile/ProfileViewController.swift similarity index 51% rename from iBox/Sources/Profile/ProfileViewController.swift rename to iBox/Sources/Presenter/Profile/ProfileViewController.swift index 0979856..e66fcf0 100644 --- a/iBox/Sources/Profile/ProfileViewController.swift +++ b/iBox/Sources/Presenter/Profile/ProfileViewController.swift @@ -39,17 +39,48 @@ class ProfileViewController: BaseNavigationBarViewController { extension ProfileViewController: UITableViewDelegate, UITableViewDataSource { + // 테이블 뷰의 섹션 개수 설정 + func numberOfSections(in tableView: UITableView) -> Int { + return profileSections.count + } + + // 테이블 뷰의 행 개수 설정 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return profileSections[section].items.count } + // 테이블 뷰 셀 구성 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileItemCell") as? ProfileItemCell else { return UITableViewCell() } - let item = profileSections[indexPath.section].items[indexPath.row] - cell.titleLabel.text = item.title - print("item.title : \(item.title)") + let profileItem = profileSections[indexPath.section].items[indexPath.row] + cell.titleLabel.text = profileItem.title return cell } + // 셀의 높이 설정 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + // 섹션 헤더의 View 설정 + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { +// if section == 0 { return nil } + let headerView = UIView() + headerView.backgroundColor = .systemGroupedBackground + return headerView + } + + // 섹션 헤더의 높이 설정 + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 10 + } + + // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let profileItem = profileSections[indexPath.section].items[indexPath.row] + guard let viewController = profileItem.viewController else { return } + navigationController?.pushViewController(viewController, animated: true) + } + } From c52cecee479345bdc194043bb254e0ad353abbb5 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 3 Jan 2024 23:31:43 +0900 Subject: [PATCH 006/370] =?UTF-8?q?feat:=20DisplayModeViewController=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseNavigationBarViewController.swift | 8 +++ .../{ProfileItem.swift => MyPageItem.swift} | 9 +-- .../Presenter/MainTabBarController.swift | 7 +- .../MyPage/DisplayMode/DisplayModeCell.swift | 71 +++++++++++++++++++ .../MyPage/DisplayMode/DisplayModeView.swift | 32 +++++++++ .../DisplayModeViewController.swift | 66 +++++++++++++++++ .../MyPageItemCell.swift} | 8 +-- .../MyPageView.swift} | 19 +++-- .../MyPageViewController.swift} | 53 ++++++++------ .../MyPage/Profile/ProfileView.swift | 17 +++++ .../Profile/ProfileViewController.swift | 27 +++++++ 11 files changed, 279 insertions(+), 38 deletions(-) rename iBox/Sources/Model/{ProfileItem.swift => MyPageItem.swift} (56%) create mode 100644 iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift create mode 100644 iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift create mode 100644 iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift rename iBox/Sources/Presenter/{Profile/ProfileItemCell.swift => MyPage/MyPageItemCell.swift} (88%) rename iBox/Sources/Presenter/{Profile/ProfileView.swift => MyPage/MyPageView.swift} (83%) rename iBox/Sources/Presenter/{Profile/ProfileViewController.swift => MyPage/MyPageViewController.swift} (52%) create mode 100644 iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift create mode 100644 iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index ee8f117..9f06ffd 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -129,6 +129,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav // MARK: - functions private func configureUI() { + view.backgroundColor = .systemBackground view.addSubview(statusBar) view.addSubview(navigationBar) navigationBar.addSubview(navigationBar.backButton) @@ -172,10 +173,17 @@ class BaseNavigationBarViewController: UIViewController, BaseNav private func setupProperties() { navigationController?.setNavigationBarHidden(true, animated: false) + setNavigationBarTintColor(tintColor) setNavigationBarTitleLabelFont(titleFont) setNavigationBarBackButtonHidden(true) setNavigationBarAddButtonHidden(true) + + navigationBar.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) + } + + @objc func backButtonTapped() { + navigationController?.popViewController(animated: true) } } diff --git a/iBox/Sources/Model/ProfileItem.swift b/iBox/Sources/Model/MyPageItem.swift similarity index 56% rename from iBox/Sources/Model/ProfileItem.swift rename to iBox/Sources/Model/MyPageItem.swift index 7ae4b58..881cc26 100644 --- a/iBox/Sources/Model/ProfileItem.swift +++ b/iBox/Sources/Model/MyPageItem.swift @@ -1,5 +1,5 @@ // -// ProfileItem.swift +// MyPageItem.swift // iBox // // Created by jiyeon on 1/3/24. @@ -7,12 +7,13 @@ import UIKit -struct ProfileSection { +struct MyPageSection { var title: String - var items: [ProfileItem] + var items: [MyPageItem] } -struct ProfileItem { +struct MyPageItem { var title: String + var description: String? var viewController: UIViewController? } diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index d5e0e6e..b7e0318 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -8,11 +8,11 @@ import UIKit class MainTabBarController: UITabBarController { - + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground - + setupTabBar() } @@ -20,8 +20,9 @@ class MainTabBarController: UITabBarController { viewControllers = [ setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), setupViewController(viewController: FavoriteViewController(), image: UIImage(systemName: "heart.fill")), - setupViewController(viewController: ProfileViewController(), image: UIImage(systemName: "person.fill")) + setupViewController(viewController: MyPageViewController(), image: UIImage(systemName: "person.fill")) ] + tabBar.tintColor = .box } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift new file mode 100644 index 0000000..52b2a17 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift @@ -0,0 +1,71 @@ +// +// DisplayModeCell.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +class DisplayModeCell: UITableViewCell, BaseViewProtocol { + + // MARK: - UI + + let displayModeImageView = UIImageView().then { + $0.tintColor = .black + } + + let titleLabel = UILabel().then { + $0.font = .systemFont(ofSize: 16) + $0.textColor = .black + } + + let selectButton = UIButton().then { + $0.tintColor = .gray + } + + // MARK: - initializer + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + configureUI() + selectionStyle = .none + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - BaseViewProtocol + + func configureUI() { + addSubview(displayModeImageView) + addSubview(titleLabel) + addSubview(selectButton) + + displayModeImageView.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(25) + } + + titleLabel.snp.makeConstraints { + $0.left.equalTo(displayModeImageView.snp.right).offset(10) + $0.centerY.equalToSuperview() + } + + selectButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(20) + } + } + + // MARK: - functions + + func bind(_ item: DisplayModeItem) { + titleLabel.text = item.title + displayModeImageView.image = item.image + } + +} diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift new file mode 100644 index 0000000..07e4895 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift @@ -0,0 +1,32 @@ +// +// DisplayModeView.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +import SnapKit + +class DisplayModeView: BaseView { + + // MARK: - UI + + let tableView = UITableView().then { + $0.register(DisplayModeCell.self, forCellReuseIdentifier: "DisplayModeCell") + $0.separatorStyle = .none + $0.sectionHeaderTopPadding = 0 + } + + // MARK: - BaseViewProtocol + + override func configureUI() { + addSubview(tableView) + + tableView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + +} diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift new file mode 100644 index 0000000..32c247f --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift @@ -0,0 +1,66 @@ +// +// DisplayModeViewController.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +struct DisplayModeItem { + var title: String + var image: UIImage? +} + +class DisplayModeViewController: BaseNavigationBarViewController { + + // MARK: - properties + + let displayMode: [DisplayModeItem] = [ + DisplayModeItem(title: "라이트 모드", image: UIImage(systemName: "circle")), + DisplayModeItem(title: "다크 모드", image: UIImage(systemName: "circle.fill")), + DisplayModeItem(title: "시스템 설정 모드", image: UIImage(systemName: "circle.righthalf.filled")) + ] + + // MARK: - life cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + + guard let contentView = contentView as? DisplayModeView else { return } + contentView.tableView.delegate = self + contentView.tableView.dataSource = self + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("다크 모드 설정") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } + +} + +extension DisplayModeViewController: UITableViewDelegate, UITableViewDataSource { + + // 테이블 뷰의 행 개수 설정 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return displayMode.count + } + + // 테이블 뷰 셀 구성 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "DisplayModeCell") + as? DisplayModeCell else { return UITableViewCell() } + cell.bind(displayMode[indexPath.row]) + return cell + } + + // 셀의 높이 설정 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 65 + } + +} diff --git a/iBox/Sources/Presenter/Profile/ProfileItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift similarity index 88% rename from iBox/Sources/Presenter/Profile/ProfileItemCell.swift rename to iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index 91a3714..3d0619d 100644 --- a/iBox/Sources/Presenter/Profile/ProfileItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -1,5 +1,5 @@ // -// ProfileItemCell.swift +// MyPageItemCell.swift // iBox // // Created by jiyeon on 1/3/24. @@ -9,7 +9,7 @@ import UIKit import SnapKit -class ProfileItemCell: UITableViewCell, BaseViewProtocol { +class MyPageItemCell: UITableViewCell, BaseViewProtocol { // MARK: - UI @@ -19,7 +19,6 @@ class ProfileItemCell: UITableViewCell, BaseViewProtocol { } let descriptionLabel = UILabel().then { - $0.text = "예시입니당" $0.font = .systemFont(ofSize: 13, weight: .regular) $0.textColor = .gray } @@ -36,13 +35,14 @@ class ProfileItemCell: UITableViewCell, BaseViewProtocol { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) configureUI() + selectionStyle = .none // 셀 선택했을 때 회색으로 변하는 것 비활성화 } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - // MARK: BaseViewProtocol + // MARK: - BaseViewProtocol func configureUI() { addSubview(titleLabel) diff --git a/iBox/Sources/Presenter/Profile/ProfileView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift similarity index 83% rename from iBox/Sources/Presenter/Profile/ProfileView.swift rename to iBox/Sources/Presenter/MyPage/MyPageView.swift index 5a31981..976188a 100644 --- a/iBox/Sources/Presenter/Profile/ProfileView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -7,15 +7,17 @@ import UIKit -class ProfileView: BaseView { +class MyPageView: BaseView { - let profileView = UIView()/*.then { - $0.backgroundColor = .systemPink - }*/ + // MARK: - UI + + let profileView = UIView().then { + $0.isUserInteractionEnabled = true + } let profileImageView = UIImageView().then { $0.image = UIImage(systemName: "person.crop.circle") - $0.tintColor = .box + $0.tintColor = .box2 } let profileLabel = UILabel().then { @@ -31,10 +33,13 @@ class ProfileView: BaseView { } let tableView = UITableView().then { - $0.register(ProfileItemCell.self, forCellReuseIdentifier: "ProfileItemCell") + $0.register(MyPageItemCell.self, forCellReuseIdentifier: "MyPageItemCell") $0.separatorStyle = .none + $0.sectionHeaderTopPadding = 0 } + // MARK: - BaseViewProtocol + override func configureUI() { addSubview(profileView) profileView.addSubview(profileImageView) @@ -50,7 +55,7 @@ class ProfileView: BaseView { profileImageView.snp.makeConstraints { $0.left.equalToSuperview().inset(20) $0.centerY.equalToSuperview() - $0.width.height.equalTo(60) + $0.width.height.equalTo(50) } profileLabel.snp.makeConstraints { diff --git a/iBox/Sources/Presenter/Profile/ProfileViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift similarity index 52% rename from iBox/Sources/Presenter/Profile/ProfileViewController.swift rename to iBox/Sources/Presenter/MyPage/MyPageViewController.swift index e66fcf0..8b861e6 100644 --- a/iBox/Sources/Presenter/Profile/ProfileViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -1,5 +1,5 @@ // -// ProfileViewController.swift +// MyPageViewController.swift // iBox // // Created by 이지현 on 12/27/23. @@ -7,18 +7,18 @@ import UIKit -class ProfileViewController: BaseNavigationBarViewController { +class MyPageViewController: BaseNavigationBarViewController { // MARK: - properties - var profileSections: [ProfileSection] = [ + var myPageSections: [MyPageSection] = [ .init(title: "settings", items: [ - ProfileItem(title: "다크 모드") + MyPageItem(title: "다크 모드", viewController: DisplayModeViewController()) ]), .init(title: "help", items: [ - ProfileItem(title: "이용 가이드"), - ProfileItem(title: "앱 피드백"), - ProfileItem(title: "개발자 정보") + MyPageItem(title: "이용 가이드"), + MyPageItem(title: "앱 피드백"), + MyPageItem(title: "개발자 정보", description: "지쿠 😆✌🏻") ]) ] @@ -26,46 +26,59 @@ class ProfileViewController: BaseNavigationBarViewController { override func viewDidLoad() { super.viewDidLoad() - guard let contentView = contentView as? ProfileView else { return } + guard let contentView = contentView as? MyPageView else { return } + contentView.tableView.delegate = self contentView.tableView.dataSource = self + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(profileViewTapped)) + contentView.profileView.addGestureRecognizer(tapGesture) } + // MARK: - BaseNavigationBarViewControllerProtocol + override func setupNavigationBar() { - setNavigationBarTitleLabelText("Profile") + setNavigationBarTitleLabelText("My Page") + } + + // MARK: - functions + + @objc func profileViewTapped(_ gesture: UITapGestureRecognizer) { + let viewController = ProfileViewController() + navigationController?.pushViewController(viewController, animated: true) } } -extension ProfileViewController: UITableViewDelegate, UITableViewDataSource { +extension MyPageViewController: UITableViewDelegate, UITableViewDataSource { // 테이블 뷰의 섹션 개수 설정 func numberOfSections(in tableView: UITableView) -> Int { - return profileSections.count + return myPageSections.count } // 테이블 뷰의 행 개수 설정 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return profileSections[section].items.count + return myPageSections[section].items.count } // 테이블 뷰 셀 구성 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileItemCell") - as? ProfileItemCell else { return UITableViewCell() } - let profileItem = profileSections[indexPath.section].items[indexPath.row] - cell.titleLabel.text = profileItem.title + guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyPageItemCell") + as? MyPageItemCell else { return UITableViewCell() } + let item = myPageSections[indexPath.section].items[indexPath.row] + cell.titleLabel.text = item.title + cell.descriptionLabel.text = item.description return cell } // 셀의 높이 설정 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 + return 65 } // 섹션 헤더의 View 설정 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { -// if section == 0 { return nil } let headerView = UIView() headerView.backgroundColor = .systemGroupedBackground return headerView @@ -78,8 +91,8 @@ extension ProfileViewController: UITableViewDelegate, UITableViewDataSource { // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let profileItem = profileSections[indexPath.section].items[indexPath.row] - guard let viewController = profileItem.viewController else { return } + let item = myPageSections[indexPath.section].items[indexPath.row] + guard let viewController = item.viewController else { return } navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift b/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift new file mode 100644 index 0000000..de9b309 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift @@ -0,0 +1,17 @@ +// +// ProfileView.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +class ProfileView: BaseView { + + // MARK: - BaseViewProtocol + + override func configureUI() { + } + +} diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift b/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift new file mode 100644 index 0000000..20495b5 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift @@ -0,0 +1,27 @@ +// +// ProfileViewController.swift +// iBox +// +// Created by jiyeon on 1/3/24. +// + +import UIKit + +class ProfileViewController: BaseNavigationBarViewController { + + // MARK: - life cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() // 얘는 왜 여기에 적어줘야 전부 다 적용이 될까 ..? 🧐 + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("내 정보 수정하기") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } + +} From 957021a4e4f2ed0480d67f70680faffaf0d0be61 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 4 Jan 2024 12:43:00 +0900 Subject: [PATCH 007/370] =?UTF-8?q?feat:=20DisplayModeViewController=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/DisplayModeItem.swift | 13 +++++++++++++ .../MyPage/DisplayMode/DisplayModeCell.swift | 14 ++++++++++++-- .../DisplayMode/DisplayModeViewController.swift | 16 ++++++++++------ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 iBox/Sources/Model/DisplayModeItem.swift diff --git a/iBox/Sources/Model/DisplayModeItem.swift b/iBox/Sources/Model/DisplayModeItem.swift new file mode 100644 index 0000000..e7e94d1 --- /dev/null +++ b/iBox/Sources/Model/DisplayModeItem.swift @@ -0,0 +1,13 @@ +// +// DisplayModeItem.swift +// iBox +// +// Created by jiyeon on 1/4/24. +// + +import UIKit + +struct DisplayModeItem { + var title: String + var image: UIImage? +} diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift index 52b2a17..3ea15ce 100644 --- a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift +++ b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift @@ -21,7 +21,7 @@ class DisplayModeCell: UITableViewCell, BaseViewProtocol { } let selectButton = UIButton().then { - $0.tintColor = .gray + $0.configuration = .plain() } // MARK: - initializer @@ -46,7 +46,7 @@ class DisplayModeCell: UITableViewCell, BaseViewProtocol { displayModeImageView.snp.makeConstraints { $0.left.equalToSuperview().inset(20) $0.centerY.equalToSuperview() - $0.width.height.equalTo(25) + $0.width.height.equalTo(23) } titleLabel.snp.makeConstraints { @@ -68,4 +68,14 @@ class DisplayModeCell: UITableViewCell, BaseViewProtocol { displayModeImageView.image = item.image } + func setupSelectButton(_ selected: Bool) { + if selected { + selectButton.configuration?.image = UIImage(systemName: "circle.inset.filled") + selectButton.tintColor = .box2 + } else { + selectButton.configuration?.image = UIImage(systemName: "circle") + selectButton.tintColor = .gray + } + } + } diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift index 32c247f..9386c29 100644 --- a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift +++ b/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift @@ -7,11 +7,6 @@ import UIKit -struct DisplayModeItem { - var title: String - var image: UIImage? -} - class DisplayModeViewController: BaseNavigationBarViewController { // MARK: - properties @@ -22,6 +17,8 @@ class DisplayModeViewController: BaseNavigationBarViewController CGFloat { - return 65 + return 55 + } + + // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + selected = indexPath.row + tableView.reloadData() // 다시 그리기 } } From 753343482c1a55e0a8c1ca114e2fe5863a8ff1e1 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 14:37:22 +0900 Subject: [PATCH 008/370] =?UTF-8?q?feat:=20table=20view=20expand/close=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 53 +++++++++++++++++++++++-- iBox/Sources/BoxList/Model/Folder.swift | 19 +++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 iBox/Sources/BoxList/Model/Folder.swift diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index ef023f0..2698e24 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -6,10 +6,18 @@ // import UIKit +import SnapKit class BoxListView: UIView { - let folders = ["folder1", "folder2", "folder3"] + var folderArr = [ + Folder(name: "folder1", webs: [ + Web(name: "42 Intra", url: "https://profile.intra.42.fr/"), + Web(name: "42Where", url: "https://where42.kr/") + ]), + Folder(name: "folder2", webs: [Web(name: "Cabi", url: "https://cabi.42seoul.io/")]), + Folder(name: "folder3", webs: []) + ] private lazy var tableView = { let tableView = UITableView() @@ -47,19 +55,56 @@ class BoxListView: UIView { } extension BoxListView: UITableViewDataSource { + + func numberOfSections(in tableView: UITableView) -> Int { + return folderArr.count + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return folders.count + if !folderArr[section].isExpanded { + return 0 + } + return folderArr[section].webs.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) - cell.textLabel?.text = folders[indexPath.row] - cell.backgroundColor = .clear + cell.textLabel?.text = folderArr[indexPath.section].webs[indexPath.row].name return cell } } extension BoxListView: UITableViewDelegate { + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let button = UIButton(type: .system) + button.setTitle(folderArr[section].name, for: .normal) + button.setTitleColor(.label, for: .normal) + button.backgroundColor = ColorPalette.tableViewBackgroundColor + button.titleLabel?.font = .boldSystemFont(ofSize: 16) + button.tag = section + + button.addTarget(self, action: #selector(handleExpandClose), for: .touchUpInside) + + return button + } + @objc private func handleExpandClose(button: UIButton) { + let section = button.tag + + var indexPaths = [IndexPath]() + for row in folderArr[section].webs.indices { + let indexPath = IndexPath(row: row, section: section) + indexPaths.append(indexPath) + } + + folderArr[section].isExpanded.toggle() + + if folderArr[section].isExpanded { + tableView.insertRows(at: indexPaths, with: .fade) + } else { + tableView.deleteRows(at: indexPaths, with: .fade) + } + } } + diff --git a/iBox/Sources/BoxList/Model/Folder.swift b/iBox/Sources/BoxList/Model/Folder.swift new file mode 100644 index 0000000..594c825 --- /dev/null +++ b/iBox/Sources/BoxList/Model/Folder.swift @@ -0,0 +1,19 @@ +// +// Folder.swift +// iBox +// +// Created by 이지현 on 1/4/24. +// + +import Foundation + +struct Folder { + let name: String + let webs: [Web] + var isExpanded: Bool = true +} + +struct Web { + let name: String + let url: String +} From 9b2fd95be5062cc752a063b0f3038955c2477df8 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 14:58:01 +0900 Subject: [PATCH 009/370] =?UTF-8?q?feat:=20WebViewController=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 11 +++++++++++ .../BoxList/BoxListViewController.swift | 12 +++++++++++- iBox/Sources/Web/WebViewController.swift | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 iBox/Sources/Web/WebViewController.swift diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 2698e24..45e7cfb 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -8,7 +8,12 @@ import UIKit import SnapKit +protocol BoxListViewDelegate: AnyObject { + func didSelectWeb(at url: String) +} + class BoxListView: UIView { + weak var delegate: BoxListViewDelegate? var folderArr = [ Folder(name: "folder1", webs: [ @@ -69,6 +74,7 @@ extension BoxListView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + cell.selectionStyle = .none cell.textLabel?.text = folderArr[indexPath.section].webs[indexPath.row].name return cell } @@ -106,5 +112,10 @@ extension BoxListView: UITableViewDelegate { tableView.deleteRows(at: indexPaths, with: .fade) } } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let webUrl = folderArr[indexPath.section].webs[indexPath.row].url + delegate?.didSelectWeb(at: webUrl) + } } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index f753544..9938f4e 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -11,8 +11,18 @@ class BoxListViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() + baseView.delegate = self + title = "iBox" - navigationController?.navigationBar.prefersLargeTitles = true // BaseViewController에 추가해도 될 듯? + navigationController?.navigationBar.prefersLargeTitles = true } } + +extension BoxListViewController: BoxListViewDelegate { + func didSelectWeb(at url: String) { + let viewController = WebViewController() + viewController.selectedWebsite = url + navigationController?.pushViewController(viewController, animated: true) + } +} diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift new file mode 100644 index 0000000..22da71c --- /dev/null +++ b/iBox/Sources/Web/WebViewController.swift @@ -0,0 +1,19 @@ +// +// WebViewController.swift +// iBox +// +// Created by 이지현 on 1/4/24. +// + +import UIKit + +class WebViewController: UIViewController { + var selectedWebsite: String? + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + + } + +} From e387b009882ab13d35b2b0478e143bb0ac9c51ad Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 15:56:14 +0900 Subject: [PATCH 010/370] feat: WebView --- iBox/Sources/Web/WebView.swift | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 iBox/Sources/Web/WebView.swift diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift new file mode 100644 index 0000000..ed0acd9 --- /dev/null +++ b/iBox/Sources/Web/WebView.swift @@ -0,0 +1,8 @@ +// +// WebView.swift +// iBox +// +// Created by 이지현 on 1/4/24. +// + +import Foundation From 6ee34c49d6effe2535a687a82cc538713587c4e5 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 17:38:20 +0900 Subject: [PATCH 011/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/FolderButton.swift | 12 ++++++++++++ iBox/Sources/BoxList/FolderHeaderView.swift | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 iBox/Sources/BoxList/FolderButton.swift create mode 100644 iBox/Sources/BoxList/FolderHeaderView.swift diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift new file mode 100644 index 0000000..dba1f14 --- /dev/null +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -0,0 +1,12 @@ +// +// FolderButton.swift +// iBox +// +// Created by 이지현 on 1/4/24. +// + +import UIKit + +class FolderButton: UButton { + +} diff --git a/iBox/Sources/BoxList/FolderHeaderView.swift b/iBox/Sources/BoxList/FolderHeaderView.swift new file mode 100644 index 0000000..e82a2ba --- /dev/null +++ b/iBox/Sources/BoxList/FolderHeaderView.swift @@ -0,0 +1,20 @@ +// +// FolderHeaderView.swift +// iBox +// +// Created by 이지현 on 1/4/24. +// + +import UIKit + +class FolderHeaderView: UITableViewHeaderFooterView { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} From 9afbbffb06f07129487d8c2bc2fc7af4bf5bb631 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 17:52:42 +0900 Subject: [PATCH 012/370] =?UTF-8?q?feat:=20boxlist=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 86 ++++++++++++++----- .../BoxList/BoxListViewController.swift | 3 +- iBox/Sources/BoxList/FolderButton.swift | 71 ++++++++++++++- iBox/Sources/BoxList/FolderHeaderView.swift | 20 ----- iBox/Sources/BoxList/Model/Folder.swift | 3 +- iBox/Sources/ColorPalette.swift | 51 +++++++---- iBox/Sources/Web/WebView.swift | 50 ++++++++++- iBox/Sources/Web/WebViewController.swift | 6 +- 8 files changed, 224 insertions(+), 66 deletions(-) delete mode 100644 iBox/Sources/BoxList/FolderHeaderView.swift diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 45e7cfb..f536daf 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -6,36 +6,53 @@ // import UIKit + import SnapKit protocol BoxListViewDelegate: AnyObject { - func didSelectWeb(at url: String) + func didSelectWeb(at url: String, withName name: String) } class BoxListView: UIView { weak var delegate: BoxListViewDelegate? var folderArr = [ - Folder(name: "folder1", webs: [ + Folder(name: "기본 폴더", color: .gray, webs: [ Web(name: "42 Intra", url: "https://profile.intra.42.fr/"), - Web(name: "42Where", url: "https://where42.kr/") + Web(name: "42Where", url: "https://where42.kr/"), + Web(name: "42Stat", url: "https://stat.42seoul.kr/"), + Web(name: "집현전", url: "https://42library.kr/") ]), - Folder(name: "folder2", webs: [Web(name: "Cabi", url: "https://cabi.42seoul.io/")]), - Folder(name: "folder3", webs: []) + Folder(name: "새 폴더", color: .green, webs: [Web(name: "Cabi", url: "https://cabi.42seoul.io/")], isOpened: false), + Folder(name: "새 폴더(2)", color: .yellow, webs: [Web(name: "24HANE", url: "https://24hoursarenotenough.42seoul.kr/")], isOpened: false) ] + private lazy var backgroundView = { + let view = UIView() + view.clipsToBounds = true + view.layer.cornerRadius = 20 + view.backgroundColor = ColorPalette.tableViewBackgroundColor + + view.addSubview(tableView) + tableView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview().offset(10) + make.leading.trailing.equalToSuperview() + } + return view + }() + private lazy var tableView = { let tableView = UITableView() tableView.dataSource = self tableView.delegate = self tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") - tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: frame.width, height: 10)) - tableView.separatorInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + tableView.sectionHeaderTopPadding = 0 +// tableView.separatorInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) tableView.clipsToBounds = true tableView.layer.cornerRadius = 20 - tableView.backgroundColor = ColorPalette.tableViewBackgroundColor - tableView.separatorColor = .secondaryLabel + tableView.backgroundColor = .clear + tableView.separatorColor = .clear return tableView }() @@ -51,8 +68,8 @@ class BoxListView: UIView { } private func setupLayout() { - addSubview(tableView) - tableView.snp.makeConstraints { make in + addSubview(backgroundView) + backgroundView.snp.makeConstraints { make in make.top.equalTo(safeAreaLayoutGuide).inset(10) make.leading.trailing.bottom.equalTo(safeAreaLayoutGuide).inset(20) } @@ -66,7 +83,7 @@ extension BoxListView: UITableViewDataSource { } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if !folderArr[section].isExpanded { + if !folderArr[section].isOpened { return 0 } return folderArr[section].webs.count @@ -75,27 +92,50 @@ extension BoxListView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.selectionStyle = .none + cell.backgroundColor = .clear cell.textLabel?.text = folderArr[indexPath.section].webs[indexPath.row].name + cell.imageView?.image = UIImage(systemName: "ellipsis.rectangle.fill") + cell.imageView?.tintColor = .systemGray return cell } } extension BoxListView: UITableViewDelegate { + + public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + let view = UIView() + let line = UIView() + view.addSubview(line) + line.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.leading.trailing.equalToSuperview().inset(15) + } + view.backgroundColor = ColorPalette.tableViewBackgroundColor + line.backgroundColor = .tertiaryLabel + return view + } + + public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + return 0.3 + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 50 + } + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let button = UIButton(type: .system) - button.setTitle(folderArr[section].name, for: .normal) - button.setTitleColor(.label, for: .normal) - button.backgroundColor = ColorPalette.tableViewBackgroundColor - button.titleLabel?.font = .boldSystemFont(ofSize: 16) + let button = FolderButton(isOpen: folderArr[section].isOpened) + button.setFolderName(folderArr[section].name) + button.setFolderColor(folderArr[section].color.toUIColor()) button.tag = section - button.addTarget(self, action: #selector(handleExpandClose), for: .touchUpInside) + button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside) return button } - @objc private func handleExpandClose(button: UIButton) { + @objc private func handleOpenClose(button: FolderButton) { let section = button.tag var indexPaths = [IndexPath]() @@ -104,9 +144,10 @@ extension BoxListView: UITableViewDelegate { indexPaths.append(indexPath) } - folderArr[section].isExpanded.toggle() + folderArr[section].isOpened.toggle() + button.toggleStatus() - if folderArr[section].isExpanded { + if folderArr[section].isOpened { tableView.insertRows(at: indexPaths, with: .fade) } else { tableView.deleteRows(at: indexPaths, with: .fade) @@ -115,7 +156,8 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let webUrl = folderArr[indexPath.section].webs[indexPath.row].url - delegate?.didSelectWeb(at: webUrl) + let webName = folderArr[indexPath.section].webs[indexPath.row].name + delegate?.didSelectWeb(at: webUrl, withName: webName) } } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 9938f4e..35806f8 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -20,8 +20,9 @@ class BoxListViewController: BaseViewController { } extension BoxListViewController: BoxListViewDelegate { - func didSelectWeb(at url: String) { + func didSelectWeb(at url: String, withName name: String) { let viewController = WebViewController() + viewController.title = name viewController.selectedWebsite = url navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index dba1f14..a2587f9 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -7,6 +7,75 @@ import UIKit -class FolderButton: UButton { +import SnapKit +class FolderButton: UIButton { + private var isOpen: Bool = true + + private lazy var folderImageView = { + let imageView = UIImageView() + imageView.image = UIImage(systemName: "folder.fill") + imageView.contentMode = .scaleAspectFit + return imageView + }() + + private lazy var folderNameLabel = { + let label = UILabel() + label.textColor = .label + label.font = .systemFont(ofSize: 18, weight: .semibold) + return label + }() + + private lazy var openCloseImageView = { + let imageView = UIImageView() + imageView.tintColor = .tertiaryLabel + imageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") + return imageView + }() + + init(isOpen: Bool) { + self.isOpen = isOpen + super.init(frame: .zero) + backgroundColor = .clear + + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupLayout() { + addSubview(folderImageView) + folderImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.width.height.equalTo(30) + make.leading.equalToSuperview().offset(20) + } + + addSubview(folderNameLabel) + folderNameLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.leading.equalTo(folderImageView.snp.trailing).offset(10) + } + + addSubview(openCloseImageView) + openCloseImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.trailing.equalToSuperview().offset(-20) + } + } + + func setFolderName(_ name: String) { + folderNameLabel.text = name + } + + func setFolderColor(_ color: UIColor) { + folderImageView.tintColor = color + } + + func toggleStatus() { + isOpen = !isOpen + openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") + } } diff --git a/iBox/Sources/BoxList/FolderHeaderView.swift b/iBox/Sources/BoxList/FolderHeaderView.swift deleted file mode 100644 index e82a2ba..0000000 --- a/iBox/Sources/BoxList/FolderHeaderView.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// FolderHeaderView.swift -// iBox -// -// Created by 이지현 on 1/4/24. -// - -import UIKit - -class FolderHeaderView: UITableViewHeaderFooterView { - - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code - } - */ - -} diff --git a/iBox/Sources/BoxList/Model/Folder.swift b/iBox/Sources/BoxList/Model/Folder.swift index 594c825..9ea6fc4 100644 --- a/iBox/Sources/BoxList/Model/Folder.swift +++ b/iBox/Sources/BoxList/Model/Folder.swift @@ -9,8 +9,9 @@ import Foundation struct Folder { let name: String + let color: ColorName let webs: [Web] - var isExpanded: Bool = true + var isOpened: Bool = true } struct Web { diff --git a/iBox/Sources/ColorPalette.swift b/iBox/Sources/ColorPalette.swift index 5b290a4..95084d5 100644 --- a/iBox/Sources/ColorPalette.swift +++ b/iBox/Sources/ColorPalette.swift @@ -7,33 +7,48 @@ import UIKit +enum ColorName: String { + case gray + case green + case red + case blue + case yellow + + func toUIColor() -> UIColor { + switch self { + case .gray: + return UIColor.systemGray2 + case .green: + return UIColor.systemGreen + case .red: + return UIColor.systemRed + case .blue: + return UIColor.systemBlue + case .yellow: + return UIColor.systemYellow + } + } +} + struct ColorPalette { public static var backgroundColor = { - if #available(iOS 13, *) { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return UIColor.black - } else { - return .systemGray5 - } + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return UIColor.black + } else { + return .systemGray5 } - } else { - return .systemGray5 } }() public static var tableViewBackgroundColor = { - if #available(iOS 13, *) { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return UIColor.systemGray5 - } else { - return .white - } + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return UIColor.systemGray5 + } else { + return .white } - } else { - return .white } }() diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index ed0acd9..bd72e75 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -5,4 +5,52 @@ // Created by 이지현 on 1/4/24. // -import Foundation +import UIKit +import WebKit + +import SnapKit + +class WebView: UIView { + var selectedWebsite: String? { + didSet { + loadWebsite() + } + } + + private lazy var webView = { + let webView = WKWebView() + webView.navigationDelegate = self +// webView.scrollView.contentInsetAdjustmentBehavior = .always + + return webView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .systemBackground + + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupLayout() { + addSubview(webView) + webView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + private func loadWebsite() { + guard let website = selectedWebsite, let url = URL(string: website) else { return } + webView.load(URLRequest(url: url)) + webView.allowsBackForwardNavigationGestures = true + } + +} + +extension WebView: WKNavigationDelegate { + +} diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 22da71c..5b47a29 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -7,13 +7,15 @@ import UIKit -class WebViewController: UIViewController { +class WebViewController: BaseViewController { var selectedWebsite: String? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground - + navigationItem.largeTitleDisplayMode = .never + + baseView.selectedWebsite = selectedWebsite } } From 91afe152aeba20ac4227895310e2a17360ff3459 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 18:10:10 +0900 Subject: [PATCH 013/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=83=89=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/ColorPalette.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iBox/Sources/ColorPalette.swift b/iBox/Sources/ColorPalette.swift index 95084d5..6b611c1 100644 --- a/iBox/Sources/ColorPalette.swift +++ b/iBox/Sources/ColorPalette.swift @@ -53,3 +53,4 @@ struct ColorPalette { }() } + From af962af52291c62e613e7bea16a53b7854cb28f8 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 18:21:20 +0900 Subject: [PATCH 014/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EB=B0=8F?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=83=89=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 2 +- iBox/Sources/ColorPalette.swift | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index f536daf..93d1e45 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -95,7 +95,7 @@ extension BoxListView: UITableViewDataSource { cell.backgroundColor = .clear cell.textLabel?.text = folderArr[indexPath.section].webs[indexPath.row].name cell.imageView?.image = UIImage(systemName: "ellipsis.rectangle.fill") - cell.imageView?.tintColor = .systemGray + cell.imageView?.tintColor = ColorPalette.webIconColor return cell } diff --git a/iBox/Sources/ColorPalette.swift b/iBox/Sources/ColorPalette.swift index 6b611c1..da9113b 100644 --- a/iBox/Sources/ColorPalette.swift +++ b/iBox/Sources/ColorPalette.swift @@ -35,7 +35,7 @@ struct ColorPalette { public static var backgroundColor = { return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in if UITraitCollection.userInterfaceStyle == .dark { - return UIColor.black + return .black } else { return .systemGray5 } @@ -45,12 +45,32 @@ struct ColorPalette { public static var tableViewBackgroundColor = { return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in if UITraitCollection.userInterfaceStyle == .dark { - return UIColor.systemGray5 + return .systemGray5 } else { return .white } } }() + public static var folderGray = { + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return .systemGray2 + } else { + return .systemGray3 + } + } + }() + + public static var webIconColor = { + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return .systemGray + } else { + return .black + } + } + }() + } From 95f1b3709929d1064be1fbf8d0f3112182b6c2e3 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 4 Jan 2024 20:39:11 +0900 Subject: [PATCH 015/370] =?UTF-8?q?refactor:=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/{BoxList => }/Model/Folder.swift | 0 .../Sources/{ => Presenter}/BoxList/BoxListView.swift | 6 +++--- .../BoxList/BoxListViewController.swift | 11 +++++++---- .../{ => Presenter}/BoxList/FolderButton.swift | 0 iBox/Sources/{ => Presenter}/ColorPalette.swift | 10 ---------- iBox/Sources/{ => Presenter}/Web/WebView.swift | 2 +- .../{ => Presenter}/Web/WebViewController.swift | 9 +++++++-- 7 files changed, 18 insertions(+), 20 deletions(-) rename iBox/Sources/{BoxList => }/Model/Folder.swift (100%) rename iBox/Sources/{ => Presenter}/BoxList/BoxListView.swift (97%) rename iBox/Sources/{ => Presenter}/BoxList/BoxListViewController.swift (64%) rename iBox/Sources/{ => Presenter}/BoxList/FolderButton.swift (100%) rename iBox/Sources/{ => Presenter}/ColorPalette.swift (83%) rename iBox/Sources/{ => Presenter}/Web/WebView.swift (97%) rename iBox/Sources/{ => Presenter}/Web/WebViewController.swift (52%) diff --git a/iBox/Sources/BoxList/Model/Folder.swift b/iBox/Sources/Model/Folder.swift similarity index 100% rename from iBox/Sources/BoxList/Model/Folder.swift rename to iBox/Sources/Model/Folder.swift diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift similarity index 97% rename from iBox/Sources/BoxList/BoxListView.swift rename to iBox/Sources/Presenter/BoxList/BoxListView.swift index 93d1e45..dd0cf4e 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -13,7 +13,7 @@ protocol BoxListViewDelegate: AnyObject { func didSelectWeb(at url: String, withName name: String) } -class BoxListView: UIView { +class BoxListView: BaseView { weak var delegate: BoxListViewDelegate? var folderArr = [ @@ -31,7 +31,7 @@ class BoxListView: UIView { let view = UIView() view.clipsToBounds = true view.layer.cornerRadius = 20 - view.backgroundColor = ColorPalette.tableViewBackgroundColor + view.backgroundColor = .systemGroupedBackground view.addSubview(tableView) tableView.snp.makeConstraints { make in @@ -58,7 +58,7 @@ class BoxListView: UIView { override init(frame: CGRect) { super.init(frame: frame) - backgroundColor = ColorPalette.backgroundColor + backgroundColor = .systemBackground setupLayout() } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift similarity index 64% rename from iBox/Sources/BoxList/BoxListViewController.swift rename to iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 35806f8..b42c9fd 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -7,14 +7,17 @@ import UIKit -class BoxListViewController: BaseViewController { +class BoxListViewController: BaseNavigationBarViewController { override func viewDidLoad() { super.viewDidLoad() - baseView.delegate = self - title = "iBox" - navigationController?.navigationBar.prefersLargeTitles = true + guard let contentView = contentView as? BoxListView else { return } + contentView.delegate = self + } + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("iBox") } } diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/Presenter/BoxList/FolderButton.swift similarity index 100% rename from iBox/Sources/BoxList/FolderButton.swift rename to iBox/Sources/Presenter/BoxList/FolderButton.swift diff --git a/iBox/Sources/ColorPalette.swift b/iBox/Sources/Presenter/ColorPalette.swift similarity index 83% rename from iBox/Sources/ColorPalette.swift rename to iBox/Sources/Presenter/ColorPalette.swift index da9113b..da77a9b 100644 --- a/iBox/Sources/ColorPalette.swift +++ b/iBox/Sources/Presenter/ColorPalette.swift @@ -32,16 +32,6 @@ enum ColorName: String { struct ColorPalette { - public static var backgroundColor = { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return .black - } else { - return .systemGray5 - } - } - }() - public static var tableViewBackgroundColor = { return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in if UITraitCollection.userInterfaceStyle == .dark { diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Presenter/Web/WebView.swift similarity index 97% rename from iBox/Sources/Web/WebView.swift rename to iBox/Sources/Presenter/Web/WebView.swift index bd72e75..919ca98 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Presenter/Web/WebView.swift @@ -10,7 +10,7 @@ import WebKit import SnapKit -class WebView: UIView { +class WebView: BaseView { var selectedWebsite: String? { didSet { loadWebsite() diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Presenter/Web/WebViewController.swift similarity index 52% rename from iBox/Sources/Web/WebViewController.swift rename to iBox/Sources/Presenter/Web/WebViewController.swift index 5b47a29..6e0c75c 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Presenter/Web/WebViewController.swift @@ -7,7 +7,7 @@ import UIKit -class WebViewController: BaseViewController { +class WebViewController: BaseNavigationBarViewController { var selectedWebsite: String? override func viewDidLoad() { @@ -15,7 +15,12 @@ class WebViewController: BaseViewController { view.backgroundColor = .systemBackground navigationItem.largeTitleDisplayMode = .never - baseView.selectedWebsite = selectedWebsite + guard let contentView = contentView as? WebView else { return } + contentView.selectedWebsite = selectedWebsite + } + + override func setupNavigationBar() { + setNavigationBarHidden(true) } } From 81d6965ed431d1c7672e4d5c4d6c8cd8f5077267 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Jan 2024 20:58:50 +0900 Subject: [PATCH 016/370] =?UTF-8?q?build:=20=EB=8B=A4=ED=81=AC=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=20=EC=88=98=EC=A0=95=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 3 +-- iBox/Sources/Presenter/MainTabBarController.swift | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index d32396e..97209e3 100644 --- a/Project.swift +++ b/Project.swift @@ -35,8 +35,7 @@ class iBoxFactory: ProjectFactory { ], ] ] - ], - "UIUserInterfaceStyle": "Light" + ] ] func generateTarget() -> [ProjectDescription.Target] {[ diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index 571cd94..7ffd765 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -24,6 +24,7 @@ class MainTabBarController: UITabBarController { setupViewController(viewController: MyPageViewController(), image: UIImage(systemName: "person.fill")) ] tabBar.tintColor = .box + tabBar.backgroundColor = .systemBackground } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { From 7e87b3c6a172096a8d95adb2cdb2558c7481612c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Fri, 5 Jan 2024 13:14:19 +0900 Subject: [PATCH 017/370] =?UTF-8?q?feat:=20BaseBottomSheetViewController?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: #25 --- .../Base/BaseBottomSheetViewController.swift | 128 ++++++++++++++++++ .../BaseNavigationBarViewController.swift | 5 + .../BoxList/AddBookmark/AddBookmarkView.swift | 20 +++ .../AddBookmarkViewController.swift | 12 ++ .../BoxList/BoxListViewController.swift | 8 ++ 5 files changed, 173 insertions(+) create mode 100644 iBox/Sources/Base/BaseBottomSheetViewController.swift create mode 100644 iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift create mode 100644 iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift diff --git a/iBox/Sources/Base/BaseBottomSheetViewController.swift b/iBox/Sources/Base/BaseBottomSheetViewController.swift new file mode 100644 index 0000000..02f2de8 --- /dev/null +++ b/iBox/Sources/Base/BaseBottomSheetViewController.swift @@ -0,0 +1,128 @@ +// +// BaseBottomSheetViewController.swift +// iBox +// +// Created by jiyeon on 1/5/24. +// + +import UIKit + +import SnapKit + +class BaseBottomSheetViewController: UIViewController { + + // MARK: - properties + + var bottomSheetHeight: CGFloat + + // MARK: - UI + + let dimmedView = UIView().then { + $0.backgroundColor = .clear + $0.isUserInteractionEnabled = true + } + + let sheetView = View().then { + $0.clipsToBounds = true + $0.layer.cornerRadius = 30 + $0.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] // 왼쪽 위, 오른쪽 위 둥글게 + } + + // MARK: - initializer + + init(bottomSheetHeight: CGFloat) { + self.bottomSheetHeight = bottomSheetHeight + super.init(nibName: nil, bundle: nil) + modalPresentationStyle = .overFullScreen + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - life cycle + + override func viewDidLoad() { + super.viewDidLoad() + configureUI() + setupGestureRecognizer() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + showBottomSheets() + } + + // MARK: - configure UI + + private func configureUI() { + view.addSubview(dimmedView) + view.addSubview(sheetView) + + dimmedView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + sheetView.snp.makeConstraints { + $0.top.equalTo(view.snp.bottom) + $0.left.right.equalToSuperview() + $0.height.equalTo(bottomSheetHeight) + } + } + + // MARK: - functions + + private func setupGestureRecognizer() { + // TapGesture + let dimmedTap = UITapGestureRecognizer(target: self, action: #selector(dimmedViewTapped)) + dimmedView.addGestureRecognizer(dimmedTap) + + // SwipeGesture + let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(panGesture)) + swipeGesture.direction = .down + view.addGestureRecognizer(swipeGesture) + } + + @objc private func dimmedViewTapped(_ tapRecognizer: UITapGestureRecognizer) { + hideBottomSheets() + } + + @objc private func panGesture(_ recognizer: UISwipeGestureRecognizer) { + if recognizer.state == .ended { + switch recognizer.direction { + case .down: + hideBottomSheets() + default: + break + } + } + } + + private func showBottomSheets() { + sheetView.snp.remakeConstraints { + $0.left.bottom.right.equalToSuperview() + $0.height.equalTo(bottomSheetHeight) + } + UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { + self.dimmedView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75) + self.view.layoutIfNeeded() + }) + } + + private func hideBottomSheets() { + sheetView.snp.remakeConstraints { + $0.top.equalTo(view.snp.bottom) + $0.left.right.equalToSuperview() + $0.height.equalTo(bottomSheetHeight) + } + UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { + self.dimmedView.backgroundColor = .clear + self.view.layoutIfNeeded() + }) { _ in + if self.presentingViewController != nil { + self.dismiss(animated: false) + } + } + } + +} diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index 9f06ffd..0193cba 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -26,6 +26,7 @@ protocol BaseNavigationBarViewControllerProtocol { func setNavigationBarHidden(_ hidden: Bool) func setNavigationBarBackButtonHidden(_ hidden: Bool) func setNavigationBarAddButtonHidden(_ hidden: Bool) + func setNavigationBarAddButtonAction(_ selector: Selector) func setNavigationBarTitleLabelText(_ text: String?) func setNavigationBarTitleLabelFont(_ font: UIFont?) func setNavigationBarTitleLabelTextColor(_ color: UIColor?) @@ -114,6 +115,10 @@ class BaseNavigationBarViewController: UIViewController, BaseNav navigationBar.addButton.isHidden = hidden } + func setNavigationBarAddButtonAction(_ selector: Selector) { + navigationBar.addButton.addTarget(self, action: selector, for: .touchUpInside) + } + func setNavigationBarTitleLabelText(_ text: String?) { navigationBar.titleLabel.text = text } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift new file mode 100644 index 0000000..1b9fe77 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -0,0 +1,20 @@ +// +// AddBookmarkBottomSheetView.swift +// iBox +// +// Created by jiyeon on 1/5/24. +// + +import UIKit + +import SnapKit + +class AddBookmarkBottomSheetView: BaseView { + + // MARK: - configure UI + + override func configureUI() { + backgroundColor = .systemBackground + } + +} diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift new file mode 100644 index 0000000..25f09f6 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -0,0 +1,12 @@ +// +// AddBookmarkViewController.swift +// iBox +// +// Created by jiyeon on 1/5/24. +// + +import UIKit + +class AddBookmarkBottomSheetViewController: BaseBottomSheetViewController { + +} diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index b42c9fd..3e3d4f3 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -11,6 +11,7 @@ class BoxListViewController: BaseNavigationBarViewController { override func viewDidLoad() { super.viewDidLoad() + setupNavigationBar() guard let contentView = contentView as? BoxListView else { return } contentView.delegate = self @@ -18,6 +19,13 @@ class BoxListViewController: BaseNavigationBarViewController { override func setupNavigationBar() { setNavigationBarTitleLabelText("iBox") + setNavigationBarAddButtonHidden(false) + setNavigationBarAddButtonAction(#selector(addButtonTapped)) + } + + @objc private func addButtonTapped(_ sender: Any?) { + let addBookmarkBottomSheetViewController = AddBookmarkBottomSheetViewController(bottomSheetHeight: 200) + present(addBookmarkBottomSheetViewController, animated: false) } } From cb401bc4af84a8d1770ad0fbe5d8a9ec258b656c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 8 Jan 2024 21:03:01 +0900 Subject: [PATCH 018/370] =?UTF-8?q?feat:=20UserDefaultsManager=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/DisplayModeItem.swift | 13 --- iBox/Sources/Model/Folder.swift | 2 +- iBox/Sources/Model/Theme.swift | 30 +++++++ .../Presenter/FavoriteViewController.swift | 4 +- .../MyPage/MyPageViewController.swift | 2 +- .../ThemeCell.swift} | 18 ++-- .../ThemeView.swift} | 6 +- .../ThemeViewController.swift} | 34 ++++---- iBox/Sources/Utils/UserDefaultsManager.swift | 86 +++++++++++++++++++ 9 files changed, 149 insertions(+), 46 deletions(-) delete mode 100644 iBox/Sources/Model/DisplayModeItem.swift create mode 100644 iBox/Sources/Model/Theme.swift rename iBox/Sources/Presenter/MyPage/{DisplayMode/DisplayModeCell.swift => Theme/ThemeCell.swift} (79%) rename iBox/Sources/Presenter/MyPage/{DisplayMode/DisplayModeView.swift => Theme/ThemeView.swift} (75%) rename iBox/Sources/Presenter/MyPage/{DisplayMode/DisplayModeViewController.swift => Theme/ThemeViewController.swift} (60%) create mode 100644 iBox/Sources/Utils/UserDefaultsManager.swift diff --git a/iBox/Sources/Model/DisplayModeItem.swift b/iBox/Sources/Model/DisplayModeItem.swift deleted file mode 100644 index e7e94d1..0000000 --- a/iBox/Sources/Model/DisplayModeItem.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// DisplayModeItem.swift -// iBox -// -// Created by jiyeon on 1/4/24. -// - -import UIKit - -struct DisplayModeItem { - var title: String - var image: UIImage? -} diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 9ea6fc4..cbb30cf 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -14,7 +14,7 @@ struct Folder { var isOpened: Bool = true } -struct Web { +struct Web: Codable { let name: String let url: String } diff --git a/iBox/Sources/Model/Theme.swift b/iBox/Sources/Model/Theme.swift new file mode 100644 index 0000000..47d97fa --- /dev/null +++ b/iBox/Sources/Model/Theme.swift @@ -0,0 +1,30 @@ +// +// Theme.swift +// iBox +// +// Created by jiyeon on 1/4/24. +// + +import UIKit + +enum Theme: Codable, CaseIterable { + case light + case dark + case system + + func toString() -> String { + switch self { + case .light: "라이트 모드" + case .dark: "다크 모드" + case .system: "시스템 설정 모드" + } + } + + func toImage() -> UIImage? { + switch self { + case .light: UIImage(systemName: "circle") + case .dark: UIImage(systemName: "circle.fill") + case .system: UIImage(systemName: "circle.righthalf.filled") + } + } +} diff --git a/iBox/Sources/Presenter/FavoriteViewController.swift b/iBox/Sources/Presenter/FavoriteViewController.swift index 7bdd6ab..336ff88 100644 --- a/iBox/Sources/Presenter/FavoriteViewController.swift +++ b/iBox/Sources/Presenter/FavoriteViewController.swift @@ -11,8 +11,8 @@ class FavoriteViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. + let favorite = UserDefaultsManager.favorite.value + print("\(favorite.name) : \(favorite.url)") } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 8b861e6..0858dc7 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -13,7 +13,7 @@ class MyPageViewController: BaseNavigationBarViewController { var myPageSections: [MyPageSection] = [ .init(title: "settings", items: [ - MyPageItem(title: "다크 모드", viewController: DisplayModeViewController()) + MyPageItem(title: "테마", viewController: ThemeViewController()) ]), .init(title: "help", items: [ MyPageItem(title: "이용 가이드"), diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift similarity index 79% rename from iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift rename to iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index 3ea15ce..7c4499b 100644 --- a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -1,5 +1,5 @@ // -// DisplayModeCell.swift +// ThemeCell.swift // iBox // // Created by jiyeon on 1/3/24. @@ -7,11 +7,11 @@ import UIKit -class DisplayModeCell: UITableViewCell, BaseViewProtocol { +class ThemeCell: UITableViewCell, BaseViewProtocol { // MARK: - UI - let displayModeImageView = UIImageView().then { + let themeImageView = UIImageView().then { $0.tintColor = .black } @@ -39,18 +39,18 @@ class DisplayModeCell: UITableViewCell, BaseViewProtocol { // MARK: - BaseViewProtocol func configureUI() { - addSubview(displayModeImageView) + addSubview(themeImageView) addSubview(titleLabel) addSubview(selectButton) - displayModeImageView.snp.makeConstraints { + themeImageView.snp.makeConstraints { $0.left.equalToSuperview().inset(20) $0.centerY.equalToSuperview() $0.width.height.equalTo(23) } titleLabel.snp.makeConstraints { - $0.left.equalTo(displayModeImageView.snp.right).offset(10) + $0.left.equalTo(themeImageView.snp.right).offset(10) $0.centerY.equalToSuperview() } @@ -63,9 +63,9 @@ class DisplayModeCell: UITableViewCell, BaseViewProtocol { // MARK: - functions - func bind(_ item: DisplayModeItem) { - titleLabel.text = item.title - displayModeImageView.image = item.image + func bind(_ theme: Theme) { + titleLabel.text = theme.toString() + themeImageView.image = theme.toImage() } func setupSelectButton(_ selected: Bool) { diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift similarity index 75% rename from iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift rename to iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index 07e4895..9d005e0 100644 --- a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -1,5 +1,5 @@ // -// DisplayModeView.swift +// ThemeView.swift // iBox // // Created by jiyeon on 1/3/24. @@ -9,12 +9,12 @@ import UIKit import SnapKit -class DisplayModeView: BaseView { +class ThemeView: BaseView { // MARK: - UI let tableView = UITableView().then { - $0.register(DisplayModeCell.self, forCellReuseIdentifier: "DisplayModeCell") + $0.register(ThemeCell.self, forCellReuseIdentifier: "ThemeCell") $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 } diff --git a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift similarity index 60% rename from iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift rename to iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift index 9386c29..5f6da74 100644 --- a/iBox/Sources/Presenter/MyPage/DisplayMode/DisplayModeViewController.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift @@ -1,5 +1,5 @@ // -// DisplayModeViewController.swift +// ThemeViewController.swift // iBox // // Created by jiyeon on 1/3/24. @@ -7,17 +7,11 @@ import UIKit -class DisplayModeViewController: BaseNavigationBarViewController { +class ThemeViewController: BaseNavigationBarViewController { // MARK: - properties - let displayMode: [DisplayModeItem] = [ - DisplayModeItem(title: "라이트 모드", image: UIImage(systemName: "circle")), - DisplayModeItem(title: "다크 모드", image: UIImage(systemName: "circle.fill")), - DisplayModeItem(title: "시스템 설정 모드", image: UIImage(systemName: "circle.righthalf.filled")) - ] - - var selected = 0 // 예시 + var selected = UserDefaultsManager.theme.value // MARK: - life cycle @@ -25,11 +19,16 @@ class DisplayModeViewController: BaseNavigationBarViewController Int { - return displayMode.count + return Theme.allCases.count } // 테이블 뷰 셀 구성 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "DisplayModeCell") - as? DisplayModeCell else { return UITableViewCell() } - cell.bind(displayMode[indexPath.row]) - cell.setupSelectButton(indexPath.row == selected) + guard let cell = tableView.dequeueReusableCell(withIdentifier: "ThemeCell") + as? ThemeCell else { return UITableViewCell() } + let theme = Theme.allCases[indexPath.row] + cell.bind(theme) + cell.setupSelectButton(theme == selected) return cell } @@ -63,7 +63,7 @@ extension DisplayModeViewController: UITableViewDelegate, UITableViewDataSource // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - selected = indexPath.row + selected = Theme.allCases[indexPath.row] tableView.reloadData() // 다시 그리기 } diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift new file mode 100644 index 0000000..a60c061 --- /dev/null +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -0,0 +1,86 @@ +// +// UserDefaultsManager.swift +// iBox +// +// Created by jiyeon on 1/8/24. +// + +import Foundation + +enum UserDefaultsAccessKey: String { + case theme // 다크 모드 + case favorite // 즐겨찾기 +} + +final class UserDefaultsManager { + static let theme = UserDefaultValue( + key: .theme, + defaultValue: Theme.system + ) + static let favorite = UserDefaultValue( + key: .favorite, + defaultValue: Web(name: "42 Intra", url: "https://profile.intra.42.fr/") + ) +} + +class UserDefaultValue { + + // MARK: - properties + + /// UserDefaults 항목과 연결된 키 + private var key: UserDefaultsAccessKey + + /// UserDefaults에서 값이 찾아지지 않을 경우 사용할 기본값 + private var defaultValue: T + + /// UserDefaults에 저장된 현재 값 + var value: T { + get { + getObject() ?? defaultValue + } set { + saveObject(newValue) + } + } + + // MARK: - initializer + + /// 키와 기본값을 사용하여 UserDefaultValue를 초기화 + init(key: UserDefaultsAccessKey, defaultValue: T) { + self.key = key + self.defaultValue = defaultValue + if getObject() == nil { // 처음 생성될 때 디폴트값 저장 + saveObject(defaultValue) + } + } + + // MARK: - functions + + /// UserDefaults에서 Codable 객체를 검색 + private func getObject() -> T? { + guard let json = UserDefaults.standard.string(forKey: key.rawValue), + let data = json.data(using: .utf8), + let object = try? JSONDecoder().decode(T.self, from: data) + else { + return nil + } + return object + } + + /// UserDefaults에 Codable 객체를 저장 + private func saveObject(_ value: T?) { + guard let value = value, + let json = try? JSONEncoder().encode(value), + let data = String(data: json, encoding: .utf8) + else { + removeValue() + return + } + UserDefaults.standard.set(data, forKey: key.rawValue) + } + + /// 키와 관련된 항목을 UserDefaults에서 제거 + private func removeValue() { + UserDefaults.standard.removeObject(forKey: key.rawValue) + } + +} From acae684fd1122512624521b64d4d3198b8a38411 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 18 Jan 2024 17:27:36 +0900 Subject: [PATCH 019/370] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=ED=83=AD?= =?UTF-8?q?=20=EC=97=B4=EC=96=B4=EB=86=93=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presenter/BoxList/BoxListView.swift | 2 +- .../BoxList/BoxListViewController.swift | 4 +- .../Presenter/Web/PreloadedWebView.swift | 41 +++++++++++++++++++ .../Web/PreloadedWebViewController.swift | 33 +++++++++++++++ iBox/Sources/SceneDelegate.swift | 11 +++++ iBox/Sources/Utils/WebViewPreloader.swift | 33 +++++++++++++++ 6 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 iBox/Sources/Presenter/Web/PreloadedWebView.swift create mode 100644 iBox/Sources/Presenter/Web/PreloadedWebViewController.swift create mode 100644 iBox/Sources/Utils/WebViewPreloader.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index dd0cf4e..2c6d5b9 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -19,7 +19,7 @@ class BoxListView: BaseView { var folderArr = [ Folder(name: "기본 폴더", color: .gray, webs: [ Web(name: "42 Intra", url: "https://profile.intra.42.fr/"), - Web(name: "42Where", url: "https://where42.kr/"), + Web(name: "42Where", url: "https://www.where42.kr/"), Web(name: "42Stat", url: "https://stat.42seoul.kr/"), Web(name: "집현전", url: "https://42library.kr/") ]), diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 3e3d4f3..5607379 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -32,8 +32,8 @@ class BoxListViewController: BaseNavigationBarViewController { extension BoxListViewController: BoxListViewDelegate { func didSelectWeb(at url: String, withName name: String) { - let viewController = WebViewController() - viewController.title = name + let viewController = PreloadedWebViewController() + viewController.title = name viewController.selectedWebsite = url navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift new file mode 100644 index 0000000..202a489 --- /dev/null +++ b/iBox/Sources/Presenter/Web/PreloadedWebView.swift @@ -0,0 +1,41 @@ +// +// PreloadedWebView.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import UIKit +import WebKit + +import SnapKit + +class PreloadedWebView: BaseView { + var selectedWebsite: String? { + didSet { + getWebView() + } + } + + private var webView: WKWebView? + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .systemBackground + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func getWebView() { + guard let selectedWebsite else { return } + webView = WebViewPreloader.shared.getWebView(for: URL(string: selectedWebsite)!) + guard let webView else { return } + addSubview(webView) + webView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift new file mode 100644 index 0000000..c3872a0 --- /dev/null +++ b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift @@ -0,0 +1,33 @@ +// +// PreloadedWebViewController.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import UIKit + +class PreloadedWebViewController: BaseNavigationBarViewController { + var selectedWebsite: String? + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + navigationItem.largeTitleDisplayMode = .never + + guard let contentView = contentView as? PreloadedWebView else { return } + contentView.selectedWebsite = selectedWebsite + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + guard let selectedWebsite else { return } + WebViewPreloader.shared.resetWebView(for: URL(string: selectedWebsite)!) + } + + override func setupNavigationBar() { + setNavigationBarHidden(true) + } + +} diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 77d235c..f9f319e 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -18,6 +18,17 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.windowScene = windowScene window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 + + // 나중에 userDefaults에 저장해두고 꺼내와서 preload하기 + let urlsToPreload = [ + URL(string: "https://profile.intra.42.fr/")!, + URL(string: "https://www.where42.kr/")!, + URL(string: "https://stat.42seoul.kr/")!, + URL(string: "https://42library.kr/")!, + URL(string: "https://cabi.42seoul.io/")!, + URL(string: "https://24hoursarenotenough.42seoul.kr/")! + ] + WebViewPreloader.shared.preload(urls: urlsToPreload) } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Utils/WebViewPreloader.swift new file mode 100644 index 0000000..d92b7e7 --- /dev/null +++ b/iBox/Sources/Utils/WebViewPreloader.swift @@ -0,0 +1,33 @@ +// +// WebViewPreloader.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import Foundation +import WebKit + +class WebViewPreloader { + static let shared = WebViewPreloader() + private var webViews: [URL: WKWebView] = [:] + + private init() {} + + func preload(urls: [URL]) { + for url in urls { + let webView = WKWebView() + webView.load(URLRequest(url: url)) + webViews[url] = webView + } + } + + func getWebView(for url: URL) -> WKWebView? { + return webViews[url] + } + + func resetWebView(for url: URL) { + webViews[url]?.load(URLRequest(url: url)) + } + +} From 72406f5469ea5f59251b6e345c2f5d02da7b35bb Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 22 Jan 2024 17:33:20 +0900 Subject: [PATCH 020/370] =?UTF-8?q?feat:=20=EB=8B=A4=ED=81=AC=20=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseBottomSheetViewController.swift | 2 +- .../Sources/Base/BaseNavigationBarViewController.swift | 2 +- iBox/Sources/Model/Theme.swift | 8 ++++++++ iBox/Sources/Presenter/BoxList/BoxListView.swift | 2 +- iBox/Sources/Presenter/MyPage/MyPageItemCell.swift | 1 - iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift | 3 +-- .../Presenter/MyPage/Theme/ThemeViewController.swift | 8 +++----- iBox/Sources/SceneDelegate.swift | 4 ++++ iBox/Sources/{Presenter => Utils}/ColorPalette.swift | 10 ++++++++++ 9 files changed, 29 insertions(+), 11 deletions(-) rename iBox/Sources/{Presenter => Utils}/ColorPalette.swift (79%) diff --git a/iBox/Sources/Base/BaseBottomSheetViewController.swift b/iBox/Sources/Base/BaseBottomSheetViewController.swift index 02f2de8..85661cf 100644 --- a/iBox/Sources/Base/BaseBottomSheetViewController.swift +++ b/iBox/Sources/Base/BaseBottomSheetViewController.swift @@ -104,7 +104,7 @@ class BaseBottomSheetViewController: UIViewController { $0.height.equalTo(bottomSheetHeight) } UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { - self.dimmedView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75) + self.dimmedView.backgroundColor = ColorPalette.dimmedViewColor self.view.layoutIfNeeded() }) } diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index 0193cba..d7a31f2 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -52,7 +52,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav // MARK: - properties let backgroundColor: UIColor = .systemBackground - let tintColor: UIColor = .black + let tintColor: UIColor = .label let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) // MARK: - life cycle diff --git a/iBox/Sources/Model/Theme.swift b/iBox/Sources/Model/Theme.swift index 47d97fa..413e934 100644 --- a/iBox/Sources/Model/Theme.swift +++ b/iBox/Sources/Model/Theme.swift @@ -27,4 +27,12 @@ enum Theme: Codable, CaseIterable { case .system: UIImage(systemName: "circle.righthalf.filled") } } + + func toUserInterfaceStyle() -> UIUserInterfaceStyle { + switch self { + case .light: UIUserInterfaceStyle.light + case .dark: UIUserInterfaceStyle.dark + case .system: UIUserInterfaceStyle.unspecified + } + } } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index dd0cf4e..c11e0f5 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -41,7 +41,7 @@ class BoxListView: BaseView { return view }() - private lazy var tableView = { + lazy var tableView = { let tableView = UITableView() tableView.dataSource = self tableView.delegate = self diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index 3d0619d..1c5cdf6 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -15,7 +15,6 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { let titleLabel = UILabel().then { $0.font = .systemFont(ofSize: 16) - $0.textColor = .black } let descriptionLabel = UILabel().then { diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index 7c4499b..8a2cbdb 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -12,12 +12,11 @@ class ThemeCell: UITableViewCell, BaseViewProtocol { // MARK: - UI let themeImageView = UIImageView().then { - $0.tintColor = .black + $0.tintColor = .label } let titleLabel = UILabel().then { $0.font = .systemFont(ofSize: 16) - $0.textColor = .black } let selectButton = UIButton().then { diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift index 5f6da74..5bacd40 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift @@ -24,11 +24,6 @@ class ThemeViewController: BaseNavigationBarViewController { contentView.tableView.dataSource = self } - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - UserDefaultsManager.theme.value = selected - } - // MARK: - BaseNavigationBarViewControllerProtocol override func setupNavigationBar() { @@ -64,7 +59,10 @@ extension ThemeViewController: UITableViewDelegate, UITableViewDataSource { // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { selected = Theme.allCases[indexPath.row] + guard let window = self.view.window else { return } + window.overrideUserInterfaceStyle = selected.toUserInterfaceStyle() tableView.reloadData() // 다시 그리기 + UserDefaultsManager.theme.value = selected } } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 77d235c..d765cc6 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -17,6 +17,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene window?.rootViewController = MainTabBarController() + + // 앱 테마 정보 + window?.overrideUserInterfaceStyle = UserDefaultsManager.theme.value.toUserInterfaceStyle() + window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 } diff --git a/iBox/Sources/Presenter/ColorPalette.swift b/iBox/Sources/Utils/ColorPalette.swift similarity index 79% rename from iBox/Sources/Presenter/ColorPalette.swift rename to iBox/Sources/Utils/ColorPalette.swift index da77a9b..433334c 100644 --- a/iBox/Sources/Presenter/ColorPalette.swift +++ b/iBox/Sources/Utils/ColorPalette.swift @@ -62,5 +62,15 @@ struct ColorPalette { } }() + public static var dimmedViewColor = { + return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in + if UITraitCollection.userInterfaceStyle == .dark { + return UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 0.75) + } else { + return UIColor(red: 0, green: 0, blue: 0, alpha: 0.75) + } + } + }() + } From 1020f20c1baa833c6470054678cf00e4276b365d Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 22 Jan 2024 17:40:23 +0900 Subject: [PATCH 021/370] =?UTF-8?q?fix:=20=EC=8B=A4=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Presenter/BoxList/BoxListView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index c11e0f5..dd0cf4e 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -41,7 +41,7 @@ class BoxListView: BaseView { return view }() - lazy var tableView = { + private lazy var tableView = { let tableView = UITableView() tableView.dataSource = self tableView.delegate = self From 104ae865c4d7a70c71a627e85ad1b59efaa9a0af Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 24 Jan 2024 16:46:21 +0900 Subject: [PATCH 022/370] feat: favoriteViewController --- .../Presenter/BoxList/FolderButton.swift | 2 +- .../Presenter/Favorite/FavoriteView.swift | 36 +++++++++++++++++++ .../Favorite/FavoriteViewController.swift | 26 ++++++++++++++ .../Presenter/FavoriteViewController.swift | 29 --------------- iBox/Sources/SceneDelegate.swift | 9 +++-- iBox/Sources/Utils/WebViewPreloader.swift | 17 +++++++++ 6 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 iBox/Sources/Presenter/Favorite/FavoriteView.swift create mode 100644 iBox/Sources/Presenter/Favorite/FavoriteViewController.swift delete mode 100644 iBox/Sources/Presenter/FavoriteViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/FolderButton.swift b/iBox/Sources/Presenter/BoxList/FolderButton.swift index a2587f9..e0d3f0f 100644 --- a/iBox/Sources/Presenter/BoxList/FolderButton.swift +++ b/iBox/Sources/Presenter/BoxList/FolderButton.swift @@ -36,7 +36,7 @@ class FolderButton: UIButton { init(isOpen: Bool) { self.isOpen = isOpen super.init(frame: .zero) - backgroundColor = .clear + backgroundColor = .systemGroupedBackground setupLayout() } diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Presenter/Favorite/FavoriteView.swift new file mode 100644 index 0000000..3a8380d --- /dev/null +++ b/iBox/Sources/Presenter/Favorite/FavoriteView.swift @@ -0,0 +1,36 @@ +// +// FavoriteView.swift +// iBox +// +// Created by 이지현 on 1/18/24. +// + +import UIKit +import WebKit + +import SnapKit + +class FavoriteView: PreloadedWebView { + + private lazy var webView = WebViewPreloader.shared.getFavoriteView() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .systemBackground + + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupLayout() { + guard let webView else { return } + addSubview(webView) + webView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} diff --git a/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift b/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift new file mode 100644 index 0000000..8fd3527 --- /dev/null +++ b/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift @@ -0,0 +1,26 @@ +// +// FavoriteViewController.swift +// iBox +// +// Created by 이지현 on 12/27/23. +// + +import UIKit + +class FavoriteViewController: BaseNavigationBarViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + guard let _ = contentView as? FavoriteView else { return } + } + + override func viewDidDisappear(_ animated: Bool) { + WebViewPreloader.shared.resetFavoriteView() + } + + override func setupNavigationBar() { + setNavigationBarHidden(true) + } + +} diff --git a/iBox/Sources/Presenter/FavoriteViewController.swift b/iBox/Sources/Presenter/FavoriteViewController.swift deleted file mode 100644 index 336ff88..0000000 --- a/iBox/Sources/Presenter/FavoriteViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// FavoriteViewController.swift -// iBox -// -// Created by 이지현 on 12/27/23. -// - -import UIKit - -class FavoriteViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - let favorite = UserDefaultsManager.favorite.value - print("\(favorite.name) : \(favorite.url)") - } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index f9f319e..2d0aced 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -16,8 +16,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene - window?.rootViewController = MainTabBarController() - window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 // 나중에 userDefaults에 저장해두고 꺼내와서 preload하기 let urlsToPreload = [ @@ -29,6 +27,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { URL(string: "https://24hoursarenotenough.42seoul.kr/")! ] WebViewPreloader.shared.preload(urls: urlsToPreload) + + let favorite = UserDefaultsManager.favorite.value + guard let favoriteUrl = URL(string: favorite.url) else { return } + WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) + + window?.rootViewController = MainTabBarController() + window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Utils/WebViewPreloader.swift index d92b7e7..fc8b4a6 100644 --- a/iBox/Sources/Utils/WebViewPreloader.swift +++ b/iBox/Sources/Utils/WebViewPreloader.swift @@ -11,6 +11,7 @@ import WebKit class WebViewPreloader { static let shared = WebViewPreloader() private var webViews: [URL: WKWebView] = [:] + private var favoriteView: (url: URL, webView: WKWebView)? private init() {} @@ -22,12 +23,28 @@ class WebViewPreloader { } } + func preloadFavoriteView(url: URL) { + let webView = WKWebView() + webView.load(URLRequest(url: url)) + favoriteView = (url, webView) + } + func getWebView(for url: URL) -> WKWebView? { return webViews[url] } + func getFavoriteView() -> WKWebView? { + return favoriteView?.webView + } + func resetWebView(for url: URL) { webViews[url]?.load(URLRequest(url: url)) } + + func resetFavoriteView() { + guard let favoriteView else { return } + favoriteView.webView.load(URLRequest(url: favoriteView.url)) + } + } From c6679953a5428de72bf1ec420c310098ad194ebe Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 25 Jan 2024 21:17:25 +0900 Subject: [PATCH 023/370] style: add app icon --- .../AppIcon.appiconset/1024.png | Bin 0 -> 47451 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 3988 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 4166 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 6679 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 941 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1334 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 1922 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 1914 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 1989 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 2662 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 3025 bytes .../AppIcon.appiconset/Contents.json | 71 +++++++++++++++++- .../Assets.xcassets/AppIcons/Contents.json | 6 ++ .../AppIcons/appstore.imageset/Contents.json | 21 ++++++ .../AppIcons/appstore.imageset/appstore.png | Bin 0 -> 47451 bytes .../AppIcons/playstore.imageset/Contents.json | 21 ++++++ .../AppIcons/playstore.imageset/playstore.png | Bin 0 -> 28764 bytes 17 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/1024.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/114.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/120.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/180.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/29.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/40.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/57.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/58.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/60.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/80.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/87.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcons/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/1024.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..a738dda605c9240e0359fa56c2ca1476477c49b9 GIT binary patch literal 47451 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 LbWZ1y literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/114.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000000000000000000000000000000000000..3051489f483688189b0058c3b6473a06b5a8bc3b GIT binary patch literal 3988 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 O08m!YkS~_Sy!jt+ob*iq literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/180.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3c88bafb523a03ee4a29dceb49972647d84091 GIT binary patch literal 6679 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 SxEH4fMd6)_Yz@>b?Ee9@3(9K% literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/29.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000000000000000000000000000000000000..a1866dde7d9b567ea65843fc4ac927b20dd3b853 GIT binary patch literal 941 zcmV;e15*5nP)Px&XGugsR7gwhmRU$tQ5b-~d+#`-j#ijqq@lDBn$aH7N~;us1wB+IEo9L{_7Ef# zSVR;QL|`w1wxC2pLB6CEL{U9RCLt!YFE|gSspT?`Gjk`-oO_!wXPlc*FLhwJbMEqg z|9*ZY5C{bL%S-tW{gWQI;9e1O1u(DC)Uo;=Sbz#%02Bd^u`Iqf0@To4?}3*WAZ<6K zWI{j(MGeu-edh=Gd<|wC0o7?dkF4kjP#sXAy$afD;Y%*$os15xKLHb4A!9S7768Wg z5u6hRYFO#(hL5Mf2HbCf#U+rv26R8DTIkw(4;s$H>Rj+CkXZ`0u~G9NGF10UEBjl) zbqNxZ;n{m=S7Fx`h)W1r?CpoEdms&%mj&(~NIwLL*%GP>jfbw06KSvoTxF0j4&HXc zV`1%fSXmsB^57yg)WGswn34kSZb&~2_ME6$_Y2f;>#O_l^&|K@pr;XR4(RoO>lm5)_{#>)7W9-6$>H0|7tyy--jIlX8b7U>MZ+pxXtvkAk~PLh(zX0&LcQ@V>Ex z@Spe1CZb7bVhU_N2V*AFXoTA15T9&l zsY>mGT}PEa5t3k76zLW7zo!TC&p_tEi z-VSg$A$uLPJ%`RuQo)@SLmP=T=v@gF#eLuwOr8UEXW`CiX~oY=JgW}v4Rv^daxvIPnki@k`gh@salJtFpwB$@ezm5{UEqNQe&=y(TZ8^Qe@YyxOx zsrlSIJHz)P0eyqAZ5G$T_^jcllBoKKgPAGt%@b&>2|K{U2S>9Jm>CkbU$70PE{S^h z$3DbkO$$+z9*et@PiTU7n>k{~hQLgb%y9j~xZ& P00000NkvXXu0mjf&0?fo literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/40.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1d8bd9b8f9fc7f523837b9ba579a1b8aec9f4f GIT binary patch literal 1334 zcmV-61Px(@JU2LR9Hvtn0-i{Wf;bP=Ubgeozc{0=0{&^)>^GGT~x$CW}{E&!!=rs6-5P& z{Shl%1uZIqSddW-#?Tn-kI2ZPVg%u424gi{1)FYbPO~zn$FKAC#{E9etHA8*62 zT~PiaRILOvbk6u7qfu}=;aCTpdK0c$21Q%Jy+D6&AMVruS|A4ZLEu{$HlRBMk9+_w zPXcX;Rt*RTVeeB=?Sp*4Uk8^yko;gV$4vpC4pC$RPQ41zF)-Zl)gid~aj4k{(FizQ zvstvp+IPX>Jy3TOIKtrc!xfF-%t|TL_5dyR#(#spcfsicmje!-gg*oD=!Z~PKARD1 z&fh)I{3I0R!>Tff2&+@Dcnf4-1w?@a@~}jZv=&Q)J*1I}FV07nMlmy>XH zE!^{#V$rf5nJ3!&bSoU|gzL(ndJ%*S6@j9SkXNG)Wip>wi-{SOO=7)n^g9@A0cRd~ zfu12aJOGgZ)V&N#>Sl+yyA8hH0q#6lUIZ0|5ERlzV9^Hf-!}98xqI1bQ0p!<3B#ws z>4wox7-|D&4#=U0C*bD+Fv5_t5Y}!7Z;o1eY7D-71tvzo;es2Ap&%O~0&pA(*MWZp zM8mMK6x@mRcs_&XX#_wYv~Gj5{V@p;6N>3qhmt|8-B|Ae&MZ4KKW6J5+S;e+SA|#P!AmNuo9Q`ym)O3f=|jHwU)m*?`~}lq`kP zK)>=m@i`H=WT8hq42Xn4d{Z7zw)&eqGG@Af0Y1^P8>U7t7QkF(u6I5U#n;0A_n_~H z0+U?;_1hF9Z98Cc1R_DW{6@IrS?KRp-@CjQ31IIJ%BQN=LPL{c=S&wg-3P%5xc7Ca zc}$H<2h-Z97<=Y3C|;t*n>WMJZ&b2X)y#2-dpgv@rORORUeyQw)C&7vP$68s3Dz|# zAfIoC1G^Qo5AB5O?^1o?M-Qq)$w8}X=Mvz0mBnHUBJj#pa7hJpwLx%P)#_*ns_RvV zW!&vmzyKI0f~Y*frNifljP%vp|?{v0|rcutE9-vRn35vv6G{U!7RVdTV1Co z1K{@P`3_~!l{K*GlMJ)is>@%z2K#ra!fuX9lPOjsO@d`7j+wiO+(o8sM#kk3Q84c) zF8Jp(tl0wfFU9Z1)AB+2czg(2o`#--+En%3IA$T+SJNUL3Z&?-;eFMnnZp;-uuku& zOP-kQi63>zlhD~hn*D)UObqbkK=~~il>Ob>{!U_UW4}07*qoM6N<$g1mlr`~Uy| literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/57.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000000000000000000000000000000000000..3056ce6bc7bc24ab93437e252fc3ddf927d4b841 GIT binary patch literal 1922 zcmV-|2YvX7P)Px+JV``BRA@u(nR#qfRTRd5Zm6iqyZ3SAo&SuWL@6l3bI&Y@asgij~ z|7hO3_nz;3-`VbHe!t((9sX!>kaq~faVGB&B8f8@XYzmKfw)}5Bg^b5wD6V%{5qO@ z5v{}{MnwZ$Q^e8PHwtn!45_;e*dehK5UFv-y4q54KO|G)X15O1 z=LMS`PVR>MRWPV4Xg#6FY^4xA8X^mc7JxLo{?AS*-3ZB@px`2$^TG>j!Rb;)X%-AK z2ch~Z_~Iq#?}A=;Lvbe|Ptxe7ae zHx#}Do^sHf4Im53;dlu+B`LaK${I*9YG-3c^>U#>vGj)C5D+vry4FSR&tWV<-NlOWmRyf2%Ju+xeoU|10xoK*L|yOb$L5s z$09hh2a?)>#{)yMpkp$4B<>|HJz!6VtOd6wA90wK%q_08bjKqA0&Q6Q7I-T_b13jq zE$Te5Cm-Biu-l>b28??jdJVZfEfo9=-^>SBJMemx+@J0X3F0)PE((*54CuD#_VvN+ zYVxH8kOp&A&juuZC-yYov6(!(E z0Iv^{oX|%)9P=^Gv8O`D2&Du8CJN}41IgC9q2@vA>0N`e0@(5fRF)W$Gl1*0OA2(8 zTTO@Ap@>#A#ge=Fb|#$3V0S3P^*EOX%G;C&)d=`%8k{6{iQ~pCg^oSd`excl3m|Rq z!(uq`9i(QLsx%1|RY$2_I+&WiD)s?2o zL0dl(2DKH?=Ls0SIAr~79;8{vPX7ek7aIL&#O12xuDRLO`N2~UW0pX_r@-d}TkyU% zbmB2H*y&wxX1DTMFqyU-M(7>%(qV)Cd61oJ#AEYAKxmLRGlGR_BD9H7{=!;lb+gZHTGx%F5iEH%?nfJ!Dw9b8IsMx< z1Sthy`c$9vph@6x-700>&?=SsrHxBSx&6Jn7Th&pbEx<;8-@Q2Na<0tpN0-S;I9Kv zS^x>jMxoYJO!a(3#Z~cfC_Dm*^4@64!~vQ8;GUsSUI=IRfg@3|*5)9EK^dur&w^YT zY=N3!-oV?;$B2>g0;!et3DEnn>jNaVhLwsoskt z#7S)?SCOZ9eAaGA?x3a)Ver?_VCw=%%Y>S%Fm)4TJq#jA$;y8pf=?$xN(NM1f$<+e z&T|Tk>?ghHiagcaORTpkNJ%1+BxY<^ax+`Oo$o0o(mKP9a+vZl3>c|mR$}hhHrOx& zQaeIrDGZ+td9OFDzjO*#k5yxpsHIIoinJu2`aA~XmMG@V9fZwuz+0~X3A+-j&n{Pv zC^-#Z&w^_g6>GX0Trgo7^nF~-m|Nz-`NJwf>1VX1T+J&*0qRPJ?^73)Zv|5D^SY&wj1Gi(<1Uc%CqWK$E&WKr-NoZYXoXw(@sWG&e@ zdl>Z2u{0nD@>XOZ&7@-SayKf3TD)V8E=W_l=5>EmkObPq=xr?y$k7McYQUnqapZE1 zt{ttqTO4Gox;KWK$C-?wvs?A3IFqgF-WYBkXEKJ)Zq=jy1>%XYgCX!h6aWAK07*qo IM6N<$f-|mwZ2$lO literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/58.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea7e6564e88bb332103dadc5b9fadb72e32642c GIT binary patch literal 1914 zcmV-=2Zi{FP)Px+G)Y83RA@u(nF(xERTPH5c{81^l+psSC?H}5#2Ao87DWqxz@A>clpZ}bD$L90-eB1?(EeiAwV>!y`9Y!coMx%`0raKUoZfL|w?_mpVXq{1! zoQqpwMv(~6oFfu*sU3`vbd7-A#o%Zb8Afl+6&bJ*0O|!aDBK7qe}NvKKx~|$V5>6r zf#9krha(?AmrO_*1{iCEv4vp*H3Il|4-~9`vjt$wgh7+Q>jBMfEi`k?&ZVGjhxRQX zZ6YN14I6A2K#fC>yAaNN44MbZJ+R{>j9v^aJA=;)HZ3@?=DU|qz`CjMR64|pBAn1+ z7C4fPd911=+#EFnyOIk9c}5^U*meX`dcX^xgPZ`Z02Rm1od(6nA)`C^Y~U_})Zx%F z%i6}(+TIWuH4MUAuGsVx0d|Pd;J^hqkq;wgLAPPSN!XO^;f=6q4y1R2o^7B?Qo{p| z6ve6*8=N`fSP6r&n0*B8-ate%F2JtC|cK%0l=DEM@8myTN zCB^VaJ4kN{F1J#Iw-WB14)N(B=W1v`P1#=m39haKN0MSL#t!F;;ExL+<)Oz27&_zT zteR}*&4FW^Re9>&4%#+@D#Os+CD3XNw8#uuzTpAAv=WMTfjtqtUa;Gsq!M=jqe_me z6h_U5`+5Zq(A=;yzr*@>!I^|!U!Ld$iB9nNK-0ie0?nU>*5exrs8Q$iVrPR3OQG~n z&=L$u$qygwI;|X7B$wI=#x4Q7qn2wLuI+Kb+8ii63z`!WVqj1w&`ha|bW0(r544$7 zEnWT3!8>s9j0P$d7neZEL9iP@C3c4fd-LI9F~mBd^g0a6fxg*+jbzU^uxB|Wrb4Al zNw!}Ha7$?tf=!^kq0Qu)b66-}!2^{g+!f%ekj7C-^U|uCjEb>1?QrZ0oVupW$qXjz zGicsk{a+_TgMxe|SwUp8Df8))1`o9Ymq&dj>zItT9;X7b1FCC_z$wF{vgY%$dz%6yMz z!DBBP_4?*AzBy1a7%_vBJ7N6{h)Y&Mm?c4P26TPZj;dDr$U9zTSY|xBC}h0+^Bb@K z8el&8?1ma71}{_;E3@l7pk9-z2dH81+ZV#Y?;*Z9c!U8n7Atq(!jvC|aOV(nD=UOv zV_@*qdK;7Afc~`s@@7M`*41o=+@nNjpeU>OG7S3=dJGQ}s4f@j!d$RrE}Yommp@k6 zj1V|8=XG`aAUy*zXM#N@a9;Z@TfZ6k$0#QYSBYUTVp5R=5X4-1`8G5kn*^;M3}TRB ziMRK6FTvkFSYuR-NSt!#*Km9*#5Pl=y&hI{UP?7Cjm4a2DY9kbqG_~n(^0GQja8;vnmKZp9Ih0bUJJf00%a~m0`}Wi{bAb5Syr27J$k3z%w%;wIdw+8Fqf9YNR}k4pf4WR&3xz81YfH2MCB2 zuPD}pozxES=4P-9aMWjuo`u45N(HVmn79%i7*IXO`uAb)N=PuSV;WVu5|+4O_A=-; z6g*YR_9gHI8BkRT6-Cf93&t)|M?GO!q`l^KIP|013}JTqHubrvLpJ2_CRm*VNofjv zqXR83gg)b8)Vyjoj^@Ft*HoSf*ye5FjZKDBoxNO1-+Xf4fdjef zFwy8hb!U|O*GlL=LFJ+3=+=b_jGkk1s4j*3`@x{eDo1xMg){rXY368^lIW1PAgv=D z-2%U@0*9Povq*}KXWD49dfzvkJr@qkLh zkW#nSnKu#wAYdK!>sbQTQK_Hi9JT9cnbgqi-GDpZMf{0&%^b6)g9Hj`iL}g8p*p|#?7FZ$Ejac9S!zdGpm~+8=IJ>8VRY- z=GqqL2@R+}vlbT&>vank*0t9O9jHE&uew}>g&>H*`qgOYcQ;`I4I;oM@=6qF6ComE zVMG~?*j6@?iK2`)5h5ZMMwHQrZDkXg=&oV(KZm%&fQe0q-v9sr07*qoM6N<$g6k%B Ax&QzG literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/60.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000000000000000000000000000000000000..be3cc60c38449b36ce082393c1dc1b778b609054 GIT binary patch literal 1989 zcmV;$2RitPP)Px+e@R3^RA@u(nt5zgRTRd5Z)Q53F4jt=Ky5`u5hTHo;EEXOWSQYG zL@cnZ?8Hq>pe07om7V(`x67Kfl#Lmnu|H?J*KFTU?ISyYBVn*y(6SMN6)^MyFu%(L zuleqQuc4?5swNHWeldH<0^qQcT^%fp7?1Zf6{u?|l3`1R7xMY0%||;g5i~X277c z191iop6<^yo)JQzDQJ!u;$|MVVw`Wy@y3Kt4ESuO~-!=NjnYN|8UBqUVk zfX$8eECT;7u!XtxoWA)rC?DK^0keZ=LE8aXJqxtw>n3F?H(yF-FxkV^(7bc#j0v5YO z)*@+_t_kLv16P+GVB5r7&~XTkG-`=i5NLtsmGQ%Z?e#6#)})yBNdAc;ESNM8%4DR7J>(S(L!}SK41rJ#y9QkKbnpz)0ggaroeGrMV+xy-8nB7pFB{;im!L-q zltf-nF-Fdb4{|43$_NDfeJ3e9?|pr@DPWT=>Bmuv83At@Oq{EVV;W5N57?ajt6ODiA+HRf{M=qW1e25$*We+$Y_Ov!W#zMQSO8yuZ1iHXm3Nw~L*+3b#Ta9M< z*NyO{&S8_n`2=hBP^@$K%u7_<6koWw$k#^5Jsr+-d4} z->rm}oys_vQ;(i57<(0rm;g<`!}qIHVYKA*Q_tafXIQ}akHWQ!VEm1}B3|qy zDnVvmIqJFl1Lb*TwKc(#DbR6PIk>JPDqz>hp@LrDt$=m&m8~^XS6%^&lEq(_R>J+C zDv8R5+(oc^Gc3J98H4tNaN$gt@}!=c9JOb#!H4NvvX z!!n$RRlI323>~c`|Ng_UeG`ah{!d8SI4wJm+f{x_t{(bR9oH1;<69eX1f(bp9-)es zU9d`enUkt4L6HE7Qremo>rt?_b;yIH_ilw(uI<~01#~E&HYE9J8~g+(W?GZvequ|q z@#yaa{i+T~9>?9o0Dd2aot2|LEM9u?Pxga9G(Foq;fsbCd4icVX=2~vunwGORxic;%T ztfHktJFSeiR!d6#1Ey2yAgBzqwIDNP2DR9VR>cB}I<3Xbv{ony~WVqSaNrnMRsZkUcf!eJwayASp1><9fm1w9AXsd_DH=z7m z=Ckz}G6O$@0A=8&In{4~Pj^Dw4KV#7FwEIu6VrXZy&8tU3uEWP=(|mikvZ3qIe>aX z^;@9vH7F>BUHhTB1}d+07NUOE;eD{@aj2dI9cN(VTo^Uq*=O|^%UpmcW!dpgW>K+PQQe?`?v&*2A=`U|cZ-#f1dHe<@Tf2Txu`G63fR zYV|ekfx1nQHx#Wm3 zT?E6vVDDLdykzGA8X*>_T@9Uwz!OlxM51n281@{8mh&)vI^4R_-lR0Z?LUSi@4>L) zFufA|K9vjNh3*b0oCxJh)i@l^LmdWa4lsCHnQ!mGN-*4W44Q)wYJr=dfGcJW%#^k1 z9(WaAtpR^AlmuXEC3N@Rsr5j`qu?LqI7DXwTFtk96ZnQIg~=s~5M})1Q#jECzHTTi zfjgdsK(V?f)!a~TWp^~e=0(ueVx*c>mcTV-5Ddrql5{E324n8Yh#6-FprkHMZ^Q%4 z&x23Sz(=Q{AOLNRaP54UA-Q1$JShegt-imlf`4s?Atlh+1(Pp@&y*$r*a{jQA+F!&2&QT~Q1DD?O8fgXrrr`Ndn3$Ps?0fAZm7R||BvwZwaRqG^hJHc12C;B!6XHs zyWqqxA$;ESX_km6zls^ZUkj&N)bCN5U^n>kR6r>n zlQ^|8OxFkJYhlax%;$*Yy3cqMv013p}o ztRQf*210f53KZahJlJ2S{z*`g&qRft%`mm zt6Z~3G&dEPUk+u<6ZdVSxM5F$jmM#})-qtzj2pH=xFIpXJRh8CgF|OkAkhL9{}<|j zsj{A}GF50wNf$^P4#B${z&|9G9?30Y!sAP!)LenY0StkE3|unL5=6`gj~E9f;|A;- z(*!6^T*eTAUB89>J0Kj4f4EmxA4%$chVM)Cy+q}9a}|-uUOWok1?rZ2Bq$|4>L}~; zuJ}�xW zLmue(Um-vMO8#c3CC5()%bX+_6%2!g8zC?>tz-?&u{e zA_&P;`p#K^lIlph(A63<8(DMe&wEQr*9K+7NiNCN`~`^%7rKwm7WKVA>Z|XZ1Sk`X zgcXR-&4x=Zhlay&@HO?BtVOMLJb@?sykoC~2{$SzAHNB8|50G9N;LWosiKDTErnP~ zr;NU3nc1uF+yf}967wwJg0*l(bxdmlWy^!Hy$vZ+$OJo@VbU!yf3;GcT){Tjx)cuX zR8;c~byP%O2VaL5mRQaPnqTA`Kt13Y55n9>Vrnrqk^Hb@1-vb(Pl?)^ zluEZiTlTujCq-R`O8wAu8h$f7)`t{!B_Pav2yXgGeBUqs9QJHbJ9paO<|M%O^KjP& znD}J{LnfgobYLeuf3LYcDL%3dDyP7Gf9kog*R{yCx53GOtIc$yHrWK<*%VW@weOE! zfz6Bm4*-fv=KTu3c$eBg5x*opF)ttXZh{vdRk@?6Qob)KhozuET(AM%TOMpl`u_`+%Tz*Te9Wkbn`FAWP(qsxrF~g`-NvR`ptyX+TV|@0>t+&0{JyU!*ettq>*U z`12F$)K)fKvJZ0W UTs@=|Hvj+t07*qoM6N<$f`4)KdjJ3c literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/87.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000000000000000000000000000000000000..1bee41f855b9899c80f421f81763d26f662fb58b GIT binary patch literal 3025 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 GjQbBM$iOWC literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..af727e0 100644 --- a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,8 +1,75 @@ { "images" : [ { - "idiom" : "universal", - "platform" : "ios", + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", "size" : "1024x1024" } ], diff --git a/iBox/Resources/Assets.xcassets/AppIcons/Contents.json b/iBox/Resources/Assets.xcassets/AppIcons/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/AppIcons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json b/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json new file mode 100644 index 0000000..a0b3a22 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "appstore.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png b/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png new file mode 100644 index 0000000000000000000000000000000000000000..a738dda605c9240e0359fa56c2ca1476477c49b9 GIT binary patch literal 47451 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 LbWZ1y literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json b/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json new file mode 100644 index 0000000..861f456 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "playstore.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png b/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e78298741be6cc7f50c2b3eb8c579c036a860196 GIT binary patch literal 28764 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 GAN~))E&t2_ literal 0 HcmV?d00001 From a3cb12e9546ecc012e4e83bcba7728f05443ae23 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 30 Jan 2024 16:22:08 +0900 Subject: [PATCH 024/370] =?UTF-8?q?feat:=20diffable=20datasource,=20combin?= =?UTF-8?q?e=20=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/Bookmark.swift | 13 ++ iBox/Sources/Model/Folder.swift | 6 +- .../Presenter/BoxList/BoxListCell.swift | 56 +++++++ .../Presenter/BoxList/BoxListView.swift | 149 +++++++++++------- iBox/Sources/Utils/UserDefaultsManager.swift | 2 +- .../ViewModel/BoxListCellViewModel.swift | 27 ++++ .../ViewModel/BoxListSectionViewModel.swift | 38 +++++ iBox/Sources/ViewModel/BoxListViewModel.swift | 59 +++++++ 8 files changed, 283 insertions(+), 67 deletions(-) create mode 100644 iBox/Sources/Model/Bookmark.swift create mode 100644 iBox/Sources/Presenter/BoxList/BoxListCell.swift create mode 100644 iBox/Sources/ViewModel/BoxListCellViewModel.swift create mode 100644 iBox/Sources/ViewModel/BoxListSectionViewModel.swift create mode 100644 iBox/Sources/ViewModel/BoxListViewModel.swift diff --git a/iBox/Sources/Model/Bookmark.swift b/iBox/Sources/Model/Bookmark.swift new file mode 100644 index 0000000..2091151 --- /dev/null +++ b/iBox/Sources/Model/Bookmark.swift @@ -0,0 +1,13 @@ +// +// Bookmark.swift +// iBox +// +// Created by 이지현 on 1/30/24. +// + +import Foundation + +struct Bookmark: Codable { + let name: String + let url: String +} diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index cbb30cf..12f21e6 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -10,11 +10,7 @@ import Foundation struct Folder { let name: String let color: ColorName - let webs: [Web] + let bookmarks: [Bookmark] var isOpened: Bool = true } -struct Web: Codable { - let name: String - let url: String -} diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift new file mode 100644 index 0000000..1e27de9 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -0,0 +1,56 @@ +// +// BoxListCell.swift +// iBox +// +// Created by 이지현 on 1/30/24. +// + +import UIKit + +import SnapKit + +class BoxListCell: UITableViewCell { + var viewModel: BoxListCellViewModel? + static let reuseIdentifier = "boxListCell" + + private lazy var cellImageView = { + let view = UIImageView() + view.image = UIImage(systemName: "ellipsis.rectangle.fill") + return view + }() + + private lazy var label = { + let label = UILabel() + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupLayout() { + contentView.addSubview(cellImageView) + cellImageView.snp.makeConstraints { make in + make.top.leading.bottom.equalToSuperview() + make.width.equalTo(50) + } + + contentView.addSubview(label) + label.snp.makeConstraints { make in + make.top.trailing.bottom.equalToSuperview() + make.leading.equalTo(cellImageView.snp.trailing) + } + } + + func configure(_ viewModel: BoxListCellViewModel) { + self.viewModel = viewModel + label.text = viewModel.name + } + +} diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 2c6d5b9..59f4ca4 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -5,6 +5,7 @@ // Created by 이지현 on 1/3/24. // +import Combine import UIKit import SnapKit @@ -14,18 +15,28 @@ protocol BoxListViewDelegate: AnyObject { } class BoxListView: BaseView { + var viewModel: BoxListViewModel? + private var boxListDataSource: UITableViewDiffableDataSource! weak var delegate: BoxListViewDelegate? - var folderArr = [ - Folder(name: "기본 폴더", color: .gray, webs: [ - Web(name: "42 Intra", url: "https://profile.intra.42.fr/"), - Web(name: "42Where", url: "https://www.where42.kr/"), - Web(name: "42Stat", url: "https://stat.42seoul.kr/"), - Web(name: "집현전", url: "https://42library.kr/") - ]), - Folder(name: "새 폴더", color: .green, webs: [Web(name: "Cabi", url: "https://cabi.42seoul.io/")], isOpened: false), - Folder(name: "새 폴더(2)", color: .yellow, webs: [Web(name: "24HANE", url: "https://24hoursarenotenough.42seoul.kr/")], isOpened: false) - ] + private var cancellables = Set() + + override init(frame: CGRect) { + super.init(frame: frame) + + backgroundColor = .systemBackground + viewModel = BoxListViewModel() + + setupLayout() + configureDataSource() + initDataSource() + bindViewModel() + viewModel?.input.send(.viewDidLoad) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } private lazy var backgroundView = { let view = UIView() @@ -43,9 +54,8 @@ class BoxListView: BaseView { private lazy var tableView = { let tableView = UITableView() - tableView.dataSource = self tableView.delegate = self - tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") + tableView.register(BoxListCell.self, forCellReuseIdentifier: BoxListCell.reuseIdentifier) tableView.sectionHeaderTopPadding = 0 // tableView.separatorInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) @@ -55,17 +65,6 @@ class BoxListView: BaseView { tableView.separatorColor = .clear return tableView }() - - override init(frame: CGRect) { - super.init(frame: frame) - backgroundColor = .systemBackground - - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } private func setupLayout() { addSubview(backgroundView) @@ -74,33 +73,72 @@ class BoxListView: BaseView { make.leading.trailing.bottom.equalTo(safeAreaLayoutGuide).inset(20) } } -} - -extension BoxListView: UITableViewDataSource { - func numberOfSections(in tableView: UITableView) -> Int { - return folderArr.count + private func configureDataSource() { + boxListDataSource = UITableViewDiffableDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in + guard let self, let viewModel = self.viewModel else { fatalError() } + guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } + cell.configure(viewModel.viewModel(at: indexPath)) + return cell + } } - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if !folderArr[section].isOpened { - return 0 + private func initDataSource() { + guard let viewModel else { return } + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections(viewModel.boxList.map{ $0.id }) + for folder in viewModel.boxList { + snapshot.appendItems(folder.boxListCellViewModels.map { $0.id }, toSection: folder.id) } - return folderArr[section].webs.count + boxListDataSource.apply(snapshot, animatingDifferences: true) } - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) - cell.selectionStyle = .none - cell.backgroundColor = .clear - cell.textLabel?.text = folderArr[indexPath.section].webs[indexPath.row].name - cell.imageView?.image = UIImage(systemName: "ellipsis.rectangle.fill") - cell.imageView?.tintColor = ColorPalette.webIconColor - return cell + private func bindViewModel() { + guard let viewModel else { return } + let output = viewModel.transform(input: viewModel.input.eraseToAnyPublisher()) + + output.receive(on: DispatchQueue.main) + .sink { [weak self] event in + switch event { + case .toggleFolder: + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections(viewModel.boxList.map{ $0.id }) + for folder in viewModel.boxList { + if folder.isOpen { + snapshot.appendItems(folder.boxListCellViewModels.map { $0.id }, toSection: folder.id) + } + } + self?.boxListDataSource.apply(snapshot, animatingDifferences: true) + } + }.store(in: &cancellables) } - } +//extension BoxListView: UITableViewDataSource { +// +// func numberOfSections(in tableView: UITableView) -> Int { +// return viewModel.folderArr.count +// } +// +// func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { +// if !viewModel.folderArr[section].isOpened { +// return 0 +// } +// return viewModel.folderArr[section].bookmarks.count +// } +// +// func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { +// let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) +// cell.selectionStyle = .none +// cell.backgroundColor = .clear +// cell.textLabel?.text = viewModel.folderArr[indexPath.section].bookmarks[indexPath.row].name +// cell.imageView?.image = UIImage(systemName: "ellipsis.rectangle.fill") +// cell.imageView?.tintColor = ColorPalette.webIconColor +// return cell +// } +// +//} + extension BoxListView: UITableViewDelegate { public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { @@ -125,9 +163,10 @@ extension BoxListView: UITableViewDelegate { } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let button = FolderButton(isOpen: folderArr[section].isOpened) - button.setFolderName(folderArr[section].name) - button.setFolderColor(folderArr[section].color.toUIColor()) + guard let viewModel else { return nil } + let button = FolderButton(isOpen: viewModel.boxList[section].isOpen) + button.setFolderName(viewModel.boxList[section].name) + button.setFolderColor(viewModel.boxList[section].color.toUIColor()) button.tag = section button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside) @@ -136,27 +175,15 @@ extension BoxListView: UITableViewDelegate { } @objc private func handleOpenClose(button: FolderButton) { - let section = button.tag - - var indexPaths = [IndexPath]() - for row in folderArr[section].webs.indices { - let indexPath = IndexPath(row: row, section: section) - indexPaths.append(indexPath) - } - - folderArr[section].isOpened.toggle() + guard let viewModel else { return } + viewModel.input.send(.folderTapped(section: button.tag)) button.toggleStatus() - - if folderArr[section].isOpened { - tableView.insertRows(at: indexPaths, with: .fade) - } else { - tableView.deleteRows(at: indexPaths, with: .fade) - } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let webUrl = folderArr[indexPath.section].webs[indexPath.row].url - let webName = folderArr[indexPath.section].webs[indexPath.row].name + guard let viewModel else { return } + let webUrl = viewModel.boxList[indexPath.section].boxListCellViewModels[indexPath.row].url + let webName = viewModel.boxList[indexPath.section].boxListCellViewModels[indexPath.row].name delegate?.didSelectWeb(at: webUrl, withName: webName) } } diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index a60c061..479734c 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -19,7 +19,7 @@ final class UserDefaultsManager { ) static let favorite = UserDefaultValue( key: .favorite, - defaultValue: Web(name: "42 Intra", url: "https://profile.intra.42.fr/") + defaultValue: Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/") ) } diff --git a/iBox/Sources/ViewModel/BoxListCellViewModel.swift b/iBox/Sources/ViewModel/BoxListCellViewModel.swift new file mode 100644 index 0000000..68d89aa --- /dev/null +++ b/iBox/Sources/ViewModel/BoxListCellViewModel.swift @@ -0,0 +1,27 @@ +// +// BoxListCellViewModel.swift +// iBox +// +// Created by 이지현 on 1/30/24. +// + +import Foundation + +class BoxListCellViewModel: Identifiable { + private let bookmark: Bookmark + + init(bookmark: Bookmark) { + self.bookmark = bookmark + } + + let id = UUID() + + var name: String { + bookmark.name + } + + var url: String { + bookmark.url + } + +} diff --git a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift new file mode 100644 index 0000000..c440e57 --- /dev/null +++ b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift @@ -0,0 +1,38 @@ +// +// BoxListSectionViewModel.swift +// iBox +// +// Created by 이지현 on 1/30/24. +// + +import Foundation + +class BoxListSectionViewModel: Identifiable { + private var folder: Folder + var boxListCellViewModels: [BoxListCellViewModel]! + + init(folder: Folder) { + self.folder = folder + boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + } + + let id = UUID() + + var name: String { + folder.name + } + + var color: ColorName { + folder.color + } + + var isOpen: Bool { + get { + folder.isOpened + } + + set { + folder.isOpened = newValue + } + } +} diff --git a/iBox/Sources/ViewModel/BoxListViewModel.swift b/iBox/Sources/ViewModel/BoxListViewModel.swift new file mode 100644 index 0000000..a94e0b1 --- /dev/null +++ b/iBox/Sources/ViewModel/BoxListViewModel.swift @@ -0,0 +1,59 @@ +// +// BoxListViewModel.swift +// iBox +// +// Created by 이지현 on 1/30/24. +// + +import Combine +import Foundation + +class BoxListViewModel { + + var boxList = [ + BoxListSectionViewModel(folder: Folder(name: "기본 폴더", color: .gray, bookmarks: [ + Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/"), + Bookmark(name: "42Where", url: "https://www.where42.kr/"), + Bookmark(name: "42Stat", url: "https://stat.42seoul.kr/"), + Bookmark(name: "집현전", url: "https://42library.kr/") + ])), + BoxListSectionViewModel(folder: Folder(name: "새 폴더", color: .green, bookmarks: [Bookmark(name: "Cabi", url: "https://cabi.42seoul.io/")], isOpened: false)), + BoxListSectionViewModel(folder: Folder(name: "새 폴더(2)", color: .yellow, bookmarks: [Bookmark(name: "24HANE", url: "https://24hoursarenotenough.42seoul.kr/")], isOpened: false)) + ] + + enum Input { + case viewDidLoad + case folderTapped(section: Int) + } + + enum Output { + case toggleFolder + } + + let input = PassthroughSubject() + private let output = PassthroughSubject() + private var cancellables = Set() + + func transform(input: AnyPublisher) -> AnyPublisher { + input.sink { [weak self] event in + switch event { + case .viewDidLoad: + print("viewDidLoad") + case let .folderTapped(section): + self?.toggleFolder(section: section) + } + }.store(in: &cancellables) + return output.eraseToAnyPublisher() + } + + func viewModel(at indexPath: IndexPath) -> BoxListCellViewModel { + return boxList[indexPath.section].boxListCellViewModels[indexPath.row] + } + + func toggleFolder(section: Int) { + + boxList[section].isOpen.toggle() + output.send(.toggleFolder) + } + +} From 4252c197cbf10f7aa7fe21ab068a4f2cf10eb3d6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 6 Feb 2024 01:13:36 +0900 Subject: [PATCH 025/370] =?UTF-8?q?refactor:=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presenter/BoxList/BoxListCell.swift | 10 ++-- .../Presenter/BoxList/BoxListView.swift | 48 +++---------------- .../ViewModel/BoxListSectionViewModel.swift | 10 ++-- iBox/Sources/ViewModel/BoxListViewModel.swift | 14 ++---- 4 files changed, 26 insertions(+), 56 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index 1e27de9..d457aac 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -16,6 +16,8 @@ class BoxListCell: UITableViewCell { private lazy var cellImageView = { let view = UIImageView() view.image = UIImage(systemName: "ellipsis.rectangle.fill") + view.tintColor = .label + view.contentMode = .scaleAspectFit return view }() @@ -26,6 +28,7 @@ class BoxListCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + backgroundColor = .systemGroupedBackground setupLayout() } @@ -37,14 +40,15 @@ class BoxListCell: UITableViewCell { private func setupLayout() { contentView.addSubview(cellImageView) cellImageView.snp.makeConstraints { make in - make.top.leading.bottom.equalToSuperview() - make.width.equalTo(50) + make.leading.equalToSuperview().inset(20) + make.top.bottom.equalToSuperview().inset(10) + make.width.equalTo(30) } contentView.addSubview(label) label.snp.makeConstraints { make in make.top.trailing.bottom.equalToSuperview() - make.leading.equalTo(cellImageView.snp.trailing) + make.leading.equalTo(cellImageView.snp.trailing).offset(10) } } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 59f4ca4..9a7bddb 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -29,7 +29,6 @@ class BoxListView: BaseView { setupLayout() configureDataSource() - initDataSource() bindViewModel() viewModel?.input.send(.viewDidLoad) } @@ -58,11 +57,11 @@ class BoxListView: BaseView { tableView.register(BoxListCell.self, forCellReuseIdentifier: BoxListCell.reuseIdentifier) tableView.sectionHeaderTopPadding = 0 -// tableView.separatorInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) tableView.clipsToBounds = true tableView.layer.cornerRadius = 20 tableView.backgroundColor = .clear tableView.separatorColor = .clear + tableView.rowHeight = 50 return tableView }() @@ -83,11 +82,10 @@ class BoxListView: BaseView { } } - private func initDataSource() { - guard let viewModel else { return } + private func applySnapshot(with: [BoxListSectionViewModel]) { var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections(viewModel.boxList.map{ $0.id }) - for folder in viewModel.boxList { + snapshot.appendSections(with.map{ $0.id }) + for folder in with { snapshot.appendItems(folder.boxListCellViewModels.map { $0.id }, toSection: folder.id) } boxListDataSource.apply(snapshot, animatingDifferences: true) @@ -100,45 +98,13 @@ class BoxListView: BaseView { output.receive(on: DispatchQueue.main) .sink { [weak self] event in switch event { - case .toggleFolder: - var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections(viewModel.boxList.map{ $0.id }) - for folder in viewModel.boxList { - if folder.isOpen { - snapshot.appendItems(folder.boxListCellViewModels.map { $0.id }, toSection: folder.id) - } - } - self?.boxListDataSource.apply(snapshot, animatingDifferences: true) + case .sendBoxList(boxList: let boxList): + self?.applySnapshot(with: boxList) } }.store(in: &cancellables) } } -//extension BoxListView: UITableViewDataSource { -// -// func numberOfSections(in tableView: UITableView) -> Int { -// return viewModel.folderArr.count -// } -// -// func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { -// if !viewModel.folderArr[section].isOpened { -// return 0 -// } -// return viewModel.folderArr[section].bookmarks.count -// } -// -// func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { -// let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) -// cell.selectionStyle = .none -// cell.backgroundColor = .clear -// cell.textLabel?.text = viewModel.folderArr[indexPath.section].bookmarks[indexPath.row].name -// cell.imageView?.image = UIImage(systemName: "ellipsis.rectangle.fill") -// cell.imageView?.tintColor = ColorPalette.webIconColor -// return cell -// } -// -//} - extension BoxListView: UITableViewDelegate { public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { @@ -164,7 +130,7 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { guard let viewModel else { return nil } - let button = FolderButton(isOpen: viewModel.boxList[section].isOpen) + let button = FolderButton(isOpen: viewModel.boxList[section].isOpened) button.setFolderName(viewModel.boxList[section].name) button.setFolderColor(viewModel.boxList[section].color.toUIColor()) button.tag = section diff --git a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift index c440e57..70a928c 100644 --- a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift +++ b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift @@ -9,11 +9,15 @@ import Foundation class BoxListSectionViewModel: Identifiable { private var folder: Folder - var boxListCellViewModels: [BoxListCellViewModel]! + private var originalBoxListCellViewModels: [BoxListCellViewModel]! init(folder: Folder) { self.folder = folder - boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + originalBoxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + } + + var boxListCellViewModels: [BoxListCellViewModel] { + return isOpened ? originalBoxListCellViewModels : [] } let id = UUID() @@ -26,7 +30,7 @@ class BoxListSectionViewModel: Identifiable { folder.color } - var isOpen: Bool { + var isOpened: Bool { get { folder.isOpened } diff --git a/iBox/Sources/ViewModel/BoxListViewModel.swift b/iBox/Sources/ViewModel/BoxListViewModel.swift index a94e0b1..cb73926 100644 --- a/iBox/Sources/ViewModel/BoxListViewModel.swift +++ b/iBox/Sources/ViewModel/BoxListViewModel.swift @@ -27,7 +27,7 @@ class BoxListViewModel { } enum Output { - case toggleFolder + case sendBoxList(boxList: [BoxListSectionViewModel]) } let input = PassthroughSubject() @@ -36,11 +36,13 @@ class BoxListViewModel { func transform(input: AnyPublisher) -> AnyPublisher { input.sink { [weak self] event in + guard let self else { return } switch event { case .viewDidLoad: - print("viewDidLoad") + output.send(.sendBoxList(boxList: boxList)) case let .folderTapped(section): - self?.toggleFolder(section: section) + boxList[section].isOpened.toggle() + output.send(.sendBoxList(boxList: boxList)) } }.store(in: &cancellables) return output.eraseToAnyPublisher() @@ -49,11 +51,5 @@ class BoxListViewModel { func viewModel(at indexPath: IndexPath) -> BoxListCellViewModel { return boxList[indexPath.section].boxListCellViewModels[indexPath.row] } - - func toggleFolder(section: Int) { - - boxList[section].isOpen.toggle() - output.send(.toggleFolder) - } } From b3a9f56a1b7aefc5ab0047e6792503553ddf39cb Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 8 Feb 2024 15:32:38 +0900 Subject: [PATCH 026/370] =?UTF-8?q?feat:=20Share=20Extension=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 38 ++++++++++++++++---- ShareExtension/ShareViewController.swift | 46 ++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 ShareExtension/ShareViewController.swift diff --git a/Project.swift b/Project.swift index 97209e3..3169d63 100644 --- a/Project.swift +++ b/Project.swift @@ -19,7 +19,7 @@ class iBoxFactory: ProjectFactory { .external(name: "SnapKit") ] - let infoPlist: [String: Plist.Value] = [ + private let appInfoPlist: [String: Plist.Value] = [ "ITSAppUsesNonExemptEncryption": false, "CFBundleName": "iBox", "CFBundleShortVersionString": "1.2.1", @@ -38,20 +38,46 @@ class iBoxFactory: ProjectFactory { ] ] - func generateTarget() -> [ProjectDescription.Target] {[ - Target( + private let shareExtensionInfoPlist: [String: Plist.Value] = [ + "CFBundleDisplayName": "iBox Share", + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "NSExtension": [ + "NSExtensionAttributes": [ + "NSExtensionActivationRule": [ + "NSExtensionActivationSupportsWebURLWithMaxCount" : 1 + ] + ], + "NSExtensionPointIdentifier": "com.apple.share-services" + ] + ] + + func generateTarget() -> [ProjectDescription.Target] { + let appTarget = Target( name: projectName, destinations: .iOS, product: .app, bundleId: bundleId, deploymentTargets: .iOS("15.0"), - infoPlist: .extendingDefault(with: infoPlist), + infoPlist: .extendingDefault(with: appInfoPlist), sources: ["\(projectName)/Sources/**"], resources: "\(projectName)/Resources/**", dependencies: dependencies ) - ]} - + + let shareExtensionTarget = Target( + name: "\(projectName)ShareExtension", + destinations: .iOS, + product: .appExtension, + bundleId: "\(bundleId).ShareExtension", + infoPlist: .extendingDefault(with: shareExtensionInfoPlist), + sources: ["ShareExtension/**"], + resources: [], + dependencies: [] + ) + + return [appTarget, shareExtensionTarget] + } } diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift new file mode 100644 index 0000000..b614df4 --- /dev/null +++ b/ShareExtension/ShareViewController.swift @@ -0,0 +1,46 @@ +// +// ShareViewController.swift +// iBoxShareExtension +// +// Created by jiyeon on 1/30/24. +// + +import UIKit +import Social + +class ShareViewController: SLComposeServiceViewController { + + override func isContentValid() -> Bool { + // Do validation of contentText and/or NSExtensionContext attachments here + + // contentText : 유저가 공유하기 창을 눌러 넘어온 문자열 값(상수) + if let currentMessage = contentText{ + let currentMessageLength = currentMessage.count + // charactersRemaining : 문자열 길이 제한 값(상수) + charactersRemaining = (100 - currentMessageLength) as NSNumber + + print("currentMessage : \(currentMessage) // 길이 : \(currentMessageLength) // 제한 : \(charactersRemaining)") + if Int(charactersRemaining) < 0 { + print("100자가 넘었을때는 공유할 수 없다!") + return false + } + } + return true + } + + override func didSelectPost() { + // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. + + // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. + self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) + } + + // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. + override func configurationItems() -> [Any]! { + let item = SLComposeSheetConfigurationItem() + + item?.title = "여기는 제목입니다" + // item?.tapHandler : 유저가 터치했을 때 호출되는 핸들러 + return [item] + } +} From a12c7c53ab534b666ae17ea1fcd60554088ce072 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 8 Feb 2024 17:21:10 +0900 Subject: [PATCH 027/370] fix: web share extension --- iBox/iBox.entitlements | 10 +++ iBoxWebShareExtension/Info.plist | 20 +++++ .../ShareViewController.swift | 75 +++++++++++++++++++ .../iBoxWebShareExtension.entitlements | 10 +++ 4 files changed, 115 insertions(+) create mode 100644 iBox/iBox.entitlements create mode 100644 iBoxWebShareExtension/Info.plist create mode 100644 iBoxWebShareExtension/ShareViewController.swift create mode 100644 iBoxWebShareExtension/iBoxWebShareExtension.entitlements diff --git a/iBox/iBox.entitlements b/iBox/iBox.entitlements new file mode 100644 index 0000000..ef36994 --- /dev/null +++ b/iBox/iBox.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.ibox + + + diff --git a/iBoxWebShareExtension/Info.plist b/iBoxWebShareExtension/Info.plist new file mode 100644 index 0000000..4045f71 --- /dev/null +++ b/iBoxWebShareExtension/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleName + $(PRODUCT_NAME) + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + TRUEPREDICATE + + NSExtensionPointIdentifier + com.apple.share-services + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).ShareViewController + + + diff --git a/iBoxWebShareExtension/ShareViewController.swift b/iBoxWebShareExtension/ShareViewController.swift new file mode 100644 index 0000000..c46d013 --- /dev/null +++ b/iBoxWebShareExtension/ShareViewController.swift @@ -0,0 +1,75 @@ +// +// ShareViewController.swift +// iBoxWebShareExtension +// +// Created by Chan on 2/8/24. +// + +import UIKit +import Social +import MobileCoreServices + +class ShareViewController: UIViewController { + + private let appURLString = "iBox://" + private let groupName = "group.com.ibox" + + @IBOutlet weak var label: UILabel? + + override func viewDidLoad() { + super.viewDidLoad() + + guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, + let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { + return + } + + // URL 타입의 데이터 로드 + if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { + itemProvider.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in + DispatchQueue.global().async { + if let url = item as? URL { + // 로드된 URL 처리 + print("Loaded URL: \(url)") + } else if let error = error { + // 에러 처리 + print("Error loading URL: \(error.localizedDescription)") + } + } + } + } + } + + + func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { + UIView.animate(withDuration: 0.3, animations: { + self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) + }, completion: completion) + } + + // MARK: IBAction + + @IBAction func cancel() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } + + @IBAction func save() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + // UserDefaults에 데이터 저장 + if let data = self.label?.text { + let defaults = UserDefaults(suiteName: groupName) + defaults?.set(data, forKey: "share") + defaults?.synchronize() + print("ShareViewController: URL 저장 !") + } + // 원래 앱 열기 + if let appURL = URL(string: appURLString) { + self.view.window?.windowScene?.open(appURL, options: nil) + } + } + +} diff --git a/iBoxWebShareExtension/iBoxWebShareExtension.entitlements b/iBoxWebShareExtension/iBoxWebShareExtension.entitlements new file mode 100644 index 0000000..ef36994 --- /dev/null +++ b/iBoxWebShareExtension/iBoxWebShareExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.ibox + + + From a7a000252a4803ca04cd582fe06da03ff2055b3b Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 8 Feb 2024 17:31:18 +0900 Subject: [PATCH 028/370] feat: share extension view --- Project.swift | 3 +- ShareExtension/ShareViewController.swift | 89 ++++++++++++++++-------- 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/Project.swift b/Project.swift index 3169d63..67a8d00 100644 --- a/Project.swift +++ b/Project.swift @@ -48,7 +48,8 @@ class iBoxFactory: ProjectFactory { "NSExtensionActivationSupportsWebURLWithMaxCount" : 1 ] ], - "NSExtensionPointIdentifier": "com.apple.share-services" + "NSExtensionPointIdentifier": "com.apple.share-services", + "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).ShareViewController" ] ] diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index b614df4..c46d013 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -1,46 +1,75 @@ // // ShareViewController.swift -// iBoxShareExtension +// iBoxWebShareExtension // -// Created by jiyeon on 1/30/24. +// Created by Chan on 2/8/24. // import UIKit import Social +import MobileCoreServices -class ShareViewController: SLComposeServiceViewController { - - override func isContentValid() -> Bool { - // Do validation of contentText and/or NSExtensionContext attachments here +class ShareViewController: UIViewController { + + private let appURLString = "iBox://" + private let groupName = "group.com.ibox" + + @IBOutlet weak var label: UILabel? + + override func viewDidLoad() { + super.viewDidLoad() - // contentText : 유저가 공유하기 창을 눌러 넘어온 문자열 값(상수) - if let currentMessage = contentText{ - let currentMessageLength = currentMessage.count - // charactersRemaining : 문자열 길이 제한 값(상수) - charactersRemaining = (100 - currentMessageLength) as NSNumber - - print("currentMessage : \(currentMessage) // 길이 : \(currentMessageLength) // 제한 : \(charactersRemaining)") - if Int(charactersRemaining) < 0 { - print("100자가 넘었을때는 공유할 수 없다!") - return false + guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, + let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { + return + } + + // URL 타입의 데이터 로드 + if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { + itemProvider.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in + DispatchQueue.global().async { + if let url = item as? URL { + // 로드된 URL 처리 + print("Loaded URL: \(url)") + } else if let error = error { + // 에러 처리 + print("Error loading URL: \(error.localizedDescription)") + } + } } } - return true } - - override func didSelectPost() { - // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. - // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. - self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) + + func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { + UIView.animate(withDuration: 0.3, animations: { + self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) + }, completion: completion) } - - // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. - override func configurationItems() -> [Any]! { - let item = SLComposeSheetConfigurationItem() - - item?.title = "여기는 제목입니다" - // item?.tapHandler : 유저가 터치했을 때 호출되는 핸들러 - return [item] + + // MARK: IBAction + + @IBAction func cancel() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } + + @IBAction func save() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + // UserDefaults에 데이터 저장 + if let data = self.label?.text { + let defaults = UserDefaults(suiteName: groupName) + defaults?.set(data, forKey: "share") + defaults?.synchronize() + print("ShareViewController: URL 저장 !") + } + // 원래 앱 열기 + if let appURL = URL(string: appURLString) { + self.view.window?.windowScene?.open(appURL, options: nil) + } } + } From aad9e37c127e578d7206fdecf96463e579f31a31 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 8 Feb 2024 17:36:37 +0900 Subject: [PATCH 029/370] chore: remove unncessaryfiles --- iBoxWebShareExtension/Info.plist | 20 ----- .../ShareViewController.swift | 75 ------------------- .../iBoxWebShareExtension.entitlements | 10 --- 3 files changed, 105 deletions(-) delete mode 100644 iBoxWebShareExtension/Info.plist delete mode 100644 iBoxWebShareExtension/ShareViewController.swift delete mode 100644 iBoxWebShareExtension/iBoxWebShareExtension.entitlements diff --git a/iBoxWebShareExtension/Info.plist b/iBoxWebShareExtension/Info.plist deleted file mode 100644 index 4045f71..0000000 --- a/iBoxWebShareExtension/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleName - $(PRODUCT_NAME) - NSExtension - - NSExtensionAttributes - - NSExtensionActivationRule - TRUEPREDICATE - - NSExtensionPointIdentifier - com.apple.share-services - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).ShareViewController - - - diff --git a/iBoxWebShareExtension/ShareViewController.swift b/iBoxWebShareExtension/ShareViewController.swift deleted file mode 100644 index c46d013..0000000 --- a/iBoxWebShareExtension/ShareViewController.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// ShareViewController.swift -// iBoxWebShareExtension -// -// Created by Chan on 2/8/24. -// - -import UIKit -import Social -import MobileCoreServices - -class ShareViewController: UIViewController { - - private let appURLString = "iBox://" - private let groupName = "group.com.ibox" - - @IBOutlet weak var label: UILabel? - - override func viewDidLoad() { - super.viewDidLoad() - - guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, - let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { - return - } - - // URL 타입의 데이터 로드 - if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { - itemProvider.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in - DispatchQueue.global().async { - if let url = item as? URL { - // 로드된 URL 처리 - print("Loaded URL: \(url)") - } else if let error = error { - // 에러 처리 - print("Error loading URL: \(error.localizedDescription)") - } - } - } - } - } - - - func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { - UIView.animate(withDuration: 0.3, animations: { - self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) - }, completion: completion) - } - - // MARK: IBAction - - @IBAction func cancel() { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - } - - @IBAction func save() { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - // UserDefaults에 데이터 저장 - if let data = self.label?.text { - let defaults = UserDefaults(suiteName: groupName) - defaults?.set(data, forKey: "share") - defaults?.synchronize() - print("ShareViewController: URL 저장 !") - } - // 원래 앱 열기 - if let appURL = URL(string: appURLString) { - self.view.window?.windowScene?.open(appURL, options: nil) - } - } - -} diff --git a/iBoxWebShareExtension/iBoxWebShareExtension.entitlements b/iBoxWebShareExtension/iBoxWebShareExtension.entitlements deleted file mode 100644 index ef36994..0000000 --- a/iBoxWebShareExtension/iBoxWebShareExtension.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.ibox - - - From 73ab7316b4a282770150edb3f6f8eb1b509382b6 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 8 Feb 2024 22:02:05 +0900 Subject: [PATCH 030/370] fix: tuist config --- Project.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Project.swift b/Project.swift index 67a8d00..bb2e29f 100644 --- a/Project.swift +++ b/Project.swift @@ -14,6 +14,7 @@ protocol ProjectFactory { class iBoxFactory: ProjectFactory { let projectName: String = "iBox" let bundleId: String = "com.box42.iBox" + let iosVersion: String = "15.0" let dependencies: [TargetDependency] = [ .external(name: "SnapKit") @@ -45,21 +46,22 @@ class iBoxFactory: ProjectFactory { "NSExtension": [ "NSExtensionAttributes": [ "NSExtensionActivationRule": [ + "NSExtensionActivationSupportsWebPageWithMaxCount" : 1, "NSExtensionActivationSupportsWebURLWithMaxCount" : 1 ] ], "NSExtensionPointIdentifier": "com.apple.share-services", - "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).ShareViewController" + "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).CustomShareViewController" ] ] func generateTarget() -> [ProjectDescription.Target] { let appTarget = Target( name: projectName, - destinations: .iOS, + platform: .iOS, product: .app, bundleId: bundleId, - deploymentTargets: .iOS("15.0"), + deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), infoPlist: .extendingDefault(with: appInfoPlist), sources: ["\(projectName)/Sources/**"], resources: "\(projectName)/Resources/**", @@ -68,9 +70,10 @@ class iBoxFactory: ProjectFactory { let shareExtensionTarget = Target( name: "\(projectName)ShareExtension", - destinations: .iOS, + platform: .iOS, product: .appExtension, bundleId: "\(bundleId).ShareExtension", + deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), infoPlist: .extendingDefault(with: shareExtensionInfoPlist), sources: ["ShareExtension/**"], resources: [], From 4822f2e3ee224acfc1be248a750461d6a467ae89 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 16 Feb 2024 03:10:15 +0900 Subject: [PATCH 031/370] fix: add target dependencies share extension --- Project.swift | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Project.swift b/Project.swift index 67a8d00..145ce10 100644 --- a/Project.swift +++ b/Project.swift @@ -14,9 +14,11 @@ protocol ProjectFactory { class iBoxFactory: ProjectFactory { let projectName: String = "iBox" let bundleId: String = "com.box42.iBox" + let iosVersion: String = "15.0" let dependencies: [TargetDependency] = [ - .external(name: "SnapKit") + .external(name: "SnapKit"), + .target(name: "iBoxShareExtension") ] private let appInfoPlist: [String: Plist.Value] = [ @@ -39,38 +41,41 @@ class iBoxFactory: ProjectFactory { ] private let shareExtensionInfoPlist: [String: Plist.Value] = [ - "CFBundleDisplayName": "iBox Share", + "CFBundleDisplayName": "iBox.Share", "CFBundleShortVersionString": "1.0", "CFBundleVersion": "1", "NSExtension": [ "NSExtensionAttributes": [ "NSExtensionActivationRule": [ + "NSExtensionActivationSupportsWebPageWithMaxCount" : 1, "NSExtensionActivationSupportsWebURLWithMaxCount" : 1 ] ], "NSExtensionPointIdentifier": "com.apple.share-services", - "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).ShareViewController" + "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).CustomShareViewController" ] ] func generateTarget() -> [ProjectDescription.Target] { let appTarget = Target( name: projectName, - destinations: .iOS, + platform: .iOS, product: .app, bundleId: bundleId, - deploymentTargets: .iOS("15.0"), + deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), infoPlist: .extendingDefault(with: appInfoPlist), sources: ["\(projectName)/Sources/**"], resources: "\(projectName)/Resources/**", dependencies: dependencies ) + let shareExtensionTarget = Target( name: "\(projectName)ShareExtension", - destinations: .iOS, + platform: .iOS, product: .appExtension, bundleId: "\(bundleId).ShareExtension", + deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), infoPlist: .extendingDefault(with: shareExtensionInfoPlist), sources: ["ShareExtension/**"], resources: [], From 5c5c4de04d13a621d4e5e7a1162b050bceaff461 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 16 Feb 2024 03:10:33 +0900 Subject: [PATCH 032/370] feat: add share view controller --- ShareExtension/ShareViewController.swift | 212 ++++++++++++++++------- 1 file changed, 154 insertions(+), 58 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index c46d013..f60a5f8 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -7,69 +7,165 @@ import UIKit import Social -import MobileCoreServices -class ShareViewController: UIViewController { - - private let appURLString = "iBox://" - private let groupName = "group.com.ibox" - - @IBOutlet weak var label: UILabel? - +@objc(CustomShareViewController) +class CustomShareViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - - guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, - let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { - return - } - - // URL 타입의 데이터 로드 - if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { - itemProvider.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in - DispatchQueue.global().async { - if let url = item as? URL { - // 로드된 URL 처리 - print("Loaded URL: \(url)") - } else if let error = error { - // 에러 처리 - print("Error loading URL: \(error.localizedDescription)") - } - } - } - } - } - - - func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { - UIView.animate(withDuration: 0.3, animations: { - self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) - }, completion: completion) + + // 1: Set the background and call the function to create the navigation bar + self.view.backgroundColor = .systemGray6 + setupNavBar() } - - // MARK: IBAction - - @IBAction func cancel() { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) + + // 2: Set the title and the navigation items + private func setupNavBar() { + self.navigationItem.title = "My app" + + let itemCancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAction)) + self.navigationItem.setLeftBarButton(itemCancel, animated: false) + + let itemDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneAction)) + self.navigationItem.setRightBarButton(itemDone, animated: false) } - - @IBAction func save() { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - // UserDefaults에 데이터 저장 - if let data = self.label?.text { - let defaults = UserDefaults(suiteName: groupName) - defaults?.set(data, forKey: "share") - defaults?.synchronize() - print("ShareViewController: URL 저장 !") - } - // 원래 앱 열기 - if let appURL = URL(string: appURLString) { - self.view.window?.windowScene?.open(appURL, options: nil) - } + + // 3: Define the actions for the navigation items + @objc private func cancelAction () { + let error = NSError(domain: "some.bundle.identifier", code: 0, userInfo: [NSLocalizedDescriptionKey: "An error description"]) + extensionContext?.cancelRequest(withError: error) } + @objc private func doneAction() { + extensionContext?.completeRequest(returningItems: [], completionHandler: nil) + } } + + + +//class ShareViewController: SLComposeServiceViewController { +// +// override func isContentValid() -> Bool { +// // Do validation of contentText and/or NSExtensionContext attachments here +// +// // contentText : 유저가 공유하기 창을 눌러 넘어온 문자열 값(상수) +// if let currentMessage = contentText{ +// let currentMessageLength = currentMessage.count +// // charactersRemaining : 문자열 길이 제한 값(상수) +// charactersRemaining = (100 - currentMessageLength) as NSNumber +// +// print("currentMessage : \(currentMessage) // 길이 : \(currentMessageLength) // 제한 : \(charactersRemaining)") +// if Int(charactersRemaining) < 0 { +// print("100자가 넘었을때는 공유할 수 없다!") +// return false +// } +// } +// return true +// } +// +// override func didSelectPost() { +// // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. +// +// // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. +// self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) +// } +// +// // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. +// override func configurationItems() -> [Any]! { +// let item = SLComposeSheetConfigurationItem() +// +// item?.title = "여기는 제목입니다" +// // item?.tapHandler : 유저가 터치했을 때 호출되는 핸들러 +// return [item] +// } +//} + + +//class ShareViewController: UIViewController { +// +// private let appURLString = "iBox://" +// private let groupName = "group.com.ibox" +// +// @IBOutlet weak var label: UILabel? +//// +//// override func viewDidLoad() { +//// super.viewDidLoad() +//// +//// guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, +//// let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { +//// return +//// } +//// +//// // URL 타입의 데이터 로드 +//// if itemProvider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { +//// itemProvider.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { (item, error) in +//// DispatchQueue.main.async { +//// if let url = item as? URL { +//// // 로드된 URL 처리 +//// print("Loaded URL: \(url)") +//// } else if let error = error { +//// // 에러 처리 +//// print("Error loading URL: \(error.localizedDescription)") +//// } +//// } +//// } +//// } +//// } +// +// override func viewDidLoad() { +// super.viewDidLoad() +// +// // 1: Set the background and call the function to create the navigation bar +// self.view.backgroundColor = .systemGray6 +// setupNavBar() +// } +// +// // 2: Set the title and the navigation items +// private func setupNavBar() { +// self.navigationItem.title = "My app" +// +// let itemCancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAction)) +// self.navigationItem.setLeftBarButton(itemCancel, animated: false) +// +// let itemDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneAction)) +// self.navigationItem.setRightBarButton(itemDone, animated: false) +// } +// +// // 3: Define the actions for the navigation items +// @objc private func cancelAction () { +// let error = NSError(domain: "some.bundle.identifier", code: 0, userInfo: [NSLocalizedDescriptionKey: "An error description"]) +// extensionContext?.cancelRequest(withError: error) +// } +// +// @objc private func doneAction() { +// extensionContext?.completeRequest(returningItems: [], completionHandler: nil) +// } +// +// func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { +// UIView.animate(withDuration: 0.3, animations: { +// self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) +// }, completion: completion) +// } +// +// // MARK: IBAction +// +//// @IBAction func cancel() { +//// self.hideExtensionWithCompletionHandler(completion: { _ in +//// self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) +//// }) +//// } +//// +//// @IBAction func save() { +//// self.hideExtensionWithCompletionHandler(completion: { _ in +//// self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) +//// }) +//// // UserDefaults에 데이터 저장 +//// if let data = self.label?.text { +//// let defaults = UserDefaults(suiteName: groupName) +//// defaults?.set(data, forKey: "share") +//// // UserDefaults의 synchronize() 메소드는 더 이상 필요하지 않습니다. iOS에서는 자동으로 동기화됩니다. +//// print("ShareViewController: URL 저장 !") +//// } +//// // 메인 앱으로 돌아가는 UI 제공 또는 안내 메시지 표시 +//// // 예: 사용자에게 메인 앱을 열도록 요청하는 Alert 표시 +//// } +//} From 68ddd5bafd91501392b3e7a04fa5a8413c24dfc7 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 16 Feb 2024 03:58:23 +0900 Subject: [PATCH 033/370] fix: app crush --- ShareExtension/ShareViewController.swift | 276 +++++++++++------------ 1 file changed, 130 insertions(+), 146 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index f60a5f8..5989b4d 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -7,165 +7,149 @@ import UIKit import Social +import UniformTypeIdentifiers @objc(CustomShareViewController) class CustomShareViewController: UIViewController { + var label = UILabel() + override func viewDidLoad() { super.viewDidLoad() - - // 1: Set the background and call the function to create the navigation bar - self.view.backgroundColor = .systemGray6 - setupNavBar() + setupUI() + extractSharedURL() } - - // 2: Set the title and the navigation items - private func setupNavBar() { - self.navigationItem.title = "My app" - - let itemCancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAction)) - self.navigationItem.setLeftBarButton(itemCancel, animated: false) - - let itemDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneAction)) - self.navigationItem.setRightBarButton(itemDone, animated: false) + + func setupUI() { + let shareView = UIView() + shareView.backgroundColor = .white + self.view.addSubview(shareView) + + // shareView Auto Layout 설정 + shareView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + shareView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), + shareView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), + shareView.widthAnchor.constraint(equalToConstant: 500), + shareView.heightAnchor.constraint(equalToConstant: 500) + ]) + + // Label 설정 + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "Hello, World!" + label.textColor = .black + label.textAlignment = .center + shareView.addSubview(label) + + // Label 제약 조건 추가 + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: shareView.topAnchor, constant: 20), + label.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), + label.widthAnchor.constraint(equalToConstant: 200), + label.heightAnchor.constraint(equalToConstant: 21) + ]) + + // Cancel Button 설정 및 제약 조건 추가 + let cancelButton = UIButton(type: .system) + cancelButton.setTitle("Cancel", for: .normal) + cancelButton.translatesAutoresizingMaskIntoConstraints = false + cancelButton.addTarget(self, action: #selector(cancel), for: .touchUpInside) + shareView.addSubview(cancelButton) + + NSLayoutConstraint.activate([ + cancelButton.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 20), + cancelButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), + cancelButton.widthAnchor.constraint(equalToConstant: 200), + cancelButton.heightAnchor.constraint(equalToConstant: 40) + ]) + + // Save Button 설정 및 제약 조건 추가 + let saveButton = UIButton(type: .system) + saveButton.setTitle("Save", for: .normal) + saveButton.translatesAutoresizingMaskIntoConstraints = false + saveButton.addTarget(self, action: #selector(save), for: .touchUpInside) + shareView.addSubview(saveButton) + + NSLayoutConstraint.activate([ + saveButton.topAnchor.constraint(equalTo: cancelButton.bottomAnchor, constant: 20), + saveButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), + saveButton.widthAnchor.constraint(equalToConstant: 200), + saveButton.heightAnchor.constraint(equalToConstant: 40) + ]) + + // Open App Button 설정 및 제약 조건 추가 + let saveOpenAppButton = UIButton(type: .system) + saveOpenAppButton.setTitle("Open App", for: .normal) + saveOpenAppButton.translatesAutoresizingMaskIntoConstraints = false + saveOpenAppButton.addTarget(self, action: #selector(openApp), for: .touchUpInside) + shareView.addSubview(saveOpenAppButton) + + NSLayoutConstraint.activate([ + saveOpenAppButton.topAnchor.constraint(equalTo: saveButton.bottomAnchor, constant: 20), + saveOpenAppButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), + saveOpenAppButton.widthAnchor.constraint(equalToConstant: 200), + saveOpenAppButton.heightAnchor.constraint(equalToConstant: 40) + ]) } - // 3: Define the actions for the navigation items - @objc private func cancelAction () { - let error = NSError(domain: "some.bundle.identifier", code: 0, userInfo: [NSLocalizedDescriptionKey: "An error description"]) - extensionContext?.cancelRequest(withError: error) + + func getAppGroupUserDefaults() { + let defaults = UserDefaults(suiteName: "group.com.iBox") + if let data = defaults?.string(forKey: "share") { + print("ShareViewController: URL 가져오기: \(data)") + } } - @objc private func doneAction() { - extensionContext?.completeRequest(returningItems: [], completionHandler: nil) + func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { + UIView.animate(withDuration: 0.3, animations: { + self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) + }, completion: completion) } -} + // MARK: IBAction + @IBAction func cancel() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } -//class ShareViewController: SLComposeServiceViewController { -// -// override func isContentValid() -> Bool { -// // Do validation of contentText and/or NSExtensionContext attachments here -// -// // contentText : 유저가 공유하기 창을 눌러 넘어온 문자열 값(상수) -// if let currentMessage = contentText{ -// let currentMessageLength = currentMessage.count -// // charactersRemaining : 문자열 길이 제한 값(상수) -// charactersRemaining = (100 - currentMessageLength) as NSNumber -// -// print("currentMessage : \(currentMessage) // 길이 : \(currentMessageLength) // 제한 : \(charactersRemaining)") -// if Int(charactersRemaining) < 0 { -// print("100자가 넘었을때는 공유할 수 없다!") -// return false -// } -// } -// return true -// } -// -// override func didSelectPost() { -// // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. -// -// // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. -// self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) -// } -// -// // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. -// override func configurationItems() -> [Any]! { -// let item = SLComposeSheetConfigurationItem() -// -// item?.title = "여기는 제목입니다" -// // item?.tapHandler : 유저가 터치했을 때 호출되는 핸들러 -// return [item] -// } -//} + @IBAction func save() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } + @IBAction func openApp() { + let url = URL(string: "iBox://")! + self.extensionContext?.open(url, completionHandler: nil) + } -//class ShareViewController: UIViewController { -// -// private let appURLString = "iBox://" -// private let groupName = "group.com.ibox" -// -// @IBOutlet weak var label: UILabel? -//// -//// override func viewDidLoad() { -//// super.viewDidLoad() -//// -//// guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, -//// let itemProvider = extensionItem.attachments?.first as? NSItemProvider else { -//// return -//// } -//// -//// // URL 타입의 데이터 로드 -//// if itemProvider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { -//// itemProvider.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { (item, error) in -//// DispatchQueue.main.async { -//// if let url = item as? URL { -//// // 로드된 URL 처리 -//// print("Loaded URL: \(url)") -//// } else if let error = error { -//// // 에러 처리 -//// print("Error loading URL: \(error.localizedDescription)") -//// } -//// } -//// } -//// } -//// } -// -// override func viewDidLoad() { -// super.viewDidLoad() -// -// // 1: Set the background and call the function to create the navigation bar -// self.view.backgroundColor = .systemGray6 -// setupNavBar() -// } -// -// // 2: Set the title and the navigation items -// private func setupNavBar() { -// self.navigationItem.title = "My app" -// -// let itemCancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAction)) -// self.navigationItem.setLeftBarButton(itemCancel, animated: false) -// -// let itemDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneAction)) -// self.navigationItem.setRightBarButton(itemDone, animated: false) -// } -// -// // 3: Define the actions for the navigation items -// @objc private func cancelAction () { -// let error = NSError(domain: "some.bundle.identifier", code: 0, userInfo: [NSLocalizedDescriptionKey: "An error description"]) -// extensionContext?.cancelRequest(withError: error) -// } -// -// @objc private func doneAction() { -// extensionContext?.completeRequest(returningItems: [], completionHandler: nil) -// } -// -// func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { -// UIView.animate(withDuration: 0.3, animations: { -// self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) -// }, completion: completion) -// } -// -// // MARK: IBAction -// -//// @IBAction func cancel() { -//// self.hideExtensionWithCompletionHandler(completion: { _ in -//// self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) -//// }) -//// } -//// -//// @IBAction func save() { -//// self.hideExtensionWithCompletionHandler(completion: { _ in -//// self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) -//// }) -//// // UserDefaults에 데이터 저장 -//// if let data = self.label?.text { -//// let defaults = UserDefaults(suiteName: groupName) -//// defaults?.set(data, forKey: "share") -//// // UserDefaults의 synchronize() 메소드는 더 이상 필요하지 않습니다. iOS에서는 자동으로 동기화됩니다. -//// print("ShareViewController: URL 저장 !") -//// } -//// // 메인 앱으로 돌아가는 UI 제공 또는 안내 메시지 표시 -//// // 예: 사용자에게 메인 앱을 열도록 요청하는 Alert 표시 -//// } -//} + @IBAction func openAppWithSharedDataAndCompletionAndErrorAndCompletion() { + let url = URL(string: "iBox://")! + self.extensionContext?.open(url, completionHandler: { success in + print("ShareViewController: Open App with shared data and completion and error and completion: \(success)") + }) + } + + func extractSharedURL() { + guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } + + for attachment in extensionItem.attachments ?? [] { + if attachment.hasItemConformingToTypeIdentifier(UTType.url.identifier) { + attachment.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { [weak self] (data, error) in + DispatchQueue.main.async { + if let url = data as? URL, error == nil { + // URL을 UILabel에 표시 + self?.label.text = url.absoluteString + print("공유된 URL: \(url.absoluteString)") + } else { + // 에러 처리 + print("URL을 가져오는 데 실패했습니다: \(String(describing: error))") + } + } + } + break // 첫 번째 URL 항목을 찾으면 반복 중단 + } + } + } +} From 63026ee2c221815eac348843bc47ccf38c10c7b0 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 08:26:51 +0900 Subject: [PATCH 034/370] fix: tuist dependencies for SnapKit-Dynamic framework --- Tuist/Dependencies.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index b258631..2c83d41 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -9,7 +9,9 @@ import ProjectDescription let spm = SwiftPackageManagerDependencies([ .remote(url: "https://github.com/SnapKit/SnapKit.git", requirement: .upToNextMinor(from: "5.0.1")) -]) +], + productTypes: ["SnapKit": .framework] +) let dependencies = Dependencies( swiftPackageManager: spm, From 625cbd4ab3b8a736e7109c796824736819f456fd Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 08:27:10 +0900 Subject: [PATCH 035/370] fix: tuist dependencies for SnapKit-Dynamic framework --- Project.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index 145ce10..3769692 100644 --- a/Project.swift +++ b/Project.swift @@ -21,6 +21,10 @@ class iBoxFactory: ProjectFactory { .target(name: "iBoxShareExtension") ] + let iBoxShareExtensionDependencies: [TargetDependency] = [ + .external(name: "SnapKit") + ] + private let appInfoPlist: [String: Plist.Value] = [ "ITSAppUsesNonExemptEncryption": false, "CFBundleName": "iBox", @@ -69,7 +73,6 @@ class iBoxFactory: ProjectFactory { dependencies: dependencies ) - let shareExtensionTarget = Target( name: "\(projectName)ShareExtension", platform: .iOS, @@ -79,7 +82,7 @@ class iBoxFactory: ProjectFactory { infoPlist: .extendingDefault(with: shareExtensionInfoPlist), sources: ["ShareExtension/**"], resources: [], - dependencies: [] + dependencies: iBoxShareExtensionDependencies ) return [appTarget, shareExtensionTarget] From f63570801d5d843e8ca9e0e4d34117b366b8b3da Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 13:20:54 +0900 Subject: [PATCH 036/370] feat: add url type scheme for tuist --- Project.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Project.swift b/Project.swift index 3769692..41db239 100644 --- a/Project.swift +++ b/Project.swift @@ -41,7 +41,14 @@ class iBoxFactory: ProjectFactory { ], ] ] - ] + ], + "CFBundleURLTypes": [ + [ + "CFBundleTypeRole": "Editor", + "CFBundleURLName": "com.url.ibox", + "CFBundleURLSchemes": ["iBox"] + ] + ], ] private let shareExtensionInfoPlist: [String: Plist.Value] = [ From ed76f8573cd61e505bd988c03f4acdb1c6072210 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 13:21:09 +0900 Subject: [PATCH 037/370] feat: share extension view --- ShareExtension/ShareViewController.swift | 163 ++++++++---------- .../View/ShareExtensionBackGroundView.swift | 114 ++++++++++++ 2 files changed, 184 insertions(+), 93 deletions(-) create mode 100644 ShareExtension/View/ShareExtensionBackGroundView.swift diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 5989b4d..09da0fd 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -8,89 +8,29 @@ import UIKit import Social import UniformTypeIdentifiers +import SnapKit @objc(CustomShareViewController) class CustomShareViewController: UIViewController { - var label = UILabel() - + + var backgroundView = ShareExtensionBackGroundView() + var dataURL: String = "" + override func viewDidLoad() { super.viewDidLoad() - setupUI() + configureUI() extractSharedURL() } - func setupUI() { - let shareView = UIView() - shareView.backgroundColor = .white - self.view.addSubview(shareView) - - // shareView Auto Layout 설정 - shareView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - shareView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), - shareView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), - shareView.widthAnchor.constraint(equalToConstant: 500), - shareView.heightAnchor.constraint(equalToConstant: 500) - ]) - - // Label 설정 - label.translatesAutoresizingMaskIntoConstraints = false - label.text = "Hello, World!" - label.textColor = .black - label.textAlignment = .center - shareView.addSubview(label) - - // Label 제약 조건 추가 - NSLayoutConstraint.activate([ - label.topAnchor.constraint(equalTo: shareView.topAnchor, constant: 20), - label.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), - label.widthAnchor.constraint(equalToConstant: 200), - label.heightAnchor.constraint(equalToConstant: 21) - ]) - - // Cancel Button 설정 및 제약 조건 추가 - let cancelButton = UIButton(type: .system) - cancelButton.setTitle("Cancel", for: .normal) - cancelButton.translatesAutoresizingMaskIntoConstraints = false - cancelButton.addTarget(self, action: #selector(cancel), for: .touchUpInside) - shareView.addSubview(cancelButton) - - NSLayoutConstraint.activate([ - cancelButton.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 20), - cancelButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), - cancelButton.widthAnchor.constraint(equalToConstant: 200), - cancelButton.heightAnchor.constraint(equalToConstant: 40) - ]) - - // Save Button 설정 및 제약 조건 추가 - let saveButton = UIButton(type: .system) - saveButton.setTitle("Save", for: .normal) - saveButton.translatesAutoresizingMaskIntoConstraints = false - saveButton.addTarget(self, action: #selector(save), for: .touchUpInside) - shareView.addSubview(saveButton) - - NSLayoutConstraint.activate([ - saveButton.topAnchor.constraint(equalTo: cancelButton.bottomAnchor, constant: 20), - saveButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), - saveButton.widthAnchor.constraint(equalToConstant: 200), - saveButton.heightAnchor.constraint(equalToConstant: 40) - ]) - - // Open App Button 설정 및 제약 조건 추가 - let saveOpenAppButton = UIButton(type: .system) - saveOpenAppButton.setTitle("Open App", for: .normal) - saveOpenAppButton.translatesAutoresizingMaskIntoConstraints = false - saveOpenAppButton.addTarget(self, action: #selector(openApp), for: .touchUpInside) - shareView.addSubview(saveOpenAppButton) - - NSLayoutConstraint.activate([ - saveOpenAppButton.topAnchor.constraint(equalTo: saveButton.bottomAnchor, constant: 20), - saveOpenAppButton.centerXAnchor.constraint(equalTo: shareView.centerXAnchor), - saveOpenAppButton.widthAnchor.constraint(equalToConstant: 200), - saveOpenAppButton.heightAnchor.constraint(equalToConstant: 40) - ]) + func configureUI() { + self.view.addSubview(backgroundView) + backgroundView.delegate = self + backgroundView.snp.makeConstraints { make in + make.trailing.leading.equalToSuperview().inset(10) + make.centerY.equalToSuperview() + make.height.equalToSuperview().multipliedBy(2.0 / 3.0) + } } - func getAppGroupUserDefaults() { let defaults = UserDefaults(suiteName: "group.com.iBox") @@ -98,39 +38,61 @@ class CustomShareViewController: UIViewController { print("ShareViewController: URL 가져오기: \(data)") } } - + func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { UIView.animate(withDuration: 0.3, animations: { self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) }, completion: completion) } - + // MARK: IBAction - + @IBAction func cancel() { self.hideExtensionWithCompletionHandler(completion: { _ in self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) }) } - + @IBAction func save() { + if dataURL != "" { + let sharedData = dataURL + print(sharedData) + let defaults = UserDefaults(suiteName: "group.com.iBox") + defaults?.set(sharedData, forKey: "shareData") + } else { + print("저장에 실패하였습니다.") + } + self.hideExtensionWithCompletionHandler(completion: { _ in self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) }) } + @IBAction func openApp() { - let url = URL(string: "iBox://")! - self.extensionContext?.open(url, completionHandler: nil) + if dataURL != "" { + let sharedData = dataURL + print(sharedData) + let defaults = UserDefaults(suiteName: "group.com.iBox") + defaults?.set(sharedData, forKey: "shareData") + + let url = URL(string: "iBox://")! + self.extensionContext?.open(url, completionHandler: { success in + if success { + print("iBox 앱이 성공적으로 열렸습니다.") + } else { + print("iBox 앱을 열 수 없습니다.") + } + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } else { + print("data url 전송에 실패하였습니다.") + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } } - @IBAction func openAppWithSharedDataAndCompletionAndErrorAndCompletion() { - let url = URL(string: "iBox://")! - self.extensionContext?.open(url, completionHandler: { success in - print("ShareViewController: Open App with shared data and completion and error and completion: \(success)") - }) - } - func extractSharedURL() { guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } @@ -139,17 +101,32 @@ class CustomShareViewController: UIViewController { attachment.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { [weak self] (data, error) in DispatchQueue.main.async { if let url = data as? URL, error == nil { - // URL을 UILabel에 표시 - self?.label.text = url.absoluteString - print("공유된 URL: \(url.absoluteString)") + self?.dataURL = url.absoluteString + self?.backgroundView.updateLabel(with: url.absoluteString) + print("Shared URL: \(url.absoluteString)") } else { - // 에러 처리 - print("URL을 가져오는 데 실패했습니다: \(String(describing: error))") + print("Failed to retrieve URL: \(String(describing: error))") } } } - break // 첫 번째 URL 항목을 찾으면 반복 중단 + break } } } } + +extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { + + func didTapCancel() { + cancel() + } + + func didTapSave() { + save() + } + + func didTapOpenApp() { + openApp() + } + +} diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift new file mode 100644 index 0000000..07656a4 --- /dev/null +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -0,0 +1,114 @@ +// +// BackGroundView.swift +// iBox +// +// Created by Chan on 2/19/24. +// + +import UIKit +import SnapKit + +protocol ShareExtensionBackGroundViewDelegate: AnyObject { + func didTapCancel() + func didTapSave() + func didTapOpenApp() +} + +class ShareExtensionBackGroundView: UIView { + weak var delegate: ShareExtensionBackGroundViewDelegate? + + let label = UILabel() + let cancelButton = UIButton(type: .system) + let saveButton = UIButton(type: .system) + let openAppButton = UIButton(type: .system) + + override init(frame: CGRect) { + super.init(frame: frame) + self.setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupUI() { + self.backgroundColor = .white + + setupLabel() + setupCancelButton() + setupSaveButton() + setupOpenAppButton() + + cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) + saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside) + openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) + } + + private func setupLabel() { + self.addSubview(label) + label.text = "Exporting links to iBox!" + label.textColor = .black + label.textAlignment = .center + + label.snp.makeConstraints { make in + make.top.equalToSuperview().offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(200) + make.height.equalTo(21) + } + } + + private func setupCancelButton() { + self.addSubview(cancelButton) + cancelButton.setTitle("Cancel", for: .normal) + + cancelButton.snp.makeConstraints { make in + make.top.equalTo(label.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(200) + make.height.equalTo(40) + } + } + + private func setupSaveButton() { + self.addSubview(saveButton) + saveButton.setTitle("Send to iBox app", for: .normal) + + saveButton.snp.makeConstraints { make in + make.top.equalTo(cancelButton.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(200) + make.height.equalTo(40) + } + } + + private func setupOpenAppButton() { + self.addSubview(openAppButton) + openAppButton.setTitle("Open in the iBox app", for: .normal) + + openAppButton.snp.makeConstraints { make in + make.top.equalTo(saveButton.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(200) + make.height.equalTo(40) + } + } + + func updateLabel(with text: String) { + label.text = text + } + + // MARK: - Actions + + @objc func cancelButtonTapped() { + delegate?.didTapCancel() + } + + @objc func saveButtonTapped() { + delegate?.didTapSave() + } + + @objc func openAppButtonTapped() { + delegate?.didTapOpenApp() + } +} From 0113cbf3818356192f2bd8b0c4d660a6685f9423 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 19 Feb 2024 14:06:01 +0900 Subject: [PATCH 038/370] =?UTF-8?q?feat:=20Share=20Extension=20UI=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/ShareViewController.swift | 8 +- .../View/ShareExtensionBackGroundView.swift | 150 +++++++++++------- 2 files changed, 96 insertions(+), 62 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 09da0fd..98f66c6 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -26,9 +26,9 @@ class CustomShareViewController: UIViewController { self.view.addSubview(backgroundView) backgroundView.delegate = self backgroundView.snp.makeConstraints { make in - make.trailing.leading.equalToSuperview().inset(10) - make.centerY.equalToSuperview() - make.height.equalToSuperview().multipliedBy(2.0 / 3.0) + make.trailing.leading.equalToSuperview().inset(20) + make.center.equalToSuperview() + make.height.equalTo(200) } } @@ -102,7 +102,7 @@ class CustomShareViewController: UIViewController { DispatchQueue.main.async { if let url = data as? URL, error == nil { self?.dataURL = url.absoluteString - self?.backgroundView.updateLabel(with: url.absoluteString) + self?.backgroundView.updateLinkLabel(with: url.absoluteString) print("Shared URL: \(url.absoluteString)") } else { print("Failed to retrieve URL: \(String(describing: error))") diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift index 07656a4..a8e1461 100644 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -6,6 +6,7 @@ // import UIKit + import SnapKit protocol ShareExtensionBackGroundViewDelegate: AnyObject { @@ -15,87 +16,120 @@ protocol ShareExtensionBackGroundViewDelegate: AnyObject { } class ShareExtensionBackGroundView: UIView { + + // MARK: - Properties + weak var delegate: ShareExtensionBackGroundViewDelegate? - let label = UILabel() - let cancelButton = UIButton(type: .system) - let saveButton = UIButton(type: .system) - let openAppButton = UIButton(type: .system) + // MARK: - UI Components + + lazy var label: UILabel = { + let label = UILabel() + label.text = "이 링크를 iBox 앱에서 여시겠습니까?" + label.font = .systemFont(ofSize: 17) + label.textColor = .label + return label + }() + + lazy var linkLabel: UILabel = { + let label = UILabel() + label.textColor = .label + label.numberOfLines = 3 + label.lineBreakMode = .byTruncatingTail + return label + }() + + lazy var cancelButton: UIButton = { + let button = UIButton() + button.configuration = .plain() + button.configuration?.attributedTitle = .init( + "Cancel", + attributes: .init([.font: UIFont.systemFont(ofSize: 14)]) + ) + return button + }() + + lazy var saveButton: UIButton = { + let button = UIButton() + button.configuration = .plain() + button.configuration?.attributedTitle = .init( + "Save", + attributes: .init([.font: UIFont.boldSystemFont(ofSize: 14)]) + ) + return button + }() + + lazy var openAppButton: UIButton = { + let button = UIButton() + button.configuration = .plain() + button.configuration?.attributedTitle = .init( + "Open", + attributes: .init([.font: UIFont.boldSystemFont(ofSize: 14)]) + ) + return button + }() + + // MARK: - Initializer override init(frame: CGRect) { super.init(frame: frame) - self.setupUI() + + setupHierarchy() + setupLayout() + setupButtonAction() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - private func setupUI() { - self.backgroundColor = .white - - setupLabel() - setupCancelButton() - setupSaveButton() - setupOpenAppButton() - - cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) - saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside) - openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) + // MARK: - Setup Methods + + private func setupHierarchy() { + addSubview(label) + addSubview(linkLabel) + addSubview(cancelButton) + addSubview(saveButton) + addSubview(openAppButton) } - private func setupLabel() { - self.addSubview(label) - label.text = "Exporting links to iBox!" - label.textColor = .black - label.textAlignment = .center + private func setupLayout() { + backgroundColor = .systemBackground + clipsToBounds = true + layer.cornerRadius = 10 - label.snp.makeConstraints { make in - make.top.equalToSuperview().offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(200) - make.height.equalTo(21) + label.snp.makeConstraints { + $0.top.leading.equalToSuperview().inset(20) } - } - - private func setupCancelButton() { - self.addSubview(cancelButton) - cancelButton.setTitle("Cancel", for: .normal) - cancelButton.snp.makeConstraints { make in - make.top.equalTo(label.snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(200) - make.height.equalTo(40) + linkLabel.snp.makeConstraints { + $0.top.equalTo(label.snp.bottom).offset(10) + $0.leading.trailing.equalToSuperview().inset(20) } - } - - private func setupSaveButton() { - self.addSubview(saveButton) - saveButton.setTitle("Send to iBox app", for: .normal) - saveButton.snp.makeConstraints { make in - make.top.equalTo(cancelButton.snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(200) - make.height.equalTo(40) + cancelButton.snp.makeConstraints { + $0.trailing.equalTo(saveButton.snp.leading).offset(-20) + $0.centerY.equalTo(openAppButton.snp.centerY) } - } - - private func setupOpenAppButton() { - self.addSubview(openAppButton) - openAppButton.setTitle("Open in the iBox app", for: .normal) - openAppButton.snp.makeConstraints { make in - make.top.equalTo(saveButton.snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(200) - make.height.equalTo(40) + saveButton.snp.makeConstraints { + $0.trailing.equalTo(openAppButton.snp.leading).offset(-20) + $0.centerY.equalTo(openAppButton.snp.centerY) } + + openAppButton.snp.makeConstraints { + $0.trailing.bottom.equalToSuperview().inset(20) + } + } + + private func setupButtonAction() { + cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) + saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside) + openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) } - func updateLabel(with text: String) { - label.text = text + func updateLinkLabel(with text: String) { + linkLabel.text = text } // MARK: - Actions From 54e26f5d912e7da263de51d5c490543680437676 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 17:46:19 +0900 Subject: [PATCH 039/370] feat: URL querystring communication between extension and containing app --- ShareExtension/ShareViewController.swift | 54 ++++++++++++------------ iBox/Sources/SceneDelegate.swift | 20 +++++++++ 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 98f66c6..6c6e0b0 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -60,39 +60,30 @@ class CustomShareViewController: UIViewController { let defaults = UserDefaults(suiteName: "group.com.iBox") defaults?.set(sharedData, forKey: "shareData") } else { - print("저장에 실패하였습니다.") + print("저장에 실패하였습니다.") } - + self.hideExtensionWithCompletionHandler(completion: { _ in self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) }) } - - @IBAction func openApp() { - if dataURL != "" { - let sharedData = dataURL - print(sharedData) - let defaults = UserDefaults(suiteName: "group.com.iBox") - defaults?.set(sharedData, forKey: "shareData") - - let url = URL(string: "iBox://")! - self.extensionContext?.open(url, completionHandler: { success in - if success { - print("iBox 앱이 성공적으로 열렸습니다.") - } else { - print("iBox 앱을 열 수 없습니다.") - } - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - } else { - print("data url 전송에 실패하였습니다.") - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) + + @objc func openURL(_ url: URL) -> Bool { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + + var responder: UIResponder? = self + while responder != nil { + if let application = responder as? UIApplication { + return application.perform(#selector(openURL(_:)), with: url) != nil + } + responder = responder?.next } + return false } - + func extractSharedURL() { guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } @@ -126,7 +117,18 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { } func didTapOpenApp() { - openApp() + let sharedData = dataURL + let defaults = UserDefaults(suiteName: "group.com.iBox") + defaults?.set(sharedData, forKey: "shareData") + let url = URL(string: "iBox://\(sharedData)")! + + if openURL(url) { + print("iBox 앱이 성공적으로 열렸습니다.") + } else { + print("iBox 앱을 열 수 없습니다.") + } + + print(url) } } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 1b368ff..73d3574 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -37,6 +37,26 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 + + if let urlContext = connectionOptions.urlContexts.first { + let url = urlContext.url + guard url.scheme == "iBox" else { return } + + print("Opened URL: \(url)") + + // 앱이 실행되기 전에 url이 들어오는 경우 Logic + } + } + + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + if let urlContext = URLContexts.first { + let url = urlContext.url + guard url.scheme == "iBox" else { return } + + print("Opened URL: \(url)") + + // 앱 실행 중에 url이 들어오는 경우 Logic + } } func sceneDidDisconnect(_ scene: UIScene) { From 1475d40dbc6893b97527df9fbd947d3b599df462 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 17:46:44 +0900 Subject: [PATCH 040/370] fix: extension info plist tuist --- Project.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project.swift b/Project.swift index 41db239..be119fe 100644 --- a/Project.swift +++ b/Project.swift @@ -44,9 +44,9 @@ class iBoxFactory: ProjectFactory { ], "CFBundleURLTypes": [ [ - "CFBundleTypeRole": "Editor", - "CFBundleURLName": "com.url.ibox", - "CFBundleURLSchemes": ["iBox"] + "CFBundleURLName": "com.url.iBox", + "CFBundleURLSchemes": ["iBox"], + "CFBundleTypeRole": "Editor" ] ], ] From d5e36935ca77462b733c393693663eeb3d693461 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 19 Feb 2024 18:02:13 +0900 Subject: [PATCH 041/370] fix: delete userdefault --- ShareExtension/ShareViewController.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 6c6e0b0..dbae805 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -57,8 +57,6 @@ class CustomShareViewController: UIViewController { if dataURL != "" { let sharedData = dataURL print(sharedData) - let defaults = UserDefaults(suiteName: "group.com.iBox") - defaults?.set(sharedData, forKey: "shareData") } else { print("저장에 실패하였습니다.") } @@ -118,8 +116,6 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { func didTapOpenApp() { let sharedData = dataURL - let defaults = UserDefaults(suiteName: "group.com.iBox") - defaults?.set(sharedData, forKey: "shareData") let url = URL(string: "iBox://\(sharedData)")! if openURL(url) { From f7d9f8a64f4a25fcee65893a1dfb56735514615f Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 13:53:34 +0900 Subject: [PATCH 042/370] =?UTF-8?q?refactor:=20ProfileViewController=20MVV?= =?UTF-8?q?M=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Presenter/MyPage/MyPageView.swift | 87 ++++++++++++++++++ .../MyPage/MyPageViewController.swift | 92 +++++-------------- .../Presenter/MyPage/Theme/ThemeView.swift | 67 ++++++++++++++ .../MyPage/Theme/ThemeViewController.swift | 38 +------- .../ViewModel/MyPageCellViewModel.swift | 26 ++++++ .../ViewModel/MyPageSectionViewModel.swift | 19 ++++ iBox/Sources/ViewModel/MyPageViewModel.swift | 27 ++++++ iBox/Sources/ViewModel/ThemeViewModel.swift | 23 +++++ 8 files changed, 276 insertions(+), 103 deletions(-) create mode 100644 iBox/Sources/ViewModel/MyPageCellViewModel.swift create mode 100644 iBox/Sources/ViewModel/MyPageSectionViewModel.swift create mode 100644 iBox/Sources/ViewModel/MyPageViewModel.swift create mode 100644 iBox/Sources/ViewModel/ThemeViewModel.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index 976188a..ee07b29 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -9,6 +9,11 @@ import UIKit class MyPageView: BaseView { + // MARK: - Properties + + var delegate: MyPageViewDelegate? + private var viewModel: MyPageViewModel? + // MARK: - UI let profileView = UIView().then { @@ -38,8 +43,27 @@ class MyPageView: BaseView { $0.sectionHeaderTopPadding = 0 } + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperties() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + // MARK: - BaseViewProtocol + private func setupProperties() { + tableView.delegate = self + tableView.dataSource = self + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(profileViewTapped)) + profileView.addGestureRecognizer(tapGesture) + } + override func configureUI() { addSubview(profileView) profileView.addSubview(profileImageView) @@ -75,4 +99,67 @@ class MyPageView: BaseView { } } + // MARK: - Bind ViewModel + + func bindViewModel(_ viewModel: MyPageViewModel) { + self.viewModel = viewModel + } + + // MARK: - functions + + @objc func profileViewTapped() { + delegate?.pushViewController(ProfileViewController()) + } + +} + +extension MyPageView: UITableViewDelegate, UITableViewDataSource { + + // 테이블 뷰의 섹션 개수 설정 + func numberOfSections(in tableView: UITableView) -> Int { + guard let viewModel = viewModel else { return 0 } + return viewModel.myPageSectionViewModels.count + } + + // 테이블 뷰의 행 개수 설정 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let viewModel = viewModel else { return 0 } + return viewModel.myPageSectionViewModels[section].model.items.count + } + + // 테이블 뷰 셀 구성 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let viewModel = viewModel, + let cell = tableView.dequeueReusableCell(withIdentifier: "MyPageItemCell") + as? MyPageItemCell else { return UITableViewCell() } + let item = viewModel.myPageSectionViewModels[indexPath.section].model.items[indexPath.row] + cell.titleLabel.text = item.title + cell.descriptionLabel.text = item.description + return cell + } + + // 셀의 높이 설정 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 65 + } + + // 섹션 헤더의 View 설정 + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let headerView = UIView() + headerView.backgroundColor = .systemGroupedBackground + return headerView + } + + // 섹션 헤더의 높이 설정 + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 10 + } + + // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let viewModel = viewModel else { return } + let item = viewModel.myPageSectionViewModels[indexPath.section].model.items[indexPath.row] + delegate?.pushViewController(indexPath) + } + } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 0858dc7..886a2f6 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -7,32 +7,24 @@ import UIKit +protocol MyPageViewDelegate { + func pushViewController(_ indexPath: IndexPath) + func pushViewController(_ viewController: UIViewController) +} + class MyPageViewController: BaseNavigationBarViewController { - // MARK: - properties + // MARK: - Properties - var myPageSections: [MyPageSection] = [ - .init(title: "settings", items: [ - MyPageItem(title: "테마", viewController: ThemeViewController()) - ]), - .init(title: "help", items: [ - MyPageItem(title: "이용 가이드"), - MyPageItem(title: "앱 피드백"), - MyPageItem(title: "개발자 정보", description: "지쿠 😆✌🏻") - ]) - ] + private let viewModel = MyPageViewModel() // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() guard let contentView = contentView as? MyPageView else { return } - - contentView.tableView.delegate = self - contentView.tableView.dataSource = self - - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(profileViewTapped)) - contentView.profileView.addGestureRecognizer(tapGesture) + contentView.delegate = self + contentView.bindViewModel(viewModel) } // MARK: - BaseNavigationBarViewControllerProtocol @@ -41,58 +33,24 @@ class MyPageViewController: BaseNavigationBarViewController { setNavigationBarTitleLabelText("My Page") } - // MARK: - functions - - @objc func profileViewTapped(_ gesture: UITapGestureRecognizer) { - let viewController = ProfileViewController() - navigationController?.pushViewController(viewController, animated: true) - } - } -extension MyPageViewController: UITableViewDelegate, UITableViewDataSource { - - // 테이블 뷰의 섹션 개수 설정 - func numberOfSections(in tableView: UITableView) -> Int { - return myPageSections.count - } - - // 테이블 뷰의 행 개수 설정 - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return myPageSections[section].items.count - } - - // 테이블 뷰 셀 구성 - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyPageItemCell") - as? MyPageItemCell else { return UITableViewCell() } - let item = myPageSections[indexPath.section].items[indexPath.row] - cell.titleLabel.text = item.title - cell.descriptionLabel.text = item.description - return cell - } - - // 셀의 높이 설정 - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 65 - } - - // 섹션 헤더의 View 설정 - func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let headerView = UIView() - headerView.backgroundColor = .systemGroupedBackground - return headerView - } - - // 섹션 헤더의 높이 설정 - func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 10 - } - - // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let item = myPageSections[indexPath.section].items[indexPath.row] - guard let viewController = item.viewController else { return } +extension MyPageViewController: MyPageViewDelegate { + + func pushViewController(_ indexPath: IndexPath) { + if indexPath.section == 0 { + navigationController?.pushViewController(ThemeViewController(), animated: true) + } else { + switch indexPath.row { + case 0: print("이용 가이드 탭 !") + case 1: print("앱 피드백 탭 !") + case 2: print("개발자 정보 탭 !") + default: break; + } + } + } + + func pushViewController(_ viewController: UIViewController) { navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index 9d005e0..bd15e7f 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -5,12 +5,18 @@ // Created by jiyeon on 1/3/24. // +import Combine import UIKit import SnapKit class ThemeView: BaseView { + // MARK: - Properties + + private var viewModel: ThemeViewModel? + private var cancellables = Set() + // MARK: - UI let tableView = UITableView().then { @@ -19,8 +25,24 @@ class ThemeView: BaseView { $0.sectionHeaderTopPadding = 0 } + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperties() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + // MARK: - BaseViewProtocol + private func setupProperties() { + tableView.delegate = self + tableView.dataSource = self + } + override func configureUI() { addSubview(tableView) @@ -29,4 +51,49 @@ class ThemeView: BaseView { } } + // MARK: - Bind ViewModel + + func bineViewModel(_ viewModel: ThemeViewModel) { + self.viewModel = viewModel + viewModel.$selectedIndex + .receive(on: RunLoop.main) + .sink { [weak self] selectedIndex in + guard let window = self?.window else { return } + UserDefaultsManager.theme.value = Theme.allCases[selectedIndex] + window.overrideUserInterfaceStyle = UserDefaultsManager.theme.value.toUserInterfaceStyle() + self?.tableView.reloadData() + }.store(in: &cancellables) + } + +} + +extension ThemeView: UITableViewDelegate, UITableViewDataSource { + + // 테이블 뷰의 행 개수 설정 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return Theme.allCases.count + } + + // 테이블 뷰 셀 구성 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let viewModel = viewModel, + let cell = tableView.dequeueReusableCell(withIdentifier: "ThemeCell") + as? ThemeCell else { return UITableViewCell() } + let theme = Theme.allCases[indexPath.row] + cell.bind(theme) + cell.setupSelectButton(viewModel.selectedIndex == indexPath.row) + return cell + } + + // 셀의 높이 설정 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 55 + } + + // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let viewModel = viewModel else { return } + viewModel.selectedIndex = indexPath.row + } + } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift index 5bacd40..ca443fc 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift @@ -11,7 +11,7 @@ class ThemeViewController: BaseNavigationBarViewController { // MARK: - properties - var selected = UserDefaultsManager.theme.value + private let viewModel = ThemeViewModel() // MARK: - life cycle @@ -20,8 +20,7 @@ class ThemeViewController: BaseNavigationBarViewController { setupNavigationBar() guard let contentView = contentView as? ThemeView else { return } - contentView.tableView.delegate = self - contentView.tableView.dataSource = self + contentView.bineViewModel(viewModel) } // MARK: - BaseNavigationBarViewControllerProtocol @@ -33,36 +32,3 @@ class ThemeViewController: BaseNavigationBarViewController { } } - -extension ThemeViewController: UITableViewDelegate, UITableViewDataSource { - - // 테이블 뷰의 행 개수 설정 - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return Theme.allCases.count - } - - // 테이블 뷰 셀 구성 - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "ThemeCell") - as? ThemeCell else { return UITableViewCell() } - let theme = Theme.allCases[indexPath.row] - cell.bind(theme) - cell.setupSelectButton(theme == selected) - return cell - } - - // 셀의 높이 설정 - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 55 - } - - // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - selected = Theme.allCases[indexPath.row] - guard let window = self.view.window else { return } - window.overrideUserInterfaceStyle = selected.toUserInterfaceStyle() - tableView.reloadData() // 다시 그리기 - UserDefaultsManager.theme.value = selected - } - -} diff --git a/iBox/Sources/ViewModel/MyPageCellViewModel.swift b/iBox/Sources/ViewModel/MyPageCellViewModel.swift new file mode 100644 index 0000000..f5c4c81 --- /dev/null +++ b/iBox/Sources/ViewModel/MyPageCellViewModel.swift @@ -0,0 +1,26 @@ +// +// MyPageCellViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +class MyPageCellViewModel { + + let model: MyPageItem + + init(_ model: MyPageItem) { + self.model = model + } + + var title: String { + model.title + } + + var description: String? { + model.description + } + +} diff --git a/iBox/Sources/ViewModel/MyPageSectionViewModel.swift b/iBox/Sources/ViewModel/MyPageSectionViewModel.swift new file mode 100644 index 0000000..550d976 --- /dev/null +++ b/iBox/Sources/ViewModel/MyPageSectionViewModel.swift @@ -0,0 +1,19 @@ +// +// MyPageSectionViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +class MyPageSectionViewModel { + + + let model: MyPageSection + + init(_ model: MyPageSection) { + self.model = model + } + +} diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift new file mode 100644 index 0000000..75ce095 --- /dev/null +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -0,0 +1,27 @@ +// +// MyPageViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +class MyPageViewModel { + + let myPageSectionViewModels: [MyPageSectionViewModel] = [ + MyPageSectionViewModel(MyPageSection( + title: "settings", + items: [MyPageItem(title: "테마")] + )), + MyPageSectionViewModel(MyPageSection( + title: "help", + items: [ + MyPageItem(title: "이용 가이드"), + MyPageItem(title: "앱 피드백"), + MyPageItem(title: "개발자 정보") + ] + )) + ] + +} diff --git a/iBox/Sources/ViewModel/ThemeViewModel.swift b/iBox/Sources/ViewModel/ThemeViewModel.swift new file mode 100644 index 0000000..a89e6ea --- /dev/null +++ b/iBox/Sources/ViewModel/ThemeViewModel.swift @@ -0,0 +1,23 @@ +// +// ThemeViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Combine +import Foundation + +class ThemeViewModel { + + @Published var selectedIndex: Int + + init() { + switch UserDefaultsManager.theme.value { + case .light: selectedIndex = 0 + case .dark: selectedIndex = 1 + case .system: selectedIndex = 2 + } + } + +} From f19907d77c989a8d05a37a0cb9eeb7be43b12074 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 15:13:02 +0900 Subject: [PATCH 043/370] =?UTF-8?q?chore:=20Model=EC=97=90=EC=84=9C=20UI?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=A7=80=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/MyPageItem.swift | 3 +-- iBox/Sources/Model/Theme.swift | 8 ++++---- iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/iBox/Sources/Model/MyPageItem.swift b/iBox/Sources/Model/MyPageItem.swift index 881cc26..9c695c6 100644 --- a/iBox/Sources/Model/MyPageItem.swift +++ b/iBox/Sources/Model/MyPageItem.swift @@ -5,7 +5,7 @@ // Created by jiyeon on 1/3/24. // -import UIKit +import Foundation struct MyPageSection { var title: String @@ -15,5 +15,4 @@ struct MyPageSection { struct MyPageItem { var title: String var description: String? - var viewController: UIViewController? } diff --git a/iBox/Sources/Model/Theme.swift b/iBox/Sources/Model/Theme.swift index 413e934..b3eb176 100644 --- a/iBox/Sources/Model/Theme.swift +++ b/iBox/Sources/Model/Theme.swift @@ -20,11 +20,11 @@ enum Theme: Codable, CaseIterable { } } - func toImage() -> UIImage? { + func toImageString() -> String { switch self { - case .light: UIImage(systemName: "circle") - case .dark: UIImage(systemName: "circle.fill") - case .system: UIImage(systemName: "circle.righthalf.filled") + case .light: "circle" + case .dark: "circle.fill" + case .system: "circle.righthalf.filled" } } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index 8a2cbdb..8d1997a 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -64,7 +64,7 @@ class ThemeCell: UITableViewCell, BaseViewProtocol { func bind(_ theme: Theme) { titleLabel.text = theme.toString() - themeImageView.image = theme.toImage() + themeImageView.image = UIImage(systemName: theme.toImageString()) } func setupSelectButton(_ selected: Bool) { From 216fa69cfae7d817e717362d98b3eeb090b4554c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 15:26:14 +0900 Subject: [PATCH 044/370] =?UTF-8?q?chore:=20Model=EC=97=90=EC=84=9C=20UI?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=A7=80=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Extension/UIView+Extension.swift | 12 ++++++++++++ iBox/Sources/Model/Theme.swift | 8 -------- iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift | 2 +- iBox/Sources/SceneDelegate.swift | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/iBox/Sources/Extension/UIView+Extension.swift b/iBox/Sources/Extension/UIView+Extension.swift index 5841271..77e401b 100644 --- a/iBox/Sources/Extension/UIView+Extension.swift +++ b/iBox/Sources/Extension/UIView+Extension.swift @@ -19,3 +19,15 @@ extension Then where Self: AnyObject { } extension UIView: Then {} + +extension UIView { + + func toUserInterfaceStyle(_ theme: Theme) -> UIUserInterfaceStyle { + switch theme { + case .light: return UIUserInterfaceStyle.light + case .dark: return UIUserInterfaceStyle.dark + case .system: return UIUserInterfaceStyle.unspecified + } + } + +} diff --git a/iBox/Sources/Model/Theme.swift b/iBox/Sources/Model/Theme.swift index b3eb176..aceb433 100644 --- a/iBox/Sources/Model/Theme.swift +++ b/iBox/Sources/Model/Theme.swift @@ -27,12 +27,4 @@ enum Theme: Codable, CaseIterable { case .system: "circle.righthalf.filled" } } - - func toUserInterfaceStyle() -> UIUserInterfaceStyle { - switch self { - case .light: UIUserInterfaceStyle.light - case .dark: UIUserInterfaceStyle.dark - case .system: UIUserInterfaceStyle.unspecified - } - } } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index bd15e7f..0d42e03 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -60,7 +60,7 @@ class ThemeView: BaseView { .sink { [weak self] selectedIndex in guard let window = self?.window else { return } UserDefaultsManager.theme.value = Theme.allCases[selectedIndex] - window.overrideUserInterfaceStyle = UserDefaultsManager.theme.value.toUserInterfaceStyle() + window.overrideUserInterfaceStyle = self?.toUserInterfaceStyle(UserDefaultsManager.theme.value) ?? .unspecified self?.tableView.reloadData() }.store(in: &cancellables) } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 1b368ff..94e635e 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.windowScene = windowScene // 앱 테마 정보 - window?.overrideUserInterfaceStyle = UserDefaultsManager.theme.value.toUserInterfaceStyle() + window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme.value) ?? .unspecified // 나중에 userDefaults에 저장해두고 꺼내와서 preload하기 let urlsToPreload = [ From e2fd6b4bb9a7fe12503ff05256c0df9a89b6fc2e Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 22 Feb 2024 15:49:32 +0900 Subject: [PATCH 045/370] fix: remove the save button from the share extension --- ShareExtension/ShareViewController.swift | 20 +---------------- .../View/ShareExtensionBackGroundView.swift | 22 ------------------- 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index dbae805..97c7277 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -52,21 +52,7 @@ class CustomShareViewController: UIViewController { self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) }) } - - @IBAction func save() { - if dataURL != "" { - let sharedData = dataURL - print(sharedData) - } else { - print("저장에 실패하였습니다.") - } - - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - } - - + @objc func openURL(_ url: URL) -> Bool { self.hideExtensionWithCompletionHandler(completion: { _ in self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) @@ -110,10 +96,6 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { cancel() } - func didTapSave() { - save() - } - func didTapOpenApp() { let sharedData = dataURL let url = URL(string: "iBox://\(sharedData)")! diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift index a8e1461..261f119 100644 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -11,7 +11,6 @@ import SnapKit protocol ShareExtensionBackGroundViewDelegate: AnyObject { func didTapCancel() - func didTapSave() func didTapOpenApp() } @@ -49,16 +48,6 @@ class ShareExtensionBackGroundView: UIView { return button }() - lazy var saveButton: UIButton = { - let button = UIButton() - button.configuration = .plain() - button.configuration?.attributedTitle = .init( - "Save", - attributes: .init([.font: UIFont.boldSystemFont(ofSize: 14)]) - ) - return button - }() - lazy var openAppButton: UIButton = { let button = UIButton() button.configuration = .plain() @@ -89,7 +78,6 @@ class ShareExtensionBackGroundView: UIView { addSubview(label) addSubview(linkLabel) addSubview(cancelButton) - addSubview(saveButton) addSubview(openAppButton) } @@ -108,11 +96,6 @@ class ShareExtensionBackGroundView: UIView { } cancelButton.snp.makeConstraints { - $0.trailing.equalTo(saveButton.snp.leading).offset(-20) - $0.centerY.equalTo(openAppButton.snp.centerY) - } - - saveButton.snp.makeConstraints { $0.trailing.equalTo(openAppButton.snp.leading).offset(-20) $0.centerY.equalTo(openAppButton.snp.centerY) } @@ -124,7 +107,6 @@ class ShareExtensionBackGroundView: UIView { private func setupButtonAction() { cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) - saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside) openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) } @@ -138,10 +120,6 @@ class ShareExtensionBackGroundView: UIView { delegate?.didTapCancel() } - @objc func saveButtonTapped() { - delegate?.didTapSave() - } - @objc func openAppButtonTapped() { delegate?.didTapOpenApp() } From 81014cecde0d0bf2b8d4ec2619b4492e3a5d98d8 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 16:35:47 +0900 Subject: [PATCH 046/370] =?UTF-8?q?style:=20=EB=8B=A4=ED=81=AC=20=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/BaseBottomSheetViewController.swift | 2 +- .../BaseNavigationBarViewController.swift | 4 +- .../Sources/Extension/UIColor+Extension.swift | 22 +++++- .../BoxList/AddBookmark/AddBookmarkView.swift | 2 +- .../Presenter/BoxList/BoxListView.swift | 4 +- .../Presenter/Favorite/FavoriteView.swift | 2 +- .../Presenter/MainTabBarController.swift | 4 +- iBox/Sources/Presenter/MainView.swift | 2 +- .../Presenter/MyPage/MyPageItemCell.swift | 1 + .../Sources/Presenter/MyPage/MyPageView.swift | 1 + .../Presenter/MyPage/Theme/ThemeCell.swift | 1 + .../Presenter/MyPage/Theme/ThemeView.swift | 1 + .../Presenter/Web/PreloadedWebView.swift | 2 +- .../Web/PreloadedWebViewController.swift | 2 +- iBox/Sources/Presenter/Web/WebView.swift | 2 +- .../Presenter/Web/WebViewController.swift | 2 +- iBox/Sources/Utils/ColorName.swift | 31 ++++++++ iBox/Sources/Utils/ColorPalette.swift | 76 ------------------- 18 files changed, 68 insertions(+), 93 deletions(-) create mode 100644 iBox/Sources/Utils/ColorName.swift delete mode 100644 iBox/Sources/Utils/ColorPalette.swift diff --git a/iBox/Sources/Base/BaseBottomSheetViewController.swift b/iBox/Sources/Base/BaseBottomSheetViewController.swift index 85661cf..ff14c1c 100644 --- a/iBox/Sources/Base/BaseBottomSheetViewController.swift +++ b/iBox/Sources/Base/BaseBottomSheetViewController.swift @@ -104,7 +104,7 @@ class BaseBottomSheetViewController: UIViewController { $0.height.equalTo(bottomSheetHeight) } UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { - self.dimmedView.backgroundColor = ColorPalette.dimmedViewColor + self.dimmedView.backgroundColor = .dimmedViewColor self.view.layoutIfNeeded() }) } diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index d7a31f2..39fd7b2 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -51,7 +51,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav // MARK: - properties - let backgroundColor: UIColor = .systemBackground + let backgroundColor: UIColor = .backgroundColor let tintColor: UIColor = .label let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) @@ -134,7 +134,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav // MARK: - functions private func configureUI() { - view.backgroundColor = .systemBackground + view.backgroundColor = .backgroundColor view.addSubview(statusBar) view.addSubview(navigationBar) navigationBar.addSubview(navigationBar.backButton) diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index 76986cf..88f8f7c 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -18,8 +18,24 @@ extension UIColor { ) } - class var box: UIColor { UIColor(hex: 0xFF7F29) } - class var box2: UIColor { UIColor(hex: 0xFF9548) } - class var box3: UIColor { UIColor(hex: 0xFFDC6E) } + private static func color(light: UIColor, dark: UIColor) -> UIColor { + return UIColor { traitCollection in + switch traitCollection.userInterfaceStyle { + case .dark: + return dark + default: + return light + } + } + } + + static let box = UIColor(hex: 0xFF7F29) + static let box2 = UIColor(hex: 0xFF9548) + static let box3 = UIColor(hex: 0xFFDC6E) + static let tableViewBackgroundColor = color(light: .white, dark: .systemGray5) + static let floderGray = color(light: .systemGray3, dark: .systemGray2) + static let webIconColor = color(light: .black, dark: .systemGray) + static let dimmedViewColor = UIColor.black.withAlphaComponent(0.75) + static let backgroundColor = color(light: .white, dark: UIColor(hex: 0x242424)) } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 1b9fe77..48baf53 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -14,7 +14,7 @@ class AddBookmarkBottomSheetView: BaseView { // MARK: - configure UI override func configureUI() { - backgroundColor = .systemBackground + backgroundColor = .backgroundColor } } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 9a7bddb..8de4ceb 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -24,7 +24,7 @@ class BoxListView: BaseView { override init(frame: CGRect) { super.init(frame: frame) - backgroundColor = .systemBackground + backgroundColor = .backgroundColor viewModel = BoxListViewModel() setupLayout() @@ -115,7 +115,7 @@ extension BoxListView: UITableViewDelegate { make.top.bottom.equalToSuperview() make.leading.trailing.equalToSuperview().inset(15) } - view.backgroundColor = ColorPalette.tableViewBackgroundColor + view.backgroundColor = .clear line.backgroundColor = .tertiaryLabel return view } diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Presenter/Favorite/FavoriteView.swift index 3a8380d..aff2ee5 100644 --- a/iBox/Sources/Presenter/Favorite/FavoriteView.swift +++ b/iBox/Sources/Presenter/Favorite/FavoriteView.swift @@ -16,7 +16,7 @@ class FavoriteView: PreloadedWebView { override init(frame: CGRect) { super.init(frame: frame) - backgroundColor = .systemBackground + backgroundColor = .backgroundColor setupLayout() } diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index 7ffd765..9663e27 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -11,7 +11,7 @@ class MainTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .systemBackground + view.backgroundColor = .backgroundColor setupTabBar() setupTabBarAppearance() @@ -24,7 +24,7 @@ class MainTabBarController: UITabBarController { setupViewController(viewController: MyPageViewController(), image: UIImage(systemName: "person.fill")) ] tabBar.tintColor = .box - tabBar.backgroundColor = .systemBackground + tabBar.backgroundColor = .backgroundColor } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { diff --git a/iBox/Sources/Presenter/MainView.swift b/iBox/Sources/Presenter/MainView.swift index 9d37b15..202072b 100644 --- a/iBox/Sources/Presenter/MainView.swift +++ b/iBox/Sources/Presenter/MainView.swift @@ -34,7 +34,7 @@ class MainView: UIView { // MARK: - configure UI func configureUI() { - backgroundColor = .systemBackground + backgroundColor = .backgroundColor addSubview(label) diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index 1c5cdf6..c3a3c72 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -44,6 +44,7 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { // MARK: - BaseViewProtocol func configureUI() { + backgroundColor = .clear addSubview(titleLabel) addSubview(descriptionLabel) addSubview(chevronButton) diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index ee07b29..34e8ee6 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -41,6 +41,7 @@ class MyPageView: BaseView { $0.register(MyPageItemCell.self, forCellReuseIdentifier: "MyPageItemCell") $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 + $0.backgroundColor = .clear } // MARK: - Initializer diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index 8d1997a..be0dced 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -38,6 +38,7 @@ class ThemeCell: UITableViewCell, BaseViewProtocol { // MARK: - BaseViewProtocol func configureUI() { + backgroundColor = .clear addSubview(themeImageView) addSubview(titleLabel) addSubview(selectButton) diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index 0d42e03..2984710 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -23,6 +23,7 @@ class ThemeView: BaseView { $0.register(ThemeCell.self, forCellReuseIdentifier: "ThemeCell") $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 + $0.backgroundColor = .clear } // MARK: - Initializer diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift index 202a489..9027c9c 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebView.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebView.swift @@ -21,7 +21,7 @@ class PreloadedWebView: BaseView { override init(frame: CGRect) { super.init(frame: frame) - backgroundColor = .systemBackground + backgroundColor = .backgroundColor } required init?(coder: NSCoder) { diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift index c3872a0..d9a83b7 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift @@ -12,7 +12,7 @@ class PreloadedWebViewController: BaseNavigationBarViewController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .systemBackground + view.backgroundColor = .backgroundColor navigationItem.largeTitleDisplayMode = .never guard let contentView = contentView as? WebView else { return } diff --git a/iBox/Sources/Utils/ColorName.swift b/iBox/Sources/Utils/ColorName.swift new file mode 100644 index 0000000..592876a --- /dev/null +++ b/iBox/Sources/Utils/ColorName.swift @@ -0,0 +1,31 @@ +// +// ColorName.swift +// iBox +// +// Created by 이지현 on 1/3/24. +// + +import UIKit + +enum ColorName: String { + case gray + case green + case red + case blue + case yellow + + func toUIColor() -> UIColor { + switch self { + case .gray: + return UIColor.systemGray2 + case .green: + return UIColor.systemGreen + case .red: + return UIColor.systemRed + case .blue: + return UIColor.systemBlue + case .yellow: + return UIColor.systemYellow + } + } +} diff --git a/iBox/Sources/Utils/ColorPalette.swift b/iBox/Sources/Utils/ColorPalette.swift deleted file mode 100644 index 433334c..0000000 --- a/iBox/Sources/Utils/ColorPalette.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// ColorPalette.swift -// iBox -// -// Created by 이지현 on 1/3/24. -// - -import UIKit - -enum ColorName: String { - case gray - case green - case red - case blue - case yellow - - func toUIColor() -> UIColor { - switch self { - case .gray: - return UIColor.systemGray2 - case .green: - return UIColor.systemGreen - case .red: - return UIColor.systemRed - case .blue: - return UIColor.systemBlue - case .yellow: - return UIColor.systemYellow - } - } -} - -struct ColorPalette { - - public static var tableViewBackgroundColor = { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return .systemGray5 - } else { - return .white - } - } - }() - - public static var folderGray = { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return .systemGray2 - } else { - return .systemGray3 - } - } - }() - - public static var webIconColor = { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return .systemGray - } else { - return .black - } - } - }() - - public static var dimmedViewColor = { - return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in - if UITraitCollection.userInterfaceStyle == .dark { - return UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 0.75) - } else { - return UIColor(red: 0, green: 0, blue: 0, alpha: 0.75) - } - } - }() - -} - From 4b0e6a9718d09a1cdfc94502a13d273021e057b0 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 17:04:43 +0900 Subject: [PATCH 047/370] =?UTF-8?q?feat:=20=EC=B2=AB=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/MainTabType.swift | 20 ++++ .../Presenter/MainTabBarController.swift | 1 + .../MyPage/MainTab/MainTabCell.swift | 69 ++++++++++++++ .../MyPage/MainTab/MainTabView.swift | 95 +++++++++++++++++++ .../MainTab/MainTabViewController.swift | 34 +++++++ .../MyPage/MyPageViewController.swift | 8 +- iBox/Sources/Utils/UserDefaultsManager.swift | 5 + iBox/Sources/ViewModel/MainTabViewModel.swift | 15 +++ iBox/Sources/ViewModel/MyPageViewModel.swift | 5 +- 9 files changed, 249 insertions(+), 3 deletions(-) create mode 100644 iBox/Sources/Model/MainTabType.swift create mode 100644 iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift create mode 100644 iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift create mode 100644 iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift create mode 100644 iBox/Sources/ViewModel/MainTabViewModel.swift diff --git a/iBox/Sources/Model/MainTabType.swift b/iBox/Sources/Model/MainTabType.swift new file mode 100644 index 0000000..63e3f0a --- /dev/null +++ b/iBox/Sources/Model/MainTabType.swift @@ -0,0 +1,20 @@ +// +// MainTabType.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +enum MainTabType: CaseIterable { + case boxList + case favorite + + func toString() -> String { + switch self { + case .boxList: "북마크 목록" + case .favorite: "즐겨찾기" + } + } +} diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index 7ffd765..98bf4e7 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -25,6 +25,7 @@ class MainTabBarController: UITabBarController { ] tabBar.tintColor = .box tabBar.backgroundColor = .systemBackground + selectedIndex = UserDefaultsManager.mainTabIndex.value } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift b/iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift new file mode 100644 index 0000000..6ab2bcf --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift @@ -0,0 +1,69 @@ +// +// MainTabCell.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import UIKit + +import SnapKit + +class MainTabCell: UITableViewCell { + + // MARK: - Properties + + static let reuseIdentifier = "MainTabCell" + + // MARK: - UI Components + + let titleLabel = UILabel().then { + $0.font = .systemFont(ofSize: 16) + } + + let selectButton = UIButton().then { + $0.configuration = .plain() + } + + // MARK: - Initializer + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupLayout() { + selectionStyle = .none + + addSubview(titleLabel) + addSubview(selectButton) + + titleLabel.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + selectButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(20) + } + } + + func setupSelectButton(_ selected: Bool) { + if selected { + selectButton.configuration?.image = UIImage(systemName: "circle.inset.filled") + selectButton.tintColor = .box2 + } else { + selectButton.configuration?.image = UIImage(systemName: "circle") + selectButton.tintColor = .gray + } + } + +} diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift b/iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift new file mode 100644 index 0000000..c2a3a35 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift @@ -0,0 +1,95 @@ +// +// MainTabView.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Combine +import UIKit + +class MainTabView: BaseView { + + // MARK: - Properties + + private var viewModel: MainTabViewModel? + private var cancellables = Set() + + // MARK: - UI Components + + let tableView = UITableView().then { + $0.separatorStyle = .none + $0.register(MainTabCell.self, forCellReuseIdentifier: MainTabCell.reuseIdentifier) + } + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + tableView.delegate = self + tableView.dataSource = self + } + + private func setupLayout() { + addSubview(tableView) + + tableView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + // MARK: - Bind ViewModel + + func bindViewModel(_ viewModel: MainTabViewModel) { + self.viewModel = viewModel + viewModel.$selectedIndex + .receive(on: RunLoop.main) + .sink { [weak self] selectedIndex in + UserDefaultsManager.mainTabIndex.value = selectedIndex + self?.tableView.reloadData() + }.store(in: &cancellables) + } + +} + +extension MainTabView: UITableViewDelegate { + + // 셀의 높이 설정 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 55 + } + + // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let viewModel = viewModel else { return } + viewModel.selectedIndex = indexPath.row + } + +} + +extension MainTabView: UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return MainTabType.allCases.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let viewModel = viewModel, + let cell = tableView.dequeueReusableCell(withIdentifier: MainTabCell.reuseIdentifier) as? MainTabCell else { return UITableViewCell() } + cell.titleLabel.text = MainTabType.allCases[indexPath.row].toString() + cell.setupSelectButton(viewModel.selectedIndex == indexPath.row) + return cell + } + +} diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift b/iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift new file mode 100644 index 0000000..75b29c9 --- /dev/null +++ b/iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift @@ -0,0 +1,34 @@ +// +// MainTabViewController.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import UIKit + +class MainTabViewController: BaseNavigationBarViewController { + + // MARK: - Properties + + private let viewModel = MainTabViewModel() + + // MARK: - life cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() // 얘는 왜 여기에 적어줘야 전부 다 적용이 될까 ..? 🧐 + + guard let contentView = contentView as? MainTabView else { return } + contentView.bindViewModel(viewModel) + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("첫 화면 설정하기") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } + +} diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 886a2f6..0a57a44 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -39,13 +39,17 @@ extension MyPageViewController: MyPageViewDelegate { func pushViewController(_ indexPath: IndexPath) { if indexPath.section == 0 { - navigationController?.pushViewController(ThemeViewController(), animated: true) + switch indexPath.row { + case 0: navigationController?.pushViewController(ThemeViewController(), animated: true) + case 1: navigationController?.pushViewController(MainTabViewController(), animated: true) + default: break + } } else { switch indexPath.row { case 0: print("이용 가이드 탭 !") case 1: print("앱 피드백 탭 !") case 2: print("개발자 정보 탭 !") - default: break; + default: break } } } diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index 479734c..f010786 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -10,6 +10,7 @@ import Foundation enum UserDefaultsAccessKey: String { case theme // 다크 모드 case favorite // 즐겨찾기 + case mainTab // 첫 화면 } final class UserDefaultsManager { @@ -21,6 +22,10 @@ final class UserDefaultsManager { key: .favorite, defaultValue: Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/") ) + static let mainTabIndex = UserDefaultValue( + key: .mainTab, + defaultValue: 0 + ) } class UserDefaultValue { diff --git a/iBox/Sources/ViewModel/MainTabViewModel.swift b/iBox/Sources/ViewModel/MainTabViewModel.swift new file mode 100644 index 0000000..76d2e6c --- /dev/null +++ b/iBox/Sources/ViewModel/MainTabViewModel.swift @@ -0,0 +1,15 @@ +// +// MainTabViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Combine +import Foundation + +class MainTabViewModel { + + @Published var selectedIndex: Int = UserDefaultsManager.mainTabIndex.value + +} diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift index 75ce095..198a4cf 100644 --- a/iBox/Sources/ViewModel/MyPageViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -12,7 +12,10 @@ class MyPageViewModel { let myPageSectionViewModels: [MyPageSectionViewModel] = [ MyPageSectionViewModel(MyPageSection( title: "settings", - items: [MyPageItem(title: "테마")] + items: [ + MyPageItem(title: "테마"), + MyPageItem(title: "첫 화면") + ] )), MyPageSectionViewModel(MyPageSection( title: "help", From 68b1e362b4d3a430a4bf7e3198a22ccb33f6e18a Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 17:11:40 +0900 Subject: [PATCH 048/370] =?UTF-8?q?rename:=20MainTabView=20->=20HomeTabSel?= =?UTF-8?q?ectorView=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{MainTabType.swift => HomeTabType.swift} | 4 ++-- .../Presenter/MainTabBarController.swift | 2 +- .../HomeTabSelectorCell.swift} | 4 ++-- .../HomeTabSelectorView.swift} | 22 +++++++++---------- .../HomeTabSelectorViewController.swift} | 8 +++---- .../MyPage/MyPageViewController.swift | 2 +- iBox/Sources/Utils/UserDefaultsManager.swift | 6 ++--- .../ViewModel/HomeTabSelectorViewModel.swift | 15 +++++++++++++ iBox/Sources/ViewModel/MainTabViewModel.swift | 15 ------------- 9 files changed, 39 insertions(+), 39 deletions(-) rename iBox/Sources/Model/{MainTabType.swift => HomeTabType.swift} (82%) rename iBox/Sources/Presenter/MyPage/{MainTab/MainTabCell.swift => HomeTab/HomeTabSelectorCell.swift} (95%) rename iBox/Sources/Presenter/MyPage/{MainTab/MainTabView.swift => HomeTab/HomeTabSelectorView.swift} (75%) rename iBox/Sources/Presenter/MyPage/{MainTab/MainTabViewController.swift => HomeTab/HomeTabSelectorViewController.swift} (71%) create mode 100644 iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift delete mode 100644 iBox/Sources/ViewModel/MainTabViewModel.swift diff --git a/iBox/Sources/Model/MainTabType.swift b/iBox/Sources/Model/HomeTabType.swift similarity index 82% rename from iBox/Sources/Model/MainTabType.swift rename to iBox/Sources/Model/HomeTabType.swift index 63e3f0a..2d7bb4c 100644 --- a/iBox/Sources/Model/MainTabType.swift +++ b/iBox/Sources/Model/HomeTabType.swift @@ -1,5 +1,5 @@ // -// MainTabType.swift +// HomeTabType.swift // iBox // // Created by jiyeon on 2/22/24. @@ -7,7 +7,7 @@ import Foundation -enum MainTabType: CaseIterable { +enum HomeTabType: CaseIterable { case boxList case favorite diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index 98bf4e7..57541e5 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -25,7 +25,7 @@ class MainTabBarController: UITabBarController { ] tabBar.tintColor = .box tabBar.backgroundColor = .systemBackground - selectedIndex = UserDefaultsManager.mainTabIndex.value + selectedIndex = UserDefaultsManager.homeTabIndex.value } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift similarity index 95% rename from iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift rename to iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift index 6ab2bcf..224e640 100644 --- a/iBox/Sources/Presenter/MyPage/MainTab/MainTabCell.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift @@ -1,5 +1,5 @@ // -// MainTabCell.swift +// HomeTabSelectorCell.swift // iBox // // Created by jiyeon on 2/22/24. @@ -9,7 +9,7 @@ import UIKit import SnapKit -class MainTabCell: UITableViewCell { +class HomeTabSelectorCell: UITableViewCell { // MARK: - Properties diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift similarity index 75% rename from iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift rename to iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift index c2a3a35..454ae24 100644 --- a/iBox/Sources/Presenter/MyPage/MainTab/MainTabView.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift @@ -1,5 +1,5 @@ // -// MainTabView.swift +// HomeTabSelectorView.swift // iBox // // Created by jiyeon on 2/22/24. @@ -8,18 +8,18 @@ import Combine import UIKit -class MainTabView: BaseView { +class HomeTabSelectorView: BaseView { // MARK: - Properties - private var viewModel: MainTabViewModel? + private var viewModel: HomeTabSelectorViewModel? private var cancellables = Set() // MARK: - UI Components let tableView = UITableView().then { $0.separatorStyle = .none - $0.register(MainTabCell.self, forCellReuseIdentifier: MainTabCell.reuseIdentifier) + $0.register(HomeTabSelectorCell.self, forCellReuseIdentifier: HomeTabSelectorCell.reuseIdentifier) } // MARK: - Initializer @@ -51,19 +51,19 @@ class MainTabView: BaseView { // MARK: - Bind ViewModel - func bindViewModel(_ viewModel: MainTabViewModel) { + func bindViewModel(_ viewModel: HomeTabSelectorViewModel) { self.viewModel = viewModel viewModel.$selectedIndex .receive(on: RunLoop.main) .sink { [weak self] selectedIndex in - UserDefaultsManager.mainTabIndex.value = selectedIndex + UserDefaultsManager.homeTabIndex.value = selectedIndex self?.tableView.reloadData() }.store(in: &cancellables) } } -extension MainTabView: UITableViewDelegate { +extension HomeTabSelectorView: UITableViewDelegate { // 셀의 높이 설정 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { @@ -78,16 +78,16 @@ extension MainTabView: UITableViewDelegate { } -extension MainTabView: UITableViewDataSource { +extension HomeTabSelectorView: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return MainTabType.allCases.count + return HomeTabType.allCases.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel = viewModel, - let cell = tableView.dequeueReusableCell(withIdentifier: MainTabCell.reuseIdentifier) as? MainTabCell else { return UITableViewCell() } - cell.titleLabel.text = MainTabType.allCases[indexPath.row].toString() + let cell = tableView.dequeueReusableCell(withIdentifier: HomeTabSelectorCell.reuseIdentifier) as? HomeTabSelectorCell else { return UITableViewCell() } + cell.titleLabel.text = HomeTabType.allCases[indexPath.row].toString() cell.setupSelectButton(viewModel.selectedIndex == indexPath.row) return cell } diff --git a/iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift similarity index 71% rename from iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift rename to iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift index 75b29c9..e67c207 100644 --- a/iBox/Sources/Presenter/MyPage/MainTab/MainTabViewController.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift @@ -1,5 +1,5 @@ // -// MainTabViewController.swift +// HomeTabSelectorViewwController.swift // iBox // // Created by jiyeon on 2/22/24. @@ -7,11 +7,11 @@ import UIKit -class MainTabViewController: BaseNavigationBarViewController { +class HomeTabSelectorViewController: BaseNavigationBarViewController { // MARK: - Properties - private let viewModel = MainTabViewModel() + private let viewModel = HomeTabSelectorViewModel() // MARK: - life cycle @@ -19,7 +19,7 @@ class MainTabViewController: BaseNavigationBarViewController { super.viewDidLoad() setupNavigationBar() // 얘는 왜 여기에 적어줘야 전부 다 적용이 될까 ..? 🧐 - guard let contentView = contentView as? MainTabView else { return } + guard let contentView = contentView as? HomeTabSelectorView else { return } contentView.bindViewModel(viewModel) } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 0a57a44..ee79a6c 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -41,7 +41,7 @@ extension MyPageViewController: MyPageViewDelegate { if indexPath.section == 0 { switch indexPath.row { case 0: navigationController?.pushViewController(ThemeViewController(), animated: true) - case 1: navigationController?.pushViewController(MainTabViewController(), animated: true) + case 1: navigationController?.pushViewController(HomeTabSelectorViewController(), animated: true) default: break } } else { diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index f010786..8baef12 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -10,7 +10,7 @@ import Foundation enum UserDefaultsAccessKey: String { case theme // 다크 모드 case favorite // 즐겨찾기 - case mainTab // 첫 화면 + case homeTab // 첫 화면 } final class UserDefaultsManager { @@ -22,8 +22,8 @@ final class UserDefaultsManager { key: .favorite, defaultValue: Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/") ) - static let mainTabIndex = UserDefaultValue( - key: .mainTab, + static let homeTabIndex = UserDefaultValue( + key: .homeTab, defaultValue: 0 ) } diff --git a/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift b/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift new file mode 100644 index 0000000..1e6b63f --- /dev/null +++ b/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift @@ -0,0 +1,15 @@ +// +// HomeTabSelectorViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Combine +import Foundation + +class HomeTabSelectorViewModel { + + @Published var selectedIndex: Int = UserDefaultsManager.homeTabIndex.value + +} diff --git a/iBox/Sources/ViewModel/MainTabViewModel.swift b/iBox/Sources/ViewModel/MainTabViewModel.swift deleted file mode 100644 index 76d2e6c..0000000 --- a/iBox/Sources/ViewModel/MainTabViewModel.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// MainTabViewModel.swift -// iBox -// -// Created by jiyeon on 2/22/24. -// - -import Combine -import Foundation - -class MainTabViewModel { - - @Published var selectedIndex: Int = UserDefaultsManager.mainTabIndex.value - -} From d0be16d927f46d3404e881ffc322e1df95672bb8 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 17:23:17 +0900 Subject: [PATCH 049/370] =?UTF-8?q?feat:=20ProfileView=20description=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Presenter/MyPage/MyPageView.swift | 10 +++ .../MyPage/MyPageViewController.swift | 6 ++ iBox/Sources/ViewModel/MyPageViewModel.swift | 64 ++++++++++++++----- 3 files changed, 64 insertions(+), 16 deletions(-) diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index ee07b29..a066633 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -5,6 +5,7 @@ // Created by jiyeon on 1/3/24. // +import Combine import UIKit class MyPageView: BaseView { @@ -13,6 +14,7 @@ class MyPageView: BaseView { var delegate: MyPageViewDelegate? private var viewModel: MyPageViewModel? + private var cancellables = Set() // MARK: - UI @@ -103,6 +105,14 @@ class MyPageView: BaseView { func bindViewModel(_ viewModel: MyPageViewModel) { self.viewModel = viewModel + viewModel.transform(input: viewModel.input.eraseToAnyPublisher()) + .receive(on: RunLoop.main) + .sink { [weak self] event in + switch event { + case .updateMyPageSectionViewModels: + self?.tableView.reloadData() + } + }.store(in: &cancellables) } // MARK: - functions diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index ee79a6c..69349b1 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -25,6 +25,12 @@ class MyPageViewController: BaseNavigationBarViewController { guard let contentView = contentView as? MyPageView else { return } contentView.delegate = self contentView.bindViewModel(viewModel) + viewModel.input.send(.viewWillAppear) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + viewModel.input.send(.viewWillAppear) } // MARK: - BaseNavigationBarViewControllerProtocol diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift index 198a4cf..cc6e8ac 100644 --- a/iBox/Sources/ViewModel/MyPageViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -5,26 +5,58 @@ // Created by jiyeon on 2/22/24. // +import Combine import Foundation class MyPageViewModel { - let myPageSectionViewModels: [MyPageSectionViewModel] = [ - MyPageSectionViewModel(MyPageSection( - title: "settings", - items: [ - MyPageItem(title: "테마"), - MyPageItem(title: "첫 화면") - ] - )), - MyPageSectionViewModel(MyPageSection( - title: "help", - items: [ - MyPageItem(title: "이용 가이드"), - MyPageItem(title: "앱 피드백"), - MyPageItem(title: "개발자 정보") - ] + enum Input { + case viewWillAppear + } + + enum Output { + case updateMyPageSectionViewModels + } + + // MARK: - Properties + + let input = PassthroughSubject() + private let output = PassthroughSubject() + private var cancellables = Set() + var myPageSectionViewModels = [MyPageSectionViewModel]() + + func transform(input: AnyPublisher) -> AnyPublisher { + input.sink { [weak self] event in + switch event { + case .viewWillAppear: + self?.myPageSectionViewModels.removeAll() + self?.updateMyPageSectionViewModels() + self?.output.send(.updateMyPageSectionViewModels) + } + }.store(in: &cancellables) + return output.eraseToAnyPublisher() + } + + private func updateMyPageSectionViewModels() { + myPageSectionViewModels.append(MyPageSectionViewModel( + MyPageSection( + title: "settings", + items: [ + MyPageItem(title: "테마", description: UserDefaultsManager.theme.value.toString()), + MyPageItem(title: "홈화면", description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex.value].toString()) + ] + ) )) - ] + myPageSectionViewModels.append(MyPageSectionViewModel( + MyPageSection( + title: "help", + items: [ + MyPageItem(title: "이용 가이드"), + MyPageItem(title: "앱 피드백"), + MyPageItem(title: "개발자 정보") + ] + )) + ) + } } From 2a1e8ab60efd32f70c4c05a0c2aa310dec98c21c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 22 Feb 2024 17:26:36 +0900 Subject: [PATCH 050/370] =?UTF-8?q?style:=20HomeTabViewController=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=ED=8B=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/HomeTab/HomeTabSelectorViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift index e67c207..d6c7bab 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift @@ -26,7 +26,7 @@ class HomeTabSelectorViewController: BaseNavigationBarViewController Date: Sat, 24 Feb 2024 04:30:53 +0900 Subject: [PATCH 051/370] =?UTF-8?q?style:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=84=B9=EC=85=98=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Presenter/MyPage/MyPageView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index 34e8ee6..477c8f3 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -147,7 +147,7 @@ extension MyPageView: UITableViewDelegate, UITableViewDataSource { // 섹션 헤더의 View 설정 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView() - headerView.backgroundColor = .systemGroupedBackground + headerView.backgroundColor = .backgroundColor return headerView } From a2e4cf938ede8d6f4f6c0e86d8c4e35d8ad3f5f5 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 27 Feb 2024 12:01:34 +0900 Subject: [PATCH 052/370] =?UTF-8?q?feat:=20CoreData=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iBox.xcdatamodel/contents | 17 +- iBox/Sources/AppDelegate.swift | 45 --- iBox/Sources/Model/Bookmark.swift | 3 +- iBox/Sources/Model/Folder.swift | 3 +- .../Presenter/BoxList/BoxListCell.swift | 1 + .../Presenter/BoxList/BoxListView.swift | 2 +- .../BoxList/BoxListViewController.swift | 5 +- .../Presenter/Web/PreloadedWebView.swift | 4 +- .../Web/PreloadedWebViewController.swift | 18 +- iBox/Sources/SceneDelegate.swift | 26 +- iBox/Sources/Utils/CoreDataManager.swift | 342 ++++++++++++++++++ iBox/Sources/Utils/UserDefaultsManager.swift | 13 +- .../ViewModel/BoxListCellViewModel.swift | 14 +- .../ViewModel/BoxListSectionViewModel.swift | 4 +- iBox/Sources/ViewModel/BoxListViewModel.swift | 13 +- 15 files changed, 425 insertions(+), 85 deletions(-) create mode 100644 iBox/Sources/Utils/CoreDataManager.swift diff --git a/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents b/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents index 50d2514..c40ccfd 100644 --- a/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents +++ b/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents @@ -1,4 +1,17 @@ - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 1d9e30e..b299a39 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -32,50 +32,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } - // MARK: - Core Data stack - - lazy var persistentContainer: NSPersistentContainer = { - /* - The persistent container for the application. This implementation - creates and returns a container, having loaded the store for the - application to it. This property is optional since there are legitimate - error conditions that could cause the creation of the store to fail. - */ - let container = NSPersistentContainer(name: "iBox") - container.loadPersistentStores(completionHandler: { (storeDescription, error) in - if let error = error as NSError? { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - - /* - Typical reasons for an error here include: - * The parent directory does not exist, cannot be created, or disallows writing. - * The persistent store is not accessible, due to permissions or data protection when the device is locked. - * The device is out of space. - * The store could not be migrated to the current model version. - Check the error message to determine what the actual problem was. - */ - fatalError("Unresolved error \(error), \(error.userInfo)") - } - }) - return container - }() - - // MARK: - Core Data Saving support - - func saveContext () { - let context = persistentContainer.viewContext - if context.hasChanges { - do { - try context.save() - } catch { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - let nserror = error as NSError - fatalError("Unresolved error \(nserror), \(nserror.userInfo)") - } - } - } - } diff --git a/iBox/Sources/Model/Bookmark.swift b/iBox/Sources/Model/Bookmark.swift index 2091151..ab1a85f 100644 --- a/iBox/Sources/Model/Bookmark.swift +++ b/iBox/Sources/Model/Bookmark.swift @@ -8,6 +8,7 @@ import Foundation struct Bookmark: Codable { + let id: UUID let name: String - let url: String + let url: URL } diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 12f21e6..261755f 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -8,9 +8,10 @@ import Foundation struct Folder { + var id: UUID let name: String let color: ColorName let bookmarks: [Bookmark] - var isOpened: Bool = true + var isOpened: Bool = false } diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index d457aac..158decd 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -29,6 +29,7 @@ class BoxListCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) backgroundColor = .systemGroupedBackground + selectionStyle = .none setupLayout() } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 9a7bddb..93a2caf 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -11,7 +11,7 @@ import UIKit import SnapKit protocol BoxListViewDelegate: AnyObject { - func didSelectWeb(at url: String, withName name: String) + func didSelectWeb(at url: URL, withName name: String) } class BoxListView: BaseView { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 5607379..b1cb49d 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -31,10 +31,9 @@ class BoxListViewController: BaseNavigationBarViewController { } extension BoxListViewController: BoxListViewDelegate { - func didSelectWeb(at url: String, withName name: String) { - let viewController = PreloadedWebViewController() + func didSelectWeb(at url: URL, withName name: String) { + let viewController = PreloadedWebViewController(selectedWebsite: url) viewController.title = name - viewController.selectedWebsite = url navigationController?.pushViewController(viewController, animated: true) } } diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift index 202a489..9856e7b 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebView.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebView.swift @@ -11,7 +11,7 @@ import WebKit import SnapKit class PreloadedWebView: BaseView { - var selectedWebsite: String? { + var selectedWebsite: URL? { didSet { getWebView() } @@ -30,7 +30,7 @@ class PreloadedWebView: BaseView { private func getWebView() { guard let selectedWebsite else { return } - webView = WebViewPreloader.shared.getWebView(for: URL(string: selectedWebsite)!) + webView = WebViewPreloader.shared.getWebView(for: selectedWebsite) guard let webView else { return } addSubview(webView) webView.snp.makeConstraints { make in diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift index c3872a0..e248059 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift @@ -8,8 +8,17 @@ import UIKit class PreloadedWebViewController: BaseNavigationBarViewController { - var selectedWebsite: String? - + var selectedWebsite: URL + + init(selectedWebsite: URL) { + self.selectedWebsite = selectedWebsite + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground @@ -21,9 +30,8 @@ class PreloadedWebViewController: BaseNavigationBarViewController) { if let urlContext = URLContexts.first { let url = urlContext.url @@ -87,7 +108,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // to restore the scene back to its current state. // Save changes in the application's managed object context when the application transitions to the background. - (UIApplication.shared.delegate as? AppDelegate)?.saveContext() } diff --git a/iBox/Sources/Utils/CoreDataManager.swift b/iBox/Sources/Utils/CoreDataManager.swift new file mode 100644 index 0000000..3ee52f4 --- /dev/null +++ b/iBox/Sources/Utils/CoreDataManager.swift @@ -0,0 +1,342 @@ +// +// CoreDataManager.swift +// iBox +// +// Created by 이지현 on 2/9/24. +// + +import CoreData +import Foundation + +class CoreDataManager { + static let shared = CoreDataManager() + + lazy var persistentContainer = { + let container = NSPersistentContainer(name: "iBox") + + container.loadPersistentStores { _, error in + if let error { + fatalError(error.localizedDescription) + } + } + + return container + }() + + private init() {} + + private var lastFolderOrder: Int64 = 0 + private var lastBookmarkOrder = [UUID: Int64]() + + private func save() { + guard persistentContainer.viewContext.hasChanges else { return } + do { + try persistentContainer.viewContext.save() + } catch { + print("Fail to save the context:", error.localizedDescription) + } + } +} + +// 폴더 관련 +extension CoreDataManager { + func addInitialFolders(_ folders: [Folder]) { + let context = persistentContainer.viewContext + + for folder in folders { + let newFolder = FolderEntity(context: context) + newFolder.id = folder.id + newFolder.name = folder.name + newFolder.color = folder.color.rawValue + newFolder.order = lastFolderOrder + lastFolderOrder += 1 + let bookmarks = NSMutableOrderedSet() + lastBookmarkOrder[folder.id] = 0 + for bookmark in folder.bookmarks { + let newBookmark = BookmarkEntity(context: context) + newBookmark.id = bookmark.id + newBookmark.name = bookmark.name + newBookmark.url = bookmark.url + newBookmark.order = lastBookmarkOrder[folder.id] ?? 0 + lastBookmarkOrder[folder.id] = (lastBookmarkOrder[folder.id] ?? 0) + 1 + bookmarks.add(newBookmark) + } + newFolder.bookmarks = bookmarks + } + save() + } + + func addFolder(_ folder: Folder) { + let context = persistentContainer.viewContext + let newFolder = FolderEntity(context: context) + newFolder.id = folder.id + newFolder.name = folder.name + newFolder.color = folder.color.rawValue + newFolder.order = lastFolderOrder + lastFolderOrder += 1 + let bookmarks = NSMutableOrderedSet() + lastBookmarkOrder[folder.id] = 0 + for bookmark in folder.bookmarks { + let newBookmark = BookmarkEntity(context: context) + newBookmark.id = bookmark.id + newBookmark.name = bookmark.name + newBookmark.url = bookmark.url + newBookmark.order = lastBookmarkOrder[folder.id] ?? 0 + lastBookmarkOrder[folder.id] = (lastBookmarkOrder[folder.id] ?? 0) + 1 + bookmarks.add(newBookmark) + } + newFolder.bookmarks = bookmarks + save() + } + + private func getFolderEntity(id: UUID) -> FolderEntity? { + let context = persistentContainer.viewContext + + let fetchRequest = FolderEntity.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "id == %@", id as NSUUID) + + do { + let results = try context.fetch(fetchRequest) + return results.first + } catch { + print(error.localizedDescription) + return nil + } + } + + private func getAllFolderEntity() -> [FolderEntity] { + let context = persistentContainer.viewContext + + let fetchRequest = FolderEntity.fetchRequest() + let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) + fetchRequest.sortDescriptors = [sortDescriptor] + + do { + return try context.fetch(fetchRequest) + } catch { + print(error.localizedDescription) + return [] + } + } + + func getFolders() -> [Folder] { + let folderEntities = getAllFolderEntity() + var folders = [Folder]() + + lastFolderOrder = (folderEntities.last?.order ?? -1) + 1 + for folderEntity in folderEntities { + let bookmarkEntities = (folderEntity.bookmarks?.array as? [BookmarkEntity] ?? []).sorted { + $0.order < $1.order + } + guard let folderId = folderEntity.id else { return [] } + lastBookmarkOrder[folderId] = (bookmarkEntities.last?.order ?? -1) + 1 + let bookmarks = bookmarkEntities.map{ Bookmark(id: $0.id ?? UUID(), name: $0.name ?? "" , url: $0.url ?? URL(string: "")!) } + folders.append(Folder(id: folderEntity.id ?? UUID(), name: folderEntity.name ?? "", color: ColorName(rawValue: folderEntity.color ?? "gray") ?? .gray , bookmarks: bookmarks)) + } + + return folders + } + + func deleteFolder(id: UUID) { + let context = persistentContainer.viewContext + + guard let folder = getFolderEntity(id: id) else { return } + let deletedOrder = folder.order + context.delete(folder) + + let subsequentFolderEntities = getAllFolderEntity().filter{ $0.order > deletedOrder } + for folderEntity in subsequentFolderEntities { + folderEntity.order -= 1 + } + lastFolderOrder -= 1 + save() + } + + func deleteAllFolders() { + let context = persistentContainer.viewContext + + let folders = getAllFolderEntity() + for folder in folders { + context.delete(folder) + } + save() + } + + func updateFolder(id: UUID, name: String, color: String) { + guard let folder = getFolderEntity(id: id) else { return } + folder.name = name + folder.color = color + save() + } + + func moveFolder(from source: Int, to destination: Int) { + let folderEntities = getAllFolderEntity() + + if source < destination { + var startIndex = source + 1 + let endIndex = destination + var startOrder = folderEntities[source].order + while startIndex <= endIndex { + folderEntities[startIndex].order = startOrder + startOrder += 1 + startIndex += 1 + } + folderEntities[source].order = startOrder + } else if destination < source { + var startIndex = destination + let endIndex = source - 1 + var startOrder = folderEntities[destination].order + 1 + let newOrder = folderEntities[destination].order + while startIndex <= endIndex { + folderEntities[startIndex].order = startOrder + startOrder += 1 + startIndex += 1 + } + folderEntities[source].order = newOrder + } + save() + } + +} + +// 북마크 관련 +extension CoreDataManager { + + func addBookmark(_ bookmark: Bookmark, folderId: UUID) { + let context = persistentContainer.viewContext + + guard let folder = getFolderEntity(id: folderId) else { return } + let newBookmark = BookmarkEntity(context: context) + newBookmark.id = bookmark.id + newBookmark.name = bookmark.name + newBookmark.url = bookmark.url + guard let folderId = folder.id else { return } + newBookmark.order = lastBookmarkOrder[folderId] ?? 0 + lastBookmarkOrder[folderId] = (lastBookmarkOrder[folderId] ?? 0) + 1 + newBookmark.folder = folder + save() + } + + func updateBookmark(id: UUID, name: String, url: URL) { + guard let bookmark = getBookmarkEntity(id: id) else { return } + bookmark.name = name + bookmark.url = url + save() + } + + private func getBookmarkEntity(id: UUID) -> BookmarkEntity? { + let context = persistentContainer.viewContext + + let fetchRequest = BookmarkEntity.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "id == %@", id as NSUUID) + + do { + let results = try context.fetch(fetchRequest) + return results.first + } catch { + print(error.localizedDescription) + return nil + } + } + + func deleteBookmark(id: UUID) { + let context = persistentContainer.viewContext + + guard let bookmark = getBookmarkEntity(id: id) else { return } + let deletedOrder = bookmark.order + context.delete(bookmark) + + guard let folderId = bookmark.folder?.id else { return } + let subsequentBookmarkEntities = getAllBookmarkEntity(in: folderId).filter{ $0.order > deletedOrder } + for bookmarkEntity in subsequentBookmarkEntities { + bookmarkEntity.order -= 1 + } + lastBookmarkOrder[folderId] = (lastBookmarkOrder[folderId] ?? 1) - 1 + save() + } + + private func getAllBookmarkEntity(in folderId: UUID) -> [BookmarkEntity] { + let context = persistentContainer.viewContext + + guard let folder = getFolderEntity(id: folderId) else { return [] } + let fetchRequest = BookmarkEntity.fetchRequest() + let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) + fetchRequest.predicate = NSPredicate(format: "folder == %@", folder) + fetchRequest.sortDescriptors = [sortDescriptor] + + do { + return try context.fetch(fetchRequest) + } catch { + print(error.localizedDescription) + return [] + } + } + + func deleteAllBookmarks(folderId: UUID) { + let context = persistentContainer.viewContext + + let bookmarks = getAllBookmarkEntity(in: folderId) + for bookmark in bookmarks { + context.delete(bookmark) + } + save() + } + + func moveBookmark(from source: IndexPath, to destination: IndexPath, srcId: UUID) { + if source.section == destination.section { + guard let bookmarkEntity = getBookmarkEntity(id: srcId) else { return } + guard let folderId = bookmarkEntity.folder?.id else { return } + let bookmarkEntities = getAllBookmarkEntity(in: folderId) + let source = source.row + let destination = destination.row + if source < destination { + var startIndex = source + 1 + let endIndex = destination + var startOrder = bookmarkEntity.order + while startIndex <= endIndex { + bookmarkEntities[startIndex].order = startOrder + startOrder += 1 + startIndex += 1 + } + bookmarkEntities[source].order = startOrder + } else if destination < source { + var startIndex = destination + let endIndex = source - 1 + var startOrder = bookmarkEntities[destination].order + 1 + let newOrder = bookmarkEntities[destination].order + while startIndex <= endIndex { + bookmarkEntities[startIndex].order = startOrder + startOrder += 1 + startIndex += 1 + } + bookmarkEntities[source].order = newOrder + } + } else { + guard let srcBookmarkEntity = getBookmarkEntity(id: srcId) else { return } + guard let srcFolderId = srcBookmarkEntity.folder?.id else { return } + let deletedOrder = srcBookmarkEntity.order + let srcBookmarkEntities = getAllBookmarkEntity(in: srcFolderId).filter{ $0.order > deletedOrder } + for bookmarkEntity in srcBookmarkEntities { + bookmarkEntity.order -= 1 + } + lastBookmarkOrder[srcFolderId] = (lastBookmarkOrder[srcFolderId] ?? 1) - 1 + + let folderEntities = getAllFolderEntity() + let destFolder = folderEntities[destination.section] + guard let destFolderId = destFolder.id else { return } + let destinationOrder = Int64(destination.row) + let destBookmarkEntities = getAllBookmarkEntity(in: destFolderId).filter{ $0.order >= deletedOrder } + for bookmarkEntity in destBookmarkEntities { + bookmarkEntity.order += 1 + } + lastBookmarkOrder[destFolderId] = (lastBookmarkOrder[destFolderId] ?? 0) + 1 + + + srcBookmarkEntity.folder = destFolder + srcBookmarkEntity.order = destinationOrder + } + save() + } + +} + diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index 8baef12..a4450bb 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -8,9 +8,10 @@ import Foundation enum UserDefaultsAccessKey: String { - case theme // 다크 모드 - case favorite // 즐겨찾기 - case homeTab // 첫 화면 + case theme // 다크 모드 + case favorite // 즐겨찾기 + case homeTab // 첫 화면 + case isDefaultDataInserted // 기본 데이터 삽입 여부 } final class UserDefaultsManager { @@ -20,12 +21,16 @@ final class UserDefaultsManager { ) static let favorite = UserDefaultValue( key: .favorite, - defaultValue: Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/") + defaultValue: Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!) ) static let homeTabIndex = UserDefaultValue( key: .homeTab, defaultValue: 0 ) + static let isDefaultDataInserted = UserDefaultValue( + key: .isDefaultDataInserted, + defaultValue: false + ) } class UserDefaultValue { diff --git a/iBox/Sources/ViewModel/BoxListCellViewModel.swift b/iBox/Sources/ViewModel/BoxListCellViewModel.swift index 68d89aa..b8a6cdd 100644 --- a/iBox/Sources/ViewModel/BoxListCellViewModel.swift +++ b/iBox/Sources/ViewModel/BoxListCellViewModel.swift @@ -12,16 +12,16 @@ class BoxListCellViewModel: Identifiable { init(bookmark: Bookmark) { self.bookmark = bookmark + self.name = bookmark.name + self.url = bookmark.url } - let id = UUID() - - var name: String { - bookmark.name + var id: UUID { + bookmark.id } + + var name: String - var url: String { - bookmark.url - } + var url: URL } diff --git a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift index 70a928c..e106344 100644 --- a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift +++ b/iBox/Sources/ViewModel/BoxListSectionViewModel.swift @@ -20,7 +20,9 @@ class BoxListSectionViewModel: Identifiable { return isOpened ? originalBoxListCellViewModels : [] } - let id = UUID() + var id: UUID { + folder.id + } var name: String { folder.name diff --git a/iBox/Sources/ViewModel/BoxListViewModel.swift b/iBox/Sources/ViewModel/BoxListViewModel.swift index cb73926..ec1ba32 100644 --- a/iBox/Sources/ViewModel/BoxListViewModel.swift +++ b/iBox/Sources/ViewModel/BoxListViewModel.swift @@ -10,16 +10,7 @@ import Foundation class BoxListViewModel { - var boxList = [ - BoxListSectionViewModel(folder: Folder(name: "기본 폴더", color: .gray, bookmarks: [ - Bookmark(name: "42 Intra", url: "https://profile.intra.42.fr/"), - Bookmark(name: "42Where", url: "https://www.where42.kr/"), - Bookmark(name: "42Stat", url: "https://stat.42seoul.kr/"), - Bookmark(name: "집현전", url: "https://42library.kr/") - ])), - BoxListSectionViewModel(folder: Folder(name: "새 폴더", color: .green, bookmarks: [Bookmark(name: "Cabi", url: "https://cabi.42seoul.io/")], isOpened: false)), - BoxListSectionViewModel(folder: Folder(name: "새 폴더(2)", color: .yellow, bookmarks: [Bookmark(name: "24HANE", url: "https://24hoursarenotenough.42seoul.kr/")], isOpened: false)) - ] + var boxList = [BoxListSectionViewModel]() enum Input { case viewDidLoad @@ -39,6 +30,8 @@ class BoxListViewModel { guard let self else { return } switch event { case .viewDidLoad: + let folders = CoreDataManager.shared.getFolders() + self.boxList = folders.map{ BoxListSectionViewModel(folder: $0) } output.send(.sendBoxList(boxList: boxList)) case let .folderTapped(section): boxList[section].isOpened.toggle() From 150ff0312a8204656ccb3333ed3398de7c976947 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 29 Feb 2024 02:24:48 +0900 Subject: [PATCH 053/370] feat: versiong --- iBox/Resources/Version/VersionInfo.json | 5 +++++ iBox/Sources/Model/VersionInfo.swift | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 iBox/Resources/Version/VersionInfo.json create mode 100644 iBox/Sources/Model/VersionInfo.swift diff --git a/iBox/Resources/Version/VersionInfo.json b/iBox/Resources/Version/VersionInfo.json new file mode 100644 index 0000000..db2ba7c --- /dev/null +++ b/iBox/Resources/Version/VersionInfo.json @@ -0,0 +1,5 @@ +{ + "latestVersion": "1.2.0", + "minRequiredVersion": "1.1.0", + "updateUrl": "https://appstore.com/iBox" +} diff --git a/iBox/Sources/Model/VersionInfo.swift b/iBox/Sources/Model/VersionInfo.swift new file mode 100644 index 0000000..c6d11cc --- /dev/null +++ b/iBox/Sources/Model/VersionInfo.swift @@ -0,0 +1,12 @@ +// +// Versioning.swift +// iBox +// +// Created by Chan on 2/29/24. +// + +struct VersionInfo: Codable { + let latestVersion: String + let minRequiredVersion: String + let updateUrl: String +} From bdf83730f011212f364a2dd0a57c0bc62190faf2 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 15:37:27 +0900 Subject: [PATCH 054/370] =?UTF-8?q?feat:=20tableViewBackgroundColor=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Extension/UIColor+Extension.swift | 2 +- iBox/Sources/Presenter/BoxList/BoxListCell.swift | 2 +- iBox/Sources/Presenter/BoxList/BoxListView.swift | 2 +- iBox/Sources/Presenter/BoxList/FolderButton.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index 88f8f7c..e7dce41 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -32,7 +32,7 @@ extension UIColor { static let box = UIColor(hex: 0xFF7F29) static let box2 = UIColor(hex: 0xFF9548) static let box3 = UIColor(hex: 0xFFDC6E) - static let tableViewBackgroundColor = color(light: .white, dark: .systemGray5) + static let tableViewBackgroundColor = color(light: .systemGroupedBackground, dark: .systemGray5) static let floderGray = color(light: .systemGray3, dark: .systemGray2) static let webIconColor = color(light: .black, dark: .systemGray) static let dimmedViewColor = UIColor.black.withAlphaComponent(0.75) diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index d457aac..69b346f 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -28,7 +28,7 @@ class BoxListCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - backgroundColor = .systemGroupedBackground + backgroundColor = .tableViewBackgroundColor setupLayout() } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 8de4ceb..f2707f6 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -41,7 +41,7 @@ class BoxListView: BaseView { let view = UIView() view.clipsToBounds = true view.layer.cornerRadius = 20 - view.backgroundColor = .systemGroupedBackground + view.backgroundColor = .tableViewBackgroundColor view.addSubview(tableView) tableView.snp.makeConstraints { make in diff --git a/iBox/Sources/Presenter/BoxList/FolderButton.swift b/iBox/Sources/Presenter/BoxList/FolderButton.swift index e0d3f0f..1f51c70 100644 --- a/iBox/Sources/Presenter/BoxList/FolderButton.swift +++ b/iBox/Sources/Presenter/BoxList/FolderButton.swift @@ -36,7 +36,7 @@ class FolderButton: UIButton { init(isOpen: Bool) { self.isOpen = isOpen super.init(frame: .zero) - backgroundColor = .systemGroupedBackground + backgroundColor = .tableViewBackgroundColor setupLayout() } From b2db55b655576765cbb99939fbade922e62abb3f Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 16:37:24 +0900 Subject: [PATCH 055/370] =?UTF-8?q?refactor:=20UserDefaultsManager=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presenter/MainTabBarController.swift | 4 +- .../MyPage/HomeTab/HomeTabSelectorCell.swift | 1 + .../MyPage/HomeTab/HomeTabSelectorView.swift | 3 +- .../Presenter/MyPage/Theme/ThemeCell.swift | 2 + .../Presenter/MyPage/Theme/ThemeView.swift | 4 +- iBox/Sources/SceneDelegate.swift | 8 +- iBox/Sources/Utils/UserDefaultsManager.swift | 112 ++++++------------ .../ViewModel/HomeTabSelectorViewModel.swift | 2 +- iBox/Sources/ViewModel/MyPageViewModel.swift | 4 +- iBox/Sources/ViewModel/ThemeViewModel.swift | 2 +- 10 files changed, 52 insertions(+), 90 deletions(-) diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index 5cf8eff..e1747c7 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -24,8 +24,8 @@ class MainTabBarController: UITabBarController { setupViewController(viewController: MyPageViewController(), image: UIImage(systemName: "person.fill")) ] tabBar.tintColor = .box - tabBar.backgroundColor = .systemBackground - selectedIndex = UserDefaultsManager.homeTabIndex.value + tabBar.backgroundColor = .backgroundColor + selectedIndex = UserDefaultsManager.homeTabIndex } private func setupViewController(viewController: UIViewController, image: UIImage?) -> UIViewController { diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift index 224e640..8e4a4fe 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift @@ -39,6 +39,7 @@ class HomeTabSelectorCell: UITableViewCell { // MARK: - Setup Methods private func setupLayout() { + backgroundColor = .clear selectionStyle = .none addSubview(titleLabel) diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift index 454ae24..511d1f8 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift @@ -20,6 +20,7 @@ class HomeTabSelectorView: BaseView { let tableView = UITableView().then { $0.separatorStyle = .none $0.register(HomeTabSelectorCell.self, forCellReuseIdentifier: HomeTabSelectorCell.reuseIdentifier) + $0.backgroundColor = .clear } // MARK: - Initializer @@ -56,7 +57,7 @@ class HomeTabSelectorView: BaseView { viewModel.$selectedIndex .receive(on: RunLoop.main) .sink { [weak self] selectedIndex in - UserDefaultsManager.homeTabIndex.value = selectedIndex + UserDefaultsManager.homeTabIndex = selectedIndex self?.tableView.reloadData() }.store(in: &cancellables) } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index be0dced..f9da2f9 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -39,6 +39,8 @@ class ThemeCell: UITableViewCell, BaseViewProtocol { func configureUI() { backgroundColor = .clear + selectionStyle = .none + addSubview(themeImageView) addSubview(titleLabel) addSubview(selectButton) diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index 2984710..65b4a41 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -60,8 +60,8 @@ class ThemeView: BaseView { .receive(on: RunLoop.main) .sink { [weak self] selectedIndex in guard let window = self?.window else { return } - UserDefaultsManager.theme.value = Theme.allCases[selectedIndex] - window.overrideUserInterfaceStyle = self?.toUserInterfaceStyle(UserDefaultsManager.theme.value) ?? .unspecified + UserDefaultsManager.theme = Theme.allCases[selectedIndex] + window.overrideUserInterfaceStyle = self?.toUserInterfaceStyle(UserDefaultsManager.theme) ?? .unspecified self?.tableView.reloadData() }.store(in: &cancellables) } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index e682d2a..9059b7e 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.windowScene = windowScene // 앱 테마 정보 - window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme.value) ?? .unspecified + window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme) ?? .unspecified insertDefaultDataIfNeeded() @@ -33,7 +33,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ] WebViewPreloader.shared.preload(urls: urlsToPreload) - let favorite = UserDefaultsManager.favorite.value + let favorite = UserDefaultsManager.favorite let favoriteUrl = favorite.url WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) @@ -51,7 +51,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } private func insertDefaultDataIfNeeded() { - let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted.value + let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted if !isDefaultDataInserted { var defaultData = [ Folder(id: UUID(), name: "42 폴더", color: .gray, bookmarks: [ @@ -65,7 +65,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ] CoreDataManager.shared.deleteAllFolders() CoreDataManager.shared.addInitialFolders(defaultData) - UserDefaultsManager.isDefaultDataInserted.value = true + UserDefaultsManager.isDefaultDataInserted = true } } diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index a4450bb..5d3e226 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -7,90 +7,48 @@ import Foundation -enum UserDefaultsAccessKey: String { - case theme // 다크 모드 - case favorite // 즐겨찾기 - case homeTab // 첫 화면 - case isDefaultDataInserted // 기본 데이터 삽입 여부 -} - final class UserDefaultsManager { - static let theme = UserDefaultValue( - key: .theme, - defaultValue: Theme.system - ) - static let favorite = UserDefaultValue( - key: .favorite, - defaultValue: Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!) - ) - static let homeTabIndex = UserDefaultValue( - key: .homeTab, - defaultValue: 0 - ) - static let isDefaultDataInserted = UserDefaultValue( - key: .isDefaultDataInserted, - defaultValue: false - ) -} - -class UserDefaultValue { - // MARK: - properties + @UserDefaultsData(key: "theme", defaultValue: Theme.system) + static var theme: Theme - /// UserDefaults 항목과 연결된 키 - private var key: UserDefaultsAccessKey + @UserDefaultsData(key: "favorite", defaultValue: Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!)) + static var favorite: Bookmark - /// UserDefaults에서 값이 찾아지지 않을 경우 사용할 기본값 - private var defaultValue: T + @UserDefaultsData(key: "homeTabIndex", defaultValue: 0) + static var homeTabIndex: Int - /// UserDefaults에 저장된 현재 값 - var value: T { - get { - getObject() ?? defaultValue - } set { - saveObject(newValue) - } - } - - // MARK: - initializer - - /// 키와 기본값을 사용하여 UserDefaultValue를 초기화 - init(key: UserDefaultsAccessKey, defaultValue: T) { - self.key = key - self.defaultValue = defaultValue - if getObject() == nil { // 처음 생성될 때 디폴트값 저장 - saveObject(defaultValue) - } - } - - // MARK: - functions + @UserDefaultsData(key: "isDefaultDataInserted", defaultValue: false) + static var isDefaultDataInserted: Bool + +} + +@propertyWrapper +struct UserDefaultsData { + let key: String + let defaultValue: Value + var container: UserDefaults = .standard - /// UserDefaults에서 Codable 객체를 검색 - private func getObject() -> T? { - guard let json = UserDefaults.standard.string(forKey: key.rawValue), - let data = json.data(using: .utf8), - let object = try? JSONDecoder().decode(T.self, from: data) - else { - return nil + var wrappedValue: Value { + get { + guard let data = container.object(forKey: key) as? Data else { + return defaultValue + } + do { + let value = try JSONDecoder().decode(Value.self, from: data) + return value + } catch { + print("Error decoding UserDefaults data for key \(key): \(error)") + return defaultValue + } } - return object - } - - /// UserDefaults에 Codable 객체를 저장 - private func saveObject(_ value: T?) { - guard let value = value, - let json = try? JSONEncoder().encode(value), - let data = String(data: json, encoding: .utf8) - else { - removeValue() - return + set { + do { + let data = try JSONEncoder().encode(newValue) + container.set(data, forKey: key) + } catch { + print("Error encoding UserDefaults data for key \(key): \(error)") + } } - UserDefaults.standard.set(data, forKey: key.rawValue) } - - /// 키와 관련된 항목을 UserDefaults에서 제거 - private func removeValue() { - UserDefaults.standard.removeObject(forKey: key.rawValue) - } - } diff --git a/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift b/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift index 1e6b63f..6a49529 100644 --- a/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift +++ b/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift @@ -10,6 +10,6 @@ import Foundation class HomeTabSelectorViewModel { - @Published var selectedIndex: Int = UserDefaultsManager.homeTabIndex.value + @Published var selectedIndex: Int = UserDefaultsManager.homeTabIndex } diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift index cc6e8ac..6a414a0 100644 --- a/iBox/Sources/ViewModel/MyPageViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -42,8 +42,8 @@ class MyPageViewModel { MyPageSection( title: "settings", items: [ - MyPageItem(title: "테마", description: UserDefaultsManager.theme.value.toString()), - MyPageItem(title: "홈화면", description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex.value].toString()) + MyPageItem(title: "테마", description: UserDefaultsManager.theme.toString()), + MyPageItem(title: "홈화면", description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString()) ] ) )) diff --git a/iBox/Sources/ViewModel/ThemeViewModel.swift b/iBox/Sources/ViewModel/ThemeViewModel.swift index a89e6ea..95aabb2 100644 --- a/iBox/Sources/ViewModel/ThemeViewModel.swift +++ b/iBox/Sources/ViewModel/ThemeViewModel.swift @@ -13,7 +13,7 @@ class ThemeViewModel { @Published var selectedIndex: Int init() { - switch UserDefaultsManager.theme.value { + switch UserDefaultsManager.theme { case .light: selectedIndex = 0 case .dark: selectedIndex = 1 case .system: selectedIndex = 2 From 90b1a3efc9cb3a239fa2dba7988333d90cbfd40b Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 17:27:21 +0900 Subject: [PATCH 056/370] =?UTF-8?q?remove:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseViewController.swift | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 iBox/Sources/Base/BaseViewController.swift diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift deleted file mode 100644 index c4be0a0..0000000 --- a/iBox/Sources/Base/BaseViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// BaseViewController.swift -// iBox -// -// Created by jiyeon on 12/26/23. -// - -import UIKit - -class BaseViewController: UIViewController { - - let baseView = View(frame: UIScreen.main.bounds) - - override func viewDidLoad() { - super.viewDidLoad() - view.addSubview(baseView) - } - -} From 98b799c3a5249d0ec8b32b514e94a34ececf9339 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 18:46:10 +0900 Subject: [PATCH 057/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94/=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=ED=8E=B8=EC=A7=91=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/BaseBottomSheetViewController.swift | 14 +++ .../BaseNavigationBarViewController.swift | 26 +++++- iBox/Sources/Model/EditItem.swift | 13 +++ .../Presenter/BoxList/BoxListView.swift | 1 + .../BoxList/BoxListViewController.swift | 19 +++- .../Presenter/BoxList/Edit/EditCell.swift | 71 +++++++++++++++ .../Presenter/BoxList/Edit/EditView.swift | 87 +++++++++++++++++++ .../BoxList/Edit/EditViewController.swift | 32 +++++++ .../EditBookmarkViewController.swift | 12 +++ .../EditFolder/EditFolderViewController.swift | 12 +++ 10 files changed, 281 insertions(+), 6 deletions(-) create mode 100644 iBox/Sources/Model/EditItem.swift create mode 100644 iBox/Sources/Presenter/BoxList/Edit/EditCell.swift create mode 100644 iBox/Sources/Presenter/BoxList/Edit/EditView.swift create mode 100644 iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift create mode 100644 iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift create mode 100644 iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift diff --git a/iBox/Sources/Base/BaseBottomSheetViewController.swift b/iBox/Sources/Base/BaseBottomSheetViewController.swift index ff14c1c..a045b2a 100644 --- a/iBox/Sources/Base/BaseBottomSheetViewController.swift +++ b/iBox/Sources/Base/BaseBottomSheetViewController.swift @@ -28,6 +28,12 @@ class BaseBottomSheetViewController: UIViewController { $0.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] // 왼쪽 위, 오른쪽 위 둥글게 } + let indicator = UIView().then { + $0.clipsToBounds = true + $0.layer.cornerRadius = 2 + $0.backgroundColor = .darkGray + } + // MARK: - initializer init(bottomSheetHeight: CGFloat) { @@ -58,6 +64,7 @@ class BaseBottomSheetViewController: UIViewController { private func configureUI() { view.addSubview(dimmedView) view.addSubview(sheetView) + sheetView.addSubview(indicator) dimmedView.snp.makeConstraints { $0.edges.equalToSuperview() @@ -68,6 +75,13 @@ class BaseBottomSheetViewController: UIViewController { $0.left.right.equalToSuperview() $0.height.equalTo(bottomSheetHeight) } + + indicator.snp.makeConstraints { + $0.width.equalTo(40) + $0.height.equalTo(4) + $0.top.equalToSuperview().inset(10) + $0.centerX.equalToSuperview() + } } // MARK: - functions diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseNavigationBarViewController.swift index 39fd7b2..e47308e 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseNavigationBarViewController.swift @@ -13,6 +13,7 @@ class NavigationBar: UIView { var backButton = UIButton() var titleLabel = UILabel() var addButton = UIButton() + var moreButton = UIButton() } protocol BaseNavigationBarViewControllerProtocol { @@ -25,8 +26,9 @@ protocol BaseNavigationBarViewControllerProtocol { func setNavigationBarTintColor(_ color: UIColor) func setNavigationBarHidden(_ hidden: Bool) func setNavigationBarBackButtonHidden(_ hidden: Bool) - func setNavigationBarAddButtonHidden(_ hidden: Bool) + func setNavigationBarMenuButtonHidden(_ hidden: Bool) func setNavigationBarAddButtonAction(_ selector: Selector) + func setNavigationBarMoreButtonAction(_ selector: Selector) func setNavigationBarTitleLabelText(_ text: String?) func setNavigationBarTitleLabelFont(_ font: UIFont?) func setNavigationBarTitleLabelTextColor(_ color: UIColor?) @@ -45,6 +47,9 @@ class BaseNavigationBarViewController: UIViewController, BaseNav $0.addButton.configuration = .plain() $0.addButton.configuration?.image = UIImage(systemName: "plus") $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.moreButton.configuration = .plain() + $0.moreButton.configuration?.image = UIImage(systemName: "ellipsis.circle") + $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) } let contentView: BaseView = View() @@ -76,6 +81,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav func setNavigationBarTintColor(_ color: UIColor) { navigationBar.backButton.tintColor = color navigationBar.addButton.tintColor = color + navigationBar.moreButton.tintColor = color } func setNavigationBarHidden(_ hidden: Bool) { @@ -111,14 +117,19 @@ class BaseNavigationBarViewController: UIViewController, BaseNav } } - func setNavigationBarAddButtonHidden(_ hidden: Bool) { + func setNavigationBarMenuButtonHidden(_ hidden: Bool) { navigationBar.addButton.isHidden = hidden + navigationBar.moreButton.isHidden = hidden } func setNavigationBarAddButtonAction(_ selector: Selector) { navigationBar.addButton.addTarget(self, action: selector, for: .touchUpInside) } + func setNavigationBarMoreButtonAction(_ selector: Selector) { + navigationBar.moreButton.addTarget(self, action: selector, for: .touchUpInside) + } + func setNavigationBarTitleLabelText(_ text: String?) { navigationBar.titleLabel.text = text } @@ -140,6 +151,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav navigationBar.addSubview(navigationBar.backButton) navigationBar.addSubview(navigationBar.titleLabel) navigationBar.addSubview(navigationBar.addButton) + navigationBar.addSubview(navigationBar.moreButton) view.addSubview(contentView) statusBar.snp.makeConstraints { @@ -163,12 +175,18 @@ class BaseNavigationBarViewController: UIViewController, BaseNav $0.center.equalToSuperview() } - navigationBar.addButton.snp.makeConstraints { + navigationBar.moreButton.snp.makeConstraints { $0.right.equalToSuperview().inset(20) $0.centerY.equalToSuperview() $0.width.height.equalTo(24) } + navigationBar.addButton.snp.makeConstraints { + $0.right.equalTo(navigationBar.moreButton.snp.left).offset(-20) + $0.centerY.equalToSuperview() + $0.width.height.equalTo(24) + } + contentView.snp.makeConstraints { $0.top.equalTo(statusBar.snp.bottom).offset(60) $0.left.right.equalToSuperview() @@ -182,7 +200,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav setNavigationBarTintColor(tintColor) setNavigationBarTitleLabelFont(titleFont) setNavigationBarBackButtonHidden(true) - setNavigationBarAddButtonHidden(true) + setNavigationBarMenuButtonHidden(true) navigationBar.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) } diff --git a/iBox/Sources/Model/EditItem.swift b/iBox/Sources/Model/EditItem.swift new file mode 100644 index 0000000..f9799b2 --- /dev/null +++ b/iBox/Sources/Model/EditItem.swift @@ -0,0 +1,13 @@ +// +// EditItem.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import Foundation + +struct EditItem { + var imageString: String + var title: String +} diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 1850bf2..78247ad 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -12,6 +12,7 @@ import SnapKit protocol BoxListViewDelegate: AnyObject { func didSelectWeb(at url: URL, withName name: String) + func pushViewController(index: Int) } class BoxListView: BaseView { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index b1cb49d..de3344b 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -19,14 +19,21 @@ class BoxListViewController: BaseNavigationBarViewController { override func setupNavigationBar() { setNavigationBarTitleLabelText("iBox") - setNavigationBarAddButtonHidden(false) + setNavigationBarMenuButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) + setNavigationBarMoreButtonAction(#selector(moreButtonTapped)) } - @objc private func addButtonTapped(_ sender: Any?) { + @objc private func addButtonTapped() { let addBookmarkBottomSheetViewController = AddBookmarkBottomSheetViewController(bottomSheetHeight: 200) present(addBookmarkBottomSheetViewController, animated: false) } + + @objc private func moreButtonTapped() { + let editViewController = EditViewController(bottomSheetHeight: 200) + editViewController.delegate = self + present(editViewController, animated: false) + } } @@ -36,4 +43,12 @@ extension BoxListViewController: BoxListViewDelegate { viewController.title = name navigationController?.pushViewController(viewController, animated: true) } + + func pushViewController(index: Int) { + switch index { + case 0: navigationController?.pushViewController(EditFolderViewController(), animated: true) + case 1: navigationController?.pushViewController(EditBookmarkViewController(), animated: true) + default: break + } + } } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift new file mode 100644 index 0000000..532ac2a --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift @@ -0,0 +1,71 @@ +// +// EditCell.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +import SnapKit + +class EditCell: UITableViewCell { + + static let reuseIdentifier = "EditCell" + + // MARK: - UI Components + + private let iconView = UIImageView().then { + $0.tintColor = .label + } + + private let titleLabel = UILabel().then { + $0.textColor = .label + } + + // MARK: - Initializer + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + selectionStyle = .none + backgroundColor = .clear + } + + private func setupHierarchy() { + addSubview(iconView) + addSubview(titleLabel) + } + + private func setupLayout() { + iconView.snp.makeConstraints { make in + make.width.height.equalTo(20) + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + } + + titleLabel.snp.makeConstraints{ make in + make.leading.equalTo(iconView.snp.trailing).offset(10) + make.centerY.equalToSuperview() + } + } + + // MARK: - Bind + + func bind(_ editItem: EditItem) { + iconView.image = UIImage(systemName: editItem.imageString) + titleLabel.text = editItem.title + } + +} diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift new file mode 100644 index 0000000..a321f0a --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift @@ -0,0 +1,87 @@ +// +// EditView.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +import SnapKit + +class EditView: BaseView { + + var delegate: EditViewDelegate? + + private let editItems = [ + EditItem(imageString: "folder.fill", title: "폴더 편집"), + EditItem(imageString: "bookmark.fill", title: "북마크 편집") + ] + + // MARK: - UI Components + + let tableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(EditCell.self, forCellReuseIdentifier: EditCell.reuseIdentifier) + $0.separatorStyle = .none + } + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .backgroundColor + tableView.delegate = self + tableView.dataSource = self + } + + private func setupHierarchy() { + addSubview(tableView) + } + + private func setupLayout() { + tableView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(40) + make.leading.bottom.trailing.equalToSuperview() + } + } + +} + +extension EditView: UITableViewDelegate { + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 50 + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + delegate?.pushViewController(index: indexPath.row) + } + +} + +extension EditView: UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return editItems.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: EditCell.reuseIdentifier) as? EditCell else { return UITableViewCell() } + cell.bind(editItems[indexPath.row]) + return cell + } + +} diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift new file mode 100644 index 0000000..22fa7c1 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift @@ -0,0 +1,32 @@ +// +// EditViewController.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +protocol EditViewDelegate { + func pushViewController(index: Int) +} + +class EditViewController: BaseBottomSheetViewController { + + var delegate: BoxListViewDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + sheetView.delegate = self + } + +} + +extension EditViewController: EditViewDelegate { + + func pushViewController(index: Int) { + delegate?.pushViewController(index: index) + dismiss(animated: false) + } + +} diff --git a/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift new file mode 100644 index 0000000..93e0c8b --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift @@ -0,0 +1,12 @@ +// +// EditBookmarkViewController.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +class EditBookmarkViewController: UIViewController { + +} diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift new file mode 100644 index 0000000..1ebca8b --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift @@ -0,0 +1,12 @@ +// +// EditFolderViewController.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +class EditFolderViewController: UIViewController { + +} From 4c73a325543255641218d51d1868598fd0091f6f Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 18:50:30 +0900 Subject: [PATCH 058/370] =?UTF-8?q?feat:=20EditType=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/EditItem.swift | 6 ++++++ iBox/Sources/Presenter/BoxList/BoxListView.swift | 2 +- .../Presenter/BoxList/BoxListViewController.swift | 11 ++++++----- iBox/Sources/Presenter/BoxList/Edit/EditCell.swift | 2 +- iBox/Sources/Presenter/BoxList/Edit/EditView.swift | 6 +++--- .../Presenter/BoxList/Edit/EditViewController.swift | 6 +++--- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/iBox/Sources/Model/EditItem.swift b/iBox/Sources/Model/EditItem.swift index f9799b2..83f5689 100644 --- a/iBox/Sources/Model/EditItem.swift +++ b/iBox/Sources/Model/EditItem.swift @@ -7,7 +7,13 @@ import Foundation +enum EditType { + case folder + case bookmark +} + struct EditItem { + var type: EditType var imageString: String var title: String } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index 78247ad..de27c07 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -12,7 +12,7 @@ import SnapKit protocol BoxListViewDelegate: AnyObject { func didSelectWeb(at url: URL, withName name: String) - func pushViewController(index: Int) + func pushViewController(type: EditType) } class BoxListView: BaseView { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index de3344b..014cd0e 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -44,11 +44,12 @@ extension BoxListViewController: BoxListViewDelegate { navigationController?.pushViewController(viewController, animated: true) } - func pushViewController(index: Int) { - switch index { - case 0: navigationController?.pushViewController(EditFolderViewController(), animated: true) - case 1: navigationController?.pushViewController(EditBookmarkViewController(), animated: true) - default: break + func pushViewController(type: EditType) { + switch type { + case .folder: + navigationController?.pushViewController(EditFolderViewController(), animated: true) + case .bookmark: + navigationController?.pushViewController(EditBookmarkViewController(), animated: true) } } } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift index 532ac2a..7ecff21 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift @@ -51,7 +51,7 @@ class EditCell: UITableViewCell { private func setupLayout() { iconView.snp.makeConstraints { make in make.width.height.equalTo(20) - make.leading.equalToSuperview().inset(20) + make.leading.equalToSuperview().inset(30) make.centerY.equalToSuperview() } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift index a321f0a..9c6e6db 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift @@ -14,8 +14,8 @@ class EditView: BaseView { var delegate: EditViewDelegate? private let editItems = [ - EditItem(imageString: "folder.fill", title: "폴더 편집"), - EditItem(imageString: "bookmark.fill", title: "북마크 편집") + EditItem(type: .folder, imageString: "folder.fill", title: "폴더 편집"), + EditItem(type: .bookmark, imageString: "bookmark.fill", title: "북마크 편집") ] // MARK: - UI Components @@ -67,7 +67,7 @@ extension EditView: UITableViewDelegate { } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - delegate?.pushViewController(index: indexPath.row) + delegate?.pushViewController(type: editItems[indexPath.row].type) } } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift index 22fa7c1..b5ae2f5 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift @@ -8,7 +8,7 @@ import UIKit protocol EditViewDelegate { - func pushViewController(index: Int) + func pushViewController(type: EditType) } class EditViewController: BaseBottomSheetViewController { @@ -24,8 +24,8 @@ class EditViewController: BaseBottomSheetViewController { extension EditViewController: EditViewDelegate { - func pushViewController(index: Int) { - delegate?.pushViewController(index: index) + func pushViewController(type: EditType) { + delegate?.pushViewController(type: type) dismiss(animated: false) } From 26e0e13f37a2752b7814f84c81aeb8c596e38bee Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 18:53:36 +0900 Subject: [PATCH 059/370] =?UTF-8?q?feat:=20ViewController=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditBookmarkViewController.swift | 12 --------- .../EditBookmark/EditBookmarkView.swift | 12 +++++++++ .../EditBookmarkViewController.swift | 27 +++++++++++++++++++ .../BoxList/EditFolder/EditFolderView.swift | 12 +++++++++ .../EditFolder/EditFolderViewController.swift | 17 +++++++++++- 5 files changed, 67 insertions(+), 13 deletions(-) delete mode 100644 iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift create mode 100644 iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift create mode 100644 iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift create mode 100644 iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift diff --git a/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift deleted file mode 100644 index 93e0c8b..0000000 --- a/iBox/Sources/Presenter/BoxList/EditBookMark/EditBookmarkViewController.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// EditBookmarkViewController.swift -// iBox -// -// Created by jiyeon on 2/29/24. -// - -import UIKit - -class EditBookmarkViewController: UIViewController { - -} diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift new file mode 100644 index 0000000..acefeca --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift @@ -0,0 +1,12 @@ +// +// EditBookmarkView.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +class EditBookmarkView: BaseView { + +} diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift new file mode 100644 index 0000000..0717815 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift @@ -0,0 +1,27 @@ +// +// EditBookmarkViewController.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +class EditBookmarkViewController: BaseNavigationBarViewController { + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("북마크 편집") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } + +} diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift new file mode 100644 index 0000000..f88fdb0 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift @@ -0,0 +1,12 @@ +// +// EditFolderView.swift +// iBox +// +// Created by jiyeon on 2/29/24. +// + +import UIKit + +class EditFolderView: BaseView { + +} diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift index 1ebca8b..4160dc7 100644 --- a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift @@ -7,6 +7,21 @@ import UIKit -class EditFolderViewController: UIViewController { +class EditFolderViewController: BaseNavigationBarViewController { + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + } + + // MARK: - BaseNavigationBarViewControllerProtocol + + override func setupNavigationBar() { + setNavigationBarTitleLabelText("폴더 편집") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } } From 6ef8eec966deea903a6268530448d06166b4ef14 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 29 Feb 2024 21:31:06 +0900 Subject: [PATCH 060/370] =?UTF-8?q?feat:=20=ED=94=84=EB=A6=AC=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20on/off=20=EC=85=80=20=EC=B6=94=EA=B0=80=20(UserDefa?= =?UTF-8?q?ults=20=EC=A0=80=EC=9E=A5=EC=9D=80=20=EC=95=84=EC=A7=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/MyPageItem.swift | 25 +++++- .../Presenter/MyPage/MyPageItemCell.swift | 46 ++++++++--- .../Sources/Presenter/MyPage/MyPageView.swift | 77 +++++++++++-------- .../MyPage/MyPageViewController.swift | 32 ++++---- iBox/Sources/Utils/UserDefaultsManager.swift | 3 + .../ViewModel/MyPageCellViewModel.swift | 14 ++-- .../ViewModel/MyPageSectionViewModel.swift | 7 +- iBox/Sources/ViewModel/MyPageViewModel.swift | 32 ++++---- 8 files changed, 146 insertions(+), 90 deletions(-) diff --git a/iBox/Sources/Model/MyPageItem.swift b/iBox/Sources/Model/MyPageItem.swift index 9c695c6..790c1c1 100644 --- a/iBox/Sources/Model/MyPageItem.swift +++ b/iBox/Sources/Model/MyPageItem.swift @@ -7,12 +7,29 @@ import Foundation -struct MyPageSection { - var title: String - var items: [MyPageItem] +enum MyPageType { + case theme + case homeTab + case preload + case guide + case feedback + case developer + + func toString() -> String { + switch self { + case .theme: "테마" + case .homeTab: "홈화면" + case .preload: "페이지 미리 로드" + case .guide: "이용 가이드" + case .feedback: "앱 피드백" + case .developer: "개발자 정보" + } + } + } struct MyPageItem { - var title: String + var type: MyPageType var description: String? + var flag: Bool? } diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index c3a3c72..9b71644 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -11,17 +11,28 @@ import SnapKit class MyPageItemCell: UITableViewCell, BaseViewProtocol { + static let reuseIdentifier = "MyPageItemCell" + private var viewModel: MyPageCellViewModel? + // MARK: - UI let titleLabel = UILabel().then { $0.font = .systemFont(ofSize: 16) } + let stackView = UIStackView().then { + $0.axis = .horizontal + } + let descriptionLabel = UILabel().then { $0.font = .systemFont(ofSize: 13, weight: .regular) $0.textColor = .gray } + let controlSwitch = UISwitch().then { + $0.tintColor = .box3 + } + let chevronButton = UIButton().then { $0.configuration = .plain() $0.configuration?.image = UIImage(systemName: "chevron.right") @@ -34,7 +45,7 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) configureUI() - selectionStyle = .none // 셀 선택했을 때 회색으로 변하는 것 비활성화 + selectionStyle = .none } required init?(coder: NSCoder) { @@ -46,23 +57,40 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { func configureUI() { backgroundColor = .clear addSubview(titleLabel) - addSubview(descriptionLabel) - addSubview(chevronButton) + addSubview(stackView) + stackView.addArrangedSubview(controlSwitch) + stackView.addArrangedSubview(descriptionLabel) + stackView.addArrangedSubview(chevronButton) titleLabel.snp.makeConstraints { $0.left.equalToSuperview().inset(20) $0.centerY.equalToSuperview() } - chevronButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) + stackView.snp.makeConstraints { + $0.right.equalToSuperview().inset(30) $0.centerY.equalToSuperview() - $0.width.height.equalTo(20) } + } + + // MARK: - Bind ViewModel + + func bindViewModel(_ viewModel: MyPageCellViewModel) { + self.viewModel = viewModel + titleLabel.text = viewModel.title - descriptionLabel.snp.makeConstraints { - $0.right.equalTo(chevronButton.snp.left).offset(-10) - $0.centerY.equalToSuperview() + descriptionLabel.isHidden = true + controlSwitch.isHidden = true + chevronButton.isHidden = true + + if let description = viewModel.description { + descriptionLabel.text = viewModel.description + descriptionLabel.isHidden = false + } else if let flag = viewModel.flag { + controlSwitch.isOn = flag + controlSwitch.isHidden = false + } else { + chevronButton.isHidden = false } } diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index c0f57a7..7803d97 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -40,7 +40,7 @@ class MyPageView: BaseView { } let tableView = UITableView().then { - $0.register(MyPageItemCell.self, forCellReuseIdentifier: "MyPageItemCell") + $0.register(MyPageItemCell.self, forCellReuseIdentifier: MyPageItemCell.reuseIdentifier) $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 $0.backgroundColor = .clear @@ -50,7 +50,7 @@ class MyPageView: BaseView { override init(frame: CGRect) { super.init(frame: frame) - setupProperties() + setupProperty() } required init?(coder: NSCoder) { @@ -59,7 +59,7 @@ class MyPageView: BaseView { // MARK: - BaseViewProtocol - private func setupProperties() { + private func setupProperty() { tableView.delegate = self tableView.dataSource = self @@ -91,7 +91,7 @@ class MyPageView: BaseView { } chevronButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) + $0.right.equalToSuperview().inset(30) $0.centerY.equalToSuperview() $0.width.height.equalTo(20) } @@ -124,53 +124,64 @@ class MyPageView: BaseView { } -extension MyPageView: UITableViewDelegate, UITableViewDataSource { +extension MyPageView: UITableViewDelegate { + + // MARK: - section - // 테이블 뷰의 섹션 개수 설정 func numberOfSections(in tableView: UITableView) -> Int { guard let viewModel = viewModel else { return 0 } return viewModel.myPageSectionViewModels.count } - // 테이블 뷰의 행 개수 설정 - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let viewModel = viewModel else { return 0 } - return viewModel.myPageSectionViewModels[section].model.items.count - } - - // 테이블 뷰 셀 구성 - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let viewModel = viewModel, - let cell = tableView.dequeueReusableCell(withIdentifier: "MyPageItemCell") - as? MyPageItemCell else { return UITableViewCell() } - let item = viewModel.myPageSectionViewModels[indexPath.section].model.items[indexPath.row] - cell.titleLabel.text = item.title - cell.descriptionLabel.text = item.description - return cell - } - - // 셀의 높이 설정 - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 65 - } - - // 섹션 헤더의 View 설정 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView() headerView.backgroundColor = .backgroundColor return headerView } - // 섹션 헤더의 높이 설정 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 10 } - // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 + // MARK: - cell + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 55 + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } - let item = viewModel.myPageSectionViewModels[indexPath.section].model.items[indexPath.row] - delegate?.pushViewController(indexPath) + let myPageItem = viewModel.myPageSectionViewModels[indexPath.section].cellViewModels[indexPath.row].myPageItem + if (myPageItem.type != MyPageType.preload) { + delegate?.pushViewController(myPageItem.type) + } + } + +} + +extension MyPageView: UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let viewModel = viewModel else { return 0 } + return viewModel.myPageSectionViewModels[section].cellViewModels.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let viewModel = viewModel, + let cell = tableView.dequeueReusableCell(withIdentifier: MyPageItemCell.reuseIdentifier) + as? MyPageItemCell else { return UITableViewCell() } + let cellViewModel = viewModel.myPageSectionViewModels[indexPath.section].cellViewModels[indexPath.row] + cell.bindViewModel(cellViewModel) + if cellViewModel.flag != nil { + cell.controlSwitch.addTarget(self, action: #selector(handleControlSwitchTap), for: .touchUpInside) + } + return cell + } + + @objc private func handleControlSwitchTap(_ controlSwitch: UISwitch) { + guard let viewModel = viewModel else { return } + viewModel.input.send(.setPreload(controlSwitch.isOn)) + print(controlSwitch.isOn) } } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 69349b1..388a2a1 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -8,7 +8,7 @@ import UIKit protocol MyPageViewDelegate { - func pushViewController(_ indexPath: IndexPath) + func pushViewController(_ type: MyPageType) func pushViewController(_ viewController: UIViewController) } @@ -36,27 +36,27 @@ class MyPageViewController: BaseNavigationBarViewController { // MARK: - BaseNavigationBarViewControllerProtocol override func setupNavigationBar() { - setNavigationBarTitleLabelText("My Page") + setNavigationBarTitleLabelText("마이 페이지") } } extension MyPageViewController: MyPageViewDelegate { - func pushViewController(_ indexPath: IndexPath) { - if indexPath.section == 0 { - switch indexPath.row { - case 0: navigationController?.pushViewController(ThemeViewController(), animated: true) - case 1: navigationController?.pushViewController(HomeTabSelectorViewController(), animated: true) - default: break - } - } else { - switch indexPath.row { - case 0: print("이용 가이드 탭 !") - case 1: print("앱 피드백 탭 !") - case 2: print("개발자 정보 탭 !") - default: break - } + func pushViewController(_ type: MyPageType) { + switch type { + case .theme: + navigationController?.pushViewController(ThemeViewController(), animated: true) + case .homeTab: + navigationController?.pushViewController(HomeTabSelectorViewController(), animated: true) + case .preload: + print("미리 로드 탭 !") + case .guide: + print("이용 가이드 탭 !") + case .feedback: + print("앱 피드백 탭 !") + case .developer: + print("개발자 정보 탭 !") } } diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Utils/UserDefaultsManager.swift index 5d3e226..48e785d 100644 --- a/iBox/Sources/Utils/UserDefaultsManager.swift +++ b/iBox/Sources/Utils/UserDefaultsManager.swift @@ -20,6 +20,9 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isDefaultDataInserted", defaultValue: false) static var isDefaultDataInserted: Bool + + @UserDefaultsData(key: "isPreload", defaultValue: false) + static var isPreload: Bool } diff --git a/iBox/Sources/ViewModel/MyPageCellViewModel.swift b/iBox/Sources/ViewModel/MyPageCellViewModel.swift index f5c4c81..77a77c4 100644 --- a/iBox/Sources/ViewModel/MyPageCellViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageCellViewModel.swift @@ -9,18 +9,22 @@ import Foundation class MyPageCellViewModel { - let model: MyPageItem + let myPageItem: MyPageItem - init(_ model: MyPageItem) { - self.model = model + init(_ myPageItem: MyPageItem) { + self.myPageItem = myPageItem } var title: String { - model.title + myPageItem.type.toString() + } + + var flag: Bool? { + myPageItem.flag } var description: String? { - model.description + myPageItem.description } } diff --git a/iBox/Sources/ViewModel/MyPageSectionViewModel.swift b/iBox/Sources/ViewModel/MyPageSectionViewModel.swift index 550d976..53b2a81 100644 --- a/iBox/Sources/ViewModel/MyPageSectionViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageSectionViewModel.swift @@ -9,11 +9,10 @@ import Foundation class MyPageSectionViewModel { + let cellViewModels: [MyPageCellViewModel] - let model: MyPageSection - - init(_ model: MyPageSection) { - self.model = model + init(cellViewModels: [MyPageCellViewModel]) { + self.cellViewModels = cellViewModels } } diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift index 6a414a0..cbaa62f 100644 --- a/iBox/Sources/ViewModel/MyPageViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -12,6 +12,7 @@ class MyPageViewModel { enum Input { case viewWillAppear + case setPreload(_ isOn: Bool) } enum Output { @@ -32,31 +33,24 @@ class MyPageViewModel { self?.myPageSectionViewModels.removeAll() self?.updateMyPageSectionViewModels() self?.output.send(.updateMyPageSectionViewModels) + case let .setPreload(isOn): + UserDefaultsManager.isPreload = isOn } }.store(in: &cancellables) return output.eraseToAnyPublisher() } private func updateMyPageSectionViewModels() { - myPageSectionViewModels.append(MyPageSectionViewModel( - MyPageSection( - title: "settings", - items: [ - MyPageItem(title: "테마", description: UserDefaultsManager.theme.toString()), - MyPageItem(title: "홈화면", description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString()) - ] - ) - )) - myPageSectionViewModels.append(MyPageSectionViewModel( - MyPageSection( - title: "help", - items: [ - MyPageItem(title: "이용 가이드"), - MyPageItem(title: "앱 피드백"), - MyPageItem(title: "개발자 정보") - ] - )) - ) + myPageSectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ + MyPageCellViewModel(MyPageItem(type: .theme, description: UserDefaultsManager.theme.toString())), + MyPageCellViewModel(MyPageItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), + MyPageCellViewModel(MyPageItem(type: .preload, flag: UserDefaultsManager.isPreload)) + ])) + myPageSectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ + MyPageCellViewModel(MyPageItem(type: .guide)), + MyPageCellViewModel(MyPageItem(type: .feedback)), + MyPageCellViewModel(MyPageItem(type: .developer)) + ])) } } From a6ed6907e98a255c335e5515de09536906c55f67 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:06:59 +0900 Subject: [PATCH 061/370] feat: add versioning handler --- .../Versioning/VersioningHandler.swift | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 iBox/Sources/Versioning/VersioningHandler.swift diff --git a/iBox/Sources/Versioning/VersioningHandler.swift b/iBox/Sources/Versioning/VersioningHandler.swift new file mode 100644 index 0000000..b082c0f --- /dev/null +++ b/iBox/Sources/Versioning/VersioningHandler.swift @@ -0,0 +1,69 @@ +// +// VersioningHandler.swift +// iBox +// +// Created by Chan on 3/2/24. +// + +import UIKit + +class VersioningHandler { + + func checkAppVersion() { + let urlString = "https://my-json-server.typicode.com/42Box/versioning/db" + guard let url = URL(string: urlString) else { return } + + let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in + guard let data = data, error == nil else { return } + + do { + let versionInfo = try JSONDecoder().decode(VersionInfo.self, from: data) + guard let latestVersion = versionInfo.version.first?.latestVersion, + let minRequiredVersion = versionInfo.version.first?.minRequiredVersion, + let updateUrl = versionInfo.url.updateURL else { return } + + DispatchQueue.main.async { + self?.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, updateUrl: updateUrl) + } + } catch { + print(error) + } + } + + task.resume() + } + + func compareVersion(latestVersion: String, minRequiredVersion: String, updateUrl: String) { + guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return } + + if appVersion.compare(minRequiredVersion, options: .numeric) == .orderedAscending { + showAlertForUpdate(updateUrl: updateUrl, isMandatory: true) + } else if appVersion.compare(latestVersion, options: .numeric) == .orderedAscending { + showAlertForUpdate(updateUrl: updateUrl, isMandatory: false) + } + } + + + func showAlertForUpdate(updateUrl: String, isMandatory: Bool) { + guard let windowScene = UIApplication.shared.connectedScenes.first(where: { $0 is UIWindowScene }) as? UIWindowScene, + let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { + return + } + + + let message = isMandatory ? "새로운 버전이 필요합니다. 업데이트 하시겠습니까?" : "새로운 버전이 있습니다. 업데이트 하시겠습니까?" + let alert = UIAlertController(title: "업데이트 알림", message: message, preferredStyle: .alert) + + alert.addAction(UIAlertAction(title: "업데이트", style: .default, handler: { _ in + if let url = URL(string: updateUrl), UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + } + })) + + if !isMandatory { + alert.addAction(UIAlertAction(title: "나중에", style: .cancel)) + } + + rootViewController.present(alert, animated: true) + } +} From bbc9a631292815fd6631195da26fe3f80f0bc308 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:07:23 +0900 Subject: [PATCH 062/370] fix: version Info json --- iBox/Sources/Model/VersionInfo.swift | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/Model/VersionInfo.swift b/iBox/Sources/Model/VersionInfo.swift index c6d11cc..331a7cb 100644 --- a/iBox/Sources/Model/VersionInfo.swift +++ b/iBox/Sources/Model/VersionInfo.swift @@ -5,8 +5,23 @@ // Created by Chan on 2/29/24. // +// MARK: - VersionInfo struct VersionInfo: Codable { - let latestVersion: String - let minRequiredVersion: String - let updateUrl: String + let version: [Version] + let url: URLClass +} + +// MARK: - URLClass +struct URLClass: Codable { + let updateURL: String? + + enum CodingKeys: String, CodingKey { + case updateURL = "updateUrl" + } +} + +// MARK: - Version +struct Version: Codable { + let id: Int + let latestVersion, minRequiredVersion: String } From 1e336e64fea7d156f6fc5b8667ae7d689136d61b Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:08:34 +0900 Subject: [PATCH 063/370] feat: add versioning handler in appdelegate --- iBox/Sources/AppDelegate.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 1d9e30e..f21e00c 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -10,11 +10,11 @@ import CoreData @main class AppDelegate: UIResponder, UIApplicationDelegate { - - + let versioningHandler: VersioningHandler = VersioningHandler() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + + versioningHandler.checkAppVersion() return true } From da7a90678a92c458182a19d5c652e8344bd5dd38 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:08:51 +0900 Subject: [PATCH 064/370] test: mock versioninfo json --- iBox/Resources/Version/VersionInfo.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/iBox/Resources/Version/VersionInfo.json b/iBox/Resources/Version/VersionInfo.json index db2ba7c..5ee1ecb 100644 --- a/iBox/Resources/Version/VersionInfo.json +++ b/iBox/Resources/Version/VersionInfo.json @@ -1,5 +1,12 @@ { - "latestVersion": "1.2.0", - "minRequiredVersion": "1.1.0", - "updateUrl": "https://appstore.com/iBox" + "version": [ + { + "id": 1, + "latestVersion": "1.2.0", + "minRequiredVersion": "1.1.0" + } + ], + "url": { + "updateUrl": "https://appstore.com/iBox" + } } From d9f761d4dafec28ddffbd7fe032364097cf98029 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sat, 2 Mar 2024 16:19:24 +0900 Subject: [PATCH 065/370] =?UTF-8?q?feat:=20=ED=94=84=EB=A6=AC=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20UserDefaults=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presenter/MyPage/MyPageItemCell.swift | 60 +++++++++++-------- .../Sources/Presenter/MyPage/MyPageView.swift | 58 +++++++++--------- .../MyPage/MyPageViewController.swift | 10 +--- iBox/Sources/ViewModel/MyPageViewModel.swift | 16 ++--- 4 files changed, 77 insertions(+), 67 deletions(-) diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index 9b71644..a72402e 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -9,28 +9,24 @@ import UIKit import SnapKit -class MyPageItemCell: UITableViewCell, BaseViewProtocol { +class MyPageItemCell: UITableViewCell { static let reuseIdentifier = "MyPageItemCell" private var viewModel: MyPageCellViewModel? - // MARK: - UI + // MARK: - UI Components let titleLabel = UILabel().then { $0.font = .systemFont(ofSize: 16) } - let stackView = UIStackView().then { - $0.axis = .horizontal - } - let descriptionLabel = UILabel().then { $0.font = .systemFont(ofSize: 13, weight: .regular) $0.textColor = .gray } - let controlSwitch = UISwitch().then { - $0.tintColor = .box3 + let switchControl = UISwitch().then { + $0.onTintColor = .box2 } let chevronButton = UIButton().then { @@ -40,37 +36,53 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { $0.tintColor = .systemGray3 } - // MARK: - initializer + // MARK: - Initializer override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - configureUI() - selectionStyle = .none + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - // MARK: - BaseViewProtocol + // MARK: - Setup Methods - func configureUI() { + private func setupProperty() { backgroundColor = .clear - addSubview(titleLabel) - addSubview(stackView) - stackView.addArrangedSubview(controlSwitch) - stackView.addArrangedSubview(descriptionLabel) - stackView.addArrangedSubview(chevronButton) - + selectionStyle = .none + } + + private func setupHierarchy() { + contentView.addSubview(titleLabel) + contentView.addSubview(switchControl) + contentView.addSubview(descriptionLabel) + contentView.addSubview(chevronButton) + } + + private func setupLayout() { titleLabel.snp.makeConstraints { $0.left.equalToSuperview().inset(20) $0.centerY.equalToSuperview() } - stackView.snp.makeConstraints { + switchControl.snp.makeConstraints { + $0.right.equalToSuperview().inset(30) + $0.centerY.equalToSuperview() + } + + descriptionLabel.snp.makeConstraints { $0.right.equalToSuperview().inset(30) $0.centerY.equalToSuperview() } + + chevronButton.snp.makeConstraints { + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } } // MARK: - Bind ViewModel @@ -80,15 +92,15 @@ class MyPageItemCell: UITableViewCell, BaseViewProtocol { titleLabel.text = viewModel.title descriptionLabel.isHidden = true - controlSwitch.isHidden = true + switchControl.isHidden = true chevronButton.isHidden = true if let description = viewModel.description { - descriptionLabel.text = viewModel.description + descriptionLabel.text = description descriptionLabel.isHidden = false } else if let flag = viewModel.flag { - controlSwitch.isOn = flag - controlSwitch.isHidden = false + switchControl.isOn = flag + switchControl.isHidden = false } else { chevronButton.isHidden = false } diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index 7803d97..00ae02b 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -8,15 +8,13 @@ import Combine import UIKit -class MyPageView: BaseView { - - // MARK: - Properties +final class MyPageView: BaseView { var delegate: MyPageViewDelegate? private var viewModel: MyPageViewModel? private var cancellables = Set() - // MARK: - UI + // MARK: - UI Components let profileView = UIView().then { $0.isUserInteractionEnabled = true @@ -51,29 +49,37 @@ class MyPageView: BaseView { override init(frame: CGRect) { super.init(frame: frame) setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - // MARK: - BaseViewProtocol + // MARK: - Setup Methods private func setupProperty() { tableView.delegate = self tableView.dataSource = self - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(profileViewTapped)) - profileView.addGestureRecognizer(tapGesture) + profileView.addGestureRecognizer( + UITapGestureRecognizer( + target: self, + action: #selector(profileViewTapped) + ) + ) } - override func configureUI() { + private func setupHierarchy() { addSubview(profileView) profileView.addSubview(profileImageView) profileView.addSubview(profileLabel) profileView.addSubview(chevronButton) addSubview(tableView) - + } + + private func setupLayout() { profileView.snp.makeConstraints { $0.left.top.right.equalToSuperview() $0.height.equalTo(90) @@ -110,27 +116,30 @@ class MyPageView: BaseView { .receive(on: RunLoop.main) .sink { [weak self] event in switch event { - case .updateMyPageSectionViewModels: + case .updateSectionViewModels: self?.tableView.reloadData() } }.store(in: &cancellables) } - // MARK: - functions + // MARK: - Action Functions - @objc func profileViewTapped() { + @objc private func profileViewTapped() { delegate?.pushViewController(ProfileViewController()) } + @objc private func handleSwitchControlTap(_ controlSwitch: UISwitch) { + guard let viewModel = viewModel else { return } + viewModel.input.send(.setPreload(controlSwitch.isOn)) + } + } extension MyPageView: UITableViewDelegate { - // MARK: - section - func numberOfSections(in tableView: UITableView) -> Int { guard let viewModel = viewModel else { return 0 } - return viewModel.myPageSectionViewModels.count + return viewModel.sectionViewModels.count } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { @@ -140,18 +149,16 @@ extension MyPageView: UITableViewDelegate { } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 10 + return 20 } - // MARK: - cell - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 55 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } - let myPageItem = viewModel.myPageSectionViewModels[indexPath.section].cellViewModels[indexPath.row].myPageItem + let myPageItem = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row].myPageItem if (myPageItem.type != MyPageType.preload) { delegate?.pushViewController(myPageItem.type) } @@ -163,25 +170,20 @@ extension MyPageView: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { guard let viewModel = viewModel else { return 0 } - return viewModel.myPageSectionViewModels[section].cellViewModels.count + return viewModel.sectionViewModels[section].cellViewModels.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel = viewModel, let cell = tableView.dequeueReusableCell(withIdentifier: MyPageItemCell.reuseIdentifier) as? MyPageItemCell else { return UITableViewCell() } - let cellViewModel = viewModel.myPageSectionViewModels[indexPath.section].cellViewModels[indexPath.row] + let cellViewModel = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row] cell.bindViewModel(cellViewModel) if cellViewModel.flag != nil { - cell.controlSwitch.addTarget(self, action: #selector(handleControlSwitchTap), for: .touchUpInside) + cell.switchControl.removeTarget(nil, action: nil, for: .valueChanged) + cell.switchControl.addTarget(self, action: #selector(handleSwitchControlTap), for: .valueChanged) } return cell } - @objc private func handleControlSwitchTap(_ controlSwitch: UISwitch) { - guard let viewModel = viewModel else { return } - viewModel.input.send(.setPreload(controlSwitch.isOn)) - print(controlSwitch.isOn) - } - } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 388a2a1..1c6a0f1 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -12,20 +12,17 @@ protocol MyPageViewDelegate { func pushViewController(_ viewController: UIViewController) } -class MyPageViewController: BaseNavigationBarViewController { - - // MARK: - Properties +final class MyPageViewController: BaseNavigationBarViewController { private let viewModel = MyPageViewModel() - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() guard let contentView = contentView as? MyPageView else { return } contentView.delegate = self contentView.bindViewModel(viewModel) - viewModel.input.send(.viewWillAppear) } override func viewWillAppear(_ animated: Bool) { @@ -49,14 +46,13 @@ extension MyPageViewController: MyPageViewDelegate { navigationController?.pushViewController(ThemeViewController(), animated: true) case .homeTab: navigationController?.pushViewController(HomeTabSelectorViewController(), animated: true) - case .preload: - print("미리 로드 탭 !") case .guide: print("이용 가이드 탭 !") case .feedback: print("앱 피드백 탭 !") case .developer: print("개발자 정보 탭 !") + default: break } } diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/ViewModel/MyPageViewModel.swift index cbaa62f..f388ac2 100644 --- a/iBox/Sources/ViewModel/MyPageViewModel.swift +++ b/iBox/Sources/ViewModel/MyPageViewModel.swift @@ -16,7 +16,7 @@ class MyPageViewModel { } enum Output { - case updateMyPageSectionViewModels + case updateSectionViewModels } // MARK: - Properties @@ -24,15 +24,15 @@ class MyPageViewModel { let input = PassthroughSubject() private let output = PassthroughSubject() private var cancellables = Set() - var myPageSectionViewModels = [MyPageSectionViewModel]() + var sectionViewModels = [MyPageSectionViewModel]() func transform(input: AnyPublisher) -> AnyPublisher { input.sink { [weak self] event in switch event { case .viewWillAppear: - self?.myPageSectionViewModels.removeAll() - self?.updateMyPageSectionViewModels() - self?.output.send(.updateMyPageSectionViewModels) + self?.sectionViewModels.removeAll() + self?.updateSectionViewModels() + self?.output.send(.updateSectionViewModels) case let .setPreload(isOn): UserDefaultsManager.isPreload = isOn } @@ -40,13 +40,13 @@ class MyPageViewModel { return output.eraseToAnyPublisher() } - private func updateMyPageSectionViewModels() { - myPageSectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ + private func updateSectionViewModels() { + sectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ MyPageCellViewModel(MyPageItem(type: .theme, description: UserDefaultsManager.theme.toString())), MyPageCellViewModel(MyPageItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), MyPageCellViewModel(MyPageItem(type: .preload, flag: UserDefaultsManager.isPreload)) ])) - myPageSectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ + sectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ MyPageCellViewModel(MyPageItem(type: .guide)), MyPageCellViewModel(MyPageItem(type: .feedback)), MyPageCellViewModel(MyPageItem(type: .developer)) From 277ed9e8e82fd4ec7c848d0b362e1522d5061d2b Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:21:20 +0900 Subject: [PATCH 066/370] chore: delete mock file --- iBox/Resources/Version/VersionInfo.json | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 iBox/Resources/Version/VersionInfo.json diff --git a/iBox/Resources/Version/VersionInfo.json b/iBox/Resources/Version/VersionInfo.json deleted file mode 100644 index 5ee1ecb..0000000 --- a/iBox/Resources/Version/VersionInfo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": [ - { - "id": 1, - "latestVersion": "1.2.0", - "minRequiredVersion": "1.1.0" - } - ], - "url": { - "updateUrl": "https://appstore.com/iBox" - } -} From 4c23452f7cbfbb1b347c5ba1bf022c969c792f69 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 16:22:20 +0900 Subject: [PATCH 067/370] feat: add versioning submodule --- .gitmodules | 3 +++ iBox/Resources/Version | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 iBox/Resources/Version diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..46c791e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "iBox/Resources/Version"] + path = iBox/Resources/Version + url = https://github.com/42Box/versioning diff --git a/iBox/Resources/Version b/iBox/Resources/Version new file mode 160000 index 0000000..172ce29 --- /dev/null +++ b/iBox/Resources/Version @@ -0,0 +1 @@ +Subproject commit 172ce2939fccd76558f254adfb7b02535f97113c From 9a1416aacbb5f9d5f0c289f7cc1fb4dfd455ee76 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sat, 2 Mar 2024 16:40:46 +0900 Subject: [PATCH 068/370] =?UTF-8?q?chore:=20=EC=85=80=20UI=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Presenter/BoxList/Edit/EditCell.swift | 2 +- iBox/Sources/Presenter/BoxList/Edit/EditView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift index 7ecff21..8bfeeaa 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift @@ -56,7 +56,7 @@ class EditCell: UITableViewCell { } titleLabel.snp.makeConstraints{ make in - make.leading.equalTo(iconView.snp.trailing).offset(10) + make.leading.equalTo(iconView.snp.trailing).offset(20) make.centerY.equalToSuperview() } } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift index 9c6e6db..3a811d9 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift @@ -63,7 +63,7 @@ class EditView: BaseView { extension EditView: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 50 + return 55 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { From ee82b8dd7df7bb78bbf2c74620688a6f7eb51505 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sat, 2 Mar 2024 17:56:47 +0900 Subject: [PATCH 069/370] =?UTF-8?q?remove:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseView.swift | 31 ------------------ iBox/Sources/Presenter/MainView.swift | 46 --------------------------- 2 files changed, 77 deletions(-) delete mode 100644 iBox/Sources/Base/BaseView.swift delete mode 100644 iBox/Sources/Presenter/MainView.swift diff --git a/iBox/Sources/Base/BaseView.swift b/iBox/Sources/Base/BaseView.swift deleted file mode 100644 index 7ee908e..0000000 --- a/iBox/Sources/Base/BaseView.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// BaseView.swift -// iBox -// -// Created by jiyeon on 1/3/24. -// - -import UIKit - -protocol BaseViewProtocol { - func configureUI() -} - -class BaseView: UIView, BaseViewProtocol { - - // MARK: - initializer - - override init(frame: CGRect) { - super.init(frame: frame) - configureUI() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - BaseViewProtocol - - func configureUI() {} - -} diff --git a/iBox/Sources/Presenter/MainView.swift b/iBox/Sources/Presenter/MainView.swift deleted file mode 100644 index 202072b..0000000 --- a/iBox/Sources/Presenter/MainView.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// MainView.swift -// iBox -// -// Created by jiyeon on 12/26/23. -// - -import UIKit - -import SnapKit - -class MainView: UIView { - - // MARK: - UI - - var label: UILabel = { - let label = UILabel() - label.text = "예시입니당" - label.textColor = .black - return label - }() - - // MARK: - init - - override init(frame: CGRect) { - super.init(frame: frame) - configureUI() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - configure UI - - func configureUI() { - backgroundColor = .backgroundColor - - addSubview(label) - - label.snp.makeConstraints { - $0.center.equalToSuperview() - } - } - -} From af78be0418aadb9a84a67085e02603c0badde29a Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sat, 2 Mar 2024 17:57:04 +0900 Subject: [PATCH 070/370] =?UTF-8?q?refactor:=20Base=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/ShareViewController.swift | 18 +- .../View/ShareExtensionBackGroundView.swift | 34 +-- ...troller.swift => BaseViewController.swift} | 200 ++++++++---------- ....swift => BottomSheetViewController.swift} | 93 ++++---- .../BoxList/AddBookmark/AddBookmarkView.swift | 27 ++- .../AddBookmarkViewController.swift | 2 +- .../Presenter/BoxList/BoxListCell.swift | 43 ++-- .../Presenter/BoxList/BoxListView.swift | 76 ++++--- .../BoxList/BoxListViewController.swift | 12 +- .../Presenter/BoxList/Edit/EditView.swift | 2 +- .../BoxList/Edit/EditViewController.swift | 4 +- .../EditBookmark/EditBookmarkView.swift | 2 +- .../EditBookmarkViewController.swift | 6 +- .../BoxList/EditFolder/EditFolderView.swift | 2 +- .../EditFolder/EditFolderViewController.swift | 4 +- .../Presenter/BoxList/FolderButton.swift | 54 +++-- .../Presenter/Favorite/FavoriteView.swift | 18 +- .../Favorite/FavoriteViewController.swift | 11 +- .../Presenter/MainTabBarController.swift | 4 + .../MyPage/HomeTab/HomeTabSelectorCell.swift | 28 +-- .../MyPage/HomeTab/HomeTabSelectorView.swift | 17 +- .../HomeTabSelectorViewController.swift | 12 +- .../Presenter/MyPage/MyPageItemCell.swift | 24 +-- .../Sources/Presenter/MyPage/MyPageView.swift | 36 ++-- .../MyPage/MyPageViewController.swift | 8 +- .../MyPage/Profile/ProfileView.swift | 7 +- .../Profile/ProfileViewController.swift | 10 +- .../Presenter/MyPage/Theme/ThemeCell.swift | 49 +++-- .../Presenter/MyPage/Theme/ThemeView.swift | 56 ++--- .../MyPage/Theme/ThemeViewController.swift | 10 +- .../Presenter/Web/PreloadedWebView.swift | 7 +- .../Web/PreloadedWebViewController.swift | 11 +- iBox/Sources/Presenter/Web/WebView.swift | 29 ++- .../Presenter/Web/WebViewController.swift | 9 +- 34 files changed, 515 insertions(+), 410 deletions(-) rename iBox/Sources/Base/{BaseNavigationBarViewController.swift => BaseViewController.swift} (55%) rename iBox/Sources/Base/{BaseBottomSheetViewController.swift => BottomSheetViewController.swift} (65%) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 97c7277..1815159 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -16,15 +16,27 @@ class CustomShareViewController: UIViewController { var backgroundView = ShareExtensionBackGroundView() var dataURL: String = "" + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() - configureUI() + setupProperty() + setupHierarchy() + setupLayout() extractSharedURL() } - func configureUI() { - self.view.addSubview(backgroundView) + // MARK: - Setup Methods + + private func setupProperty() { backgroundView.delegate = self + } + + private func setupHierarchy() { + view.addSubview(backgroundView) + } + + private func setupLayout() { backgroundView.snp.makeConstraints { make in make.trailing.leading.equalToSuperview().inset(20) make.center.equalToSuperview() diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift index 261f119..e77a4c9 100644 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -62,7 +62,7 @@ class ShareExtensionBackGroundView: UIView { override init(frame: CGRect) { super.init(frame: frame) - + setupProperty() setupHierarchy() setupLayout() setupButtonAction() @@ -74,6 +74,12 @@ class ShareExtensionBackGroundView: UIView { // MARK: - Setup Methods + private func setupProperty() { + backgroundColor = .systemBackground + clipsToBounds = true + layer.cornerRadius = 10 + } + private func setupHierarchy() { addSubview(label) addSubview(linkLabel) @@ -82,26 +88,22 @@ class ShareExtensionBackGroundView: UIView { } private func setupLayout() { - backgroundColor = .systemBackground - clipsToBounds = true - layer.cornerRadius = 10 - - label.snp.makeConstraints { - $0.top.leading.equalToSuperview().inset(20) + label.snp.makeConstraints { make in + make.top.leading.equalToSuperview().inset(20) } - linkLabel.snp.makeConstraints { - $0.top.equalTo(label.snp.bottom).offset(10) - $0.leading.trailing.equalToSuperview().inset(20) + linkLabel.snp.makeConstraints { make in + make.top.equalTo(label.snp.bottom).offset(10) + make.leading.trailing.equalToSuperview().inset(20) } - cancelButton.snp.makeConstraints { - $0.trailing.equalTo(openAppButton.snp.leading).offset(-20) - $0.centerY.equalTo(openAppButton.snp.centerY) + cancelButton.snp.makeConstraints { make in + make.trailing.equalTo(openAppButton.snp.leading).offset(-20) + make.centerY.equalTo(openAppButton.snp.centerY) } - openAppButton.snp.makeConstraints { - $0.trailing.bottom.equalToSuperview().inset(20) + openAppButton.snp.makeConstraints { make in + make.trailing.bottom.equalToSuperview().inset(20) } } @@ -114,7 +116,7 @@ class ShareExtensionBackGroundView: UIView { linkLabel.text = text } - // MARK: - Actions + // MARK: - Action Functions @objc func cancelButtonTapped() { delegate?.didTapCancel() diff --git a/iBox/Sources/Base/BaseNavigationBarViewController.swift b/iBox/Sources/Base/BaseViewController.swift similarity index 55% rename from iBox/Sources/Base/BaseNavigationBarViewController.swift rename to iBox/Sources/Base/BaseViewController.swift index e47308e..35fdaca 100644 --- a/iBox/Sources/Base/BaseNavigationBarViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -1,5 +1,5 @@ // -// BaseNavigationBarViewController.swift +// BaseViewController.swift // iBox // // Created by jiyeon on 1/3/24. @@ -16,27 +16,17 @@ class NavigationBar: UIView { var moreButton = UIButton() } -protocol BaseNavigationBarViewControllerProtocol { - var statusBar: UIView { get } - var navigationBar: NavigationBar { get } - var contentView: BaseView { get } - +protocol BaseViewControllerProtocol { func setupNavigationBar() - func setNavigationBarBackgroundColor(_ color: UIColor?) - func setNavigationBarTintColor(_ color: UIColor) - func setNavigationBarHidden(_ hidden: Bool) - func setNavigationBarBackButtonHidden(_ hidden: Bool) - func setNavigationBarMenuButtonHidden(_ hidden: Bool) - func setNavigationBarAddButtonAction(_ selector: Selector) - func setNavigationBarMoreButtonAction(_ selector: Selector) - func setNavigationBarTitleLabelText(_ text: String?) - func setNavigationBarTitleLabelFont(_ font: UIFont?) - func setNavigationBarTitleLabelTextColor(_ color: UIColor?) } -class BaseNavigationBarViewController: UIViewController, BaseNavigationBarViewControllerProtocol { - - // MARK: - UI +class BaseViewController: UIViewController { + + let backgroundColor: UIColor = .backgroundColor + let tintColor: UIColor = .label + let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) + + // MARK: - UI Components let statusBar = UIView() @@ -52,26 +42,83 @@ class BaseNavigationBarViewController: UIViewController, BaseNav $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) } - let contentView: BaseView = View() - - // MARK: - properties + let contentView: UIView = View() - let backgroundColor: UIColor = .backgroundColor - let tintColor: UIColor = .label - let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) - - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - configureUI() - setupNavigationBar() - setupProperties() + setupHierarchy() + setupLayout() + setupProperty() } - // MARK: - BaseNavigationBarViewControllerProtocol + // MARK: - Setup Methods - func setupNavigationBar() {} + private func setupProperty() { + view.backgroundColor = .backgroundColor + navigationController?.setNavigationBarHidden(true, animated: false) + + setNavigationBarTintColor(tintColor) + setNavigationBarTitleLabelFont(titleFont) + setNavigationBarBackButtonHidden(true) + setNavigationBarMenuButtonHidden(true) + + navigationBar.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) + } + + private func setupHierarchy() { + view.addSubview(statusBar) + view.addSubview(navigationBar) + navigationBar.addSubview(navigationBar.backButton) + navigationBar.addSubview(navigationBar.titleLabel) + navigationBar.addSubview(navigationBar.addButton) + navigationBar.addSubview(navigationBar.moreButton) + view.addSubview(contentView) + } + + private func setupLayout() { + statusBar.snp.makeConstraints { make in + make.leading.top.trailing.equalToSuperview() + make.bottom.equalTo(view.safeAreaLayoutGuide.snp.top) + } + + navigationBar.snp.makeConstraints { make in + make.top.equalTo(statusBar.snp.bottom) + make.leading.trailing.equalToSuperview() + make.height.equalTo(60) + } + + navigationBar.backButton.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(24) + } + + navigationBar.titleLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + navigationBar.moreButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(24) + } + + navigationBar.addButton.snp.makeConstraints { make in + make.trailing.equalTo(navigationBar.moreButton.snp.leading).offset(-20) + make.centerY.equalToSuperview() + make.width.height.equalTo(24) + } + + contentView.snp.makeConstraints { make in + make.top.equalTo(statusBar.snp.bottom).offset(60) + make.leading.trailing.equalToSuperview() + make.bottom.equalToSuperview().inset(tabBarController?.tabBar.frame.height ?? 0) + } + } + + // MARK: - BaseViewController func setNavigationBarBackgroundColor(_ color: UIColor?) { statusBar.backgroundColor = color @@ -88,16 +135,16 @@ class BaseNavigationBarViewController: UIViewController, BaseNav navigationBar.isHidden = hidden if hidden { - contentView.snp.remakeConstraints { - $0.top.equalTo(statusBar.snp.bottom) - $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) - $0.bottom.equalToSuperview() + contentView.snp.remakeConstraints { make in + make.top.equalTo(statusBar.snp.bottom) + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.bottom.equalToSuperview() } } else { - contentView.snp.remakeConstraints { - $0.top.equalTo(statusBar.snp.bottom).offset(60) - $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) - $0.bottom.equalToSuperview() + contentView.snp.remakeConstraints { make in + make.top.equalTo(statusBar.snp.bottom).offset(60) + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.bottom.equalToSuperview() } } } @@ -106,13 +153,13 @@ class BaseNavigationBarViewController: UIViewController, BaseNav navigationBar.backButton.isHidden = hidden if hidden { - navigationBar.titleLabel.snp.remakeConstraints { - $0.left.equalToSuperview().inset(30) - $0.centerY.equalToSuperview() + navigationBar.titleLabel.snp.remakeConstraints { make in + make.leading.equalToSuperview().inset(30) + make.centerY.equalToSuperview() } } else { - navigationBar.titleLabel.snp.remakeConstraints { - $0.center.equalToSuperview() + navigationBar.titleLabel.snp.remakeConstraints { make in + make.center.equalToSuperview() } } } @@ -142,68 +189,7 @@ class BaseNavigationBarViewController: UIViewController, BaseNav navigationBar.titleLabel.textColor = color } - // MARK: - functions - - private func configureUI() { - view.backgroundColor = .backgroundColor - view.addSubview(statusBar) - view.addSubview(navigationBar) - navigationBar.addSubview(navigationBar.backButton) - navigationBar.addSubview(navigationBar.titleLabel) - navigationBar.addSubview(navigationBar.addButton) - navigationBar.addSubview(navigationBar.moreButton) - view.addSubview(contentView) - - statusBar.snp.makeConstraints { - $0.left.top.right.equalToSuperview() - $0.bottom.equalTo(view.safeAreaLayoutGuide.snp.top) - } - - navigationBar.snp.makeConstraints { - $0.top.equalTo(statusBar.snp.bottom) - $0.left.right.equalToSuperview() - $0.height.equalTo(60) - } - - navigationBar.backButton.snp.makeConstraints { - $0.left.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(24) - } - - navigationBar.titleLabel.snp.makeConstraints { - $0.center.equalToSuperview() - } - - navigationBar.moreButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(24) - } - - navigationBar.addButton.snp.makeConstraints { - $0.right.equalTo(navigationBar.moreButton.snp.left).offset(-20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(24) - } - - contentView.snp.makeConstraints { - $0.top.equalTo(statusBar.snp.bottom).offset(60) - $0.left.right.equalToSuperview() - $0.bottom.equalToSuperview().inset(tabBarController?.tabBar.frame.height ?? 0) - } - } - - private func setupProperties() { - navigationController?.setNavigationBarHidden(true, animated: false) - - setNavigationBarTintColor(tintColor) - setNavigationBarTitleLabelFont(titleFont) - setNavigationBarBackButtonHidden(true) - setNavigationBarMenuButtonHidden(true) - - navigationBar.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) - } + // MARK: - Action Functions @objc func backButtonTapped() { navigationController?.popViewController(animated: true) diff --git a/iBox/Sources/Base/BaseBottomSheetViewController.swift b/iBox/Sources/Base/BottomSheetViewController.swift similarity index 65% rename from iBox/Sources/Base/BaseBottomSheetViewController.swift rename to iBox/Sources/Base/BottomSheetViewController.swift index a045b2a..97be2e3 100644 --- a/iBox/Sources/Base/BaseBottomSheetViewController.swift +++ b/iBox/Sources/Base/BottomSheetViewController.swift @@ -1,5 +1,5 @@ // -// BaseBottomSheetViewController.swift +// BottomSheetViewController.swift // iBox // // Created by jiyeon on 1/5/24. @@ -9,13 +9,11 @@ import UIKit import SnapKit -class BaseBottomSheetViewController: UIViewController { - - // MARK: - properties +class BottomSheetViewController: UIViewController { var bottomSheetHeight: CGFloat - // MARK: - UI + // MARK: - UI Components let dimmedView = UIView().then { $0.backgroundColor = .clear @@ -34,7 +32,7 @@ class BaseBottomSheetViewController: UIViewController { $0.backgroundColor = .darkGray } - // MARK: - initializer + // MARK: - Initializer init(bottomSheetHeight: CGFloat) { self.bottomSheetHeight = bottomSheetHeight @@ -46,12 +44,13 @@ class BaseBottomSheetViewController: UIViewController { fatalError("init(coder:) has not been implemented") } - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - configureUI() - setupGestureRecognizer() + setupProperty() + setupHierarchy() + setupLayout() } override func viewDidAppear(_ animated: Bool) { @@ -59,43 +58,45 @@ class BaseBottomSheetViewController: UIViewController { showBottomSheets() } - // MARK: - configure UI + // MARK: - Setup Methods - private func configureUI() { + private func setupProperty() { + // TapGesture + let dimmedTap = UITapGestureRecognizer(target: self, action: #selector(dimmedViewTapped)) + dimmedView.addGestureRecognizer(dimmedTap) + + // SwipeGesture + let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(panGesture)) + swipeGesture.direction = .down + view.addGestureRecognizer(swipeGesture) + } + + private func setupHierarchy() { view.addSubview(dimmedView) view.addSubview(sheetView) sheetView.addSubview(indicator) - - dimmedView.snp.makeConstraints { - $0.edges.equalToSuperview() + } + + private func setupLayout() { + dimmedView.snp.makeConstraints { make in + make.edges.equalToSuperview() } - sheetView.snp.makeConstraints { - $0.top.equalTo(view.snp.bottom) - $0.left.right.equalToSuperview() - $0.height.equalTo(bottomSheetHeight) + sheetView.snp.makeConstraints { make in + make.top.equalTo(view.snp.bottom) + make.leading.trailing.equalToSuperview() + make.height.equalTo(bottomSheetHeight) } - indicator.snp.makeConstraints { - $0.width.equalTo(40) - $0.height.equalTo(4) - $0.top.equalToSuperview().inset(10) - $0.centerX.equalToSuperview() + indicator.snp.makeConstraints { make in + make.width.equalTo(40) + make.height.equalTo(4) + make.top.equalToSuperview().inset(10) + make.centerX.equalToSuperview() } } - // MARK: - functions - - private func setupGestureRecognizer() { - // TapGesture - let dimmedTap = UITapGestureRecognizer(target: self, action: #selector(dimmedViewTapped)) - dimmedView.addGestureRecognizer(dimmedTap) - - // SwipeGesture - let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(panGesture)) - swipeGesture.direction = .down - view.addGestureRecognizer(swipeGesture) - } + // MARK: - Action Functions @objc private func dimmedViewTapped(_ tapRecognizer: UITapGestureRecognizer) { hideBottomSheets() @@ -104,18 +105,18 @@ class BaseBottomSheetViewController: UIViewController { @objc private func panGesture(_ recognizer: UISwipeGestureRecognizer) { if recognizer.state == .ended { switch recognizer.direction { - case .down: - hideBottomSheets() - default: - break + case .down: hideBottomSheets() + default: break } } } + // MARK: - Bottom Sheet Action + private func showBottomSheets() { - sheetView.snp.remakeConstraints { - $0.left.bottom.right.equalToSuperview() - $0.height.equalTo(bottomSheetHeight) + sheetView.snp.remakeConstraints { make in + make.leading.bottom.trailing.equalToSuperview() + make.height.equalTo(bottomSheetHeight) } UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { self.dimmedView.backgroundColor = .dimmedViewColor @@ -124,10 +125,10 @@ class BaseBottomSheetViewController: UIViewController { } private func hideBottomSheets() { - sheetView.snp.remakeConstraints { - $0.top.equalTo(view.snp.bottom) - $0.left.right.equalToSuperview() - $0.height.equalTo(bottomSheetHeight) + sheetView.snp.remakeConstraints { make in + make.top.equalTo(view.snp.bottom) + make.leading.trailing.equalToSuperview() + make.height.equalTo(bottomSheetHeight) } UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn, animations: { self.dimmedView.backgroundColor = .clear diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 48baf53..46acd56 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -9,12 +9,33 @@ import UIKit import SnapKit -class AddBookmarkBottomSheetView: BaseView { +class AddBookmarkBottomSheetView: UIView { - // MARK: - configure UI + // MARK: - Initializer - override func configureUI() { + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { backgroundColor = .backgroundColor } + private func setupHierarchy() { + + } + + private func setupLayout() { + + } + } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index 25f09f6..70a49ea 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -7,6 +7,6 @@ import UIKit -class AddBookmarkBottomSheetViewController: BaseBottomSheetViewController { +class AddBookmarkBottomSheetViewController: BottomSheetViewController { } diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index 69b346f..0300221 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -10,26 +10,26 @@ import UIKit import SnapKit class BoxListCell: UITableViewCell { + var viewModel: BoxListCellViewModel? static let reuseIdentifier = "boxListCell" - private lazy var cellImageView = { - let view = UIImageView() - view.image = UIImage(systemName: "ellipsis.rectangle.fill") - view.tintColor = .label - view.contentMode = .scaleAspectFit - return view - }() + // MARK: - UI Components + + private let cellImageView = UIImageView().then { + $0.image = UIImage(systemName: "ellipsis.rectangle.fill") + $0.tintColor = .label + $0.contentMode = .scaleAspectFit + } - private lazy var label = { - let label = UILabel() - return label - }() + private let label = UILabel() + + // MARK: - Initializer override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - backgroundColor = .tableViewBackgroundColor - + setupProperty() + setupHierarchy() setupLayout() } @@ -37,22 +37,33 @@ class BoxListCell: UITableViewCell { fatalError("init(coder:) has not been implemented") } - private func setupLayout() { + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .tableViewBackgroundColor + } + + private func setupHierarchy() { contentView.addSubview(cellImageView) + contentView.addSubview(label) + } + + private func setupLayout() { cellImageView.snp.makeConstraints { make in make.leading.equalToSuperview().inset(20) make.top.bottom.equalToSuperview().inset(10) make.width.equalTo(30) } - contentView.addSubview(label) label.snp.makeConstraints { make in make.top.trailing.bottom.equalToSuperview() make.leading.equalTo(cellImageView.snp.trailing).offset(10) } } - func configure(_ viewModel: BoxListCellViewModel) { + // MARK: - Bind ViewModel + + func bindViewModel(_ viewModel: BoxListCellViewModel) { self.viewModel = viewModel label.text = viewModel.name } diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index de27c07..cc05316 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -15,19 +15,38 @@ protocol BoxListViewDelegate: AnyObject { func pushViewController(type: EditType) } -class BoxListView: BaseView { +class BoxListView: UIView { + var viewModel: BoxListViewModel? private var boxListDataSource: UITableViewDiffableDataSource! weak var delegate: BoxListViewDelegate? - private var cancellables = Set() + // MARK : - UI Components + + private let backgroundView = UIView().then { + $0.clipsToBounds = true + $0.layer.cornerRadius = 20 + $0.backgroundColor = .tableViewBackgroundColor + } + + private let tableView = UITableView().then { + $0.register(BoxListCell.self, forCellReuseIdentifier: BoxListCell.reuseIdentifier) + + $0.sectionHeaderTopPadding = 0 + $0.clipsToBounds = true + $0.layer.cornerRadius = 20 + $0.backgroundColor = .clear + $0.separatorColor = .clear + $0.rowHeight = 50 + } + + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) - - backgroundColor = .backgroundColor - viewModel = BoxListViewModel() - + setupProperty() + setupHierarchy() setupLayout() configureDataSource() bindViewModel() @@ -38,47 +57,36 @@ class BoxListView: BaseView { fatalError("init(coder:) has not been implemented") } - private lazy var backgroundView = { - let view = UIView() - view.clipsToBounds = true - view.layer.cornerRadius = 20 - view.backgroundColor = .tableViewBackgroundColor - - view.addSubview(tableView) - tableView.snp.makeConstraints { make in - make.top.bottom.equalToSuperview().offset(10) - make.leading.trailing.equalToSuperview() - } - return view - }() + // MARK: - Setup Methods - private lazy var tableView = { - let tableView = UITableView() + private func setupProperty() { + backgroundColor = .backgroundColor + viewModel = BoxListViewModel() tableView.delegate = self - tableView.register(BoxListCell.self, forCellReuseIdentifier: BoxListCell.reuseIdentifier) - - tableView.sectionHeaderTopPadding = 0 - tableView.clipsToBounds = true - tableView.layer.cornerRadius = 20 - tableView.backgroundColor = .clear - tableView.separatorColor = .clear - tableView.rowHeight = 50 - return tableView - }() + } - private func setupLayout() { + private func setupHierarchy() { addSubview(backgroundView) + backgroundView.addSubview(tableView) + } + + private func setupLayout() { backgroundView.snp.makeConstraints { make in make.top.equalTo(safeAreaLayoutGuide).inset(10) make.leading.trailing.bottom.equalTo(safeAreaLayoutGuide).inset(20) } + + tableView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview().offset(10) + make.leading.trailing.equalToSuperview() + } } private func configureDataSource() { boxListDataSource = UITableViewDiffableDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in guard let self, let viewModel = self.viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } - cell.configure(viewModel.viewModel(at: indexPath)) + cell.bindViewModel(viewModel.viewModel(at: indexPath)) return cell } } @@ -153,5 +161,5 @@ extension BoxListView: UITableViewDelegate { let webName = viewModel.boxList[indexPath.section].boxListCellViewModels[indexPath.row].name delegate?.didSelectWeb(at: webUrl, withName: webName) } + } - diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 014cd0e..0972f1e 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -7,8 +7,10 @@ import UIKit -class BoxListViewController: BaseNavigationBarViewController { +class BoxListViewController: BaseViewController, BaseViewControllerProtocol { + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() @@ -17,13 +19,17 @@ class BoxListViewController: BaseNavigationBarViewController { contentView.delegate = self } - override func setupNavigationBar() { + // MARK: - BaseViewControllerProtocol + + func setupNavigationBar() { setNavigationBarTitleLabelText("iBox") setNavigationBarMenuButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) setNavigationBarMoreButtonAction(#selector(moreButtonTapped)) } + // MARK: - Action Functions + @objc private func addButtonTapped() { let addBookmarkBottomSheetViewController = AddBookmarkBottomSheetViewController(bottomSheetHeight: 200) present(addBookmarkBottomSheetViewController, animated: false) @@ -38,6 +44,7 @@ class BoxListViewController: BaseNavigationBarViewController { } extension BoxListViewController: BoxListViewDelegate { + func didSelectWeb(at url: URL, withName name: String) { let viewController = PreloadedWebViewController(selectedWebsite: url) viewController.title = name @@ -52,4 +59,5 @@ extension BoxListViewController: BoxListViewDelegate { navigationController?.pushViewController(EditBookmarkViewController(), animated: true) } } + } diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift index 3a811d9..380aa6d 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditView.swift @@ -9,7 +9,7 @@ import UIKit import SnapKit -class EditView: BaseView { +class EditView: UIView { var delegate: EditViewDelegate? diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift index b5ae2f5..e3c8e7b 100644 --- a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift +++ b/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift @@ -11,10 +11,12 @@ protocol EditViewDelegate { func pushViewController(type: EditType) } -class EditViewController: BaseBottomSheetViewController { +class EditViewController: BottomSheetViewController { var delegate: BoxListViewDelegate? + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() sheetView.delegate = self diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift index acefeca..0288be1 100644 --- a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift @@ -7,6 +7,6 @@ import UIKit -class EditBookmarkView: BaseView { +class EditBookmarkView: UIView { } diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift index 0717815..0077005 100644 --- a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift @@ -7,7 +7,7 @@ import UIKit -class EditBookmarkViewController: BaseNavigationBarViewController { +class EditBookmarkViewController: BaseViewController, BaseViewControllerProtocol { // MARK: - Life Cycle @@ -16,9 +16,9 @@ class EditBookmarkViewController: BaseNavigationBarViewController { +class EditFolderViewController: BaseViewController, BaseViewControllerProtocol { // MARK: - Life Cycle @@ -18,7 +18,7 @@ class EditFolderViewController: BaseNavigationBarViewController // MARK: - BaseNavigationBarViewControllerProtocol - override func setupNavigationBar() { + func setupNavigationBar() { setNavigationBarTitleLabelText("폴더 편집") setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) setNavigationBarBackButtonHidden(false) diff --git a/iBox/Sources/Presenter/BoxList/FolderButton.swift b/iBox/Sources/Presenter/BoxList/FolderButton.swift index 1f51c70..6f667b2 100644 --- a/iBox/Sources/Presenter/BoxList/FolderButton.swift +++ b/iBox/Sources/Presenter/BoxList/FolderButton.swift @@ -10,34 +10,32 @@ import UIKit import SnapKit class FolderButton: UIButton { + private var isOpen: Bool = true - private lazy var folderImageView = { - let imageView = UIImageView() - imageView.image = UIImage(systemName: "folder.fill") - imageView.contentMode = .scaleAspectFit - return imageView - }() + // MARK: - UI Components + + private let folderImageView = UIImageView().then { + $0.image = UIImage(systemName: "folder.fill") + $0.contentMode = .scaleAspectFit + } + + private let folderNameLabel = UILabel().then { + $0.textColor = .label + $0.font = .systemFont(ofSize: 18, weight: .semibold) + } - private lazy var folderNameLabel = { - let label = UILabel() - label.textColor = .label - label.font = .systemFont(ofSize: 18, weight: .semibold) - return label - }() + private let openCloseImageView = UIImageView().then { + $0.tintColor = .tertiaryLabel + } - private lazy var openCloseImageView = { - let imageView = UIImageView() - imageView.tintColor = .tertiaryLabel - imageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") - return imageView - }() + // MARK: - Initializer init(isOpen: Bool) { self.isOpen = isOpen super.init(frame: .zero) - backgroundColor = .tableViewBackgroundColor - + setupProperty() + setupHierarchy() setupLayout() } @@ -45,21 +43,31 @@ class FolderButton: UIButton { fatalError("init(coder:) has not been implemented") } - private func setupLayout() { + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .tableViewBackgroundColor + openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") + } + + private func setupHierarchy() { addSubview(folderImageView) + addSubview(folderNameLabel) + addSubview(openCloseImageView) + } + + private func setupLayout() { folderImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() make.width.height.equalTo(30) make.leading.equalToSuperview().offset(20) } - addSubview(folderNameLabel) folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) } - addSubview(openCloseImageView) openCloseImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() make.trailing.equalToSuperview().offset(-20) diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Presenter/Favorite/FavoriteView.swift index aff2ee5..f088c37 100644 --- a/iBox/Sources/Presenter/Favorite/FavoriteView.swift +++ b/iBox/Sources/Presenter/Favorite/FavoriteView.swift @@ -14,10 +14,12 @@ class FavoriteView: PreloadedWebView { private lazy var webView = WebViewPreloader.shared.getFavoriteView() + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) - backgroundColor = .backgroundColor - + setupProperty() + setupHierarchy() setupLayout() } @@ -25,9 +27,19 @@ class FavoriteView: PreloadedWebView { fatalError("init(coder:) has not been implemented") } - private func setupLayout() { + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .backgroundColor + } + + private func setupHierarchy() { guard let webView else { return } addSubview(webView) + } + + private func setupLayout() { + guard let webView else { return } webView.snp.makeConstraints { make in make.edges.equalToSuperview() } diff --git a/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift b/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift index 8fd3527..0007815 100644 --- a/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift @@ -7,19 +7,22 @@ import UIKit -class FavoriteViewController: BaseNavigationBarViewController { +class FavoriteViewController: BaseViewController, BaseViewControllerProtocol { + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() - - guard let _ = contentView as? FavoriteView else { return } + setupNavigationBar() } override func viewDidDisappear(_ animated: Bool) { WebViewPreloader.shared.resetFavoriteView() } - override func setupNavigationBar() { + // MARK: - BaseViewControllerProtocol + + func setupNavigationBar() { setNavigationBarHidden(true) } diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Presenter/MainTabBarController.swift index e1747c7..a5564be 100644 --- a/iBox/Sources/Presenter/MainTabBarController.swift +++ b/iBox/Sources/Presenter/MainTabBarController.swift @@ -9,6 +9,8 @@ import UIKit class MainTabBarController: UITabBarController { + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .backgroundColor @@ -17,6 +19,8 @@ class MainTabBarController: UITabBarController { setupTabBarAppearance() } + // MARK: - Setup Methods + private func setupTabBar() { viewControllers = [ setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift index 8e4a4fe..4364834 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift @@ -11,8 +11,6 @@ import SnapKit class HomeTabSelectorCell: UITableViewCell { - // MARK: - Properties - static let reuseIdentifier = "MainTabCell" // MARK: - UI Components @@ -29,6 +27,8 @@ class HomeTabSelectorCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + setupProperty() + setupHierarchy() setupLayout() } @@ -38,22 +38,26 @@ class HomeTabSelectorCell: UITableViewCell { // MARK: - Setup Methods - private func setupLayout() { + private func setupProperty() { backgroundColor = .clear selectionStyle = .none - + } + + private func setupHierarchy() { addSubview(titleLabel) addSubview(selectButton) - - titleLabel.snp.makeConstraints { - $0.left.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() + } + + private func setupLayout() { + titleLabel.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() } - selectButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(20) + selectButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(20) } } diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift index 511d1f8..c8ba4df 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift @@ -8,9 +8,7 @@ import Combine import UIKit -class HomeTabSelectorView: BaseView { - - // MARK: - Properties +class HomeTabSelectorView: UIView { private var viewModel: HomeTabSelectorViewModel? private var cancellables = Set() @@ -28,6 +26,7 @@ class HomeTabSelectorView: BaseView { override init(frame: CGRect) { super.init(frame: frame) setupProperty() + setupHierarchy() setupLayout() } @@ -42,11 +41,13 @@ class HomeTabSelectorView: BaseView { tableView.dataSource = self } - private func setupLayout() { + private func setupHierarchy() { addSubview(tableView) - - tableView.snp.makeConstraints { - $0.edges.equalToSuperview() + } + + private func setupLayout() { + tableView.snp.makeConstraints { make in + make.edges.equalToSuperview() } } @@ -66,12 +67,10 @@ class HomeTabSelectorView: BaseView { extension HomeTabSelectorView: UITableViewDelegate { - // 셀의 높이 설정 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 55 } - // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } viewModel.selectedIndex = indexPath.row diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift index d6c7bab..d2c60c6 100644 --- a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift +++ b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift @@ -7,25 +7,23 @@ import UIKit -class HomeTabSelectorViewController: BaseNavigationBarViewController { - - // MARK: - Properties +class HomeTabSelectorViewController: BaseViewController, BaseViewControllerProtocol { private let viewModel = HomeTabSelectorViewModel() - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setupNavigationBar() // 얘는 왜 여기에 적어줘야 전부 다 적용이 될까 ..? 🧐 + setupNavigationBar() guard let contentView = contentView as? HomeTabSelectorView else { return } contentView.bindViewModel(viewModel) } - // MARK: - BaseNavigationBarViewControllerProtocol + // MARK: - BaseViewControllerProtocol - override func setupNavigationBar() { + func setupNavigationBar() { setNavigationBarTitleLabelText("홈화면 설정하기") setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) setNavigationBarBackButtonHidden(false) diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift index a72402e..a8d29ad 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift @@ -64,24 +64,24 @@ class MyPageItemCell: UITableViewCell { } private func setupLayout() { - titleLabel.snp.makeConstraints { - $0.left.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() + titleLabel.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() } - switchControl.snp.makeConstraints { - $0.right.equalToSuperview().inset(30) - $0.centerY.equalToSuperview() + switchControl.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(30) + make.centerY.equalToSuperview() } - descriptionLabel.snp.makeConstraints { - $0.right.equalToSuperview().inset(30) - $0.centerY.equalToSuperview() + descriptionLabel.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(30) + make.centerY.equalToSuperview() } - chevronButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() + chevronButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() } } diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/Presenter/MyPage/MyPageView.swift index 00ae02b..8e75fd9 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageView.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageView.swift @@ -8,7 +8,7 @@ import Combine import UIKit -final class MyPageView: BaseView { +final class MyPageView: UIView { var delegate: MyPageViewDelegate? private var viewModel: MyPageViewModel? @@ -80,31 +80,31 @@ final class MyPageView: BaseView { } private func setupLayout() { - profileView.snp.makeConstraints { - $0.left.top.right.equalToSuperview() - $0.height.equalTo(90) + profileView.snp.makeConstraints { make in + make.leading.top.trailing.equalToSuperview() + make.height.equalTo(90) } - profileImageView.snp.makeConstraints { - $0.left.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(50) + profileImageView.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(50) } - profileLabel.snp.makeConstraints { - $0.left.equalTo(profileImageView.snp.right).offset(10) - $0.centerY.equalToSuperview() + profileLabel.snp.makeConstraints { make in + make.leading.equalTo(profileImageView.snp.trailing).offset(10) + make.centerY.equalToSuperview() } - chevronButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(30) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(20) + chevronButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(30) + make.centerY.equalToSuperview() + make.width.height.equalTo(20) } - tableView.snp.makeConstraints { - $0.top.equalTo(profileView.snp.bottom).offset(10) - $0.left.bottom.right.equalToSuperview() + tableView.snp.makeConstraints { make in + make.top.equalTo(profileView.snp.bottom).offset(10) + make.leading.bottom.trailing.equalToSuperview() } } diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift index 1c6a0f1..6b8e56c 100644 --- a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Presenter/MyPage/MyPageViewController.swift @@ -12,7 +12,7 @@ protocol MyPageViewDelegate { func pushViewController(_ viewController: UIViewController) } -final class MyPageViewController: BaseNavigationBarViewController { +final class MyPageViewController: BaseViewController, BaseViewControllerProtocol { private let viewModel = MyPageViewModel() @@ -20,6 +20,8 @@ final class MyPageViewController: BaseNavigationBarViewController { override func viewDidLoad() { super.viewDidLoad() + setupNavigationBar() + guard let contentView = contentView as? MyPageView else { return } contentView.delegate = self contentView.bindViewModel(viewModel) @@ -30,9 +32,9 @@ final class MyPageViewController: BaseNavigationBarViewController { viewModel.input.send(.viewWillAppear) } - // MARK: - BaseNavigationBarViewControllerProtocol + // MARK: - BaseViewControllerProtocol - override func setupNavigationBar() { + func setupNavigationBar() { setNavigationBarTitleLabelText("마이 페이지") } diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift b/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift index de9b309..c209b83 100644 --- a/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift +++ b/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift @@ -7,11 +7,6 @@ import UIKit -class ProfileView: BaseView { - - // MARK: - BaseViewProtocol - - override func configureUI() { - } +class ProfileView: UIView { } diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift b/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift index 20495b5..a60cdef 100644 --- a/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift +++ b/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift @@ -7,18 +7,18 @@ import UIKit -class ProfileViewController: BaseNavigationBarViewController { +class ProfileViewController: BaseViewController, BaseViewControllerProtocol { - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setupNavigationBar() // 얘는 왜 여기에 적어줘야 전부 다 적용이 될까 ..? 🧐 + setupNavigationBar() } - // MARK: - BaseNavigationBarViewControllerProtocol + // MARK: - BaseViewControllerProtocol - override func setupNavigationBar() { + func setupNavigationBar() { setNavigationBarTitleLabelText("내 정보 수정하기") setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) setNavigationBarBackButtonHidden(false) diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift index f9da2f9..653aca1 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift @@ -7,9 +7,11 @@ import UIKit -class ThemeCell: UITableViewCell, BaseViewProtocol { +class ThemeCell: UITableViewCell { - // MARK: - UI + static let reuseIdentifier = "ThemeCell" + + // MARK: - UI Components let themeImageView = UIImageView().then { $0.tintColor = .label @@ -23,48 +25,51 @@ class ThemeCell: UITableViewCell, BaseViewProtocol { $0.configuration = .plain() } - // MARK: - initializer + // MARK: - Initializer override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - configureUI() - selectionStyle = .none + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - // MARK: - BaseViewProtocol + // MARK: - Setup Methods - func configureUI() { + private func setupProperty() { backgroundColor = .clear selectionStyle = .none - + } + + private func setupHierarchy() { addSubview(themeImageView) addSubview(titleLabel) addSubview(selectButton) - - themeImageView.snp.makeConstraints { - $0.left.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(23) + } + + private func setupLayout() { + themeImageView.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(23) } - titleLabel.snp.makeConstraints { - $0.left.equalTo(themeImageView.snp.right).offset(10) - $0.centerY.equalToSuperview() + titleLabel.snp.makeConstraints { make in + make.leading.equalTo(themeImageView.snp.trailing).offset(10) + make.centerY.equalToSuperview() } - selectButton.snp.makeConstraints { - $0.right.equalToSuperview().inset(20) - $0.centerY.equalToSuperview() - $0.width.height.equalTo(20) + selectButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(20) } } - // MARK: - functions - func bind(_ theme: Theme) { titleLabel.text = theme.toString() themeImageView.image = UIImage(systemName: theme.toImageString()) diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift index 65b4a41..3b68fb9 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift @@ -10,17 +10,15 @@ import UIKit import SnapKit -class ThemeView: BaseView { - - // MARK: - Properties +class ThemeView: UIView { private var viewModel: ThemeViewModel? private var cancellables = Set() - // MARK: - UI + // MARK: - UI Components let tableView = UITableView().then { - $0.register(ThemeCell.self, forCellReuseIdentifier: "ThemeCell") + $0.register(ThemeCell.self, forCellReuseIdentifier: ThemeCell.reuseIdentifier) $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 $0.backgroundColor = .clear @@ -30,25 +28,29 @@ class ThemeView: BaseView { override init(frame: CGRect) { super.init(frame: frame) - setupProperties() + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - // MARK: - BaseViewProtocol + // MARK: - Setup Methods - private func setupProperties() { + private func setupProperty() { tableView.delegate = self tableView.dataSource = self } - override func configureUI() { + private func setupHierarchy() { addSubview(tableView) - - tableView.snp.makeConstraints { - $0.edges.equalToSuperview() + } + + private func setupLayout() { + tableView.snp.makeConstraints { make in + make.edges.equalToSuperview() } } @@ -68,17 +70,28 @@ class ThemeView: BaseView { } -extension ThemeView: UITableViewDelegate, UITableViewDataSource { +extension ThemeView: UITableViewDelegate { + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 55 + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let viewModel = viewModel else { return } + viewModel.selectedIndex = indexPath.row + } + +} + +extension ThemeView: UITableViewDataSource { - // 테이블 뷰의 행 개수 설정 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return Theme.allCases.count } - // 테이블 뷰 셀 구성 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel = viewModel, - let cell = tableView.dequeueReusableCell(withIdentifier: "ThemeCell") + let cell = tableView.dequeueReusableCell(withIdentifier: ThemeCell.reuseIdentifier) as? ThemeCell else { return UITableViewCell() } let theme = Theme.allCases[indexPath.row] cell.bind(theme) @@ -86,15 +99,4 @@ extension ThemeView: UITableViewDelegate, UITableViewDataSource { return cell } - // 셀의 높이 설정 - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 55 - } - - // 테이블 뷰 셀이 선택되었을 때 실행되는 메서드 - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let viewModel = viewModel else { return } - viewModel.selectedIndex = indexPath.row - } - } diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift index ca443fc..ac645c8 100644 --- a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift +++ b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift @@ -7,13 +7,11 @@ import UIKit -class ThemeViewController: BaseNavigationBarViewController { - - // MARK: - properties +class ThemeViewController: BaseViewController, BaseViewControllerProtocol { private let viewModel = ThemeViewModel() - // MARK: - life cycle + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() @@ -23,9 +21,9 @@ class ThemeViewController: BaseNavigationBarViewController { contentView.bineViewModel(viewModel) } - // MARK: - BaseNavigationBarViewControllerProtocol + // MARK: - BaseViewControllerProtocol - override func setupNavigationBar() { + func setupNavigationBar() { setNavigationBarTitleLabelText("다크 모드 설정") setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) setNavigationBarBackButtonHidden(false) diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift index 31825b4..fb260fb 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebView.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebView.swift @@ -10,15 +10,20 @@ import WebKit import SnapKit -class PreloadedWebView: BaseView { +class PreloadedWebView: UIView { + var selectedWebsite: URL? { didSet { getWebView() } } + // MARK: - UI Components + private var webView: WKWebView? + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) backgroundColor = .backgroundColor diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift index 36645ba..9286992 100644 --- a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift +++ b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift @@ -7,9 +7,12 @@ import UIKit -class PreloadedWebViewController: BaseNavigationBarViewController { +class PreloadedWebViewController: BaseViewController, BaseViewControllerProtocol { + var selectedWebsite: URL + // MARK: - Initializer + init(selectedWebsite: URL) { self.selectedWebsite = selectedWebsite super.init(nibName: nil, bundle: nil) @@ -19,6 +22,8 @@ class PreloadedWebViewController: BaseNavigationBarViewController { +class WebViewController: BaseViewController, BaseViewControllerProtocol { + var selectedWebsite: String? + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .backgroundColor @@ -19,7 +22,9 @@ class WebViewController: BaseNavigationBarViewController { contentView.selectedWebsite = selectedWebsite } - override func setupNavigationBar() { + // MARK: - BaseViewControllerProtocol + + func setupNavigationBar() { setNavigationBarHidden(true) } From 043dafaa498f783769e4ea04dfa43269b0671616 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sat, 2 Mar 2024 18:16:22 +0900 Subject: [PATCH 071/370] =?UTF-8?q?feat:=20UIView=20=EA=B5=AC=EC=84=B1=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/ShareExtensionBackGroundView.swift | 9 +++---- .../EditBookmark/EditBookmarkView.swift | 27 +++++++++++++++++++ .../BoxList/EditFolder/EditFolderView.swift | 27 +++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift index e77a4c9..abf5c48 100644 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -65,7 +65,6 @@ class ShareExtensionBackGroundView: UIView { setupProperty() setupHierarchy() setupLayout() - setupButtonAction() } required init?(coder: NSCoder) { @@ -78,6 +77,9 @@ class ShareExtensionBackGroundView: UIView { backgroundColor = .systemBackground clipsToBounds = true layer.cornerRadius = 10 + + cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) + openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) } private func setupHierarchy() { @@ -107,11 +109,6 @@ class ShareExtensionBackGroundView: UIView { } } - private func setupButtonAction() { - cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) - openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) - } - func updateLinkLabel(with text: String) { linkLabel.text = text } diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift index 0288be1..d814b41 100644 --- a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift @@ -9,4 +9,31 @@ import UIKit class EditBookmarkView: UIView { + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .backgroundColor + } + + private func setupHierarchy() { + + } + + private func setupLayout() { + + } + } diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift index ee09be7..f106b5a 100644 --- a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift +++ b/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift @@ -9,4 +9,31 @@ import UIKit class EditFolderView: UIView { + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .backgroundColor + } + + private func setupHierarchy() { + + } + + private func setupLayout() { + + } + } From 772c275ca3dcd2902bfad8a0c4be5d10812932d8 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 18:32:30 +0900 Subject: [PATCH 072/370] feat: add assets --- .../42box3/42box_1.imageset/42box_1.png | Bin 0 -> 1356 bytes .../42box3/42box_1.imageset/Contents.json | 21 +++++++++++++++++ .../42box3/42box_2.imageset/42box_2.png | Bin 0 -> 1430 bytes .../42box3/42box_2.imageset/Contents.json | 21 +++++++++++++++++ .../42box3/42box_3.imageset/42box_3.png | Bin 0 -> 1494 bytes .../42box3/42box_3.imageset/Contents.json | 21 +++++++++++++++++ .../42box3/42box_4.imageset/42box_4.png | Bin 0 -> 1503 bytes .../42box3/42box_4.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/42box3/Contents.json | 6 +++++ .../42box_oc1.imageset/42box_opend_black.png | Bin 0 -> 1802 bytes .../42box_oc/42box_oc1.imageset/Contents.json | 21 +++++++++++++++++ .../42box_oc2.imageset/42box_closed_black.png | Bin 0 -> 1654 bytes .../42box_oc/42box_oc2.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/42box_oc/Contents.json | 6 +++++ .../42flip/42flip_01.imageset/42flip_01.png | Bin 0 -> 4224 bytes .../42flip/42flip_01.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_010.imageset/42flip_010.png | Bin 0 -> 4151 bytes .../42flip/42flip_010.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_011.imageset/42flip_011.png | Bin 0 -> 4380 bytes .../42flip/42flip_011.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_02.imageset/42flip_02.png | Bin 0 -> 4311 bytes .../42flip/42flip_02.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_03.imageset/42flip_03.png | Bin 0 -> 3937 bytes .../42flip/42flip_03.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_04.imageset/42flip_04.png | Bin 0 -> 3596 bytes .../42flip/42flip_04.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_05.imageset/42flip_05.png | Bin 0 -> 4118 bytes .../42flip/42flip_05.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_06.imageset/42flip_06.png | Bin 0 -> 4262 bytes .../42flip/42flip_06.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_07.imageset/42flip_07.png | Bin 0 -> 4254 bytes .../42flip/42flip_07.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_08.imageset/42flip_08.png | Bin 0 -> 4251 bytes .../42flip/42flip_08.imageset/Contents.json | 20 ++++++++++++++++ .../42flip/42flip_09.imageset/42flip_09.png | Bin 0 -> 3426 bytes .../42flip/42flip_09.imageset/Contents.json | 20 ++++++++++++++++ .../42pack_icon/42flip/42flip/Contents.json | 6 +++++ .../42pack_icon/42flip/Contents.json | 6 +++++ .../Assets.xcassets/42pack_icon/Contents.json | 6 +++++ .../42pack_icon/cat/Contents.json | 6 +++++ .../cat/cat_page0.imageset/Contents.json | 20 ++++++++++++++++ .../cat/cat_page0.imageset/cat0.png | Bin 0 -> 4387 bytes .../cat/cat_page1.imageset/Contents.json | 20 ++++++++++++++++ .../cat/cat_page1.imageset/cat1.png | Bin 0 -> 4423 bytes .../cat/cat_page2.imageset/Contents.json | 20 ++++++++++++++++ .../cat/cat_page2.imageset/cat2.png | Bin 0 -> 4367 bytes .../cat/cat_page3.imageset/Contents.json | 20 ++++++++++++++++ .../cat/cat_page3.imageset/cat3.png | Bin 0 -> 4403 bytes .../cat/cat_page4.imageset/Contents.json | 20 ++++++++++++++++ .../cat/cat_page4.imageset/cat4.png | Bin 0 -> 4338 bytes .../42pack_icon/fox/Contents.json | 6 +++++ .../fox/fox_page0.imageset/Contents.json | 20 ++++++++++++++++ .../fox/fox_page0.imageset/fox0.png | Bin 0 -> 3944 bytes .../fox/fox_page1.imageset/Contents.json | 20 ++++++++++++++++ .../fox/fox_page1.imageset/fox1.png | Bin 0 -> 3950 bytes .../fox/fox_page2.imageset/Contents.json | 20 ++++++++++++++++ .../fox/fox_page2.imageset/fox2.png | Bin 0 -> 3946 bytes .../fox/fox_page3.imageset/Contents.json | 20 ++++++++++++++++ .../fox/fox_page3.imageset/fox3.png | Bin 0 -> 3990 bytes .../fox/fox_page4.imageset/Contents.json | 20 ++++++++++++++++ .../fox/fox_page4.imageset/fox4.png | Bin 0 -> 3900 bytes .../42pack_icon/gam/Contents.json | 6 +++++ .../gam/gam_1.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gam/gam_1.imageset/gam_1.png | Bin 0 -> 7100 bytes .../gam/gam_2.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gam/gam_2.imageset/gam_2.png | Bin 0 -> 7147 bytes .../gam/gam_3.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gam/gam_3.imageset/gam_3.png | Bin 0 -> 7291 bytes .../gam/gam_4.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gam/gam_4.imageset/gam_4.png | Bin 0 -> 6947 bytes .../gam/gam_5.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gam/gam_5.imageset/gam_5.png | Bin 0 -> 6800 bytes .../42pack_icon/gon/Contents.json | 6 +++++ .../gon/gon_1.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gon/gon_1.imageset/gon_1.png | Bin 0 -> 7228 bytes .../gon/gon_2.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gon/gon_2.imageset/gon_2.png | Bin 0 -> 7158 bytes .../gon/gon_3.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gon/gon_3.imageset/gon_3.png | Bin 0 -> 6617 bytes .../gon/gon_4.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gon/gon_4.imageset/gon_4.png | Bin 0 -> 7188 bytes .../gon/gon_5.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gon/gon_5.imageset/gon_5.png | Bin 0 -> 7507 bytes .../42pack_icon/gun/Contents.json | 6 +++++ .../gun/gun_1.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gun/gun_1.imageset/gun_1.png | Bin 0 -> 6413 bytes .../gun/gun_2.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gun/gun_2.imageset/gun_2.png | Bin 0 -> 5862 bytes .../gun/gun_3.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gun/gun_3.imageset/gun_3.png | Bin 0 -> 6110 bytes .../gun/gun_4.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gun/gun_4.imageset/gun_4.png | Bin 0 -> 6610 bytes .../gun/gun_5.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/gun/gun_5.imageset/gun_5.png | Bin 0 -> 6727 bytes .../42pack_icon/lee/Contents.json | 6 +++++ .../lee/lee_1.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/lee/lee_1.imageset/lee_1.png | Bin 0 -> 7149 bytes .../lee/lee_2.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/lee/lee_2.imageset/lee_2.png | Bin 0 -> 7409 bytes .../lee/lee_3.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/lee/lee_3.imageset/lee_3.png | Bin 0 -> 7445 bytes .../lee/lee_4.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/lee/lee_4.imageset/lee_4.png | Bin 0 -> 7031 bytes .../lee/lee_5.imageset/Contents.json | 21 +++++++++++++++++ .../42pack_icon/lee/lee_5.imageset/lee_5.png | Bin 0 -> 6605 bytes .../42pack_icon/sitting_fox/Contents.json | 6 +++++ .../sitting_fox0.imageset/Contents.json | 21 +++++++++++++++++ .../sitting_fox0.imageset/sitting_fox0.png | Bin 0 -> 3816 bytes .../sitting_fox1.imageset/Contents.json | 21 +++++++++++++++++ .../sitting_fox1.imageset/sitting_fox1.png | Bin 0 -> 3673 bytes .../sitting_fox2.imageset/Contents.json | 21 +++++++++++++++++ .../sitting_fox2.imageset/sitting_fox2.png | Bin 0 -> 3765 bytes .../sitting_fox3.imageset/Contents.json | 21 +++++++++++++++++ .../sitting_fox3.imageset/sitting_fox3.png | Bin 0 -> 3673 bytes .../Logo/1024.imageset/1024 1.png | Bin 0 -> 193380 bytes .../Logo/1024.imageset/1024.png | Bin 0 -> 193380 bytes .../Logo/1024.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/1024.png | Bin 0 -> 193380 bytes .../Logo/128.imageset/128 1.png | Bin 0 -> 7717 bytes .../Assets.xcassets/Logo/128.imageset/128.png | Bin 0 -> 7717 bytes .../Logo/128.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/128.png | Bin 0 -> 7717 bytes .../Logo/256.imageset/256 1.png | Bin 0 -> 22350 bytes .../Assets.xcassets/Logo/256.imageset/256.png | Bin 0 -> 22350 bytes .../Logo/256.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/256.png | Bin 0 -> 22350 bytes .../Assets.xcassets/Logo/32.imageset/32 1.png | Bin 0 -> 1196 bytes .../Assets.xcassets/Logo/32.imageset/32.png | Bin 0 -> 1196 bytes .../Logo/32.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/32.png | Bin 0 -> 1196 bytes .../Logo/512.imageset/512 1.png | Bin 0 -> 67765 bytes .../Assets.xcassets/Logo/512.imageset/512.png | Bin 0 -> 67765 bytes .../Logo/512.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/512.png | Bin 0 -> 67765 bytes .../Assets.xcassets/Logo/64.imageset/64 1.png | Bin 0 -> 2884 bytes .../Assets.xcassets/Logo/64.imageset/64.png | Bin 0 -> 2884 bytes .../Logo/64.imageset/Contents.json | 22 ++++++++++++++++++ iBox/Resources/Assets.xcassets/Logo/64.png | Bin 0 -> 2884 bytes .../Assets.xcassets/Logo/Contents.json | 6 +++++ 139 files changed, 1260 insertions(+) create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_2.imageset/42box_2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_3.imageset/42box_3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/42box_4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/fox0.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/fox1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/fox2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/fox3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/fox4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/sitting_fox1.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/sitting_fox3.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/128.imageset/128 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/128.imageset/128.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/128.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/128.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/256 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/256.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/32.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/32.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/512 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/512.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/512.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/64 1.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/64.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/Logo/64.png create mode 100644 iBox/Resources/Assets.xcassets/Logo/Contents.json diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png new file mode 100644 index 0000000000000000000000000000000000000000..edca1199a7a942f577ab79fa9ccdeb0d8445095a GIT binary patch literal 1356 zcmV-S1+)5zP)YAX9X8WNB|8RBvx=!KdMT000En zNkl`YJF zG1>piWY767XMQ<*<~wJ0MJYvI*^)dMXXU}TNIMvFgT#OmtwA-Zps0WqP0M~0C3`$h+#Qm#sE1=0<4&UIXT938+y5YJ3@&>n~A} zYWfJ+B8Sz8tB(#a<|cUt*k_F)S}G7mrH;|%mngM$9S54_E%ld^-?YG(4N?f~2lj*x zGJ`5AWT>Qu`IT2Fb}=~tY?e3Fu)QNR7_(7IfH#3Hp#sdX78Eg9Q$e{DQ0Qa&DbOef zr@{#Z#@sA%;3#l+VCPv-X)yy;aS{jxIl6oXG)TAlbD|+I7_(Vwfn&g`K#sGdic)?` z#HmCAuXm?_26=c@>GG7-b={0rUae<*~^{cS4?E)LvPH;sV0L zkcnqjSAi=Gatm>a0(-v>81jg6+&6iH>5?8`SKyShrEh_8lEg^JT3}wzo-YC&Ys&Bh+b zo;&UL9i$(ui!#6fl!L4T7Gya84eBJ;ECWLhgaPxm#DH&zXc5NT|*d1}r%1 zvEU4W`oy}XWXMZlz#Ne-;OS`$eMY7Ffr}XpH#mR+>ua?Z)M>1*+@uWY3JRuA76J#z zoQS_u&k(Bvjee#y4CkH|kQotBo$|3u%m2O7VQa>Cm6Ew-!egQE=<`#ZFPIBJ6Km90LBjfjIU4OXhFX${ zE0`})Y~ofm5Hzemn7)XEao=4Z2exsu^^!iQ{K0%2aWG3A!Sn*HtW=|6!}^0c8F4U` zSztPWXSr#5zoGL7b2{Q+CeM7wfG4O`uj&Zv59Un7!C0?PV!*>xs}FRA^#^k{;$W`F z1a?xXKGzx6AIv$q4Y*HdQmwjc4aUji59!MG?7#zlEBF8U9{d<(mHCR36C O0000YAX9X8WNB|8RBvx=!KdMT000Fc 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 FV1kXju#*4) literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json new file mode 100644 index 0000000..9352958 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "42box_4.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2099048c8dd41251b6561c9cace69d63601efc69 GIT binary patch literal 1802 zcmV+l2le=gP)YAX9X8WNB|8RBvx=!KdMT000J+ zNkl1v3St+!*ZCSBMOIxUN6HshXKq+d1N-v}sL1F~aiVRQzl@tjm zmk3F%Mp2=~c!`QP5DmeWD8{G(0>JZDu^`2<@jTkz0Xc}JJk8n_s{Nr z=ewNq7KP%Jg-@5_d`!Fb9f7uW&}h%2z2l-`Zw8E!I> zxYxUFK(V~4&O)4EJon2mpboe$&Z6z2jP9IBchif+ZUU!)`=m`OtSGFMNqkUG$p0__bBmdH&7}IR6|H!Gce~XWWo6s%3Cq7 zM8x0OO9@S8UlFAcr2_c?CE{xh%bS)(hSNoA0@VQOfd}Quz@mFuF~O)6(gVfs2+0W+ zzOrft{-Tk=xN*iE{SKhXV=C%%Q*1ERvKDwE?vm}L!@wmPaFHPez*Vh|Tn;SdLF2(2 zf>EzYKClZ+H%R}F8i9jAIt@SusURbXy$UMe80(m&rkJIV3P!CJLBFq$N~qHoNboN? zk+w^~PT&II_JILN1@CBZc8QYkUr@V%lW0<-)|%Fj3g$hTD)3%}-JsJF)GlG4(FSJZ z6P_o$wmTlN|t4u~}c7SC{HdPj7)8N8yzsxaft#TmUp#Yz3HEHV2av z05fbAJW~h{4}+skFuzX!oH!JQXF;L9&S;#7sKI&u=Qv7=CIy; ztO>HxU~VCd?hAk>Pgw!xX`6$|)4^;#1dqHASn^go&abv z+X^t1HV1Qq4rbYAc%crwmvnR4&ERmr{^L+P1@7wakI-bg6<`+G8;tbV!IZ6nO?v|N zvV6$y4&`^k&@A2N8>uE!tpKys7)*;7K0W{rfysm6su)MlXPV)Y1JK(ACH-P|Djr`M zpo1x{g8F>{`-I`Jel9p8AAvO{TLET;F&J$Vyt!NdUNHh*D>2S9vKDq7*T1hVgXsm< z_{u;XOwkJ1vIi#L0Y^?k_BHT%Wz-Oj`>g;|Z473}%kY!$K=77K_;GIZ94%f*SroYb zrxn0EliKbJL131`plo>YQ5d}ddZxq1g;7H^N~{30${5U=Z7^peh(OIGczlF$o>?29 zb~~hWhPoM0m}l%edjr&Lhvd#sKLf_(MLwzf2jBy<;~$}K z4ymH_Gcw-5H~gR~mfa{$z`u_PuG!oIT|$pI8-X%zQ`=&6HALp`mDcMs#_%F z^@bH`&B5%pIT-!*i3@m`Z1uTSY0bgxwKcKg#Z8m literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json new file mode 100644 index 0000000..c464fb3 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "42box_opend_black.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png new file mode 100644 index 0000000000000000000000000000000000000000..5e541ee631bd543d12b84d40ca23e120ce176279 GIT binary patch literal 1654 zcmV-+28sEJP)YAX9X8WNB|8RBvx=!KdMT000I7 zNklbeYIFhC|nurqkB6Z^B<@Cn_m+QTISMXpvBfmdj_nhDP z?e1rmbCRc)&O2g3aSlB0jJ5QBcO>Sxyo#S5*RsId;lx~#A6pzABEiG zPx5G6vS0Nua;ESEmIJYsE>g8|mz&%qkLSv@RV|F1BWeK~f#H=ZP}L#HA(LYAY4T7{ z)xpRaB9wf7;Q@6kJorgO4f4205d|(k1gZu`&J$tek&4ZdlPuKaU#{Uv5#9zF>S5$k zF@^%xQHo12OA!4ved%JHR3}aun1|%Pab%{4UW->V&|^p>rl@NUTz40 zCbp=8*(tsOqOs=3vE(*c@*vGzb#A@_SVNGmO0kdAj;?F1G_V%=&BuFI1 zCEFDZQS#NJWZPatmfZ^ub>$WAbBJJ9#g?6e)GXM49a09st4#sW#PhSYEvPztl|X@IHY3^Vd4c%>;E&W3R)_a%u@XY8z-LF{ z)I_~&>sgq8NZ(KU8@l@gpoxVlVBWPjOrRZR@^1aHc*Rh?YsNk}ngPoOLy--_f&tLP zToo{rEDjT7hv~E&W`@DoPLPoc?#YDB7lS!@iW?Sj=O^zF$#;L9P#b$TYk@l1Vt zRRqLzRg){)=rDs9!@iRc*&8lqL107J5$AG<#t0QKOO0XLe-6KA>)W0E;n%6IYZThR zXO8{ne|%S1JL>Usp&ZNtXd4KhPJlkMphp;yUE*k041nICMM=W>X~ zYbsz8+)uulx%%R)e?7B9!NnZ#^MM9F>T*lxnDT8sCqwf_kTl;Z-3AP$zuaebd~=v@ zMI3^7$CYXO>w<^dq|`SY@@2UJ?%EzD|Diq+>I^e_A$&9*S_e5)$OEG2Ew>vS)gjDb zHi$R@@ugYiFWAL-I*&KVEq|Suv>S~RQ1%>C{+RiN@QmYo(px|T-Q{67r|J;quTPTn zJEl@ELmZBTn~B0rpIL-B!#os!0Ym8`(<@Te9A=lbAMgk!8(|2OhGZ}=%B+f(HHX=2 zahM>(J0=x)ix=eG%9J&SIbd;^<}P720MWFPg_SL94)e3cVf>w7;(^(;e7wJ*Glw~9 zaTxoWuML<+u>4v@S#y{Z7KhPapZEe}36wijl{JSsWpS8iIS0hxFOR4!YYuZpyae=B zc~GU%kRNC&GgOzY{$B!vsD?3!Y8Zp4hB1i$02wW^yWcP5>Hq)$07*qoM6N<$f>1#7 AwEzGB literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json new file mode 100644 index 0000000..ebc93da --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "42box_closed_black.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca84f74fdacbca5a03ed6fa9a93b264d06a3f61 GIT binary patch literal 4224 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600oRmL_t(|ob8)ih*f12$A4=a zk(@*;Dk#%x66`4ovkOHtGMNySA*6*#);KecTF{Lk>aDAVT`Vf{k~SGgT4dQv4_%B% zjiRR>(yXAGbYwI&%{i-wwYToJ`<(Cl&YXRi!TpEB*|TST>s#~N>$~p}Ri%)>qyQGC z0$895V1X)t1*!lRr~+7^aswtJ7Xx#Ekw9EYx$h&udR6@~0b&UDzv z*S%4lM}q#YJb*>8)&ZAzm>&jS0v=Pj8Eb}9aKri+cmsGyRS#A0SqWGl&;e{z)sl#eVz>YkkqfcRx(Yv7 zZvqdi>fa8(<$(2J{ndI^Ek(AWz_tUebq6LQ=L2hiYjDFF09FDIs_H%u-&w%+0!x5( zF|5dT6tEd+^$flKz(iy`&;wkHAFQ{5CB8vs0P6=9W3UENwnH0O1Zxe@f?o&U1Kg*o z{Q-4!1Ir`-{a9x8Br_{v8wzY2Fs&}YMC4px70`xXW~~G6Rn@(L^~AvT0rvxMr86sG zTMe*QS3i0}J)yuv6au4(PVRoqMp5VG%z@n$T z0+@*(tj!p#KSP75Mj~!Vuo3Gfc2`|zIbb3(7I+P~4ZqC#6qu)~zgHVfh@#Bu0j|WaPyG;R9}Fxg158B5 z0Ivdf;0Nn7;7(QjZ7{+3N<=0A?*Lch2Wu0sKvjDOU3VH-1Zz1k7e82^19R&LYa+JL z_gTBfnblDXSdao1!Fmyx2aIr(Rp2XNPMtGrEq-g)IJ4SoIa(hBCL&G13&4E*V0{hT zuBy9g6-*^X%dxfitzBbS9km{SL{$-y(ZF-qhMWr)*erRrs_v|1Fy$m7=U~gRY50xS zF|0po9t$uUSPFFF2WvYptB#o!0;_~gn(xVL(k#F-Y>%nY!+s~$WPjqsBP=rRxxSOv zhtdZjB62p?41IP*6x(ra&m*&r#RU8UoabqO5Zh`|{(r`obzSaWIh$3$Qca9PBGL}L zj(fC@W1FF>U$_iKWCU;>uqA!8=PV2S3XBgal#`yv4n>l{k{gIF9l&-UzNus+B8}L2 zz%9T{S;u=7%M+Gic`A2cA~F(K1UvzJ544@^z*<#xYt}ELX1ExG)r8Fk2t3VkSO8mq=>@O^umr3pfm2iVRRjAOm>5zhCuIR! zguSd13@mDfomew$%CN5**bXeivV!snw36=-)eKmaS)EujOlMZCs)5anoC-EUl*FgO zah?87UY~-EN@sY+QVU=$z<0P|0ep!8EBi7`mhyZ9aU6E`=W~h!wE@-!Tn0QtWmqr- zfsMr$>Vp9`8+ZiU6v)c_WM&`64nt-GW2oFB1bdjb4mDugfQvkfWC3d+ds85taq-WZ zxOVl)B~|^$Gq&RnhBC0Br~+7^3SfaMfCZ`m7N`PPpz;Q`6`15%qyUDUUB(&anyoLx zUPV7?fi(h`Vmk#5WUoJy_jjo354i+WLlyu27pMYQpbB7tDu4y502ZhMSfC1Ef%*@# W!b-OItQG430000f6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600l!yL_t(|obB6NjNMfg$MMge zX@O!3DVTu50}xDsq!KihBAB#N!$m@j!5ChIUQ%$f&VnR$bCWsG6yaZBXgrFoP zB>I42R4Q^4c;ND4BD6({TqG?v0j?mg<1D)IkBPlu}SIR{b8s5*&foBVuwSzAPlLQpz%X z6f5unESErjjY(XKGaLKz#uoTU^ZzpJ#U~=-m676Lje&W?y@s&+kKYq35e9xbIT!B(78^*!W)U5;PMRHCQf;&XNKSpkC!B4T3E z0c#%kcV^~R`|yQ`xOZ0D@uuz1BjV1g|Dpo61`nE6Ij>p!e9+dgjzWw)l&lsP_ z-KNu#DY-f~57O6p{TMc|CbIno7gpveTon<&XfehXTw0m`iI0z}4)(4uBLH@m%X%k7VVvr;wZf4gEZ9GsgF@$#lSY3+G0} zlY{kmehnMgiFgbjs?57^UPL_G=NQM}Z#bng{{a_A#KfR{?N`GFwoz6g#wznY_+pFA z{&HEi?u{{tD0@hRiD+^9uaR0@)-{3Yl8*?|TqzUsDD;fX`g`gDdkxp)a0zBR zUTFI7#bm#?O@q|1&XP+sD{HPQLUXiv)_#DEx>nz>7Wy-;9k5oDcfeXs-T`Ylc?YcJ zaNDAV0Esm^=l%AT$3>5wT~%9GgQ64eUtyU85cHDD(#Q zEyR(hUmXc3Wv3AXYiHt+xd002ovPDHLkV1jix B^_~C# literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json new file mode 100644 index 0000000..4e0bb94 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "42flip_010.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png new file mode 100644 index 0000000000000000000000000000000000000000..2a961936819cf97a6d4994eb6775dad0122cb5b8 GIT binary patch literal 4380 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600rYoL_t(|ob8)yh*eb-$A4?a zaeR%BG$^66d=*4grXNIm*{G#SLy-wqNQDtmSwTV3gPw$uQ3*ZtOAp90dr&?oC`v1^ z(uz>Ahh-!=Hb#xFd8|IHbD7hbySHcGd*(LR&L1}S+{@Z~?en|)tiAT$_ll~LE4?HK z7N#6npmJb=%7Fzc2NtM`0TYp$=u)+czom)*6OjqP-9Qb{<|v;4D+(}0wzce8Uaal01p8VsA_wnz6+QF%Yhq!Q-IGnLV!&L-T+2;%-#g%t7>bJ`YvGW zflE}iSwv0;KBd}$iO5J`HE^28Y%4HbReyH0Q4H8lV3w+W9obYrFcIkoECc4@j$19j z<*NF=r=29Q{lJx~x-w>y7T82p{XX?gc$6uyDA!s9JVNnc4HmHP1eU03r>Ct(Y<8`~ zV%@{Q{i@m#v#EMu(}7okp$-!TUIZ4Z>Vd0Yw_oJ|6Ol2%THqv)*?Qn&Rc$HRQE}fRfVY6j z99?ZmVslY^}0eB6V;W7IaTU38rk`uS@dSEHA0C%nj@DXsSs_x0mcPYR` zqz-rxxEUg4=g`${w6Yv<&$78x38`)btHsSt5fklhzxxfp+K!;f;mb~7V zTvV4U5xEd}1$V9o7U<^#YqH*~ECtx9SfD-5W40QYtEzvM(YIp0$6>kI7?0T@;11xa z_^KeYK7;@hkzrV%o$4{$23(X?q8Rf%6j%wI?=kBHo(FEuD#&;1M_OPa(ieCf+lO++ zt-ZiJRb7)!_kw%_d;nabs?AyY|5snq0E^<*0xX|$C5i1=0=w9^s1EL+`MwT#(&HO! zWH+hmcUk!^+Mkrb&H~;6j&YbMumYPEGkp|9WD2&?INW3QCpHnS>**7z!vc$9$68>L z$Lt$mHkNlOU55~WovW49Ig#Umb-;L!Sz&*FX_h0~*{2l1#sXjAP9Xq(#2$%#*hXKg zqwJ5_B+EWvSL~Rr0b6{}@%Zfoo&#>_sUV+JR=|p>Si_yM(vi5{jLok5BfsYXYw)iV zw*Y6W>TXZ}1xg>~-P-FxV4>O!Ojgx>k>A1wqA#1@0G#VOq>W(B0X|Q&2bV@^fQvhzb`mS) zDhX^lwlfg|Y#O%WI4WjSabSIbkwAZJE!Q7tC{hMTuY+RO4N;u|z$n~@yHF-D5gCsK z`Ed!G$^r{&%pQsO=&QkQcsMpnM|-N53=I2%UXQMm>b=06PDBO+8?j?Emr4aT1Kaw! zmf~AK&A=I|y0e6?cT=T+H2_}_25c(uGB$c@F&MS6Yr%dSwhB96a4n(!H^6GJnXV2? zX$Hk!3vm)Gz#kjEkH^kJX$NMj>Tj9cOK$~MqM!JzT`0A{!HO-uGjU?THqw0ti>qv4 zl~4{WP&u$b<-h`!0}E6REKrpKR*(JHXf!Yc%a?{=c~yN>wgHVfu!1AYk&@YZ9kwtZ z5WU}CiKDV|l>c8cP&u$b<-h`!0}E6REKoVHK;^&!^$!RvWws*P`+@)f002ovPDHLk FV1mm=1|R?c literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json new file mode 100644 index 0000000..5f4b4af --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "42flip_02.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png new file mode 100644 index 0000000000000000000000000000000000000000..a45d294c82088c72764ccbf2021632e99e2f3a35 GIT binary patch literal 3937 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600eDGL_t(|obB3Qh*eb-$MMhh z&sg?Qlm!t8VWp5crKTnH$4a691_coXf@M}<+0a9U4}tZfr2T~?f~Y7fDx^@+rlFQyhX@;76^*(scl{vqsIeRbW{`hjv-fQi>QbeeA@JcnX)>H#) zQ8lm@RRe2LHLw=d7Qj+UBe5U*qa6%2QRTo=N+;ks8Q2coi?Nu5pRp6a;uq{eZp%!-KZ)wrz~SV}43LHVtMl~{ng^#famE)2(SI5Q%? zE#GZc)xbuf8#81$H$=p$lv0-rY8U3?Wi>ETN+)9zj+WP`$q}(_0I)S!iuL+|bwY$@)+M)@tQfu)pI;+EoZNkl9z#=Ect=V7!O7%8O=e1`Gz z4mc|!-YMp~a5JXiEHyAvN~hyfbjZ2Z_=wnD%ynUcyx^aw21ZKhc05r$uEsSHvA>vG zgdZc~rIgb7hB~m6(lD&TwFul55swa-pN9<*@m&oJDWzlObYd+2z_}5zWx)J&d=e3V z*T7IfSTC<%Jvb*KdI!vRM8sdk-!l#MJS?TO7!M%fY0Pg_P^Xj@Vnq@A6DCH)uCl!T z&rjLFildx0xL7WSZj6W*8^jKiH-yWJp*L}L-{w$-ssMHpHe-xj4ozuP8>W=T;42&_ zZw?D1;_V12C-M*jUx6>OpS=1vb+xJsRCdtaA)!OP(<9{ zATD9~fY>ea=J4mCciC8_0xQ<9jp&riq1h49-5_?f{04RwL(9=s^$~X2z{cTo94Q|^ zpW0Ur4H7#^26hzw#+4DVwk)rWR5q}=ct%bUR%1?+bm9&?R>W?X*RP!=S#7A&fE8=f zv$#p#@fJnIBMoAQ<5kQlhF-^Y5wWifugz2@u#xg7HdX$_=3$+jz3&;ATcwnamlydH zWw^IR#8aghJ%Gvv_5mgrL%+*s_TONud^YwaKEws`P111mVp>FOEyd^oR3)(gYQGHU zd|ZTwi}B5JI+}W4eWhPX%e;<)8(>hX))F^?jn5#JwDvrTl^0FyU>wU}E2>sK>id(in3@4wAm3GX z4i#Vtvv7$FZM=LYHbOtZM!+t`D{_7|X-EM3_Xjh$4jI-2xxMKgxxZpCU~gkCK9X<2 zhZeB^8OR+xJs77kuqWjXo?bPu0|M*D*K(8HZZ)vfA=i)tfz6QHokq!@;xY1?R|6}6 z_23l!zA0&e&bG-PdPdx;)iP7wkfcP*fd~1;RqSnM67FcN?V579$34n2G*i# zU@fW!)}m@)Evj9B_4T^ezz%4jzbL;9=VD$&d{L>XCaN4*pNiI|(ejnspv@`mptb>a vxTpr!qH16*ss`4gYG5s@2G*i#U@ht&CB3kxEKffD00000NkvXXu0mjf6A5W9 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json new file mode 100644 index 0000000..39a1252 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "42flip_03.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec754b64dd30763ee037174ce196abdc43b3896 GIT binary patch literal 3596 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600kmRL_t(|ob8%xh!tfR$A9l$ zw6e9di`_8_Gh9r|q!fc%%S7*VaF84^aK#a5;n zbVD#JymU`fVs}+m*Yoeg^RD}zv*#Rlezgz|^ znlfM!l>v*W3|K^Ez#^*ZfjQ@D00-0n2PEZE^^*iJ=Ugq&0Mr2|0E7HC02u1OH~7yF zByDrfH39bq@j<{+NiW21xQvnlHWpYxFEj`2_pw{Bs|TPPm@KKyIX4nmg8}W)W?;Oe zow1uPp`?I~$9{ZW5bgqQ2Hpb(`&bC97FY<(3eGtI+%IWi+@4D*ZD1Dx&jYvm*g;_a zyh*?+?62FSFM#VL?Ty=aF{KUc0^nlcLtr3%fz@Nct|~ZhnxxgS8!w`20JaPG7??x> zFn?|{@HS8zoZAY_l5`+u>wT0uFiC$n=Vk$K0Xg~t8v=X@j112G54b|orr6CFs9JzE z0N((^=?lyObAYF@r)!U%0iIC8g=E^mE|m1UKjv}ZDd5@=nBO-XSPPsHgtr0XB>fwo z^S(+7*yY&YsvNL${4sYG0agRN0z43ebHIa=UXRmzp{fa34KNQ_UI;A6(FPnJgx6w! z;XQGA@8hFdfcfJ_0Rtp`TO>yvupF3LkYk3Vm9ZEvqNIS0!+_NX;eEhJNn3*BYJhr4 zT_y6|2rMBV{9@ovN!=AUUd%&6z|IBMlYi3|@Q9?BBjjlSJ_E)C;dZRV*jNd#hxCvT zuo_?i&_aG`umPATsXaoj*}zNmPS^pS1Lh=AVkFiNbIy&%ZrUdY;cnm_N$*C;b0)A3 zI4=nQhLsrGE8(^5_z425#ilsT1-sgSsr{Wy`$Bde@MsXu0WFeVtAy9G<0n}tJLe_> zpOD{u=mMroS`{HrBUT6x4#Mk!Yb5Qigx8W|Ck(6(>r6~3*tHC}t-q6Lf3>#K+ZFfR)2MJ2qJ96RZrzH@Fm@ILt^#$Mn`N#94v(*%4}kY^cidz>Xk8o&ktD}f0GyI#fa zL;W)3oI4I!U67{(m>_9GCA=0LH;uPO&bhmRH_0zRcVPYctr7Cv2fRUkiSZ)vSX?DW zTEI@iTFs3?SiqCO++si0KOG(Rz!-?VeHwvP`lknnZUn|i+82xWwBAel0(3t4h3sam zYTx0z7b7qjX8~vXZ5VJGa0)gNZy^5)`vn+vGy)rjRr;p};cnn+tYml=cnG_qdVqv* zOXKzTrU49W8B+^ZxJCiiEU7hCvxiWU3+le27uYTg%u-4NTL3&cVQasxVr$z^YXlu!zclMN|eXqB39+l>v*W3|K_{4{9;< Ur+(t)>Hq)$07*qoM6N<$f{D1Sx&QzG literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json new file mode 100644 index 0000000..8a8368f --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "42flip_05.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png new file mode 100644 index 0000000000000000000000000000000000000000..35c156c85ca2fd2eae0a82fc0b25f0c41b7a6078 GIT binary patch literal 4262 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pv1L_t(|obB3QtQ}Pq$MMfT zZ4p}v7zqjfjRNrjV~h`g7%>V8;ZITiL{Oqq6BUC9Q7{lRXpEYu2pR?Tp-}`Yf&q-B z$O|#}g0UJzV@#uBq6ulBt<>An`)B#E_knXy@0>f+JLlZ1%rDuQJ9pNsJ@Y*?Yp=cb zq=?X|zETIQnL1z%)d6d$4p>8Vz#8g*3Rp@hA@z45B4#Ig4Q&BSDII~Mu^NY9P1&v< z*zUti%l=^N+wR1sh?prpUyqOD#Y49Jwg*>7#1pODL=CkG>`HvKzdNw)|2>E6ag7Xi zA#KAc5%FyCc_@B_^9TG4DzF(FBVylD@1c&`1a=j^F~VdP=in9iw*0gVYaX!T_ceGB z$5;5>kE?K7Od!5Y8ra!*7~jEV4t#1309Jf&z@1oE;rmIP6%pH-UwJdN3G9=&d4$O< z&W?x&Q%XnU0laC*rV3aOU&Lq7tMLB_&Wnhr59a#oYFU64`;+8X?T7)J1%Va&!*M^} zR^fjRH{rVepfL_j8rV4zv9;JId;(vWM^HupE9blsTX0N8A5*v_BJOW~2ldqUD0#~W zlX<|(Ifr5s-Ydtm#egMjln0F$RrIqR?~I7QH@$~CT2^4?yjRNc>;#JdEB1%rRtpar z2R_u?#R=lCYWIwLOw<2P$#^u-6N&(iBliCe< z>tevlId8|kIK0ASN9pg;#e6lgm*>6 zKU?WE_j^1Z!mBGxrtl%$-Nw|Z)$&eC={($y^&`xFj1Nb|-WL145I>Zw8Vl*K@~gRh z$$hm9Y!z-Ottzg}$g$_5D<`8>B^h`er$@w-E%tjNeu1MZOrFBKBjS;R z?qggfq?FQGxC2L4n1me9Hr7caYWA6Mxt!iqg@oVAMSz3)p~eYpl^m;Xl*`ErX&RrF zGxAn0q)eSQ;S$xU#`kc=!BjQIx(HJ8q#xjd5oS-xb*x{v*zc?4s>TTwCi~<`{N|=V z)Yw;z%H;YXyl#ZqV{$y((PF=6;HRonoF{N*MEtpt-$^X9rIg+wR}iY=899&oNRxP0 zV%BrJrL8J$4L*xcsUEHG!$nPI0h0pO!`1kT>R>!A=TYD7za}MBcsbUVwr*g%9)}HW z*A3XN#Y^y7)xiFU6Px5_ZBC6=japPqDXo=LjZ;Usc@(D(EVErN4;=lcrdPIu%Xd@* zSxk@Pq~!v3I{p$7|EM_L!`*n#2shjCmWbF_Ubh?ZxmGT4Vf_IoFBh*vU;wO>M`pTL=ENRbC_9RgQPS<~ceL*et$=8zN$68Gyx5o58a~?f1B} zQL@}3u#e)lp?^=w)rg;r3D|BqaPO|s_F%6(kK9|@bkonI#tjVqg)`->x@};;lna$J z%9AwiPo5?L41R@+zDUpaUo09zwZj^|2SQcU^32iCS~0($`GcEEJN8mj}= zPzBiM<$Y)+bOSS{towydpb1lnpQZlBjvB9 zryMvtFiB9)UDHYiwi49=Yp4!bLv_F!ssq+g9k7P#fHl;A0g^gww$G>QX#fBK07*qo IM6N<$ff6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pW^L_t(|obB3MtXx$c$MMfP zv{eDaEsbJAf}zF&Vz>&a(U|z4PsSTcgLpwipp=+kq|rbFF@{7N8w|AAQZzupUI@N; zi-|Er0jY)%6MZ0kz(ku^L`zyqDgFDf)+xjE%$c?K%$$~!{Yy?}Py7F`wdOnjwf9=T zH7O!=s#ofOHB$$yp*mm<)d6d$4p>8Vz#6JCu$0o7xEWK3@~7{0`uY%_!Ff1tKx}W$ zZu}@B_V@I+2w%Wiv-H#Z{yF?CB3^Cu!79}T*d_P_7FL8G!WZ!Y+<*l`;{S%rB4STp zpBLi+EUoBsKUQOHL>#DyZ=^QBF2*0#1G^l*!JYWJ*`W;rmT(Ck!jg)9_u@9WTE|*x za{=sg5wSg`bRvF$ugTMSCd~+}r|)HW5bv(&doR9?yCdSYiufwc8L*Oj0`9_>kB zGKdcu4(&C0s@zfoZB!L#SIKL=8fgEVnxa>xzc_;8?=!P z#FWxmvWswOMfgGa1FW9IO1n;WN@}3}OZMJ=HwfBT9M_c65_x)FR1tmvYjAr+yfSj< zLzGflfED;2j;~1hhwS0~ekN#Rv#1NStvJ6T`~bd>J0@ZB^{Z6cO)|8%R-`;HKR6!m zhc;GEKc%!3n{h!!_^bFX?wliN3uJ43HQrW{@;sK~iC$=9KLklBor8z*{)+JZxC3kE z2-+gqwYXJXrR|g*m8YhmP2|+5K--41E5fHe_%-8nMh7XSv`}_pzoTxq@*I{ BS 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pN>L_t(|ob8%>h*d=#$3L^~ zuC9sM)@~0XA&k%{D#)}Itw>EvBYRi|WmzO4Aw8hbFsc41iV!o>q?eDf(jr59P{vxB zmL(BHK~hRlWR|GAH}~=FkD2SVT-U_q;Pf7aOX-o!2xNBN-bTYtqlKzOT10IVT*j2y=peo=JFb}vBI49t12bv`9 za2l5a?*PZ-T$?Sg0k=sy5=#d>)|bF;#*UITKy8jM2&@Kp-qkk&ofhC)Nt??bz2Ev8 z*qgw5U}}yp517*#32XsQ^fa>#m@MgF8AC5>aRZwUyhRaUl2#jI#scpFL!HkD%m533 z#U8CrV7{cKF?6B8DgoF4;2B`9^A!MdTJ^wIV3en+y}&q0d&(KV&-xsgt2Z3jj(z03 zz+Amqz{^0jM{gN+q;-_F6Tukz5ZEn}R^`-v0C)`hh!q1?2fPhT@-%kGKKH8 zN&;37d;*N52ryT#3D`u}J1^JX2dsX}|_y(~QN%fVq07V<&)9Jnrv-@sjqH5_{3MV+J-3_z)Nra0!?r z=|#^qqk)X1Z@bYoz`elZ_;1Fez@j+Tr*Q)th)qtf^te9&rUjQZ4o0=4wjQ*H0UrbB zdE9>jmvsj{s>Qy&<3`LDU~s_I4$PFap#<$2z*=CS$Gr}lx|DUDnFO#ZU^#HR$Gr>t zfEn5@wS%`Fas~}}eE@&&sond3lY+xlYAmBQPT|7sc)!Yca3kyD|Eno#O zPf~jn{k*mk23Cj7%bGmy^}vlir4!v~55;a1jrF(>0ar+Bj-s8{PSR%&#+b{on~HS- zS1Wc_i@ba4&JZ?Gm?(pt7^aoF&g=_dwZLlNI*j@JiV9l%^kD@$l|6gGtkY6JWTTq5bW$oeq@I~({b7@*r_eHH&G z+YMYGX}_ymL;e{i-OZ*h&3FWOkis;h6LQe&elH-7dxt(;g+6w&He>-rI zq%R%VWx#M?Kk#?X-)#BEmBVzMYaWYTtDfP}-v>;Tv@24dVg@!9ScL`fL(cC#0c(=9 z!|i=FQ#kWwPtLO=uY>%9-WKe3cSDiT)&aAkjItzvZN$Ea=VbGsG5{;pz5zx@$;*-g z)iE!Hv=;yWhwyJ*T9992y6=QE*4lDaFe7rQeefz^MQeV6eeJo zD%}Cg&XWIoV4c9-z_auo*j8XnnM2zNjOh=+0Di)bvPGo80^%0fM)J2@ggxzP0Ooiu z3j?eJo6To4`e0^X%qkYxa9}2OYr4^udMuRRfr(g{)!0#J=smD@;34b@Q6u&SG&uci z8G_xp7=-->E!)OUU~I(!JKBhy6|_AJ(+3Nr z+LapYSBpbkIgT!<8Q{5!%k)dN-U3TBrW9Dnm{MRNV@iRAj41^cGNu$*$e8*$uDmMwMICC?DxS4oEx xjio;Tt0YT-g|rk{NK1i*v=mrKOM!*7{{V<^TefLCKhFRF002ovPDHLkV1mv{^Hu-= literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json new file mode 100644 index 0000000..0b3e8e3 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "42flip_08.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f72609954efb5636bc9c1271eed00f86ad0827 GIT binary patch literal 3426 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%0Dy!50Qvv` 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

<$UrE1WEgx|fLyZ8Nu*vd!ji2O zb!gJxSnSTJX5ItgW!*vVauZ#i+34I+za^ll`pZqIF}%f7e@1lBSb0fmSWx-(s{W01 zp)cnIm7f`5-Cl=Mc5YX#*65cY@;yo1(NYg#I_^#@KAWAjC6&7)12cf%xWpqaAk1np zxs%TE6rCX(vw1eq4WlmZ)e;fUHqQrds0>vt5{HVgI0#!07?mq@5Xt+e{k`ku^n zKs#b3tzOJic`IB%TH`?WmW{ovw3kIhd?xLzNbGu>?}NuhW@VG?gE|7*m(8WwKH8l0 zQch3rR>)Fg-IMox9>`f(ler!=V6I)WF2CJH!q@R?~V{#7ip!2^txwEp&t!+w_H=U z)LD8Rh$wqUHW|^vym6xEtsHZvpcXsXCmF0=>akKHUG9;vV#ikc z?v3^$sI_JzKIB!VcAcQU7~>foWe3gfmYBqNO38_a*)Q1_NeiE?Nu@)lE@~%O|Ky%X zMFx*ssDhk>IVxq}GeI4CkD|`AHEwsW2kB-#UEXd@SM&g>iJwVX%Z@t8cf_ECGh!I) zuZKz*CQ0@yf)MywC&-siFv83_HtlxRtCvfo=k8g1K8VZ_X{}6(nBG&JGApBV(}!8- z@}flFP-SgmD>?PNNNo6yYBHj$=b|c1N>2C|zXk8F0S_KQAUw{sVBdXc+wU{Q+We$h Jk%{M({{h#%zrX+h literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json new file mode 100644 index 0000000..53f3707 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "cat3.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png new file mode 100644 index 0000000000000000000000000000000000000000..97bd00ced653d2525505857e70720c049c56fc5f GIT binary patch literal 4403 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≦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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json new file mode 100644 index 0000000..64bcd2c --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "fox0.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/fox0.png b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/fox0.png new file mode 100644 index 0000000000000000000000000000000000000000..0892874e263d4aece136bfac2d934cdb392569c4 GIT binary patch literal 3944 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600eePL_t(&f$f=ZXq9yo$3Mrl zW|5VYe;5^&)Qd>M7v(4+sjwn3%LHk?=|z$gvLc&AD zuwueyHVgPw((w4WR9%b^HnSPPdSDUIEU9Ze9jg|?gl_@%0OtV@120MXYaD&63c`d} z0xtyZj{|KJaa)H8cL7U-_PxMzNxz$!X#zzylZ2UF1snn{49Ok^wn`ctAJ?jbJmICl zE?`QLd>zmZ^p4kgHnTcl2XH{rbE)+OgqHwaj3x~5CGZL!(0-IOl-6iDFthuC4&WHD zTGFlrV>Sb`B{hzc1%z+K&uvW!JzwC&_XCH4firQo&8!)CHuyOVd=9LU^hr$r?ZABC z5@4mIjskf=xE?2QP68hUoC3bZSN&^Xx1?MJe8z;C-3Yu7oE>UD3~ZLPHRxlKWM)qQ z8}XewNF3o{&`d@dfX7nDV-H1-5KZwKy<>2n--15anaDsa%O19%`}OdQd? z44_j|!Puzsa4zsXPP#UhM!X>reV->qJHCa_$0uoF30tLhV*Y&BOFEHn97T9UV0I_4 z7`OwtGH4zOK2w74Fu`d_*qmVq*as|=)DI;H=V4|wz#QOa;2Yp)eC3Dm;4l>rDD!~J z@vE&4zb4AvAz2~3`Z>G`TrEjs5{^P#1!ZPa@vXQ8xVLhDGetgXF9bfWh;SUtY(8FP zt;kGiIt<_ueh@ExKTA#6%q|7i;7>zy(|VX8a=;&WO4@`+?EX}Q&1^BS4VaOMi`iiS z_z2JU_XGPRorVNKD-J;wvoR|VGk}0zpcB|6>1b4^N`ux~pf#0y)j2u{^sER!f|rzGG)dZ$T6t-^58{6dU0WntBI(V@F&PnF0DOp-iN64kNqQ}{ z;$*gKfJWdRyo@~nY{)e6_%CCU@I=QX;fan(!V?{T0~cWU$u0V9RR91007*qoM6N<$ Ef}%1};{X5v literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json new file mode 100644 index 0000000..533abef --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "fox3.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/fox3.png b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/fox3.png new file mode 100644 index 0000000000000000000000000000000000000000..e15e2be4392683ec49db67a521070da37c90cc06 GIT binary patch literal 3990 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600g2*L_t(&f$iFV$lX;P2k_Tt z=3pj_da{>bH5jz`G$wfJ?DJi=kq@2d_U*&`P`?H z_W8lH566GrPk`!BurUK8iQuR0N9#hCPM9 z;Ro25WXtqS?FK^ySJfiifVbjsyl5U=zrweZe792zJH`QmtLkuU#9Gvte1FHqNp9`N zyzVhf@Riz89#`xPw&UC++a|PaD%ekORb7J1@xlptzm;VDgd9`Btl+9T7oW%LJK+5j z&Q5ZF2V9`4R^b!akmT;Fsx076tt6`IINXd^;20c+z1XdJ<|Uf*8bpjf`d23T__ziQ zHL_|+&%U*|A7>=lwGh$$JA6J?;2}-Oj^5u>I70K(FTojDgA;K=kLSM*T#(--IdN=t z!;Gvt20zCud$w)H$CBJP$1|mE;1fw6o^4-9q*YZ%;N>_Q7ij?r`|o)0t|S}Bo?!T# z_u=HeroZ6)BtM(k>Augy@J_rNk0e<)+c!yQSyhYiYEAUIAwza1S-#*2_RX_g+trl= zT@T^INq#gi{!)BWJC%>%lq5UoAeQbOog?u9d>Stu81lU&7gp6#+B>)sci_<^f1c+Y ztFZ~g7H?;7?w?>;&xVVzxYz#}-jw7XI!+#{YK6Ab=iwy#j`vm^tNDN#Jb@qLs|WMu zRdu=+46T@B*e^AIa|&M2*S;NRCiyE<%$BO^E}S`!p^xK&B)1RYSd?UMRc*ip_U+mz z4Ehk-LcA@>Zl)x-s+MZ8^^3=N?6M?Z8p5?6-{^gv>l*Awzo;K;&hs&*C-@HSeH|CK zVBPHTtGW;y4)V;w7U53q1npu9f~)Gy_~`@`|HL)gRrih#Oxmiw!;do^!FOxH$+HCy z;-n-`(!G~{gBB4zn{W@-%!Htw39hOWutmEIpJ~j9DyZqgluxe z{w1j`I4{Y=T?#%8cNv~lJyY0gpXkrw%U!?2n{ZZVgp*^pmdP!}rMR|h!Q1ef&Il*N z9{gMLDOcf}c(7~1n{oPx?x(R{EA+ibt94JBN%b3FTBT(xwrThIlUnV3^Hc(l5!cew zxI!z<{I+lGQQGle)B9Ye<=Eq3hbHhAEt^`bE$F{yuc2N%K0EIe0*~8pPG8f!a^han z{uUgK)%c87YC0JHfXkCyH!u69Ab1t-?Q7bF)OK;6@zZ>pN2WQSYXiBw-}ylmwrOU-Z6yKgoM1;Ch|5 zbNxB*rX+7)5Z@F_JZrTY)Qw60Ga=Wf@b!V__a(W0Y_3D)KLD!gGJJ8M`Q&kbv^!)3 wLsi{w|0>AX&hStZTzJ1$+rBo*1LJc153sif`|}XN$N&HU07*qoM6N<$f)O3B(f|Me literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json new file mode 100644 index 0000000..018fb9c --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "fox4.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/fox4.png b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/fox4.png new file mode 100644 index 0000000000000000000000000000000000000000..352f1859245446e16b7a96567c9f14601342b0e1 GIT binary patch literal 3900 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json new file mode 100644 index 0000000..fab5903 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gam_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f9053436536473775a96398ce4dc0891b4e58c3c GIT binary patch literal 7291 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%0Dy!50Qvv` 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 V6akk)D#ri-002ovPDHLkV1mU0J01W4 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json new file mode 100644 index 0000000..f8848bd --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gam_4.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png new file mode 100644 index 0000000000000000000000000000000000000000..81225ecde3d89a94661f41f4b94a051b566c8e01 GIT binary patch literal 6947 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json new file mode 100644 index 0000000..805e655 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gon_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png b/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c164bc09780d13625de5cf07b50b5f8d43af719f GIT binary patch literal 6617 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 WnJWP&wGp5I0000f6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601{tGL_t(&f$f@kTvS(<$A9m= zs-hNZV=eZ55fB7aKv7UZ+{j|wqe*9T;>7kd)9dt1|I>fWXL{P1M1pl9e z`U&_)E9YZ)4peRbj2sv-Ln)^qN|3raDOnSO!bYNclVAp?YjU(v} zj`aZG;c~esP=HV%Btn{T(V!**)P9vop>h8jpw_ghJrz$ZsK*Z6)ZZq$)z$O|oyGX` z@ky)H#j%t`B!Q1y4V6p*xmX64-C#Y9Lkx*)aRn+c)u ze@Y0Beykbr*nqo72bk)%8y~c4dtPy{PAb$ph>8u2K$uS;ygZc<3q8QlGzcNM*iePr zeJ$`1h>$aDK4t|*!sc{f%wk06NFSO8+MyfQ6RC%on;jH=C@m`GXZ|Xm#}ep_f%^?Z zRCUXZKlB>3zc)@;s7U`X!~}#RIV2V`4~d&TAp{p1s_@12b08qdjnBk}j1^#LdP>LP za-vtSMOFJvbZWcdBU7?LYX5(FI-_9kjDp1sfrkvk^o3jH!(F;T?=asGDk(Sy?ZZ82 z)AnF<)*3`>LV4{P`r7b8$=~4OT!`01;q_&kAQ5@E={a0ZG!Jy5thpNFRwIeigtu;3 zSQ!7v0b>ThXX{E*J4X6yjFVO-KPek&5eca4YQp}CFTsJsri?-?j!y?gQEs+6vjKlR z^)bwo7I=HA@h{6?grCxjcbvxlc8r?GV6d8SyQc|3DnCoCCOl(NVrJ8$#QjLXjeV`E zQ*|X{G$Wv%o4*3#zJZ`A8eJm;c*|`PCOUmROPiHpZ z-J%1~n+=Eyj6izCY+P!*1|O-M#05nq zlXc#MZs8jjbT1K~InX7oyf6{5kMFyj?KVXDhhbO23lK5_H$9GU_@br=C5=}>2mwveNDPia zLQo7!8>fS21XtT`;_#J|U^x~5AYcSo6gLkH#h|IL zh0G3$dG(pBm4AI~z}=($%oo>+oKlI5iuMnIpTY;pp|QNW{bO3Zci|vRHVYQT&%?%y z=~C5!y_b%mq3;ev0ugpD--Z~Cd)5Fzw{8G$pWTN^=XZ0I)I)-&((_Q;*#I%kup6_V z7J7Rse-P$@fR9yveXen^yPzOt5zgHzLuPa;R-`Nf1$Pj$&5HLf97L~v5V4vFys>=i zeNy!TN*XIcQ4}_1twDBNI=|0JEB^cIkDxajz6+e95b6_ztmssfHe5wkOvz* zW8m9;Et0c!W!6x?5Q-%%DqCxj8lHfca@K*N+?O0D>%^z!Cs5nj0F_LR-xO}2HdU+I zZ{kqJNpOTicHCTS%v=SAX54fgtPAfI9YE_)*FD#1n#QV>T=eJ$VV|^d&t?<|!~KHq zTYLW?@cv7mzt=w6zhlLm#njpQGU&|)1gSOn#j2Me5sBSF2*H{9OE`Vw5`>HpZ!F)6 zSWP&u@2=5)ynXIdI9v`yYr^sRvQ3bR_?NLm6(>>IUI%dTi}s`oBWUW6}d&SS!E0|3wzjn%2SSdo$gnr8;KIqdk~GkY;$7)H2H2;Ruw z0#C8jO^+i4N3Nbh*_~?86otanWmuWAh&L9)gbD8z9mJqv7=ItLufhw<5*MPp=^8d? z7sf>ShqXTv@Fyil`$w(gL22QMI8l3HY8|8~3Uk5|@Uxt?5HUhGI~T{|}}+1m)U zREeGWTM_K#&pSrNomw2JIt`X(kr|VUt=UhzJwyV)=9t7MWyjIj-{uA^5{R%qV`kU+gM)0p6ZUH#h4#FY<4_?gy+h8>mmqK4(LGf~Ya85%s;zcOUgPA{9yTdfw(~ zi-jBAP1tw&3$PrEXXfT3FKNNO4+R7q$6?fLz=y?ugVs0-iAao;uvsu#O)ywZu-L7z zJ00LS4uo)+?$uBfg(V4@7%>@Owv1c;?b#jjhX&RfM@4%}j!Y(n&7wL-dfnDQ0VBYc z1y3O>W)83YkZ}}$E;;~%bsXstv#~L26>JVW3|1p_W+Sx55e%F37#Y_?XEwmax_Ch- zP!KQzNJJix2tA;)7~o=AH{E%W$q+C?j2MQw?RlF83aOkIY+B%MUB7H!=`r)Xm~^V4 z{|>rG`tG?;Q#1-v7Nan2$<&fV2m#A+m~`4PY97P>iZ3y2)Ilzm!B^o8lg$jP-3Eut z36^8sQWF4#i~tI$94eUtKAvg>s{P@s@Pe;g4Th%im*USbGOly8n-iW0h1e4#1}%AM z$p(Q!D(5XgrUmZP56bowA2Dafrc<~3@1X1NfGLVXd{7kD&MSb$X2q~ckKu70w8jzW zEJjS&ZLrxV!4b~Qj;1IG86m_XF_cnI2xtafqx~R+ASpN&n-;8rr-uXrMgaPI)f~&Q z__*{a>U)~q;!O!lfKnpIsBxIQn7dA(lqwz$c*r;+{%h&ciG+}Ns(Z8_twWt|IwFA( zGO-ks4m%t!Cpg00^VTSQ_t`6?p72-tLZkG7ztRU9r4Q6HCFBwr3|14~IsYjp>^6k? z2IHUeo`;-g86$+?^O_w-VDG88DC8z&V9a8I$zrhm_L&{-PwR(( z0pL$xeQ5ENDP%r!6)rVZ@d5{VX%MRkheqWKUxgREWJ-97r4R{3Fxkx5eQGaEHZ$f& zrC{sAry$_jIk{LC?_D^Imccd%1tPqV{Ve82Ci2GAG2Dj_iVwp&X`Q-8Q#973Ek$Er z8zdBMd}H-X({@4bUwD)r8yYm~G+A+}__F3a@9da2dm)}l&*Lo}?M?^YI=c@&`T+!~ zHTe1Rtx!tcR}4Z3zPNr7#SIkzfECF(C`@0%TYsBumb=?e-Qd(UkwA#`8LM#d_7x-t zN0+Y6T($I(fGb+AZz;N6acFt+Vw|kI2(!)NrZYP<4zJ{{hlfDqc8}#ad~*3qT<^LC zPq7R;^R^<~H;{L%Ywfpi=*kJWSQc}_6Y*;9I?y~FPlwBi{pBZ6*VO>>%?#nA@Iqcv zHZC_*V#9*fiE)8Z(>C_*3p{GpGap|3%$XdPKy?iF@J?Jl3Loq$*alxYe-@pqzk-uD zE`XsKys+>Y%!``MtJkL=n(CAUsQvKERj)ug&Gz%$t#W)_S3K3@N{>u}R3t^mU?=&H z=XSb3r3VEDfVaBm!~Z&9|(AV z+3}-o!+q=XlNY0;sS-ouqoBWMLemVMo3{c>6Ek@2b>=a=eSSZ5rZJ?1&%$fD8+gBW zC+ot2iW9irc^eGP;N{$PNDWKi^*LhFWA~{&uuNJJ;U9vz5y>cPs3gh3v2Q-NVD+zN z1YFyB+qbB`d|2b9q2vVih)i(jsO1u~wl1|bAR z4Oeio_96gab?OqVOkO;VPdnZ`yBAuc4r|hupna$htjo?7&dnD`_ys#>1PlO&Do$Ly zGt{$edGeyWZ`m;Nodb$Oj3yjAmv7^3*0CImbOxFix0|6dZ?Zt+hxAi9J|2zhK)Bu{>a#c0l;~wX=2)k%Wp5 zjKJv|rBf|ailU&FDe;@a*PxW}EIA-3Z@G>mRi{ByG`26@gxMkdT@9Ui47*S5fyrh; zh<5;XF5d=)#FN+O<>u?4X&P0nb&v=I-1Cdq3e>X4)TRZ1W0j{rY98!(H8m=kGESIK z)m8_NyPMh`LJ@WqyogA@5MJBPkv_b0{!=(yPOMH{f>kLw{Jm<29dDi8hhF^vWMUb1 zEZc%8e}13i6K0&fRgTWVP7)swv2$(K>h~Xn6A3O86LM`L#RRgDQl;L!J2?zm}&dS32jDmZzfg>DR z20C%9>I@=$0=XA**WI^iHzQyG_^SH+qK@IdG6&(P#qsk{-C2)zZ4Y8J;n==(BX6&o zBLoL3PU32N9b_I->{zx1(bJ@AZC4Zam46Ng>qLA&Ga ztEBPj_35>E_rgJp+f4A1sqou1uR$f1!{Kt_W_L5r)?Y$^!kgqLXR9OpL&qOB_D4SQ zaI&UoasSwG>8RO2r$!{gTdqcwU+A>J%>$kIsPr>TI_-B4vShB{ow!UkE8Z!N5xg4-o!N+Y&hN*tS%+A^2<%$HzivBO7mi##i=pvhB!|X9?%|25_M5OxT1lu^ zz`)A%rC~lZIK4OHV@pGZVXC~j=54J}x6@!VQ4xNj$cRosm`@NqgrccA+vc$2FU3c2 zN81iBsS3YY^BPn#_jQ{i1iiXJv=8^9d7uLZvjM(xHSv}ye!nnb{(l8|X=W7gV>_5O zpw|k@o3EYg)(tM5bUC1uDyjIONJRUE!AGHnSSUhWcQcv>+5iAgr{}>(t_H_(aB?nK zY*uK;b!gM}pna$tCYy)VZHL(Zi)W^BB|EcjvXfk-&Lk!{atH<#0L}mSq`G08P`ZhrokXPSZ4h67tgl@gKYV1pH%{ dpMZbt@_!m)n*pw}8dU%Q002ovPDHLkV1nQjIL-h7 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json new file mode 100644 index 0000000..9620300 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gun_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8535dcd7e3154c1abff7f5f0deb72a9745eece0 GIT binary patch literal 6413 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601g>RL_t(&f$f@Wbd}Ya$N&5C zo|AKukUP1OkdrH*#BoFyTGUEKX&I*=Q$+^UX$yi}M6sQAI@M}jYi4P!gWMDaipA;z z?9z_nT3mD-2AYLjr3oR|lN-67Bqx`X^S=8sAKoY+$vL@TKTw{v&X=sccmBWiJkQ?G zyPr+8*7#d8at-(@w`;&xyIljm+U>6ftb?r_!6ujLZ;sT#HV*(o90`@g85bnZlwKI) zEW*cq<6^!sU|IKWoa!zs(z0){R>2}D^G0Y15Cb609;6kZtpO$cG$H&XjHsP7DyNdA zey@r+lCHS8D-LXVcVz4Cvrp^(=6k?g9vYno8kr3k@qh~2KdnGq=^*Y*K$*~@2Rcv> z)l&}bKMO5-ItY*2Lu01C%QEI2xRRc~V!)zmV}a_aTBR-jauS&h7XSAE;ZXjwP~BzF zfhK5efk1;sd0^!K1SBH)YpZBL1)+MYp;`_=cKrp!h}lablGhp&A1Q?qH)gS823B3C znQY$o@2b0WC2?oR^TZj@fqIDcBhZ0HXl2e1*P6|k&+ZGz}H@hOeW_RzSSAnM+Q3Y;HuJauQl$bSknDmTo+0a!I#A)EI@D*?hI zVR)8+CEa1~>?&wOcYOgGchgLswdmkTwT~EB)V-6Ud`CVe5otv<_6CUBx1oZ*A;(i! z3XI&9pfT42AVV)K`yuN70MYmXv=X4)4W6|KEM@kEV+;Uf0HW>>knP21SZvX3p0j*J z;XNW?b*1A_*pH(Wf&2#b?(JyRd4Mxe8LYPygQ%*&A6}wUux8q z0wd>f(AXk`hV6%_-vd$q9<(w+xEn^+La>zY0)!7aO`C17%6o0)mgXR5Q7mc}Yj*++K&~P}04Q!rzawBmjEhEwS5Z;{w=j$K~I^tmDE(eRh z1)*Urh=yGdb-SUJ1;Qd=WIh0v_Wkg%9mil*tOrZ_Hni|V_tg|T3jb|79Pwdch6OBY zw&qA*afOk&5N7o@=wRERAAvCOjXxI%=zZ+TxL8t>f^Fi>m?*r5bp+rOZ zieXi5h6=WWIFsNgSPQFiBUp6qY@YkX$KhCp1#Eut)6K+@u#~t`Vb$##q^Phx>+mcA zO}rHV4WU^;p8p7zcgFy%0hTrgM&?3*Izz*DeF5{_%h17gJNz>jfThlXsM`tEdHR5n z|HLff%2Z2`$ntb}aY2dio;w6tMa>TDQUi^IeARKO~G2`bPC!Xm&k=7VS4e<9bk z1+(Ni5a<=glwWTc6R>%D?RFaJc~~n8qIv(NlX(=3oTXriw*w>$Y}1FZygQ*q9|+;# z>Gy$8SOBny(6HU5u*zSB>Z=D~PVmeH;Hmdrmg}N^7i8-vyPSWw@dslAKDqh?OS$(3 zasET7Uhh|br$!Wb)?%>ad&0xE9E4TB|Dc^&U_0M5o0p&jft9%_);QRpW{DE9|46e1m5oXErFeWZepz+g(taU>I zE8mfLt7b<#PoHO(a>^R0ga)Z`2ZL=t3{kNO%JKt*f{(ug+_MyfMTUgceO{Pn{}Vb; z4-f{HaxaXDkA%*3%MY{Umtb)>KFBf`zdI^m+4x?jZ28Q~#?ORR{RTiCFg!m58$U#i zdogV5XRxZaKwEy>v&naZXFUwUqe8>>RKO}<2iaQDx5%TM)Hx+hLVHFMK8BI|{R69boyPLBJDl1J8LJgop8LpaE9d zi%`8)wr7Wx>wxO5gzl|@Z2bg;I+h!gez|FMz|~up%I>nwEa}_O$^=iH6SfkP?MEOg zH$#~nb{Hq!4xasE5Mx|u*gmg)&h}J5gMz1icOci@q33m%!K_#ZmM|Tvy9|WT<;LV+ zjS{$i*Y&dP|4thPYeAgJ;mf|xlQ7F)fe!jW2nCJ12}a&35F;kE=wK_Xb1y;qOF;+) zOS%(=XGwV2J}=C&7oq#=z_S)YbsPtcNM6SC){HKsRqMg=qJB@aG5Hw~=lGDYvf~&; zWDgz4ZpkAWC*p+)yM*ypUj1ONp~{to!WN5hAIPZ`Ye^-#TD5JF&N{|K`6 zAXr?{0+#v6JEH>DJ?GqJ*>8FslYR!`o;W0|@|V~(ZhwpI+1RNt^45Sj;zNrzeYR)2 z&Hy0biMI~qdYFwZPz&qqi%@-DXsto00VDTui2B_yCN4^#@wbldSkhJ}u}Yrx@r(yz zX~OiuVLOh&tlab!EQ_CJd)AQ{T6BLCtjdj$ohLy+z!JX&?pYE({ClflRjh;TuDk%@ z7ze|%6rz4N9Fu>+M_qUTK=8!Moh<(5hj`Ya%VGT`u+F^<)!zbufW=OQk-rASkq}z6 z)oIV`JOvGa#oaiN>*2z`(azbPN?fd)#ZCo{ErM)2w9k3Nx>=#t2>E%YdS0LbR{1NC z{xV#0twbn{tcUD9Km}JiuKSPmV*(bH8}eo6iDF0L&tplX2X>8H4zuhfs6Z0{fQ`$C zk-rusA|>Qn5Pq2D>!5r`ZO_IQ4di+l&t9DCU(-t+vEZJi5Z>)wG^%jAQLwgjOu#D8 zNJRN>_t9~aX7a3up}NapRjh;RYp^{VT?iv@HHa%ctY}g78btdMKm$Bs8hFm~@ZsOz z1gl~LRM#n7u9bi%%>aoQ583hgr$+9I@6f1%A@g@wzyM%XuD@6L&+c^;JY^pR-Q@rP z8aV-uf}hx3z)&Clq8C=>28g!9b~A09R;mBP9 ztKmIRSK2=s1^@a%IF?}nYtu)pvoHLaMtW}6%njN2KBzkzM*b=gcj%^=7Ji88t&lCB zKx;h^#w+YXCe*xOE3At3kew$6zfvL;Z2Vmyj#x-v@iC+DXSYz-gpl3^MsRCsmH&2z z>N@i$p0y}O`HI2Q=YvFf5W1TXfK{~xqU94n%VFob7TtE4={pKNh-U$Sy3=7~ErjLW z3F6M2=P3O7ABV#+Y+&8rL`2o54O#}5+2I&wHx_<~>TM7$2QP$i-fEDD)X?)xAFQg^ zA=?gPs7rpr+%P=<0@?m&K=|J@JWH04sDhA}cVEpNN#{W}eUvPlK0ZXFC*|_&9}Qhw z%K)sZ*C1OzgH{%3l*i6>R~ka+dJoKsSD}2x&}#7LB+O~wXNhjej^kB4amEamxv+7# z3?px*RlJ&|x=Rn!#2INk{r<~uAVfE;n(Yux`vGXM=p5U#LzbqtX{!UGY70c$p+R#N z7=TUt2Y@&r+y1wY#aw?o&slbCB>G3yE)}&q=F9ftT`X~ieeLq)_pu5>RKE!^(C(zJ zbT|s128ql@xXz(fwGpD_Ge8gJSr>T5Tzh!Sr=T%Y78tp!hWtnv%Er(Tf8(EI*Xivn z<~p~1vF3!ReG8)TLuf5QBPYVhTLl`G7iJ+lB4qOc=)qtK0gXrnPoE1FsDtV_-bbSg ze`w^b9x*I1)+Y}&+is8@$9Gd_Vh&562k9$@Y~E+zRp+k-jm}5dW?J=|5Y77lB`z1o zoM4H!fyGaQY(5Cx-&oC(?tGd}cyP~XHIMmGi)`4PB0E0+l@4|+VF}YfqYFVI(qNaN zAx!i@)b4~hzxPtl5(>hjz+$fljlTst&;Z$X2*jDRpGD_A%rX}bdxILxuE?_`9q>|7 zw`-2>tNn!rnZ^@u15LWa{zM$Ap^uDc>4VJNpxY@!Xlhq(T8a|*hEG3wmGW5VGX3Xleja$Vv9f`b3mL)Aj}O=1G>)( z*?zQ-I)qy&P z?mCsF`s(k}!8WR8H-XlK@MuMyiJc@W{{V?D=pe3)!Mp5N(5^inzS`{?@YQbDfUkD@ bn*;uT!Mhgno8v}d00000NkvXXu0mjfX)-)< literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json new file mode 100644 index 0000000..bbee06c --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gun_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png new file mode 100644 index 0000000000000000000000000000000000000000..852551390ada75cbc715da00c9c5464b09042095 GIT binary patch literal 5862 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601NU-L_t(&f$f@kklaNT$G@+; zf4|?%>>PXFIX31XCPYI41{E!~;$HWVe?Mm~)*KobRt?cQ^qr^A2V&Ml$j=g_|EIr(uY!sxesc z1$SmafH~hyI{El|&UJ2NH}y`|`4;&32%rH7fXu_%0|5XjfG9^I+zl1JS45XTA?x1w z7dVac?%ezWdn4rcKYF>&?7jis@G6icsbUEz)B>_%00h7upncO`C=giy0QSeA$2-8e zPJlg4DzQ%_*8NyCo_{;3`J4Iq0d@z;@BQs1Jl=hWF7!8w@FIx#D*<7F#|}bg4}l8< zU_T3H4X`ebP9Rc%3_&;z5YaY>=qtd`(CKHv`96?UH9(>ID^=?ykHD^;v$Jys=8=Cp z!N6mW>CyeKr^sRrp4v4b)MnOF;1 z_XY&XonSYWm$m0yC7UnWT2_DM00+Il`ACr5`9l$I1x1#?@A(aMuD6`=C)@yt01{>q zlMcvAfb1$zr~x9>01;aa3OB>=cn~_*1zEZNE3)s5q{4u(0g~pQ0svkbe%C|Lqx(G> zU;SFS^vYR<_pE?*^6!m7{~y{RBesa22CwsBu$z8qmq(yTI3N`T*)fn^2iR2*PCY2x z3<@^^Dh`qn19UXhOy+0d9sB{mU$2-oFjcosRP+HAXNbfXZB#z7>{?tJ8(BdsP1{$ddWHpx0VD_GO*wN zz_mL4%nwxSdjK~D?WK!Q4Irlmuo56Dh98MJ!IWkUoqh`bq5E0H*L*^~;$z=0<*m|y z-4uEIZttORQ=@A8aB-G|3Eg>^t+Gvf@DBYD$PbLE6`x9wT{~kgED1Phf8fd>{jdA1 z<(~pow9SjJs(5n0lrmV5{h z)_i$B-KdxZbHPCl><$5iA?RF>k*S42z#WFDKHL2EMuyeWE9xn-B$%$}8G-%w`!@u` zPyWqbu}M;N#r#4s1Mq>s1^c65f6Tz-y21H=^V>~jM0!0=>HC+I| zce|FA>n~7kAO8Jxqs|EI?YVU`g4}i1>YD%&Dj$q}KXd_O% zKo#HT0AL>+LF9 zYt5EZgaA_TJAMK^@?3{~`t3`~2IfMakq)NI3_7_3LEocnt@yM9yUr^MSf`$9 z^x7Zjwc4(R9yVLJda= zlUg%dDhd+LoWQ0sE)2rka|>k6hMQ&U##^RpH!ZM#@JBas_Q2Og_1W;+e+C9X(gDc| z1Lf2isENm}0j#)zB2`peFOx9wM&Rzf6|!RaHraOdlndANzy~&O;e7G~viU;j@s1-i zMOFeNV}J}DB_;ohiVFbzEZn`fLD*FfsukB?I#sjjfnU6H8@s8E)~e4Nxc@fPF~&zS z1A+p;KHUAAA*|R#YUSrHnd+_Sfe+tzi_RXp(Oz`}prQ-n_RPj6C$o`~@KQ#U`j*LK9 z@uJeIE2g^!kX>&wf~o+>f==&(-}Nx8m7fWb(>P@%ab{`x?B{x9&4wn~auFsMt;rBX zkOO-oV0Wmfw))Id7%<`IWx={|0x3BmOp5v2t}Kd@I#9UjNNtPkDnP|RGCWPHWB6SU zL#Lih+NXc3b~>J!HxGNi@fZh%^X%oHgwDPQ&h3Ct&~JJsb7N^V?L*yWn>| zWOg??z%kzy2oTa7o2UrLN-d0dVx!Yq!k_ zSZAJ7e*2aI5j(Aly%7YdCjeo#X5`d>oH_#)Sp?X1W(MU6%Bu@y?8EPT5IX%#%4)l! zkz%iOr)yqPiN`xQ@Q+Yph(x2P4HZl0-q zNx+v~j_$hSe`K+~aQx%0;rrZ`zSjlBtZ~u3`#N!=b zvzA{6s#rE>UrV>iiV5oi;AOyW((IwZ@DAJqine{zTE6LqQhF;Hm@~VS-?RM?gwv{) zT{F+hYf?VK&w+zcaA6qi4w^Hod|xqlr@`I`NIFo9FGVo;H;_~bSL=h+le;Lo5^C{fW~D6$OnYE|6!6kU3l|2U^8-e875c&6hymy0Qys}Ltk!pf z-6V8&zb9+XJyW(^^lYgf%=$3RZ{PB9oqFm{+4vSA>(4W}^B5oopn;$O4#tiCb(7Hf zKA@0OvFWUVIp0e`@AmKN zkr%F$b#H`hy1*3Ya^1z+RpYtVj2JQY6+ARV+o&vmH9yJ_$BoMiMg80@?I-@OT&W=nE`jtL{?EuAMb3 zFvlwoLFcyXgXH74!LGJc?YYpIXW$R*H2c1ztT_iFu?9hMC*Y<$S#!>vvh}^6 zExXUTUTX2Xe{njG?tO&w{jH+>wzBGZO()I(U+{a zMP)W|bxB1bBCU||)gY$`D9goS2VuuMiE~-qp+CC=JjG4=Q^#RXZsc& zKX@T)H%d+eM07b|SD8JspEV~FIu9_JyBxB@Tzw#dc2nTdy@t{&>lGmakG@geroSHsV(;b1%r4geW8RSIDP9GE=okDGn9Z~zX5$*wv` zcGZ2d_Vo`?VtszTeOvg;rCyrY9g1^i_XeHs{UEz3gf6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json new file mode 100644 index 0000000..261284b --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lee_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf5e9c019b5b9e73a5c58db74ec267e36b0073a GIT binary patch literal 7149 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%0Dy!50Qvv` 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json new file mode 100644 index 0000000..675fd62 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lee_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1c23c01c8f6e092ec6a4490c0288c1297a161f05 GIT binary patch literal 7409 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 ToP46E00000NkvXXu0mjfyx1e= literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json new file mode 100644 index 0000000..61c342c --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lee_4.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png new file mode 100644 index 0000000000000000000000000000000000000000..68e6400c4ba03d025640b3910ad9ea06552fde9c GIT binary patch literal 7031 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601$&oL_t(&f$f@UcvI(<$N%?g zwIs`yEMZw*B+GciJJ^6(!x9$Tm=KsGlcgb@WHRlf37Jet+eu17mZ5#pPLsBoCY_{o z$87zUTgb_kHhq&pGc) zuq=yzBqQzu-{E!__)fRGz<0WR>%f7DQ8Hi~PjvLQKjj%QKjgRB_#uCQ%Mt{`6Y|*z zWo%HSO8B!ZE$4s5i76xBsu+Arz?S+iwAQw^x4f3Il7Pb{4Y*tc%MjoQBES`jK=Szj zfKVWSP{5B6QHIjE!NUyBz_$4g5$kBTq?g z(Uktv3b9(_yg)~WnxKc+Bo;%Yra=9}*e&sqaGy`MxQ3M>08E2K? za1a?E56$|GNL;fHLb-f;(7!d7MZj)@v8ocobr%q~D5oWH<9!9|7m={;+@z6(4|9KQM(0f*>G}$q=_> zDRiY}kZN?{fd&GY=x&FhsuH6Oji3Vo2&7TSdVDABy;tEdbhFwG_db-gar>vU^*L)` zOMP`x|EW{PV1Q4?Em?;4{U0Ida!uhC;0hz4$jL$KwjGdXWP&3Q&Q=pxhJkCq1mn?4 zn7{f80lOUlz?ViMapfxL%C>?NAx87NZ-Xb|(ismvCW%bW2+YR!tbyC#|8K+S<*wxP z2OdNBXP>~?*N2UP<`?7g?4?9t!hyaoPJ#`E zZg_^|av+IMK~}%hCG5Z$Wv!_DgU$5Gi7y z-MA5nYwm?;o+_-!8+5xd+SCAj#pkda4Pa;rT!8@c^h_j|Y(Z>cA-EA!uM&q*kEUPj zLu_8!`2|nDxayXHEp^qp-ouA_rD=tPcXSkk=gxv<*vWtt9gT!l_aJHQT0|w!2f^je z4irEr;KxK)CweLlz}nFP%Hsw>l8~s?NG{oe#MSpe5IyrMVQ31SfBXoJt8Hxdcb|%m zO3QQJ5^(45es*A_scqZ*?T?~;|L@_Sut6Y|LbaqAy3M7CPE7?th7oy#K{!nY^j3U| z(Z*&3JsuDQ0kKL2^|BR6-c$-vTpWlnR*Ai*8%^*04CVeOoSdfk6(sC&C^1&5`6L~}MjEul=^azG)F2FlB2CyvnQVG;cmm#@yE2J7N zNFHz2J{c;AiSABN9xr+he1gb0xjTQ?p2+FOObblAY-HVAuh22M#RTp1K$@sU+_Dwm ziN#Znxfzs!&tgH}iE0d-Jq^$32v~*zPb`KaD-)^PwnLtod%Z@U6(~)?p}z{#u__GJ z)sC{C2O&X0mIR{CE%e(x@4AF*FTZS0{`|4q~LK3AEP>fPgS22I{5D zFnp;NKFb(H%2*Wd*$b&Qc}Aa<#{(02Sd})tX+@1?>{r;9!q&V7;kSw@4*AGb$5Xd_(1^RMM@A` zPyk(7Ib>;>AbI?2&%06g#vVvj;(^@f_9o2BQL{%Cy^j-aS=2dHbIu21(~E2?en63-|G;F+2Mt|_o?Rw{MvJ4 zWQ0<===t5(za%gjdHv%Sm@iBQB$s(`GV(@%pacuR|!o z(8AsOrVKbUFX@mdu4wnm*Jn8Ba$xjQ4Gc%CVAmTF3I@U9^B_ylgs!9%u?vg9lSrn_ zkSMncP4D~<%wL@chtEgu)8B)ta4}5Bk7Dr4({K-uf@PS=fHY5qr1cw+xMnRx^J1sn zAt<*SwXeT|sCemM?z68Y&I!2fH+xKuL6>Ink6#5r60o*5L4Wul#;=iAh@T|TP? zb#MLz>cR{|+9S`U%n8_Z=z|N!FY1@)eSa4Wl@%CiXawc<00bbEMI&kLI%qbOLL8?K zdw*_t`==ObxCEAAt|=kF6Gb3l`EqDBY(jKuW>{I5L*Ij@cYcbrt@rMWU-#gT<^*i- ztSxAM@4Y5n`9I^z$A5xv+fbo1Y5prV^-&mrn+yFp37h&4#{H z$3gqtU>O!peH**@hkH5PNcr4SO8{ux_o6@O=LvHD5>~I7^}i2H?hrwz6NBf@qW{!!xXflOc=S6MuDyUrb(A;% zx!0x@I3w_t5BHrMZt7aU_(yvoNtkj!zsUj)I|jcz1LLtOxXtG4d9+BWK;oJ;&~Ds< z2&FQte?JrmV7T@oOvjI6ysHzTKmZbTJklR{5QfUnpf1Wikp9@N?bG>~5qR{g!$tb4 zV|6ikD~Plm4^5x{vMd5lCq|nZU^sjb4uc*ciUL8B5X$9HFDr(wv>Xz3Vp!cv+V6w4 zPigNTm;2vczx}$Ex&$eI3{m7k@4_%ZdisPzYn(V zP8beXV63$bwATj~09Po4GB*#pvhpd)HJ8Js&Mfm_KcMXV$;~(Ei?DqveW8oBxB|kfo-B4TazuFhPI#bBxqC!ardL z3l;>2gD8y_DP`q|D_#zMq%^F^>l?RX@XNC>ov4OqWat}D9|?khJR=jyn>VB9z+a$R zn5oZt@`qDaNOJ<7XseO+RD5b>2q~HOZ_l9bWED&&PQYs!2Ur#)mjkgX7Mk_zk+gOb zgfWWnx|dEThH5WDf4Bm!=?>)xAVRJ{*5f{@K1S?8CIK{cm3$s&C1SD_%zcfZsX_?dCE>rKEx6 z&OQ|k1p=^jwn1NY2$q&sP@b6&_XSZ>%-?!Hf-Wb<+w0k+l}np-JN|W1IQqi|cJ(%L zhHB1@nQNQn32RG`yr~pC$+V5a8;oTbxXptwR33u4<~#xu_M4AvZc<4gLZLuPSvdlB z8^+rj5u2ahk#ui)t~fD+nSSu!xti;Nc<2A^8yabBSE-iVL+G~NKY6q=O*4*V82H9U z(f`Fsm`Z5S=_aQ`4GYcb02&7VIH*SV7CI;s7 zXFxC>s21fns}?UWl<4xqn%V1qZ}n13|It7Fa-^yGS=W$_P#3R8(z*?k#X5%r%In5Z z%>@{%kHOyC3uY!zf&j_mLZnbaRk#>Yx@6d{bYP;p9kP@}MxH+ZDNWhVk8VZpZMn8& zt*ud8iK{&b*zE{WG{8Q`_?a)QVt8(J8a5v^tSBxjE>0tHaj;& zg-C(`L2$WrgiK0{Rqf6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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 LNkvXXu0mjfhTnN6 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json new file mode 100644 index 0000000..44e39c0 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sitting_fox0.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png new file mode 100644 index 0000000000000000000000000000000000000000..61410e0272cc73b2503e760d0a37ef62831d9dc8 GIT binary patch literal 3816 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600Z<%L_t(oh27X&h}2~m$MMg* zr!tc;gXln%bg;0ZuA&R+rXW!yq3|lgpscH)6G0Fm1riZfU}a?nEiv5^WXo@?9T4a!q5+fng9EL56|~KJkRq^iU|K#rDkv`rTI7> z5kHUFIHi8vi&^+2BKA&;m6OycxRlajtj0NbHzJ;B**K*e@k8`WE-#0CX$d`PhruMbQ^{AR>OL)Vm%Z;fkW@S1gQ( zohhZBh^S4g(zrIfmL<>uf!%)>Bh=$8T4 zVh|7GnMz+ru>@PX0gUEw=V1$ODvE08DSrQse{hNHaLTITO}rctyQa(FiKrP|!uwb@ z$v&UO>-Z}oPE5_bsi_%Uuj~OIZKHi4Ret}5{rE%P!uw8xA#8-tK9RaMuJ&(tYUZJ{%`D>3t4TN&|8xawV?8Tp4s87U1j- z7~e{#<*?BsZ~wYyZsn!lj)?oKg)QMY6ZbBa4?5XfF2Ls|=XlytO=D~JV`fo4R!rT8 zYpWSiJ8<=m`s7(#iua~u{@6NzHP|Ds+Pc!aR$loiZmH(9W5SK7*vMY)!iI_4+_u(5 z#PVXy+wiH;Njf7ze~O5!s}&{!*CU^~Wpc>qREAR44lIv|ZN+5Xj*m4wbgMJBDI%7P zvU!4VvoRlw1by9ZoCp5fZJ>lLI5qpa92IOEqcO27(@N`71s=jC& zZdAiOvmH@6%}Oct;bQq_GS;=LzAd-ok$PS_!p1JSG@nsQ=?2_^7g|&adBuCNOFpA7 zHtlOV;i{|KP9mIAS}FglR*j>>a_ZGzyc?8n{jDaUyH+lx^pt!_F6XyZ_kT+Eplc%H z%Q5@w7PyqsOnfFM33Uz2ac{eP=i4e@jSfV_(71he3ml}BuEK?~2RtTcDTn2o!l{Y= e7ur>Doz{QBJhs#^hiQHQ0000f6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600U)7L_t(oh3(i)Xk1ko#_``t z()a;d+6q!Fq9RyI#Sd_!(4}HYkQS7#R1~zjwdztt5L}h&My(4K)QuGsEuvthy3r~K zw)oY6wlRLRQjIN1Y%;Hlb0@vMxk)FJnUY8!xMc3hIp;qAdCz;^b09&cP`y!#%hN??uGHuDEPdGvHE6gV=!!@mfSYKI`C=uE*EK?Mo5yP)ey6jaURr zq7H5|b``fru{9!g%@~+c54PdiqUlrIjo)Fh!mY$XtSFj3#Dfv>bEV&Pcn4P%O^2~D zBKD`0dLp9HRp%{eHn=aHG7T?aM?`#A^jU|UxTVzR4-7=azLZj0tdU!V&#)F#XkeKP zxD&&81W#7xI*vQBXEA_L54Rk9aAVQbKu_`cH~fRkzer(6XmA;ectF$$N%8+IKi}A|eF&SP0Gt{bSw4X~aFcw}FRS^G{tlY2 zQxw;Ha{7C0iimH^jdi8qO5BHyGGuT2J{P2^;@OSjDns|0nFjlDdqj*h8*1O@Af?nV zC-XIOf?r)sx)vL7eg{E1rOz=K5l5HND(IoAhpvz+5~WoHy$$p!uWh}fG_S{)I;PJ5mw+zPD6pnMGD)Y($$zOOJ; z_XSMI1$bQE1)F0=@NPu>P5j7iiwCgS?jsoGitF+JECsA+_nw3 r6x3C?YIM)`&kyG!w^VfwZmH@&e9C*&3(olA00000NkvXXu0mjfEj9Gi literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json new file mode 100644 index 0000000..dd0f044 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sitting_fox2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png new file mode 100644 index 0000000000000000000000000000000000000000..050be9b79d32377a2957abfa9f1a4277602f9a6b GIT binary patch literal 3765 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600Y5EL_t(oh3(f{h*nh;2k_sX z87I4%+Djx+(Z$S&q8=*nO(Ii5q3|g}u*|p83WDfr5IvOj(8Zt|-7JeBA|g^M3A#W~ zL6}jRSn61LDMy=`)x$ocr|*6~9l`JqhwnT4tiAU7@3q(3Yo&KTUZ07Gn^Q`?7>SBUBBhiH zdq!Hw^tAe3C*OeFJgh2S2e2q2R@F^RsRv8(a53}=uE!SWl-#JnDWy|z8TyOoBpie7 zSc_jHVmPJL8xh0ZlADC}m{<&bfSV#>Lyg>pcn4<|L%(2FM0{I$hf_Kk_hJDCkkWxyWY+f^RUzUu9r?5OCzAt2^VFj)z$!x{!i1?z@#Y=0B$6dI)jp#Z# z#y{_t++=);sTjrx#>oU%U=tSOo*G@daV=I?jkjXmNmz*6Fd4l~M8Cnzh}hCrX9IE* zuo@Q^LnHDLf#0wTr^yMYj1fGG$0Opqb_>@Tk`u~!T#Bc0eiP9VEQyH6+UjgTF5wl- zuWDd{`wHX!h={?elT%84cpI}@h`kpP*R<8ufLyPf0he@OOUS`r{=XR;u}wb0Kg$_( z06S&R@5T=N84>@KV>G37JYK@w7VG{H5$9GSS9q--kK&dZ*&*~bAy+0@#y&awm4EjX z?ZMC_Rd4*G_Hlt(o^aLCAOOGPxLd(}9H629ck+bJuPn~mq?JEj)3#_yF&qp`p` zv`QAca8*Qn)=p9FvAh#k;}W^jFJriP`m0)75v}5R5D!MgvQ88=x(d#~jhH2qY*r~8 zZv2j=5%FB76B_n&kW%WGGuGKS4`<0lr(%X&O&l)l#DYfMNh>rZ$Nqb7ihKc+v*irD zue-$4EuM^s#Z@PDLT)sX^vSU>4=;CPVHemSw?Zo;;_u4cMyIl+>SZoo?ZVJbu}5xB zSIa%zR}rzd8%0&f^~fD6EPignFTkZkMVa!#bP0om(8!LxO|#P&0H*?nuCxlB@OZSb3=F`bRx? fgyJZf6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600U)7L_t(oh3(i)Xk1ko#_``t z()a;d+6q!Fq9RyI#Sd_!(4}HYkQS7#R1~zjwdztt5L}h&My(4K)QuGsEuvthy3r~K zw)oY6wlRLRQjIN1Y%;Hlb0@vMxk)FJnUY8!xMc3hIp;qAdCz;^b09&cP`y!#%hN??uGHuDEPdGvHE6gV=!!@mfSYKI`C=uE*EK?Mo5yP)ey6jaURr zq7H5|b``fru{9!g%@~+c54PdiqUlrIjo)Fh!mY$XtSFj3#Dfv>bEV&Pcn4P%O^2~D zBKD`0dLp9HRp%{eHn=aHG7T?aM?`#A^jU|UxTVzR4-7=azLZj0tdU!V&#)F#XkeKP zxD&&81W#7xI*vQBXEA_L54Rk9aAVQbKu_`cH~fRkzer(6XmA;ectF$$N%8+IKi}A|eF&SP0Gt{bSw4X~aFcw}FRS^G{tlY2 zQxw;Ha{7C0iimH^jdi8qO5BHyGGuT2J{P2^;@OSjDns|0nFjlDdqj*h8*1O@Af?nV zC-XIOf?r)sx)vL7eg{E1rOz=K5l5HND(IoAhpvz+5~WoHy$$p!uWh}fG_S{)I;PJ5mw+zPD6pnMGD)Y($$zOOJ; z_XSMI1$bQE1)F0=@NPu>P5j7iiwCgS?jsoGitF+JECsA+_nw3 r6x3C?YIM)`&kyG!w^VfwZmH@&e9C*&3(olA00000NkvXXu0mjfEj9Gi literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png new file mode 100644 index 0000000000000000000000000000000000000000..83ffffa3bbea51c68799b95c215ef63a5b64a824 GIT binary patch literal 193380 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�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


FmnPksAb`9n1mvXR+ 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⪙!$x}pihTVbK%$nZohE-Qj8?g%EBlCkE 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

mm zV!#9HU8GXDZfA9b2dHJphy>dBu15OR%9hQ{phd+02!jsG#Rr{noiLR&wjDG zW#PKa+cp>$cL(@c7$_M=F)lHXk?9UrUQI2`5HX pivRDT|NHsh75M+J0F)2MeP;BuUc>(5{{a3kP}l$f literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..83ffffa3bbea51c68799b95c215ef63a5b64a824 GIT binary patch literal 193380 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�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


FmnPksAb`9n1mvXR+ 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⪙!$x}pihTVbK%$nZohE-Qj8?g%EBlCkE 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

mm zV!#9HU8GXDZfA9b2dHJphy>dBu15OR%9hQ{phd+02!jsG#Rr{noiLR&wjDG zW#PKa+cp>$cL(@c7$_M=F)lHXk?9UrUQI2`5HX pivRDT|NHsh75M+J0F)2MeP;BuUc>(5{{a3kP}l$f literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json new file mode 100644 index 0000000..2ed3677 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "1024.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "1024 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.png b/iBox/Resources/Assets.xcassets/Logo/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..83ffffa3bbea51c68799b95c215ef63a5b64a824 GIT binary patch literal 193380 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�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


FmnPksAb`9n1mvXR+ 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⪙!$x}pihTVbK%$nZohE-Qj8?g%EBlCkE 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

mm zV!#9HU8GXDZfA9b2dHJphy>dBu15OR%9hQ{phd+02!jsG#Rr{noiLR&wjDG zW#PKa+cp>$cL(@c7$_M=F)lHXk?9UrUQI2`5HX pivRDT|NHsh75M+J0F)2MeP;BuUc>(5{{a3kP}l$f literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/128.imageset/128 1.png b/iBox/Resources/Assets.xcassets/Logo/128.imageset/128 1.png new file mode 100644 index 0000000000000000000000000000000000000000..077d76c18344fce066fb9f879587ff94f3e58f46 GIT binary patch literal 7717 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%0DW1XigtH6nYJOby#a+0 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png b/iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png new file mode 100644 index 0000000000000000000000000000000000000000..fd64f798c4b32616e5d22f02432bea6d93497da2 GIT binary patch literal 22350 zcmcFqg;yKR+f8uy;#w$Dv=Fp76fIIHP#g*k1a}VvZ(p>yyOsh460A5B*I>mZxDo86m z>FTcSM{}I}SgYqz({`4B1zw(PFd8Nv1*i7^-@$4zj58M1pHs(_CZ>XV!w~Nwi<~Mh z1yMU@$b2J58t1^a5u2qqoH9mG+1HuLhJ}6mT9e|oO3{JA(H}z4;N(h!p5F+jHm)b) z0^wop=go?fR$}k#9m7<{>@8DGy$szRYvQ0k!%lo0i4Z;sRnaFAW@KQ^p|q5Zh5$Cm z8y+dGonnxEfTb^&R&i2wEiW+yB^<%J1ajoku!>X7;>8b2p`wd}>jv_gE?^;kCCM0j zS?_D^DAn_o=at#Z%=8w698FDkTNA?KnSJnEKFT>u=PZnV#(qHm_ z@XJ!c?LEqPrqXyeMESI0-aRwrPs2~cx{_(elT>6G!=y*$rKE;dx4rM7@PPUxyJfv3 zowAS9X3GR9NtDjH8ZyUYYRagt{3A+=!?F_Y=<`W!b{TzPMvtKMsgsLCD6~?`)cp< z@={2kMW;N=@{~`obm=eG;O6OWifs8u2?ZX3|3+bGby)7^W+Yv)=_?<|JUl*sUQZKe zU%RHGrS+RIVVbM68H=)?tvakRJmf!Qq89m%?D4-#&?7e!L<3;ICi0Ou9vO)qe%>5N zpj$$@h5@&`rPXH59=qYY0GV!r1A`anS5$PID$(&BD<~@~EB-XxwVHQPluI_Z!#!Ig znf4(pIR_S=hHI~2zWjiL4z2G5x9HeJig#B>{7e2vtyG?#o~E`~5|3tI)~Skp6^%Z^ zR3IiNZ7m>;!W;RHGa<_~<|2BkIHR;`Q`;NqX6d$oiz0~pQEAx8$;n+rWMuoo?5y|L zU@~_D^_lbfzu!kCXe<*1$VUS)GEG34R9t%x_-WL;t?sjn%kgX03IF4NX@ytHqzTet zj8eDArc($+eg~9UHP*%HUlP(_6Zu| zW~9!a2Us=NOFOW+4wPBHau*skX%Bo@q1|2#w=2P#J_VnF{`WdO;sNW$v6>d^MOVY5s<)D~KF z*B2gUB#zogmq_8 zs4md=>faKb!Ou@8zUQlbM9Kzb=!4rJHwZ5LeI<_>*0ye?4|>2gmM~#yK!gPQt4A)W zZ&6Fgky=ixvN_QbBISfoA>}c zLEj3GM&BNpxINx%2NfX@7f=KS(U|*A$HvJ#ARc*qPQel?NkPVML=%G(rZhMc2GHO* zq4=yBj-xaSbD$K0aOaF(=T+VP^KQSR%DtT`B}#v#_|f?DX=Y;D5L#ZzY4vjl4nW0- z=GrElSX_6Jmc=MuaMNo*LT9eT?I2j=Ni>zm@U+R+%{xb;j?P?m1dRWI7-6rb zYd!jXM!2vE{vs!(Z&KhVN5h%0DW1XigtH6nYJOby#a+0 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json b/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json new file mode 100644 index 0000000..6c63c7e --- /dev/null +++ b/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "256.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "256 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/Logo/256.png b/iBox/Resources/Assets.xcassets/Logo/256.png new file mode 100644 index 0000000000000000000000000000000000000000..fd64f798c4b32616e5d22f02432bea6d93497da2 GIT binary patch literal 22350 zcmcFqg;yKR+f8uy;#w$Dv=Fp76fIIHP#g*k1a}VvZ(p>yyOsh460A5B*I>mZxDo86m z>FTcSM{}I}SgYqz({`4B1zw(PFd8Nv1*i7^-@$4zj58M1pHs(_CZ>XV!w~Nwi<~Mh z1yMU@$b2J58t1^a5u2qqoH9mG+1HuLhJ}6mT9e|oO3{JA(H}z4;N(h!p5F+jHm)b) z0^wop=go?fR$}k#9m7<{>@8DGy$szRYvQ0k!%lo0i4Z;sRnaFAW@KQ^p|q5Zh5$Cm z8y+dGonnxEfTb^&R&i2wEiW+yB^<%J1ajoku!>X7;>8b2p`wd}>jv_gE?^;kCCM0j zS?_D^DAn_o=at#Z%=8w698FDkTNA?KnSJnEKFT>u=PZnV#(qHm_ z@XJ!c?LEqPrqXyeMESI0-aRwrPs2~cx{_(elT>6G!=y*$rKE;dx4rM7@PPUxyJfv3 zowAS9X3GR9NtDjH8ZyUYYRagt{3A+=!?F_Y=<`W!b{TzPMvtKMsgsLCD6~?`)cp< z@={2kMW;N=@{~`obm=eG;O6OWifs8u2?ZX3|3+bGby)7^W+Yv)=_?<|JUl*sUQZKe zU%RHGrS+RIVVbM68H=)?tvakRJmf!Qq89m%?D4-#&?7e!L<3;ICi0Ou9vO)qe%>5N zpj$$@h5@&`rPXH59=qYY0GV!r1A`anS5$PID$(&BD<~@~EB-XxwVHQPluI_Z!#!Ig znf4(pIR_S=hHI~2zWjiL4z2G5x9HeJig#B>{7e2vtyG?#o~E`~5|3tI)~Skp6^%Z^ zR3IiNZ7m>;!W;RHGa<_~<|2BkIHR;`Q`;NqX6d$oiz0~pQEAx8$;n+rWMuoo?5y|L zU@~_D^_lbfzu!kCXe<*1$VUS)GEG34R9t%x_-WL;t?sjn%kgX03IF4NX@ytHqzTet zj8eDArc($+eg~9UHP*%HUlP(_6Zu| zW~9!a2Us=NOFOW+4wPBHau*skX%Bo@q1|2#w=2P#J_VnF{`WdO;sNW$v6>d^MOVY5s<)D~KF z*B2gUB#zogmq_8 zs4md=>faKb!Ou@8zUQlbM9Kzb=!4rJHwZ5LeI<_>*0ye?4|>2gmM~#yK!gPQt4A)W zZ&6Fgky=ixvN_QbBISfoA>}c zLEj3GM&BNpxINx%2NfX@7f=KS(U|*A$HvJ#ARc*qPQel?NkPVML=%G(rZhMc2GHO* zq4=yBj-xaSbD$K0aOaF(=T+VP^KQSR%DtT`B}#v#_|f?DX=Y;D5L#ZzY4vjl4nW0- z=GrElSX_6Jmc=MuaMNo*LT9eT?I2j=Ni>zm@U+R+%{xb;j?P?m1dRWI7-6rb zYd!jXM!2vE{vs!(Z&KhVN5h%0DW1XigtH6nYJOby#a+0 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png b/iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1538725118315a4665ccd61787a1981cf64ee8 GIT binary patch literal 1196 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 Date: Sat, 2 Mar 2024 22:54:06 +0900 Subject: [PATCH 073/370] =?UTF-8?q?feat:=20launchScreen=EC=9D=B4=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=EC=95=B1=20=EA=B5=AC=EB=8F=99=EC=9D=84=20?= =?UTF-8?q?=EA=B2=B0=EC=A0=95=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/SceneDelegate.swift | 4 +- .../Sources/Versioning/VersionCheckCode.swift | 21 +++++ .../Versioning/VersioningHandler.swift | 91 ++++++++++++------- 3 files changed, 80 insertions(+), 36 deletions(-) create mode 100644 iBox/Sources/Versioning/VersionCheckCode.swift diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 9059b7e..c09f0a3 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -37,8 +37,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let favoriteUrl = favorite.url WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) - window?.rootViewController = MainTabBarController() - window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 + window?.rootViewController = CustomLaunchScreenViewController() + window?.makeKeyAndVisible() if let urlContext = connectionOptions.urlContexts.first { let url = urlContext.url diff --git a/iBox/Sources/Versioning/VersionCheckCode.swift b/iBox/Sources/Versioning/VersionCheckCode.swift new file mode 100644 index 0000000..8466b5a --- /dev/null +++ b/iBox/Sources/Versioning/VersionCheckCode.swift @@ -0,0 +1,21 @@ +// +// VersionCheckCode.swift +// iBox +// +// Created by Chan on 3/2/24. +// + +enum VersionCheckCode { + case Initial // 초기값 + case success // 성공 + case later // 나중에 (ab testing code) + case update // 업데이트 (ab testing code) + case urlError // URL 관련 에러 + case networkError // 네트워크 요청 실패 + case decodingError // 디코딩 실패 + case versionOutdated(mandatoryUpdate: Bool, updateUrl: String) // 버전이 구버전일 때 + case serverError // 서버 에러 또는 기타 에러 + case internalSceneError // 내부 씬 에러 + case internalInfoError // 내부 인포 에러 + case maxRetryReached // 최대 재시도 횟수 도달 +} diff --git a/iBox/Sources/Versioning/VersioningHandler.swift b/iBox/Sources/Versioning/VersioningHandler.swift index b082c0f..cd76717 100644 --- a/iBox/Sources/Versioning/VersioningHandler.swift +++ b/iBox/Sources/Versioning/VersioningHandler.swift @@ -9,61 +9,84 @@ import UIKit class VersioningHandler { - func checkAppVersion() { + func checkAppVersion(retryCount: Int = 0, completion: @escaping (VersionCheckCode) -> Void) { + let maxRetryCount = 3 let urlString = "https://my-json-server.typicode.com/42Box/versioning/db" - guard let url = URL(string: urlString) else { return } + guard let url = URL(string: urlString) else { + completion(.urlError) + return + } - let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in - guard let data = data, error == nil else { return } + let task = URLSession.shared.dataTask(with: url) { data, response, error in + guard let data = data, error == nil else { + if retryCount < maxRetryCount { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.checkAppVersion(retryCount: retryCount + 1, completion: completion) + } + } else { + completion(.maxRetryReached) + } + return + } do { let versionInfo = try JSONDecoder().decode(VersionInfo.self, from: data) guard let latestVersion = versionInfo.version.first?.latestVersion, let minRequiredVersion = versionInfo.version.first?.minRequiredVersion, - let updateUrl = versionInfo.url.updateURL else { return } - - DispatchQueue.main.async { - self?.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, updateUrl: updateUrl) + let updateUrl = versionInfo.url.updateURL else { + completion(.urlError) + return } + + self.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, updateUrl: updateUrl, completion: completion) } catch { - print(error) + completion(.decodingError) } } task.resume() } - func compareVersion(latestVersion: String, minRequiredVersion: String, updateUrl: String) { - guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return } + func compareVersion(latestVersion: String, minRequiredVersion: String, updateUrl: String, completion: @escaping (VersionCheckCode) -> Void) { + guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { + completion(.internalInfoError) + return + } - if appVersion.compare(minRequiredVersion, options: .numeric) == .orderedAscending { - showAlertForUpdate(updateUrl: updateUrl, isMandatory: true) + if appVersion.compare(minRequiredVersion, options: .numeric) != .orderedAscending { + showAlertForUpdate(updateUrl: updateUrl, isMandatory: true, completion: completion) } else if appVersion.compare(latestVersion, options: .numeric) == .orderedAscending { - showAlertForUpdate(updateUrl: updateUrl, isMandatory: false) + showAlertForUpdate(updateUrl: updateUrl, isMandatory: false, completion: completion) + } else { + completion(.success) } } - - func showAlertForUpdate(updateUrl: String, isMandatory: Bool) { - guard let windowScene = UIApplication.shared.connectedScenes.first(where: { $0 is UIWindowScene }) as? UIWindowScene, - let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { - return - } - - - let message = isMandatory ? "새로운 버전이 필요합니다. 업데이트 하시겠습니까?" : "새로운 버전이 있습니다. 업데이트 하시겠습니까?" - let alert = UIAlertController(title: "업데이트 알림", message: message, preferredStyle: .alert) - - alert.addAction(UIAlertAction(title: "업데이트", style: .default, handler: { _ in - if let url = URL(string: updateUrl), UIApplication.shared.canOpenURL(url) { - UIApplication.shared.open(url) + func showAlertForUpdate(updateUrl: String, isMandatory: Bool, completion: @escaping (VersionCheckCode) -> Void) { + DispatchQueue.main.async { + guard let windowScene = UIApplication.shared.connectedScenes.first(where: { $0 is UIWindowScene }) as? UIWindowScene, + let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { + completion(.internalSceneError) + return } - })) - - if !isMandatory { - alert.addAction(UIAlertAction(title: "나중에", style: .cancel)) + + let message = isMandatory ? "새로운 버전이 필요합니다. 업데이트 하시겠습니까?" : "새로운 버전이 있습니다. 업데이트 하시겠습니까?" + let alert = UIAlertController(title: "업데이트 알림", message: message, preferredStyle: .alert) + + alert.addAction(UIAlertAction(title: "업데이트", style: .default, handler: { _ in + if let url = URL(string: updateUrl), UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + completion(.update) + } + })) + + if !isMandatory { + alert.addAction(UIAlertAction(title: "나중에", style: .cancel, handler: { _ in + completion(.later) + })) + } + + rootViewController.present(alert, animated: true) } - - rootViewController.present(alert, animated: true) } } From c8436bbff719e226ab2cf63ca154c94f9305bec0 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:49:11 +0900 Subject: [PATCH 074/370] fix: change image idiom --- .../42flip/42flip_01.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_010.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_011.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_02.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_03.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_04.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_05.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_06.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_07.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_08.imageset/Contents.json | 24 +++++++++---------- .../42flip/42flip_09.imageset/Contents.json | 24 +++++++++---------- .../cat/cat_page0.imageset/Contents.json | 24 +++++++++---------- .../cat/cat_page1.imageset/Contents.json | 24 +++++++++---------- .../cat/cat_page2.imageset/Contents.json | 24 +++++++++---------- .../cat/cat_page3.imageset/Contents.json | 24 +++++++++---------- .../cat/cat_page4.imageset/Contents.json | 24 +++++++++---------- .../fox/fox_page0.imageset/Contents.json | 24 +++++++++---------- .../fox/fox_page1.imageset/Contents.json | 24 +++++++++---------- .../fox/fox_page2.imageset/Contents.json | 24 +++++++++---------- .../fox/fox_page3.imageset/Contents.json | 24 +++++++++---------- .../fox/fox_page4.imageset/Contents.json | 24 +++++++++---------- 21 files changed, 252 insertions(+), 252 deletions(-) diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json index f0c1e4c..c3f3e0f 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_01.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_01.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json index 4e0bb94..decba56 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_010.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_010.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json index bea3168..8b7a961 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_011.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_011.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json index 5f4b4af..2f3ab5c 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_02.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_02.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json index 39a1252..1bb5447 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_03.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_03.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json index d058475..ebcc599 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_04.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_04.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json index 8a8368f..94ea571 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_05.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_05.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json index 2307ca5..a5e0bd3 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_06.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_06.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json index d8a388f..44ffa40 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_07.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_07.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json index 0b3e8e3..68d2e68 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_08.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_08.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json index f510ebf..73c69c8 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "42flip_09.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "42flip_09.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json index 4c1f862..2e12dbe 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "cat0.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "cat0.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json index 531a152..1c2d433 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "cat1.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "cat1.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json index 71c93f4..5a36dbe 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "cat2.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "cat2.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json index 53f3707..59c27aa 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "cat3.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "cat3.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json index dad40cb..fa18c78 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "cat4.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "cat4.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json index 64bcd2c..9d2d8fb 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "fox0.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "fox0.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json index b59bbbf..28696dd 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "fox1.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "fox1.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json index 7b2f55b..9054a45 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "fox2.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "fox2.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json index 533abef..c5f7545 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "fox3.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "fox3.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json index 018fb9c..db0dfe4 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json @@ -1,20 +1,20 @@ { - "images" : [ + "images": [ { - "idiom" : "mac", - "scale" : "1x" + "idiom": "universal", + "scale": "1x" }, { - "filename" : "fox4.png", - "idiom" : "mac", - "scale" : "2x" + "filename": "fox4.png", + "idiom": "universal", + "scale": "2x" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 }, - "properties" : { - "template-rendering-intent" : "template" + "properties": { + "template-rendering-intent": "template" } -} +} \ No newline at end of file From 6eceab9a301c9aedf90b5dc2c7c7987d8ba2d5c7 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:50:35 +0900 Subject: [PATCH 075/370] feat: custom launchscreen version check handler --- .../CustomLaunchScreenViewController.swift | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift diff --git a/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift new file mode 100644 index 0000000..01aefba --- /dev/null +++ b/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -0,0 +1,72 @@ +// +// CustomLaunchScreenViewController.swift +// iBox +// +// Created by Chan on 3/2/24. +// + +import UIKit +import Combine + +class CustomLaunchScreenViewController: UIViewController { + private var customLaunchScreenView: CustomLaunchScreenView! + private var cancellables: Set = [] + + override func viewDidLoad() { + super.viewDidLoad() + + configureLaunchScreenView() + observeVersionCheckCompletion() + } + + private func configureLaunchScreenView() { + customLaunchScreenView = CustomLaunchScreenView(frame: self.view.bounds) + self.view.addSubview(customLaunchScreenView) + + customLaunchScreenView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + } + + // MARK: - Custom Update Checker View (예정) + private func observeVersionCheckCompletion() { + AppStateManager.shared.$isVersionCheckCompleted + .receive(on: DispatchQueue.main) + .sink { [weak self] result in + switch result { + case .success, .maxRetryReached, .later: + self?.transitionToNextScreen() + case .urlError: + print("URL 에러가 발생했습니다.") + case .networkError: + print("네트워크 요청에 실패했습니다.") + case .decodingError: + print("응답 디코딩에 실패했습니다.") + case .versionOutdated(let mandatoryUpdate, let updateUrl): + if mandatoryUpdate { + print("필수 업데이트가 필요합니다. 업데이트 URL: \(updateUrl)") + } else { + print("업데이트가 있습니다. 업데이트 URL: \(updateUrl)") + } + case .serverError: + print("서버 에러 또는 기타 에러가 발생했습니다.") + case .update: + print("업데이트 클릭") + case .internalSceneError: + print("scene error 수집") + case .internalInfoError: + print("info error 수집") + case .Initial: + print("초기값") + } + } + .store(in: &cancellables) + } + + + private func transitionToNextScreen() { + let mainViewController = MainTabBarController() + + guard let window = self.view.window else { return } + window.rootViewController = mainViewController + UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {}, completion: nil) + } +} From 42443ba91268fb3853a562d166d08af9350056bd Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:51:17 +0900 Subject: [PATCH 076/370] feat: add custom launchscreen view --- .../CustomLaunchScreenView.swift | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift diff --git a/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift b/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift new file mode 100644 index 0000000..7d46ee5 --- /dev/null +++ b/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift @@ -0,0 +1,80 @@ +// +// CustomLaunchScreenView.swift +// iBox +// +// Created by Chan on 3/2/24. +// + +import UIKit + +import SnapKit + +class CustomLaunchScreenView: UIView { + private let logoImageView = UIImageView() + private var imageViews: [UIImageView] = [] + private let images = ["fox_page0", "fox_page1", "fox_page2", "fox_page3", "fox_page4"] + private var timer: Timer? + + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + configureUI() + } + + private func configureUI() { + backgroundColor = .box2 + + logoImageView.image = UIImage(named: "1024") + logoImageView.contentMode = .scaleAspectFit + addSubview(logoImageView) + + for imageName in images { + let imageView = UIImageView(image: UIImage(named: imageName)) + imageView.contentMode = .scaleAspectFit + imageView.isHidden = true + imageView.tintColor = .white + addSubview(imageView) + imageViews.append(imageView) + } + + logoImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(200) + } + + imageViews.forEach { imageView in + imageView.snp.makeConstraints { make in + make.bottom.equalToSuperview().inset(20) + make.left.equalToSuperview().inset(20) + make.width.height.equalTo(32) + } + } + + changeImages() + } + + private func changeImages() { + var currentIndex = 0 + + timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] timer in + guard let self = self else { return } + + let state = AppStateManager.shared.isVersionCheckCompleted + if state == .success || state == .later || state == .maxRetryReached { + timer.invalidate() + self.timer = nil + return + } + + self.imageViews.forEach { $0.isHidden = true } + self.imageViews[currentIndex].isHidden = false + + currentIndex = (currentIndex + 1) % self.imageViews.count + } + } +} From e29ee189afd32b8b7b353c485967ad9241cc8288 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:51:57 +0900 Subject: [PATCH 077/370] fix: delete test logic --- iBox/Sources/Versioning/VersioningHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Versioning/VersioningHandler.swift b/iBox/Sources/Versioning/VersioningHandler.swift index cd76717..9b21638 100644 --- a/iBox/Sources/Versioning/VersioningHandler.swift +++ b/iBox/Sources/Versioning/VersioningHandler.swift @@ -53,7 +53,7 @@ class VersioningHandler { return } - if appVersion.compare(minRequiredVersion, options: .numeric) != .orderedAscending { + if appVersion.compare(minRequiredVersion, options: .numeric) == .orderedAscending { showAlertForUpdate(updateUrl: updateUrl, isMandatory: true, completion: completion) } else if appVersion.compare(latestVersion, options: .numeric) == .orderedAscending { showAlertForUpdate(updateUrl: updateUrl, isMandatory: false, completion: completion) From 6e901e740a295df2c91e2f8ca7da78252179df8c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:52:17 +0900 Subject: [PATCH 078/370] =?UTF-8?q?feat:=20=EC=83=81=ED=83=9C=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20App=20State=20Manager?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/AppStateManager.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 iBox/Sources/Shared/AppStateManager.swift diff --git a/iBox/Sources/Shared/AppStateManager.swift b/iBox/Sources/Shared/AppStateManager.swift new file mode 100644 index 0000000..e2422b1 --- /dev/null +++ b/iBox/Sources/Shared/AppStateManager.swift @@ -0,0 +1,18 @@ +// +// AppStateManager.swift +// iBox +// +// Created by Chan on 3/2/24. +// + +import Combine + +class AppStateManager { + static let shared = AppStateManager() + + @Published var isVersionCheckCompleted: VersionCheckCode = .Initial + + func shouldTransitionToNextScreen(completion: @escaping (VersionCheckCode) -> Void) { + completion(isVersionCheckCompleted) + } +} From 32690031459fb94ffc5598a263dfd48667280d61 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sat, 2 Mar 2024 23:52:38 +0900 Subject: [PATCH 079/370] =?UTF-8?q?feat:=20version=20check=20code=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Versioning/VersionCheckCode.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Versioning/VersionCheckCode.swift b/iBox/Sources/Versioning/VersionCheckCode.swift index 8466b5a..2a648ba 100644 --- a/iBox/Sources/Versioning/VersionCheckCode.swift +++ b/iBox/Sources/Versioning/VersionCheckCode.swift @@ -5,7 +5,7 @@ // Created by Chan on 3/2/24. // -enum VersionCheckCode { +enum VersionCheckCode: Equatable { case Initial // 초기값 case success // 성공 case later // 나중에 (ab testing code) From 62e356d82a1f55f7572b597c32c424f9ccde5dbd Mon Sep 17 00:00:00 2001 From: KIM CHAN HEE <85754295+chanhihi@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:28:15 +0900 Subject: [PATCH 080/370] docs: add PR template --- .github/PULL_REQUEST_TEMPLATE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a8aee27 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +### 📌 개요 +- + +### 💻 작업 내용 +- + +### 🖼️ 스크린샷 +||| +|---|---| +||| From 5c939538e4cd66c71360f6a14a82420107761b4b Mon Sep 17 00:00:00 2001 From: KIM CHAN HEE <85754295+chanhihi@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:32:41 +0900 Subject: [PATCH 081/370] docs: Release-note.yml --- .github/Release-note.yml | 51 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/Release-note.yml diff --git a/.github/Release-note.yml b/.github/Release-note.yml new file mode 100644 index 0000000..e9c7fa8 --- /dev/null +++ b/.github/Release-note.yml @@ -0,0 +1,51 @@ +# Author by chanhihi +# Date 2023.08.09 +# name-template: "v$NEXT_MINOR_VERSION 🦊" +# tag-template: "v$NEXT_MINOR_VERSION" + +name-template: "v$RESOLVED_VERSION 🦊" +tag-template: "v$RESOLVED_VERSION" +version-resolver: + major: + labels: + - "⚠️ Breaking changes" + minor: + labels: + - "✨ Enhancement" + patch: + labels: + - "⚒ Refactor" + - "🐞 Bug" + default: patch + +categories: + - title: "⚠️ Breaking changes" + labels: + - "⚠️ Breaking Change" + - title: "🚀 Features" + labels: + - "✨ Enhancement" + - "⚒ Refactor" + - "🏛 Structure" + - title: "🐛 Bug Fixes" + labels: + - "🐞 Bug" + - title: "📚 Documentation" + labels: + - "📄 Documentation" + - title: "🎨 Style" + labels: + - "💄 UI/UX" + - title: "🏗 Infrastructure" + labels: + - "🌐 DevOps" +exclude-labels: + - "💖 Question" + - "☂️ Umbrella" + +change-template: "- $TITLE (#$NUMBER)" +change-title-escapes: '\<*_&' + +template: | + ## Changes + $CHANGES From d2869ef637f44699ea7fa39cde1e6e9d4317a539 Mon Sep 17 00:00:00 2001 From: KIM CHAN HEE <85754295+chanhihi@users.noreply.github.com> Date: Sun, 3 Mar 2024 01:08:21 +0900 Subject: [PATCH 082/370] docs: add Deployment.yml --- .github/workflows/Deployment.yml | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/workflows/Deployment.yml diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml new file mode 100644 index 0000000..5caa729 --- /dev/null +++ b/.github/workflows/Deployment.yml @@ -0,0 +1,73 @@ +# Author by chanhihi +# Date 2024.03.03 + +name: Deployment + +on: + pull_request: + branches: + - main + types: + - closed + +jobs: + build: + name: Deploy on macOS 12 - Archive / Release for iOS + runs-on: macos-12 + env: + XCODE_VERSION: "15.2.0" + SWIFT_VERSION: "5.9.2" + XCODE_PROJECT: "iBox.xcodeproj" + XCODE_SCHEME: "iBox" + XCODE_ARCHIVE_PATH: "iBox.xcarchive" + XCODE_ARCHIVE_EXPORT_PATH: "./archive" + XCODE_EXPORT_PATH: "./artifacts" + TUIST_VERSION: "3.36.2" + APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set Xcode version + run: sudo xcode-select -s '/Applications/Xcode_15.2.0.app/Contents/Developer' + + - name: Setup Swift + uses: swift-actions/setup-swift@v1 + with: + swift-version: ${{ env.SWIFT_VERSION }} + + - name: Install Tuist + run: curl -Ls https://install.tuist.io | bash + + - name: Generate Xcode project with Tuist + run: tuist generate --version ${{ env.TUIST_VERSION }} + + - name: Archive for iOS (Main App and Share Extension) + run: | + xcodebuild archive -project $XCODE_PROJECT -scheme $XCODE_SCHEME -archivePath "$XCODE_ARCHIVE_EXPORT_PATH"/"$XCODE_ARCHIVE_PATH" -sdk iphoneos BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO + # Share Extension에 대한 별도의 아카이브 커맨드가 필요하다면 여기에 추가 + + - name: Export IPA + run: | + xcodebuild -exportArchive -archivePath "$XCODE_ARCHIVE_EXPORT_PATH"/"$XCODE_ARCHIVE_PATH" -exportOptionsPlist ExportOptions.plist -exportPath "$XCODE_EXPORT_PATH" + + - name: Tagging + id: tag_version + uses: mathieudutour/github-tag-action@v6.1 + with: + github_token: ${{ secrets.CHANHIHI }} + + - name: Draft Release + id: draft_release + uses: release-drafter/release-drafter@v5 + with: + config-name: Release-note.yml + env: + GITHUB_TOKEN: ${{ secrets.CHANHIHI }} + + - name: Upload IPA + uses: actions/upload-artifact@v2 + with: + name: Box42-${{ steps.tag_version.outputs.new_tag }} + path: ${{ env.XCODE_EXPORT_PATH }}/*.ipa From 30e86b91f030d0190ce4b7635152bcb3d9fd9210 Mon Sep 17 00:00:00 2001 From: KIM CHAN HEE <85754295+chanhihi@users.noreply.github.com> Date: Sun, 3 Mar 2024 01:44:09 +0900 Subject: [PATCH 083/370] docs: fix Deployment.yml --- .github/workflows/Deployment.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 5caa729..28f23d7 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -13,7 +13,7 @@ on: jobs: build: name: Deploy on macOS 12 - Archive / Release for iOS - runs-on: macos-12 + runs-on: macos-latest env: XCODE_VERSION: "15.2.0" SWIFT_VERSION: "5.9.2" @@ -38,15 +38,14 @@ jobs: swift-version: ${{ env.SWIFT_VERSION }} - name: Install Tuist - run: curl -Ls https://install.tuist.io | bash + run: sudo curl -Ls https://install.tuist.io | bash - name: Generate Xcode project with Tuist - run: tuist generate --version ${{ env.TUIST_VERSION }} + run: tuist local ${{ env.TUIST_VERSION }} && tuist generate - name: Archive for iOS (Main App and Share Extension) run: | xcodebuild archive -project $XCODE_PROJECT -scheme $XCODE_SCHEME -archivePath "$XCODE_ARCHIVE_EXPORT_PATH"/"$XCODE_ARCHIVE_PATH" -sdk iphoneos BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO - # Share Extension에 대한 별도의 아카이브 커맨드가 필요하다면 여기에 추가 - name: Export IPA run: | From 74ac50a8996fdef74d256ab7f86492f9520a543c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 3 Mar 2024 22:48:09 +0900 Subject: [PATCH 084/370] =?UTF-8?q?fix:=20checkAppVersion=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=EB=B6=80=EB=B6=84=20=EA=B2=B0=EA=B3=BC=EA=B0=92=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AppDelegate.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 359a8e1..b744f59 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -13,8 +13,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let versioningHandler: VersioningHandler = VersioningHandler() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + versioningHandler.checkAppVersion { result in + AppStateManager.shared.isVersionCheckCompleted = result + } - versioningHandler.checkAppVersion() return true } @@ -32,5 +35,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } -} + } From 22300315a0897980420501a2963c1780da15871a Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 7 Mar 2024 16:06:41 +0900 Subject: [PATCH 085/370] feat: preload favoriteView --- Project.swift | 3 +- iBox/Sources/AppDelegate.swift | 7 +++ .../Presenter/BoxList/BoxListCell.swift | 1 + .../BoxList/BoxListViewController.swift | 3 +- .../Presenter/Favorite/FavoriteView.swift | 2 +- .../Presenter/Web/PreloadedWebView.swift | 46 ------------------ .../Web/PreloadedWebViewController.swift | 48 ------------------- iBox/Sources/Presenter/Web/WebView.swift | 34 ++++++++++--- .../Presenter/Web/WebViewController.swift | 2 +- iBox/Sources/SceneDelegate.swift | 17 +------ iBox/Sources/Utils/WebViewPreloader.swift | 23 +++++---- 11 files changed, 53 insertions(+), 133 deletions(-) delete mode 100644 iBox/Sources/Presenter/Web/PreloadedWebView.swift delete mode 100644 iBox/Sources/Presenter/Web/PreloadedWebViewController.swift diff --git a/Project.swift b/Project.swift index be119fe..dd16153 100644 --- a/Project.swift +++ b/Project.swift @@ -27,8 +27,9 @@ class iBoxFactory: ProjectFactory { private let appInfoPlist: [String: Plist.Value] = [ "ITSAppUsesNonExemptEncryption": false, + "CFBundleDisplayName": "iBox", "CFBundleName": "iBox", - "CFBundleShortVersionString": "1.2.1", + "CFBundleShortVersionString": "1.2.2", "CFBundleVersion": "1", "UILaunchStoryboardName": "LaunchScreen", "UIApplicationSceneManifest": [ diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 359a8e1..974c2f8 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -14,9 +14,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + preloadFavoriteWeb() versioningHandler.checkAppVersion() return true } + + private func preloadFavoriteWeb() { + let favorite = UserDefaultsManager.favorite + let favoriteUrl = favorite.url + WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) + } // MARK: UISceneSession Lifecycle diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/Presenter/BoxList/BoxListCell.swift index 0300221..5be0a7f 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListCell.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListCell.swift @@ -41,6 +41,7 @@ class BoxListCell: UITableViewCell { private func setupProperty() { backgroundColor = .tableViewBackgroundColor + selectionStyle = .none } private func setupHierarchy() { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 0972f1e..2ff4886 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -46,7 +46,8 @@ class BoxListViewController: BaseViewController, BaseViewController extension BoxListViewController: BoxListViewDelegate { func didSelectWeb(at url: URL, withName name: String) { - let viewController = PreloadedWebViewController(selectedWebsite: url) + let viewController = WebViewController() + viewController.selectedWebsite = url viewController.title = name navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Presenter/Favorite/FavoriteView.swift index f088c37..51f7cf3 100644 --- a/iBox/Sources/Presenter/Favorite/FavoriteView.swift +++ b/iBox/Sources/Presenter/Favorite/FavoriteView.swift @@ -10,7 +10,7 @@ import WebKit import SnapKit -class FavoriteView: PreloadedWebView { +class FavoriteView: UIView { private lazy var webView = WebViewPreloader.shared.getFavoriteView() diff --git a/iBox/Sources/Presenter/Web/PreloadedWebView.swift b/iBox/Sources/Presenter/Web/PreloadedWebView.swift deleted file mode 100644 index fb260fb..0000000 --- a/iBox/Sources/Presenter/Web/PreloadedWebView.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// PreloadedWebView.swift -// iBox -// -// Created by 이지현 on 1/18/24. -// - -import UIKit -import WebKit - -import SnapKit - -class PreloadedWebView: UIView { - - var selectedWebsite: URL? { - didSet { - getWebView() - } - } - - // MARK: - UI Components - - private var webView: WKWebView? - - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - backgroundColor = .backgroundColor - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func getWebView() { - guard let selectedWebsite else { return } - webView = WebViewPreloader.shared.getWebView(for: selectedWebsite) - guard let webView else { return } - addSubview(webView) - webView.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - } - -} diff --git a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift b/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift deleted file mode 100644 index 9286992..0000000 --- a/iBox/Sources/Presenter/Web/PreloadedWebViewController.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// PreloadedWebViewController.swift -// iBox -// -// Created by 이지현 on 1/18/24. -// - -import UIKit - -class PreloadedWebViewController: BaseViewController, BaseViewControllerProtocol { - - var selectedWebsite: URL - - // MARK: - Initializer - - init(selectedWebsite: URL) { - self.selectedWebsite = selectedWebsite - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .backgroundColor - navigationItem.largeTitleDisplayMode = .never - - guard let contentView = contentView as? PreloadedWebView else { return } - contentView.selectedWebsite = selectedWebsite - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - WebViewPreloader.shared.resetWebView(for: selectedWebsite) - } - - // MARK: - BaseViewControllerProtocol - - func setupNavigationBar() { - setNavigationBarHidden(true) - } - -} diff --git a/iBox/Sources/Presenter/Web/WebView.swift b/iBox/Sources/Presenter/Web/WebView.swift index e306690..bfcb41e 100644 --- a/iBox/Sources/Presenter/Web/WebView.swift +++ b/iBox/Sources/Presenter/Web/WebView.swift @@ -11,16 +11,16 @@ import WebKit import SnapKit class WebView: UIView { - var selectedWebsite: String? { + var selectedWebsite: URL? { didSet { loadWebsite() } } - private let webView = WKWebView() -// .then { -// $0.scrollView.contentInsetAdjustmentBehavior = .always -// } + private let webView = WKWebView().then { + $0.isOpaque = false + $0.scrollView.contentInsetAdjustmentBehavior = .always + } override init(frame: CGRect) { super.init(frame: frame) @@ -33,6 +33,12 @@ class WebView: UIView { fatalError("init(coder:) has not been implemented") } + deinit { + webView.stopLoading() + webView.navigationDelegate = nil + webView.scrollView.delegate = nil + } + // MARK: - Setup Methods private func setupProperty() { @@ -51,7 +57,7 @@ class WebView: UIView { } private func loadWebsite() { - guard let website = selectedWebsite, let url = URL(string: website) else { return } + guard let url = selectedWebsite else { return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = true } @@ -59,5 +65,19 @@ class WebView: UIView { } extension WebView: WKNavigationDelegate { - +// func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { +// print("웹뷰 로딩 실패: \(error.localizedDescription)") +// } +// +// func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { +// print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") +// } +// +// func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { +// if let url = navigationAction.request.url { +// print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") +// } +// +// decisionHandler(.allow) +// } } diff --git a/iBox/Sources/Presenter/Web/WebViewController.swift b/iBox/Sources/Presenter/Web/WebViewController.swift index ed1fac4..9da3175 100644 --- a/iBox/Sources/Presenter/Web/WebViewController.swift +++ b/iBox/Sources/Presenter/Web/WebViewController.swift @@ -9,7 +9,7 @@ import UIKit class WebViewController: BaseViewController, BaseViewControllerProtocol { - var selectedWebsite: String? + var selectedWebsite: URL? // MARK: - Life Cycle diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 9059b7e..936c962 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -22,21 +22,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { insertDefaultDataIfNeeded() - // 나중에 userDefaults에 저장해두고 꺼내와서 preload하기 - let urlsToPreload = [ - URL(string: "https://profile.intra.42.fr/")!, - URL(string: "https://www.where42.kr/")!, - URL(string: "https://stat.42seoul.kr/")!, - URL(string: "https://42library.kr/")!, - URL(string: "https://cabi.42seoul.io/")!, - URL(string: "https://24hoursarenotenough.42seoul.kr/")! - ] - WebViewPreloader.shared.preload(urls: urlsToPreload) - - let favorite = UserDefaultsManager.favorite - let favoriteUrl = favorite.url - WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) - window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 @@ -53,7 +38,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { private func insertDefaultDataIfNeeded() { let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted if !isDefaultDataInserted { - var defaultData = [ + let defaultData = [ Folder(id: UUID(), name: "42 폴더", color: .gray, bookmarks: [ Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Utils/WebViewPreloader.swift index fc8b4a6..79082d6 100644 --- a/iBox/Sources/Utils/WebViewPreloader.swift +++ b/iBox/Sources/Utils/WebViewPreloader.swift @@ -10,41 +10,40 @@ import WebKit class WebViewPreloader { static let shared = WebViewPreloader() - private var webViews: [URL: WKWebView] = [:] + private var webView: WKWebView? private var favoriteView: (url: URL, webView: WKWebView)? private init() {} - func preload(urls: [URL]) { - for url in urls { - let webView = WKWebView() - webView.load(URLRequest(url: url)) - webViews[url] = webView - } + func preload(url: URL) { + let webView = WKWebView() + webView.isOpaque = false + webView.load(URLRequest(url: url)) + self.webView = webView } func preloadFavoriteView(url: URL) { let webView = WKWebView() + webView.isOpaque = false webView.load(URLRequest(url: url)) favoriteView = (url, webView) } - func getWebView(for url: URL) -> WKWebView? { - return webViews[url] + func getWebView() -> WKWebView? { + return webView } func getFavoriteView() -> WKWebView? { return favoriteView?.webView } - func resetWebView(for url: URL) { - webViews[url]?.load(URLRequest(url: url)) + func resetWebView() { + webView = nil } func resetFavoriteView() { guard let favoriteView else { return } favoriteView.webView.load(URLRequest(url: favoriteView.url)) } - } From 4c838e6550e3875e755e33fac78da0a21139b6e6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 7 Mar 2024 18:32:42 +0900 Subject: [PATCH 086/370] feat: change coredate move bookmark logic --- iBox/Sources/Utils/CoreDataManager.swift | 85 ++++++++++-------------- 1 file changed, 35 insertions(+), 50 deletions(-) diff --git a/iBox/Sources/Utils/CoreDataManager.swift b/iBox/Sources/Utils/CoreDataManager.swift index 3ee52f4..85bec1c 100644 --- a/iBox/Sources/Utils/CoreDataManager.swift +++ b/iBox/Sources/Utils/CoreDataManager.swift @@ -282,61 +282,46 @@ extension CoreDataManager { save() } - func moveBookmark(from source: IndexPath, to destination: IndexPath, srcId: UUID) { + func moveBookmark(from source: IndexPath, to destination: IndexPath, srcId: UUID, destFolderId: UUID) { if source.section == destination.section { - guard let bookmarkEntity = getBookmarkEntity(id: srcId) else { return } - guard let folderId = bookmarkEntity.folder?.id else { return } - let bookmarkEntities = getAllBookmarkEntity(in: folderId) - let source = source.row - let destination = destination.row - if source < destination { - var startIndex = source + 1 - let endIndex = destination - var startOrder = bookmarkEntity.order - while startIndex <= endIndex { - bookmarkEntities[startIndex].order = startOrder - startOrder += 1 - startIndex += 1 - } - bookmarkEntities[source].order = startOrder - } else if destination < source { - var startIndex = destination - let endIndex = source - 1 - var startOrder = bookmarkEntities[destination].order + 1 - let newOrder = bookmarkEntities[destination].order - while startIndex <= endIndex { - bookmarkEntities[startIndex].order = startOrder - startOrder += 1 - startIndex += 1 - } - bookmarkEntities[source].order = newOrder - } + moveWithinSameFolder(from: source.row, to: destination.row, bookmarkId: srcId, folderId: destFolderId) } else { - guard let srcBookmarkEntity = getBookmarkEntity(id: srcId) else { return } - guard let srcFolderId = srcBookmarkEntity.folder?.id else { return } - let deletedOrder = srcBookmarkEntity.order - let srcBookmarkEntities = getAllBookmarkEntity(in: srcFolderId).filter{ $0.order > deletedOrder } - for bookmarkEntity in srcBookmarkEntities { - bookmarkEntity.order -= 1 - } - lastBookmarkOrder[srcFolderId] = (lastBookmarkOrder[srcFolderId] ?? 1) - 1 - - let folderEntities = getAllFolderEntity() - let destFolder = folderEntities[destination.section] - guard let destFolderId = destFolder.id else { return } - let destinationOrder = Int64(destination.row) - let destBookmarkEntities = getAllBookmarkEntity(in: destFolderId).filter{ $0.order >= deletedOrder } - for bookmarkEntity in destBookmarkEntities { - bookmarkEntity.order += 1 - } - lastBookmarkOrder[destFolderId] = (lastBookmarkOrder[destFolderId] ?? 0) + 1 - - - srcBookmarkEntity.folder = destFolder - srcBookmarkEntity.order = destinationOrder + moveToDifferentFolder(from: source, to: destination, bookmarkId: srcId, destFolderId: destFolderId) } save() } + private func moveWithinSameFolder(from sourceIndex: Int, to destinationIndex: Int, bookmarkId: UUID, folderId: UUID) { + var bookmarks = getAllBookmarkEntity(in: folderId) + let movingBookmark = bookmarks.remove(at: sourceIndex) + + let adjustedDestinationIndex = sourceIndex < destinationIndex ? destinationIndex - 1 : destinationIndex + + bookmarks.insert(movingBookmark, at: adjustedDestinationIndex) + + for (index, bookmark) in bookmarks.enumerated() { + bookmark.order = Int64(index) + } + } + + private func moveToDifferentFolder(from source: IndexPath, to destination: IndexPath, bookmarkId: UUID, destFolderId: UUID) { + guard let movingBookmark = getBookmarkEntity(id: bookmarkId), + let srcFolder = movingBookmark.folder, + let srcFolderId = srcFolder.id else { return } + let srcBookmarks = getAllBookmarkEntity(in: srcFolderId) + let destBookmarks = getAllBookmarkEntity(in: destFolderId) + let destFolder = getFolderEntity(id: destFolderId) + + for (index, bookmark) in srcBookmarks.enumerated() where bookmark.order > movingBookmark.order { + bookmark.order -= 1 + } + + movingBookmark.folder = destFolder + movingBookmark.order = Int64(destination.row) + for (index, bookmark) in destBookmarks.enumerated() where bookmark.order >= movingBookmark.order { + bookmark.order += 1 + } + } + } From 0ee974ab09dc694434564299c3a427564c5e5490 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Fri, 8 Mar 2024 13:12:51 +0900 Subject: [PATCH 087/370] =?UTF-8?q?=F0=9F=94=A5=20remove:=20ColorName=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Utils/ColorName.swift | 31 ------------------------------ 1 file changed, 31 deletions(-) delete mode 100644 iBox/Sources/Utils/ColorName.swift diff --git a/iBox/Sources/Utils/ColorName.swift b/iBox/Sources/Utils/ColorName.swift deleted file mode 100644 index 592876a..0000000 --- a/iBox/Sources/Utils/ColorName.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// ColorName.swift -// iBox -// -// Created by 이지현 on 1/3/24. -// - -import UIKit - -enum ColorName: String { - case gray - case green - case red - case blue - case yellow - - func toUIColor() -> UIColor { - switch self { - case .gray: - return UIColor.systemGray2 - case .green: - return UIColor.systemGreen - case .red: - return UIColor.systemRed - case .blue: - return UIColor.systemBlue - case .yellow: - return UIColor.systemYellow - } - } -} From f062b1e6dc5a4e645060f2923e50163ae91dfab9 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Fri, 8 Mar 2024 13:14:40 +0900 Subject: [PATCH 088/370] =?UTF-8?q?chore:=20Utils=20=ED=8F=B4=EB=8D=94=20S?= =?UTF-8?q?hared=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/{Utils => Shared}/CoreDataManager.swift | 0 iBox/Sources/{Utils => Shared}/UserDefaultsManager.swift | 0 iBox/Sources/{Utils => Shared}/WebViewPreloader.swift | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename iBox/Sources/{Utils => Shared}/CoreDataManager.swift (100%) rename iBox/Sources/{Utils => Shared}/UserDefaultsManager.swift (100%) rename iBox/Sources/{Utils => Shared}/WebViewPreloader.swift (100%) diff --git a/iBox/Sources/Utils/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift similarity index 100% rename from iBox/Sources/Utils/CoreDataManager.swift rename to iBox/Sources/Shared/CoreDataManager.swift diff --git a/iBox/Sources/Utils/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift similarity index 100% rename from iBox/Sources/Utils/UserDefaultsManager.swift rename to iBox/Sources/Shared/UserDefaultsManager.swift diff --git a/iBox/Sources/Utils/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift similarity index 100% rename from iBox/Sources/Utils/WebViewPreloader.swift rename to iBox/Sources/Shared/WebViewPreloader.swift From 6bc4893c8c718af4528a95c2a5138a21de2f80b3 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Fri, 8 Mar 2024 13:24:56 +0900 Subject: [PATCH 089/370] =?UTF-8?q?chore:=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AppDelegate.swift | 3 +-- iBox/Sources/Model/Folder.swift | 1 - .../BoxList}/BoxListCellViewModel.swift | 0 .../BoxList}/BoxListSectionViewModel.swift | 4 ---- iBox/Sources/Presenter/BoxList/BoxListView.swift | 1 - .../BoxList}/BoxListViewModel.swift | 0 iBox/Sources/Presenter/BoxList/FolderButton.swift | 7 ++++--- .../MyPage/HomeTab}/HomeTabSelectorViewModel.swift | 0 .../MyPage}/MyPageCellViewModel.swift | 0 .../MyPage}/MyPageSectionViewModel.swift | 0 .../{ViewModel => Presenter/MyPage}/MyPageViewModel.swift | 0 .../MyPage/Theme}/ThemeViewModel.swift | 0 iBox/Sources/SceneDelegate.swift | 2 +- iBox/Sources/Shared/CoreDataManager.swift | 6 +++--- 14 files changed, 9 insertions(+), 15 deletions(-) rename iBox/Sources/{ViewModel => Presenter/BoxList}/BoxListCellViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/BoxList}/BoxListSectionViewModel.swift (93%) rename iBox/Sources/{ViewModel => Presenter/BoxList}/BoxListViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/MyPage/HomeTab}/HomeTabSelectorViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/MyPage}/MyPageCellViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/MyPage}/MyPageSectionViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/MyPage}/MyPageViewModel.swift (100%) rename iBox/Sources/{ViewModel => Presenter/MyPage/Theme}/ThemeViewModel.swift (100%) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 0da8b22..e52e659 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -17,9 +17,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { versioningHandler.checkAppVersion { result in AppStateManager.shared.isVersionCheckCompleted = result } - preloadFavoriteWeb() - versioningHandler.checkAppVersion() + return true } diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 261755f..398a028 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -10,7 +10,6 @@ import Foundation struct Folder { var id: UUID let name: String - let color: ColorName let bookmarks: [Bookmark] var isOpened: Bool = false } diff --git a/iBox/Sources/ViewModel/BoxListCellViewModel.swift b/iBox/Sources/Presenter/BoxList/BoxListCellViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/BoxListCellViewModel.swift rename to iBox/Sources/Presenter/BoxList/BoxListCellViewModel.swift diff --git a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift b/iBox/Sources/Presenter/BoxList/BoxListSectionViewModel.swift similarity index 93% rename from iBox/Sources/ViewModel/BoxListSectionViewModel.swift rename to iBox/Sources/Presenter/BoxList/BoxListSectionViewModel.swift index e106344..43d0f53 100644 --- a/iBox/Sources/ViewModel/BoxListSectionViewModel.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListSectionViewModel.swift @@ -28,10 +28,6 @@ class BoxListSectionViewModel: Identifiable { folder.name } - var color: ColorName { - folder.color - } - var isOpened: Bool { get { folder.isOpened diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/Presenter/BoxList/BoxListView.swift index cc05316..70a5e04 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListView.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListView.swift @@ -141,7 +141,6 @@ extension BoxListView: UITableViewDelegate { guard let viewModel else { return nil } let button = FolderButton(isOpen: viewModel.boxList[section].isOpened) button.setFolderName(viewModel.boxList[section].name) - button.setFolderColor(viewModel.boxList[section].color.toUIColor()) button.tag = section button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside) diff --git a/iBox/Sources/ViewModel/BoxListViewModel.swift b/iBox/Sources/Presenter/BoxList/BoxListViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/BoxListViewModel.swift rename to iBox/Sources/Presenter/BoxList/BoxListViewModel.swift diff --git a/iBox/Sources/Presenter/BoxList/FolderButton.swift b/iBox/Sources/Presenter/BoxList/FolderButton.swift index 6f667b2..d584bad 100644 --- a/iBox/Sources/Presenter/BoxList/FolderButton.swift +++ b/iBox/Sources/Presenter/BoxList/FolderButton.swift @@ -18,6 +18,7 @@ class FolderButton: UIButton { private let folderImageView = UIImageView().then { $0.image = UIImage(systemName: "folder.fill") $0.contentMode = .scaleAspectFit + $0.tintColor = .gray } private let folderNameLabel = UILabel().then { @@ -78,9 +79,9 @@ class FolderButton: UIButton { folderNameLabel.text = name } - func setFolderColor(_ color: UIColor) { - folderImageView.tintColor = color - } +// func setFolderColor(_ color: UIColor) { +// folderImageView.tintColor = color +// } func toggleStatus() { isOpen = !isOpen diff --git a/iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift b/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/HomeTabSelectorViewModel.swift rename to iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewModel.swift diff --git a/iBox/Sources/ViewModel/MyPageCellViewModel.swift b/iBox/Sources/Presenter/MyPage/MyPageCellViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/MyPageCellViewModel.swift rename to iBox/Sources/Presenter/MyPage/MyPageCellViewModel.swift diff --git a/iBox/Sources/ViewModel/MyPageSectionViewModel.swift b/iBox/Sources/Presenter/MyPage/MyPageSectionViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/MyPageSectionViewModel.swift rename to iBox/Sources/Presenter/MyPage/MyPageSectionViewModel.swift diff --git a/iBox/Sources/ViewModel/MyPageViewModel.swift b/iBox/Sources/Presenter/MyPage/MyPageViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/MyPageViewModel.swift rename to iBox/Sources/Presenter/MyPage/MyPageViewModel.swift diff --git a/iBox/Sources/ViewModel/ThemeViewModel.swift b/iBox/Sources/Presenter/MyPage/Theme/ThemeViewModel.swift similarity index 100% rename from iBox/Sources/ViewModel/ThemeViewModel.swift rename to iBox/Sources/Presenter/MyPage/Theme/ThemeViewModel.swift diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 936c962..194f154 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -39,7 +39,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted if !isDefaultDataInserted { let defaultData = [ - Folder(id: UUID(), name: "42 폴더", color: .gray, bookmarks: [ + Folder(id: UUID(), name: "42 폴더", bookmarks: [ Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), diff --git a/iBox/Sources/Shared/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift index 3ee52f4..524c856 100644 --- a/iBox/Sources/Shared/CoreDataManager.swift +++ b/iBox/Sources/Shared/CoreDataManager.swift @@ -47,7 +47,7 @@ extension CoreDataManager { let newFolder = FolderEntity(context: context) newFolder.id = folder.id newFolder.name = folder.name - newFolder.color = folder.color.rawValue +// newFolder.color = folder.color.rawValue newFolder.order = lastFolderOrder lastFolderOrder += 1 let bookmarks = NSMutableOrderedSet() @@ -71,7 +71,7 @@ extension CoreDataManager { let newFolder = FolderEntity(context: context) newFolder.id = folder.id newFolder.name = folder.name - newFolder.color = folder.color.rawValue +// newFolder.color = folder.color.rawValue newFolder.order = lastFolderOrder lastFolderOrder += 1 let bookmarks = NSMutableOrderedSet() @@ -131,7 +131,7 @@ extension CoreDataManager { guard let folderId = folderEntity.id else { return [] } lastBookmarkOrder[folderId] = (bookmarkEntities.last?.order ?? -1) + 1 let bookmarks = bookmarkEntities.map{ Bookmark(id: $0.id ?? UUID(), name: $0.name ?? "" , url: $0.url ?? URL(string: "")!) } - folders.append(Folder(id: folderEntity.id ?? UUID(), name: folderEntity.name ?? "", color: ColorName(rawValue: folderEntity.color ?? "gray") ?? .gray , bookmarks: bookmarks)) + folders.append(Folder(id: folderEntity.id ?? UUID(), name: folderEntity.name ?? "", bookmarks: bookmarks)) } return folders From 37dccbfd3a4db8ebd357d7b34cb31791ee0bc809 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Fri, 8 Mar 2024 13:26:29 +0900 Subject: [PATCH 090/370] =?UTF-8?q?chore:=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Presenter => }/BoxList/AddBookmark/AddBookmarkView.swift | 0 .../BoxList/AddBookmark/AddBookmarkViewController.swift | 0 iBox/Sources/{Presenter => }/BoxList/BoxListCell.swift | 0 iBox/Sources/{Presenter => }/BoxList/BoxListCellViewModel.swift | 0 .../Sources/{Presenter => }/BoxList/BoxListSectionViewModel.swift | 0 iBox/Sources/{Presenter => }/BoxList/BoxListView.swift | 0 iBox/Sources/{Presenter => }/BoxList/BoxListViewController.swift | 0 iBox/Sources/{Presenter => }/BoxList/BoxListViewModel.swift | 0 iBox/Sources/{Presenter => }/BoxList/Edit/EditCell.swift | 0 iBox/Sources/{Presenter => }/BoxList/Edit/EditView.swift | 0 .../Sources/{Presenter => }/BoxList/Edit/EditViewController.swift | 0 .../{Presenter => }/BoxList/EditBookmark/EditBookmarkView.swift | 0 .../BoxList/EditBookmark/EditBookmarkViewController.swift | 0 .../{Presenter => }/BoxList/EditFolder/EditFolderView.swift | 0 .../BoxList/EditFolder/EditFolderViewController.swift | 0 iBox/Sources/{Presenter => }/BoxList/FolderButton.swift | 0 .../CustomLaunchScreen/CustomLaunchScreenView.swift | 0 .../CustomLaunchScreen/CustomLaunchScreenViewController.swift | 0 iBox/Sources/{Presenter => }/Favorite/FavoriteView.swift | 0 .../Sources/{Presenter => }/Favorite/FavoriteViewController.swift | 0 iBox/Sources/{Presenter => Main}/MainTabBarController.swift | 0 .../{Presenter => }/MyPage/HomeTab/HomeTabSelectorCell.swift | 0 .../{Presenter => }/MyPage/HomeTab/HomeTabSelectorView.swift | 0 .../MyPage/HomeTab/HomeTabSelectorViewController.swift | 0 .../{Presenter => }/MyPage/HomeTab/HomeTabSelectorViewModel.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageCellViewModel.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageItemCell.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageSectionViewModel.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageView.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageViewController.swift | 0 iBox/Sources/{Presenter => }/MyPage/MyPageViewModel.swift | 0 iBox/Sources/{Presenter => }/MyPage/Profile/ProfileView.swift | 0 .../{Presenter => }/MyPage/Profile/ProfileViewController.swift | 0 iBox/Sources/{Presenter => }/MyPage/Theme/ThemeCell.swift | 0 iBox/Sources/{Presenter => }/MyPage/Theme/ThemeView.swift | 0 .../{Presenter => }/MyPage/Theme/ThemeViewController.swift | 0 iBox/Sources/{Presenter => }/MyPage/Theme/ThemeViewModel.swift | 0 iBox/Sources/{Presenter => }/Web/WebView.swift | 0 iBox/Sources/{Presenter => }/Web/WebViewController.swift | 0 39 files changed, 0 insertions(+), 0 deletions(-) rename iBox/Sources/{Presenter => }/BoxList/AddBookmark/AddBookmarkView.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/AddBookmark/AddBookmarkViewController.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListCell.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListCellViewModel.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListSectionViewModel.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListView.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListViewController.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/BoxListViewModel.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/Edit/EditCell.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/Edit/EditView.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/Edit/EditViewController.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/EditBookmark/EditBookmarkView.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/EditBookmark/EditBookmarkViewController.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/EditFolder/EditFolderView.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/EditFolder/EditFolderViewController.swift (100%) rename iBox/Sources/{Presenter => }/BoxList/FolderButton.swift (100%) rename iBox/Sources/{Presenter => }/CustomLaunchScreen/CustomLaunchScreenView.swift (100%) rename iBox/Sources/{Presenter => }/CustomLaunchScreen/CustomLaunchScreenViewController.swift (100%) rename iBox/Sources/{Presenter => }/Favorite/FavoriteView.swift (100%) rename iBox/Sources/{Presenter => }/Favorite/FavoriteViewController.swift (100%) rename iBox/Sources/{Presenter => Main}/MainTabBarController.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/HomeTab/HomeTabSelectorCell.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/HomeTab/HomeTabSelectorView.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/HomeTab/HomeTabSelectorViewController.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/HomeTab/HomeTabSelectorViewModel.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageCellViewModel.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageItemCell.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageSectionViewModel.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageView.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageViewController.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/MyPageViewModel.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Profile/ProfileView.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Profile/ProfileViewController.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Theme/ThemeCell.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Theme/ThemeView.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Theme/ThemeViewController.swift (100%) rename iBox/Sources/{Presenter => }/MyPage/Theme/ThemeViewModel.swift (100%) rename iBox/Sources/{Presenter => }/Web/WebView.swift (100%) rename iBox/Sources/{Presenter => }/Web/WebViewController.swift (100%) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift rename to iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift rename to iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListCell.swift rename to iBox/Sources/BoxList/BoxListCell.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListCellViewModel.swift b/iBox/Sources/BoxList/BoxListCellViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListCellViewModel.swift rename to iBox/Sources/BoxList/BoxListCellViewModel.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListSectionViewModel.swift rename to iBox/Sources/BoxList/BoxListSectionViewModel.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListView.swift rename to iBox/Sources/BoxList/BoxListView.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListViewController.swift rename to iBox/Sources/BoxList/BoxListViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/BoxListViewModel.swift rename to iBox/Sources/BoxList/BoxListViewModel.swift diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditCell.swift b/iBox/Sources/BoxList/Edit/EditCell.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/Edit/EditCell.swift rename to iBox/Sources/BoxList/Edit/EditCell.swift diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditView.swift b/iBox/Sources/BoxList/Edit/EditView.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/Edit/EditView.swift rename to iBox/Sources/BoxList/Edit/EditView.swift diff --git a/iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift b/iBox/Sources/BoxList/Edit/EditViewController.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/Edit/EditViewController.swift rename to iBox/Sources/BoxList/Edit/EditViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift b/iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkView.swift rename to iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift diff --git a/iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift b/iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/EditBookmark/EditBookmarkViewController.swift rename to iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/EditFolder/EditFolderView.swift rename to iBox/Sources/BoxList/EditFolder/EditFolderView.swift diff --git a/iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/EditFolder/EditFolderViewController.swift rename to iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift similarity index 100% rename from iBox/Sources/Presenter/BoxList/FolderButton.swift rename to iBox/Sources/BoxList/FolderButton.swift diff --git a/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift similarity index 100% rename from iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenView.swift rename to iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift diff --git a/iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift similarity index 100% rename from iBox/Sources/Presenter/CustomLaunchScreen/CustomLaunchScreenViewController.swift rename to iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift diff --git a/iBox/Sources/Presenter/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift similarity index 100% rename from iBox/Sources/Presenter/Favorite/FavoriteView.swift rename to iBox/Sources/Favorite/FavoriteView.swift diff --git a/iBox/Sources/Presenter/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift similarity index 100% rename from iBox/Sources/Presenter/Favorite/FavoriteViewController.swift rename to iBox/Sources/Favorite/FavoriteViewController.swift diff --git a/iBox/Sources/Presenter/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift similarity index 100% rename from iBox/Sources/Presenter/MainTabBarController.swift rename to iBox/Sources/Main/MainTabBarController.swift diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/MyPage/HomeTab/HomeTabSelectorCell.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorCell.swift rename to iBox/Sources/MyPage/HomeTab/HomeTabSelectorCell.swift diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift b/iBox/Sources/MyPage/HomeTab/HomeTabSelectorView.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorView.swift rename to iBox/Sources/MyPage/HomeTab/HomeTabSelectorView.swift diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewController.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewController.swift rename to iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewController.swift diff --git a/iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewModel.swift b/iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/HomeTab/HomeTabSelectorViewModel.swift rename to iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewModel.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageCellViewModel.swift b/iBox/Sources/MyPage/MyPageCellViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageCellViewModel.swift rename to iBox/Sources/MyPage/MyPageCellViewModel.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageItemCell.swift b/iBox/Sources/MyPage/MyPageItemCell.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageItemCell.swift rename to iBox/Sources/MyPage/MyPageItemCell.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageSectionViewModel.swift b/iBox/Sources/MyPage/MyPageSectionViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageSectionViewModel.swift rename to iBox/Sources/MyPage/MyPageSectionViewModel.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageView.swift b/iBox/Sources/MyPage/MyPageView.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageView.swift rename to iBox/Sources/MyPage/MyPageView.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewController.swift b/iBox/Sources/MyPage/MyPageViewController.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageViewController.swift rename to iBox/Sources/MyPage/MyPageViewController.swift diff --git a/iBox/Sources/Presenter/MyPage/MyPageViewModel.swift b/iBox/Sources/MyPage/MyPageViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/MyPageViewModel.swift rename to iBox/Sources/MyPage/MyPageViewModel.swift diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift b/iBox/Sources/MyPage/Profile/ProfileView.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Profile/ProfileView.swift rename to iBox/Sources/MyPage/Profile/ProfileView.swift diff --git a/iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift b/iBox/Sources/MyPage/Profile/ProfileViewController.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Profile/ProfileViewController.swift rename to iBox/Sources/MyPage/Profile/ProfileViewController.swift diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift b/iBox/Sources/MyPage/Theme/ThemeCell.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Theme/ThemeCell.swift rename to iBox/Sources/MyPage/Theme/ThemeCell.swift diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift b/iBox/Sources/MyPage/Theme/ThemeView.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Theme/ThemeView.swift rename to iBox/Sources/MyPage/Theme/ThemeView.swift diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift b/iBox/Sources/MyPage/Theme/ThemeViewController.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Theme/ThemeViewController.swift rename to iBox/Sources/MyPage/Theme/ThemeViewController.swift diff --git a/iBox/Sources/Presenter/MyPage/Theme/ThemeViewModel.swift b/iBox/Sources/MyPage/Theme/ThemeViewModel.swift similarity index 100% rename from iBox/Sources/Presenter/MyPage/Theme/ThemeViewModel.swift rename to iBox/Sources/MyPage/Theme/ThemeViewModel.swift diff --git a/iBox/Sources/Presenter/Web/WebView.swift b/iBox/Sources/Web/WebView.swift similarity index 100% rename from iBox/Sources/Presenter/Web/WebView.swift rename to iBox/Sources/Web/WebView.swift diff --git a/iBox/Sources/Presenter/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift similarity index 100% rename from iBox/Sources/Presenter/Web/WebViewController.swift rename to iBox/Sources/Web/WebViewController.swift From 79bddfd272f4cc33bee5b4ada85fdfafe31af5bb Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 10 Mar 2024 00:55:57 +0900 Subject: [PATCH 091/370] =?UTF-8?q?feat:=20folder=EC=9D=98=20color=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents | 1 - iBox/Sources/AppDelegate.swift | 5 ++++- iBox/Sources/BoxList/FolderButton.swift | 4 ---- iBox/Sources/Favorite/FavoriteViewController.swift | 4 ---- iBox/Sources/SceneDelegate.swift | 2 +- iBox/Sources/Shared/CoreDataManager.swift | 5 +---- 6 files changed, 6 insertions(+), 15 deletions(-) diff --git a/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents b/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents index c40ccfd..16ddc4f 100644 --- a/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents +++ b/iBox/Resources/iBox.xcdatamodeld/iBox.xcdatamodel/contents @@ -8,7 +8,6 @@ - diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index e52e659..151f061 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -14,10 +14,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + Task { + preloadFavoriteWeb() + } + versioningHandler.checkAppVersion { result in AppStateManager.shared.isVersionCheckCompleted = result } - preloadFavoriteWeb() return true } diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index d584bad..c20639c 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -79,10 +79,6 @@ class FolderButton: UIButton { folderNameLabel.text = name } -// func setFolderColor(_ color: UIColor) { -// folderImageView.tintColor = color -// } - func toggleStatus() { isOpen = !isOpen openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 0007815..7d2e018 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -16,10 +16,6 @@ class FavoriteViewController: BaseViewController, BaseViewControll setupNavigationBar() } - override func viewDidDisappear(_ animated: Bool) { - WebViewPreloader.shared.resetFavoriteView() - } - // MARK: - BaseViewControllerProtocol func setupNavigationBar() { diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 194f154..ccba580 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -22,7 +22,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { insertDefaultDataIfNeeded() - window?.rootViewController = MainTabBarController() + window?.rootViewController = CustomLaunchScreenViewController() window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 if let urlContext = connectionOptions.urlContexts.first { diff --git a/iBox/Sources/Shared/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift index 524c856..f02bb14 100644 --- a/iBox/Sources/Shared/CoreDataManager.swift +++ b/iBox/Sources/Shared/CoreDataManager.swift @@ -47,7 +47,6 @@ extension CoreDataManager { let newFolder = FolderEntity(context: context) newFolder.id = folder.id newFolder.name = folder.name -// newFolder.color = folder.color.rawValue newFolder.order = lastFolderOrder lastFolderOrder += 1 let bookmarks = NSMutableOrderedSet() @@ -71,7 +70,6 @@ extension CoreDataManager { let newFolder = FolderEntity(context: context) newFolder.id = folder.id newFolder.name = folder.name -// newFolder.color = folder.color.rawValue newFolder.order = lastFolderOrder lastFolderOrder += 1 let bookmarks = NSMutableOrderedSet() @@ -162,10 +160,9 @@ extension CoreDataManager { save() } - func updateFolder(id: UUID, name: String, color: String) { + func updateFolder(id: UUID, name: String) { guard let folder = getFolderEntity(id: id) else { return } folder.name = name - folder.color = color save() } From de567afad10176f98ac2e8fae252d9017fb10c9f Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 10 Mar 2024 01:10:54 +0900 Subject: [PATCH 092/370] feat: favorite tab reload --- iBox/Sources/Main/MainTabBarController.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index a5564be..6f6404b 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -9,10 +9,13 @@ import UIKit class MainTabBarController: UITabBarController { + var previousTabIndex = 0 + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() + delegate = self view.backgroundColor = .backgroundColor setupTabBar() @@ -45,3 +48,12 @@ class MainTabBarController: UITabBarController { } } + +extension MainTabBarController: UITabBarControllerDelegate { + func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { + if tabBarController.selectedIndex == 1 && previousTabIndex == 1 { + WebViewPreloader.shared.resetFavoriteView() + } + previousTabIndex = tabBarController.selectedIndex + } +} From 36c66fd1869dd3e15a1c463ad92116aae58d7af1 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sun, 10 Mar 2024 01:12:04 +0900 Subject: [PATCH 093/370] =?UTF-8?q?feat:=20WebView=EC=97=90=20progressBar?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 62 ++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index bfcb41e..ff164b3 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -11,17 +11,30 @@ import WebKit import SnapKit class WebView: UIView { + + private var progressObserver: NSKeyValueObservation? + var selectedWebsite: URL? { didSet { loadWebsite() } } + // MARK: - UI Components + private let webView = WKWebView().then { $0.isOpaque = false $0.scrollView.contentInsetAdjustmentBehavior = .always } + private let progressView = UIProgressView().then { + $0.progressViewStyle = .bar + $0.tintColor = .label + $0.sizeToFit() + } + + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) setupProperty() @@ -34,6 +47,7 @@ class WebView: UIView { } deinit { + progressObserver?.invalidate() webView.stopLoading() webView.navigationDelegate = nil webView.scrollView.delegate = nil @@ -44,16 +58,25 @@ class WebView: UIView { private func setupProperty() { backgroundColor = .backgroundColor webView.navigationDelegate = self + progressObserver = webView.observe(\.estimatedProgress, options: .new) { [weak self] webView, _ in + self?.progressView.setProgress(Float(webView.estimatedProgress), animated: true) + } } private func setupHierarchy() { addSubview(webView) + addSubview(progressView) } private func setupLayout() { webView.snp.makeConstraints { make in make.edges.equalToSuperview() } + + progressView.snp.makeConstraints { make in + make.bottom.leading.trailing.equalToSuperview() + make.height.equalTo(2) + } } private func loadWebsite() { @@ -65,19 +88,28 @@ class WebView: UIView { } extension WebView: WKNavigationDelegate { -// func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { -// print("웹뷰 로딩 실패: \(error.localizedDescription)") -// } -// -// func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { -// print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") -// } -// -// func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { -// if let url = navigationAction.request.url { -// print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") -// } -// -// decisionHandler(.allow) -// } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + progressView.setProgress(1.0, animated: true) + // 약간의 딜레이를 주어서 프로그레스 바가 완전히 차도록 함 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + self.progressView.isHidden = true + } + } + + // func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + // print("웹뷰 로딩 실패: \(error.localizedDescription)") + // } + // + // func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + // print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") + // } + // + // func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + // if let url = navigationAction.request.url { + // print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") + // } + // + // decisionHandler(.allow) + // } } From 663f0069a5715abdfd4774489ffeba8308e24d29 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sun, 10 Mar 2024 15:20:04 +0900 Subject: [PATCH 094/370] =?UTF-8?q?feat:=20WebView=EC=97=90=20refreshContr?= =?UTF-8?q?ol=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 41 +++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index bfcb41e..d7c96b6 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -22,6 +22,8 @@ class WebView: UIView { $0.scrollView.contentInsetAdjustmentBehavior = .always } + private let refreshControl = UIRefreshControl() + override init(frame: CGRect) { super.init(frame: frame) setupProperty() @@ -44,6 +46,8 @@ class WebView: UIView { private func setupProperty() { backgroundColor = .backgroundColor webView.navigationDelegate = self + webView.scrollView.refreshControl = refreshControl + refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged) } private func setupHierarchy() { @@ -62,22 +66,29 @@ class WebView: UIView { webView.allowsBackForwardNavigationGestures = true } + @objc private func handleRefreshControl() { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in + self?.webView.reload() + self?.refreshControl.endRefreshing() + } + } + } extension WebView: WKNavigationDelegate { -// func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { -// print("웹뷰 로딩 실패: \(error.localizedDescription)") -// } -// -// func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { -// print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") -// } -// -// func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { -// if let url = navigationAction.request.url { -// print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") -// } -// -// decisionHandler(.allow) -// } + // func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + // print("웹뷰 로딩 실패: \(error.localizedDescription)") + // } + // + // func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + // print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") + // } + // + // func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + // if let url = navigationAction.request.url { + // print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") + // } + // + // decisionHandler(.allow) + // } } From b6af21e8c935ba42f039b8cbe80854363f6443b1 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sun, 10 Mar 2024 15:26:50 +0900 Subject: [PATCH 095/370] =?UTF-8?q?feat:=20FavoriteView=EC=97=90=20refresh?= =?UTF-8?q?Control=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShareExtension}/ShareViewController.swift | 0 .../View/ShareExtensionBackGroundView.swift | 0 iBox/Sources/Favorite/FavoriteView.swift | 13 +++++++++++++ 3 files changed, 13 insertions(+) rename {ShareExtension => iBox/ShareExtension}/ShareViewController.swift (100%) rename {ShareExtension => iBox/ShareExtension}/View/ShareExtensionBackGroundView.swift (100%) diff --git a/ShareExtension/ShareViewController.swift b/iBox/ShareExtension/ShareViewController.swift similarity index 100% rename from ShareExtension/ShareViewController.swift rename to iBox/ShareExtension/ShareViewController.swift diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/iBox/ShareExtension/View/ShareExtensionBackGroundView.swift similarity index 100% rename from ShareExtension/View/ShareExtensionBackGroundView.swift rename to iBox/ShareExtension/View/ShareExtensionBackGroundView.swift diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 51f7cf3..ff76348 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -14,6 +14,8 @@ class FavoriteView: UIView { private lazy var webView = WebViewPreloader.shared.getFavoriteView() + private let refreshControl = UIRefreshControl() + // MARK: - Initializer override init(frame: CGRect) { @@ -30,7 +32,10 @@ class FavoriteView: UIView { // MARK: - Setup Methods private func setupProperty() { + guard let webView else { return } backgroundColor = .backgroundColor + webView.scrollView.refreshControl = refreshControl + refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged) } private func setupHierarchy() { @@ -45,4 +50,12 @@ class FavoriteView: UIView { } } + @objc private func handleRefreshControl() { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in + guard let self = self , let webView = self.webView else { return } + webView.reload() + refreshControl.endRefreshing() + } + } + } From deeee296d5daa132104376df385dc5184582ffdb Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sun, 10 Mar 2024 15:57:52 +0900 Subject: [PATCH 096/370] =?UTF-8?q?feat:=20swipe=20action=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98=20=EB=B0=8F=20share=20action=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 33 ++++++++++++++++++- .../BoxList/BoxListViewController.swift | 6 ++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 70a5e04..566150c 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -13,6 +13,7 @@ import SnapKit protocol BoxListViewDelegate: AnyObject { func didSelectWeb(at url: URL, withName name: String) func pushViewController(type: EditType) + func pushViewController(url: URL?) } class BoxListView: UIView { @@ -128,7 +129,7 @@ extension BoxListView: UITableViewDelegate { line.backgroundColor = .tertiaryLabel return view } - + public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 0.3 } @@ -161,4 +162,34 @@ extension BoxListView: UITableViewDelegate { delegate?.didSelectWeb(at: webUrl, withName: webName) } + func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { + // 액션 정의 + let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: {(action, view, completionHandler) in + print("favoriteAction") // 실행하고 싶은 내용 + completionHandler(true) + }) + favoriteAction.backgroundColor = .box2 + favoriteAction.image = UIImage(systemName: "heart") + + let shareAction = UIContextualAction(style: .normal, title: "share", handler: {(action, view, completionHandler) in + let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModels[indexPath.row] + self.delegate?.pushViewController(url: cellViewModel?.url) + completionHandler(true) + }) + shareAction.backgroundColor = .box3 + shareAction.image = UIImage(systemName: "square.and.arrow.up") + + let deleteAction = UIContextualAction(style: .normal, title: "delete", handler: {(action, view, completionHandler) in + print("deleteAction") // 실행하고 싶은 내용 + completionHandler(true) + }) + deleteAction.backgroundColor = .systemGray + deleteAction.image = UIImage(systemName: "trash.fill") + + // 스와이프 액션 구성 + let configuration = UISwipeActionsConfiguration(actions: [deleteAction, shareAction, favoriteAction]) + configuration.performsFirstActionWithFullSwipe = false // 완전히 스와이프했을 때 첫 번째 액션이 자동으로 실행되는 것을 막음 + + return configuration + } } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 2ff4886..e4e9661 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -61,4 +61,10 @@ extension BoxListViewController: BoxListViewDelegate { } } + func pushViewController(url: URL?) { + guard let url = url else { return } + let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil) + self.present(activityViewController, animated: true) + } + } From ed8462cde3abb6bdd7febf4aa0de9df463eb6ef5 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Sun, 10 Mar 2024 16:18:37 +0900 Subject: [PATCH 097/370] =?UTF-8?q?feat:=20favorite,=20delete=20Action=20?= =?UTF-8?q?=EB=B7=B0=EB=AA=A8=EB=8D=B8=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 6 +++--- iBox/Sources/BoxList/BoxListViewModel.swift | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 566150c..11b6def 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -165,14 +165,14 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { // 액션 정의 let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: {(action, view, completionHandler) in - print("favoriteAction") // 실행하고 싶은 내용 + self.viewModel?.input.send(.setFavorite(indexPath: indexPath)) completionHandler(true) }) favoriteAction.backgroundColor = .box2 favoriteAction.image = UIImage(systemName: "heart") let shareAction = UIContextualAction(style: .normal, title: "share", handler: {(action, view, completionHandler) in - let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModels[indexPath.row] + let cellViewModel = self.viewModel?.viewModel(at: indexPath) self.delegate?.pushViewController(url: cellViewModel?.url) completionHandler(true) }) @@ -180,7 +180,7 @@ extension BoxListView: UITableViewDelegate { shareAction.image = UIImage(systemName: "square.and.arrow.up") let deleteAction = UIContextualAction(style: .normal, title: "delete", handler: {(action, view, completionHandler) in - print("deleteAction") // 실행하고 싶은 내용 + self.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) completionHandler(true) }) deleteAction.backgroundColor = .systemGray diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index ec1ba32..ddd8bf2 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -15,6 +15,8 @@ class BoxListViewModel { enum Input { case viewDidLoad case folderTapped(section: Int) + case deleteBookmark(indexPath: IndexPath) + case setFavorite(indexPath: IndexPath) } enum Output { @@ -36,6 +38,10 @@ class BoxListViewModel { case let .folderTapped(section): boxList[section].isOpened.toggle() output.send(.sendBoxList(boxList: boxList)) + case let .deleteBookmark(indexPath): + print("\(viewModel(at: indexPath).name) 지울게용") + case let .setFavorite(indexPath): + print("\(viewModel(at: indexPath).name) favorite 할게용") } }.store(in: &cancellables) return output.eraseToAnyPublisher() From 838cc681981fd8b96c34e06d1cfb2e8cb3365036 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 01:26:09 +0900 Subject: [PATCH 098/370] =?UTF-8?q?feat=09=20=20=20=20:=20GlobalURLManager?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Utils/GlobalURLManager.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 iBox/Sources/Utils/GlobalURLManager.swift diff --git a/iBox/Sources/Utils/GlobalURLManager.swift b/iBox/Sources/Utils/GlobalURLManager.swift new file mode 100644 index 0000000..72f0e21 --- /dev/null +++ b/iBox/Sources/Utils/GlobalURLManager.swift @@ -0,0 +1,16 @@ +// +// GlobalURLManager.swift +// iBox +// +// Created by 최종원 on 3/5/24. +// + +import Foundation + +class GlobalURLManager { + static let shared = GlobalURLManager() + + var incomingURL: URL? + + private init() {} +} From 09de017312fe9496e7711f5fedc9e388f32d5567 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 01:28:18 +0900 Subject: [PATCH 099/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=99=94=EB=A9=B4=EC=97=90=20url=20=EC=A0=84=EB=8B=AC?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/SceneDelegate.swift | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 9059b7e..ea24fd1 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -47,6 +47,18 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { print("Opened URL: \(url)") // 앱이 실행되기 전에 url이 들어오는 경우 Logic + GlobalURLManager.shared.incomingURL = url + + if let windowScene = scene as? UIWindowScene, + let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { + tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 + + // 첫 번째 탭(FirstViewController)에 있는 shouldPresentModalAutomatically를 true로 설정 + if let navigationController = tabBarController.selectedViewController as? UINavigationController, + let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { + boxListViewController.shouldPresentModalAutomatically = true + } + } } } @@ -75,8 +87,19 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard url.scheme == "iBox" else { return } print("Opened URL: \(url)") - // 앱 실행 중에 url이 들어오는 경우 Logic + GlobalURLManager.shared.incomingURL = url + + if let windowScene = scene as? UIWindowScene, + let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { + tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 + + // 첫 번째 탭(FirstViewController)에 있는 shouldPresentModalAutomatically를 true로 설정 + if let navigationController = tabBarController.selectedViewController as? UINavigationController, + let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { + boxListViewController.shouldPresentModalAutomatically = true + } + } } } From c81c9a6c8501f47a96231d9877b42a7534697921 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 01:29:09 +0900 Subject: [PATCH 100/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 214 +++++++++++++++++- .../AddBookmarkViewController.swift | 61 ++++- 2 files changed, 262 insertions(+), 13 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 46acd56..20d9fbd 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -9,33 +9,223 @@ import UIKit import SnapKit -class AddBookmarkBottomSheetView: UIView { +class AddBookmarkView: UIView { + + var onButtonTapped: (() -> Void)? + var onTextChange: ((Bool) -> Void)? // '추가'버튼 비활성화 관련 + + private lazy var textFieldView: UIView = { + let view = UIView() + view.backgroundColor = .white + view.layer.cornerRadius = 20 + view.clipsToBounds = true + view.addSubview(nameTextView) + view.addSubview(separatorView) + view.addSubview(urlTextView) + return view + }() + + private let nameTextViewPlaceHolder: UILabel = { + let label = UILabel() + label.text = "북마크 이름" + label.font = UIFont.systemFont(ofSize: 18) + label.textColor = #colorLiteral(red: 0.8374180198, green: 0.8374378085, blue: 0.8374271393, alpha: 1) + return label + }() + + private let nameTextView: UITextView = { + let textView = UITextView() + textView.backgroundColor = .clear + textView.layer.borderWidth = 0 // 테두리 안보이게 + textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) + textView.font = UIFont.systemFont(ofSize: 16) + textView.textColor = UIColor.black + textView.isScrollEnabled = true + return textView + }() + + + + private let separatorView: UIView = { + let view = UIView() + view.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1) + return view + }() + + private let urlTextViewPlaceHolder: UILabel = { + let label = UILabel() + label.text = "URL" + label.font = UIFont.systemFont(ofSize: 18) + label.textColor = #colorLiteral(red: 0.8374180198, green: 0.8374378085, blue: 0.8374271393, alpha: 1) + return label + }() + + + private let urlTextView: UITextView = { + let textView = UITextView() + textView.backgroundColor = .clear + textView.layer.borderWidth = 0 // 테두리 안보이게 + textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) + textView.font = UIFont.systemFont(ofSize: 16) + textView.textColor = UIColor.black + textView.isScrollEnabled = true +// textView.text = "Enter URL" + return textView + }() + - // MARK: - Initializer + + private lazy var button: UIButton = { + let button = UIButton(type: .custom) + button.backgroundColor = .white + button.layer.cornerRadius = 10 + button.clipsToBounds = true + button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) + button.isEnabled = true + button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) + return button + }() + + private let buttonLabel: UILabel = { + let label = UILabel() + label.text = "목록" + label.font = UIFont.systemFont(ofSize: 17) + label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + return label + }() + + private let selectedFolderLabel: UILabel = { + let label = UILabel() + label.text = "aaaa" + label.font = UIFont.systemFont(ofSize: 17) + label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + return label + }() override init(frame: CGRect) { super.init(frame: frame) - setupProperty() - setupHierarchy() - setupLayout() + configureUI() + + nameTextView.delegate = self + urlTextView.delegate = self } required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") + super.init(coder: coder) + } + + private func configureUI() { +// backgroundColor = .systemBackground + backgroundColor = .systemGroupedBackground + addSubview(textFieldView) + addSubview(nameTextViewPlaceHolder) + addSubview(urlTextViewPlaceHolder) + addSubview(button) + addSubview(buttonLabel) + addSubview(selectedFolderLabel) + setupLayout() + updateTextFieldWithIncomingURL() + } + + private func setupLayout() { + + // 텍스트 필드뷰 + textFieldView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(100) + make.height.equalTo(150) + make.leading.equalToSuperview().offset(20) + make.trailing.equalToSuperview().offset(-20) + } + + // name 텍스트뷰 + nameTextView.snp.makeConstraints { make in + make.top.equalTo(textFieldView.snp.top).offset(10) + make.leading.trailing.equalTo(textFieldView).offset(15) + make.width.equalTo(textFieldView).inset(10) + make.height.equalTo(30) + } + + nameTextViewPlaceHolder.snp.makeConstraints { make in + make.top.equalTo(nameTextView.snp.top).offset(7) + make.leading.equalTo(nameTextView.snp.leading).offset(5) + } + + separatorView.snp.makeConstraints { make in + make.top.equalTo(nameTextView.snp.bottom).offset(10) + make.leading.trailing.equalTo(nameTextView).offset(5) + make.height.equalTo(1) + } + + // url 텍스트뷰 + urlTextView.snp.makeConstraints { make in + make.top.equalTo(separatorView.snp.bottom).offset(10) + make.leading.trailing.equalTo(nameTextView) + make.bottom.equalTo(textFieldView.snp.bottom).inset(10) + } + + urlTextViewPlaceHolder.snp.makeConstraints { make in + make.top.equalTo(urlTextView.snp.top).offset(7) + make.leading.equalTo(urlTextView.snp.leading).offset(5) + } + + // 버튼 + button.snp.makeConstraints { make in + make.top.equalTo(textFieldView.snp.bottom).offset(20) + make.leading.equalTo(self.snp.leading).offset(20) + make.trailing.equalTo(self.snp.trailing).offset(-20) + make.height.equalTo(40) + } + + + buttonLabel.snp.makeConstraints { make in + make.leading.equalTo(button.snp.leading).offset(20) + make.centerY.equalTo(button.snp.centerY) + make.width.equalTo(40) + make.height.equalTo(40) + } + + selectedFolderLabel.snp.makeConstraints { make in + make.trailing.equalTo(button.snp.trailing).inset(40) + make.centerY.equalTo(button.snp.centerY) + make.width.equalTo(40) + make.height.equalTo(40) + } + } - // MARK: - Setup Methods - private func setupProperty() { - backgroundColor = .backgroundColor + private func updateTextFieldWithIncomingURL() { + // GlobalURLManager의 incomingURL을 텍스트 필드에 설정 + urlTextView.text = GlobalURLManager.shared.incomingURL?.absoluteString + + // URL을 텍스트 필드에 설정한 후 GlobalURLManager의 incomingURL을 nil로 설정 + GlobalURLManager.shared.incomingURL = nil } - private func setupHierarchy() { - + @objc func buttonTapped() { + onButtonTapped?() } - private func setupLayout() { +} + + +extension AddBookmarkView: UITextViewDelegate { + + func textViewDidChange(_ textView: UITextView) { + // 텍스트 변경 시 검사를 수행하고, '추가' 버튼 활성화 상태를 업데이트 + let isBothTextViewsFilled = !nameTextView.text.isEmpty && !urlTextView.text.isEmpty + onTextChange?(isBothTextViewsFilled) + if textView == nameTextView { + // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. + nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty + } + + if textView == urlTextView { + // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. + urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty + } } + } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index 70a49ea..b50d7f8 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -7,6 +7,65 @@ import UIKit -class AddBookmarkBottomSheetViewController: BottomSheetViewController { +class AddBookmarkViewController: UIViewController { + + override func loadView() { + let addBookmarkView = AddBookmarkView() + addBookmarkView.onButtonTapped = { [weak self] in + self?.navigateToDetailScreen() // 함수이름 수정 필요 + } + + // '추가' 버튼 비활성화 관련 + addBookmarkView.onTextChange = { [weak self] isEnabled in + self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled + } + + + view = addBookmarkView + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupNavigationBar() + navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 비활성화 + + } + + func setupNavigationBar() { + let appearance = UINavigationBarAppearance() + appearance.configureWithTransparentBackground() + + navigationController?.navigationBar.tintColor = .blue + navigationController?.navigationBar.standardAppearance = appearance + navigationController?.navigationBar.compactAppearance = appearance + navigationController?.navigationBar.scrollEdgeAppearance = appearance + + title = "새로운 북마크" + + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "취소", style: .plain, target: self, action: #selector(cancelButtonTapped)) + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "추가", style: .plain, target: self, action: #selector(saveButtonTapped)) + + } + + @objc func cancelButtonTapped() { + self.dismiss(animated: true, completion: nil) + } + + @objc func saveButtonTapped() { + // 저장 로직을 여기에 구현 + print("저장 로직 실행") + + // 모달을 닫습니다. + self.dismiss(animated: true, completion: nil) + } + + private func navigateToDetailScreen() { + let folderListViewController = FolderListViewController() + folderListViewController.title = "목록" + navigationController?.pushViewController(folderListViewController, animated: true) + + + } } From 7532018984b6cc6a5d94e234b693ebb1ed8c3d40 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 01:31:06 +0900 Subject: [PATCH 101/370] =?UTF-8?q?feat=09=20=20=20=20:=20Folder=20List=20?= =?UTF-8?q?View=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/FolderListCell.swift | 46 ++++++++ .../BoxList/AddBookmark/FolderListView.swift | 108 ++++++++++++++++++ .../FolderListViewController.swift | 22 ++++ 3 files changed, 176 insertions(+) create mode 100644 iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift create mode 100644 iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift create mode 100644 iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift new file mode 100644 index 0000000..ceb0b6c --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift @@ -0,0 +1,46 @@ +// +// FolderListCell.swift +// iBox +// +// Created by 최종원 on 3/7/24. +// + +import UIKit + +class FolderListCell: UITableViewCell { + + static let reuseIdentifier = "ListCell" + + let testLabel: UILabel = { + let label = UILabel() + label.font = UIFont.boldSystemFont(ofSize: 17) + return label + }() + + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: .default, reuseIdentifier: reuseIdentifier) + configureUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func configureUI() { + self.contentView.addSubview(testLabel) + + setupLayout() + + } + + func setupLayout() { + testLabel.snp.makeConstraints { make in + make.leading.equalToSuperview().offset(20) // 왼쪽 여백 + make.trailing.equalToSuperview().offset(-20) // 오른쪽 여백 + make.centerY.equalToSuperview() // 세로 중앙 정렬 + } + + } + +} diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift new file mode 100644 index 0000000..451a828 --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift @@ -0,0 +1,108 @@ +// +// FolderListView.swift +// iBox +// +// Created by 최종원 on 3/7/24. +// + +import UIKit + +class FolderListView: UIView { + + // CoreDataManager + let coreDataManager = CoreDataManager.shared + + // 폴더 엔티티를 저장할 배열 + var folders: [Folder] = [] + + + private let tableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + return tableView + }() + + private let infoLabel: UILabel = { + let label = UILabel() + label.text = "북마크를 추가할 폴더를 선택해주세요" + label.font = UIFont.systemFont(ofSize: 17) + label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textAlignment = .center // 텍스트 가운데 정렬 + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]) + stackView.axis = .vertical + stackView.spacing = 10 + stackView.translatesAutoresizingMaskIntoConstraints = false + return stackView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func configureUI() { + backgroundColor = .systemBackground +// addSubview(tableView) + addSubview(stackView) + setupLayout() + setupTableView() + } + + + func setupLayout() { + + stackView.snp.makeConstraints { make in + make.top.equalTo(self.safeAreaLayoutGuide.snp.top).offset(20) // Adjust as necessary + make.bottom.equalTo(self.safeAreaLayoutGuide.snp.bottom) + make.leading.equalTo(self.snp.leading) + make.trailing.equalTo(self.snp.trailing) + } + + } + + var num = 0 + + func setupTableView() { + self.tableView.dataSource = self + self.tableView.delegate = self + self.tableView.register(FolderListCell.self, forCellReuseIdentifier: FolderListCell.reuseIdentifier) + + // 모든 폴더 가져오기 + folders = coreDataManager.getFolders() + print("folders : \(folders)") + + } + +} + +extension FolderListView: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return folders.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: FolderListCell.reuseIdentifier, for: indexPath) as! FolderListCell + cell.testLabel.text = folders[indexPath.row].name + + return cell + } + + +} + +extension FolderListView: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + // 선택시 로직 + print("항목 \(indexPath.row) 선택됨") + } + +} diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift new file mode 100644 index 0000000..7fd629f --- /dev/null +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift @@ -0,0 +1,22 @@ +// +// FolderListViewController.swift +// iBox +// +// Created by 최종원 on 3/7/24. +// + +import UIKit + +class FolderListViewController: UIViewController { + let bookmarkListView = FolderListView() + + override func loadView() { + view = bookmarkListView + } + + override func viewDidLoad() { + super.viewDidLoad() + + } + +} From 53a3ee4c565af9211da1cae23170335b5dd1fe02 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 01:35:12 +0900 Subject: [PATCH 102/370] =?UTF-8?q?feat=09=20=20=20=20:=20Share=20extensio?= =?UTF-8?q?n=EC=8B=9C=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=9D=84=EC=9A=B0=EA=B8=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/BoxListViewController.swift | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift index 0972f1e..e553646 100644 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift @@ -9,6 +9,19 @@ import UIKit class BoxListViewController: BaseViewController, BaseViewControllerProtocol { + var shouldPresentModalAutomatically: Bool = false { + didSet { + if shouldPresentModalAutomatically { + // shouldPresentModalAutomatically가 true로 설정될 때 함수 호출 + dismiss(animated: false) { + self.addButtonTapped() + } + // 함수 호출 후 shouldPresentModalAutomatically를 false로 설정 + shouldPresentModalAutomatically = false + } + } + } + // MARK: - Life Cycle override func viewDidLoad() { @@ -31,8 +44,11 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - Action Functions @objc private func addButtonTapped() { - let addBookmarkBottomSheetViewController = AddBookmarkBottomSheetViewController(bottomSheetHeight: 200) - present(addBookmarkBottomSheetViewController, animated: false) + let addBookmarkViewController = AddBookmarkViewController() + let navigationController = UINavigationController(rootViewController: addBookmarkViewController) + + navigationController.modalPresentationStyle = .pageSheet + present(navigationController, animated: true, completion: nil) } @objc private func moreButtonTapped() { From 8d5d8f5a50cb81476d8e40455af9d6ee0c4b6e61 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 04:14:10 +0900 Subject: [PATCH 103/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EC=83=88=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 19 ++++--- .../AddBookmarkViewController.swift | 49 ++++++++++++++++--- .../BoxList/AddBookmark/FolderListView.swift | 4 +- .../FolderListViewController.swift | 12 +++++ 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 20d9fbd..b1a44f0 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -13,6 +13,12 @@ class AddBookmarkView: UIView { var onButtonTapped: (() -> Void)? var onTextChange: ((Bool) -> Void)? // '추가'버튼 비활성화 관련 + + var selectedFolderName: String? { + didSet { + selectedFolderLabel.text = selectedFolderName + } + } private lazy var textFieldView: UIView = { let view = UIView() @@ -33,7 +39,7 @@ class AddBookmarkView: UIView { return label }() - private let nameTextView: UITextView = { + let nameTextView: UITextView = { let textView = UITextView() textView.backgroundColor = .clear textView.layer.borderWidth = 0 // 테두리 안보이게 @@ -61,7 +67,7 @@ class AddBookmarkView: UIView { }() - private let urlTextView: UITextView = { + let urlTextView: UITextView = { let textView = UITextView() textView.backgroundColor = .clear textView.layer.borderWidth = 0 // 테두리 안보이게 @@ -74,7 +80,6 @@ class AddBookmarkView: UIView { }() - private lazy var button: UIButton = { let button = UIButton(type: .custom) button.backgroundColor = .white @@ -94,11 +99,11 @@ class AddBookmarkView: UIView { return label }() - private let selectedFolderLabel: UILabel = { + let selectedFolderLabel: UILabel = { let label = UILabel() - label.text = "aaaa" label.font = UIFont.systemFont(ofSize: 17) label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textAlignment = .right return label }() @@ -187,7 +192,7 @@ class AddBookmarkView: UIView { selectedFolderLabel.snp.makeConstraints { make in make.trailing.equalTo(button.snp.trailing).inset(40) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(40) + make.width.equalTo(100) make.height.equalTo(40) } @@ -202,7 +207,7 @@ class AddBookmarkView: UIView { GlobalURLManager.shared.incomingURL = nil } - @objc func buttonTapped() { + @objc private func buttonTapped() { onButtonTapped?() } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index b50d7f8..1da6bc5 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -7,13 +7,16 @@ import UIKit -class AddBookmarkViewController: UIViewController { +final class AddBookmarkViewController: UIViewController { + var selectedFolder: Folder? + private let coreDataManager = CoreDataManager.shared + private let addBookmarkView = AddBookmarkView() + override func loadView() { - let addBookmarkView = AddBookmarkView() addBookmarkView.onButtonTapped = { [weak self] in - self?.navigateToDetailScreen() // 함수이름 수정 필요 + self?.navigateToFolderListView() // 함수이름 수정 필요 } // '추가' 버튼 비활성화 관련 @@ -21,16 +24,28 @@ class AddBookmarkViewController: UIViewController { self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled } - view = addBookmarkView } + + override func viewWillAppear(_ animated: Bool) { + + // selectedFolder가 nil이면 CoreDataManager에서 폴더 목록을 가져와 첫 번째 요소로 초기화합니다. + if let selectedFolder = selectedFolder { + addBookmarkView.selectedFolderName = selectedFolder.name + } else { + let folders = CoreDataManager.shared.getFolders() + if let firstFolder = folders.first { + selectedFolder = firstFolder + addBookmarkView.selectedFolderName = firstFolder.name + } + } + } override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 비활성화 - } func setupNavigationBar() { @@ -49,19 +64,37 @@ class AddBookmarkViewController: UIViewController { } - @objc func cancelButtonTapped() { + @objc private func cancelButtonTapped() { self.dismiss(animated: true, completion: nil) } - @objc func saveButtonTapped() { + @objc private func saveButtonTapped() { // 저장 로직을 여기에 구현 print("저장 로직 실행") + guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, + let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, + let url = URL(string: urlString) else { + print("Invalid input") + return + } + + let newBookmark = Bookmark(id: UUID(), name: name, url: url) + + // 선택된 폴더가 있을 경우에만 북마크를 추가합니다. + if let selectedFolder = selectedFolder { + coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) + print("북마크 저장 완료: \(newBookmark.name)") + } else { + print("선택된 폴더가 없습니다.") + } + + // 모달을 닫습니다. self.dismiss(animated: true, completion: nil) } - private func navigateToDetailScreen() { + private func navigateToFolderListView() { let folderListViewController = FolderListViewController() folderListViewController.title = "목록" navigationController?.pushViewController(folderListViewController, animated: true) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift index 451a828..d90f503 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift @@ -14,6 +14,7 @@ class FolderListView: UIView { // 폴더 엔티티를 저장할 배열 var folders: [Folder] = [] + var onFolderSelected: ((Folder) -> Void)? private let tableView: UITableView = { @@ -51,7 +52,6 @@ class FolderListView: UIView { func configureUI() { backgroundColor = .systemBackground -// addSubview(tableView) addSubview(stackView) setupLayout() setupTableView() @@ -103,6 +103,8 @@ extension FolderListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 선택시 로직 print("항목 \(indexPath.row) 선택됨") + let selectedFolder = folders[indexPath.row] + onFolderSelected?(selectedFolder) } } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift index 7fd629f..969aa28 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift @@ -17,6 +17,18 @@ class FolderListViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + bookmarkListView.onFolderSelected = { [weak self] folder in + + guard let self = self else { return } + + if let addBookmarkVC = self.navigationController?.viewControllers.first as? AddBookmarkViewController { + addBookmarkVC.selectedFolder = folder + + print("folder: \(folder)") + self.navigationController?.popViewController(animated: true) + } + } } + } From 739800cbf51de7ca40610a7cda3d6935bce9e417 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 04:46:24 +0900 Subject: [PATCH 104/370] =?UTF-8?q?refactor=20=20:=20AddBookmarkView,=20Ad?= =?UTF-8?q?dBookmarkViewController=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 15 +---- .../AddBookmarkViewController.swift | 63 +++++++++---------- 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index b1a44f0..cc59ef9 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -217,20 +217,11 @@ class AddBookmarkView: UIView { extension AddBookmarkView: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { + nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty + urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty + // 텍스트 변경 시 검사를 수행하고, '추가' 버튼 활성화 상태를 업데이트 let isBothTextViewsFilled = !nameTextView.text.isEmpty && !urlTextView.text.isEmpty onTextChange?(isBothTextViewsFilled) - - if textView == nameTextView { - // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. - nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty - } - - if textView == urlTextView { - // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. - urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty - } } - - } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index 1da6bc5..74119ff 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -15,40 +15,21 @@ final class AddBookmarkViewController: UIViewController { override func loadView() { - addBookmarkView.onButtonTapped = { [weak self] in - self?.navigateToFolderListView() // 함수이름 수정 필요 - } - - // '추가' 버튼 비활성화 관련 - addBookmarkView.onTextChange = { [weak self] isEnabled in - self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled - } - - view = addBookmarkView + super.loadView() + setupAddBookmarkView() } override func viewWillAppear(_ animated: Bool) { - - // selectedFolder가 nil이면 CoreDataManager에서 폴더 목록을 가져와 첫 번째 요소로 초기화합니다. - if let selectedFolder = selectedFolder { - addBookmarkView.selectedFolderName = selectedFolder.name - } else { - let folders = CoreDataManager.shared.getFolders() - if let firstFolder = folders.first { - selectedFolder = firstFolder - addBookmarkView.selectedFolderName = firstFolder.name - } - } + super.viewWillAppear(animated) + updateSelectedFolder() } override func viewDidLoad() { super.viewDidLoad() - setupNavigationBar() - navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 비활성화 } - func setupNavigationBar() { + private func setupNavigationBar() { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() @@ -60,17 +41,31 @@ final class AddBookmarkViewController: UIViewController { title = "새로운 북마크" navigationItem.leftBarButtonItem = UIBarButtonItem(title: "취소", style: .plain, target: self, action: #selector(cancelButtonTapped)) - navigationItem.rightBarButtonItem = UIBarButtonItem(title: "추가", style: .plain, target: self, action: #selector(saveButtonTapped)) - + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "추가", style: .plain, target: self, action: #selector(addButtonTapped)) + navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 '추가' 버튼 비활성화 + } + + private func setupAddBookmarkView() { + addBookmarkView.onButtonTapped = { [weak self] in + self?.openFolderSelection() + } + addBookmarkView.onTextChange = { [weak self] isEnabled in + self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled + } + view = addBookmarkView + } + + private func updateSelectedFolder() { + selectedFolder = selectedFolder ?? CoreDataManager.shared.getFolders().first + addBookmarkView.selectedFolderName = selectedFolder?.name } @objc private func cancelButtonTapped() { - self.dismiss(animated: true, completion: nil) + dismiss(animated: true) } - @objc private func saveButtonTapped() { - // 저장 로직을 여기에 구현 - print("저장 로직 실행") + @objc private func addButtonTapped() { + // 북마크 추가 로직 guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, @@ -81,7 +76,7 @@ final class AddBookmarkViewController: UIViewController { let newBookmark = Bookmark(id: UUID(), name: name, url: url) - // 선택된 폴더가 있을 경우에만 북마크를 추가합니다. + // 선택된 폴더가 있을 경우에만 북마크를 추가 if let selectedFolder = selectedFolder { coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) print("북마크 저장 완료: \(newBookmark.name)") @@ -89,16 +84,14 @@ final class AddBookmarkViewController: UIViewController { print("선택된 폴더가 없습니다.") } - // 모달을 닫습니다. self.dismiss(animated: true, completion: nil) } - private func navigateToFolderListView() { + private func openFolderSelection() { let folderListViewController = FolderListViewController() folderListViewController.title = "목록" navigationController?.pushViewController(folderListViewController, animated: true) - - } + } From fe3098c9ed7c0114212d5b3faf223ba1e2d49343 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 05:39:51 +0900 Subject: [PATCH 105/370] =?UTF-8?q?feat=09=20=20=20=20:=20FolderListCell?= =?UTF-8?q?=EC=97=90=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/FolderListCell.swift | 33 ++++++++++++------- .../BoxList/AddBookmark/FolderListView.swift | 25 +++++++------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift index ceb0b6c..6309758 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift @@ -10,12 +10,16 @@ import UIKit class FolderListCell: UITableViewCell { static let reuseIdentifier = "ListCell" - - let testLabel: UILabel = { - let label = UILabel() - label.font = UIFont.boldSystemFont(ofSize: 17) - return label - }() + + private let folderImageView = UIImageView().then { + $0.image = UIImage(systemName: "folder.fill") + $0.contentMode = .scaleAspectFit + } + + let folderNameLabel = UILabel().then { + $0.textColor = .label + $0.font = .systemFont(ofSize: 17, weight: .regular) + } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -28,17 +32,24 @@ class FolderListCell: UITableViewCell { } func configureUI() { - self.contentView.addSubview(testLabel) + self.contentView.addSubview(folderImageView) + self.contentView.addSubview(folderNameLabel) + self.backgroundColor = .clear setupLayout() } func setupLayout() { - testLabel.snp.makeConstraints { make in - make.leading.equalToSuperview().offset(20) // 왼쪽 여백 - make.trailing.equalToSuperview().offset(-20) // 오른쪽 여백 - make.centerY.equalToSuperview() // 세로 중앙 정렬 + folderImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.width.height.equalTo(30) + make.leading.equalToSuperview().offset(20) + } + + folderNameLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.leading.equalTo(folderImageView.snp.trailing).offset(10) } } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift index d90f503..03f42ed 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift @@ -17,26 +17,27 @@ class FolderListView: UIView { var onFolderSelected: ((Folder) -> Void)? + private let infoLabel: UILabel = { + let label = UILabel() + label.text = "새로운 북마크를 추가할 폴더를 선택해주세요." + label.font = UIFont.boldSystemFont(ofSize: 17) + label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textAlignment = .center + return label + }() + private let tableView: UITableView = { let tableView = UITableView() + tableView.backgroundColor = .clear tableView.translatesAutoresizingMaskIntoConstraints = false return tableView }() - private let infoLabel: UILabel = { - let label = UILabel() - label.text = "북마크를 추가할 폴더를 선택해주세요" - label.font = UIFont.systemFont(ofSize: 17) - label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) - label.textAlignment = .center // 텍스트 가운데 정렬 - return label - }() private lazy var stackView: UIStackView = { let stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]) stackView.axis = .vertical - stackView.spacing = 10 - stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.spacing = 20 return stackView }() @@ -51,7 +52,7 @@ class FolderListView: UIView { } func configureUI() { - backgroundColor = .systemBackground + backgroundColor = .systemGroupedBackground addSubview(stackView) setupLayout() setupTableView() @@ -91,7 +92,7 @@ extension FolderListView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: FolderListCell.reuseIdentifier, for: indexPath) as! FolderListCell - cell.testLabel.text = folders[indexPath.row].name + cell.folderNameLabel.text = folders[indexPath.row].name return cell } From d765be8b50e1b47869a1d31ffee8ef58ac81deb0 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 05:41:20 +0900 Subject: [PATCH 106/370] =?UTF-8?q?feat=09=20=20=20=20:=20Folder=20List=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=9C=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index cc59ef9..4de45a2 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -102,11 +102,21 @@ class AddBookmarkView: UIView { let selectedFolderLabel: UILabel = { let label = UILabel() label.font = UIFont.systemFont(ofSize: 17) - label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) label.textAlignment = .right return label }() + private let chevronImageView: UIImageView = { + let imageView = UIImageView() + let image = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate) + imageView.image = image + imageView.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) //.label // 시스템 라벨 색상을 사용하여 다크 모드와 라이트 모드에서 모두 잘 보이게 합니다. + imageView.contentMode = .scaleAspectFit // 이미지가 콘텐츠 비율을 유지하도록 합니다. + return imageView + }() + + override init(frame: CGRect) { super.init(frame: frame) configureUI() @@ -120,7 +130,6 @@ class AddBookmarkView: UIView { } private func configureUI() { -// backgroundColor = .systemBackground backgroundColor = .systemGroupedBackground addSubview(textFieldView) addSubview(nameTextViewPlaceHolder) @@ -128,6 +137,7 @@ class AddBookmarkView: UIView { addSubview(button) addSubview(buttonLabel) addSubview(selectedFolderLabel) + addSubview(chevronImageView) setupLayout() updateTextFieldWithIncomingURL() } @@ -178,7 +188,7 @@ class AddBookmarkView: UIView { make.top.equalTo(textFieldView.snp.bottom).offset(20) make.leading.equalTo(self.snp.leading).offset(20) make.trailing.equalTo(self.snp.trailing).offset(-20) - make.height.equalTo(40) + make.height.equalTo(50) } @@ -189,13 +199,22 @@ class AddBookmarkView: UIView { make.height.equalTo(40) } + // 선택된 폴더 레이블 selectedFolderLabel.snp.makeConstraints { make in - make.trailing.equalTo(button.snp.trailing).inset(40) + make.trailing.equalTo(chevronImageView.snp.trailing).inset(20) make.centerY.equalTo(button.snp.centerY) make.width.equalTo(100) make.height.equalTo(40) } + // 꺽쇠 이미지 + chevronImageView.snp.makeConstraints { make in + make.trailing.equalTo(button.snp.trailing).inset(20) + make.centerY.equalTo(button.snp.centerY) + make.width.equalTo(17) + make.height.equalTo(17) + } + } From 1940c7c121dd8c4ceb8da61b76cd6d37bdb17b24 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 06:05:06 +0900 Subject: [PATCH 107/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B7=A8=EC=86=8C=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=8B=9C=20alert=EC=B0=BD=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddBookmarkViewController.swift | 23 ++++++++++++++++++- .../BoxList/AddBookmark/FolderListView.swift | 2 -- .../FolderListViewController.swift | 1 - 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index 74119ff..cde51dd 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -61,7 +61,28 @@ final class AddBookmarkViewController: UIViewController { } @objc private func cancelButtonTapped() { - dismiss(animated: true) + + // nameTextView와 urlTextView가 모두 비어 있는지 확인 + let isTextFieldsEmpty = addBookmarkView.nameTextView.text?.isEmpty ?? true && addBookmarkView.urlTextView.text?.isEmpty ?? true + + if isTextFieldsEmpty { + // 모든 텍스트 필드가 비어있으면, 바로 dismiss + self.dismiss(animated: true, completion: nil) + } else { + // 하나라도 텍스트 필드에 내용이 있으면, 사용자에게 경고 창 표시 + let alertController = UIAlertController(title: nil, message: "북마크 추가를 취소하시겠습니까?", preferredStyle: .alert) + + let discardAction = UIAlertAction(title: "변경사항 폐기", style: .destructive) { [weak self] _ in + self?.dismiss(animated: true, completion: nil) + } + + let cancelAction = UIAlertAction(title: "취소", style: .cancel) + + alertController.addAction(discardAction) + alertController.addAction(cancelAction) + + present(alertController, animated: true, completion: nil) + } } @objc private func addButtonTapped() { diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift index 03f42ed..01c9b06 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift @@ -79,8 +79,6 @@ class FolderListView: UIView { // 모든 폴더 가져오기 folders = coreDataManager.getFolders() - print("folders : \(folders)") - } } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift index 969aa28..2171dad 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListViewController.swift @@ -24,7 +24,6 @@ class FolderListViewController: UIViewController { if let addBookmarkVC = self.navigationController?.viewControllers.first as? AddBookmarkViewController { addBookmarkVC.selectedFolder = folder - print("folder: \(folder)") self.navigationController?.popViewController(animated: true) } } From 8499a650a05be827e7b7f8a575ebeaa791586512 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 11 Mar 2024 06:20:26 +0900 Subject: [PATCH 108/370] =?UTF-8?q?fix=09=20=20=20=20:=20=EC=A0=9C?= =?UTF-8?q?=EC=95=BD=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20touchesBegan=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 4de45a2..47f7118 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -128,6 +128,10 @@ class AddBookmarkView: UIView { required init?(coder: NSCoder) { super.init(coder: coder) } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + self.endEditing(true) + } private func configureUI() { backgroundColor = .systemGroupedBackground @@ -156,7 +160,6 @@ class AddBookmarkView: UIView { nameTextView.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.top).offset(10) make.leading.trailing.equalTo(textFieldView).offset(15) - make.width.equalTo(textFieldView).inset(10) make.height.equalTo(30) } @@ -201,7 +204,7 @@ class AddBookmarkView: UIView { // 선택된 폴더 레이블 selectedFolderLabel.snp.makeConstraints { make in - make.trailing.equalTo(chevronImageView.snp.trailing).inset(20) + make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) make.width.equalTo(100) make.height.equalTo(40) @@ -236,11 +239,22 @@ class AddBookmarkView: UIView { extension AddBookmarkView: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { - nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty - urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty +// nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty +// urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty // 텍스트 변경 시 검사를 수행하고, '추가' 버튼 활성화 상태를 업데이트 let isBothTextViewsFilled = !nameTextView.text.isEmpty && !urlTextView.text.isEmpty onTextChange?(isBothTextViewsFilled) + + if textView == nameTextView { + // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. + nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty + } + + if textView == urlTextView { + // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. + urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty + } + } } From 02bd4f4726e68ee887dccfe1e2e14a34ede57615 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 12 Mar 2024 02:26:46 +0900 Subject: [PATCH 109/370] feat: add folder --- iBox/Sources/Base/BaseViewController.swift | 12 ++++ .../BoxList/BoxListSectionViewModel.swift | 2 +- iBox/Sources/BoxList/BoxListView.swift | 3 +- .../BoxList/BoxListViewController.swift | 18 +++++- iBox/Sources/BoxList/BoxListViewModel.swift | 11 ++++ iBox/Sources/BoxList/Edit/EditView.swift | 4 +- .../BoxList/EditFolder/EditFolderView.swift | 51 ++++++++++++++- .../EditFolder/EditFolderViewController.swift | 48 +++++++++++++- .../EditFolder/EditFolderViewModel.swift | 25 ++++++++ .../BoxList/EditFolder/FolderCell.swift | 45 ++++++++++++++ iBox/Sources/BoxList/FolderButton.swift | 27 ++------ iBox/Sources/BoxList/FolderView.swift | 62 +++++++++++++++++++ .../Sources/Extension/UIColor+Extension.swift | 2 +- 13 files changed, 280 insertions(+), 30 deletions(-) create mode 100644 iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift create mode 100644 iBox/Sources/BoxList/EditFolder/FolderCell.swift create mode 100644 iBox/Sources/BoxList/FolderView.swift diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index 35fdaca..daa5e4f 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -169,6 +169,18 @@ class BaseViewController: UIViewController { navigationBar.moreButton.isHidden = hidden } + func setNavigationBarAddButtonHidden(_ hidden: Bool) { + navigationBar.addButton.isHidden = hidden + + if !hidden { + navigationBar.addButton.snp.remakeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + make.width.height.equalTo(24) + } + } + } + func setNavigationBarAddButtonAction(_ selector: Selector) { navigationBar.addButton.addTarget(self, action: selector, for: .touchUpInside) } diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index 43d0f53..3c85773 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -8,7 +8,7 @@ import Foundation class BoxListSectionViewModel: Identifiable { - private var folder: Folder + var folder: Folder private var originalBoxListCellViewModels: [BoxListCellViewModel]! init(folder: Folder) { diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 70a5e04..79f13b0 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -22,7 +22,7 @@ class BoxListView: UIView { weak var delegate: BoxListViewDelegate? private var cancellables = Set() - // MARK : - UI Components + // MARK: - UI Components private let backgroundView = UIView().then { $0.clipsToBounds = true @@ -50,7 +50,6 @@ class BoxListView: UIView { setupLayout() configureDataSource() bindViewModel() - viewModel?.input.send(.viewDidLoad) } required init?(coder: NSCoder) { diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 2ff4886..c03e837 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -16,9 +16,15 @@ class BoxListViewController: BaseViewController, BaseViewController setupNavigationBar() guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.input.send(.viewDidLoad) contentView.delegate = self } + override func viewWillAppear(_ animated: Bool) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.input.send(.viewWillAppear) + } + // MARK: - BaseViewControllerProtocol func setupNavigationBar() { @@ -55,10 +61,20 @@ extension BoxListViewController: BoxListViewDelegate { func pushViewController(type: EditType) { switch type { case .folder: - navigationController?.pushViewController(EditFolderViewController(), animated: true) + guard let contentView = contentView as? BoxListView else { return } + let editFolderViewController = EditFolderViewController(folders: contentView.viewModel?.folders ?? []) + editFolderViewController.delegate = self + navigationController?.pushViewController(editFolderViewController, animated: true) case .bookmark: navigationController?.pushViewController(EditBookmarkViewController(), animated: true) } } } + +extension BoxListViewController: EditFolderViewControllerDelegate { + func addFolder(_ folder: Folder) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.addFolder(folder) + } +} diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index ec1ba32..3b0ad4f 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -12,8 +12,13 @@ class BoxListViewModel { var boxList = [BoxListSectionViewModel]() + var folders: [Folder] { + boxList.map{ $0.folder } + } + enum Input { case viewDidLoad + case viewWillAppear case folderTapped(section: Int) } @@ -32,6 +37,7 @@ class BoxListViewModel { case .viewDidLoad: let folders = CoreDataManager.shared.getFolders() self.boxList = folders.map{ BoxListSectionViewModel(folder: $0) } + case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) case let .folderTapped(section): boxList[section].isOpened.toggle() @@ -44,5 +50,10 @@ class BoxListViewModel { func viewModel(at indexPath: IndexPath) -> BoxListCellViewModel { return boxList[indexPath.section].boxListCellViewModels[indexPath.row] } + + func addFolder(_ folder: Folder) { + let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) + boxList.append(boxListSectionViewModel) + } } diff --git a/iBox/Sources/BoxList/Edit/EditView.swift b/iBox/Sources/BoxList/Edit/EditView.swift index 380aa6d..5141e4e 100644 --- a/iBox/Sources/BoxList/Edit/EditView.swift +++ b/iBox/Sources/BoxList/Edit/EditView.swift @@ -14,8 +14,8 @@ class EditView: UIView { var delegate: EditViewDelegate? private let editItems = [ - EditItem(type: .folder, imageString: "folder.fill", title: "폴더 편집"), - EditItem(type: .bookmark, imageString: "bookmark.fill", title: "북마크 편집") + EditItem(type: .folder, imageString: "folder.fill", title: "폴더 관리"), + EditItem(type: .bookmark, imageString: "bookmark.fill", title: "북마크 관리") ] // MARK: - UI Components diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift index f106b5a..1a1aee0 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift @@ -9,10 +9,31 @@ import UIKit class EditFolderView: UIView { + var viewModel: EditFolderViewModel? { + didSet { + tableView.reloadData() + } + } + + private let backgroundView = UIView().then { + $0.clipsToBounds = true + $0.layer.cornerRadius = 20 + $0.backgroundColor = .tableViewBackgroundColor + } + + private let tableView = UITableView().then { + $0.register(FolderCell.self, forCellReuseIdentifier: FolderCell.reuserIdentifier) + + $0.backgroundColor = .clear + $0.rowHeight = 50 + $0.separatorInset = .init(top: 0, left: 15, bottom: 0, right: 15) + } + // MARK: - Initializer override init(frame: CGRect) { super.init(frame: frame) + configureDataSource() setupProperty() setupHierarchy() setupLayout() @@ -24,16 +45,44 @@ class EditFolderView: UIView { // MARK: - Setup Methods + private func configureDataSource() { + tableView.dataSource = self + } + private func setupProperty() { backgroundColor = .backgroundColor } private func setupHierarchy() { - + addSubview(backgroundView) + backgroundView.addSubview(tableView) } private func setupLayout() { + backgroundView.snp.makeConstraints { make in + make.top.equalTo(safeAreaLayoutGuide).inset(10) + make.leading.trailing.bottom.equalTo(safeAreaLayoutGuide).inset(20) + } + tableView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview().offset(10) + make.leading.trailing.equalToSuperview() + } + } + +} + +extension EditFolderView: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + viewModel?.folderCount ?? 0 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let viewModel else { fatalError() } + guard let cell = tableView.dequeueReusableCell(withIdentifier: FolderCell.reuserIdentifier, for: indexPath) as? FolderCell else { fatalError() } + cell.configure(viewModel.folderName(at: indexPath)) + return cell } + } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index 545e390..3f60e3e 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -7,21 +7,67 @@ import UIKit +protocol EditFolderViewControllerDelegate: AnyObject { + func addFolder(_ folder: Folder) +} + class EditFolderViewController: BaseViewController, BaseViewControllerProtocol { + weak var delegate: EditFolderViewControllerDelegate? + private var folders: [Folder] { + didSet { + setupEditFolderView() + } + } + + init(folders: [Folder]) { + self.folders = folders + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() + setupEditFolderView() setupNavigationBar() } // MARK: - BaseNavigationBarViewControllerProtocol + func setupEditFolderView() { + guard let contentView = contentView as? EditFolderView else { return } + let viewModel = EditFolderViewModel(folderList: folders) + contentView.viewModel = viewModel + } + func setupNavigationBar() { - setNavigationBarTitleLabelText("폴더 편집") + setNavigationBarTitleLabelText("폴더 관리") setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarAddButtonHidden(false) setNavigationBarBackButtonHidden(false) + setNavigationBarAddButtonAction(#selector(addButtonTapped)) } + @objc private func addButtonTapped() { + let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) + controller.addTextField() + controller.textFields?.first?.text = "새로운 폴더" + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } + let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in + guard let name = controller.textFields?.first?.text else { return } + let folder = Folder(id: UUID(), name: name, bookmarks: []) + self?.folders.append(folder) + CoreDataManager.shared.addFolder(folder) + self?.delegate?.addFolder(folder) + } + controller.addAction(cancelAction) + controller.addAction(okAction) + self.present(controller, animated: true) + } } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift new file mode 100644 index 0000000..e89e21a --- /dev/null +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift @@ -0,0 +1,25 @@ +// +// EditFolderViewModel.swift +// iBox +// +// Created by 이지현 on 3/11/24. +// + +import Combine +import Foundation + +class EditFolderViewModel { + var folderList: [Folder] + + init(folderList: [Folder]) { + self.folderList = folderList + } + + var folderCount: Int { + folderList.count + } + + func folderName(at indexPath: IndexPath) -> String { + return folderList[indexPath.row].name + } +} diff --git a/iBox/Sources/BoxList/EditFolder/FolderCell.swift b/iBox/Sources/BoxList/EditFolder/FolderCell.swift new file mode 100644 index 0000000..48834b9 --- /dev/null +++ b/iBox/Sources/BoxList/EditFolder/FolderCell.swift @@ -0,0 +1,45 @@ +// +// FolderCell.swift +// iBox +// +// Created by 이지현 on 3/11/24. +// + +import UIKit + +class FolderCell: UITableViewCell { + static let reuserIdentifier = "folderCell" + + private let folderView = FolderView() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupProperty() { + backgroundColor = .tableViewBackgroundColor + selectionStyle = .none + } + + private func setupHierarchy() { + contentView.addSubview(folderView) + } + + private func setupLayout() { + folderView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + func configure(_ name: String) { + folderView.setFolderName(name) + } + +} diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index c20639c..19a0869 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -15,15 +15,8 @@ class FolderButton: UIButton { // MARK: - UI Components - private let folderImageView = UIImageView().then { - $0.image = UIImage(systemName: "folder.fill") - $0.contentMode = .scaleAspectFit - $0.tintColor = .gray - } - - private let folderNameLabel = UILabel().then { - $0.textColor = .label - $0.font = .systemFont(ofSize: 18, weight: .semibold) + private let folderView = FolderView().then { + $0.isUserInteractionEnabled = false } private let openCloseImageView = UIImageView().then { @@ -52,21 +45,13 @@ class FolderButton: UIButton { } private func setupHierarchy() { - addSubview(folderImageView) - addSubview(folderNameLabel) + addSubview(folderView) addSubview(openCloseImageView) } private func setupLayout() { - folderImageView.snp.makeConstraints { make in - make.centerY.equalToSuperview() - make.width.height.equalTo(30) - make.leading.equalToSuperview().offset(20) - } - - folderNameLabel.snp.makeConstraints { make in - make.centerY.equalToSuperview() - make.leading.equalTo(folderImageView.snp.trailing).offset(10) + folderView.snp.makeConstraints { make in + make.edges.equalToSuperview() } openCloseImageView.snp.makeConstraints { make in @@ -76,7 +61,7 @@ class FolderButton: UIButton { } func setFolderName(_ name: String) { - folderNameLabel.text = name + folderView.setFolderName(name) } func toggleStatus() { diff --git a/iBox/Sources/BoxList/FolderView.swift b/iBox/Sources/BoxList/FolderView.swift new file mode 100644 index 0000000..51cfb7d --- /dev/null +++ b/iBox/Sources/BoxList/FolderView.swift @@ -0,0 +1,62 @@ +// +// FolderView.swift +// iBox +// +// Created by 이지현 on 3/11/24. +// + +import UIKit + +class FolderView: UIView { + private let folderImageView = UIImageView().then { + $0.image = UIImage(systemName: "folder.fill") + $0.contentMode = .scaleAspectFit + $0.tintColor = .gray + } + + private let folderNameLabel = UILabel().then { + $0.textColor = .label + $0.font = .systemFont(ofSize: 18, weight: .semibold) + } + + init() { + super.init(frame: .zero) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + backgroundColor = .tableViewBackgroundColor + } + + private func setupHierarchy() { + addSubview(folderImageView) + addSubview(folderNameLabel) + } + + private func setupLayout() { + folderImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.width.height.equalTo(30) + make.leading.equalToSuperview().offset(20) + } + + folderNameLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.leading.equalTo(folderImageView.snp.trailing).offset(10) + } + } + + func setFolderName(_ name: String) { + folderNameLabel.text = name + } +} + + diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index e7dce41..c0a3e69 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -33,7 +33,7 @@ extension UIColor { static let box2 = UIColor(hex: 0xFF9548) static let box3 = UIColor(hex: 0xFFDC6E) static let tableViewBackgroundColor = color(light: .systemGroupedBackground, dark: .systemGray5) - static let floderGray = color(light: .systemGray3, dark: .systemGray2) + static let folderGray = color(light: .systemGray3, dark: .systemGray2) static let webIconColor = color(light: .black, dark: .systemGray) static let dimmedViewColor = UIColor.black.withAlphaComponent(0.75) static let backgroundColor = color(light: .white, dark: UIColor(hex: 0x242424)) From 9bfbd6d36eed04b6bc4aff4f4b2b7a6693e5cf97 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 12 Mar 2024 15:36:35 +0900 Subject: [PATCH 110/370] feat: folder delete, rename --- .../BoxList/BoxListSectionViewModel.swift | 8 +-- iBox/Sources/BoxList/BoxListView.swift | 18 +++-- .../BoxList/BoxListViewController.swift | 10 +++ iBox/Sources/BoxList/BoxListViewModel.swift | 14 +++- .../BoxList/EditFolder/EditFolderCell.swift | 72 +++++++++++++++++++ .../BoxList/EditFolder/EditFolderView.swift | 55 ++++++++++++-- .../EditFolder/EditFolderViewController.swift | 56 ++++++++++++--- .../EditFolder/EditFolderViewModel.swift | 25 +++++++ .../BoxList/EditFolder/FolderCell.swift | 45 ------------ iBox/Sources/Model/Folder.swift | 6 +- 10 files changed, 236 insertions(+), 73 deletions(-) create mode 100644 iBox/Sources/BoxList/EditFolder/EditFolderCell.swift delete mode 100644 iBox/Sources/BoxList/EditFolder/FolderCell.swift diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index 3c85773..c6c84a8 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -9,15 +9,15 @@ import Foundation class BoxListSectionViewModel: Identifiable { var folder: Folder - private var originalBoxListCellViewModels: [BoxListCellViewModel]! + private var boxListCellViewModels: [BoxListCellViewModel]! init(folder: Folder) { self.folder = folder - originalBoxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } } - var boxListCellViewModels: [BoxListCellViewModel] { - return isOpened ? originalBoxListCellViewModels : [] + var boxListCellViewModelsWithStatus: [BoxListCellViewModel] { + return isOpened ? boxListCellViewModels : [] } var id: UUID { diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 79f13b0..8bd02b9 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -94,9 +94,14 @@ class BoxListView: UIView { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections(with.map{ $0.id }) for folder in with { - snapshot.appendItems(folder.boxListCellViewModels.map { $0.id }, toSection: folder.id) + snapshot.appendItems(folder.boxListCellViewModelsWithStatus.map { $0.id }, toSection: folder.id) + } + if viewModel?.haveReloadData ?? false { + boxListDataSource.applySnapshotUsingReloadData(snapshot) + viewModel?.haveReloadData = false + } else { + boxListDataSource.apply(snapshot, animatingDifferences: true) } - boxListDataSource.apply(snapshot, animatingDifferences: true) } private func bindViewModel() { @@ -108,6 +113,7 @@ class BoxListView: UIView { switch event { case .sendBoxList(boxList: let boxList): self?.applySnapshot(with: boxList) + } }.store(in: &cancellables) } @@ -124,12 +130,12 @@ extension BoxListView: UITableViewDelegate { make.leading.trailing.equalToSuperview().inset(15) } view.backgroundColor = .clear - line.backgroundColor = .tertiaryLabel + line.backgroundColor = .quaternaryLabel return view } public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return 0.3 + return 0.7 } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { @@ -155,8 +161,8 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel else { return } - let webUrl = viewModel.boxList[indexPath.section].boxListCellViewModels[indexPath.row].url - let webName = viewModel.boxList[indexPath.section].boxListCellViewModels[indexPath.row].name + let webUrl = viewModel.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].url + let webName = viewModel.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].name delegate?.didSelectWeb(at: webUrl, withName: webName) } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index c03e837..65e5ae8 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -73,6 +73,16 @@ extension BoxListViewController: BoxListViewDelegate { } extension BoxListViewController: EditFolderViewControllerDelegate { + func editFolderName(at row: Int, name: String) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.editFolderName(at: row, name: name) + } + + func deleteFolder(at row: Int) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.deleteFolder(at: row) + } + func addFolder(_ folder: Folder) { guard let contentView = contentView as? BoxListView else { return } contentView.viewModel?.addFolder(folder) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 3b0ad4f..0849b4a 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -15,6 +15,7 @@ class BoxListViewModel { var folders: [Folder] { boxList.map{ $0.folder } } + var haveReloadData = false enum Input { case viewDidLoad @@ -48,12 +49,23 @@ class BoxListViewModel { } func viewModel(at indexPath: IndexPath) -> BoxListCellViewModel { - return boxList[indexPath.section].boxListCellViewModels[indexPath.row] + return boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] } func addFolder(_ folder: Folder) { let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) boxList.append(boxListSectionViewModel) + haveReloadData = true + } + + func deleteFolder(at row: Int) { + boxList.remove(at: row) + haveReloadData = true + } + + func editFolderName(at row: Int, name: String) { + boxList[row].folder.name = name + haveReloadData = true } } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift new file mode 100644 index 0000000..4757e3c --- /dev/null +++ b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift @@ -0,0 +1,72 @@ +// +// FolderCell.swift +// iBox +// +// Created by 이지현 on 3/11/24. +// + +import UIKit + +class EditFolderCell: UITableViewCell { + static let reuserIdentifier = "folderCell" + + var onDelete: (() -> Void)? + var onEdit: (() -> Void)? + + private let folderView = FolderView() + + private let editButton = UIButton().then{ + $0.configuration = .plain() + $0.configuration?.image = UIImage(systemName: "ellipsis.circle")?.withTintColor(.box, renderingMode: .alwaysOriginal) + + $0.showsMenuAsPrimaryAction = true + } + + private lazy var nameEditAction = UIAction(title: "이름 변경", image: UIImage(systemName: "pencil")) {[weak self] _ in + self?.onEdit?() + } + + private lazy var deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in + self?.onDelete?() + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupProperty() + setupHierarchy() + setupLayout() + configureEditMenu() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupProperty() { + backgroundColor = .tableViewBackgroundColor + selectionStyle = .none + } + + private func setupHierarchy() { + contentView.addSubview(folderView) + folderView.addSubview(editButton) + } + + private func setupLayout() { + folderView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + editButton.snp.makeConstraints { make in + make.top.bottom.trailing.equalToSuperview() + } + } + + private func configureEditMenu() { + editButton.menu = UIMenu(options: .displayInline, children: [nameEditAction, deleteAction]) + } + + func configure(_ name: String) { + folderView.setFolderName(name) + } + +} diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift index 1a1aee0..bbd98cc 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift @@ -7,10 +7,17 @@ import UIKit +protocol EditFolderViewDelegate: AnyObject { + func deleteFolder(at: IndexPath) + func editFolderName(at: IndexPath, name: String) +} + class EditFolderView: UIView { + weak var delegate: EditFolderViewDelegate? var viewModel: EditFolderViewModel? { didSet { + viewModel?.delegate = self tableView.reloadData() } } @@ -22,8 +29,9 @@ class EditFolderView: UIView { } private let tableView = UITableView().then { - $0.register(FolderCell.self, forCellReuseIdentifier: FolderCell.reuserIdentifier) + $0.register(EditFolderCell.self, forCellReuseIdentifier: EditFolderCell.reuserIdentifier) + $0.setEditing(true, animated: true) $0.backgroundColor = .clear $0.rowHeight = 50 $0.separatorInset = .init(top: 0, left: 15, bottom: 0, right: 15) @@ -33,7 +41,7 @@ class EditFolderView: UIView { override init(frame: CGRect) { super.init(frame: frame) - configureDataSource() + configureTableView() setupProperty() setupHierarchy() setupLayout() @@ -45,8 +53,9 @@ class EditFolderView: UIView { // MARK: - Setup Methods - private func configureDataSource() { + private func configureTableView() { tableView.dataSource = self + tableView.delegate = self } private func setupProperty() { @@ -79,10 +88,48 @@ extension EditFolderView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel else { fatalError() } - guard let cell = tableView.dequeueReusableCell(withIdentifier: FolderCell.reuserIdentifier, for: indexPath) as? FolderCell else { fatalError() } + guard let cell = tableView.dequeueReusableCell(withIdentifier: EditFolderCell.reuserIdentifier, for: indexPath) as? EditFolderCell else { fatalError() } + cell.onDelete = { [weak self] in + self?.delegate?.deleteFolder(at: indexPath) + } + cell.onEdit = { [weak self] in + self?.editFolderName(at: indexPath) + } cell.configure(viewModel.folderName(at: indexPath)) return cell } + private func editFolderName(at indexPath: IndexPath) { + guard let viewModel else { return } + delegate?.editFolderName(at: indexPath, name: viewModel.folderName(at: indexPath)) + } } + +extension EditFolderView: UITableViewDelegate { + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + print("delete") + } + } + + func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { + return .none + } + + func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false + } + + func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { + + } +} + +extension EditFolderView: EditFolderViewModelDelegate { + func reloadTableView() { + tableView.reloadData() + } + +} + diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index 3f60e3e..34aade7 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -9,19 +9,16 @@ import UIKit protocol EditFolderViewControllerDelegate: AnyObject { func addFolder(_ folder: Folder) + func deleteFolder(at row: Int) + func editFolderName(at row: Int, name: String) } class EditFolderViewController: BaseViewController, BaseViewControllerProtocol { weak var delegate: EditFolderViewControllerDelegate? - private var folders: [Folder] { - didSet { - setupEditFolderView() - } - } init(folders: [Folder]) { - self.folders = folders super.init(nibName: nil, bundle: nil) + setupEditFolderView(folders) } required init?(coder: NSCoder) { @@ -32,16 +29,16 @@ class EditFolderViewController: BaseViewController, BaseViewCont override func viewDidLoad() { super.viewDidLoad() - setupEditFolderView() setupNavigationBar() } // MARK: - BaseNavigationBarViewControllerProtocol - func setupEditFolderView() { + func setupEditFolderView(_ folders: [Folder]) { guard let contentView = contentView as? EditFolderView else { return } let viewModel = EditFolderViewModel(folderList: folders) contentView.viewModel = viewModel + contentView.delegate = self } func setupNavigationBar() { @@ -62,12 +59,51 @@ class EditFolderViewController: BaseViewController, BaseViewCont let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in guard let name = controller.textFields?.first?.text else { return } let folder = Folder(id: UUID(), name: name, bookmarks: []) - self?.folders.append(folder) - CoreDataManager.shared.addFolder(folder) + guard let contentView = self?.contentView as? EditFolderView else { return } + contentView.viewModel?.addFolder(folder) self?.delegate?.addFolder(folder) } controller.addAction(cancelAction) controller.addAction(okAction) self.present(controller, animated: true) } + +} + +extension EditFolderViewController: EditFolderViewDelegate { + func deleteFolder(at indexPath: IndexPath) { + recheckDeleteFolder(at: indexPath) + } + + private func recheckDeleteFolder(at indexPath: IndexPath) { + let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .actionSheet) + let firstAction = UIAlertAction(title: "폴더 삭제", style: .destructive) {[weak self] _ in + guard let contentView = self?.contentView as? EditFolderView else { return } + contentView.viewModel?.deleteFolder(at: indexPath) + self?.delegate?.deleteFolder(at: indexPath.row) + } + let cancelAction = UIAlertAction(title: "취소", style: .cancel) + actionSheetController.addAction(firstAction) + actionSheetController.addAction(cancelAction) + present(actionSheetController, animated: true) + } + + func editFolderName(at indexPath: IndexPath, name: String) { + let controller = UIAlertController(title: "폴더 이름 변경", message: nil, preferredStyle: .alert) + controller.addTextField() + controller.textFields?.first?.text = name + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } + let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in + guard let newName = controller.textFields?.first?.text else { return } + guard let contentView = self?.contentView as? EditFolderView else { return } + contentView.viewModel?.editFolderName(at: indexPath, name: newName) + self?.delegate?.editFolderName(at: indexPath.row, name: newName) + } + controller.addAction(cancelAction) + controller.addAction(okAction) + self.present(controller, animated: true) + } + } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift index e89e21a..ccb4bea 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift @@ -8,9 +8,16 @@ import Combine import Foundation +protocol EditFolderViewModelDelegate: AnyObject { + func reloadTableView() +} + class EditFolderViewModel { + weak var delegate: EditFolderViewModelDelegate? var folderList: [Folder] + private let output = PassthroughSubject() + init(folderList: [Folder]) { self.folderList = folderList } @@ -19,6 +26,24 @@ class EditFolderViewModel { folderList.count } + func addFolder(_ folder: Folder) { + CoreDataManager.shared.addFolder(folder) + folderList.append(folder) + delegate?.reloadTableView() + } + + func deleteFolder(at indexPath: IndexPath) { + CoreDataManager.shared.deleteFolder(id: folderList[indexPath.row].id) + folderList.remove(at: indexPath.row) + delegate?.reloadTableView() + } + + func editFolderName(at indexPath: IndexPath, name: String) { + CoreDataManager.shared.updateFolder(id: folderList[indexPath.row].id, name: name) + folderList[indexPath.row].name = name + delegate?.reloadTableView() + } + func folderName(at indexPath: IndexPath) -> String { return folderList[indexPath.row].name } diff --git a/iBox/Sources/BoxList/EditFolder/FolderCell.swift b/iBox/Sources/BoxList/EditFolder/FolderCell.swift deleted file mode 100644 index 48834b9..0000000 --- a/iBox/Sources/BoxList/EditFolder/FolderCell.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// FolderCell.swift -// iBox -// -// Created by 이지현 on 3/11/24. -// - -import UIKit - -class FolderCell: UITableViewCell { - static let reuserIdentifier = "folderCell" - - private let folderView = FolderView() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - setupProperty() - setupHierarchy() - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setupProperty() { - backgroundColor = .tableViewBackgroundColor - selectionStyle = .none - } - - private func setupHierarchy() { - contentView.addSubview(folderView) - } - - private func setupLayout() { - folderView.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - } - - func configure(_ name: String) { - folderView.setFolderName(name) - } - -} diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 398a028..394ff9d 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -8,9 +8,9 @@ import Foundation struct Folder { - var id: UUID - let name: String - let bookmarks: [Bookmark] + let id: UUID + var name: String + var bookmarks: [Bookmark] var isOpened: Bool = false } From 9e51d5daa147a589205893f79a91444db21e852e Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 12 Mar 2024 16:41:12 +0900 Subject: [PATCH 111/370] feat: reorder folders --- .../BoxList/BoxListViewController.swift | 5 ++ iBox/Sources/BoxList/BoxListViewModel.swift | 6 +++ .../BoxList/EditFolder/EditFolderView.swift | 35 ++++++++++---- .../EditFolder/EditFolderViewController.swift | 46 +++++++++++++++---- .../EditFolder/EditFolderViewModel.swift | 17 +++++-- 5 files changed, 89 insertions(+), 20 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 65e5ae8..9c128d0 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -73,6 +73,11 @@ extension BoxListViewController: BoxListViewDelegate { } extension BoxListViewController: EditFolderViewControllerDelegate { + func moveFolder(from: Int, to: Int) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.moveFolder(from: from, to: to) + } + func editFolderName(at row: Int, name: String) { guard let contentView = contentView as? BoxListView else { return } contentView.viewModel?.editFolderName(at: row, name: name) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 0849b4a..73a9a0b 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -67,5 +67,11 @@ class BoxListViewModel { boxList[row].folder.name = name haveReloadData = true } + + func moveFolder(from: Int, to: Int) { + let mover = boxList.remove(at: from) + boxList.insert(mover, at: to) + haveReloadData = true + } } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift index bbd98cc..409f585 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift @@ -10,6 +10,7 @@ import UIKit protocol EditFolderViewDelegate: AnyObject { func deleteFolder(at: IndexPath) func editFolderName(at: IndexPath, name: String) + func moveFolder(from: Int, to: Int) } class EditFolderView: UIView { @@ -90,10 +91,16 @@ extension EditFolderView: UITableViewDataSource { guard let viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: EditFolderCell.reuserIdentifier, for: indexPath) as? EditFolderCell else { fatalError() } cell.onDelete = { [weak self] in - self?.delegate?.deleteFolder(at: indexPath) + guard let self else { return } + if let currentIndexPath = self.tableView.indexPath(for: cell) { + self.delegate?.deleteFolder(at: currentIndexPath) + } } cell.onEdit = { [weak self] in - self?.editFolderName(at: indexPath) + guard let self else { return } + if let currentIndexPath = self.tableView.indexPath(for: cell) { + self.editFolderName(at: currentIndexPath) + } } cell.configure(viewModel.folderName(at: indexPath)) return cell @@ -107,11 +114,6 @@ extension EditFolderView: UITableViewDataSource { } extension EditFolderView: UITableViewDelegate { - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { - if editingStyle == .delete { - print("delete") - } - } func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { return .none @@ -122,14 +124,29 @@ extension EditFolderView: UITableViewDelegate { } func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { - + guard let viewModel else { return } + viewModel.reorderFolder(srcIndexPath: sourceIndexPath, destIndexPath: destinationIndexPath) + delegate?.moveFolder(from: sourceIndexPath.row, to: destinationIndexPath.row) } } extension EditFolderView: EditFolderViewModelDelegate { + func reloadRow(_ indexPath: IndexPath) { + tableView.reloadRows(at: [indexPath], with: .automatic) + } + + func deleteRow(_ indexPath: IndexPath) { + tableView.deleteRows(at: [indexPath], with: .automatic) + } + + func addRow() { + guard let viewModel else { return } + let indexPath = IndexPath(row: viewModel.folderCount - 1, section: 0) + tableView.insertRows(at: [indexPath], with: .automatic) + } + func reloadTableView() { tableView.reloadData() } - } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index 34aade7..ced97c4 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -11,6 +11,7 @@ protocol EditFolderViewControllerDelegate: AnyObject { func addFolder(_ folder: Folder) func deleteFolder(at row: Int) func editFolderName(at row: Int, name: String) + func moveFolder(from: Int, to: Int) } class EditFolderViewController: BaseViewController, BaseViewControllerProtocol { @@ -51,10 +52,7 @@ class EditFolderViewController: BaseViewController, BaseViewCont @objc private func addButtonTapped() { let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) - controller.addTextField() - controller.textFields?.first?.text = "새로운 폴더" - controller.textFields?.first?.autocorrectionType = .no - controller.textFields?.first?.spellCheckingType = .no + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in guard let name = controller.textFields?.first?.text else { return } @@ -65,12 +63,31 @@ class EditFolderViewController: BaseViewController, BaseViewCont } controller.addAction(cancelAction) controller.addAction(okAction) + okAction.isEnabled = false + + controller.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 + let textIsNotEmpty = textCount > 0 + + okAction.isEnabled = textIsNotEmpty + + }) + } + controller.textFields?.first?.placeholder = "이름" + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no self.present(controller, animated: true) } } extension EditFolderViewController: EditFolderViewDelegate { + func moveFolder(from: Int, to: Int) { + delegate?.moveFolder(from: from, to: to) + } + func deleteFolder(at indexPath: IndexPath) { recheckDeleteFolder(at: indexPath) } @@ -90,10 +107,7 @@ extension EditFolderViewController: EditFolderViewDelegate { func editFolderName(at indexPath: IndexPath, name: String) { let controller = UIAlertController(title: "폴더 이름 변경", message: nil, preferredStyle: .alert) - controller.addTextField() - controller.textFields?.first?.text = name - controller.textFields?.first?.autocorrectionType = .no - controller.textFields?.first?.spellCheckingType = .no + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in guard let newName = controller.textFields?.first?.text else { return } @@ -103,6 +117,22 @@ extension EditFolderViewController: EditFolderViewDelegate { } controller.addAction(cancelAction) controller.addAction(okAction) + okAction.isEnabled = true + + controller.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 + let textIsNotEmpty = textCount > 0 + + okAction.isEnabled = textIsNotEmpty + + }) + } + controller.textFields?.first?.text = name + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no + self.present(controller, animated: true) } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift index ccb4bea..bbf10ad 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift @@ -9,7 +9,10 @@ import Combine import Foundation protocol EditFolderViewModelDelegate: AnyObject { + func reloadRow(_ indexPath: IndexPath) + func deleteRow(_ indexPath: IndexPath) func reloadTableView() + func addRow() } class EditFolderViewModel { @@ -29,22 +32,30 @@ class EditFolderViewModel { func addFolder(_ folder: Folder) { CoreDataManager.shared.addFolder(folder) folderList.append(folder) - delegate?.reloadTableView() + delegate?.addRow() } func deleteFolder(at indexPath: IndexPath) { CoreDataManager.shared.deleteFolder(id: folderList[indexPath.row].id) folderList.remove(at: indexPath.row) - delegate?.reloadTableView() + delegate?.deleteRow(indexPath) } func editFolderName(at indexPath: IndexPath, name: String) { CoreDataManager.shared.updateFolder(id: folderList[indexPath.row].id, name: name) folderList[indexPath.row].name = name - delegate?.reloadTableView() + delegate?.reloadRow(indexPath) } func folderName(at indexPath: IndexPath) -> String { return folderList[indexPath.row].name } + + func reorderFolder(srcIndexPath: IndexPath, destIndexPath: IndexPath) { + let mover = folderList.remove(at: srcIndexPath.row) + folderList.insert(mover, at: destIndexPath.row) + CoreDataManager.shared.moveFolder(from: srcIndexPath.row, to: destIndexPath.row) + print(folderList.map{ $0.name }) +// delegate?.reloadTableView() + } } From 7be0f317b677c690d0ed75b767f18e9f2ce024a6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 01:01:32 +0900 Subject: [PATCH 112/370] feat: delete bookmaek --- .../ShareViewController.swift | 0 .../View/ShareExtensionBackGroundView.swift | 0 iBox/Sources/Base/BaseViewController.swift | 19 +++++++++ iBox/Sources/BoxList/BoxListCell.swift | 33 +++++++++++++++- .../BoxList/BoxListSectionViewModel.swift | 35 +++++++++++------ iBox/Sources/BoxList/BoxListView.swift | 38 ++++++++++++++++-- .../BoxList/BoxListViewController.swift | 15 ++++++- iBox/Sources/BoxList/BoxListViewModel.swift | 19 +++++++-- .../EditBookmark/EditBookmarkView.swift | 39 ------------------- .../EditBookmarkViewController.swift | 27 ------------- iBox/Sources/Model/Bookmark.swift | 4 +- iBox/Sources/Model/Folder.swift | 1 - iBox/Sources/Web/WebViewController.swift | 3 +- 13 files changed, 142 insertions(+), 91 deletions(-) rename {iBox/ShareExtension => ShareExtension}/ShareViewController.swift (100%) rename {iBox/ShareExtension => ShareExtension}/View/ShareExtensionBackGroundView.swift (100%) delete mode 100644 iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift delete mode 100644 iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift diff --git a/iBox/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift similarity index 100% rename from iBox/ShareExtension/ShareViewController.swift rename to ShareExtension/ShareViewController.swift diff --git a/iBox/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift similarity index 100% rename from iBox/ShareExtension/View/ShareExtensionBackGroundView.swift rename to ShareExtension/View/ShareExtensionBackGroundView.swift diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index daa5e4f..48ab64b 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -14,6 +14,7 @@ class NavigationBar: UIView { var titleLabel = UILabel() var addButton = UIButton() var moreButton = UIButton() + var doneButton = UIButton() } protocol BaseViewControllerProtocol { @@ -40,6 +41,9 @@ class BaseViewController: UIViewController { $0.moreButton.configuration = .plain() $0.moreButton.configuration?.image = UIImage(systemName: "ellipsis.circle") $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.doneButton.configuration = .plain() + $0.doneButton.configuration?.baseForegroundColor = .label + $0.doneButton.configuration?.attributedTitle = AttributedString("완료", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18, weight: .semibold)])) } let contentView: UIView = View() @@ -63,6 +67,7 @@ class BaseViewController: UIViewController { setNavigationBarTitleLabelFont(titleFont) setNavigationBarBackButtonHidden(true) setNavigationBarMenuButtonHidden(true) + setNavigationBarDoneButtonHidden(true) navigationBar.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) } @@ -74,6 +79,7 @@ class BaseViewController: UIViewController { navigationBar.addSubview(navigationBar.titleLabel) navigationBar.addSubview(navigationBar.addButton) navigationBar.addSubview(navigationBar.moreButton) + navigationBar.addSubview(navigationBar.doneButton) view.addSubview(contentView) } @@ -111,6 +117,11 @@ class BaseViewController: UIViewController { make.width.height.equalTo(24) } + navigationBar.doneButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(20) + make.centerY.equalToSuperview() + } + contentView.snp.makeConstraints { make in make.top.equalTo(statusBar.snp.bottom).offset(60) make.leading.trailing.equalToSuperview() @@ -181,6 +192,10 @@ class BaseViewController: UIViewController { } } + func setNavigationBarDoneButtonHidden(_ hidden: Bool) { + navigationBar.doneButton.isHidden = hidden + } + func setNavigationBarAddButtonAction(_ selector: Selector) { navigationBar.addButton.addTarget(self, action: selector, for: .touchUpInside) } @@ -189,6 +204,10 @@ class BaseViewController: UIViewController { navigationBar.moreButton.addTarget(self, action: selector, for: .touchUpInside) } + func setNavigationBarDoneButtonAction(_ selector: Selector) { + navigationBar.doneButton.addTarget(self, action: selector, for: .touchUpInside) + } + func setNavigationBarTitleLabelText(_ text: String?) { navigationBar.titleLabel.text = text } diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index 5be0a7f..2b2e3c1 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -10,10 +10,12 @@ import UIKit import SnapKit class BoxListCell: UITableViewCell { - var viewModel: BoxListCellViewModel? static let reuseIdentifier = "boxListCell" + var onDelete: (() -> Void)? + var onEdit: (() -> Void)? + // MARK: - UI Components private let cellImageView = UIImageView().then { @@ -24,6 +26,22 @@ class BoxListCell: UITableViewCell { private let label = UILabel() + private let editButton = UIButton().then{ + $0.configuration = .plain() + $0.configuration?.image = UIImage(systemName: "ellipsis.circle")?.withTintColor(.box, renderingMode: .alwaysOriginal) + + $0.showsMenuAsPrimaryAction = true + $0.isHidden = true + } + + private lazy var editAction = UIAction(title: "북마크 편집", image: UIImage(systemName: "pencil")) {[weak self] _ in + self?.onEdit?() + } + + private lazy var deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in + self?.onDelete?() + } + // MARK: - Initializer override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -31,6 +49,7 @@ class BoxListCell: UITableViewCell { setupProperty() setupHierarchy() setupLayout() + configureEditMenu() } required init?(coder: NSCoder) { @@ -47,6 +66,7 @@ class BoxListCell: UITableViewCell { private func setupHierarchy() { contentView.addSubview(cellImageView) contentView.addSubview(label) + contentView.addSubview(editButton) } private func setupLayout() { @@ -60,6 +80,13 @@ class BoxListCell: UITableViewCell { make.top.trailing.bottom.equalToSuperview() make.leading.equalTo(cellImageView.snp.trailing).offset(10) } + editButton.snp.makeConstraints { make in + make.top.bottom.trailing.equalToSuperview() + } + } + + private func configureEditMenu() { + editButton.menu = UIMenu(options: .displayInline, children: [editAction, deleteAction]) } // MARK: - Bind ViewModel @@ -68,5 +95,9 @@ class BoxListCell: UITableViewCell { self.viewModel = viewModel label.text = viewModel.name } + + func setEditButtonHidden(_ isHidden: Bool) { + editButton.isHidden = isHidden + } } diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index c6c84a8..a99e5e7 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -8,7 +8,11 @@ import Foundation class BoxListSectionViewModel: Identifiable { - var folder: Folder + var folder: Folder { + didSet { + boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + } + } private var boxListCellViewModels: [BoxListCellViewModel]! init(folder: Folder) { @@ -16,25 +20,32 @@ class BoxListSectionViewModel: Identifiable { boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } } - var boxListCellViewModelsWithStatus: [BoxListCellViewModel] { - return isOpened ? boxListCellViewModels : [] - } - var id: UUID { folder.id } var name: String { - folder.name - } - - var isOpened: Bool { get { - folder.isOpened + folder.name } - set { - folder.isOpened = newValue + folder.name = newValue } } + + var isOpened: Bool = false + + + var boxListCellViewModelsWithStatus: [BoxListCellViewModel] { + return isOpened ? boxListCellViewModels : [] + } + + func viewModel(at index: Int) -> BoxListCellViewModel { + return boxListCellViewModels[index] + } + + func deleteCell(at index: Int) { + boxListCellViewModels.remove(at: index) + } } + diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 3589698..7a83bc7 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -19,7 +19,7 @@ protocol BoxListViewDelegate: AnyObject { class BoxListView: UIView { var viewModel: BoxListViewModel? - private var boxListDataSource: UITableViewDiffableDataSource! + private var boxListDataSource: BoxListDataSource! weak var delegate: BoxListViewDelegate? private var cancellables = Set() @@ -83,10 +83,24 @@ class BoxListView: UIView { } private func configureDataSource() { - boxListDataSource = UITableViewDiffableDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in + boxListDataSource = BoxListDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in guard let self, let viewModel = self.viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } + cell.setEditButtonHidden(!viewModel.isEditing) cell.bindViewModel(viewModel.viewModel(at: indexPath)) + cell.onDelete = { [weak self] in + guard let self else { return } + if let currentIndexPath = tableView.indexPath(for: cell) { + viewModel.deleteBookmark(at: currentIndexPath) + } + } + cell.onEdit = { [weak self] in + guard let self else { return } + if let currentIndexPath = self.tableView.indexPath(for: cell) { + print("edit \(currentIndexPath)") + } + } + return cell } } @@ -114,7 +128,9 @@ class BoxListView: UIView { switch event { case .sendBoxList(boxList: let boxList): self?.applySnapshot(with: boxList) - + case .editStatus(isEditing: let isEditing): + self?.tableView.setEditing(isEditing, animated: true) + self?.tableView.reloadData() } }.store(in: &cancellables) } @@ -197,4 +213,20 @@ extension BoxListView: UITableViewDelegate { return configuration } + + func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { + return .none + } + + func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false + } + +} + +class BoxListDataSource: UITableViewDiffableDataSource { + + override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { + print("move") + } } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 83cdbec..21b9891 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -32,6 +32,7 @@ class BoxListViewController: BaseViewController, BaseViewController setNavigationBarMenuButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) setNavigationBarMoreButtonAction(#selector(moreButtonTapped)) + setNavigationBarDoneButtonAction(#selector(doneButtonTapped)) } // MARK: - Action Functions @@ -46,6 +47,13 @@ class BoxListViewController: BaseViewController, BaseViewController editViewController.delegate = self present(editViewController, animated: false) } + + @objc private func doneButtonTapped() { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.input.send(.toggleEditStatus) + setNavigationBarMenuButtonHidden(false) + setNavigationBarDoneButtonHidden(true) + } } @@ -59,14 +67,17 @@ extension BoxListViewController: BoxListViewDelegate { } func pushViewController(type: EditType) { + guard let contentView = contentView as? BoxListView else { return } switch type { case .folder: - guard let contentView = contentView as? BoxListView else { return } + let editFolderViewController = EditFolderViewController(folders: contentView.viewModel?.folders ?? []) editFolderViewController.delegate = self navigationController?.pushViewController(editFolderViewController, animated: true) case .bookmark: - navigationController?.pushViewController(EditBookmarkViewController(), animated: true) + contentView.viewModel?.input.send(.toggleEditStatus) + setNavigationBarMenuButtonHidden(true) + setNavigationBarDoneButtonHidden(false) } } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index c5cf534..5d7d628 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -16,8 +16,10 @@ class BoxListViewModel { boxList.map{ $0.folder } } var haveReloadData = false + var isEditing = false enum Input { + case toggleEditStatus case viewDidLoad case viewWillAppear case folderTapped(section: Int) @@ -27,6 +29,7 @@ class BoxListViewModel { enum Output { case sendBoxList(boxList: [BoxListSectionViewModel]) + case editStatus(isEditing: Bool) } let input = PassthroughSubject() @@ -37,16 +40,19 @@ class BoxListViewModel { input.sink { [weak self] event in guard let self else { return } switch event { + case .toggleEditStatus: + isEditing.toggle() + output.send(.editStatus(isEditing: isEditing)) case .viewDidLoad: let folders = CoreDataManager.shared.getFolders() - self.boxList = folders.map{ BoxListSectionViewModel(folder: $0) } + boxList = folders.map{ BoxListSectionViewModel(folder: $0) } case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) case let .folderTapped(section): boxList[section].isOpened.toggle() output.send(.sendBoxList(boxList: boxList)) case let .deleteBookmark(indexPath): - print("\(viewModel(at: indexPath).name) 지울게용") + deleteBookmark(at: indexPath) case let .setFavorite(indexPath): print("\(viewModel(at: indexPath).name) favorite 할게용") } @@ -58,6 +64,13 @@ class BoxListViewModel { return boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] } + func deleteBookmark(at indexPath: IndexPath) { + let bookmarkId = boxList[indexPath.section].viewModel(at: indexPath.row).id + CoreDataManager.shared.deleteBookmark(id: bookmarkId) + boxList[indexPath.section].deleteCell(at: indexPath.row) + output.send(.sendBoxList(boxList: boxList)) + } + func addFolder(_ folder: Folder) { let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) boxList.append(boxListSectionViewModel) @@ -70,7 +83,7 @@ class BoxListViewModel { } func editFolderName(at row: Int, name: String) { - boxList[row].folder.name = name + boxList[row].name = name haveReloadData = true } diff --git a/iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift b/iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift deleted file mode 100644 index d814b41..0000000 --- a/iBox/Sources/BoxList/EditBookmark/EditBookmarkView.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// EditBookmarkView.swift -// iBox -// -// Created by jiyeon on 2/29/24. -// - -import UIKit - -class EditBookmarkView: UIView { - - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - setupProperty() - setupHierarchy() - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setup Methods - - private func setupProperty() { - backgroundColor = .backgroundColor - } - - private func setupHierarchy() { - - } - - private func setupLayout() { - - } - -} diff --git a/iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift b/iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift deleted file mode 100644 index 0077005..0000000 --- a/iBox/Sources/BoxList/EditBookmark/EditBookmarkViewController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// EditBookmarkViewController.swift -// iBox -// -// Created by jiyeon on 2/29/24. -// - -import UIKit - -class EditBookmarkViewController: BaseViewController, BaseViewControllerProtocol { - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - setupNavigationBar() - } - - // MARK: - BaseViewControllerProtocol - - func setupNavigationBar() { - setNavigationBarTitleLabelText("북마크 편집") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) - setNavigationBarBackButtonHidden(false) - } - -} diff --git a/iBox/Sources/Model/Bookmark.swift b/iBox/Sources/Model/Bookmark.swift index ab1a85f..260beb0 100644 --- a/iBox/Sources/Model/Bookmark.swift +++ b/iBox/Sources/Model/Bookmark.swift @@ -9,6 +9,6 @@ import Foundation struct Bookmark: Codable { let id: UUID - let name: String - let url: URL + var name: String + var url: URL } diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 394ff9d..9be0ed9 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -11,6 +11,5 @@ struct Folder { let id: UUID var name: String var bookmarks: [Bookmark] - var isOpened: Bool = false } diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 9da3175..ac000fd 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -15,8 +15,9 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol override func viewDidLoad() { super.viewDidLoad() + + setupNavigationBar() view.backgroundColor = .backgroundColor - navigationItem.largeTitleDisplayMode = .never guard let contentView = contentView as? WebView else { return } contentView.selectedWebsite = selectedWebsite From c8decc95e4e012d61afe6bb74a349831e989b314 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 12:40:39 +0900 Subject: [PATCH 113/370] feat: edit bookmark --- .../BoxList/BoxListCellViewModel.swift | 12 +++-- .../BoxList/BoxListSectionViewModel.swift | 4 ++ iBox/Sources/BoxList/BoxListView.swift | 4 +- .../BoxList/BoxListViewController.swift | 51 +++++++++++++++++++ iBox/Sources/BoxList/BoxListViewModel.swift | 12 +++++ 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListCellViewModel.swift b/iBox/Sources/BoxList/BoxListCellViewModel.swift index b8a6cdd..2c6cefc 100644 --- a/iBox/Sources/BoxList/BoxListCellViewModel.swift +++ b/iBox/Sources/BoxList/BoxListCellViewModel.swift @@ -8,20 +8,22 @@ import Foundation class BoxListCellViewModel: Identifiable { - private let bookmark: Bookmark + var bookmark: Bookmark init(bookmark: Bookmark) { self.bookmark = bookmark - self.name = bookmark.name - self.url = bookmark.url } var id: UUID { bookmark.id } - var name: String + var name: String { + bookmark.name + } - var url: URL + var url: URL { + bookmark.url + } } diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index a99e5e7..2772dad 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -47,5 +47,9 @@ class BoxListSectionViewModel: Identifiable { func deleteCell(at index: Int) { boxListCellViewModels.remove(at: index) } + + func updateCell(at index: Int, bookmark: Bookmark) { + boxListCellViewModels[index].bookmark = bookmark + } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7a83bc7..81715fd 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -14,6 +14,7 @@ protocol BoxListViewDelegate: AnyObject { func didSelectWeb(at url: URL, withName name: String) func pushViewController(type: EditType) func pushViewController(url: URL?) + func presentEditBookmarkController(at indexPath: IndexPath) } class BoxListView: UIView { @@ -97,7 +98,7 @@ class BoxListView: UIView { cell.onEdit = { [weak self] in guard let self else { return } if let currentIndexPath = self.tableView.indexPath(for: cell) { - print("edit \(currentIndexPath)") + delegate?.presentEditBookmarkController(at: currentIndexPath) } } @@ -134,6 +135,7 @@ class BoxListView: UIView { } }.store(in: &cancellables) } + } extension BoxListView: UITableViewDelegate { diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 21b9891..8e476d9 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -58,6 +58,57 @@ class BoxListViewController: BaseViewController, BaseViewController } extension BoxListViewController: BoxListViewDelegate { + func presentEditBookmarkController(at indexPath: IndexPath) { + guard let contentView = contentView as? BoxListView else { return } + + let controller = UIAlertController(title: "북마크 편집", message: nil, preferredStyle: .alert) + + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } + let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in + guard let newName = controller.textFields?.first?.text else { return } + guard let newUrlString = controller.textFields?.last?.text, + let newUrl = URL(string: newUrlString) else { return } + + contentView.viewModel?.editBookmark(at: indexPath, name: newName, url: newUrl) + } + controller.addAction(cancelAction) + controller.addAction(okAction) + okAction.isEnabled = true + + controller.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 + let textIsNotEmpty = textCount > 0 + + okAction.isEnabled = textIsNotEmpty + + }) + } + controller.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 + let textIsNotEmpty = textCount > 0 + + okAction.isEnabled = textIsNotEmpty + + }) + } + + guard let bookmark = contentView.viewModel?.bookmark(at: indexPath) else { return } + + controller.textFields?.first?.text = bookmark.name + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no + + controller.textFields?.last?.text = bookmark.url.absoluteString + controller.textFields?.last?.autocorrectionType = .no + controller.textFields?.last?.spellCheckingType = .no + + self.present(controller, animated: true) + } + func didSelectWeb(at url: URL, withName name: String) { let viewController = WebViewController() diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 5d7d628..b1e6cf4 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -64,6 +64,10 @@ class BoxListViewModel { return boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] } + func bookmark(at indexPath: IndexPath) -> Bookmark { + return boxList[indexPath.section].viewModel(at: indexPath.row).bookmark + } + func deleteBookmark(at indexPath: IndexPath) { let bookmarkId = boxList[indexPath.section].viewModel(at: indexPath.row).id CoreDataManager.shared.deleteBookmark(id: bookmarkId) @@ -71,6 +75,14 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) } + func editBookmark(at indexPath: IndexPath, name: String, url: URL) { + let bookmarkId = boxList[indexPath.section].viewModel(at: indexPath.row).id + CoreDataManager.shared.updateBookmark(id: bookmarkId, name: name, url: url) + boxList[indexPath.section].updateCell(at: indexPath.row, bookmark: Bookmark(id: bookmarkId, name: name, url: url)) + haveReloadData = true + output.send(.sendBoxList(boxList: boxList)) + } + func addFolder(_ folder: Folder) { let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) boxList.append(boxListSectionViewModel) From ac4c0c6859e7dc744fefb02cf9964682afb2e3c9 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 15:25:46 +0900 Subject: [PATCH 114/370] feat: move bookmark --- .../BoxList/BoxListSectionViewModel.swift | 9 +++++- iBox/Sources/BoxList/BoxListView.swift | 27 ++++++++++++++++-- iBox/Sources/BoxList/BoxListViewModel.swift | 28 +++++++++++++++++++ iBox/Sources/Shared/CoreDataManager.swift | 4 +-- 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index 2772dad..52ad38c 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -44,12 +44,19 @@ class BoxListSectionViewModel: Identifiable { return boxListCellViewModels[index] } - func deleteCell(at index: Int) { + @discardableResult + func deleteCell(at index: Int) -> BoxListCellViewModel { + let cell = boxListCellViewModels[index] boxListCellViewModels.remove(at: index) + return cell } func updateCell(at index: Int, bookmark: Bookmark) { boxListCellViewModels[index].bookmark = bookmark } + + func insertCell(_ cell: BoxListCellViewModel, at index: Int) { + boxListCellViewModels.insert(cell, at: index) + } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 81715fd..552bc58 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -84,7 +84,7 @@ class BoxListView: UIView { } private func configureDataSource() { - boxListDataSource = BoxListDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in + boxListDataSource = BoxListDataSource(tableView: tableView, viewModel: viewModel) { [weak self] tableView, indexPath, itemIdentifier in guard let self, let viewModel = self.viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } cell.setEditButtonHidden(!viewModel.isEditing) @@ -227,8 +227,31 @@ extension BoxListView: UITableViewDelegate { } class BoxListDataSource: UITableViewDiffableDataSource { + weak var viewModel:BoxListViewModel? + + init(tableView: UITableView, viewModel: BoxListViewModel?, cellProvider: @escaping CellProvider) { + self.viewModel = viewModel + super.init(tableView: tableView, cellProvider: cellProvider) + } override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { - print("move") + guard let viewModel else { return } + viewModel.input.send(.moveBookmark(from: sourceIndexPath, to: destinationIndexPath)) + + let src = self.itemIdentifier(for: sourceIndexPath)! + var snap = self.snapshot() + if let dest = self.itemIdentifier(for: destinationIndexPath) { + + if snap.indexOfItem(src)! > snap.indexOfItem(dest)! { + snap.moveItem(src, beforeItem:dest) + } else { + snap.moveItem(src, afterItem:dest) + } + } else { + snap.deleteItems([src]) + snap.appendItems([src], toSection: snap.sectionIdentifiers[destinationIndexPath.section]) + } + self.apply(snap, animatingDifferences: false) + } } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index b1e6cf4..f58a123 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -25,6 +25,7 @@ class BoxListViewModel { case folderTapped(section: Int) case deleteBookmark(indexPath: IndexPath) case setFavorite(indexPath: IndexPath) + case moveBookmark(from: IndexPath, to: IndexPath) } enum Output { @@ -55,6 +56,8 @@ class BoxListViewModel { deleteBookmark(at: indexPath) case let .setFavorite(indexPath): print("\(viewModel(at: indexPath).name) favorite 할게용") + case .moveBookmark(from: let from, to: let to): + reorderBookmark(srcIndexPath: from, destIndexPath: to) } }.store(in: &cancellables) return output.eraseToAnyPublisher() @@ -83,6 +86,31 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) } + func reorderBookmark(srcIndexPath: IndexPath, destIndexPath: IndexPath) { + let mover = boxList[srcIndexPath.section].deleteCell(at: srcIndexPath.row) + boxList[destIndexPath.section].insertCell(mover, at: destIndexPath.row) + + let destFolderId = boxList[destIndexPath.section].id + CoreDataManager.shared.moveBookmark(from: srcIndexPath, to: destIndexPath, srcId: mover.id, destFolderId: destFolderId) + + + // let src = self.itemIdentifier(for: srcip)! + // var snap = self.snapshot() + // if let dest = self.itemIdentifier(for: destip) { + // + // if snap.indexOfItem(src)! > snap.indexOfItem(dest)! { + // snap.moveItem(src, beforeItem:dest) + // } else { + // snap.moveItem(src, afterItem:dest) + // } + // } else { + // snap.deleteItems([src]) + // snap.appendItems([src], toSection: snap.sectionIdentifiers[destip.section]) + // } + // self.apply(snap, animatingDifferences: false) + + } + func addFolder(_ folder: Folder) { let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) boxList.append(boxListSectionViewModel) diff --git a/iBox/Sources/Shared/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift index 47ffdf7..411e516 100644 --- a/iBox/Sources/Shared/CoreDataManager.swift +++ b/iBox/Sources/Shared/CoreDataManager.swift @@ -309,13 +309,13 @@ extension CoreDataManager { let destBookmarks = getAllBookmarkEntity(in: destFolderId) let destFolder = getFolderEntity(id: destFolderId) - for (index, bookmark) in srcBookmarks.enumerated() where bookmark.order > movingBookmark.order { + for bookmark in srcBookmarks where bookmark.order > movingBookmark.order { bookmark.order -= 1 } movingBookmark.folder = destFolder movingBookmark.order = Int64(destination.row) - for (index, bookmark) in destBookmarks.enumerated() where bookmark.order >= movingBookmark.order { + for bookmark in destBookmarks where bookmark.order >= movingBookmark.order { bookmark.order += 1 } } From d88b59ace30dafee657e04ed59d0ffdf9b339df7 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 15:39:04 +0900 Subject: [PATCH 115/370] chore: delete comments --- iBox/Sources/BoxList/BoxListViewModel.swift | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index f58a123..29d8eec 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -92,23 +92,6 @@ class BoxListViewModel { let destFolderId = boxList[destIndexPath.section].id CoreDataManager.shared.moveBookmark(from: srcIndexPath, to: destIndexPath, srcId: mover.id, destFolderId: destFolderId) - - - // let src = self.itemIdentifier(for: srcip)! - // var snap = self.snapshot() - // if let dest = self.itemIdentifier(for: destip) { - // - // if snap.indexOfItem(src)! > snap.indexOfItem(dest)! { - // snap.moveItem(src, beforeItem:dest) - // } else { - // snap.moveItem(src, afterItem:dest) - // } - // } else { - // snap.deleteItems([src]) - // snap.appendItems([src], toSection: snap.sectionIdentifiers[destip.section]) - // } - // self.apply(snap, animatingDifferences: false) - } func addFolder(_ folder: Folder) { From 5992cf63de8daf0bebe30571c2ff4004da33772a Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 13 Mar 2024 15:56:09 +0900 Subject: [PATCH 116/370] style: change color and UIImage in custom launch screen --- .../CustomLaunchScreen/CustomLaunchScreenView.swift | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift index 7d46ee5..d1d0202 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift @@ -27,9 +27,8 @@ class CustomLaunchScreenView: UIView { } private func configureUI() { - backgroundColor = .box2 - - logoImageView.image = UIImage(named: "1024") + backgroundColor = .backgroundColor + logoImageView.image = UIImage(named: "playstore") logoImageView.contentMode = .scaleAspectFit addSubview(logoImageView) @@ -37,7 +36,7 @@ class CustomLaunchScreenView: UIView { let imageView = UIImageView(image: UIImage(named: imageName)) imageView.contentMode = .scaleAspectFit imageView.isHidden = true - imageView.tintColor = .white + imageView.tintColor = .box2 addSubview(imageView) imageViews.append(imageView) } From 69b058eb2c9c1b7d60622b8abfa45d01c2a96618 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 17:09:40 +0900 Subject: [PATCH 117/370] feat: diffableDatasource apply with identifier --- .../BoxList/BoxListSectionViewModel.swift | 5 ++++- iBox/Sources/BoxList/BoxListView.swift | 15 +++++++++------ iBox/Sources/BoxList/BoxListViewModel.swift | 17 ++++++++++------- .../EditFolder/EditFolderViewModel.swift | 1 - 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index 52ad38c..d55c539 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -57,6 +57,9 @@ class BoxListSectionViewModel: Identifiable { func insertCell(_ cell: BoxListCellViewModel, at index: Int) { boxListCellViewModels.insert(cell, at: index) - } + if !isOpened { + isOpened = true + } + } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 552bc58..795ec17 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -112,12 +112,7 @@ class BoxListView: UIView { for folder in with { snapshot.appendItems(folder.boxListCellViewModelsWithStatus.map { $0.id }, toSection: folder.id) } - if viewModel?.haveReloadData ?? false { - boxListDataSource.applySnapshotUsingReloadData(snapshot) - viewModel?.haveReloadData = false - } else { - boxListDataSource.apply(snapshot, animatingDifferences: true) - } + boxListDataSource.apply(snapshot, animatingDifferences: true) } private func bindViewModel() { @@ -132,6 +127,14 @@ class BoxListView: UIView { case .editStatus(isEditing: let isEditing): self?.tableView.setEditing(isEditing, animated: true) self?.tableView.reloadData() + case .reloadSections(idArray: let idArray): + guard var snapshot = self?.boxListDataSource.snapshot() else { return } + snapshot.reloadSections(idArray) + self?.boxListDataSource.apply(snapshot) + case .reloadRow(id: let id): + guard var snapshot = self?.boxListDataSource.snapshot() else { return } + snapshot.reloadItems([id]) + self?.boxListDataSource.apply(snapshot) } }.store(in: &cancellables) } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 29d8eec..0503765 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -15,7 +15,7 @@ class BoxListViewModel { var folders: [Folder] { boxList.map{ $0.folder } } - var haveReloadData = false + var sectionsToReload = Set() var isEditing = false enum Input { @@ -30,6 +30,8 @@ class BoxListViewModel { enum Output { case sendBoxList(boxList: [BoxListSectionViewModel]) + case reloadSections(idArray: [BoxListSectionViewModel.ID]) + case reloadRow(id: BoxListCellViewModel.ID) case editStatus(isEditing: Bool) } @@ -49,6 +51,10 @@ class BoxListViewModel { boxList = folders.map{ BoxListSectionViewModel(folder: $0) } case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) + if !sectionsToReload.isEmpty { + output.send(.reloadSections(idArray: Array(sectionsToReload))) + sectionsToReload.removeAll() + } case let .folderTapped(section): boxList[section].isOpened.toggle() output.send(.sendBoxList(boxList: boxList)) @@ -82,8 +88,7 @@ class BoxListViewModel { let bookmarkId = boxList[indexPath.section].viewModel(at: indexPath.row).id CoreDataManager.shared.updateBookmark(id: bookmarkId, name: name, url: url) boxList[indexPath.section].updateCell(at: indexPath.row, bookmark: Bookmark(id: bookmarkId, name: name, url: url)) - haveReloadData = true - output.send(.sendBoxList(boxList: boxList)) + output.send(.reloadRow(id: bookmarkId)) } func reorderBookmark(srcIndexPath: IndexPath, destIndexPath: IndexPath) { @@ -97,23 +102,21 @@ class BoxListViewModel { func addFolder(_ folder: Folder) { let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) boxList.append(boxListSectionViewModel) - haveReloadData = true } func deleteFolder(at row: Int) { + sectionsToReload.remove(boxList[row].id) boxList.remove(at: row) - haveReloadData = true } func editFolderName(at row: Int, name: String) { boxList[row].name = name - haveReloadData = true + sectionsToReload.update(with: boxList[row].id) } func moveFolder(from: Int, to: Int) { let mover = boxList.remove(at: from) boxList.insert(mover, at: to) - haveReloadData = true } } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift index bbf10ad..38aa696 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewModel.swift @@ -55,7 +55,6 @@ class EditFolderViewModel { let mover = folderList.remove(at: srcIndexPath.row) folderList.insert(mover, at: destIndexPath.row) CoreDataManager.shared.moveFolder(from: srcIndexPath.row, to: destIndexPath.row) - print(folderList.map{ $0.name }) // delegate?.reloadTableView() } } From 7f0f9ee48a9dc21c7e7b4c0801b62b480d20e87f Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 13 Mar 2024 21:13:49 +0900 Subject: [PATCH 118/370] feat: move bookmark --- .../BoxList/BoxListSectionViewModel.swift | 15 ++++- iBox/Sources/BoxList/BoxListView.swift | 63 ++++++++++++------- iBox/Sources/BoxList/BoxListViewModel.swift | 15 ++++- .../EditFolder/EditFolderViewModel.swift | 1 - 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index d55c539..8c2407f 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -8,12 +8,15 @@ import Foundation class BoxListSectionViewModel: Identifiable { - var folder: Folder { + var folder: Folder + + private var boxListCellViewModels: [BoxListCellViewModel]! { didSet { - boxListCellViewModels = folder.bookmarks.map { BoxListCellViewModel(bookmark: $0) } + folder.bookmarks = boxListCellViewModels.map { + Bookmark(id: $0.id, name: $0.name, url: $0.url) + } } } - private var boxListCellViewModels: [BoxListCellViewModel]! init(folder: Folder) { self.folder = folder @@ -57,9 +60,15 @@ class BoxListSectionViewModel: Identifiable { func insertCell(_ cell: BoxListCellViewModel, at index: Int) { boxListCellViewModels.insert(cell, at: index) + } + + @discardableResult + func openSectionIfNeeded() -> Bool { if !isOpened { isOpened = true + return true } + return false } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 795ec17..dedda06 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -32,7 +32,7 @@ class BoxListView: UIView { $0.backgroundColor = .tableViewBackgroundColor } - private let tableView = UITableView().then { + private let tableView = UITableView(frame: .zero, style: .grouped).then { $0.register(BoxListCell.self, forCellReuseIdentifier: BoxListCell.reuseIdentifier) $0.sectionHeaderTopPadding = 0 @@ -84,7 +84,7 @@ class BoxListView: UIView { } private func configureDataSource() { - boxListDataSource = BoxListDataSource(tableView: tableView, viewModel: viewModel) { [weak self] tableView, indexPath, itemIdentifier in + boxListDataSource = BoxListDataSource(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in guard let self, let viewModel = self.viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } cell.setEditButtonHidden(!viewModel.isEditing) @@ -97,20 +97,21 @@ class BoxListView: UIView { } cell.onEdit = { [weak self] in guard let self else { return } - if let currentIndexPath = self.tableView.indexPath(for: cell) { + if let currentIndexPath = tableView.indexPath(for: cell) { delegate?.presentEditBookmarkController(at: currentIndexPath) } } return cell } + boxListDataSource.delegate = self } - private func applySnapshot(with: [BoxListSectionViewModel]) { + private func applySnapshot(with sections: [BoxListSectionViewModel]) { var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections(with.map{ $0.id }) - for folder in with { - snapshot.appendItems(folder.boxListCellViewModelsWithStatus.map { $0.id }, toSection: folder.id) + snapshot.appendSections(sections.map{ $0.id }) + for section in sections { + snapshot.appendItems(section.boxListCellViewModelsWithStatus.map { $0.id }, toSection: section.id) } boxListDataSource.apply(snapshot, animatingDifferences: true) } @@ -126,14 +127,15 @@ class BoxListView: UIView { self?.applySnapshot(with: boxList) case .editStatus(isEditing: let isEditing): self?.tableView.setEditing(isEditing, animated: true) - self?.tableView.reloadData() + guard let snapshot = self?.boxListDataSource.snapshot() else { return } + self?.boxListDataSource.applySnapshotUsingReloadData(snapshot) case .reloadSections(idArray: let idArray): guard var snapshot = self?.boxListDataSource.snapshot() else { return } snapshot.reloadSections(idArray) self?.boxListDataSource.apply(snapshot) - case .reloadRow(id: let id): + case .reloadRows(idArray: let idArray): guard var snapshot = self?.boxListDataSource.snapshot() else { return } - snapshot.reloadItems([id]) + snapshot.reloadItems(idArray) self?.boxListDataSource.apply(snapshot) } }.store(in: &cancellables) @@ -151,7 +153,7 @@ extension BoxListView: UITableViewDelegate { make.top.bottom.equalToSuperview() make.leading.trailing.equalToSuperview().inset(15) } - view.backgroundColor = .clear + view.backgroundColor = .backgroundColor line.backgroundColor = .quaternaryLabel return view } @@ -229,23 +231,36 @@ extension BoxListView: UITableViewDelegate { } -class BoxListDataSource: UITableViewDiffableDataSource { - weak var viewModel:BoxListViewModel? +extension BoxListView: BoxListDataSourceDelegate { + func openFolderIfNeeded(_ folderIndex: Int) { + viewModel?.input.send(.openFolderIfNeeded(folderIndex: folderIndex)) + } - init(tableView: UITableView, viewModel: BoxListViewModel?, cellProvider: @escaping CellProvider) { - self.viewModel = viewModel - super.init(tableView: tableView, cellProvider: cellProvider) + func moveCell(at sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { + viewModel?.input.send(.moveBookmark(from: sourceIndexPath, to: destinationIndexPath)) } + +} + +protocol BoxListDataSourceDelegate: AnyObject { + func moveCell(at sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) + func openFolderIfNeeded(_ folderIndex: Int) +} + +class BoxListDataSource: UITableViewDiffableDataSource { + weak var delegate: BoxListDataSourceDelegate? + override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { - guard let viewModel else { return } - viewModel.input.send(.moveBookmark(from: sourceIndexPath, to: destinationIndexPath)) - let src = self.itemIdentifier(for: sourceIndexPath)! - var snap = self.snapshot() - if let dest = self.itemIdentifier(for: destinationIndexPath) { - - if snap.indexOfItem(src)! > snap.indexOfItem(dest)! { + delegate?.moveCell(at: sourceIndexPath, to: destinationIndexPath) + + guard let src = self.itemIdentifier(for: sourceIndexPath) else { return } + var snap = self.snapshot() + if let dest = self.itemIdentifier(for: destinationIndexPath) { + guard let srcIndex = snap.indexOfItem(src), + let destIndex = snap.indexOfItem(dest) else { return } + if srcIndex > destIndex { snap.moveItem(src, beforeItem:dest) } else { snap.moveItem(src, afterItem:dest) @@ -254,7 +269,9 @@ class BoxListDataSource: UITableViewDiffableDataSource Date: Thu, 14 Mar 2024 00:33:26 +0900 Subject: [PATCH 119/370] fix: change directory share extension --- .../ShareViewController.swift | 0 .../View/ShareExtensionBackGroundView.swift | 0 iBox/iBox.entitlements | 10 ---------- 3 files changed, 10 deletions(-) rename {iBox/ShareExtension => ShareExtension}/ShareViewController.swift (100%) rename {iBox/ShareExtension => ShareExtension}/View/ShareExtensionBackGroundView.swift (100%) delete mode 100644 iBox/iBox.entitlements diff --git a/iBox/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift similarity index 100% rename from iBox/ShareExtension/ShareViewController.swift rename to ShareExtension/ShareViewController.swift diff --git a/iBox/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift similarity index 100% rename from iBox/ShareExtension/View/ShareExtensionBackGroundView.swift rename to ShareExtension/View/ShareExtensionBackGroundView.swift diff --git a/iBox/iBox.entitlements b/iBox/iBox.entitlements deleted file mode 100644 index ef36994..0000000 --- a/iBox/iBox.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.ibox - - - From 385954d187932464338402673dafecd6bb890191 Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 14 Mar 2024 02:09:05 +0900 Subject: [PATCH 120/370] feat: add metadata model --- ShareExtension/Model/Metadata.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 ShareExtension/Model/Metadata.swift diff --git a/ShareExtension/Model/Metadata.swift b/ShareExtension/Model/Metadata.swift new file mode 100644 index 0000000..8f95deb --- /dev/null +++ b/ShareExtension/Model/Metadata.swift @@ -0,0 +1,12 @@ +// +// Metadata.swift +// iBoxShareExtension +// +// Created by 김찬희 on 2024/03/14. +// + +struct Metadata { + var title: String? + var faviconUrl: String? + var url: String? +} From fff4a6945c87fd0c7129f6a990b14d6113a2a1d4 Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 14 Mar 2024 02:10:12 +0900 Subject: [PATCH 121/370] build: add swiftsoup framework in tuist --- Project.swift | 3 ++- Tuist/Dependencies.swift | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Project.swift b/Project.swift index dd16153..8a7750c 100644 --- a/Project.swift +++ b/Project.swift @@ -22,7 +22,8 @@ class iBoxFactory: ProjectFactory { ] let iBoxShareExtensionDependencies: [TargetDependency] = [ - .external(name: "SnapKit") + .external(name: "SnapKit"), + .external(name: "SwiftSoup") ] private let appInfoPlist: [String: Plist.Value] = [ diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index 2c83d41..98b323e 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -8,9 +8,9 @@ import ProjectDescription let spm = SwiftPackageManagerDependencies([ - .remote(url: "https://github.com/SnapKit/SnapKit.git", requirement: .upToNextMinor(from: "5.0.1")) -], - productTypes: ["SnapKit": .framework] + .remote(url: "https://github.com/SnapKit/SnapKit.git", requirement: .upToNextMinor(from: "5.0.1")), + .remote(url: "https://github.com/scinfu/SwiftSoup.git", requirement: .upToNextMajor(from: "2.7.1")), +], productTypes: ["SnapKit": .framework, "SwiftSoup": .framework] ) let dependencies = Dependencies( From fed560447a9a9a95d01a1646444bb3feaad5c827 Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 14 Mar 2024 02:10:42 +0900 Subject: [PATCH 122/370] feat: title and faviconUrl --- ShareExtension/ShareViewController.swift | 78 ++++++++++++++++++++---- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 1815159..adc99de 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -8,13 +8,15 @@ import UIKit import Social import UniformTypeIdentifiers + import SnapKit +import SwiftSoup @objc(CustomShareViewController) class CustomShareViewController: UIViewController { var backgroundView = ShareExtensionBackGroundView() - var dataURL: String = "" + var dataURL: String? // MARK: - Life Cycle @@ -64,7 +66,7 @@ class CustomShareViewController: UIViewController { self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) }) } - + @objc func openURL(_ url: URL) -> Bool { self.hideExtensionWithCompletionHandler(completion: { _ in self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) @@ -100,6 +102,51 @@ class CustomShareViewController: UIViewController { } } } + + func fetchAndParseMetadata(from url: URL, completion: @escaping (Metadata) -> Void) { + URLSession.shared.dataTask(with: url) { data, response, error in + guard let data = data, error == nil else { + print("Failed to fetch data: \(String(describing: error))") + return + } + + if let htmlContent = String(data: data, encoding: .utf8) { + do { + let doc: Document = try SwiftSoup.parse(htmlContent) + let title: String? = try doc.title() + + let faviconSelectors = ["link[rel='shortcut icon']", "link[rel='icon']", "link[rel='apple-touch-icon']"] + var faviconUrl: String? = nil + + for selector in faviconSelectors { + if let faviconLink: Element = try doc.select(selector).first() { + if var href = try? faviconLink.attr("href"), !href.isEmpty { + if href.starts(with: "/") { + href = url.scheme! + "://" + url.host! + href + } else if !href.starts(with: "http") { + href = url.scheme! + "://" + url.host! + "/" + href + } + faviconUrl = href + break + } + } + } + + if faviconUrl == nil { + faviconUrl = url.scheme! + "://" + url.host! + "/favicon.ico" + } + + let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: url.absoluteString) + + DispatchQueue.main.async { + completion(metadata) + } + } catch { + print("Failed to parse HTML: \(error.localizedDescription)") + } + } + }.resume() + } } extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { @@ -109,16 +156,25 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { } func didTapOpenApp() { - let sharedData = dataURL - let url = URL(string: "iBox://\(sharedData)")! - - if openURL(url) { - print("iBox 앱이 성공적으로 열렸습니다.") - } else { - print("iBox 앱을 열 수 없습니다.") + guard let sharedURL = dataURL, let url = URL(string: sharedURL) else { + print("Share extension error") + return } - print(url) + fetchAndParseMetadata(from: url) { metadata in + let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" + let encodedData = metadata.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" + let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" + let urlString = "iBox://url?title=\(encodedTitle)&data=\(encodedData)&faviconUrl=\(encodedFaviconUrl)" + + print(urlString) + if let openUrl = URL(string: urlString) { + if self.openURL(openUrl) { + print("iBox 앱이 성공적으로 열렸습니다.") + } else { + print("iBox 앱을 열 수 없습니다.") + } + } + } } - } From e26f8f71520a5a9cb050330185adad239d72e704 Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 14 Mar 2024 02:15:11 +0900 Subject: [PATCH 123/370] feat: url decoder --- iBox/Sources/SceneDelegate.swift | 4 +++- iBox/Sources/Shared/URLdecoder.swift | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 iBox/Sources/Shared/URLdecoder.swift diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index ccba580..8d5e068 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -31,7 +31,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { print("Opened URL: \(url)") - // 앱이 실행되기 전에 url이 들어오는 경우 Logic + URLdecoder.handleCustomURL(url) } } @@ -62,6 +62,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { print("Opened URL: \(url)") // 앱 실행 중에 url이 들어오는 경우 Logic + + URLdecoder.handleCustomURL(url) } } diff --git a/iBox/Sources/Shared/URLdecoder.swift b/iBox/Sources/Shared/URLdecoder.swift new file mode 100644 index 0000000..bf6e2b7 --- /dev/null +++ b/iBox/Sources/Shared/URLdecoder.swift @@ -0,0 +1,24 @@ +// +// URLdecoder.swift +// iBoxShareExtension +// +// Created by 김찬희 on 2024/03/14. +// + +import Foundation + +class URLdecoder { + + static func handleCustomURL(_ url: URL) { + guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return } + + let title = urlComponents.queryItems?.first(where: { $0.name == "title" })?.value + let data = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value + let faviconUrl = urlComponents.queryItems?.first(where: { $0.name == "faviconUrl" })?.value + + print("Title: \(title ?? "N/A")") + print("Data URL: \(data ?? "N/A")") + print("Favicon URL: \(faviconUrl ?? "N/A")") + } + +} From 2c252b7d412f43584ca7871e7d0303c459827727 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 04:29:16 +0900 Subject: [PATCH 124/370] =?UTF-8?q?remove:=20Profile=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/MyPage/MyPageView.swift | 61 +------------------ iBox/Sources/MyPage/Profile/ProfileView.swift | 12 ---- .../Profile/ProfileViewController.swift | 27 -------- 3 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 iBox/Sources/MyPage/Profile/ProfileView.swift delete mode 100644 iBox/Sources/MyPage/Profile/ProfileViewController.swift diff --git a/iBox/Sources/MyPage/MyPageView.swift b/iBox/Sources/MyPage/MyPageView.swift index 8e75fd9..86d8c5a 100644 --- a/iBox/Sources/MyPage/MyPageView.swift +++ b/iBox/Sources/MyPage/MyPageView.swift @@ -15,27 +15,6 @@ final class MyPageView: UIView { private var cancellables = Set() // MARK: - UI Components - - let profileView = UIView().then { - $0.isUserInteractionEnabled = true - } - - let profileImageView = UIImageView().then { - $0.image = UIImage(systemName: "person.crop.circle") - $0.tintColor = .box2 - } - - let profileLabel = UILabel().then { - $0.text = "예시입니당" - $0.font = .systemFont(ofSize: 17, weight: .semibold) - } - - let chevronButton = UIButton().then { - $0.configuration = .plain() - $0.configuration?.image = UIImage(systemName: "chevron.right") - $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 10, weight: .bold) - $0.tintColor = .systemGray3 - } let tableView = UITableView().then { $0.register(MyPageItemCell.self, forCellReuseIdentifier: MyPageItemCell.reuseIdentifier) @@ -62,49 +41,15 @@ final class MyPageView: UIView { private func setupProperty() { tableView.delegate = self tableView.dataSource = self - - profileView.addGestureRecognizer( - UITapGestureRecognizer( - target: self, - action: #selector(profileViewTapped) - ) - ) } private func setupHierarchy() { - addSubview(profileView) - profileView.addSubview(profileImageView) - profileView.addSubview(profileLabel) - profileView.addSubview(chevronButton) addSubview(tableView) } private func setupLayout() { - profileView.snp.makeConstraints { make in - make.leading.top.trailing.equalToSuperview() - make.height.equalTo(90) - } - - profileImageView.snp.makeConstraints { make in - make.leading.equalToSuperview().inset(20) - make.centerY.equalToSuperview() - make.width.height.equalTo(50) - } - - profileLabel.snp.makeConstraints { make in - make.leading.equalTo(profileImageView.snp.trailing).offset(10) - make.centerY.equalToSuperview() - } - - chevronButton.snp.makeConstraints { make in - make.trailing.equalToSuperview().inset(30) - make.centerY.equalToSuperview() - make.width.height.equalTo(20) - } - tableView.snp.makeConstraints { make in - make.top.equalTo(profileView.snp.bottom).offset(10) - make.leading.bottom.trailing.equalToSuperview() + make.edges.equalToSuperview() } } @@ -124,10 +69,6 @@ final class MyPageView: UIView { // MARK: - Action Functions - @objc private func profileViewTapped() { - delegate?.pushViewController(ProfileViewController()) - } - @objc private func handleSwitchControlTap(_ controlSwitch: UISwitch) { guard let viewModel = viewModel else { return } viewModel.input.send(.setPreload(controlSwitch.isOn)) diff --git a/iBox/Sources/MyPage/Profile/ProfileView.swift b/iBox/Sources/MyPage/Profile/ProfileView.swift deleted file mode 100644 index c209b83..0000000 --- a/iBox/Sources/MyPage/Profile/ProfileView.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// ProfileView.swift -// iBox -// -// Created by jiyeon on 1/3/24. -// - -import UIKit - -class ProfileView: UIView { - -} diff --git a/iBox/Sources/MyPage/Profile/ProfileViewController.swift b/iBox/Sources/MyPage/Profile/ProfileViewController.swift deleted file mode 100644 index a60cdef..0000000 --- a/iBox/Sources/MyPage/Profile/ProfileViewController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// ProfileViewController.swift -// iBox -// -// Created by jiyeon on 1/3/24. -// - -import UIKit - -class ProfileViewController: BaseViewController, BaseViewControllerProtocol { - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - setupNavigationBar() - } - - // MARK: - BaseViewControllerProtocol - - func setupNavigationBar() { - setNavigationBarTitleLabelText("내 정보 수정하기") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) - setNavigationBarBackButtonHidden(false) - } - -} From 728edbf78664ff4a2971f5f2f8e74321bed27642 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 04:30:12 +0900 Subject: [PATCH 125/370] =?UTF-8?q?chore:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=AF=B8=EB=A6=AC=20=EB=A1=9C=EB=93=9C=20->=20=EC=A6=90?= =?UTF-8?q?=EA=B2=A8=EC=B0=BE=EA=B8=B0=20=EB=AF=B8=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/MyPageItem.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Model/MyPageItem.swift b/iBox/Sources/Model/MyPageItem.swift index 790c1c1..3f16d71 100644 --- a/iBox/Sources/Model/MyPageItem.swift +++ b/iBox/Sources/Model/MyPageItem.swift @@ -19,7 +19,7 @@ enum MyPageType { switch self { case .theme: "테마" case .homeTab: "홈화면" - case .preload: "페이지 미리 로드" + case .preload: "즐겨찾기 미리 로드" case .guide: "이용 가이드" case .feedback: "앱 피드백" case .developer: "개발자 정보" From 723daaf85de41cd1c2fc8f0b8c561f3551fa92f0 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 04:42:43 +0900 Subject: [PATCH 126/370] =?UTF-8?q?chore:=20MyPage=20->=20Settings?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../42flip/42flip_01.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_010.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_011.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_02.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_03.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_04.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_05.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_06.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_07.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_08.imageset/Contents.json | 28 +++++++++-------- .../42flip/42flip_09.imageset/Contents.json | 28 +++++++++-------- .../cat/cat_page0.imageset/Contents.json | 28 +++++++++-------- .../cat/cat_page1.imageset/Contents.json | 28 +++++++++-------- .../cat/cat_page2.imageset/Contents.json | 28 +++++++++-------- .../cat/cat_page3.imageset/Contents.json | 28 +++++++++-------- .../cat/cat_page4.imageset/Contents.json | 28 +++++++++-------- .../fox/fox_page0.imageset/Contents.json | 28 +++++++++-------- .../fox/fox_page1.imageset/Contents.json | 28 +++++++++-------- .../fox/fox_page2.imageset/Contents.json | 28 +++++++++-------- .../fox/fox_page3.imageset/Contents.json | 28 +++++++++-------- .../fox/fox_page4.imageset/Contents.json | 28 +++++++++-------- iBox/Sources/Main/MainTabBarController.swift | 2 +- .../{MyPageItem.swift => SettingsItem.swift} | 8 ++--- iBox/Sources/MyPage/MyPageCellViewModel.swift | 30 ------------------- .../MyPage/MyPageSectionViewModel.swift | 18 ----------- .../HomeTab/HomeTabSelectorCell.swift | 0 .../HomeTab/HomeTabSelectorView.swift | 0 .../HomeTabSelectorViewController.swift | 0 .../HomeTab/HomeTabSelectorViewModel.swift | 0 .../MyPageViewModel.swift | 22 +++++++------- .../Settings/SettingsCellViewModel.swift | 30 +++++++++++++++++++ .../SettingsItemCell.swift} | 10 +++---- .../Settings/SettingsSectionViewModel.swift | 18 +++++++++++ .../SettingsView.swift} | 26 ++++++++-------- .../SettingsViewController.swift} | 18 +++++------ .../Theme/ThemeCell.swift | 0 .../Theme/ThemeView.swift | 0 .../Theme/ThemeViewController.swift | 0 .../Theme/ThemeViewModel.swift | 0 39 files changed, 427 insertions(+), 343 deletions(-) rename iBox/Sources/Model/{MyPageItem.swift => SettingsItem.swift} (85%) delete mode 100644 iBox/Sources/MyPage/MyPageCellViewModel.swift delete mode 100644 iBox/Sources/MyPage/MyPageSectionViewModel.swift rename iBox/Sources/{MyPage => Settings}/HomeTab/HomeTabSelectorCell.swift (100%) rename iBox/Sources/{MyPage => Settings}/HomeTab/HomeTabSelectorView.swift (100%) rename iBox/Sources/{MyPage => Settings}/HomeTab/HomeTabSelectorViewController.swift (100%) rename iBox/Sources/{MyPage => Settings}/HomeTab/HomeTabSelectorViewModel.swift (100%) rename iBox/Sources/{MyPage => Settings}/MyPageViewModel.swift (56%) create mode 100644 iBox/Sources/Settings/SettingsCellViewModel.swift rename iBox/Sources/{MyPage/MyPageItemCell.swift => Settings/SettingsItemCell.swift} (92%) create mode 100644 iBox/Sources/Settings/SettingsSectionViewModel.swift rename iBox/Sources/{MyPage/MyPageView.swift => Settings/SettingsView.swift} (81%) rename iBox/Sources/{MyPage/MyPageViewController.swift => Settings/SettingsViewController.swift} (72%) rename iBox/Sources/{MyPage => Settings}/Theme/ThemeCell.swift (100%) rename iBox/Sources/{MyPage => Settings}/Theme/ThemeView.swift (100%) rename iBox/Sources/{MyPage => Settings}/Theme/ThemeViewController.swift (100%) rename iBox/Sources/{MyPage => Settings}/Theme/ThemeViewModel.swift (100%) diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json index c3f3e0f..e720717 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_01.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_01.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json index decba56..1adb61c 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_010.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_010.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json index 8b7a961..9c275c2 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_011.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_011.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json index 2f3ab5c..29b6d7a 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_02.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_02.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json index 1bb5447..f2cd717 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_03.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_03.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json index ebcc599..5b409df 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_04.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_04.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json index 94ea571..36d8b0f 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_05.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_05.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json index a5e0bd3..7bffe60 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_06.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_06.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json index 44ffa40..aa07899 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_07.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_07.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json index 68d2e68..8b2281e 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_08.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_08.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json index 73c69c8..3a859c1 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "42flip_09.png", - "idiom": "universal", - "scale": "2x" + "filename" : "42flip_09.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json index 2e12dbe..f43efda 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "cat0.png", - "idiom": "universal", - "scale": "2x" + "filename" : "cat0.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json index 1c2d433..2ae8956 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "cat1.png", - "idiom": "universal", - "scale": "2x" + "filename" : "cat1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json index 5a36dbe..643ddc8 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "cat2.png", - "idiom": "universal", - "scale": "2x" + "filename" : "cat2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json index 59c27aa..e09cac4 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "cat3.png", - "idiom": "universal", - "scale": "2x" + "filename" : "cat3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json index fa18c78..7dfe11e 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "cat4.png", - "idiom": "universal", - "scale": "2x" + "filename" : "cat4.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json index 9d2d8fb..de4782f 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page0.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "fox0.png", - "idiom": "universal", - "scale": "2x" + "filename" : "fox0.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json index 28696dd..3efa561 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page1.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "fox1.png", - "idiom": "universal", - "scale": "2x" + "filename" : "fox1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json index 9054a45..9e46b91 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page2.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "fox2.png", - "idiom": "universal", - "scale": "2x" + "filename" : "fox2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json index c5f7545..ea3a111 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page3.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "fox3.png", - "idiom": "universal", - "scale": "2x" + "filename" : "fox3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json index db0dfe4..a772154 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/fox/fox_page4.imageset/Contents.json @@ -1,20 +1,24 @@ { - "images": [ + "images" : [ { - "idiom": "universal", - "scale": "1x" + "idiom" : "universal", + "scale" : "1x" }, { - "filename": "fox4.png", - "idiom": "universal", - "scale": "2x" + "filename" : "fox4.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 }, - "properties": { - "template-rendering-intent": "template" + "properties" : { + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index 6f6404b..b94f3b8 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -28,7 +28,7 @@ class MainTabBarController: UITabBarController { viewControllers = [ setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), setupViewController(viewController: FavoriteViewController(), image: UIImage(systemName: "heart.fill")), - setupViewController(viewController: MyPageViewController(), image: UIImage(systemName: "person.fill")) + setupViewController(viewController: SettingsViewController(), image: UIImage(systemName: "person.fill")) ] tabBar.tintColor = .box tabBar.backgroundColor = .backgroundColor diff --git a/iBox/Sources/Model/MyPageItem.swift b/iBox/Sources/Model/SettingsItem.swift similarity index 85% rename from iBox/Sources/Model/MyPageItem.swift rename to iBox/Sources/Model/SettingsItem.swift index 3f16d71..eac4362 100644 --- a/iBox/Sources/Model/MyPageItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -1,5 +1,5 @@ // -// MyPageItem.swift +// SettingsItem.swift // iBox // // Created by jiyeon on 1/3/24. @@ -7,7 +7,7 @@ import Foundation -enum MyPageType { +enum SettingsType { case theme case homeTab case preload @@ -28,8 +28,8 @@ enum MyPageType { } -struct MyPageItem { - var type: MyPageType +struct SettingsItem { + var type: SettingsType var description: String? var flag: Bool? } diff --git a/iBox/Sources/MyPage/MyPageCellViewModel.swift b/iBox/Sources/MyPage/MyPageCellViewModel.swift deleted file mode 100644 index 77a77c4..0000000 --- a/iBox/Sources/MyPage/MyPageCellViewModel.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// MyPageCellViewModel.swift -// iBox -// -// Created by jiyeon on 2/22/24. -// - -import Foundation - -class MyPageCellViewModel { - - let myPageItem: MyPageItem - - init(_ myPageItem: MyPageItem) { - self.myPageItem = myPageItem - } - - var title: String { - myPageItem.type.toString() - } - - var flag: Bool? { - myPageItem.flag - } - - var description: String? { - myPageItem.description - } - -} diff --git a/iBox/Sources/MyPage/MyPageSectionViewModel.swift b/iBox/Sources/MyPage/MyPageSectionViewModel.swift deleted file mode 100644 index 53b2a81..0000000 --- a/iBox/Sources/MyPage/MyPageSectionViewModel.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// MyPageSectionViewModel.swift -// iBox -// -// Created by jiyeon on 2/22/24. -// - -import Foundation - -class MyPageSectionViewModel { - - let cellViewModels: [MyPageCellViewModel] - - init(cellViewModels: [MyPageCellViewModel]) { - self.cellViewModels = cellViewModels - } - -} diff --git a/iBox/Sources/MyPage/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift similarity index 100% rename from iBox/Sources/MyPage/HomeTab/HomeTabSelectorCell.swift rename to iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift diff --git a/iBox/Sources/MyPage/HomeTab/HomeTabSelectorView.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorView.swift similarity index 100% rename from iBox/Sources/MyPage/HomeTab/HomeTabSelectorView.swift rename to iBox/Sources/Settings/HomeTab/HomeTabSelectorView.swift diff --git a/iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift similarity index 100% rename from iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewController.swift rename to iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift diff --git a/iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewModel.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewModel.swift similarity index 100% rename from iBox/Sources/MyPage/HomeTab/HomeTabSelectorViewModel.swift rename to iBox/Sources/Settings/HomeTab/HomeTabSelectorViewModel.swift diff --git a/iBox/Sources/MyPage/MyPageViewModel.swift b/iBox/Sources/Settings/MyPageViewModel.swift similarity index 56% rename from iBox/Sources/MyPage/MyPageViewModel.swift rename to iBox/Sources/Settings/MyPageViewModel.swift index f388ac2..be71ace 100644 --- a/iBox/Sources/MyPage/MyPageViewModel.swift +++ b/iBox/Sources/Settings/MyPageViewModel.swift @@ -1,5 +1,5 @@ // -// MyPageViewModel.swift +// SettingsViewModel.swift // iBox // // Created by jiyeon on 2/22/24. @@ -8,7 +8,7 @@ import Combine import Foundation -class MyPageViewModel { +class SettingsViewModel { enum Input { case viewWillAppear @@ -24,7 +24,7 @@ class MyPageViewModel { let input = PassthroughSubject() private let output = PassthroughSubject() private var cancellables = Set() - var sectionViewModels = [MyPageSectionViewModel]() + var sectionViewModels = [SettingsSectionViewModel]() func transform(input: AnyPublisher) -> AnyPublisher { input.sink { [weak self] event in @@ -41,15 +41,15 @@ class MyPageViewModel { } private func updateSectionViewModels() { - sectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ - MyPageCellViewModel(MyPageItem(type: .theme, description: UserDefaultsManager.theme.toString())), - MyPageCellViewModel(MyPageItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), - MyPageCellViewModel(MyPageItem(type: .preload, flag: UserDefaultsManager.isPreload)) + sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ + SettingsCellViewModel(SettingsItem(type: .theme, description: UserDefaultsManager.theme.toString())), + SettingsCellViewModel(SettingsItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), + SettingsCellViewModel(SettingsItem(type: .preload, flag: UserDefaultsManager.isPreload)) ])) - sectionViewModels.append(MyPageSectionViewModel(cellViewModels: [ - MyPageCellViewModel(MyPageItem(type: .guide)), - MyPageCellViewModel(MyPageItem(type: .feedback)), - MyPageCellViewModel(MyPageItem(type: .developer)) + sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ + SettingsCellViewModel(SettingsItem(type: .guide)), + SettingsCellViewModel(SettingsItem(type: .feedback)), + SettingsCellViewModel(SettingsItem(type: .developer)) ])) } diff --git a/iBox/Sources/Settings/SettingsCellViewModel.swift b/iBox/Sources/Settings/SettingsCellViewModel.swift new file mode 100644 index 0000000..bd39065 --- /dev/null +++ b/iBox/Sources/Settings/SettingsCellViewModel.swift @@ -0,0 +1,30 @@ +// +// SettingsCellViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +class SettingsCellViewModel { + + let settingsItem: SettingsItem + + init(_ settingsItem: SettingsItem) { + self.settingsItem = settingsItem + } + + var title: String { + settingsItem.type.toString() + } + + var flag: Bool? { + settingsItem.flag + } + + var description: String? { + settingsItem.description + } + +} diff --git a/iBox/Sources/MyPage/MyPageItemCell.swift b/iBox/Sources/Settings/SettingsItemCell.swift similarity index 92% rename from iBox/Sources/MyPage/MyPageItemCell.swift rename to iBox/Sources/Settings/SettingsItemCell.swift index a8d29ad..b60df42 100644 --- a/iBox/Sources/MyPage/MyPageItemCell.swift +++ b/iBox/Sources/Settings/SettingsItemCell.swift @@ -1,5 +1,5 @@ // -// MyPageItemCell.swift +// SettingsItemCell.swift // iBox // // Created by jiyeon on 1/3/24. @@ -9,10 +9,10 @@ import UIKit import SnapKit -class MyPageItemCell: UITableViewCell { +class SettingsItemCell: UITableViewCell { - static let reuseIdentifier = "MyPageItemCell" - private var viewModel: MyPageCellViewModel? + static let reuseIdentifier = "SettingsItemCell" + private var viewModel: SettingsCellViewModel? // MARK: - UI Components @@ -87,7 +87,7 @@ class MyPageItemCell: UITableViewCell { // MARK: - Bind ViewModel - func bindViewModel(_ viewModel: MyPageCellViewModel) { + func bindViewModel(_ viewModel: SettingsCellViewModel) { self.viewModel = viewModel titleLabel.text = viewModel.title diff --git a/iBox/Sources/Settings/SettingsSectionViewModel.swift b/iBox/Sources/Settings/SettingsSectionViewModel.swift new file mode 100644 index 0000000..63efe2f --- /dev/null +++ b/iBox/Sources/Settings/SettingsSectionViewModel.swift @@ -0,0 +1,18 @@ +// +// SettingsSectionViewModel.swift +// iBox +// +// Created by jiyeon on 2/22/24. +// + +import Foundation + +class SettingsSectionViewModel { + + let cellViewModels: [SettingsCellViewModel] + + init(cellViewModels: [SettingsCellViewModel]) { + self.cellViewModels = cellViewModels + } + +} diff --git a/iBox/Sources/MyPage/MyPageView.swift b/iBox/Sources/Settings/SettingsView.swift similarity index 81% rename from iBox/Sources/MyPage/MyPageView.swift rename to iBox/Sources/Settings/SettingsView.swift index 86d8c5a..e1fe94c 100644 --- a/iBox/Sources/MyPage/MyPageView.swift +++ b/iBox/Sources/Settings/SettingsView.swift @@ -1,5 +1,5 @@ // -// ProfileView.swift +// SettingsView.swift // iBox // // Created by jiyeon on 1/3/24. @@ -8,16 +8,16 @@ import Combine import UIKit -final class MyPageView: UIView { +final class SettingsView: UIView { - var delegate: MyPageViewDelegate? - private var viewModel: MyPageViewModel? + var delegate: SettingsViewDelegate? + private var viewModel: SettingsViewModel? private var cancellables = Set() // MARK: - UI Components let tableView = UITableView().then { - $0.register(MyPageItemCell.self, forCellReuseIdentifier: MyPageItemCell.reuseIdentifier) + $0.register(SettingsItemCell.self, forCellReuseIdentifier: SettingsItemCell.reuseIdentifier) $0.separatorStyle = .none $0.sectionHeaderTopPadding = 0 $0.backgroundColor = .clear @@ -55,7 +55,7 @@ final class MyPageView: UIView { // MARK: - Bind ViewModel - func bindViewModel(_ viewModel: MyPageViewModel) { + func bindViewModel(_ viewModel: SettingsViewModel) { self.viewModel = viewModel viewModel.transform(input: viewModel.input.eraseToAnyPublisher()) .receive(on: RunLoop.main) @@ -76,7 +76,7 @@ final class MyPageView: UIView { } -extension MyPageView: UITableViewDelegate { +extension SettingsView: UITableViewDelegate { func numberOfSections(in tableView: UITableView) -> Int { guard let viewModel = viewModel else { return 0 } @@ -99,15 +99,15 @@ extension MyPageView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } - let myPageItem = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row].myPageItem - if (myPageItem.type != MyPageType.preload) { - delegate?.pushViewController(myPageItem.type) + let settingsItem = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row].settingsItem + if (settingsItem.type != SettingsType.preload) { + delegate?.pushViewController(settingsItem.type) } } } -extension MyPageView: UITableViewDataSource { +extension SettingsView: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { guard let viewModel = viewModel else { return 0 } @@ -116,8 +116,8 @@ extension MyPageView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel = viewModel, - let cell = tableView.dequeueReusableCell(withIdentifier: MyPageItemCell.reuseIdentifier) - as? MyPageItemCell else { return UITableViewCell() } + let cell = tableView.dequeueReusableCell(withIdentifier: SettingsItemCell.reuseIdentifier) + as? SettingsItemCell else { return UITableViewCell() } let cellViewModel = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row] cell.bindViewModel(cellViewModel) if cellViewModel.flag != nil { diff --git a/iBox/Sources/MyPage/MyPageViewController.swift b/iBox/Sources/Settings/SettingsViewController.swift similarity index 72% rename from iBox/Sources/MyPage/MyPageViewController.swift rename to iBox/Sources/Settings/SettingsViewController.swift index 6b8e56c..b56bee7 100644 --- a/iBox/Sources/MyPage/MyPageViewController.swift +++ b/iBox/Sources/Settings/SettingsViewController.swift @@ -1,5 +1,5 @@ // -// MyPageViewController.swift +// SettingsViewController.swift // iBox // // Created by 이지현 on 12/27/23. @@ -7,14 +7,14 @@ import UIKit -protocol MyPageViewDelegate { - func pushViewController(_ type: MyPageType) +protocol SettingsViewDelegate { + func pushViewController(_ type: SettingsType) func pushViewController(_ viewController: UIViewController) } -final class MyPageViewController: BaseViewController, BaseViewControllerProtocol { +final class SettingsViewController: BaseViewController, BaseViewControllerProtocol { - private let viewModel = MyPageViewModel() + private let viewModel = SettingsViewModel() // MARK: - Life Cycle @@ -22,7 +22,7 @@ final class MyPageViewController: BaseViewController, BaseViewContro super.viewDidLoad() setupNavigationBar() - guard let contentView = contentView as? MyPageView else { return } + guard let contentView = contentView as? SettingsView else { return } contentView.delegate = self contentView.bindViewModel(viewModel) } @@ -35,14 +35,14 @@ final class MyPageViewController: BaseViewController, BaseViewContro // MARK: - BaseViewControllerProtocol func setupNavigationBar() { - setNavigationBarTitleLabelText("마이 페이지") + setNavigationBarTitleLabelText("설정") } } -extension MyPageViewController: MyPageViewDelegate { +extension SettingsViewController: SettingsViewDelegate { - func pushViewController(_ type: MyPageType) { + func pushViewController(_ type: SettingsType) { switch type { case .theme: navigationController?.pushViewController(ThemeViewController(), animated: true) diff --git a/iBox/Sources/MyPage/Theme/ThemeCell.swift b/iBox/Sources/Settings/Theme/ThemeCell.swift similarity index 100% rename from iBox/Sources/MyPage/Theme/ThemeCell.swift rename to iBox/Sources/Settings/Theme/ThemeCell.swift diff --git a/iBox/Sources/MyPage/Theme/ThemeView.swift b/iBox/Sources/Settings/Theme/ThemeView.swift similarity index 100% rename from iBox/Sources/MyPage/Theme/ThemeView.swift rename to iBox/Sources/Settings/Theme/ThemeView.swift diff --git a/iBox/Sources/MyPage/Theme/ThemeViewController.swift b/iBox/Sources/Settings/Theme/ThemeViewController.swift similarity index 100% rename from iBox/Sources/MyPage/Theme/ThemeViewController.swift rename to iBox/Sources/Settings/Theme/ThemeViewController.swift diff --git a/iBox/Sources/MyPage/Theme/ThemeViewModel.swift b/iBox/Sources/Settings/Theme/ThemeViewModel.swift similarity index 100% rename from iBox/Sources/MyPage/Theme/ThemeViewModel.swift rename to iBox/Sources/Settings/Theme/ThemeViewModel.swift From 94a221f4f59c9c2a8f7187a00fd209ef79195727 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 05:18:39 +0900 Subject: [PATCH 127/370] =?UTF-8?q?feat:=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/SettingsItem.swift | 6 +- iBox/Sources/Settings/Reset/ResetView.swift | 73 +++++++++++++++++++ .../Settings/Reset/ResetViewController.swift | 58 +++++++++++++++ .../Settings/SettingsViewController.swift | 6 +- ...iewModel.swift => SettingsViewModel.swift} | 4 +- 5 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 iBox/Sources/Settings/Reset/ResetView.swift create mode 100644 iBox/Sources/Settings/Reset/ResetViewController.swift rename iBox/Sources/Settings/{MyPageViewModel.swift => SettingsViewModel.swift} (96%) diff --git a/iBox/Sources/Model/SettingsItem.swift b/iBox/Sources/Model/SettingsItem.swift index eac4362..d725301 100644 --- a/iBox/Sources/Model/SettingsItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -11,18 +11,18 @@ enum SettingsType { case theme case homeTab case preload + case reset case guide case feedback - case developer func toString() -> String { switch self { case .theme: "테마" case .homeTab: "홈화면" case .preload: "즐겨찾기 미리 로드" - case .guide: "이용 가이드" + case .reset: "데이터 초기화" + case .guide: "앱 소개" case .feedback: "앱 피드백" - case .developer: "개발자 정보" } } diff --git a/iBox/Sources/Settings/Reset/ResetView.swift b/iBox/Sources/Settings/Reset/ResetView.swift new file mode 100644 index 0000000..811053c --- /dev/null +++ b/iBox/Sources/Settings/Reset/ResetView.swift @@ -0,0 +1,73 @@ +// +// ResetView.swift +// iBox +// +// Created by jiyeon on 3/14/24. +// + +import UIKit + +import SnapKit + +class ResetView: UIView { + + var delegate: ResetViewDelegate? + + // MARK: - UI Components + + let label = UILabel().then { + $0.text = "경고: 이 작업을 진행하면 모든 폴더 및 북마크 정보가 영구적으로 삭제됩니다. 한번 초기화된 데이터는 복구할 수 없으니, 진행하기 전에 중요한 정보가 없는지 다시 한번 확인해 주시기 바랍니다." + $0.numberOfLines = 0 + $0.font = .systemFont(ofSize: 15) + } + + let resetButton = UIButton().then { + $0.configuration = .plain() + $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.boldSystemFont(ofSize: 15)])) + $0.tintColor = .white + $0.backgroundColor = .box + $0.clipsToBounds = true + $0.layer.cornerRadius = 5 + } + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + + private func setupProperty() { + resetButton.addTarget(self, action: #selector(handleResetButtonTap), for: .touchUpInside) + } + + private func setupHierarchy() { + addSubview(label) + addSubview(resetButton) + } + + private func setupLayout() { + label.snp.makeConstraints { make in + make.top.leading.trailing.equalToSuperview().inset(20) + } + + resetButton.snp.makeConstraints { make in + make.top.equalTo(label.snp.bottom).offset(20) + make.trailing.leading.equalToSuperview().inset(20) + make.height.equalTo(44) + } + } + + @objc private func handleResetButtonTap() { + delegate?.showAlert() + } + +} diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift new file mode 100644 index 0000000..d593220 --- /dev/null +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -0,0 +1,58 @@ +// +// ResetViewController.swift +// iBox +// +// Created by jiyeon on 3/14/24. +// + +import UIKit + +protocol ResetViewDelegate { + func showAlert() +} + +class ResetViewController: BaseViewController, BaseViewControllerProtocol { + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + + guard let contentView = contentView as? ResetView else { return } + contentView.delegate = self + } + + // MARK: - BaseViewControllerProtocol + + func setupNavigationBar() { + setNavigationBarTitleLabelText("데이터 초기화") + setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarBackButtonHidden(false) + } + +} + +extension ResetViewController: ResetViewDelegate { + + func showAlert() { + let alertController = UIAlertController(title: "경고", message: "이 작업은 되돌릴 수 없습니다. 계속하려면 \"iBox\"라고 입력해 주세요.", preferredStyle: .alert) + alertController.addTextField() + + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + alertController.addAction(cancelAction) + + let confirmAction = UIAlertAction(title: "확인", style: .default) { _ in + if let textField = alertController.textFields?.first, let text = textField.text, text == "iBox" { + print("정말로 초기화를 해버렷당") + self.navigationController?.popViewController(animated: true) + } else { + self.showAlert() + } + } + alertController.addAction(confirmAction) + + self.present(alertController, animated: true, completion: nil) + } + +} diff --git a/iBox/Sources/Settings/SettingsViewController.swift b/iBox/Sources/Settings/SettingsViewController.swift index b56bee7..bd753ad 100644 --- a/iBox/Sources/Settings/SettingsViewController.swift +++ b/iBox/Sources/Settings/SettingsViewController.swift @@ -48,12 +48,12 @@ extension SettingsViewController: SettingsViewDelegate { navigationController?.pushViewController(ThemeViewController(), animated: true) case .homeTab: navigationController?.pushViewController(HomeTabSelectorViewController(), animated: true) + case .reset: + navigationController?.pushViewController(ResetViewController(), animated: true) case .guide: - print("이용 가이드 탭 !") + print("앱 소개 탭 !") case .feedback: print("앱 피드백 탭 !") - case .developer: - print("개발자 정보 탭 !") default: break } } diff --git a/iBox/Sources/Settings/MyPageViewModel.swift b/iBox/Sources/Settings/SettingsViewModel.swift similarity index 96% rename from iBox/Sources/Settings/MyPageViewModel.swift rename to iBox/Sources/Settings/SettingsViewModel.swift index be71ace..a6fbda4 100644 --- a/iBox/Sources/Settings/MyPageViewModel.swift +++ b/iBox/Sources/Settings/SettingsViewModel.swift @@ -47,9 +47,9 @@ class SettingsViewModel { SettingsCellViewModel(SettingsItem(type: .preload, flag: UserDefaultsManager.isPreload)) ])) sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ + SettingsCellViewModel(SettingsItem(type: .reset)), SettingsCellViewModel(SettingsItem(type: .guide)), - SettingsCellViewModel(SettingsItem(type: .feedback)), - SettingsCellViewModel(SettingsItem(type: .developer)) + SettingsCellViewModel(SettingsItem(type: .feedback)) ])) } From 7f48608e68ec40f088bc688845f7ccd25ff44fb7 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 05:28:55 +0900 Subject: [PATCH 128/370] =?UTF-8?q?feat:=20=EC=84=A4=EC=A0=95=20=ED=83=AD?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=20=EC=8B=9C=20=ED=83=AD=EB=B0=94=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=9B=80=EC=A7=81=EC=9D=B4=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Main/MainTabBarController.swift | 35 ++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index b94f3b8..ca3ff23 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -10,6 +10,8 @@ import UIKit class MainTabBarController: UITabBarController { var previousTabIndex = 0 + var imageChangeTimer: Timer? + var currentImageIndex = 0 // MARK: - Life Cycle @@ -28,7 +30,7 @@ class MainTabBarController: UITabBarController { viewControllers = [ setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), setupViewController(viewController: FavoriteViewController(), image: UIImage(systemName: "heart.fill")), - setupViewController(viewController: SettingsViewController(), image: UIImage(systemName: "person.fill")) + setupViewController(viewController: SettingsViewController(), image: UIImage(named: "sitting_fox0")) ] tabBar.tintColor = .box tabBar.backgroundColor = .backgroundColor @@ -46,14 +48,43 @@ class MainTabBarController: UITabBarController { appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal) appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .selected) } - + } extension MainTabBarController: UITabBarControllerDelegate { + func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { if tabBarController.selectedIndex == 1 && previousTabIndex == 1 { WebViewPreloader.shared.resetFavoriteView() } previousTabIndex = tabBarController.selectedIndex + + if tabBarController.selectedIndex == 2 { + startImageRotation() + } else { + stopImageRotation() + } + } + + private func startImageRotation() { + stopImageRotation() // 현재 진행 중인 타이머가 있다면 중지 + imageChangeTimer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(updateTabBarImage), userInfo: nil, repeats: true) } + + private func stopImageRotation() { + imageChangeTimer?.invalidate() + imageChangeTimer = nil + } + + @objc private func updateTabBarImage() { + if let viewControllers = viewControllers, viewControllers.count > 2 { + let settingsViewController = viewControllers[2] + let imageName = "sitting_fox\(currentImageIndex)" + settingsViewController.tabBarItem.image = UIImage(named: imageName) + + currentImageIndex += 1 + if currentImageIndex > 3 { currentImageIndex = 0 } + } + } + } From c1c21e751903d57c2b1a3d7892d740c0a2c015d4 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 09:22:04 +0900 Subject: [PATCH 129/370] =?UTF-8?q?chore:=20=ED=83=80=EC=9D=B4=EB=A8=B8=20?= =?UTF-8?q?=EA=B0=84=EA=B2=A9=20=EB=8A=98=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Main/MainTabBarController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index ca3ff23..f000bff 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -68,7 +68,7 @@ extension MainTabBarController: UITabBarControllerDelegate { private func startImageRotation() { stopImageRotation() // 현재 진행 중인 타이머가 있다면 중지 - imageChangeTimer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(updateTabBarImage), userInfo: nil, repeats: true) + imageChangeTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateTabBarImage), userInfo: nil, repeats: true) } private func stopImageRotation() { From 6f41d935ca59d85c530aa12dbfa69ff89b515719 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 14 Mar 2024 14:20:50 +0900 Subject: [PATCH 130/370] =?UTF-8?q?:lipstick:=20design:=20=ED=83=AD=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EA=B8=B0=EC=96=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Main/MainTabBarController.swift | 31 +------------------- iBox/Sources/Settings/Reset/ResetView.swift | 2 +- 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index f000bff..625d21d 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -10,8 +10,6 @@ import UIKit class MainTabBarController: UITabBarController { var previousTabIndex = 0 - var imageChangeTimer: Timer? - var currentImageIndex = 0 // MARK: - Life Cycle @@ -30,7 +28,7 @@ class MainTabBarController: UITabBarController { viewControllers = [ setupViewController(viewController: BoxListViewController(), image: UIImage(systemName: "square.grid.2x2.fill")), setupViewController(viewController: FavoriteViewController(), image: UIImage(systemName: "heart.fill")), - setupViewController(viewController: SettingsViewController(), image: UIImage(named: "sitting_fox0")) + setupViewController(viewController: SettingsViewController(), image: UIImage(systemName: "gearshape.fill")) ] tabBar.tintColor = .box tabBar.backgroundColor = .backgroundColor @@ -58,33 +56,6 @@ extension MainTabBarController: UITabBarControllerDelegate { WebViewPreloader.shared.resetFavoriteView() } previousTabIndex = tabBarController.selectedIndex - - if tabBarController.selectedIndex == 2 { - startImageRotation() - } else { - stopImageRotation() - } - } - - private func startImageRotation() { - stopImageRotation() // 현재 진행 중인 타이머가 있다면 중지 - imageChangeTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateTabBarImage), userInfo: nil, repeats: true) - } - - private func stopImageRotation() { - imageChangeTimer?.invalidate() - imageChangeTimer = nil - } - - @objc private func updateTabBarImage() { - if let viewControllers = viewControllers, viewControllers.count > 2 { - let settingsViewController = viewControllers[2] - let imageName = "sitting_fox\(currentImageIndex)" - settingsViewController.tabBarItem.image = UIImage(named: imageName) - - currentImageIndex += 1 - if currentImageIndex > 3 { currentImageIndex = 0 } - } } } diff --git a/iBox/Sources/Settings/Reset/ResetView.swift b/iBox/Sources/Settings/Reset/ResetView.swift index 811053c..9f18044 100644 --- a/iBox/Sources/Settings/Reset/ResetView.swift +++ b/iBox/Sources/Settings/Reset/ResetView.swift @@ -16,7 +16,7 @@ class ResetView: UIView { // MARK: - UI Components let label = UILabel().then { - $0.text = "경고: 이 작업을 진행하면 모든 폴더 및 북마크 정보가 영구적으로 삭제됩니다. 한번 초기화된 데이터는 복구할 수 없으니, 진행하기 전에 중요한 정보가 없는지 다시 한번 확인해 주시기 바랍니다." + $0.text = "경고: 이 작업을 진행하면 저장하신 모든 폴더 및 북마크 정보가 영구적으로 삭제되고 기본값으로 초기화됩니다. 진행하기 전에 중요한 정보가 없는지 다시 한번 확인해 주시기 바랍니다." $0.numberOfLines = 0 $0.font = .systemFont(ofSize: 15) } From 2807f37fb9de1b8c4817989c825834b03601960d Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 14 Mar 2024 17:03:55 +0900 Subject: [PATCH 131/370] =?UTF-8?q?fix=09=20=20=20=20:=20=EA=B8=80?= =?UTF-8?q?=EC=9E=90=20=EC=83=89=EC=83=81=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20share=20extension=20=EC=8B=9C=20placeholder=20=EC=97=86?= =?UTF-8?q?=EC=96=B4=EC=A7=80=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 36 +++++++++---------- .../AddBookmarkViewController.swift | 5 +-- .../BoxList/AddBookmark/FolderListCell.swift | 1 + .../BoxList/AddBookmark/FolderListView.swift | 2 +- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift index 47f7118..0acd004 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkView.swift @@ -22,7 +22,7 @@ class AddBookmarkView: UIView { private lazy var textFieldView: UIView = { let view = UIView() - view.backgroundColor = .white + view.backgroundColor = UIColor.backgroundColor view.layer.cornerRadius = 20 view.clipsToBounds = true view.addSubview(nameTextView) @@ -35,7 +35,7 @@ class AddBookmarkView: UIView { let label = UILabel() label.text = "북마크 이름" label.font = UIFont.systemFont(ofSize: 18) - label.textColor = #colorLiteral(red: 0.8374180198, green: 0.8374378085, blue: 0.8374271393, alpha: 1) + label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) return label }() @@ -45,7 +45,7 @@ class AddBookmarkView: UIView { textView.layer.borderWidth = 0 // 테두리 안보이게 textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) textView.font = UIFont.systemFont(ofSize: 16) - textView.textColor = UIColor.black + textView.textColor = .label textView.isScrollEnabled = true return textView }() @@ -62,7 +62,7 @@ class AddBookmarkView: UIView { let label = UILabel() label.text = "URL" label.font = UIFont.systemFont(ofSize: 18) - label.textColor = #colorLiteral(red: 0.8374180198, green: 0.8374378085, blue: 0.8374271393, alpha: 1) + label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) return label }() @@ -70,19 +70,19 @@ class AddBookmarkView: UIView { let urlTextView: UITextView = { let textView = UITextView() textView.backgroundColor = .clear - textView.layer.borderWidth = 0 // 테두리 안보이게 + textView.layer.borderWidth = 0 textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) textView.font = UIFont.systemFont(ofSize: 16) - textView.textColor = UIColor.black textView.isScrollEnabled = true -// textView.text = "Enter URL" + textView.textColor = .label + textView.isScrollEnabled = true return textView }() private lazy var button: UIButton = { let button = UIButton(type: .custom) - button.backgroundColor = .white + button.backgroundColor = UIColor.backgroundColor button.layer.cornerRadius = 10 button.clipsToBounds = true button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) @@ -95,7 +95,7 @@ class AddBookmarkView: UIView { let label = UILabel() label.text = "목록" label.font = UIFont.systemFont(ofSize: 17) - label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textColor = .label return label }() @@ -111,8 +111,8 @@ class AddBookmarkView: UIView { let imageView = UIImageView() let image = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate) imageView.image = image - imageView.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) //.label // 시스템 라벨 색상을 사용하여 다크 모드와 라이트 모드에서 모두 잘 보이게 합니다. - imageView.contentMode = .scaleAspectFit // 이미지가 콘텐츠 비율을 유지하도록 합니다. + imageView.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + imageView.contentMode = .scaleAspectFit return imageView }() @@ -223,36 +223,36 @@ class AddBookmarkView: UIView { private func updateTextFieldWithIncomingURL() { // GlobalURLManager의 incomingURL을 텍스트 필드에 설정 - urlTextView.text = GlobalURLManager.shared.incomingURL?.absoluteString + if let incomingURL = GlobalURLManager.shared.incomingURL?.absoluteString, !incomingURL.isEmpty { + urlTextView.text = incomingURL + urlTextViewPlaceHolder.isHidden = true + } else { + urlTextView.text = "" + urlTextViewPlaceHolder.isHidden = false + } - // URL을 텍스트 필드에 설정한 후 GlobalURLManager의 incomingURL을 nil로 설정 GlobalURLManager.shared.incomingURL = nil } @objc private func buttonTapped() { onButtonTapped?() } - } extension AddBookmarkView: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { -// nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty -// urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty // 텍스트 변경 시 검사를 수행하고, '추가' 버튼 활성화 상태를 업데이트 let isBothTextViewsFilled = !nameTextView.text.isEmpty && !urlTextView.text.isEmpty onTextChange?(isBothTextViewsFilled) if textView == nameTextView { - // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty } if textView == urlTextView { - // nameTextView의 텍스트가 비어있지 않다면, 플레이스홀더를 숨깁니다. urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty } diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift index cde51dd..9b5b6fb 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -33,7 +33,7 @@ final class AddBookmarkViewController: UIViewController { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() - navigationController?.navigationBar.tintColor = .blue + navigationController?.navigationBar.tintColor = .label navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.compactAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance @@ -70,7 +70,8 @@ final class AddBookmarkViewController: UIViewController { self.dismiss(animated: true, completion: nil) } else { // 하나라도 텍스트 필드에 내용이 있으면, 사용자에게 경고 창 표시 - let alertController = UIAlertController(title: nil, message: "북마크 추가를 취소하시겠습니까?", preferredStyle: .alert) + let alertController = UIAlertController(title: nil, message: "취소하시겠습니까?", preferredStyle: .alert) + let discardAction = UIAlertAction(title: "변경사항 폐기", style: .destructive) { [weak self] _ in self?.dismiss(animated: true, completion: nil) diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift index 6309758..94594ba 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListCell.swift @@ -14,6 +14,7 @@ class FolderListCell: UITableViewCell { private let folderImageView = UIImageView().then { $0.image = UIImage(systemName: "folder.fill") $0.contentMode = .scaleAspectFit + $0.tintColor = .floderGray } let folderNameLabel = UILabel().then { diff --git a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift index 01c9b06..1c37d85 100644 --- a/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/Presenter/BoxList/AddBookmark/FolderListView.swift @@ -21,7 +21,7 @@ class FolderListView: UIView { let label = UILabel() label.text = "새로운 북마크를 추가할 폴더를 선택해주세요." label.font = UIFont.boldSystemFont(ofSize: 17) - label.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + label.textColor = .label label.textAlignment = .center return label }() From 5c69b17246b746c6b7ac4b7df8e5607637d9b67f Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 14 Mar 2024 18:17:52 +0900 Subject: [PATCH 132/370] =?UTF-8?q?refactor=20=20:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?BoxListViewController=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/BoxListViewController.swift | 20 ++++- .../BoxList/BoxListViewController.swift | 79 ------------------- 2 files changed, 18 insertions(+), 81 deletions(-) delete mode 100644 iBox/Sources/Presenter/BoxList/BoxListViewController.swift diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 83cdbec..aac1cd0 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -8,6 +8,19 @@ import UIKit class BoxListViewController: BaseViewController, BaseViewControllerProtocol { + + var shouldPresentModalAutomatically: Bool = false { + didSet { + if shouldPresentModalAutomatically { + // shouldPresentModalAutomatically가 true로 설정될 때 함수 호출 + dismiss(animated: false) { + self.addButtonTapped() + } + // 함수 호출 후 shouldPresentModalAutomatically를 false로 설정 + shouldPresentModalAutomatically = false + } + } + } // MARK: - Life Cycle @@ -37,8 +50,11 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - Action Functions @objc private func addButtonTapped() { - let addBookmarkBottomSheetViewController = AddBookmarkBottomSheetViewController(bottomSheetHeight: 200) - present(addBookmarkBottomSheetViewController, animated: false) + let addBookmarkViewController = AddBookmarkViewController() + let navigationController = UINavigationController(rootViewController: addBookmarkViewController) + + navigationController.modalPresentationStyle = .pageSheet + present(navigationController, animated: true, completion: nil) } @objc private func moreButtonTapped() { diff --git a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift b/iBox/Sources/Presenter/BoxList/BoxListViewController.swift deleted file mode 100644 index e553646..0000000 --- a/iBox/Sources/Presenter/BoxList/BoxListViewController.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// BoxListViewController.swift -// iBox -// -// Created by 이지현 on 12/27/23. -// - -import UIKit - -class BoxListViewController: BaseViewController, BaseViewControllerProtocol { - - var shouldPresentModalAutomatically: Bool = false { - didSet { - if shouldPresentModalAutomatically { - // shouldPresentModalAutomatically가 true로 설정될 때 함수 호출 - dismiss(animated: false) { - self.addButtonTapped() - } - // 함수 호출 후 shouldPresentModalAutomatically를 false로 설정 - shouldPresentModalAutomatically = false - } - } - } - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - setupNavigationBar() - - guard let contentView = contentView as? BoxListView else { return } - contentView.delegate = self - } - - // MARK: - BaseViewControllerProtocol - - func setupNavigationBar() { - setNavigationBarTitleLabelText("iBox") - setNavigationBarMenuButtonHidden(false) - setNavigationBarAddButtonAction(#selector(addButtonTapped)) - setNavigationBarMoreButtonAction(#selector(moreButtonTapped)) - } - - // MARK: - Action Functions - - @objc private func addButtonTapped() { - let addBookmarkViewController = AddBookmarkViewController() - let navigationController = UINavigationController(rootViewController: addBookmarkViewController) - - navigationController.modalPresentationStyle = .pageSheet - present(navigationController, animated: true, completion: nil) - } - - @objc private func moreButtonTapped() { - let editViewController = EditViewController(bottomSheetHeight: 200) - editViewController.delegate = self - present(editViewController, animated: false) - } - -} - -extension BoxListViewController: BoxListViewDelegate { - - func didSelectWeb(at url: URL, withName name: String) { - let viewController = PreloadedWebViewController(selectedWebsite: url) - viewController.title = name - navigationController?.pushViewController(viewController, animated: true) - } - - func pushViewController(type: EditType) { - switch type { - case .folder: - navigationController?.pushViewController(EditFolderViewController(), animated: true) - case .bookmark: - navigationController?.pushViewController(EditBookmarkViewController(), animated: true) - } - } - -} From e61d496825bf181f969713694bd6f8b22afdfe1e Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 14 Mar 2024 18:20:15 +0900 Subject: [PATCH 133/370] =?UTF-8?q?fix=09=20=20=20=20:=20folderImageView?= =?UTF-8?q?=20=EB=82=B4=20tintcolor=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/FolderListCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 94594ba..9219a86 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -14,7 +14,7 @@ class FolderListCell: UITableViewCell { private let folderImageView = UIImageView().then { $0.image = UIImage(systemName: "folder.fill") $0.contentMode = .scaleAspectFit - $0.tintColor = .floderGray + $0.tintColor = .folderGray } let folderNameLabel = UILabel().then { From 39d046286d6c34f922734357cf4ba6ab5ae7b87d Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 14 Mar 2024 18:28:33 +0900 Subject: [PATCH 134/370] =?UTF-8?q?feat=09=20=20=20=20:=20navigationbar=20?= =?UTF-8?q?text=EC=83=89=EC=83=81=20=EB=B0=8F=20=ED=8F=B0=ED=8A=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddBookmark/AddBookmarkViewController.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 9b5b6fb..84050d8 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -33,7 +33,7 @@ final class AddBookmarkViewController: UIViewController { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() - navigationController?.navigationBar.tintColor = .label + navigationController?.navigationBar.tintColor = .box navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.compactAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance @@ -43,6 +43,13 @@ final class AddBookmarkViewController: UIViewController { navigationItem.leftBarButtonItem = UIBarButtonItem(title: "취소", style: .plain, target: self, action: #selector(cancelButtonTapped)) navigationItem.rightBarButtonItem = UIBarButtonItem(title: "추가", style: .plain, target: self, action: #selector(addButtonTapped)) navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 '추가' 버튼 비활성화 + + let attributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.boldSystemFont(ofSize: 17) + ] + + navigationItem.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) + navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) } private func setupAddBookmarkView() { @@ -70,14 +77,14 @@ final class AddBookmarkViewController: UIViewController { self.dismiss(animated: true, completion: nil) } else { // 하나라도 텍스트 필드에 내용이 있으면, 사용자에게 경고 창 표시 - let alertController = UIAlertController(title: nil, message: "취소하시겠습니까?", preferredStyle: .alert) + let alertController = UIAlertController(title: nil, message: "변경사항 폐기", preferredStyle: .alert) - let discardAction = UIAlertAction(title: "변경사항 폐기", style: .destructive) { [weak self] _ in + let discardAction = UIAlertAction(title: "예", style: .destructive) { [weak self] _ in self?.dismiss(animated: true, completion: nil) } - let cancelAction = UIAlertAction(title: "취소", style: .cancel) + let cancelAction = UIAlertAction(title: "아니오", style: .cancel) alertController.addAction(discardAction) alertController.addAction(cancelAction) From 98747c6c5c1452ce4714bf6eb853682f38ba48ff Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 17 Mar 2024 21:14:24 +0900 Subject: [PATCH 135/370] =?UTF-8?q?fix:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListCell.swift | 6 ++++ .../BoxList/BoxListSectionViewModel.swift | 4 +-- iBox/Sources/BoxList/BoxListView.swift | 28 ++++++++----------- iBox/Sources/BoxList/BoxListViewModel.swift | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index 2b2e3c1..2c72874 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -56,6 +56,12 @@ class BoxListCell: UITableViewCell { fatalError("init(coder:) has not been implemented") } + override func prepareForReuse() { + viewModel = nil + onDelete = nil + onEdit = nil + } + // MARK: - Setup Methods private func setupProperty() { diff --git a/iBox/Sources/BoxList/BoxListSectionViewModel.swift b/iBox/Sources/BoxList/BoxListSectionViewModel.swift index 8c2407f..bb2d0e9 100644 --- a/iBox/Sources/BoxList/BoxListSectionViewModel.swift +++ b/iBox/Sources/BoxList/BoxListSectionViewModel.swift @@ -10,7 +10,7 @@ import Foundation class BoxListSectionViewModel: Identifiable { var folder: Folder - private var boxListCellViewModels: [BoxListCellViewModel]! { + var boxListCellViewModels: [BoxListCellViewModel] { didSet { folder.bookmarks = boxListCellViewModels.map { Bookmark(id: $0.id, name: $0.name, url: $0.url) @@ -46,7 +46,7 @@ class BoxListSectionViewModel: Identifiable { func viewModel(at index: Int) -> BoxListCellViewModel { return boxListCellViewModels[index] } - + @discardableResult func deleteCell(at index: Int) -> BoxListCellViewModel { let cell = boxListCellViewModels[index] diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index dedda06..85bda57 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -91,14 +91,14 @@ class BoxListView: UIView { cell.bindViewModel(viewModel.viewModel(at: indexPath)) cell.onDelete = { [weak self] in guard let self else { return } - if let currentIndexPath = tableView.indexPath(for: cell) { - viewModel.deleteBookmark(at: currentIndexPath) + if let currentIndexPath = self.tableView.indexPath(for: cell) { + self.viewModel?.deleteBookmark(at: currentIndexPath) } } cell.onEdit = { [weak self] in guard let self else { return } - if let currentIndexPath = tableView.indexPath(for: cell) { - delegate?.presentEditBookmarkController(at: currentIndexPath) + if let currentIndexPath = self.tableView.indexPath(for: cell) { + self.delegate?.presentEditBookmarkController(at: currentIndexPath) } } @@ -232,15 +232,13 @@ extension BoxListView: UITableViewDelegate { } extension BoxListView: BoxListDataSourceDelegate { - func openFolderIfNeeded(_ folderIndex: Int) { - viewModel?.input.send(.openFolderIfNeeded(folderIndex: folderIndex)) + func openFolderIfNeeded(_ folderIndex: Int) { viewModel?.input.send(.openFolderIfNeeded(folderIndex: folderIndex)) } func moveCell(at sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { viewModel?.input.send(.moveBookmark(from: sourceIndexPath, to: destinationIndexPath)) } - } protocol BoxListDataSourceDelegate: AnyObject { @@ -255,16 +253,12 @@ class BoxListDataSource: UITableViewDiffableDataSource destIndex { - snap.moveItem(src, beforeItem:dest) - } else { - snap.moveItem(src, afterItem:dest) - } + guard let src = itemIdentifier(for: sourceIndexPath), + sourceIndexPath != destinationIndexPath else { return } + + var snap = snapshot() + if let dest = itemIdentifier(for: destinationIndexPath) { + snap.moveItem(src, beforeItem:dest) } else { snap.deleteItems([src]) snap.appendItems([src], toSection: snap.sectionIdentifiers[destinationIndexPath.section]) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index c56efcc..dfd5c83 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -73,7 +73,7 @@ class BoxListViewModel { } func viewModel(at indexPath: IndexPath) -> BoxListCellViewModel { - return boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] + return boxList[indexPath.section].boxListCellViewModels[indexPath.row] } func bookmark(at indexPath: IndexPath) -> Bookmark { From b55a1c1bfb3bf3d20484b276ff12eb02ec1fcc86 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sun, 17 Mar 2024 22:36:38 +0900 Subject: [PATCH 136/370] =?UTF-8?q?refactor=20=20:=20FolderListCell=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/FolderListCell.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 9219a86..827437a 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -36,21 +36,24 @@ class FolderListCell: UITableViewCell { self.contentView.addSubview(folderImageView) self.contentView.addSubview(folderNameLabel) self.backgroundColor = .clear - setupLayout() - } func setupLayout() { folderImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.width.height.equalTo(30) make.leading.equalToSuperview().offset(20) + make.width.height.equalTo(30) + make.top.greaterThanOrEqualToSuperview().offset(10) // 최소 상단 여백 추가 + make.bottom.lessThanOrEqualToSuperview().offset(-10) // 최소 하단 여백 추가 } folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) + make.trailing.lessThanOrEqualToSuperview().offset(-20) // 오른쪽 여백 추가 + make.top.greaterThanOrEqualToSuperview().offset(10) // 최소 상단 여백 추가 + make.bottom.lessThanOrEqualToSuperview().offset(-10) // 최소 하단 여백 추가 } } From 1069d6f0c74f476a2265eecf818fde8958b040f1 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sun, 17 Mar 2024 22:37:34 +0900 Subject: [PATCH 137/370] =?UTF-8?q?refactor=20=20:=20UI=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 158 +++++++----------- 1 file changed, 65 insertions(+), 93 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 0acd004..4cc4e74 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -20,102 +20,78 @@ class AddBookmarkView: UIView { } } - private lazy var textFieldView: UIView = { - let view = UIView() - view.backgroundColor = UIColor.backgroundColor - view.layer.cornerRadius = 20 - view.clipsToBounds = true - view.addSubview(nameTextView) - view.addSubview(separatorView) - view.addSubview(urlTextView) - return view - }() + // MARK: - UI Components + + private lazy var textFieldView: UIView = UIView().then { + $0.backgroundColor = UIColor.backgroundColor + $0.layer.cornerRadius = 20 + $0.clipsToBounds = true + $0.addSubview(nameTextView) + $0.addSubview(separatorView) + $0.addSubview(urlTextView) + } - private let nameTextViewPlaceHolder: UILabel = { - let label = UILabel() - label.text = "북마크 이름" - label.font = UIFont.systemFont(ofSize: 18) - label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) - return label - }() + private let nameTextViewPlaceHolder = UILabel().then { + $0.text = "북마크 이름" + $0.font = UIFont.systemFont(ofSize: 18) + $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + } - let nameTextView: UITextView = { - let textView = UITextView() - textView.backgroundColor = .clear - textView.layer.borderWidth = 0 // 테두리 안보이게 - textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - textView.font = UIFont.systemFont(ofSize: 16) - textView.textColor = .label - textView.isScrollEnabled = true - return textView - }() + let nameTextView = UITextView().then { + $0.backgroundColor = .clear + $0.layer.borderWidth = 0 + $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) + $0.font = UIFont.systemFont(ofSize: 16) + $0.textColor = .label + $0.isScrollEnabled = true + } - + private let separatorView = UIView().then { + $0.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1) + } - private let separatorView: UIView = { - let view = UIView() - view.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1) - return view - }() + private let urlTextViewPlaceHolder = UILabel().then { + $0.text = "URL" + $0.font = UIFont.systemFont(ofSize: 18) + $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + } - private let urlTextViewPlaceHolder: UILabel = { - let label = UILabel() - label.text = "URL" - label.font = UIFont.systemFont(ofSize: 18) - label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) - return label - }() - + let urlTextView = UITextView().then { + $0.backgroundColor = .clear + $0.layer.borderWidth = 0 // 테두리 없음 + $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) + $0.font = UIFont.systemFont(ofSize: 16) + $0.textColor = .label + $0.isScrollEnabled = true + } - let urlTextView: UITextView = { - let textView = UITextView() - textView.backgroundColor = .clear - textView.layer.borderWidth = 0 - textView.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - textView.font = UIFont.systemFont(ofSize: 16) - textView.isScrollEnabled = true - textView.textColor = .label - textView.isScrollEnabled = true - return textView - }() - + private lazy var button = UIButton(type: .custom).then { + $0.backgroundColor = UIColor.backgroundColor + $0.layer.cornerRadius = 10 + $0.clipsToBounds = true + $0.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) + $0.isEnabled = true + $0.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) + } - private lazy var button: UIButton = { - let button = UIButton(type: .custom) - button.backgroundColor = UIColor.backgroundColor - button.layer.cornerRadius = 10 - button.clipsToBounds = true - button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) - button.isEnabled = true - button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) - return button - }() - - private let buttonLabel: UILabel = { - let label = UILabel() - label.text = "목록" - label.font = UIFont.systemFont(ofSize: 17) - label.textColor = .label - return label - }() + private let buttonLabel = UILabel().then { + $0.text = "목록" + $0.font = UIFont.systemFont(ofSize: 17) + $0.textColor = .label + } - let selectedFolderLabel: UILabel = { - let label = UILabel() - label.font = UIFont.systemFont(ofSize: 17) - label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) - label.textAlignment = .right - return label - }() + let selectedFolderLabel = UILabel().then { + $0.font = UIFont.systemFont(ofSize: 17) + $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.textAlignment = .right + } - private let chevronImageView: UIImageView = { - let imageView = UIImageView() + private let chevronImageView = UIImageView().then { let image = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate) - imageView.image = image - imageView.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) - imageView.contentMode = .scaleAspectFit - return imageView - }() - + $0.image = image + $0.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.contentMode = .scaleAspectFit + } override init(frame: CGRect) { super.init(frame: frame) @@ -148,7 +124,6 @@ class AddBookmarkView: UIView { private func setupLayout() { - // 텍스트 필드뷰 textFieldView.snp.makeConstraints { make in make.top.equalToSuperview().inset(100) make.height.equalTo(150) @@ -156,7 +131,7 @@ class AddBookmarkView: UIView { make.trailing.equalToSuperview().offset(-20) } - // name 텍스트뷰 + // nameTextView nameTextView.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.top).offset(10) make.leading.trailing.equalTo(textFieldView).offset(15) @@ -174,7 +149,7 @@ class AddBookmarkView: UIView { make.height.equalTo(1) } - // url 텍스트뷰 + // urlTextView urlTextView.snp.makeConstraints { make in make.top.equalTo(separatorView.snp.bottom).offset(10) make.leading.trailing.equalTo(nameTextView) @@ -186,7 +161,7 @@ class AddBookmarkView: UIView { make.leading.equalTo(urlTextView.snp.leading).offset(5) } - // 버튼 + // button button.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.bottom).offset(20) make.leading.equalTo(self.snp.leading).offset(20) @@ -202,7 +177,6 @@ class AddBookmarkView: UIView { make.height.equalTo(40) } - // 선택된 폴더 레이블 selectedFolderLabel.snp.makeConstraints { make in make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) @@ -210,7 +184,6 @@ class AddBookmarkView: UIView { make.height.equalTo(40) } - // 꺽쇠 이미지 chevronImageView.snp.makeConstraints { make in make.trailing.equalTo(button.snp.trailing).inset(20) make.centerY.equalTo(button.snp.centerY) @@ -220,7 +193,6 @@ class AddBookmarkView: UIView { } - private func updateTextFieldWithIncomingURL() { // GlobalURLManager의 incomingURL을 텍스트 필드에 설정 if let incomingURL = GlobalURLManager.shared.incomingURL?.absoluteString, !incomingURL.isEmpty { From 182fc6d365fc72a4f75c8304b4eaaec058bcc348 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sun, 17 Mar 2024 22:43:28 +0900 Subject: [PATCH 138/370] =?UTF-8?q?refactor=20=20:=20FolderListCell=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/FolderListCell.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 827437a..2a5e093 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -44,18 +44,13 @@ class FolderListCell: UITableViewCell { make.centerY.equalToSuperview() make.leading.equalToSuperview().offset(20) make.width.height.equalTo(30) - make.top.greaterThanOrEqualToSuperview().offset(10) // 최소 상단 여백 추가 - make.bottom.lessThanOrEqualToSuperview().offset(-10) // 최소 하단 여백 추가 } folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) - make.trailing.lessThanOrEqualToSuperview().offset(-20) // 오른쪽 여백 추가 - make.top.greaterThanOrEqualToSuperview().offset(10) // 최소 상단 여백 추가 - make.bottom.lessThanOrEqualToSuperview().offset(-10) // 최소 하단 여백 추가 + make.trailing.lessThanOrEqualToSuperview().offset(-20) } - } } From 0da5c05c94bfaa2eabdcbe26ed92a0a22fd2097c Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sun, 17 Mar 2024 23:37:16 +0900 Subject: [PATCH 139/370] =?UTF-8?q?refactor=20=20:=20FolderListView=20UICo?= =?UTF-8?q?mponent=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/FolderListCell.swift | 5 ++ .../BoxList/AddBookmark/FolderListView.swift | 48 ++++++------------- .../FolderListViewController.swift | 2 - 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 2a5e093..fc380c1 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -44,13 +44,18 @@ class FolderListCell: UITableViewCell { make.centerY.equalToSuperview() make.leading.equalToSuperview().offset(20) make.width.height.equalTo(30) + make.top.greaterThanOrEqualToSuperview().offset(10) + make.bottom.lessThanOrEqualToSuperview().offset(-10) } folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) make.trailing.lessThanOrEqualToSuperview().offset(-20) + make.top.greaterThanOrEqualToSuperview().offset(10) + make.bottom.lessThanOrEqualToSuperview().offset(-10) } + } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 1c37d85..a7fee36 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -9,37 +9,29 @@ import UIKit class FolderListView: UIView { - // CoreDataManager let coreDataManager = CoreDataManager.shared - // 폴더 엔티티를 저장할 배열 var folders: [Folder] = [] var onFolderSelected: ((Folder) -> Void)? + // MARK: - UI Components - private let infoLabel: UILabel = { - let label = UILabel() - label.text = "새로운 북마크를 추가할 폴더를 선택해주세요." - label.font = UIFont.boldSystemFont(ofSize: 17) - label.textColor = .label - label.textAlignment = .center - return label - }() - - private let tableView: UITableView = { - let tableView = UITableView() - tableView.backgroundColor = .clear - tableView.translatesAutoresizingMaskIntoConstraints = false - return tableView - }() + private let infoLabel = UILabel().then { + $0.text = "새로운 북마크를 추가할 폴더를 선택해주세요." + $0.font = UIFont.boldSystemFont(ofSize: 17) + $0.textColor = .label + $0.textAlignment = .center + } + private let tableView = UITableView().then { + $0.backgroundColor = .clear + $0.translatesAutoresizingMaskIntoConstraints = false + } - private lazy var stackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]) - stackView.axis = .vertical - stackView.spacing = 20 - return stackView - }() + private lazy var stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]).then { + $0.axis = .vertical + $0.spacing = 20 + } override init(frame: CGRect) { super.init(frame: frame) @@ -57,21 +49,16 @@ class FolderListView: UIView { setupLayout() setupTableView() } - func setupLayout() { - stackView.snp.makeConstraints { make in make.top.equalTo(self.safeAreaLayoutGuide.snp.top).offset(20) // Adjust as necessary make.bottom.equalTo(self.safeAreaLayoutGuide.snp.bottom) make.leading.equalTo(self.snp.leading) make.trailing.equalTo(self.snp.trailing) } - } - var num = 0 - func setupTableView() { self.tableView.dataSource = self self.tableView.delegate = self @@ -94,16 +81,11 @@ extension FolderListView: UITableViewDataSource { return cell } - - } extension FolderListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - // 선택시 로직 - print("항목 \(indexPath.row) 선택됨") let selectedFolder = folders[indexPath.row] onFolderSelected?(selectedFolder) } - } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index 2171dad..f6c75ea 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -28,6 +28,4 @@ class FolderListViewController: UIViewController { } } } - - } From e55f4f6af5b496ed1d5996e204f653f33e078975 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 19 Mar 2024 12:57:25 +0900 Subject: [PATCH 140/370] =?UTF-8?q?feat:=20WebView=EC=97=90=EC=84=9C=20htt?= =?UTF-8?q?p=20=EC=97=B0=EA=B2=B0=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Project.swift b/Project.swift index 8a7750c..5810beb 100644 --- a/Project.swift +++ b/Project.swift @@ -51,6 +51,9 @@ class iBoxFactory: ProjectFactory { "CFBundleTypeRole": "Editor" ] ], + "NSAppTransportSecurity": [ + "NSAllowsArbitraryLoadsInWebContent": true + ] ] private let shareExtensionInfoPlist: [String: Plist.Value] = [ From 6b8628ce90ae880403722de5f1decd475c20afcd Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 20 Mar 2024 11:03:20 +0900 Subject: [PATCH 141/370] =?UTF-8?q?feat:=20=EB=B0=A9=EB=AC=B8=ED=96=88?= =?UTF-8?q?=EB=8D=98=20url=EC=97=90=20=EB=8C=80=ED=95=9C=20view=20controll?= =?UTF-8?q?er=20=EA=B8=B0=EC=96=B5=ED=95=98=EB=8A=94=20=EC=BA=90=EC=8B=9C?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/BoxListViewController.swift | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 8e476d9..bf2bac7 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -9,6 +9,8 @@ import UIKit class BoxListViewController: BaseViewController, BaseViewControllerProtocol { + private var viewControllerCache: [String: WebViewController] = [:] + // MARK: - Life Cycle override func viewDidLoad() { @@ -111,10 +113,18 @@ extension BoxListViewController: BoxListViewDelegate { func didSelectWeb(at url: URL, withName name: String) { - let viewController = WebViewController() - viewController.selectedWebsite = url - viewController.title = name - navigationController?.pushViewController(viewController, animated: true) + let urlString = url.absoluteString + if let cachedViewController = viewControllerCache[urlString] { + // 이미 캐시에 존재한다면, 그 인스턴스를 재사용 + navigationController?.pushViewController(cachedViewController, animated: true) + } else { + // 캐시에 없는 경우, 새로운 viewController 인스턴스를 생성하고 캐시에 추가합니다. + let viewController = WebViewController() + viewController.selectedWebsite = url + viewController.title = name + viewControllerCache[urlString] = viewController + navigationController?.pushViewController(viewController, animated: true) + } } func pushViewController(type: EditType) { From d5f221e059601a7fa7a264a46b72ed916afc82d4 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 00:52:42 +0900 Subject: [PATCH 142/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=ED=8F=B4=EB=8D=94=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddBookmarkViewController.swift | 52 +++++++++++++++++-- .../BoxList/AddBookmark/FolderListView.swift | 7 ++- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 84050d8..ceef4f0 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -94,8 +94,6 @@ final class AddBookmarkViewController: UIViewController { } @objc private func addButtonTapped() { - // 북마크 추가 로직 - guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, let url = URL(string: urlString) else { @@ -105,7 +103,6 @@ final class AddBookmarkViewController: UIViewController { let newBookmark = Bookmark(id: UUID(), name: name, url: url) - // 선택된 폴더가 있을 경우에만 북마크를 추가 if let selectedFolder = selectedFolder { coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) print("북마크 저장 완료: \(newBookmark.name)") @@ -113,14 +110,61 @@ final class AddBookmarkViewController: UIViewController { print("선택된 폴더가 없습니다.") } - // 모달을 닫습니다. self.dismiss(animated: true, completion: nil) } private func openFolderSelection() { let folderListViewController = FolderListViewController() folderListViewController.title = "목록" + + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolderAction)) + folderListViewController.navigationItem.rightBarButtonItem = addButton + navigationController?.pushViewController(folderListViewController, animated: true) } + @objc func addFolderAction() { + let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) + + controller.addTextField { textField in + textField.placeholder = "폴더 이름" + textField.autocorrectionType = .no + textField.spellCheckingType = .no + } + + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + let addAction = UIAlertAction(title: "추가", style: .default) { [unowned controller, weak self] _ in + guard let textField = controller.textFields?.first, + let folderName = textField.text, !folderName.trimmingCharacters(in: .whitespaces).isEmpty else { + return + } + + let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) + self?.coreDataManager.addFolder(newFolder) + + self?.updateFolderList() + } + + controller.addAction(cancelAction) + controller.addAction(addAction) + + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: controller.textFields?.first, queue: .main) { notification in + if let textField = notification.object as? UITextField, + let text = textField.text, !text.trimmingCharacters(in: .whitespaces).isEmpty { + addAction.isEnabled = true + } else { + addAction.isEnabled = false + } + } + + addAction.isEnabled = false + + present(controller, animated: true) + } + + func updateFolderList() { + if let folderListVC = navigationController?.viewControllers.first(where: { $0 is FolderListViewController }) as? FolderListViewController { + folderListVC.bookmarkListView.reloadFolderList() + } + } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index a7fee36..23c2d31 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -64,10 +64,13 @@ class FolderListView: UIView { self.tableView.delegate = self self.tableView.register(FolderListCell.self, forCellReuseIdentifier: FolderListCell.reuseIdentifier) - // 모든 폴더 가져오기 folders = coreDataManager.getFolders() } - + + func reloadFolderList() { + folders = coreDataManager.getFolders() + tableView.reloadData() + } } extension FolderListView: UITableViewDataSource { From 7ba115b7b175efd08222a3ff58867c97b5a16924 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 01:25:04 +0900 Subject: [PATCH 143/370] =?UTF-8?q?refactor=20=20:=20colorLiteral=EC=9D=84?= =?UTF-8?q?=20UIColor=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 12 ++++++------ .../Sources/BoxList/AddBookmark/FolderListCell.swift | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 4cc4e74..8d6e89e 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -34,7 +34,7 @@ class AddBookmarkView: UIView { private let nameTextViewPlaceHolder = UILabel().then { $0.text = "북마크 이름" $0.font = UIFont.systemFont(ofSize: 18) - $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.textColor = .systemGray3 } let nameTextView = UITextView().then { @@ -47,18 +47,18 @@ class AddBookmarkView: UIView { } private let separatorView = UIView().then { - $0.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1) + $0.backgroundColor = .systemGray3 } private let urlTextViewPlaceHolder = UILabel().then { $0.text = "URL" $0.font = UIFont.systemFont(ofSize: 18) - $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.textColor = .systemGray3 } let urlTextView = UITextView().then { $0.backgroundColor = .clear - $0.layer.borderWidth = 0 // 테두리 없음 + $0.layer.borderWidth = 0 $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) $0.font = UIFont.systemFont(ofSize: 16) $0.textColor = .label @@ -82,14 +82,14 @@ class AddBookmarkView: UIView { let selectedFolderLabel = UILabel().then { $0.font = UIFont.systemFont(ofSize: 17) - $0.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.textColor = .systemGray $0.textAlignment = .right } private let chevronImageView = UIImageView().then { let image = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate) $0.image = image - $0.tintColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + $0.tintColor = .systemGray $0.contentMode = .scaleAspectFit } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index fc380c1..422bf87 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -14,7 +14,7 @@ class FolderListCell: UITableViewCell { private let folderImageView = UIImageView().then { $0.image = UIImage(systemName: "folder.fill") $0.contentMode = .scaleAspectFit - $0.tintColor = .folderGray + $0.tintColor = .gray } let folderNameLabel = UILabel().then { From 930074cbdb4a8d6b59e0c256c02c90f3bf5d8cb9 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 03:39:40 +0900 Subject: [PATCH 144/370] =?UTF-8?q?refactor=20=20:=20AddBookmarkView=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B0=8F=20=EC=A0=9C=EC=95=BD=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkView.swift | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 8d6e89e..d042b30 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -12,7 +12,7 @@ import SnapKit class AddBookmarkView: UIView { var onButtonTapped: (() -> Void)? - var onTextChange: ((Bool) -> Void)? // '추가'버튼 비활성화 관련 + var onTextChange: ((Bool) -> Void)? var selectedFolderName: String? { didSet { @@ -22,13 +22,10 @@ class AddBookmarkView: UIView { // MARK: - UI Components - private lazy var textFieldView: UIView = UIView().then { + private let textFieldView: UIView = UIView().then { $0.backgroundColor = UIColor.backgroundColor $0.layer.cornerRadius = 20 $0.clipsToBounds = true - $0.addSubview(nameTextView) - $0.addSubview(separatorView) - $0.addSubview(urlTextView) } private let nameTextViewPlaceHolder = UILabel().then { @@ -65,13 +62,12 @@ class AddBookmarkView: UIView { $0.isScrollEnabled = true } - private lazy var button = UIButton(type: .custom).then { + private let button = UIButton(type: .custom).then { $0.backgroundColor = UIColor.backgroundColor $0.layer.cornerRadius = 10 $0.clipsToBounds = true $0.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) $0.isEnabled = true - $0.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) } private let buttonLabel = UILabel().then { @@ -93,48 +89,55 @@ class AddBookmarkView: UIView { $0.contentMode = .scaleAspectFit } + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) - configureUI() - - nameTextView.delegate = self - urlTextView.delegate = self + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { super.init(coder: coder) } - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - self.endEditing(true) - } - - private func configureUI() { + // MARK: - Setup Methods + + private func setupProperty() { backgroundColor = .systemGroupedBackground + updateTextFieldWithIncomingURL() + button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) + nameTextView.delegate = self + urlTextView.delegate = self + } + + private func setupHierarchy() { addSubview(textFieldView) + addSubview(nameTextView) + addSubview(separatorView) + addSubview(urlTextView) addSubview(nameTextViewPlaceHolder) addSubview(urlTextViewPlaceHolder) addSubview(button) addSubview(buttonLabel) addSubview(selectedFolderLabel) addSubview(chevronImageView) - setupLayout() - updateTextFieldWithIncomingURL() } private func setupLayout() { textFieldView.snp.makeConstraints { make in - make.top.equalToSuperview().inset(100) + make.top.equalToSuperview().offset(100) make.height.equalTo(150) make.leading.equalToSuperview().offset(20) make.trailing.equalToSuperview().offset(-20) } - // nameTextView nameTextView.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.top).offset(10) - make.leading.trailing.equalTo(textFieldView).offset(15) + make.leading.equalTo(textFieldView.snp.leading).offset(15) + make.trailing.equalTo(textFieldView.snp.trailing).offset(-15) make.height.equalTo(30) } @@ -145,15 +148,15 @@ class AddBookmarkView: UIView { separatorView.snp.makeConstraints { make in make.top.equalTo(nameTextView.snp.bottom).offset(10) - make.leading.trailing.equalTo(nameTextView).offset(5) + make.leading.equalTo(nameTextView.snp.leading).offset(5) + make.trailing.equalTo(nameTextView.snp.trailing).offset(-5) make.height.equalTo(1) } - // urlTextView urlTextView.snp.makeConstraints { make in make.top.equalTo(separatorView.snp.bottom).offset(10) make.leading.trailing.equalTo(nameTextView) - make.bottom.equalTo(textFieldView.snp.bottom).inset(10) + make.bottom.equalTo(textFieldView.snp.bottom).offset(-10) } urlTextViewPlaceHolder.snp.makeConstraints { make in @@ -161,15 +164,13 @@ class AddBookmarkView: UIView { make.leading.equalTo(urlTextView.snp.leading).offset(5) } - // button button.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.bottom).offset(20) - make.leading.equalTo(self.snp.leading).offset(20) - make.trailing.equalTo(self.snp.trailing).offset(-20) + make.leading.equalToSuperview().offset(20) + make.trailing.equalToSuperview().offset(-20) make.height.equalTo(50) } - buttonLabel.snp.makeConstraints { make in make.leading.equalTo(button.snp.leading).offset(20) make.centerY.equalTo(button.snp.centerY) @@ -185,7 +186,7 @@ class AddBookmarkView: UIView { } chevronImageView.snp.makeConstraints { make in - make.trailing.equalTo(button.snp.trailing).inset(20) + make.trailing.equalTo(button.snp.trailing).offset(-20) make.centerY.equalTo(button.snp.centerY) make.width.equalTo(17) make.height.equalTo(17) @@ -194,7 +195,6 @@ class AddBookmarkView: UIView { } private func updateTextFieldWithIncomingURL() { - // GlobalURLManager의 incomingURL을 텍스트 필드에 설정 if let incomingURL = GlobalURLManager.shared.incomingURL?.absoluteString, !incomingURL.isEmpty { urlTextView.text = incomingURL urlTextViewPlaceHolder.isHidden = true @@ -209,14 +209,16 @@ class AddBookmarkView: UIView { @objc private func buttonTapped() { onButtonTapped?() } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + self.endEditing(true) + } } - extension AddBookmarkView: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { - // 텍스트 변경 시 검사를 수행하고, '추가' 버튼 활성화 상태를 업데이트 let isBothTextViewsFilled = !nameTextView.text.isEmpty && !urlTextView.text.isEmpty onTextChange?(isBothTextViewsFilled) From 8a1bc3111e69acb8e34ba893858d6ee0b3f3e00e Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 03:42:31 +0900 Subject: [PATCH 145/370] =?UTF-8?q?chore=09=20=20=20=20:=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkViewController.swift | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 84050d8..76f036e 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -42,7 +42,7 @@ final class AddBookmarkViewController: UIViewController { navigationItem.leftBarButtonItem = UIBarButtonItem(title: "취소", style: .plain, target: self, action: #selector(cancelButtonTapped)) navigationItem.rightBarButtonItem = UIBarButtonItem(title: "추가", style: .plain, target: self, action: #selector(addButtonTapped)) - navigationItem.rightBarButtonItem?.isEnabled = false // 처음에 '추가' 버튼 비활성화 + navigationItem.rightBarButtonItem?.isEnabled = false let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.boldSystemFont(ofSize: 17) @@ -69,14 +69,11 @@ final class AddBookmarkViewController: UIViewController { @objc private func cancelButtonTapped() { - // nameTextView와 urlTextView가 모두 비어 있는지 확인 let isTextFieldsEmpty = addBookmarkView.nameTextView.text?.isEmpty ?? true && addBookmarkView.urlTextView.text?.isEmpty ?? true if isTextFieldsEmpty { - // 모든 텍스트 필드가 비어있으면, 바로 dismiss self.dismiss(animated: true, completion: nil) } else { - // 하나라도 텍스트 필드에 내용이 있으면, 사용자에게 경고 창 표시 let alertController = UIAlertController(title: nil, message: "변경사항 폐기", preferredStyle: .alert) @@ -94,7 +91,6 @@ final class AddBookmarkViewController: UIViewController { } @objc private func addButtonTapped() { - // 북마크 추가 로직 guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, @@ -105,7 +101,6 @@ final class AddBookmarkViewController: UIViewController { let newBookmark = Bookmark(id: UUID(), name: name, url: url) - // 선택된 폴더가 있을 경우에만 북마크를 추가 if let selectedFolder = selectedFolder { coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) print("북마크 저장 완료: \(newBookmark.name)") @@ -113,7 +108,6 @@ final class AddBookmarkViewController: UIViewController { print("선택된 폴더가 없습니다.") } - // 모달을 닫습니다. self.dismiss(animated: true, completion: nil) } From 62e11cd4d0f0d842a4529352133b03123fae31e2 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 03:50:08 +0900 Subject: [PATCH 146/370] =?UTF-8?q?refactor=20=20:=20FolderListView=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/FolderListView.swift | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index a7fee36..45b5819 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -10,7 +10,6 @@ import UIKit class FolderListView: UIView { let coreDataManager = CoreDataManager.shared - var folders: [Folder] = [] var onFolderSelected: ((Folder) -> Void)? @@ -33,23 +32,30 @@ class FolderListView: UIView { $0.spacing = 20 } + // MARK: - Initializer + override init(frame: CGRect) { super.init(frame: frame) - configureUI() - + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - func configureUI() { + // MARK: - Setup Methods + + func setupProperty() { backgroundColor = .systemGroupedBackground - addSubview(stackView) - setupLayout() setupTableView() } + func setupHierarchy() { + addSubview(stackView) + } + func setupLayout() { stackView.snp.makeConstraints { make in make.top.equalTo(self.safeAreaLayoutGuide.snp.top).offset(20) // Adjust as necessary @@ -64,7 +70,6 @@ class FolderListView: UIView { self.tableView.delegate = self self.tableView.register(FolderListCell.self, forCellReuseIdentifier: FolderListCell.reuseIdentifier) - // 모든 폴더 가져오기 folders = coreDataManager.getFolders() } From 69d6af4ca1f40fac651dbe4c1f89ed8a7183b16b Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 04:44:33 +0900 Subject: [PATCH 147/370] feat : maintain selected folder in addBookmarkView --- .../BoxList/AddBookmark/AddBookmarkViewController.swift | 5 ++++- .../BoxList/AddBookmark/FolderListViewController.swift | 1 + iBox/Sources/Model/Folder.swift | 2 +- iBox/Sources/Shared/UserDefaultsManager.swift | 3 +++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 4737938..2bc39b1 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -63,7 +63,10 @@ final class AddBookmarkViewController: UIViewController { } private func updateSelectedFolder() { - selectedFolder = selectedFolder ?? CoreDataManager.shared.getFolders().first + selectedFolder = UserDefaultsManager.selectedFolder + if selectedFolder == nil { + selectedFolder = CoreDataManager.shared.getFolders().first + } addBookmarkView.selectedFolderName = selectedFolder?.name } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index f6c75ea..813416d 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -23,6 +23,7 @@ class FolderListViewController: UIViewController { if let addBookmarkVC = self.navigationController?.viewControllers.first as? AddBookmarkViewController { addBookmarkVC.selectedFolder = folder + UserDefaultsManager.selectedFolder = folder self.navigationController?.popViewController(animated: true) } diff --git a/iBox/Sources/Model/Folder.swift b/iBox/Sources/Model/Folder.swift index 9be0ed9..b13d1b8 100644 --- a/iBox/Sources/Model/Folder.swift +++ b/iBox/Sources/Model/Folder.swift @@ -7,7 +7,7 @@ import Foundation -struct Folder { +struct Folder: Codable { let id: UUID var name: String var bookmarks: [Bookmark] diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index 48e785d..3fe28ba 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -23,6 +23,9 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isPreload", defaultValue: false) static var isPreload: Bool + + @UserDefaultsData(key: "selectedFolder", defaultValue: Folder(id: UUID(), name: "", bookmarks: [])) + static var selectedFolder: Folder } From ed71b69cd86d1911fd0ef17bea1842ec54414a65 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 05:06:49 +0900 Subject: [PATCH 148/370] =?UTF-8?q?refactor=20=20:=20FolderListCell=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/FolderListCell.swift | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 422bf87..91b18fd 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -11,6 +11,8 @@ class FolderListCell: UITableViewCell { static let reuseIdentifier = "ListCell" + // MARK: - UI Components + private let folderImageView = UIImageView().then { $0.image = UIImage(systemName: "folder.fill") $0.contentMode = .scaleAspectFit @@ -22,21 +24,28 @@ class FolderListCell: UITableViewCell { $0.font = .systemFont(ofSize: 17, weight: .regular) } - + // MARK: - Initializer + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .default, reuseIdentifier: reuseIdentifier) - configureUI() + setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - func configureUI() { + // MARK: - Setup Methods + + private func setupProperty() { + self.backgroundColor = .clear + } + + private func setupHierarchy() { self.contentView.addSubview(folderImageView) self.contentView.addSubview(folderNameLabel) - self.backgroundColor = .clear - setupLayout() } func setupLayout() { From 9c09a86a3a992e9c721b40af895ebb4b47612095 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 05:28:31 +0900 Subject: [PATCH 149/370] feat : checkmark when selecting folder in folder list --- .../BoxList/AddBookmark/FolderListCell.swift | 18 ++++++++++++++++++ .../BoxList/AddBookmark/FolderListView.swift | 5 ++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 91b18fd..c955d35 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -23,6 +23,13 @@ class FolderListCell: UITableViewCell { $0.textColor = .label $0.font = .systemFont(ofSize: 17, weight: .regular) } + + private let checkImageView = UIImageView().then { + $0.image = UIImage(systemName: "checkmark") + $0.contentMode = .scaleAspectFit + $0.tintColor = .box + $0.isHidden = true + } // MARK: - Initializer @@ -46,6 +53,7 @@ class FolderListCell: UITableViewCell { private func setupHierarchy() { self.contentView.addSubview(folderImageView) self.contentView.addSubview(folderNameLabel) + self.contentView.addSubview(checkImageView) } func setupLayout() { @@ -65,6 +73,16 @@ class FolderListCell: UITableViewCell { make.bottom.lessThanOrEqualToSuperview().offset(-10) } + checkImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.trailing.equalToSuperview().offset(-20) + make.width.height.equalTo(24) + } + } + + func configureWith(folder: Folder, isSelected: Bool) { + folderNameLabel.text = folder.name + checkImageView.isHidden = !isSelected } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 34328ac..e325ffd 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -86,7 +86,10 @@ extension FolderListView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: FolderListCell.reuseIdentifier, for: indexPath) as! FolderListCell - cell.folderNameLabel.text = folders[indexPath.row].name + let folder = folders[indexPath.row] + + let isSelectedFolder = UserDefaultsManager.selectedFolder.id == folder.id + cell.configureWith(folder: folder, isSelected: isSelectedFolder) return cell } From 71204aed29994a41af7c359be1907e0ef3d30fc0 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 26 Mar 2024 05:31:06 +0900 Subject: [PATCH 150/370] =?UTF-8?q?refactor=20=20:=20FolderListVC=20?= =?UTF-8?q?=EB=82=B4=20view=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkViewController.swift | 2 +- .../BoxList/AddBookmark/FolderListViewController.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 2bc39b1..13f1cb0 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -164,7 +164,7 @@ final class AddBookmarkViewController: UIViewController { func updateFolderList() { if let folderListVC = navigationController?.viewControllers.first(where: { $0 is FolderListViewController }) as? FolderListViewController { - folderListVC.bookmarkListView.reloadFolderList() + folderListVC.folderListView.reloadFolderList() } } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index 813416d..bbccafa 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -8,16 +8,16 @@ import UIKit class FolderListViewController: UIViewController { - let bookmarkListView = FolderListView() + let folderListView = FolderListView() override func loadView() { - view = bookmarkListView + view = folderListView } override func viewDidLoad() { super.viewDidLoad() - bookmarkListView.onFolderSelected = { [weak self] folder in + folderListView.onFolderSelected = { [weak self] folder in guard let self = self else { return } From 0b8496da00ac81d95c0ef5ebb5af9190e080c92b Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 19:35:19 +0900 Subject: [PATCH 151/370] =?UTF-8?q?refactor:=20NSCache=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 8 ++-- .../BoxList/BoxListViewController.swift | 9 ++-- iBox/Sources/Shared/WebCacheManager.swift | 45 +++++++++++++++++++ 3 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 iBox/Sources/Shared/WebCacheManager.swift diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 85bda57..967479b 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -11,7 +11,7 @@ import UIKit import SnapKit protocol BoxListViewDelegate: AnyObject { - func didSelectWeb(at url: URL, withName name: String) + func didSelectWeb(id: UUID, at url: URL, withName name: String) func pushViewController(type: EditType) func pushViewController(url: URL?) func presentEditBookmarkController(at indexPath: IndexPath) @@ -184,10 +184,8 @@ extension BoxListView: UITableViewDelegate { } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let viewModel else { return } - let webUrl = viewModel.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].url - let webName = viewModel.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].name - delegate?.didSelectWeb(at: webUrl, withName: webName) + guard let cellViewModel = viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return } + delegate?.didSelectWeb(id: cellViewModel.id, at: cellViewModel.url, withName: cellViewModel.name) } func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index bf2bac7..8ec309d 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -8,8 +8,6 @@ import UIKit class BoxListViewController: BaseViewController, BaseViewControllerProtocol { - - private var viewControllerCache: [String: WebViewController] = [:] // MARK: - Life Cycle @@ -112,9 +110,8 @@ extension BoxListViewController: BoxListViewDelegate { } - func didSelectWeb(at url: URL, withName name: String) { - let urlString = url.absoluteString - if let cachedViewController = viewControllerCache[urlString] { + func didSelectWeb(id: UUID, at url: URL, withName name: String) { + if let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) { // 이미 캐시에 존재한다면, 그 인스턴스를 재사용 navigationController?.pushViewController(cachedViewController, animated: true) } else { @@ -122,7 +119,7 @@ extension BoxListViewController: BoxListViewDelegate { let viewController = WebViewController() viewController.selectedWebsite = url viewController.title = name - viewControllerCache[urlString] = viewController + WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) navigationController?.pushViewController(viewController, animated: true) } } diff --git a/iBox/Sources/Shared/WebCacheManager.swift b/iBox/Sources/Shared/WebCacheManager.swift new file mode 100644 index 0000000..a54e26b --- /dev/null +++ b/iBox/Sources/Shared/WebCacheManager.swift @@ -0,0 +1,45 @@ +// +// WebCacheManager.swift +// iBox +// +// Created by jiyeon on 3/26/24. +// + +import UIKit + +class UUIDWrapper: NSObject { + let uuid: UUID + + init(uuid: UUID) { + self.uuid = uuid + } + + override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? UUIDWrapper else { return false } + return uuid == other.uuid + } + + override var hash: Int { + return uuid.hashValue + } +} + +class WebCacheManager { + + static let shared = WebCacheManager() + + private let cache = NSCache() + + private init() {} + + func cacheData(forKey uuid: UUID, viewController: WebViewController) { + let wrapper = UUIDWrapper(uuid: uuid) + cache.setObject(viewController, forKey: wrapper) + } + + func viewControllerForKey(_ uuid: UUID) -> WebViewController? { + let wrapper = UUIDWrapper(uuid: uuid) + return cache.object(forKey: wrapper) + } + +} From 701a2b09e34f82e728bab2ffff2fc6bcd4f7f7b2 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 26 Mar 2024 20:19:04 +0900 Subject: [PATCH 152/370] fix: selectedFolder logic --- .../BoxList/AddBookmark/AddBookmarkViewController.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 13f1cb0..5412425 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -64,9 +64,11 @@ final class AddBookmarkViewController: UIViewController { private func updateSelectedFolder() { selectedFolder = UserDefaultsManager.selectedFolder - if selectedFolder == nil { + + if selectedFolder?.name == "" { selectedFolder = CoreDataManager.shared.getFolders().first } + addBookmarkView.selectedFolderName = selectedFolder?.name } From 9dafa44e230bb680f0921ae25f82a7d92a2a1c7e Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 20:55:02 +0900 Subject: [PATCH 153/370] =?UTF-8?q?=F0=9F=90=9B=20fix:=20WebView=20Progres?= =?UTF-8?q?sView=20=EC=95=88=20=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index abafb01..463e896 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -78,8 +78,7 @@ class WebView: UIView { } progressView.snp.makeConstraints { make in - make.bottom.leading.trailing.equalToSuperview() - make.height.equalTo(2) + make.top.leading.trailing.equalToSuperview() } } @@ -103,7 +102,7 @@ extension WebView: WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { progressView.setProgress(1.0, animated: true) // 약간의 딜레이를 주어서 프로그레스 바가 완전히 차도록 함 - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.progressView.isHidden = true } } From 2d7eb2a2841c732a622ca279cc0693d08e1ebad4 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 26 Mar 2024 20:58:27 +0900 Subject: [PATCH 154/370] feat: set favorite bookmark --- iBox/Sources/AppDelegate.swift | 10 ++++- iBox/Sources/BoxList/BoxListView.swift | 10 +++-- .../BoxList/BoxListViewController.swift | 1 + iBox/Sources/BoxList/BoxListViewModel.swift | 38 +++++++++++++++++-- iBox/Sources/Shared/CoreDataManager.swift | 9 +++++ iBox/Sources/Shared/UserDefaultsManager.swift | 5 +-- iBox/Sources/Shared/WebViewPreloader.swift | 20 ++++++++-- 7 files changed, 79 insertions(+), 14 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 151f061..bf06e1b 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -26,8 +26,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } private func preloadFavoriteWeb() { - let favorite = UserDefaultsManager.favorite - let favoriteUrl = favorite.url + let favoriteId = UserDefaultsManager.favoriteId + var favoriteUrl: URL? = nil + if let favoriteId { + favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) + if favoriteUrl == nil { + UserDefaultsManager.favoriteId = nil + } + } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 967479b..baeff51 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -190,12 +190,16 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { // 액션 정의 - let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: {(action, view, completionHandler) in - self.viewModel?.input.send(.setFavorite(indexPath: indexPath)) + let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: { [weak self] (action, view, completionHandler) in + self?.viewModel?.input.send(.toggleFavorite(indexPath: indexPath)) completionHandler(true) }) favoriteAction.backgroundColor = .box2 - favoriteAction.image = UIImage(systemName: "heart") + if viewModel?.isFavoriteBookmark(at: indexPath) == true { + favoriteAction.image = UIImage(systemName: "heart.fill") + } else { + favoriteAction.image = UIImage(systemName: "heart") + } let shareAction = UIContextualAction(style: .normal, title: "share", handler: {(action, view, completionHandler) in let cellViewModel = self.viewModel?.viewModel(at: indexPath) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index f0823d3..46c5376 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -84,6 +84,7 @@ extension BoxListViewController: BoxListViewDelegate { guard let newName = controller.textFields?.first?.text else { return } guard let newUrlString = controller.textFields?.last?.text, let newUrl = URL(string: newUrlString) else { return } + guard let contentView = self?.contentView as? BoxListView else { return } contentView.viewModel?.editBookmark(at: indexPath, name: newName, url: newUrl) } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index dfd5c83..fd7a820 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -15,8 +15,11 @@ class BoxListViewModel { var folders: [Folder] { boxList.map{ $0.folder } } + var sectionsToReload = Set() var isEditing = false + var favoriteId: UUID? = nil + enum Input { case toggleEditStatus @@ -24,7 +27,7 @@ class BoxListViewModel { case viewWillAppear case folderTapped(section: Int) case deleteBookmark(indexPath: IndexPath) - case setFavorite(indexPath: IndexPath) + case toggleFavorite(indexPath: IndexPath) case moveBookmark(from: IndexPath, to: IndexPath) case openFolderIfNeeded(folderIndex: Int) } @@ -50,6 +53,7 @@ class BoxListViewModel { case .viewDidLoad: let folders = CoreDataManager.shared.getFolders() boxList = folders.map{ BoxListSectionViewModel(folder: $0) } + favoriteId = UserDefaultsManager.favoriteId case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) if !sectionsToReload.isEmpty { @@ -61,8 +65,8 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) case let .deleteBookmark(indexPath): deleteBookmark(at: indexPath) - case let .setFavorite(indexPath): - print("\(viewModel(at: indexPath).name) favorite 할게용") + case let .toggleFavorite(indexPath): + toggleFavorite(at: indexPath) case .moveBookmark(from: let from, to: let to): reorderBookmark(srcIndexPath: from, destIndexPath: to) case .openFolderIfNeeded(folderIndex: let folderIndex): @@ -76,6 +80,34 @@ class BoxListViewModel { return boxList[indexPath.section].boxListCellViewModels[indexPath.row] } + func isFavoriteBookmark(at indexPath: IndexPath) -> Bool { + if let favoriteId { + if favoriteId == bookmark(at: indexPath).id { + return true + } else { return false } + } else { + return false + } + } + + private func toggleFavorite(at indexPath: IndexPath) { + let bookmark = boxList[indexPath.section].viewModel(at: indexPath.row) + if let prevId = favoriteId { + if prevId == bookmark.id { // 지금 들어온게 즐겨찾기면 지워야 + WebViewPreloader.shared.setFavoriteUrl(url: nil) + favoriteId = nil + UserDefaultsManager.favoriteId = nil + } else { + WebViewPreloader.shared.setFavoriteUrl(url: bookmark.url) + favoriteId = bookmark.id + } + } else { + WebViewPreloader.shared.setFavoriteUrl(url: bookmark.url) + favoriteId = bookmark.id + } + UserDefaultsManager.favoriteId = favoriteId + } + func bookmark(at indexPath: IndexPath) -> Bookmark { return boxList[indexPath.section].viewModel(at: indexPath.row).bookmark } diff --git a/iBox/Sources/Shared/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift index 411e516..28ef1c2 100644 --- a/iBox/Sources/Shared/CoreDataManager.swift +++ b/iBox/Sources/Shared/CoreDataManager.swift @@ -199,6 +199,15 @@ extension CoreDataManager { // 북마크 관련 extension CoreDataManager { + func getBookmarkUrl(_ bookmarkId: UUID) -> URL? { + let entity = getBookmarkEntity(id: bookmarkId) + if let entity { + return entity.url + } else { + return nil + } + } + func addBookmark(_ bookmark: Bookmark, folderId: UUID) { let context = persistentContainer.viewContext diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index 48e785d..0ef8775 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -12,8 +12,8 @@ final class UserDefaultsManager { @UserDefaultsData(key: "theme", defaultValue: Theme.system) static var theme: Theme - @UserDefaultsData(key: "favorite", defaultValue: Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!)) - static var favorite: Bookmark + @UserDefaultsData(key: "favoriteId", defaultValue: nil) + static var favoriteId: UUID? @UserDefaultsData(key: "homeTabIndex", defaultValue: 0) static var homeTabIndex: Int @@ -23,7 +23,6 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isPreload", defaultValue: false) static var isPreload: Bool - } @propertyWrapper diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 79082d6..554f159 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -12,6 +12,7 @@ class WebViewPreloader { static let shared = WebViewPreloader() private var webView: WKWebView? private var favoriteView: (url: URL, webView: WKWebView)? + private var defaultUrl = URL(string: "https://profile.intra.42.fr/")! private init() {} @@ -22,11 +23,11 @@ class WebViewPreloader { self.webView = webView } - func preloadFavoriteView(url: URL) { + func preloadFavoriteView(url: URL?) { let webView = WKWebView() webView.isOpaque = false - webView.load(URLRequest(url: url)) - favoriteView = (url, webView) + webView.load(URLRequest(url: url ?? defaultUrl)) + favoriteView = (url ?? defaultUrl, webView) } func getWebView() -> WKWebView? { @@ -45,5 +46,18 @@ class WebViewPreloader { guard let favoriteView else { return } favoriteView.webView.load(URLRequest(url: favoriteView.url)) } + + func setFavoriteUrl(url: URL?) { + if let favoriteView { + if url == favoriteView.url { + return + } else { + self.favoriteView?.url = url ?? defaultUrl + resetFavoriteView() + } + } else { + preloadFavoriteView(url: url) + } + } } From d9dc0c848ce3f856ff85fd9b9c01a0afdfb97838 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 26 Mar 2024 21:06:31 +0900 Subject: [PATCH 155/370] =?UTF-8?q?feat:=20default=20=EC=8B=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/WebViewPreloader.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 554f159..4f88167 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -49,7 +49,8 @@ class WebViewPreloader { func setFavoriteUrl(url: URL?) { if let favoriteView { - if url == favoriteView.url { + if url == favoriteView.url || + (url == nil && favoriteView.url == defaultUrl ) { return } else { self.favoriteView?.url = url ?? defaultUrl From 9404d4f5106e1c429287498cc8156d52fa8cf64d Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 21:09:55 +0900 Subject: [PATCH 156/370] =?UTF-8?q?=E2=9C=A8=20feat:=20Font=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Extension/UIFont+Extension.swift | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 iBox/Sources/Extension/UIFont+Extension.swift diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift new file mode 100644 index 0000000..3ac8380 --- /dev/null +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -0,0 +1,8 @@ +// +// UIFont+Extension.swift +// iBox +// +// Created by jiyeon on 3/26/24. +// + +import Foundation From 422c1f843e88d25dfe014039b99f8d69e0f98b77 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 21:30:55 +0900 Subject: [PATCH 157/370] =?UTF-8?q?=E2=9C=A8=20feat:=20Font=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseViewController.swift | 10 +++++----- .../BoxList/AddBookmark/AddBookmarkView.swift | 14 +++++++------- .../AddBookmark/AddBookmarkViewController.swift | 2 +- .../BoxList/AddBookmark/FolderListCell.swift | 2 +- .../BoxList/AddBookmark/FolderListView.swift | 2 +- iBox/Sources/BoxList/BoxListCell.swift | 6 ++++-- iBox/Sources/BoxList/Edit/EditCell.swift | 1 + .../EditFolder/EditFolderViewController.swift | 2 +- iBox/Sources/BoxList/FolderView.swift | 2 +- iBox/Sources/Extension/UIFont+Extension.swift | 15 ++++++++++++++- .../Settings/HomeTab/HomeTabSelectorCell.swift | 2 +- .../HomeTab/HomeTabSelectorViewController.swift | 2 +- iBox/Sources/Settings/Reset/ResetView.swift | 4 ++-- .../Settings/Reset/ResetViewController.swift | 2 +- iBox/Sources/Settings/SettingsItemCell.swift | 4 ++-- iBox/Sources/Settings/Theme/ThemeCell.swift | 2 +- .../Settings/Theme/ThemeViewController.swift | 2 +- 17 files changed, 45 insertions(+), 29 deletions(-) diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index 48ab64b..49548d7 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -25,7 +25,7 @@ class BaseViewController: UIViewController { let backgroundColor: UIColor = .backgroundColor let tintColor: UIColor = .label - let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) + let titleFont: UIFont = .titleFont // MARK: - UI Components @@ -34,16 +34,16 @@ class BaseViewController: UIViewController { let navigationBar = NavigationBar().then { $0.backButton.configuration = .plain() $0.backButton.configuration?.image = UIImage(systemName: "chevron.left") - $0.backButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.backButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.addButton.configuration = .plain() $0.addButton.configuration?.image = UIImage(systemName: "plus") - $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.moreButton.configuration = .plain() $0.moreButton.configuration?.image = UIImage(systemName: "ellipsis.circle") - $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.doneButton.configuration = .plain() $0.doneButton.configuration?.baseForegroundColor = .label - $0.doneButton.configuration?.attributedTitle = AttributedString("완료", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18, weight: .semibold)])) + $0.doneButton.configuration?.attributedTitle = AttributedString("완료", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.semiboldLabelFont])) } let contentView: UIView = View() diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index d042b30..9bc6fd1 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -30,7 +30,7 @@ class AddBookmarkView: UIView { private let nameTextViewPlaceHolder = UILabel().then { $0.text = "북마크 이름" - $0.font = UIFont.systemFont(ofSize: 18) + $0.font = .cellTitleFont $0.textColor = .systemGray3 } @@ -38,7 +38,7 @@ class AddBookmarkView: UIView { $0.backgroundColor = .clear $0.layer.borderWidth = 0 $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - $0.font = UIFont.systemFont(ofSize: 16) + $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true } @@ -49,7 +49,7 @@ class AddBookmarkView: UIView { private let urlTextViewPlaceHolder = UILabel().then { $0.text = "URL" - $0.font = UIFont.systemFont(ofSize: 18) + $0.font = .cellTitleFont $0.textColor = .systemGray3 } @@ -57,7 +57,7 @@ class AddBookmarkView: UIView { $0.backgroundColor = .clear $0.layer.borderWidth = 0 $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - $0.font = UIFont.systemFont(ofSize: 16) + $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true } @@ -66,18 +66,18 @@ class AddBookmarkView: UIView { $0.backgroundColor = UIColor.backgroundColor $0.layer.cornerRadius = 10 $0.clipsToBounds = true - $0.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) + $0.titleLabel?.font = .cellTitleFont $0.isEnabled = true } private let buttonLabel = UILabel().then { $0.text = "목록" - $0.font = UIFont.systemFont(ofSize: 17) + $0.font = .cellTitleFont $0.textColor = .label } let selectedFolderLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 17) + $0.font = .descriptionFont $0.textColor = .systemGray $0.textAlignment = .right } diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 5412425..07e46bb 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -45,7 +45,7 @@ final class AddBookmarkViewController: UIViewController { navigationItem.rightBarButtonItem?.isEnabled = false let attributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.boldSystemFont(ofSize: 17) + .font: UIFont.semiboldLabelFont ] navigationItem.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index c955d35..e77e200 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -21,7 +21,7 @@ class FolderListCell: UITableViewCell { let folderNameLabel = UILabel().then { $0.textColor = .label - $0.font = .systemFont(ofSize: 17, weight: .regular) + $0.font = .cellTitleFont } private let checkImageView = UIImageView().then { diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index e325ffd..9bc0aad 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -17,7 +17,7 @@ class FolderListView: UIView { private let infoLabel = UILabel().then { $0.text = "새로운 북마크를 추가할 폴더를 선택해주세요." - $0.font = UIFont.boldSystemFont(ofSize: 17) + $0.font = .semiboldLabelFont $0.textColor = .label $0.textAlignment = .center } diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index 2c72874..a52416d 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -24,7 +24,9 @@ class BoxListCell: UITableViewCell { $0.contentMode = .scaleAspectFit } - private let label = UILabel() + private let label = UILabel().then { + $0.font = .cellTitleFont + } private let editButton = UIButton().then{ $0.configuration = .plain() @@ -79,7 +81,7 @@ class BoxListCell: UITableViewCell { cellImageView.snp.makeConstraints { make in make.leading.equalToSuperview().inset(20) make.top.bottom.equalToSuperview().inset(10) - make.width.equalTo(30) + make.width.equalTo(25) } label.snp.makeConstraints { make in diff --git a/iBox/Sources/BoxList/Edit/EditCell.swift b/iBox/Sources/BoxList/Edit/EditCell.swift index 8bfeeaa..9bb7e56 100644 --- a/iBox/Sources/BoxList/Edit/EditCell.swift +++ b/iBox/Sources/BoxList/Edit/EditCell.swift @@ -20,6 +20,7 @@ class EditCell: UITableViewCell { } private let titleLabel = UILabel().then { + $0.font = .cellTitleFont $0.textColor = .label } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index ced97c4..e72e106 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -44,7 +44,7 @@ class EditFolderViewController: BaseViewController, BaseViewCont func setupNavigationBar() { setNavigationBarTitleLabelText("폴더 관리") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.semiboldLabelFont) setNavigationBarAddButtonHidden(false) setNavigationBarBackButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) diff --git a/iBox/Sources/BoxList/FolderView.swift b/iBox/Sources/BoxList/FolderView.swift index 51cfb7d..72a43dc 100644 --- a/iBox/Sources/BoxList/FolderView.swift +++ b/iBox/Sources/BoxList/FolderView.swift @@ -16,7 +16,7 @@ class FolderView: UIView { private let folderNameLabel = UILabel().then { $0.textColor = .label - $0.font = .systemFont(ofSize: 18, weight: .semibold) + $0.font = .boldLabelFont } init() { diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift index 3ac8380..7cf7a00 100644 --- a/iBox/Sources/Extension/UIFont+Extension.swift +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -5,4 +5,17 @@ // Created by jiyeon on 3/26/24. // -import Foundation +import UIKit + +extension UIFont { + + static let titleFont = UIFont.systemFont(ofSize: 20.0, weight: .bold) + static let subTitlefont = UIFont.systemFont(ofSize: 17.0, weight: .semibold) + static let lableFont = UIFont.systemFont(ofSize: 16.0) + static let semiboldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .semibold) + static let boldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .bold) + static let cellTitleFont = UIFont.systemFont(ofSize: 16.0) + static let cellDescriptionFont = UIFont.systemFont(ofSize: 13.0, weight: .regular) + static let descriptionFont = UIFont.systemFont(ofSize: 14.0) + +} diff --git a/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift index 4364834..f22df25 100644 --- a/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift +++ b/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift @@ -16,7 +16,7 @@ class HomeTabSelectorCell: UITableViewCell { // MARK: - UI Components let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let selectButton = UIButton().then { diff --git a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift index d2c60c6..f98defb 100644 --- a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift +++ b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift @@ -25,7 +25,7 @@ class HomeTabSelectorViewController: BaseViewController, Ba func setupNavigationBar() { setNavigationBarTitleLabelText("홈화면 설정하기") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } diff --git a/iBox/Sources/Settings/Reset/ResetView.swift b/iBox/Sources/Settings/Reset/ResetView.swift index 9f18044..41ae9e0 100644 --- a/iBox/Sources/Settings/Reset/ResetView.swift +++ b/iBox/Sources/Settings/Reset/ResetView.swift @@ -18,12 +18,12 @@ class ResetView: UIView { let label = UILabel().then { $0.text = "경고: 이 작업을 진행하면 저장하신 모든 폴더 및 북마크 정보가 영구적으로 삭제되고 기본값으로 초기화됩니다. 진행하기 전에 중요한 정보가 없는지 다시 한번 확인해 주시기 바랍니다." $0.numberOfLines = 0 - $0.font = .systemFont(ofSize: 15) + $0.font = .descriptionFont } let resetButton = UIButton().then { $0.configuration = .plain() - $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.boldSystemFont(ofSize: 15)])) + $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.descriptionFont])) $0.tintColor = .white $0.backgroundColor = .box $0.clipsToBounds = true diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index d593220..0ecd944 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -27,7 +27,7 @@ class ResetViewController: BaseViewController, BaseViewControllerProt func setupNavigationBar() { setNavigationBarTitleLabelText("데이터 초기화") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } diff --git a/iBox/Sources/Settings/SettingsItemCell.swift b/iBox/Sources/Settings/SettingsItemCell.swift index b60df42..0499b84 100644 --- a/iBox/Sources/Settings/SettingsItemCell.swift +++ b/iBox/Sources/Settings/SettingsItemCell.swift @@ -17,11 +17,11 @@ class SettingsItemCell: UITableViewCell { // MARK: - UI Components let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let descriptionLabel = UILabel().then { - $0.font = .systemFont(ofSize: 13, weight: .regular) + $0.font = .cellDescriptionFont $0.textColor = .gray } diff --git a/iBox/Sources/Settings/Theme/ThemeCell.swift b/iBox/Sources/Settings/Theme/ThemeCell.swift index 653aca1..4a4c9fe 100644 --- a/iBox/Sources/Settings/Theme/ThemeCell.swift +++ b/iBox/Sources/Settings/Theme/ThemeCell.swift @@ -18,7 +18,7 @@ class ThemeCell: UITableViewCell { } let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let selectButton = UIButton().then { diff --git a/iBox/Sources/Settings/Theme/ThemeViewController.swift b/iBox/Sources/Settings/Theme/ThemeViewController.swift index ac645c8..463805f 100644 --- a/iBox/Sources/Settings/Theme/ThemeViewController.swift +++ b/iBox/Sources/Settings/Theme/ThemeViewController.swift @@ -25,7 +25,7 @@ class ThemeViewController: BaseViewController, BaseViewControllerProt func setupNavigationBar() { setNavigationBarTitleLabelText("다크 모드 설정") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } From 394a35cd66148c2048a5c6f06559421c989ba768 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 28 Mar 2024 14:41:07 +0900 Subject: [PATCH 158/370] feat: reset data --- iBox/Sources/BoxList/BoxListView.swift | 13 ++++++ .../Settings/Reset/ResetViewController.swift | 44 ++++++++++++++++--- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index baeff51..7b3c2cf 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -52,12 +52,17 @@ class BoxListView: UIView { setupLayout() configureDataSource() bindViewModel() + subscribeToNotifications() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + deinit { + NotificationCenter.default.removeObserver(self) + } + // MARK: - Setup Methods private func setupProperty() { @@ -141,6 +146,14 @@ class BoxListView: UIView { }.store(in: &cancellables) } + private func subscribeToNotifications() { + NotificationCenter.default.addObserver(self, selector: #selector(dataDidReset), name: .didResetData, object: nil) + } + + @objc func dataDidReset(notification: NSNotification) { + viewModel?.input.send(.viewDidLoad) + } + } extension BoxListView: UITableViewDelegate { diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index d593220..dfa30af 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -37,22 +37,56 @@ extension ResetViewController: ResetViewDelegate { func showAlert() { let alertController = UIAlertController(title: "경고", message: "이 작업은 되돌릴 수 없습니다. 계속하려면 \"iBox\"라고 입력해 주세요.", preferredStyle: .alert) - alertController.addTextField() let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) alertController.addAction(cancelAction) - let confirmAction = UIAlertAction(title: "확인", style: .default) { _ in + let confirmAction = UIAlertAction(title: "확인", style: .default) { [weak self] _ in if let textField = alertController.textFields?.first, let text = textField.text, text == "iBox" { - print("정말로 초기화를 해버렷당") - self.navigationController?.popViewController(animated: true) + self?.resetData() + self?.navigationController?.popViewController(animated: true) } else { - self.showAlert() + self?.showAlert() } } + confirmAction.isEnabled = false alertController.addAction(confirmAction) + alertController.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let isTextMatch = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "iBox" + + confirmAction.isEnabled = isTextMatch + }) + + } + self.present(alertController, animated: true, completion: nil) } + private func resetData() { + let defaultData = [ + Folder(id: UUID(), name: "42 폴더", bookmarks: [ + Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), + Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), + Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), + Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), + Bookmark(id: UUID(), name: "Cabi", url: URL(string: "https://cabi.42seoul.io/")!), + Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) + ]) + ] + CoreDataManager.shared.deleteAllFolders() + CoreDataManager.shared.addInitialFolders(defaultData) + UserDefaultsManager.isDefaultDataInserted = true + + UserDefaultsManager.favoriteId = nil + WebViewPreloader.shared.setFavoriteUrl(url: nil) + NotificationCenter.default.post(name: .didResetData, object: nil) + } + +} + +extension Notification.Name { + static let didResetData = Notification.Name("didResetData") } From 1903a2a745e413c6298f862a1ae4908a09a96e21 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 28 Mar 2024 16:03:25 +0900 Subject: [PATCH 159/370] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=EB=B7=B0=20Back=20Swipe=20Gesture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseViewController.swift | 14 +++++++++++++- iBox/Sources/Settings/SettingsViewController.swift | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index 48ab64b..445ff64 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -21,7 +21,7 @@ protocol BaseViewControllerProtocol { func setupNavigationBar() } -class BaseViewController: UIViewController { +class BaseViewController: UIViewController, UIGestureRecognizerDelegate { let backgroundColor: UIColor = .backgroundColor let tintColor: UIColor = .label @@ -220,10 +220,22 @@ class BaseViewController: UIViewController { navigationBar.titleLabel.textColor = color } + func enablePopGesture() { + navigationController?.interactivePopGestureRecognizer?.delegate = self + } + // MARK: - Action Functions @objc func backButtonTapped() { navigationController?.popViewController(animated: true) } + // MARK: - UIGestureRecognizerDelegate + + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + guard let navigationController = navigationController else { return false } + // Navigation Stack에 쌓인 뷰가 1개를 초과할 때 스와이프 제스처 허용 + return navigationController.viewControllers.count > 1 + } + } diff --git a/iBox/Sources/Settings/SettingsViewController.swift b/iBox/Sources/Settings/SettingsViewController.swift index bd753ad..7af6017 100644 --- a/iBox/Sources/Settings/SettingsViewController.swift +++ b/iBox/Sources/Settings/SettingsViewController.swift @@ -36,6 +36,7 @@ final class SettingsViewController: BaseViewController, BaseViewCo func setupNavigationBar() { setNavigationBarTitleLabelText("설정") + enablePopGesture() } } From 9e119fbfc98a25a22bee33543463536d38e96ab1 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 28 Mar 2024 17:32:19 +0900 Subject: [PATCH 160/370] =?UTF-8?q?=F0=9F=90=9B=20fix:=20=ED=81=B4?= =?UTF-8?q?=EB=A1=9C=EC=A0=80=20=EB=82=B4=EB=B6=80=EC=97=90=EC=84=9C=20sel?= =?UTF-8?q?f,=20cell=EC=9D=84=20=EC=95=BD=ED=95=9C=20=EC=B0=B8=EC=A1=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=BA=A1=EC=B3=90=ED=95=98=EC=97=AC=20=EB=A9=94?= =?UTF-8?q?=EB=AA=A8=EB=A6=AC=20=EB=88=84=EC=88=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AppDelegate.swift | 4 ++-- iBox/Sources/BoxList/BoxListView.swift | 8 ++++---- iBox/Sources/BoxList/BoxListViewController.swift | 2 +- iBox/Sources/BoxList/EditFolder/EditFolderCell.swift | 7 ++++++- iBox/Sources/BoxList/EditFolder/EditFolderView.swift | 8 ++++---- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index bf06e1b..77ca7d3 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -14,8 +14,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - Task { - preloadFavoriteWeb() + Task { [weak self] in + self?.preloadFavoriteWeb() } versioningHandler.checkAppVersion { result in diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7b3c2cf..d96d5bb 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -94,14 +94,14 @@ class BoxListView: UIView { guard let cell = tableView.dequeueReusableCell(withIdentifier: BoxListCell.reuseIdentifier, for: indexPath) as? BoxListCell else { fatalError() } cell.setEditButtonHidden(!viewModel.isEditing) cell.bindViewModel(viewModel.viewModel(at: indexPath)) - cell.onDelete = { [weak self] in - guard let self else { return } + cell.onDelete = { [weak self, weak cell] in + guard let self = self, let cell = cell else { return } if let currentIndexPath = self.tableView.indexPath(for: cell) { self.viewModel?.deleteBookmark(at: currentIndexPath) } } - cell.onEdit = { [weak self] in - guard let self else { return } + cell.onEdit = { [weak self, weak cell] in + guard let self = self, let cell = cell else { return } if let currentIndexPath = self.tableView.indexPath(for: cell) { self.delegate?.presentEditBookmarkController(at: currentIndexPath) } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 46c5376..c2f086f 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -80,7 +80,7 @@ extension BoxListViewController: BoxListViewDelegate { let controller = UIAlertController(title: "북마크 편집", message: nil, preferredStyle: .alert) let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } - let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in + let okAction = UIAlertAction(title: "확인", style: .default) { action in guard let newName = controller.textFields?.first?.text else { return } guard let newUrlString = controller.textFields?.last?.text, let newUrl = URL(string: newUrlString) else { return } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift index 4757e3c..8631712 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift @@ -22,7 +22,7 @@ class EditFolderCell: UITableViewCell { $0.showsMenuAsPrimaryAction = true } - private lazy var nameEditAction = UIAction(title: "이름 변경", image: UIImage(systemName: "pencil")) {[weak self] _ in + private lazy var nameEditAction = UIAction(title: "이름 변경", image: UIImage(systemName: "pencil")) { [weak self] _ in self?.onEdit?() } @@ -42,6 +42,11 @@ class EditFolderCell: UITableViewCell { fatalError("init(coder:) has not been implemented") } + override func prepareForReuse() { + onEdit = nil + onDelete = nil + } + private func setupProperty() { backgroundColor = .tableViewBackgroundColor selectionStyle = .none diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift index 409f585..554baa6 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderView.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderView.swift @@ -90,14 +90,14 @@ extension EditFolderView: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let viewModel else { fatalError() } guard let cell = tableView.dequeueReusableCell(withIdentifier: EditFolderCell.reuserIdentifier, for: indexPath) as? EditFolderCell else { fatalError() } - cell.onDelete = { [weak self] in - guard let self else { return } + cell.onDelete = { [weak self, weak cell] in + guard let self = self, let cell = cell else { return } if let currentIndexPath = self.tableView.indexPath(for: cell) { self.delegate?.deleteFolder(at: currentIndexPath) } } - cell.onEdit = { [weak self] in - guard let self else { return } + cell.onEdit = { [weak self, weak cell] in + guard let self = self, let cell = cell else { return } if let currentIndexPath = self.tableView.indexPath(for: cell) { self.editFolderName(at: currentIndexPath) } From 56bdc6ca2e21879e4ad250b46e63b3713460ad09 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 28 Mar 2024 20:00:01 +0900 Subject: [PATCH 161/370] =?UTF-8?q?refactor=20=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/FolderListView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index e325ffd..72526c9 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -24,7 +24,6 @@ class FolderListView: UIView { private let tableView = UITableView().then { $0.backgroundColor = .clear - $0.translatesAutoresizingMaskIntoConstraints = false } private lazy var stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]).then { From ff7c6b3a89db392ddc0eab07fe9f61d54733baaf Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 28 Mar 2024 22:32:20 +0900 Subject: [PATCH 162/370] fix: move folder error --- iBox/Sources/BoxList/BoxListView.swift | 2 +- iBox/Sources/BoxList/BoxListViewModel.swift | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7b3c2cf..c9d4222 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -137,7 +137,7 @@ class BoxListView: UIView { case .reloadSections(idArray: let idArray): guard var snapshot = self?.boxListDataSource.snapshot() else { return } snapshot.reloadSections(idArray) - self?.boxListDataSource.apply(snapshot) + self?.boxListDataSource.apply(snapshot, animatingDifferences: false) case .reloadRows(idArray: let idArray): guard var snapshot = self?.boxListDataSource.snapshot() else { return } snapshot.reloadItems(idArray) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index fd7a820..02e3411 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -160,6 +160,9 @@ class BoxListViewModel { func moveFolder(from: Int, to: Int) { let mover = boxList.remove(at: from) boxList.insert(mover, at: to) + for box in boxList { + sectionsToReload.update(with: box.id) + } } } From 76ff827c3dfccb990373c44af29b73aba6b0cf61 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 28 Mar 2024 23:29:47 +0900 Subject: [PATCH 163/370] =?UTF-8?q?refactor=20=20:=20URLdecoder=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 튜플 리턴 타입으로 변경 --- iBox/Sources/Shared/URLdecoder.swift | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/iBox/Sources/Shared/URLdecoder.swift b/iBox/Sources/Shared/URLdecoder.swift index bf6e2b7..31a7b2f 100644 --- a/iBox/Sources/Shared/URLdecoder.swift +++ b/iBox/Sources/Shared/URLdecoder.swift @@ -8,17 +8,13 @@ import Foundation class URLdecoder { + static func handleCustomURL(_ url: URL) -> (title: String?, data: String?, faviconUrl: String?) { + guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return (nil, nil, nil) } - static func handleCustomURL(_ url: URL) { - guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return } - - let title = urlComponents.queryItems?.first(where: { $0.name == "title" })?.value - let data = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value - let faviconUrl = urlComponents.queryItems?.first(where: { $0.name == "faviconUrl" })?.value - - print("Title: \(title ?? "N/A")") - print("Data URL: \(data ?? "N/A")") - print("Favicon URL: \(faviconUrl ?? "N/A")") - } + let title = urlComponents.queryItems?.first(where: { $0.name == "title" })?.value + let data = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value + let faviconUrl = urlComponents.queryItems?.first(where: { $0.name == "faviconUrl" })?.value + return (title, data, faviconUrl) + } } From 57f38d2b12afc20d741be6244b43d59a54c93e91 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 28 Mar 2024 23:31:20 +0900 Subject: [PATCH 164/370] refactor : Refactor GlobalURLManager to URLDataManager - Add update method that takes a tuple as an argument --- iBox/Sources/Shared/GlobalURLManager.swift | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Shared/GlobalURLManager.swift b/iBox/Sources/Shared/GlobalURLManager.swift index 72f0e21..b0bea7b 100644 --- a/iBox/Sources/Shared/GlobalURLManager.swift +++ b/iBox/Sources/Shared/GlobalURLManager.swift @@ -7,10 +7,18 @@ import Foundation -class GlobalURLManager { - static let shared = GlobalURLManager() - - var incomingURL: URL? +class URLDataManager { + static let shared = URLDataManager() + + var incomingTitle: String? + var incomingData: String? + var incomingFaviconUrl: String? private init() {} + + func update(with data: (title: String?, data: String?, faviconUrl: String?)) { + incomingTitle = data.title + incomingData = data.data + incomingFaviconUrl = data.faviconUrl + } } From b1121292da577db8275bd83615fa9d7acaf98fce Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 28 Mar 2024 23:35:42 +0900 Subject: [PATCH 165/370] refactor : Update URL handling in SceneDelegate - Manage urlData through URLdecoder and URLDataManager --- iBox/Sources/SceneDelegate.swift | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 7824184..ccaebae 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -28,11 +28,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { if let urlContext = connectionOptions.urlContexts.first { let url = urlContext.url guard url.scheme == "iBox" else { return } - - print("Opened URL: \(url)") - // URLdecoder.handleCustomURL(url) - GlobalURLManager.shared.incomingURL = url + let urlData = URLdecoder.handleCustomURL(url) + URLDataManager.shared.update(with: urlData) if let windowScene = scene as? UIWindowScene, let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { @@ -71,10 +69,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let url = urlContext.url guard url.scheme == "iBox" else { return } - print("Opened URL: \(url)") - // 앱 실행 중에 url이 들어오는 경우 Logic - // URLdecoder.handleCustomURL(url) - GlobalURLManager.shared.incomingURL = url + let urlData = URLdecoder.handleCustomURL(url) + URLDataManager.shared.update(with: urlData) if let windowScene = scene as? UIWindowScene, let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { From 88219581ba6973931a6e33a6e8217614905dfbda Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 28 Mar 2024 23:41:23 +0900 Subject: [PATCH 166/370] refactor : Refactor function name to updateTextFieldWithIncomingData - from `updateTextFieldWithIncomingURL` to `updateTextFieldWithIncomingData` --- .../BoxList/AddBookmark/AddBookmarkView.swift | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index d042b30..c9dd6ba 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -106,7 +106,7 @@ class AddBookmarkView: UIView { private func setupProperty() { backgroundColor = .systemGroupedBackground - updateTextFieldWithIncomingURL() + updateTextFieldWithIncomingData() button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) nameTextView.delegate = self urlTextView.delegate = self @@ -194,16 +194,22 @@ class AddBookmarkView: UIView { } - private func updateTextFieldWithIncomingURL() { - if let incomingURL = GlobalURLManager.shared.incomingURL?.absoluteString, !incomingURL.isEmpty { - urlTextView.text = incomingURL - urlTextViewPlaceHolder.isHidden = true + private func updateTextField(textField: UITextView, placeholder: UILabel, withData data: String?) { + if let data = data, !data.isEmpty { + textField.text = data + placeholder.isHidden = true } else { - urlTextView.text = "" - urlTextViewPlaceHolder.isHidden = false + textField.text = "" + placeholder.isHidden = false } - - GlobalURLManager.shared.incomingURL = nil + } + + private func updateTextFieldWithIncomingData() { + updateTextField(textField: nameTextView, placeholder: nameTextViewPlaceHolder, withData: URLDataManager.shared.incomingTitle) + URLDataManager.shared.incomingTitle = nil + + updateTextField(textField: urlTextView, placeholder: urlTextViewPlaceHolder, withData: URLDataManager.shared.incomingData) + URLDataManager.shared.incomingData = nil } @objc private func buttonTapped() { From 4e2c053914a3b15d0e406dff541f5511a6a9ff45 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Fri, 29 Mar 2024 00:35:24 +0900 Subject: [PATCH 167/370] =?UTF-8?q?feat=09=20=20=20=20:=20ShareExtension?= =?UTF-8?q?=20=EC=8B=9C=20'=EC=B6=94=EA=B0=80'=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - view가 그려질 때 마다 updateTextFieldsFilledState를 호출하여 '추가'버튼 상태 업데이트 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 5 +++++ .../BoxList/AddBookmark/AddBookmarkViewController.swift | 1 + 2 files changed, 6 insertions(+) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index c9dd6ba..944e27a 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -212,6 +212,11 @@ class AddBookmarkView: UIView { URLDataManager.shared.incomingData = nil } + func updateTextFieldsFilledState() { + let isBothTextViewsFilled = !(nameTextView.text?.isEmpty ?? true) && !(urlTextView.text?.isEmpty ?? true) + onTextChange?(isBothTextViewsFilled) + } + @objc private func buttonTapped() { onButtonTapped?() } diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 5412425..a9005db 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -22,6 +22,7 @@ final class AddBookmarkViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) updateSelectedFolder() + addBookmarkView.updateTextFieldsFilledState() } override func viewDidLoad() { From f6cd9274924091efb757b7249f86cc77fc88f9f0 Mon Sep 17 00:00:00 2001 From: JH713 Date: Fri, 29 Mar 2024 02:18:41 +0900 Subject: [PATCH 168/370] feat: add bookmark and folder in main view --- .../BoxList/AddBookmark/AddBookmarkView.swift | 1 - .../AddBookmarkViewController.swift | 115 +++++++++--------- .../BoxList/AddBookmark/FolderListView.swift | 21 ++-- .../FolderListViewController.swift | 79 ++++++++++-- .../BoxList/BoxListViewController.swift | 18 +++ iBox/Sources/BoxList/BoxListViewModel.swift | 11 ++ iBox/Sources/Shared/UserDefaultsManager.swift | 4 +- 7 files changed, 171 insertions(+), 78 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 9bc6fd1..aaafe67 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -181,7 +181,6 @@ class AddBookmarkView: UIView { selectedFolderLabel.snp.makeConstraints { make in make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(100) make.height.equalTo(40) } diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 07e46bb..4199e98 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -7,26 +7,30 @@ import UIKit +protocol AddBookmarkViewControllerProtocol: AnyObject { + func addFolderDirect(_ folder: Folder) + func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) +} + final class AddBookmarkViewController: UIViewController { + weak var delegate: AddBookmarkViewControllerProtocol? + var haveValidInput = false var selectedFolder: Folder? - private let coreDataManager = CoreDataManager.shared + var selectedFolderIndex: Int? + var folders = [Folder]() + private let addBookmarkView = AddBookmarkView() - override func loadView() { super.loadView() setupAddBookmarkView() } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - updateSelectedFolder() - } override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() + updateSelectedFolder() } private func setupNavigationBar() { @@ -57,19 +61,39 @@ final class AddBookmarkViewController: UIViewController { self?.openFolderSelection() } addBookmarkView.onTextChange = { [weak self] isEnabled in - self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled + self?.haveValidInput = isEnabled + + if let haveValidInput = self?.haveValidInput, + haveValidInput, + let _ = self?.selectedFolder { + self?.navigationItem.rightBarButtonItem?.isEnabled = true + } else { + self?.navigationItem.rightBarButtonItem?.isEnabled = false + } } view = addBookmarkView } private func updateSelectedFolder() { - selectedFolder = UserDefaultsManager.selectedFolder + let selectedFolderId = UserDefaultsManager.selectedFolderId - if selectedFolder?.name == "" { - selectedFolder = CoreDataManager.shared.getFolders().first + for (index, folder) in folders.enumerated() { + if folder.id == selectedFolderId { + selectedFolder = folder + selectedFolderIndex = index + } } - addBookmarkView.selectedFolderName = selectedFolder?.name + if selectedFolder == nil && !folders.isEmpty { + selectedFolder = folders[0] + selectedFolderIndex = 0 + } + + if let selectedFolder { + addBookmarkView.selectedFolderName = selectedFolder.name + } else { + addBookmarkView.selectedFolderName = "선택된 폴더가 없습니다." + } } @objc private func cancelButtonTapped() { @@ -105,9 +129,10 @@ final class AddBookmarkViewController: UIViewController { let newBookmark = Bookmark(id: UUID(), name: name, url: url) - if let selectedFolder = selectedFolder { - coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) - print("북마크 저장 완료: \(newBookmark.name)") + if let selectedFolder = selectedFolder, + let selectedFolderIndex = selectedFolderIndex { + CoreDataManager.shared.addBookmark(newBookmark, folderId: selectedFolder.id) + delegate?.addBookmarkDirect(newBookmark, at: selectedFolderIndex) } else { print("선택된 폴더가 없습니다.") } @@ -116,57 +141,29 @@ final class AddBookmarkViewController: UIViewController { } private func openFolderSelection() { - let folderListViewController = FolderListViewController() + let folderListViewController = FolderListViewController(folders: folders, selectedId: selectedFolder?.id) folderListViewController.title = "목록" - - let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolderAction)) - folderListViewController.navigationItem.rightBarButtonItem = addButton + folderListViewController.delegate = self navigationController?.pushViewController(folderListViewController, animated: true) } - @objc func addFolderAction() { - let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) - - controller.addTextField { textField in - textField.placeholder = "폴더 이름" - textField.autocorrectionType = .no - textField.spellCheckingType = .no - } - - let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) - let addAction = UIAlertAction(title: "추가", style: .default) { [unowned controller, weak self] _ in - guard let textField = controller.textFields?.first, - let folderName = textField.text, !folderName.trimmingCharacters(in: .whitespaces).isEmpty else { - return - } - - let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) - self?.coreDataManager.addFolder(newFolder) - - self?.updateFolderList() - } - - controller.addAction(cancelAction) - controller.addAction(addAction) +} + +extension AddBookmarkViewController: FolderListViewControllerDelegate { + func addFolder(_ folder: Folder) { + delegate?.addFolderDirect(folder) + } + + func selectFolder(_ folder: Folder, at index: Int) { + selectedFolder = folder + selectedFolderIndex = index - NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: controller.textFields?.first, queue: .main) { notification in - if let textField = notification.object as? UITextField, - let text = textField.text, !text.trimmingCharacters(in: .whitespaces).isEmpty { - addAction.isEnabled = true - } else { - addAction.isEnabled = false - } + if haveValidInput { + navigationItem.rightBarButtonItem?.isEnabled = true } - addAction.isEnabled = false - - present(controller, animated: true) - } - - func updateFolderList() { - if let folderListVC = navigationController?.viewControllers.first(where: { $0 is FolderListViewController }) as? FolderListViewController { - folderListVC.folderListView.reloadFolderList() - } + addBookmarkView.selectedFolderName = selectedFolder?.name } + } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 9bc0aad..77edf93 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -7,11 +7,16 @@ import UIKit +protocol FolderListViewDelegate: AnyObject { + func selectFolder(_ folder: Folder, at index: Int) +} + class FolderListView: UIView { + weak var delegate: FolderListViewDelegate? let coreDataManager = CoreDataManager.shared var folders: [Folder] = [] - var onFolderSelected: ((Folder) -> Void)? + var selectedFolderId: UUID? // MARK: - UI Components @@ -24,10 +29,9 @@ class FolderListView: UIView { private let tableView = UITableView().then { $0.backgroundColor = .clear - $0.translatesAutoresizingMaskIntoConstraints = false } - private lazy var stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]).then { + private let stackView = UIStackView().then { $0.axis = .vertical $0.spacing = 20 } @@ -63,18 +67,18 @@ class FolderListView: UIView { make.leading.equalTo(self.snp.leading) make.trailing.equalTo(self.snp.trailing) } + + stackView.addArrangedSubview(infoLabel) + stackView.addArrangedSubview(tableView) } func setupTableView() { self.tableView.dataSource = self self.tableView.delegate = self self.tableView.register(FolderListCell.self, forCellReuseIdentifier: FolderListCell.reuseIdentifier) - - folders = coreDataManager.getFolders() } func reloadFolderList() { - folders = coreDataManager.getFolders() tableView.reloadData() } } @@ -88,7 +92,7 @@ extension FolderListView: UITableViewDataSource { let cell = tableView.dequeueReusableCell(withIdentifier: FolderListCell.reuseIdentifier, for: indexPath) as! FolderListCell let folder = folders[indexPath.row] - let isSelectedFolder = UserDefaultsManager.selectedFolder.id == folder.id + let isSelectedFolder = selectedFolderId == folder.id cell.configureWith(folder: folder, isSelected: isSelectedFolder) return cell @@ -98,6 +102,7 @@ extension FolderListView: UITableViewDataSource { extension FolderListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedFolder = folders[indexPath.row] - onFolderSelected?(selectedFolder) + UserDefaultsManager.selectedFolderId = selectedFolder.id + delegate?.selectFolder(selectedFolder, at: indexPath.row) } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index bbccafa..3fd25c3 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -7,8 +7,24 @@ import UIKit +protocol FolderListViewControllerDelegate: AnyObject { + func selectFolder(_ folder: Folder, at index: Int) + func addFolder(_ folder: Folder) +} + class FolderListViewController: UIViewController { + weak var delegate: FolderListViewControllerDelegate? + let folderListView = FolderListView() + + init(folders: [Folder], selectedId: UUID?) { + super.init(nibName: nil, bundle: nil) + setupFolderListView(folders, selectedId: selectedId) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } override func loadView() { view = folderListView @@ -17,16 +33,63 @@ class FolderListViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - folderListView.onFolderSelected = { [weak self] folder in - - guard let self = self else { return } + setupNavigationBar() + } + + private func setupNavigationBar() { + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolder)) + navigationItem.rightBarButtonItem = addButton + } + + @objc private func addFolder() { + let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) + + controller.addTextField { textField in + textField.placeholder = "폴더 이름" + textField.autocorrectionType = .no + textField.spellCheckingType = .no + } + + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + let addAction = UIAlertAction(title: "추가", style: .default) { [unowned controller, weak self] _ in + guard let textField = controller.textFields?.first, + let folderName = textField.text, !folderName.trimmingCharacters(in: .whitespaces).isEmpty else { return } - if let addBookmarkVC = self.navigationController?.viewControllers.first as? AddBookmarkViewController { - addBookmarkVC.selectedFolder = folder - UserDefaultsManager.selectedFolder = folder - - self.navigationController?.popViewController(animated: true) + let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) + CoreDataManager.shared.addFolder(newFolder) + self?.folderListView.folders.append(newFolder) + self?.folderListView.reloadFolderList() + self?.delegate?.addFolder(newFolder) + } + + controller.addAction(cancelAction) + controller.addAction(addAction) + + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: controller.textFields?.first, queue: .main) { notification in + if let textField = notification.object as? UITextField, + let text = textField.text, !text.trimmingCharacters(in: .whitespaces).isEmpty { + addAction.isEnabled = true + } else { + addAction.isEnabled = false } } + + addAction.isEnabled = false + + present(controller, animated: true) + } + + private func setupFolderListView(_ folders: [Folder], selectedId: UUID?) { + folderListView.delegate = self + folderListView.folders = folders + folderListView.selectedFolderId = selectedId + } +} + +extension FolderListViewController: FolderListViewDelegate { + func selectFolder(_ folder: Folder, at index: Int) { + delegate?.selectFolder(folder, at: index) + self.navigationController?.popViewController(animated: true) } + } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 46c5376..04f3506 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -51,7 +51,12 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - Action Functions @objc private func addButtonTapped() { + guard let contentView = contentView as? BoxListView else { return } + let addBookmarkViewController = AddBookmarkViewController() + addBookmarkViewController.delegate = self + addBookmarkViewController.folders = contentView.viewModel?.folders ?? [] + let navigationController = UINavigationController(rootViewController: addBookmarkViewController) navigationController.modalPresentationStyle = .pageSheet @@ -73,6 +78,19 @@ class BoxListViewController: BaseViewController, BaseViewController } +extension BoxListViewController: AddBookmarkViewControllerProtocol { + func addFolderDirect(_ folder: Folder) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.addFolderDirect(folder) + } + + func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.addBookmarkDirect(bookmark, at: folderIndex) + } + +} + extension BoxListViewController: BoxListViewDelegate { func presentEditBookmarkController(at indexPath: IndexPath) { guard let contentView = contentView as? BoxListView else { return } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index fd7a820..f341d7e 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -161,5 +161,16 @@ class BoxListViewModel { let mover = boxList.remove(at: from) boxList.insert(mover, at: to) } + + func addFolderDirect(_ folder: Folder) { + let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) + boxList.append(boxListSectionViewModel) + output.send(.sendBoxList(boxList: boxList)) + } + + func addBookmarkDirect(_ bookmark: Bookmark, at index: Int) { + boxList[index].boxListCellViewModels.append(BoxListCellViewModel(bookmark: bookmark)) + output.send(.sendBoxList(boxList: boxList)) + } } diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index a66b7e3..e8de7dc 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -24,8 +24,8 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isPreload", defaultValue: false) static var isPreload: Bool - @UserDefaultsData(key: "selectedFolder", defaultValue: Folder(id: UUID(), name: "", bookmarks: [])) - static var selectedFolder: Folder + @UserDefaultsData(key: "selectedFolderId", defaultValue: nil) + static var selectedFolderId: UUID? } From 7160853b5f220c0eb28e150556bc0d16bfcf7a81 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Fri, 29 Mar 2024 03:19:56 +0900 Subject: [PATCH 169/370] =?UTF-8?q?feat=09=20=20=20=20:=20=EC=95=B1?= =?UTF-8?q?=EC=9D=B4=20=EA=BA=BC=EC=A7=84=20=EC=83=81=ED=83=9C=EC=97=90?= =?UTF-8?q?=EC=84=9C=20ShareExtension=20=EC=8B=A4=ED=96=89=20=EC=8B=9C=20?= =?UTF-8?q?=EB=9F=B0=EC=B9=98=EC=8A=A4=ED=81=AC=EB=A6=B0=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 앱이 꺼진 상태에서 ShareExtension 실행 시 rootViewController를 MainTabBarController() 로 설정 --- iBox/Sources/SceneDelegate.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index ccaebae..b108120 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -21,11 +21,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme) ?? .unspecified insertDefaultDataIfNeeded() - - window?.rootViewController = CustomLaunchScreenViewController() - window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 if let urlContext = connectionOptions.urlContexts.first { + window?.rootViewController = MainTabBarController() + window?.makeKeyAndVisible() let url = urlContext.url guard url.scheme == "iBox" else { return } @@ -42,6 +41,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { boxListViewController.shouldPresentModalAutomatically = true } } + } else { + window?.rootViewController = CustomLaunchScreenViewController() + window?.makeKeyAndVisible() } } From 496229af78f798a64fd64d22834768ac36e358ef Mon Sep 17 00:00:00 2001 From: jonnwon Date: Fri, 29 Mar 2024 03:43:36 +0900 Subject: [PATCH 170/370] =?UTF-8?q?refactor=20=20:=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ShareExtension 시 실행되는 handleIncomingURL() 구현 --- iBox/Sources/SceneDelegate.swift | 55 ++++++++++++-------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index b108120..2d34354 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -21,26 +21,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme) ?? .unspecified insertDefaultDataIfNeeded() - + if let urlContext = connectionOptions.urlContexts.first { window?.rootViewController = MainTabBarController() window?.makeKeyAndVisible() - let url = urlContext.url - guard url.scheme == "iBox" else { return } - - let urlData = URLdecoder.handleCustomURL(url) - URLDataManager.shared.update(with: urlData) - - if let windowScene = scene as? UIWindowScene, - let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { - tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 - - // 첫 번째 탭(FirstViewController)에 있는 shouldPresentModalAutomatically를 true로 설정 - if let navigationController = tabBarController.selectedViewController as? UINavigationController, - let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { - boxListViewController.shouldPresentModalAutomatically = true - } - } + handleIncomingURL(from: urlContext.url) } else { window?.rootViewController = CustomLaunchScreenViewController() window?.makeKeyAndVisible() @@ -68,23 +53,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { if let urlContext = URLContexts.first { - let url = urlContext.url - guard url.scheme == "iBox" else { return } - - let urlData = URLdecoder.handleCustomURL(url) - URLDataManager.shared.update(with: urlData) - - if let windowScene = scene as? UIWindowScene, - let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { - tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 - - // 첫 번째 탭(FirstViewController)에 있는 shouldPresentModalAutomatically를 true로 설정 - if let navigationController = tabBarController.selectedViewController as? UINavigationController, - let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { - boxListViewController.shouldPresentModalAutomatically = true - } - } - + handleIncomingURL(from: urlContext.url) } } @@ -121,3 +90,21 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } +extension SceneDelegate { + + func handleIncomingURL(from url: URL) { + guard url.scheme == "iBox" else { return } + + let urlData = URLdecoder.handleCustomURL(url) + URLDataManager.shared.update(with: urlData) + + if let tabBarController = window?.rootViewController as? UITabBarController { + tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 + + if let navigationController = tabBarController.selectedViewController as? UINavigationController, + let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { + boxListViewController.shouldPresentModalAutomatically = true + } + } + } +} From 95518478f7dba18a94ae5751e10907d1caaffcf1 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sat, 30 Mar 2024 05:29:27 +0900 Subject: [PATCH 171/370] refactor : Modify the logic for displaying addBookmarkView MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ShareExtension시 URLDataManager을 통해 addBookmarkView를 표시도록 수정 - 앱 꺼짐 상태에서 ShareExtension시 launchscreen 추가 --- .../CustomLaunchScreenViewController.swift | 19 ++++++++- iBox/Sources/SceneDelegate.swift | 35 +++------------- iBox/Sources/Shared/GlobalURLManager.swift | 24 ----------- iBox/Sources/Shared/URLDataManager.swift | 40 +++++++++++++++++++ 4 files changed, 63 insertions(+), 55 deletions(-) delete mode 100644 iBox/Sources/Shared/GlobalURLManager.swift create mode 100644 iBox/Sources/Shared/URLDataManager.swift diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 01aefba..935d34d 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -11,6 +11,16 @@ import Combine class CustomLaunchScreenViewController: UIViewController { private var customLaunchScreenView: CustomLaunchScreenView! private var cancellables: Set = [] + private var urlContext: UIOpenURLContext? + + init(urlContext: UIOpenURLContext?) { + self.urlContext = urlContext + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } override func viewDidLoad() { super.viewDidLoad() @@ -63,10 +73,15 @@ class CustomLaunchScreenViewController: UIViewController { private func transitionToNextScreen() { - let mainViewController = MainTabBarController() - guard let window = self.view.window else { return } + + let mainViewController = MainTabBarController() window.rootViewController = mainViewController + + if let urlContext = self.urlContext, + let tabBarController = window.rootViewController as? UITabBarController { + URLDataManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) + } UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {}, completion: nil) } } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 2d34354..c3b0c18 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -10,6 +10,7 @@ import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } @@ -22,14 +23,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { insertDefaultDataIfNeeded() - if let urlContext = connectionOptions.urlContexts.first { - window?.rootViewController = MainTabBarController() - window?.makeKeyAndVisible() - handleIncomingURL(from: urlContext.url) - } else { - window?.rootViewController = CustomLaunchScreenViewController() - window?.makeKeyAndVisible() - } + window?.rootViewController = CustomLaunchScreenViewController(urlContext: connectionOptions.urlContexts.first) + window?.makeKeyAndVisible() } private func insertDefaultDataIfNeeded() { @@ -52,8 +47,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { - if let urlContext = URLContexts.first { - handleIncomingURL(from: urlContext.url) + if let urlContext = URLContexts.first, + let tabBarController = window?.rootViewController as? UITabBarController { + URLDataManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) } } @@ -89,22 +85,3 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } - -extension SceneDelegate { - - func handleIncomingURL(from url: URL) { - guard url.scheme == "iBox" else { return } - - let urlData = URLdecoder.handleCustomURL(url) - URLDataManager.shared.update(with: urlData) - - if let tabBarController = window?.rootViewController as? UITabBarController { - tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 - - if let navigationController = tabBarController.selectedViewController as? UINavigationController, - let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { - boxListViewController.shouldPresentModalAutomatically = true - } - } - } -} diff --git a/iBox/Sources/Shared/GlobalURLManager.swift b/iBox/Sources/Shared/GlobalURLManager.swift deleted file mode 100644 index b0bea7b..0000000 --- a/iBox/Sources/Shared/GlobalURLManager.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// GlobalURLManager.swift -// iBox -// -// Created by 최종원 on 3/5/24. -// - -import Foundation - -class URLDataManager { - static let shared = URLDataManager() - - var incomingTitle: String? - var incomingData: String? - var incomingFaviconUrl: String? - - private init() {} - - func update(with data: (title: String?, data: String?, faviconUrl: String?)) { - incomingTitle = data.title - incomingData = data.data - incomingFaviconUrl = data.faviconUrl - } -} diff --git a/iBox/Sources/Shared/URLDataManager.swift b/iBox/Sources/Shared/URLDataManager.swift new file mode 100644 index 0000000..2f535ab --- /dev/null +++ b/iBox/Sources/Shared/URLDataManager.swift @@ -0,0 +1,40 @@ +// +// URLDataManager.swift +// iBox +// +// Created by 최종원 on 3/5/24. +// + +import UIKit + +class URLDataManager { + static let shared = URLDataManager() + + var incomingTitle: String? + var incomingData: String? + var incomingFaviconUrl: String? + + private init() {} + + func update(with data: (title: String?, data: String?, faviconUrl: String?)) { + incomingTitle = data.title + incomingData = data.data + incomingFaviconUrl = data.faviconUrl + } + + func navigateToAddBookmarkView(from url: URL, in tabBarController: UITabBarController) { + guard url.scheme == "iBox" else { return } + + let urlData = URLdecoder.handleCustomURL(url) + self.update(with: urlData) + + tabBarController.selectedIndex = 0 + DispatchQueue.main.async { + guard let navigationController = tabBarController.selectedViewController as? UINavigationController, + let boxListViewController = navigationController.viewControllers.first as? BoxListViewController else { + return + } + boxListViewController.shouldPresentModalAutomatically = true + } + } +} From f61f471bc7edb58f415739801702c4dbe4c0a8d4 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sat, 30 Mar 2024 05:33:28 +0900 Subject: [PATCH 172/370] =?UTF-8?q?fix=09=20=20=20=20:=20=ED=95=9C?= =?UTF-8?q?=EA=B8=80=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EB=B6=81=EB=A7=88?= =?UTF-8?q?=ED=81=AC=20=EC=B6=94=EA=B0=80=20=EC=95=88=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/AddBookmark/AddBookmarkViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index a9005db..2055df3 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -99,7 +99,8 @@ final class AddBookmarkViewController: UIViewController { @objc private func addButtonTapped() { guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, - let url = URL(string: urlString) else { + let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), + let url = URL(string: encodedUrlString) else { print("Invalid input") return } From cb36d76bf2e464d871c193a4e58f1e6432b1cfa8 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sat, 30 Mar 2024 05:34:28 +0900 Subject: [PATCH 173/370] =?UTF-8?q?fix=09=20=20=20=20:=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EC=9B=B9=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20ShareExtension=EC=8B=9C=20open=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EC=95=88=EB=88=8C=EB=A6=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 utf8 대신 해당 웹페이지의 인코딩에 맞게 data를 String으로 변환하도록 로직 수정 --- ShareExtension/ShareViewController.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index adc99de..8412af2 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -110,7 +110,10 @@ class CustomShareViewController: UIViewController { return } - if let htmlContent = String(data: data, encoding: .utf8) { + let encodingName = (response as? HTTPURLResponse)?.textEncodingName ?? "utf-8" + let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) + + if let htmlContent = String(data: data, encoding: encoding) { do { let doc: Document = try SwiftSoup.parse(htmlContent) let title: String? = try doc.title() @@ -160,8 +163,9 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { print("Share extension error") return } - + print("Share") fetchAndParseMetadata(from: url) { metadata in + dump(metadata) let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" let encodedData = metadata.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" From f224d5dcddf62d5f954a30ab49aec6b7c48217f7 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Sat, 30 Mar 2024 05:54:25 +0900 Subject: [PATCH 174/370] =?UTF-8?q?feat=09=20=20=20=20:=20shareExtension?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=93=A4=EC=96=B4=EC=98=A8=20url=EC=9D=98?= =?UTF-8?q?=20title=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20u?= =?UTF-8?q?rl=EC=9D=98=20host=EB=A1=9C=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - URLdecoder 의 handleCustomURL 메서드 로직 수정 --- iBox/Sources/Shared/URLdecoder.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Shared/URLdecoder.swift b/iBox/Sources/Shared/URLdecoder.swift index 31a7b2f..7efb229 100644 --- a/iBox/Sources/Shared/URLdecoder.swift +++ b/iBox/Sources/Shared/URLdecoder.swift @@ -14,7 +14,16 @@ class URLdecoder { let title = urlComponents.queryItems?.first(where: { $0.name == "title" })?.value let data = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value let faviconUrl = urlComponents.queryItems?.first(where: { $0.name == "faviconUrl" })?.value + + let finalTitle: String? + if let title = title, !title.isEmpty { + finalTitle = title + } else if let data = data, let dataUrl = URL(string: data) { + finalTitle = dataUrl.host ?? "No Title" + } else { + finalTitle = nil + } - return (title, data, faviconUrl) + return (finalTitle, data, faviconUrl) } } From 180cfdb8486f60aa2ab0a8b62121b969a60f2438 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 20:55:02 +0900 Subject: [PATCH 175/370] =?UTF-8?q?=F0=9F=90=9B=20fix:=20WebView=20Progres?= =?UTF-8?q?sView=20=EC=95=88=20=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index abafb01..463e896 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -78,8 +78,7 @@ class WebView: UIView { } progressView.snp.makeConstraints { make in - make.bottom.leading.trailing.equalToSuperview() - make.height.equalTo(2) + make.top.leading.trailing.equalToSuperview() } } @@ -103,7 +102,7 @@ extension WebView: WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { progressView.setProgress(1.0, animated: true) // 약간의 딜레이를 주어서 프로그레스 바가 완전히 차도록 함 - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.progressView.isHidden = true } } From 5d7ff0623e2ae5471a0bcb3d48f2b5a123c82bb5 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 26 Mar 2024 20:58:27 +0900 Subject: [PATCH 176/370] feat: set favorite bookmark --- iBox/Sources/AppDelegate.swift | 10 ++++- iBox/Sources/BoxList/BoxListView.swift | 10 +++-- .../BoxList/BoxListViewController.swift | 1 + iBox/Sources/BoxList/BoxListViewModel.swift | 38 +++++++++++++++++-- iBox/Sources/Shared/CoreDataManager.swift | 9 +++++ iBox/Sources/Shared/UserDefaultsManager.swift | 4 +- iBox/Sources/Shared/WebViewPreloader.swift | 20 ++++++++-- 7 files changed, 79 insertions(+), 13 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 151f061..bf06e1b 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -26,8 +26,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } private func preloadFavoriteWeb() { - let favorite = UserDefaultsManager.favorite - let favoriteUrl = favorite.url + let favoriteId = UserDefaultsManager.favoriteId + var favoriteUrl: URL? = nil + if let favoriteId { + favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) + if favoriteUrl == nil { + UserDefaultsManager.favoriteId = nil + } + } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 967479b..baeff51 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -190,12 +190,16 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { // 액션 정의 - let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: {(action, view, completionHandler) in - self.viewModel?.input.send(.setFavorite(indexPath: indexPath)) + let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: { [weak self] (action, view, completionHandler) in + self?.viewModel?.input.send(.toggleFavorite(indexPath: indexPath)) completionHandler(true) }) favoriteAction.backgroundColor = .box2 - favoriteAction.image = UIImage(systemName: "heart") + if viewModel?.isFavoriteBookmark(at: indexPath) == true { + favoriteAction.image = UIImage(systemName: "heart.fill") + } else { + favoriteAction.image = UIImage(systemName: "heart") + } let shareAction = UIContextualAction(style: .normal, title: "share", handler: {(action, view, completionHandler) in let cellViewModel = self.viewModel?.viewModel(at: indexPath) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index f0823d3..46c5376 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -84,6 +84,7 @@ extension BoxListViewController: BoxListViewDelegate { guard let newName = controller.textFields?.first?.text else { return } guard let newUrlString = controller.textFields?.last?.text, let newUrl = URL(string: newUrlString) else { return } + guard let contentView = self?.contentView as? BoxListView else { return } contentView.viewModel?.editBookmark(at: indexPath, name: newName, url: newUrl) } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index dfd5c83..fd7a820 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -15,8 +15,11 @@ class BoxListViewModel { var folders: [Folder] { boxList.map{ $0.folder } } + var sectionsToReload = Set() var isEditing = false + var favoriteId: UUID? = nil + enum Input { case toggleEditStatus @@ -24,7 +27,7 @@ class BoxListViewModel { case viewWillAppear case folderTapped(section: Int) case deleteBookmark(indexPath: IndexPath) - case setFavorite(indexPath: IndexPath) + case toggleFavorite(indexPath: IndexPath) case moveBookmark(from: IndexPath, to: IndexPath) case openFolderIfNeeded(folderIndex: Int) } @@ -50,6 +53,7 @@ class BoxListViewModel { case .viewDidLoad: let folders = CoreDataManager.shared.getFolders() boxList = folders.map{ BoxListSectionViewModel(folder: $0) } + favoriteId = UserDefaultsManager.favoriteId case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) if !sectionsToReload.isEmpty { @@ -61,8 +65,8 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) case let .deleteBookmark(indexPath): deleteBookmark(at: indexPath) - case let .setFavorite(indexPath): - print("\(viewModel(at: indexPath).name) favorite 할게용") + case let .toggleFavorite(indexPath): + toggleFavorite(at: indexPath) case .moveBookmark(from: let from, to: let to): reorderBookmark(srcIndexPath: from, destIndexPath: to) case .openFolderIfNeeded(folderIndex: let folderIndex): @@ -76,6 +80,34 @@ class BoxListViewModel { return boxList[indexPath.section].boxListCellViewModels[indexPath.row] } + func isFavoriteBookmark(at indexPath: IndexPath) -> Bool { + if let favoriteId { + if favoriteId == bookmark(at: indexPath).id { + return true + } else { return false } + } else { + return false + } + } + + private func toggleFavorite(at indexPath: IndexPath) { + let bookmark = boxList[indexPath.section].viewModel(at: indexPath.row) + if let prevId = favoriteId { + if prevId == bookmark.id { // 지금 들어온게 즐겨찾기면 지워야 + WebViewPreloader.shared.setFavoriteUrl(url: nil) + favoriteId = nil + UserDefaultsManager.favoriteId = nil + } else { + WebViewPreloader.shared.setFavoriteUrl(url: bookmark.url) + favoriteId = bookmark.id + } + } else { + WebViewPreloader.shared.setFavoriteUrl(url: bookmark.url) + favoriteId = bookmark.id + } + UserDefaultsManager.favoriteId = favoriteId + } + func bookmark(at indexPath: IndexPath) -> Bookmark { return boxList[indexPath.section].viewModel(at: indexPath.row).bookmark } diff --git a/iBox/Sources/Shared/CoreDataManager.swift b/iBox/Sources/Shared/CoreDataManager.swift index 411e516..28ef1c2 100644 --- a/iBox/Sources/Shared/CoreDataManager.swift +++ b/iBox/Sources/Shared/CoreDataManager.swift @@ -199,6 +199,15 @@ extension CoreDataManager { // 북마크 관련 extension CoreDataManager { + func getBookmarkUrl(_ bookmarkId: UUID) -> URL? { + let entity = getBookmarkEntity(id: bookmarkId) + if let entity { + return entity.url + } else { + return nil + } + } + func addBookmark(_ bookmark: Bookmark, folderId: UUID) { let context = persistentContainer.viewContext diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index 3fe28ba..a66b7e3 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -12,8 +12,8 @@ final class UserDefaultsManager { @UserDefaultsData(key: "theme", defaultValue: Theme.system) static var theme: Theme - @UserDefaultsData(key: "favorite", defaultValue: Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!)) - static var favorite: Bookmark + @UserDefaultsData(key: "favoriteId", defaultValue: nil) + static var favoriteId: UUID? @UserDefaultsData(key: "homeTabIndex", defaultValue: 0) static var homeTabIndex: Int diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 79082d6..554f159 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -12,6 +12,7 @@ class WebViewPreloader { static let shared = WebViewPreloader() private var webView: WKWebView? private var favoriteView: (url: URL, webView: WKWebView)? + private var defaultUrl = URL(string: "https://profile.intra.42.fr/")! private init() {} @@ -22,11 +23,11 @@ class WebViewPreloader { self.webView = webView } - func preloadFavoriteView(url: URL) { + func preloadFavoriteView(url: URL?) { let webView = WKWebView() webView.isOpaque = false - webView.load(URLRequest(url: url)) - favoriteView = (url, webView) + webView.load(URLRequest(url: url ?? defaultUrl)) + favoriteView = (url ?? defaultUrl, webView) } func getWebView() -> WKWebView? { @@ -45,5 +46,18 @@ class WebViewPreloader { guard let favoriteView else { return } favoriteView.webView.load(URLRequest(url: favoriteView.url)) } + + func setFavoriteUrl(url: URL?) { + if let favoriteView { + if url == favoriteView.url { + return + } else { + self.favoriteView?.url = url ?? defaultUrl + resetFavoriteView() + } + } else { + preloadFavoriteView(url: url) + } + } } From 0020e49e7fdf0061cd723bc7b89cfac8118ed755 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 26 Mar 2024 21:06:31 +0900 Subject: [PATCH 177/370] =?UTF-8?q?feat:=20default=20=EC=8B=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/WebViewPreloader.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 554f159..4f88167 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -49,7 +49,8 @@ class WebViewPreloader { func setFavoriteUrl(url: URL?) { if let favoriteView { - if url == favoriteView.url { + if url == favoriteView.url || + (url == nil && favoriteView.url == defaultUrl ) { return } else { self.favoriteView?.url = url ?? defaultUrl From 48024f3a862100938adcdc922199a146513a9969 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 28 Mar 2024 14:41:07 +0900 Subject: [PATCH 178/370] feat: reset data --- iBox/Sources/BoxList/BoxListView.swift | 13 ++++++ .../Settings/Reset/ResetViewController.swift | 44 ++++++++++++++++--- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index baeff51..7b3c2cf 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -52,12 +52,17 @@ class BoxListView: UIView { setupLayout() configureDataSource() bindViewModel() + subscribeToNotifications() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + deinit { + NotificationCenter.default.removeObserver(self) + } + // MARK: - Setup Methods private func setupProperty() { @@ -141,6 +146,14 @@ class BoxListView: UIView { }.store(in: &cancellables) } + private func subscribeToNotifications() { + NotificationCenter.default.addObserver(self, selector: #selector(dataDidReset), name: .didResetData, object: nil) + } + + @objc func dataDidReset(notification: NSNotification) { + viewModel?.input.send(.viewDidLoad) + } + } extension BoxListView: UITableViewDelegate { diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index d593220..dfa30af 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -37,22 +37,56 @@ extension ResetViewController: ResetViewDelegate { func showAlert() { let alertController = UIAlertController(title: "경고", message: "이 작업은 되돌릴 수 없습니다. 계속하려면 \"iBox\"라고 입력해 주세요.", preferredStyle: .alert) - alertController.addTextField() let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) alertController.addAction(cancelAction) - let confirmAction = UIAlertAction(title: "확인", style: .default) { _ in + let confirmAction = UIAlertAction(title: "확인", style: .default) { [weak self] _ in if let textField = alertController.textFields?.first, let text = textField.text, text == "iBox" { - print("정말로 초기화를 해버렷당") - self.navigationController?.popViewController(animated: true) + self?.resetData() + self?.navigationController?.popViewController(animated: true) } else { - self.showAlert() + self?.showAlert() } } + confirmAction.isEnabled = false alertController.addAction(confirmAction) + alertController.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let isTextMatch = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "iBox" + + confirmAction.isEnabled = isTextMatch + }) + + } + self.present(alertController, animated: true, completion: nil) } + private func resetData() { + let defaultData = [ + Folder(id: UUID(), name: "42 폴더", bookmarks: [ + Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), + Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), + Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), + Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), + Bookmark(id: UUID(), name: "Cabi", url: URL(string: "https://cabi.42seoul.io/")!), + Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) + ]) + ] + CoreDataManager.shared.deleteAllFolders() + CoreDataManager.shared.addInitialFolders(defaultData) + UserDefaultsManager.isDefaultDataInserted = true + + UserDefaultsManager.favoriteId = nil + WebViewPreloader.shared.setFavoriteUrl(url: nil) + NotificationCenter.default.post(name: .didResetData, object: nil) + } + +} + +extension Notification.Name { + static let didResetData = Notification.Name("didResetData") } From 4db616787f7b674948a454190286f5ebf0271c55 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 21:09:55 +0900 Subject: [PATCH 179/370] =?UTF-8?q?=E2=9C=A8=20feat:=20Font=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Extension/UIFont+Extension.swift | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 iBox/Sources/Extension/UIFont+Extension.swift diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift new file mode 100644 index 0000000..3ac8380 --- /dev/null +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -0,0 +1,8 @@ +// +// UIFont+Extension.swift +// iBox +// +// Created by jiyeon on 3/26/24. +// + +import Foundation From ca97c7b358395e9c7fed1496522719ded5965f89 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 26 Mar 2024 21:30:55 +0900 Subject: [PATCH 180/370] =?UTF-8?q?=E2=9C=A8=20feat:=20Font=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseViewController.swift | 10 +++++----- .../BoxList/AddBookmark/AddBookmarkView.swift | 14 +++++++------- .../AddBookmark/AddBookmarkViewController.swift | 2 +- .../BoxList/AddBookmark/FolderListCell.swift | 2 +- .../BoxList/AddBookmark/FolderListView.swift | 2 +- iBox/Sources/BoxList/BoxListCell.swift | 6 ++++-- iBox/Sources/BoxList/Edit/EditCell.swift | 1 + .../EditFolder/EditFolderViewController.swift | 2 +- iBox/Sources/BoxList/FolderView.swift | 2 +- iBox/Sources/Extension/UIFont+Extension.swift | 15 ++++++++++++++- .../Settings/HomeTab/HomeTabSelectorCell.swift | 2 +- .../HomeTab/HomeTabSelectorViewController.swift | 2 +- iBox/Sources/Settings/Reset/ResetView.swift | 4 ++-- .../Settings/Reset/ResetViewController.swift | 2 +- iBox/Sources/Settings/SettingsItemCell.swift | 4 ++-- iBox/Sources/Settings/Theme/ThemeCell.swift | 2 +- .../Settings/Theme/ThemeViewController.swift | 2 +- 17 files changed, 45 insertions(+), 29 deletions(-) diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index 48ab64b..49548d7 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -25,7 +25,7 @@ class BaseViewController: UIViewController { let backgroundColor: UIColor = .backgroundColor let tintColor: UIColor = .label - let titleFont: UIFont = .systemFont(ofSize: 20, weight: .semibold) + let titleFont: UIFont = .titleFont // MARK: - UI Components @@ -34,16 +34,16 @@ class BaseViewController: UIViewController { let navigationBar = NavigationBar().then { $0.backButton.configuration = .plain() $0.backButton.configuration?.image = UIImage(systemName: "chevron.left") - $0.backButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.backButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.addButton.configuration = .plain() $0.addButton.configuration?.image = UIImage(systemName: "plus") - $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.addButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.moreButton.configuration = .plain() $0.moreButton.configuration?.image = UIImage(systemName: "ellipsis.circle") - $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .bold) + $0.moreButton.configuration?.preferredSymbolConfigurationForImage = .init(weight: .semibold) $0.doneButton.configuration = .plain() $0.doneButton.configuration?.baseForegroundColor = .label - $0.doneButton.configuration?.attributedTitle = AttributedString("완료", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18, weight: .semibold)])) + $0.doneButton.configuration?.attributedTitle = AttributedString("완료", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.semiboldLabelFont])) } let contentView: UIView = View() diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 944e27a..5ddcee1 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -30,7 +30,7 @@ class AddBookmarkView: UIView { private let nameTextViewPlaceHolder = UILabel().then { $0.text = "북마크 이름" - $0.font = UIFont.systemFont(ofSize: 18) + $0.font = .cellTitleFont $0.textColor = .systemGray3 } @@ -38,7 +38,7 @@ class AddBookmarkView: UIView { $0.backgroundColor = .clear $0.layer.borderWidth = 0 $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - $0.font = UIFont.systemFont(ofSize: 16) + $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true } @@ -49,7 +49,7 @@ class AddBookmarkView: UIView { private let urlTextViewPlaceHolder = UILabel().then { $0.text = "URL" - $0.font = UIFont.systemFont(ofSize: 18) + $0.font = .cellTitleFont $0.textColor = .systemGray3 } @@ -57,7 +57,7 @@ class AddBookmarkView: UIView { $0.backgroundColor = .clear $0.layer.borderWidth = 0 $0.textContainerInset = UIEdgeInsets(top: 7, left: 0, bottom: 0, right: 0) - $0.font = UIFont.systemFont(ofSize: 16) + $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true } @@ -66,18 +66,18 @@ class AddBookmarkView: UIView { $0.backgroundColor = UIColor.backgroundColor $0.layer.cornerRadius = 10 $0.clipsToBounds = true - $0.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) + $0.titleLabel?.font = .cellTitleFont $0.isEnabled = true } private let buttonLabel = UILabel().then { $0.text = "목록" - $0.font = UIFont.systemFont(ofSize: 17) + $0.font = .cellTitleFont $0.textColor = .label } let selectedFolderLabel = UILabel().then { - $0.font = UIFont.systemFont(ofSize: 17) + $0.font = .descriptionFont $0.textColor = .systemGray $0.textAlignment = .right } diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 2055df3..543d55b 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -46,7 +46,7 @@ final class AddBookmarkViewController: UIViewController { navigationItem.rightBarButtonItem?.isEnabled = false let attributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.boldSystemFont(ofSize: 17) + .font: UIFont.semiboldLabelFont ] navigationItem.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index c955d35..e77e200 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -21,7 +21,7 @@ class FolderListCell: UITableViewCell { let folderNameLabel = UILabel().then { $0.textColor = .label - $0.font = .systemFont(ofSize: 17, weight: .regular) + $0.font = .cellTitleFont } private let checkImageView = UIImageView().then { diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 72526c9..7f1bcfd 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -17,7 +17,7 @@ class FolderListView: UIView { private let infoLabel = UILabel().then { $0.text = "새로운 북마크를 추가할 폴더를 선택해주세요." - $0.font = UIFont.boldSystemFont(ofSize: 17) + $0.font = .semiboldLabelFont $0.textColor = .label $0.textAlignment = .center } diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index 2c72874..a52416d 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -24,7 +24,9 @@ class BoxListCell: UITableViewCell { $0.contentMode = .scaleAspectFit } - private let label = UILabel() + private let label = UILabel().then { + $0.font = .cellTitleFont + } private let editButton = UIButton().then{ $0.configuration = .plain() @@ -79,7 +81,7 @@ class BoxListCell: UITableViewCell { cellImageView.snp.makeConstraints { make in make.leading.equalToSuperview().inset(20) make.top.bottom.equalToSuperview().inset(10) - make.width.equalTo(30) + make.width.equalTo(25) } label.snp.makeConstraints { make in diff --git a/iBox/Sources/BoxList/Edit/EditCell.swift b/iBox/Sources/BoxList/Edit/EditCell.swift index 8bfeeaa..9bb7e56 100644 --- a/iBox/Sources/BoxList/Edit/EditCell.swift +++ b/iBox/Sources/BoxList/Edit/EditCell.swift @@ -20,6 +20,7 @@ class EditCell: UITableViewCell { } private let titleLabel = UILabel().then { + $0.font = .cellTitleFont $0.textColor = .label } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index ced97c4..e72e106 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -44,7 +44,7 @@ class EditFolderViewController: BaseViewController, BaseViewCont func setupNavigationBar() { setNavigationBarTitleLabelText("폴더 관리") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.semiboldLabelFont) setNavigationBarAddButtonHidden(false) setNavigationBarBackButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) diff --git a/iBox/Sources/BoxList/FolderView.swift b/iBox/Sources/BoxList/FolderView.swift index 51cfb7d..72a43dc 100644 --- a/iBox/Sources/BoxList/FolderView.swift +++ b/iBox/Sources/BoxList/FolderView.swift @@ -16,7 +16,7 @@ class FolderView: UIView { private let folderNameLabel = UILabel().then { $0.textColor = .label - $0.font = .systemFont(ofSize: 18, weight: .semibold) + $0.font = .boldLabelFont } init() { diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift index 3ac8380..7cf7a00 100644 --- a/iBox/Sources/Extension/UIFont+Extension.swift +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -5,4 +5,17 @@ // Created by jiyeon on 3/26/24. // -import Foundation +import UIKit + +extension UIFont { + + static let titleFont = UIFont.systemFont(ofSize: 20.0, weight: .bold) + static let subTitlefont = UIFont.systemFont(ofSize: 17.0, weight: .semibold) + static let lableFont = UIFont.systemFont(ofSize: 16.0) + static let semiboldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .semibold) + static let boldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .bold) + static let cellTitleFont = UIFont.systemFont(ofSize: 16.0) + static let cellDescriptionFont = UIFont.systemFont(ofSize: 13.0, weight: .regular) + static let descriptionFont = UIFont.systemFont(ofSize: 14.0) + +} diff --git a/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift index 4364834..f22df25 100644 --- a/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift +++ b/iBox/Sources/Settings/HomeTab/HomeTabSelectorCell.swift @@ -16,7 +16,7 @@ class HomeTabSelectorCell: UITableViewCell { // MARK: - UI Components let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let selectButton = UIButton().then { diff --git a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift index d2c60c6..f98defb 100644 --- a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift +++ b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift @@ -25,7 +25,7 @@ class HomeTabSelectorViewController: BaseViewController, Ba func setupNavigationBar() { setNavigationBarTitleLabelText("홈화면 설정하기") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } diff --git a/iBox/Sources/Settings/Reset/ResetView.swift b/iBox/Sources/Settings/Reset/ResetView.swift index 9f18044..41ae9e0 100644 --- a/iBox/Sources/Settings/Reset/ResetView.swift +++ b/iBox/Sources/Settings/Reset/ResetView.swift @@ -18,12 +18,12 @@ class ResetView: UIView { let label = UILabel().then { $0.text = "경고: 이 작업을 진행하면 저장하신 모든 폴더 및 북마크 정보가 영구적으로 삭제되고 기본값으로 초기화됩니다. 진행하기 전에 중요한 정보가 없는지 다시 한번 확인해 주시기 바랍니다." $0.numberOfLines = 0 - $0.font = .systemFont(ofSize: 15) + $0.font = .descriptionFont } let resetButton = UIButton().then { $0.configuration = .plain() - $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.boldSystemFont(ofSize: 15)])) + $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.descriptionFont])) $0.tintColor = .white $0.backgroundColor = .box $0.clipsToBounds = true diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index dfa30af..4d2d4f7 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -27,7 +27,7 @@ class ResetViewController: BaseViewController, BaseViewControllerProt func setupNavigationBar() { setNavigationBarTitleLabelText("데이터 초기화") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } diff --git a/iBox/Sources/Settings/SettingsItemCell.swift b/iBox/Sources/Settings/SettingsItemCell.swift index b60df42..0499b84 100644 --- a/iBox/Sources/Settings/SettingsItemCell.swift +++ b/iBox/Sources/Settings/SettingsItemCell.swift @@ -17,11 +17,11 @@ class SettingsItemCell: UITableViewCell { // MARK: - UI Components let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let descriptionLabel = UILabel().then { - $0.font = .systemFont(ofSize: 13, weight: .regular) + $0.font = .cellDescriptionFont $0.textColor = .gray } diff --git a/iBox/Sources/Settings/Theme/ThemeCell.swift b/iBox/Sources/Settings/Theme/ThemeCell.swift index 653aca1..4a4c9fe 100644 --- a/iBox/Sources/Settings/Theme/ThemeCell.swift +++ b/iBox/Sources/Settings/Theme/ThemeCell.swift @@ -18,7 +18,7 @@ class ThemeCell: UITableViewCell { } let titleLabel = UILabel().then { - $0.font = .systemFont(ofSize: 16) + $0.font = .cellTitleFont } let selectButton = UIButton().then { diff --git a/iBox/Sources/Settings/Theme/ThemeViewController.swift b/iBox/Sources/Settings/Theme/ThemeViewController.swift index ac645c8..463805f 100644 --- a/iBox/Sources/Settings/Theme/ThemeViewController.swift +++ b/iBox/Sources/Settings/Theme/ThemeViewController.swift @@ -25,7 +25,7 @@ class ThemeViewController: BaseViewController, BaseViewControllerProt func setupNavigationBar() { setNavigationBarTitleLabelText("다크 모드 설정") - setNavigationBarTitleLabelFont(.systemFont(ofSize: 17, weight: .semibold)) + setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } From 72736838f6e9419b088610d0a9124e482a9f1eb0 Mon Sep 17 00:00:00 2001 From: JH713 Date: Fri, 29 Mar 2024 02:18:41 +0900 Subject: [PATCH 181/370] feat: add bookmark and folder in main view --- .../BoxList/AddBookmark/AddBookmarkView.swift | 1 - .../AddBookmarkViewController.swift | 110 +++++++++--------- .../BoxList/AddBookmark/FolderListView.swift | 20 ++-- .../FolderListViewController.swift | 79 +++++++++++-- .../BoxList/BoxListViewController.swift | 18 +++ iBox/Sources/BoxList/BoxListViewModel.swift | 11 ++ iBox/Sources/Shared/UserDefaultsManager.swift | 4 +- 7 files changed, 171 insertions(+), 72 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 5ddcee1..8808a66 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -181,7 +181,6 @@ class AddBookmarkView: UIView { selectedFolderLabel.snp.makeConstraints { make in make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(100) make.height.equalTo(40) } diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 543d55b..912b804 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -7,13 +7,21 @@ import UIKit +protocol AddBookmarkViewControllerProtocol: AnyObject { + func addFolderDirect(_ folder: Folder) + func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) +} + final class AddBookmarkViewController: UIViewController { + weak var delegate: AddBookmarkViewControllerProtocol? + var haveValidInput = false var selectedFolder: Folder? - private let coreDataManager = CoreDataManager.shared + var selectedFolderIndex: Int? + var folders = [Folder]() + private let addBookmarkView = AddBookmarkView() - override func loadView() { super.loadView() setupAddBookmarkView() @@ -28,6 +36,7 @@ final class AddBookmarkViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() + updateSelectedFolder() } private func setupNavigationBar() { @@ -58,19 +67,39 @@ final class AddBookmarkViewController: UIViewController { self?.openFolderSelection() } addBookmarkView.onTextChange = { [weak self] isEnabled in - self?.navigationItem.rightBarButtonItem?.isEnabled = isEnabled + self?.haveValidInput = isEnabled + + if let haveValidInput = self?.haveValidInput, + haveValidInput, + let _ = self?.selectedFolder { + self?.navigationItem.rightBarButtonItem?.isEnabled = true + } else { + self?.navigationItem.rightBarButtonItem?.isEnabled = false + } } view = addBookmarkView } private func updateSelectedFolder() { - selectedFolder = UserDefaultsManager.selectedFolder + let selectedFolderId = UserDefaultsManager.selectedFolderId + + for (index, folder) in folders.enumerated() { + if folder.id == selectedFolderId { + selectedFolder = folder + selectedFolderIndex = index + } + } - if selectedFolder?.name == "" { - selectedFolder = CoreDataManager.shared.getFolders().first + if selectedFolder == nil && !folders.isEmpty { + selectedFolder = folders[0] + selectedFolderIndex = 0 } - addBookmarkView.selectedFolderName = selectedFolder?.name + if let selectedFolder { + addBookmarkView.selectedFolderName = selectedFolder.name + } else { + addBookmarkView.selectedFolderName = "선택된 폴더가 없습니다." + } } @objc private func cancelButtonTapped() { @@ -107,9 +136,10 @@ final class AddBookmarkViewController: UIViewController { let newBookmark = Bookmark(id: UUID(), name: name, url: url) - if let selectedFolder = selectedFolder { - coreDataManager.addBookmark(newBookmark, folderId: selectedFolder.id) - print("북마크 저장 완료: \(newBookmark.name)") + if let selectedFolder = selectedFolder, + let selectedFolderIndex = selectedFolderIndex { + CoreDataManager.shared.addBookmark(newBookmark, folderId: selectedFolder.id) + delegate?.addBookmarkDirect(newBookmark, at: selectedFolderIndex) } else { print("선택된 폴더가 없습니다.") } @@ -118,57 +148,29 @@ final class AddBookmarkViewController: UIViewController { } private func openFolderSelection() { - let folderListViewController = FolderListViewController() + let folderListViewController = FolderListViewController(folders: folders, selectedId: selectedFolder?.id) folderListViewController.title = "목록" - - let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolderAction)) - folderListViewController.navigationItem.rightBarButtonItem = addButton + folderListViewController.delegate = self navigationController?.pushViewController(folderListViewController, animated: true) } - @objc func addFolderAction() { - let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) - - controller.addTextField { textField in - textField.placeholder = "폴더 이름" - textField.autocorrectionType = .no - textField.spellCheckingType = .no - } - - let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) - let addAction = UIAlertAction(title: "추가", style: .default) { [unowned controller, weak self] _ in - guard let textField = controller.textFields?.first, - let folderName = textField.text, !folderName.trimmingCharacters(in: .whitespaces).isEmpty else { - return - } - - let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) - self?.coreDataManager.addFolder(newFolder) - - self?.updateFolderList() - } - - controller.addAction(cancelAction) - controller.addAction(addAction) +} + +extension AddBookmarkViewController: FolderListViewControllerDelegate { + func addFolder(_ folder: Folder) { + delegate?.addFolderDirect(folder) + } + + func selectFolder(_ folder: Folder, at index: Int) { + selectedFolder = folder + selectedFolderIndex = index - NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: controller.textFields?.first, queue: .main) { notification in - if let textField = notification.object as? UITextField, - let text = textField.text, !text.trimmingCharacters(in: .whitespaces).isEmpty { - addAction.isEnabled = true - } else { - addAction.isEnabled = false - } + if haveValidInput { + navigationItem.rightBarButtonItem?.isEnabled = true } - addAction.isEnabled = false - - present(controller, animated: true) - } - - func updateFolderList() { - if let folderListVC = navigationController?.viewControllers.first(where: { $0 is FolderListViewController }) as? FolderListViewController { - folderListVC.folderListView.reloadFolderList() - } + addBookmarkView.selectedFolderName = selectedFolder?.name } + } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 7f1bcfd..77edf93 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -7,11 +7,16 @@ import UIKit +protocol FolderListViewDelegate: AnyObject { + func selectFolder(_ folder: Folder, at index: Int) +} + class FolderListView: UIView { + weak var delegate: FolderListViewDelegate? let coreDataManager = CoreDataManager.shared var folders: [Folder] = [] - var onFolderSelected: ((Folder) -> Void)? + var selectedFolderId: UUID? // MARK: - UI Components @@ -26,7 +31,7 @@ class FolderListView: UIView { $0.backgroundColor = .clear } - private lazy var stackView = UIStackView(arrangedSubviews: [infoLabel, tableView]).then { + private let stackView = UIStackView().then { $0.axis = .vertical $0.spacing = 20 } @@ -62,18 +67,18 @@ class FolderListView: UIView { make.leading.equalTo(self.snp.leading) make.trailing.equalTo(self.snp.trailing) } + + stackView.addArrangedSubview(infoLabel) + stackView.addArrangedSubview(tableView) } func setupTableView() { self.tableView.dataSource = self self.tableView.delegate = self self.tableView.register(FolderListCell.self, forCellReuseIdentifier: FolderListCell.reuseIdentifier) - - folders = coreDataManager.getFolders() } func reloadFolderList() { - folders = coreDataManager.getFolders() tableView.reloadData() } } @@ -87,7 +92,7 @@ extension FolderListView: UITableViewDataSource { let cell = tableView.dequeueReusableCell(withIdentifier: FolderListCell.reuseIdentifier, for: indexPath) as! FolderListCell let folder = folders[indexPath.row] - let isSelectedFolder = UserDefaultsManager.selectedFolder.id == folder.id + let isSelectedFolder = selectedFolderId == folder.id cell.configureWith(folder: folder, isSelected: isSelectedFolder) return cell @@ -97,6 +102,7 @@ extension FolderListView: UITableViewDataSource { extension FolderListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedFolder = folders[indexPath.row] - onFolderSelected?(selectedFolder) + UserDefaultsManager.selectedFolderId = selectedFolder.id + delegate?.selectFolder(selectedFolder, at: indexPath.row) } } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index bbccafa..3fd25c3 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -7,8 +7,24 @@ import UIKit +protocol FolderListViewControllerDelegate: AnyObject { + func selectFolder(_ folder: Folder, at index: Int) + func addFolder(_ folder: Folder) +} + class FolderListViewController: UIViewController { + weak var delegate: FolderListViewControllerDelegate? + let folderListView = FolderListView() + + init(folders: [Folder], selectedId: UUID?) { + super.init(nibName: nil, bundle: nil) + setupFolderListView(folders, selectedId: selectedId) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } override func loadView() { view = folderListView @@ -17,16 +33,63 @@ class FolderListViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - folderListView.onFolderSelected = { [weak self] folder in - - guard let self = self else { return } + setupNavigationBar() + } + + private func setupNavigationBar() { + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolder)) + navigationItem.rightBarButtonItem = addButton + } + + @objc private func addFolder() { + let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) + + controller.addTextField { textField in + textField.placeholder = "폴더 이름" + textField.autocorrectionType = .no + textField.spellCheckingType = .no + } + + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + let addAction = UIAlertAction(title: "추가", style: .default) { [unowned controller, weak self] _ in + guard let textField = controller.textFields?.first, + let folderName = textField.text, !folderName.trimmingCharacters(in: .whitespaces).isEmpty else { return } - if let addBookmarkVC = self.navigationController?.viewControllers.first as? AddBookmarkViewController { - addBookmarkVC.selectedFolder = folder - UserDefaultsManager.selectedFolder = folder - - self.navigationController?.popViewController(animated: true) + let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) + CoreDataManager.shared.addFolder(newFolder) + self?.folderListView.folders.append(newFolder) + self?.folderListView.reloadFolderList() + self?.delegate?.addFolder(newFolder) + } + + controller.addAction(cancelAction) + controller.addAction(addAction) + + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: controller.textFields?.first, queue: .main) { notification in + if let textField = notification.object as? UITextField, + let text = textField.text, !text.trimmingCharacters(in: .whitespaces).isEmpty { + addAction.isEnabled = true + } else { + addAction.isEnabled = false } } + + addAction.isEnabled = false + + present(controller, animated: true) + } + + private func setupFolderListView(_ folders: [Folder], selectedId: UUID?) { + folderListView.delegate = self + folderListView.folders = folders + folderListView.selectedFolderId = selectedId + } +} + +extension FolderListViewController: FolderListViewDelegate { + func selectFolder(_ folder: Folder, at index: Int) { + delegate?.selectFolder(folder, at: index) + self.navigationController?.popViewController(animated: true) } + } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 46c5376..04f3506 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -51,7 +51,12 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - Action Functions @objc private func addButtonTapped() { + guard let contentView = contentView as? BoxListView else { return } + let addBookmarkViewController = AddBookmarkViewController() + addBookmarkViewController.delegate = self + addBookmarkViewController.folders = contentView.viewModel?.folders ?? [] + let navigationController = UINavigationController(rootViewController: addBookmarkViewController) navigationController.modalPresentationStyle = .pageSheet @@ -73,6 +78,19 @@ class BoxListViewController: BaseViewController, BaseViewController } +extension BoxListViewController: AddBookmarkViewControllerProtocol { + func addFolderDirect(_ folder: Folder) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.addFolderDirect(folder) + } + + func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) { + guard let contentView = contentView as? BoxListView else { return } + contentView.viewModel?.addBookmarkDirect(bookmark, at: folderIndex) + } + +} + extension BoxListViewController: BoxListViewDelegate { func presentEditBookmarkController(at indexPath: IndexPath) { guard let contentView = contentView as? BoxListView else { return } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index fd7a820..f341d7e 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -161,5 +161,16 @@ class BoxListViewModel { let mover = boxList.remove(at: from) boxList.insert(mover, at: to) } + + func addFolderDirect(_ folder: Folder) { + let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) + boxList.append(boxListSectionViewModel) + output.send(.sendBoxList(boxList: boxList)) + } + + func addBookmarkDirect(_ bookmark: Bookmark, at index: Int) { + boxList[index].boxListCellViewModels.append(BoxListCellViewModel(bookmark: bookmark)) + output.send(.sendBoxList(boxList: boxList)) + } } diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index a66b7e3..e8de7dc 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -24,8 +24,8 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isPreload", defaultValue: false) static var isPreload: Bool - @UserDefaultsData(key: "selectedFolder", defaultValue: Folder(id: UUID(), name: "", bookmarks: [])) - static var selectedFolder: Folder + @UserDefaultsData(key: "selectedFolderId", defaultValue: nil) + static var selectedFolderId: UUID? } From 6cd199e22c2753ae0096b74d2be0421ece3db5ec Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 1 Apr 2024 19:36:07 +0900 Subject: [PATCH 182/370] fix: change selectionStyle .gray --- iBox/Sources/BoxList/BoxListCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index a52416d..aedaf8d 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -68,7 +68,7 @@ class BoxListCell: UITableViewCell { private func setupProperty() { backgroundColor = .tableViewBackgroundColor - selectionStyle = .none + selectionStyle = .gray } private func setupHierarchy() { From 2ae0f368d315bcdf49085fbefbc530df988ee3af Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 1 Apr 2024 19:36:33 +0900 Subject: [PATCH 183/370] feat: didSelectRowAt after deslectRow --- iBox/Sources/BoxList/BoxListView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7b3c2cf..cd5b6e4 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -199,6 +199,8 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let cellViewModel = viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return } delegate?.didSelectWeb(id: cellViewModel.id, at: cellViewModel.url, withName: cellViewModel.name) + + tableView.deselectRow(at: indexPath, animated: true) } func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { From b8509479a8d2078268049dd743f4b658b2fb04d5 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 1 Apr 2024 21:04:32 +0900 Subject: [PATCH 184/370] feat: context menu preview --- iBox/Sources/BoxList/BoxListView.swift | 55 +++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7b3c2cf..624a0e3 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -106,7 +106,7 @@ class BoxListView: UIView { self.delegate?.presentEditBookmarkController(at: currentIndexPath) } } - + return cell } boxListDataSource.delegate = self @@ -244,6 +244,57 @@ extension BoxListView: UITableViewDelegate { return false } + func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { + let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: { [weak self] () -> UIViewController? in + guard let self = self, let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return nil } + + let id = cellViewModel.id + let url = cellViewModel.url + let name = cellViewModel.name + + let previewViewController: UIViewController + + if let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) { + previewViewController = cachedViewController + } else { + let viewController = WebViewController() + viewController.selectedWebsite = url + viewController.title = name + WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) + previewViewController = viewController + } + + return previewViewController + }, actionProvider: { suggestedActions in + return self.makeContextMenu(for: indexPath) + }) + return configuration + } + + private func makeContextMenu(for indexPath: IndexPath) -> UIMenu { + let deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] action in + self?.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) + } + + let isFavorite = self.viewModel?.isFavoriteBookmark(at: indexPath) ?? false + let favoriteActionTitle = isFavorite ? "즐겨찾기 해제" : "즐겨찾기로 등록" + let favoriteActionImage = UIImage(systemName: isFavorite ? "heart.slash.fill" : "heart.fill") + + let favoriteAction = UIAction(title: favoriteActionTitle, image: favoriteActionImage) { [weak self] action in + self?.viewModel?.input.send(.toggleFavorite(indexPath: indexPath)) + } + + let shareAction = UIAction(title: "공유하기", image: UIImage(systemName: "square.and.arrow.up")) { [weak self] action in + guard let self = self, let url = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].url else { return } + + let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil) + if let viewController = self.delegate as? UIViewController { + viewController.present(activityViewController, animated: true, completion: nil) + } + } + + return UIMenu(title: "", children: [favoriteAction, shareAction, deleteAction]) + } } extension BoxListView: BoxListDataSourceDelegate { @@ -269,7 +320,7 @@ class BoxListDataSource: UITableViewDiffableDataSource Date: Tue, 2 Apr 2024 14:32:29 +0900 Subject: [PATCH 185/370] fix: github raw --- .../Versioning/VersioningHandler.swift | 49 ++++++++----------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/iBox/Sources/Versioning/VersioningHandler.swift b/iBox/Sources/Versioning/VersioningHandler.swift index 9b21638..433454c 100644 --- a/iBox/Sources/Versioning/VersioningHandler.swift +++ b/iBox/Sources/Versioning/VersioningHandler.swift @@ -11,14 +11,22 @@ class VersioningHandler { func checkAppVersion(retryCount: Int = 0, completion: @escaping (VersionCheckCode) -> Void) { let maxRetryCount = 3 - let urlString = "https://my-json-server.typicode.com/42Box/versioning/db" - guard let url = URL(string: urlString) else { - completion(.urlError) - return - } + let urlString = "https://raw.githubusercontent.com/42Box/versioning/main/raw.json" - let task = URLSession.shared.dataTask(with: url) { data, response, error in - guard let data = data, error == nil else { + NetworkManager.shared.fetchModel(from: urlString, modelType: VersionInfo.self) { result in + switch result { + case .success(let versionInfo): + guard let latestVersion = versionInfo.version.first?.latestVersion, + let minRequiredVersion = versionInfo.version.first?.minRequiredVersion else { + completion(.urlError) + return + } + + self.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, storeURL: versionInfo.storeUrl, completion: completion) + + case .failure(let error): + print("Error: \(error.localizedDescription)") + if retryCount < maxRetryCount { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.checkAppVersion(retryCount: retryCount + 1, completion: completion) @@ -26,43 +34,26 @@ class VersioningHandler { } else { completion(.maxRetryReached) } - return - } - - do { - let versionInfo = try JSONDecoder().decode(VersionInfo.self, from: data) - guard let latestVersion = versionInfo.version.first?.latestVersion, - let minRequiredVersion = versionInfo.version.first?.minRequiredVersion, - let updateUrl = versionInfo.url.updateURL else { - completion(.urlError) - return - } - - self.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, updateUrl: updateUrl, completion: completion) - } catch { - completion(.decodingError) } } - - task.resume() } - func compareVersion(latestVersion: String, minRequiredVersion: String, updateUrl: String, completion: @escaping (VersionCheckCode) -> Void) { + func compareVersion(latestVersion: String, minRequiredVersion: String, storeURL: String, completion: @escaping (VersionCheckCode) -> Void) { guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { completion(.internalInfoError) return } if appVersion.compare(minRequiredVersion, options: .numeric) == .orderedAscending { - showAlertForUpdate(updateUrl: updateUrl, isMandatory: true, completion: completion) + showAlertForUpdate(storeURL: storeURL, isMandatory: true, completion: completion) } else if appVersion.compare(latestVersion, options: .numeric) == .orderedAscending { - showAlertForUpdate(updateUrl: updateUrl, isMandatory: false, completion: completion) + showAlertForUpdate(storeURL: storeURL, isMandatory: false, completion: completion) } else { completion(.success) } } - func showAlertForUpdate(updateUrl: String, isMandatory: Bool, completion: @escaping (VersionCheckCode) -> Void) { + func showAlertForUpdate(storeURL: String, isMandatory: Bool, completion: @escaping (VersionCheckCode) -> Void) { DispatchQueue.main.async { guard let windowScene = UIApplication.shared.connectedScenes.first(where: { $0 is UIWindowScene }) as? UIWindowScene, let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { @@ -74,7 +65,7 @@ class VersioningHandler { let alert = UIAlertController(title: "업데이트 알림", message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "업데이트", style: .default, handler: { _ in - if let url = URL(string: updateUrl), UIApplication.shared.canOpenURL(url) { + if let url = URL(string: storeURL), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) completion(.update) } From a2be450aefed70f535a62473dc4fb8c11a69d252 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 2 Apr 2024 14:32:52 +0900 Subject: [PATCH 186/370] feat: api handler for --- iBox/Sources/Shared/NetworkManager.swift | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 iBox/Sources/Shared/NetworkManager.swift diff --git a/iBox/Sources/Shared/NetworkManager.swift b/iBox/Sources/Shared/NetworkManager.swift new file mode 100644 index 0000000..f05ac09 --- /dev/null +++ b/iBox/Sources/Shared/NetworkManager.swift @@ -0,0 +1,42 @@ +// +// NetworkManager.swift +// iBox +// +// Created by Chan on 4/2/24. +// + +import Foundation + +class NetworkManager { + static let shared = NetworkManager() + + private init() {} + + func fetchModel(from urlString: String, modelType: T.Type, completion: @escaping (Result) -> Void) { + guard let url = URL(string: urlString) else { + completion(.failure(NSError(domain: "NetworkManager", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"]))) + return + } + + let task = URLSession.shared.dataTask(with: url) { data, response, error in + if let error = error { + completion(.failure(error)) + return + } + + guard let data = data else { + completion(.failure(NSError(domain: "NetworkManager", code: -2, userInfo: [NSLocalizedDescriptionKey: "No data received"]))) + return + } + + do { + let model = try JSONDecoder().decode(modelType, from: data) + completion(.success(model)) + } catch { + completion(.failure(error)) + } + } + + task.resume() + } +} From a6cb312b7faa88f96898f5156f112105192d592f Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 2 Apr 2024 14:33:53 +0900 Subject: [PATCH 187/370] feat: fetching default data at initialization --- .../Settings/Reset/ResetViewController.swift | 74 ++++++++++++++----- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index 4d2d4f7..3f8088e 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -54,32 +54,70 @@ extension ResetViewController: ResetViewDelegate { alertController.addTextField() { textField in NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: - {_ in - let isTextMatch = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "iBox" - - confirmAction.isEnabled = isTextMatch - }) + {_ in + let isTextMatch = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "iBox" + + confirmAction.isEnabled = isTextMatch + }) } self.present(alertController, animated: true, completion: nil) } + private func storeDataHandler(defaultData: [Folder]) { + DispatchQueue.main.async { + CoreDataManager.shared.deleteAllFolders() + CoreDataManager.shared.addInitialFolders(defaultData) + UserDefaultsManager.isDefaultDataInserted = true + } + } + + private func resetHandler() { + let urlString = "https://raw.githubusercontent.com/42Box/versioning/main/raw.json" + + NetworkManager.shared.fetchModel(from: urlString, modelType: VersionInfo.self) { result in + switch result { + case .success(let model): + if let defaultList = model.url.filter({ $0.id == 0 }).first?.defaultList?.first?.list { + var bookmarks = [Bookmark]() + for item in defaultList { + if let url = URL(string: item.url) { + let bookmark = Bookmark(id: UUID(), name: item.name ?? "", url: url) + bookmarks.append(bookmark) + } + } + + let defaultData = [ + Folder(id: UUID(), name: "42 폴더", bookmarks: bookmarks) + ] + + self.storeDataHandler(defaultData: defaultData) + + print("success") + } + case .failure(let error): + print("Error fetching version info: \(error.localizedDescription)") + + let defaultData = [ + Folder(id: UUID(), name: "42 폴더", bookmarks: [ + Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), + Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), + Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), + Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), + Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) + ]) + ] + + self.storeDataHandler(defaultData: defaultData) + } + } + } + private func resetData() { - let defaultData = [ - Folder(id: UUID(), name: "42 폴더", bookmarks: [ - Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), - Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), - Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), - Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), - Bookmark(id: UUID(), name: "Cabi", url: URL(string: "https://cabi.42seoul.io/")!), - Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) - ]) - ] - CoreDataManager.shared.deleteAllFolders() - CoreDataManager.shared.addInitialFolders(defaultData) - UserDefaultsManager.isDefaultDataInserted = true + // https://my-json-server.typicode.com/42Box/versioning/version/1 + resetHandler() UserDefaultsManager.favoriteId = nil WebViewPreloader.shared.setFavoriteUrl(url: nil) NotificationCenter.default.post(name: .didResetData, object: nil) From 01e055bbbb7eaecaf2e24559b5edac7ac32c22a6 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 2 Apr 2024 14:34:06 +0900 Subject: [PATCH 188/370] fix: update version model --- iBox/Sources/Model/VersionInfo.swift | 39 ++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/Model/VersionInfo.swift b/iBox/Sources/Model/VersionInfo.swift index 331a7cb..1fab73e 100644 --- a/iBox/Sources/Model/VersionInfo.swift +++ b/iBox/Sources/Model/VersionInfo.swift @@ -8,18 +8,47 @@ // MARK: - VersionInfo struct VersionInfo: Codable { let version: [Version] - let url: URLClass + let storeUrl: String + let url: [URLUpdate] } -// MARK: - URLClass -struct URLClass: Codable { - let updateURL: String? +// MARK: - URLUpdate +struct URLUpdate: Codable { + let id: Int + let defaultList: [URLList]? + let remove: [URLList]? + let add: [URLList]? + let fix: [FixList]? enum CodingKeys: String, CodingKey { - case updateURL = "updateUrl" + case id + case defaultList = "default" + case remove, add, fix } } +// MARK: - URLList +struct URLList: Codable { + let list: [URLItem] +} + +// MARK: - URLItem +struct URLItem: Codable { + let name: String? + let url: String +} + +// MARK: - FixList +struct FixList: Codable { + let list: [FixItem] +} + +// MARK: - FixItem +struct FixItem: Codable { + let from: String + let to: String +} + // MARK: - Version struct Version: Codable { let id: Int From 48af51330ce172395f6c9afd9d7581a09d278bfa Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 2 Apr 2024 14:36:34 +0900 Subject: [PATCH 189/370] fix: submodule --- iBox/Resources/Version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Resources/Version b/iBox/Resources/Version index 172ce29..57b2e79 160000 --- a/iBox/Resources/Version +++ b/iBox/Resources/Version @@ -1 +1 @@ -Subproject commit 172ce2939fccd76558f254adfb7b02535f97113c +Subproject commit 57b2e79219b13e129aae1521374580fff722defd From 3967709904b3a1f4a43dc9de95637969dbc9eb73 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 2 Apr 2024 19:45:30 +0900 Subject: [PATCH 190/370] =?UTF-8?q?fix=09=20=20=20=20:=20=ED=95=9C?= =?UTF-8?q?=EA=B8=80=20url=20=EC=B6=94=EA=B0=80=20=EC=8B=9C=20=EA=B9=A8?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/ShareViewController.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 8412af2..4f51405 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -139,7 +139,8 @@ class CustomShareViewController: UIViewController { faviconUrl = url.scheme! + "://" + url.host! + "/favicon.ico" } - let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: url.absoluteString) + let decodedUrlString = url.absoluteString.removingPercentEncoding ?? url.absoluteString + let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: decodedUrlString) DispatchQueue.main.async { completion(metadata) @@ -163,7 +164,6 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { print("Share extension error") return } - print("Share") fetchAndParseMetadata(from: url) { metadata in dump(metadata) let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" @@ -171,7 +171,6 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" let urlString = "iBox://url?title=\(encodedTitle)&data=\(encodedData)&faviconUrl=\(encodedFaviconUrl)" - print(urlString) if let openUrl = URL(string: urlString) { if self.openURL(openUrl) { print("iBox 앱이 성공적으로 열렸습니다.") From a94e73db85b0929fc38578fca8477ad834b8f636 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 2 Apr 2024 20:13:33 +0900 Subject: [PATCH 191/370] =?UTF-8?q?fix=09=20=20=20=20:=20=20=EC=95=B1=20?= =?UTF-8?q?=EA=BA=BC=EC=A7=90=20=ED=9B=84=20ShareExtension=EC=8B=9C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EB=90=9C=20=ED=8F=B4=EB=8D=94=EA=B0=80=20?= =?UTF-8?q?=EC=82=AC=EB=9D=BC=EC=A7=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - folder를 coredata에서 가져오도록 수정 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift | 1 + iBox/Sources/BoxList/BoxListViewController.swift | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index 912b804..a7154d0 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -81,6 +81,7 @@ final class AddBookmarkViewController: UIViewController { } private func updateSelectedFolder() { + folders = CoreDataManager.shared.getFolders() let selectedFolderId = UserDefaultsManager.selectedFolderId for (index, folder) in folders.enumerated() { diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 04f3506..da1fe42 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -55,7 +55,6 @@ class BoxListViewController: BaseViewController, BaseViewController let addBookmarkViewController = AddBookmarkViewController() addBookmarkViewController.delegate = self - addBookmarkViewController.folders = contentView.viewModel?.folders ?? [] let navigationController = UINavigationController(rootViewController: addBookmarkViewController) From b1bcacc0432f35c285aba66c2b6208652a98e96e Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 2 Apr 2024 20:30:35 +0900 Subject: [PATCH 192/370] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=ED=83=AD?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Back=20Swipte=20Gesture=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EA=B2=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Base/BaseViewController.swift | 5 +---- iBox/Sources/Settings/SettingsViewController.swift | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/iBox/Sources/Base/BaseViewController.swift b/iBox/Sources/Base/BaseViewController.swift index 445ff64..2c7b051 100644 --- a/iBox/Sources/Base/BaseViewController.swift +++ b/iBox/Sources/Base/BaseViewController.swift @@ -62,6 +62,7 @@ class BaseViewController: UIViewController, UIGestureRecognizerDel private func setupProperty() { view.backgroundColor = .backgroundColor navigationController?.setNavigationBarHidden(true, animated: false) + navigationController?.interactivePopGestureRecognizer?.delegate = self setNavigationBarTintColor(tintColor) setNavigationBarTitleLabelFont(titleFont) @@ -220,10 +221,6 @@ class BaseViewController: UIViewController, UIGestureRecognizerDel navigationBar.titleLabel.textColor = color } - func enablePopGesture() { - navigationController?.interactivePopGestureRecognizer?.delegate = self - } - // MARK: - Action Functions @objc func backButtonTapped() { diff --git a/iBox/Sources/Settings/SettingsViewController.swift b/iBox/Sources/Settings/SettingsViewController.swift index 7af6017..bd753ad 100644 --- a/iBox/Sources/Settings/SettingsViewController.swift +++ b/iBox/Sources/Settings/SettingsViewController.swift @@ -36,7 +36,6 @@ final class SettingsViewController: BaseViewController, BaseViewCo func setupNavigationBar() { setNavigationBarTitleLabelText("설정") - enablePopGesture() } } From d2c9d4a02354c6ebb74b8122cee90ecb08a417b2 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 2 Apr 2024 22:04:54 +0900 Subject: [PATCH 193/370] =?UTF-8?q?fix=09=20=20=20=20:=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 2 +- iBox/Sources/BoxList/BoxListViewModel.swift | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 30a20fb..da1fe42 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -97,7 +97,7 @@ extension BoxListViewController: BoxListViewDelegate { let controller = UIAlertController(title: "북마크 편집", message: nil, preferredStyle: .alert) let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } - let okAction = UIAlertAction(title: "확인", style: .default) { action in + let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in guard let newName = controller.textFields?.first?.text else { return } guard let newUrlString = controller.textFields?.last?.text, let newUrl = URL(string: newUrlString) else { return } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index fe1a853..7cc78ef 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -176,15 +176,4 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) } - func addFolderDirect(_ folder: Folder) { - let boxListSectionViewModel = BoxListSectionViewModel(folder: folder) - boxList.append(boxListSectionViewModel) - output.send(.sendBoxList(boxList: boxList)) - } - - func addBookmarkDirect(_ bookmark: Bookmark, at index: Int) { - boxList[index].boxListCellViewModels.append(BoxListCellViewModel(bookmark: bookmark)) - output.send(.sendBoxList(boxList: boxList)) - } - } From cc5f86c75edeaee00f86ab86ec2360a350838ae2 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 3 Apr 2024 19:31:17 +0900 Subject: [PATCH 194/370] feat: change folder bbutton --- iBox/Sources/BoxList/FolderButton.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 19a0869..5e6ffc8 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -41,7 +41,7 @@ class FolderButton: UIButton { private func setupProperty() { backgroundColor = .tableViewBackgroundColor - openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") + openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.down") : UIImage(systemName: "chevron.right") } private func setupHierarchy() { @@ -66,6 +66,6 @@ class FolderButton: UIButton { func toggleStatus() { isOpen = !isOpen - openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.up") : UIImage(systemName: "chevron.down") + openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.down") : UIImage(systemName: "chevron.right") } } From 6803f5c8d713f2faea5fa2825767bb0bb0fadf25 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 3 Apr 2024 23:49:46 +0900 Subject: [PATCH 195/370] feat: set folder name label trailing --- .../BoxList/EditFolder/EditFolderCell.swift | 19 +++++++++++++++---- iBox/Sources/BoxList/FolderButton.swift | 10 ++++++---- iBox/Sources/BoxList/FolderView.swift | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift index 8631712..cef1110 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift @@ -13,6 +13,8 @@ class EditFolderCell: UITableViewCell { var onDelete: (() -> Void)? var onEdit: (() -> Void)? + private let containerView = UIView() + private let folderView = FolderView() private let editButton = UIButton().then{ @@ -53,16 +55,25 @@ class EditFolderCell: UITableViewCell { } private func setupHierarchy() { - contentView.addSubview(folderView) - folderView.addSubview(editButton) + contentView.addSubview(containerView) + containerView.addSubview(folderView) + containerView.addSubview(editButton) } private func setupLayout() { - folderView.snp.makeConstraints { make in + containerView.snp.makeConstraints { make in make.edges.equalToSuperview() } + editButton.snp.makeConstraints { make in - make.top.bottom.trailing.equalToSuperview() + make.top.bottom.equalToSuperview() + make.trailing.equalToSuperview().inset(10) + make.width.equalTo(30) + } + + folderView.snp.makeConstraints { make in + make.top.bottom.leading.equalToSuperview() + make.trailing.equalTo(editButton.snp.leading) } } diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 19a0869..33e7013 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -50,14 +50,16 @@ class FolderButton: UIButton { } private func setupLayout() { - folderView.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - openCloseImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() + make.width.height.equalTo(20) make.trailing.equalToSuperview().offset(-20) } + + folderView.snp.makeConstraints { make in + make.top.bottom.leading.equalToSuperview() + make.trailing.equalTo(openCloseImageView.snp.leading) + } } func setFolderName(_ name: String) { diff --git a/iBox/Sources/BoxList/FolderView.swift b/iBox/Sources/BoxList/FolderView.swift index 72a43dc..755ade6 100644 --- a/iBox/Sources/BoxList/FolderView.swift +++ b/iBox/Sources/BoxList/FolderView.swift @@ -51,6 +51,7 @@ class FolderView: UIView { folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) + make.trailing.equalToSuperview().inset(10) } } From 1fadba1789eeb88885576a25282cf26c9fdf14d3 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 3 Apr 2024 23:58:14 +0900 Subject: [PATCH 196/370] feat: set folder name label leading, trailing in addBookmarkView --- .../BoxList/AddBookmark/AddBookmarkView.swift | 2 +- .../BoxList/AddBookmark/FolderListCell.swift | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 8808a66..7298822 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -174,11 +174,11 @@ class AddBookmarkView: UIView { buttonLabel.snp.makeConstraints { make in make.leading.equalTo(button.snp.leading).offset(20) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(40) make.height.equalTo(40) } selectedFolderLabel.snp.makeConstraints { make in + make.leading.equalTo(buttonLabel.snp.trailing).offset(10) make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) make.height.equalTo(40) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index e77e200..2d8facf 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -65,19 +65,19 @@ class FolderListCell: UITableViewCell { make.bottom.lessThanOrEqualToSuperview().offset(-10) } + checkImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.trailing.equalToSuperview().offset(-20) + make.width.height.equalTo(24) + } + folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) - make.trailing.lessThanOrEqualToSuperview().offset(-20) + make.trailing.equalTo(checkImageView.snp.leading).offset(-10) make.top.greaterThanOrEqualToSuperview().offset(10) make.bottom.lessThanOrEqualToSuperview().offset(-10) } - - checkImageView.snp.makeConstraints { make in - make.centerY.equalToSuperview() - make.trailing.equalToSuperview().offset(-20) - make.width.height.equalTo(24) - } } func configureWith(folder: Folder, isSelected: Bool) { From d8ad6ecf2157b2ae0ecbfc4861c953a19859f1c9 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Apr 2024 00:28:16 +0900 Subject: [PATCH 197/370] feat: set bookmark label trailing --- iBox/Sources/BoxList/BoxListCell.swift | 21 +++++++++++++++++-- iBox/Sources/BoxList/BoxListView.swift | 2 +- .../BoxList/EditFolder/EditFolderCell.swift | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index aedaf8d..2daa2ef 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -85,11 +85,14 @@ class BoxListCell: UITableViewCell { } label.snp.makeConstraints { make in - make.top.trailing.bottom.equalToSuperview() + make.top.bottom.equalToSuperview() + make.trailing.equalToSuperview().inset(25) make.leading.equalTo(cellImageView.snp.trailing).offset(10) } editButton.snp.makeConstraints { make in - make.top.bottom.trailing.equalToSuperview() + make.width.equalTo(30) + make.top.bottom.equalToSuperview() + make.trailing.equalToSuperview().offset(-10) } } @@ -106,6 +109,20 @@ class BoxListCell: UITableViewCell { func setEditButtonHidden(_ isHidden: Bool) { editButton.isHidden = isHidden + + if isHidden { + label.snp.remakeConstraints { make in + make.top.bottom.equalToSuperview() + make.trailing.equalToSuperview().inset(25) + make.leading.equalTo(cellImageView.snp.trailing).offset(10) + } + } else { + label.snp.remakeConstraints { make in + make.top.bottom.equalToSuperview() + make.trailing.equalTo(editButton.snp.leading).offset(-5) + make.leading.equalTo(cellImageView.snp.trailing).offset(10) + } + } } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index a370098..2a99fe6 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -166,7 +166,7 @@ extension BoxListView: UITableViewDelegate { make.top.bottom.equalToSuperview() make.leading.trailing.equalToSuperview().inset(15) } - view.backgroundColor = .backgroundColor + view.backgroundColor = .tableViewBackgroundColor line.backgroundColor = .quaternaryLabel return view } diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift index cef1110..1d5a169 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderCell.swift @@ -67,7 +67,7 @@ class EditFolderCell: UITableViewCell { editButton.snp.makeConstraints { make in make.top.bottom.equalToSuperview() - make.trailing.equalToSuperview().inset(10) + make.trailing.equalToSuperview().offset(-10) make.width.equalTo(30) } From 14e555808d6579ae0616c79a63f9b7b553ab962b Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Apr 2024 00:52:54 +0900 Subject: [PATCH 198/370] feat: set favorite preload --- iBox/Sources/AppDelegate.swift | 8 +++++--- iBox/Sources/Favorite/FavoriteView.swift | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 77ca7d3..8ba7e6f 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -13,9 +13,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let versioningHandler: VersioningHandler = VersioningHandler() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - Task { [weak self] in - self?.preloadFavoriteWeb() + + if UserDefaultsManager.isPreload { + Task { [weak self] in + self?.preloadFavoriteWeb() + } } versioningHandler.checkAppVersion { result in diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index ff76348..5d32708 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -12,7 +12,12 @@ import SnapKit class FavoriteView: UIView { - private lazy var webView = WebViewPreloader.shared.getFavoriteView() + private lazy var webView = { + if WebViewPreloader.shared.getFavoriteView() == nil { + loadFavoriteWeb() + } + return WebViewPreloader.shared.getFavoriteView() + }() private let refreshControl = UIRefreshControl() @@ -58,4 +63,16 @@ class FavoriteView: UIView { } } + private func loadFavoriteWeb() { + let favoriteId = UserDefaultsManager.favoriteId + var favoriteUrl: URL? = nil + if let favoriteId { + favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) + if favoriteUrl == nil { + UserDefaultsManager.favoriteId = nil + } + } + WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) + } + } From 58780fd6a2baca6ed71a8a5f5d0016f06d7f3328 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:23:05 +0900 Subject: [PATCH 199/370] =?UTF-8?q?feat=09=20=20=20=20:=20=ED=82=A4?= =?UTF-8?q?=EB=B3=B4=EB=93=9C=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - textView의 키보드를 emailAddress타입으로 변경 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 8808a66..0f411f3 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -41,6 +41,7 @@ class AddBookmarkView: UIView { $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true + $0.keyboardType = .emailAddress } private let separatorView = UIView().then { @@ -60,6 +61,7 @@ class AddBookmarkView: UIView { $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true + $0.keyboardType = .emailAddress } private let button = UIButton(type: .custom).then { From e05bffdfd3a8d0b294a851d0ba0d6da15cfccbb3 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:28:42 +0900 Subject: [PATCH 200/370] =?UTF-8?q?refactor=20=20:=20Label=EC=A0=9C?= =?UTF-8?q?=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - '목록'버튼 label의 width제약 삭제 - 선택된 폴더를 나타내는 label의 width 제약설정 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 0f411f3..28819c1 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -176,7 +176,6 @@ class AddBookmarkView: UIView { buttonLabel.snp.makeConstraints { make in make.leading.equalTo(button.snp.leading).offset(20) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(40) make.height.equalTo(40) } @@ -184,6 +183,7 @@ class AddBookmarkView: UIView { make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) make.height.equalTo(40) + make.width.equalTo(100) } chevronImageView.snp.makeConstraints { make in From 2813c2d9eeda2eb0d2ff5ab063f41ad870f40fa4 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:32:39 +0900 Subject: [PATCH 201/370] =?UTF-8?q?refactor=20=20:=20folderNameLabel=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Folder이름이 긴 경우 이름이 체크표시 침범, FolderListCell 내 folderNameLabel 제약수정 --- iBox/Sources/BoxList/AddBookmark/FolderListCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index e77e200..ad39291 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -68,7 +68,7 @@ class FolderListCell: UITableViewCell { folderNameLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.leading.equalTo(folderImageView.snp.trailing).offset(10) - make.trailing.lessThanOrEqualToSuperview().offset(-20) + make.trailing.lessThanOrEqualToSuperview().offset(-60) make.top.greaterThanOrEqualToSuperview().offset(10) make.bottom.lessThanOrEqualToSuperview().offset(-10) } From 069281dd81b4749dd3133c1426f1794803fb00ac Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:37:51 +0900 Subject: [PATCH 202/370] =?UTF-8?q?refactor=20=20:=20AddBookmarkView=20?= =?UTF-8?q?=EB=82=B4=20textField=20top=20=EC=A0=9C=EC=95=BD=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 28819c1..7d44ef2 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -130,7 +130,7 @@ class AddBookmarkView: UIView { private func setupLayout() { textFieldView.snp.makeConstraints { make in - make.top.equalToSuperview().offset(100) + make.top.equalToSuperview().offset(70) make.height.equalTo(150) make.leading.equalToSuperview().offset(20) make.trailing.equalToSuperview().offset(-20) From 7c79c2db66413fa7a4e52f7cc8bf22694fc393e2 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:41:17 +0900 Subject: [PATCH 203/370] =?UTF-8?q?feat=09=20=20=20=20:=20AddBookmarkView?= =?UTF-8?q?=20=EB=82=B4=20Responder=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UITextView가 편집되기 시작할 때 텍스트의 끝으로 포커스 이동 - nameTextView에서 return 시 urlTextView로 포커스 이동 - urlTextView에서 return 시 키보드 내림 --- .../BoxList/AddBookmark/AddBookmarkView.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 7d44ef2..5b57e35 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -228,6 +228,22 @@ class AddBookmarkView: UIView { } extension AddBookmarkView: UITextViewDelegate { + func textViewDidBeginEditing(_ textView: UITextView) { + let textLength: Int = textView.text.count + textView.selectedRange = NSRange(location: textLength, length: 0) + } + + func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + if text == "\n" { + if textView == nameTextView { + urlTextView.becomeFirstResponder() + } else if textView == urlTextView { + textView.resignFirstResponder() + } + return false + } + return true + } func textViewDidChange(_ textView: UITextView) { From edcf86670aba15b1fdfc04031a8a7b63636da337 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 4 Apr 2024 06:51:34 +0900 Subject: [PATCH 204/370] =?UTF-8?q?feat=09=20=20=20=20:=20AddBookmarkView?= =?UTF-8?q?=20=EB=82=B4=20textView=20=EC=9E=90=EB=8F=99=EB=B3=B4=EC=A0=95?= =?UTF-8?q?=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 5b57e35..8d431c1 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -42,6 +42,7 @@ class AddBookmarkView: UIView { $0.textColor = .label $0.isScrollEnabled = true $0.keyboardType = .emailAddress + $0.autocorrectionType = .no } private let separatorView = UIView().then { @@ -62,6 +63,7 @@ class AddBookmarkView: UIView { $0.textColor = .label $0.isScrollEnabled = true $0.keyboardType = .emailAddress + $0.autocorrectionType = .no } private let button = UIButton(type: .custom).then { From c8e639c77c40a6caeb715afe91c0d7ea132c6720 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 4 Apr 2024 16:39:38 +0900 Subject: [PATCH 205/370] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 463e896..c3d99ee 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -107,19 +107,4 @@ extension WebView: WKNavigationDelegate { } } - // func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { - // print("웹뷰 로딩 실패: \(error.localizedDescription)") - // } - // - // func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { - // print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") - // } - // - // func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { - // if let url = navigationAction.request.url { - // print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") - // } - // - // decisionHandler(.allow) - // } } From 7842a61ce16907c0e035f10015e9ddbf820b0073 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Apr 2024 20:48:43 +0900 Subject: [PATCH 206/370] =?UTF-8?q?feat:=20=EB=8F=99=EC=98=81=EC=83=81=20i?= =?UTF-8?q?nline=20=EC=9E=AC=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/WebViewPreloader.swift | 21 ++++------------- iBox/Sources/Web/WebView.swift | 26 ++++++---------------- 2 files changed, 11 insertions(+), 36 deletions(-) diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 4f88167..7baf685 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -10,38 +10,25 @@ import WebKit class WebViewPreloader { static let shared = WebViewPreloader() - private var webView: WKWebView? private var favoriteView: (url: URL, webView: WKWebView)? private var defaultUrl = URL(string: "https://profile.intra.42.fr/")! private init() {} - func preload(url: URL) { - let webView = WKWebView() - webView.isOpaque = false - webView.load(URLRequest(url: url)) - self.webView = webView - } - func preloadFavoriteView(url: URL?) { - let webView = WKWebView() + let config = WKWebViewConfiguration() + config.allowsInlineMediaPlayback = true + + let webView = WKWebView(frame: .zero, configuration: config) webView.isOpaque = false webView.load(URLRequest(url: url ?? defaultUrl)) favoriteView = (url ?? defaultUrl, webView) } - func getWebView() -> WKWebView? { - return webView - } - func getFavoriteView() -> WKWebView? { return favoriteView?.webView } - func resetWebView() { - webView = nil - } - func resetFavoriteView() { guard let favoriteView else { return } favoriteView.webView.load(URLRequest(url: favoriteView.url)) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 463e896..da5ef4a 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -21,11 +21,9 @@ class WebView: UIView { } // MARK: - UI Components + - private let webView = WKWebView().then { - $0.isOpaque = false - $0.scrollView.contentInsetAdjustmentBehavior = .always - } + private let webView:WKWebView private let refreshControl = UIRefreshControl() @@ -38,7 +36,12 @@ class WebView: UIView { // MARK: - Initializer override init(frame: CGRect) { + let config = WKWebViewConfiguration() + config.allowsInlineMediaPlayback = true + + webView = WKWebView(frame: .zero, configuration: config) super.init(frame: frame) + setupProperty() setupHierarchy() setupLayout() @@ -107,19 +110,4 @@ extension WebView: WKNavigationDelegate { } } - // func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { - // print("웹뷰 로딩 실패: \(error.localizedDescription)") - // } - // - // func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { - // print("웹뷰 프로비저널 네비게이션 실패: \(error.localizedDescription)") - // } - // - // func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { - // if let url = navigationAction.request.url { - // print("웹뷰가 리다이렉트 되는 URL: \(url.absoluteString)") - // } - // - // decisionHandler(.allow) - // } } From 259188e052759d14b50bb59f96af2289e22c68d6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 4 Apr 2024 20:52:06 +0900 Subject: [PATCH 207/370] feat: webview opaque false --- iBox/Sources/Web/WebView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index da5ef4a..22cbe7b 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -54,6 +54,7 @@ class WebView: UIView { deinit { progressObserver?.invalidate() webView.stopLoading() + webView.isOpaque = false webView.navigationDelegate = nil webView.scrollView.delegate = nil } From d12cfe8b9d1edc6887b2f66150490bfe53b2f002 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Fri, 5 Apr 2024 00:15:35 +0900 Subject: [PATCH 208/370] =?UTF-8?q?feat=09=20=20=20=20:=20textView=20?= =?UTF-8?q?=ED=82=A4=EB=B3=B4=EB=93=9C=20=ED=83=80=EC=9E=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AddBookmarkView 내 nameTextView 의 키보드 타입을 .defualt 로 변경 - AddBookmarkView 내 urlTextView 의 키보드 타입을 .URL 로 변경 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 6b4a942..85a684c 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -41,7 +41,7 @@ class AddBookmarkView: UIView { $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true - $0.keyboardType = .emailAddress + $0.keyboardType = .default $0.autocorrectionType = .no } @@ -64,6 +64,7 @@ class AddBookmarkView: UIView { $0.isScrollEnabled = true $0.keyboardType = .emailAddress $0.autocorrectionType = .no + $0.keyboardType = .URL } private let button = UIButton(type: .custom).then { From 007660bf9822439b4a54bad1f16357a80b932da8 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Fri, 5 Apr 2024 00:47:20 +0900 Subject: [PATCH 209/370] =?UTF-8?q?refactor=20=20:=20urlTextView=EB=82=B4?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=20=ED=82=A4=EB=B3=B4=EB=93=9C=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 85a684c..46cecf8 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -62,9 +62,8 @@ class AddBookmarkView: UIView { $0.font = .cellTitleFont $0.textColor = .label $0.isScrollEnabled = true - $0.keyboardType = .emailAddress - $0.autocorrectionType = .no $0.keyboardType = .URL + $0.autocorrectionType = .no } private let button = UIButton(type: .custom).then { From 89fd0cecacad9cbc99fd4d2fe2094e216b2c4111 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 00:49:33 +0900 Subject: [PATCH 210/370] =?UTF-8?q?feat:=20=EC=9B=B9=EB=B7=B0=20=EB=A6=AC?= =?UTF-8?q?=ED=94=84=EB=A0=88=EC=8B=9C=20=EC=A0=9C=EC=8A=A4=EC=B2=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxList/BoxListViewController.swift | 1 + iBox/Sources/Web/RefreshControl.swift | 32 +++++++++ iBox/Sources/Web/WebView.swift | 66 ++++++++++++++++--- iBox/Sources/Web/WebViewController.swift | 21 ++++++ 4 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 iBox/Sources/Web/RefreshControl.swift diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index da1fe42..6bbe115 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -151,6 +151,7 @@ extension BoxListViewController: BoxListViewDelegate { } else { // 캐시에 없는 경우, 새로운 viewController 인스턴스를 생성하고 캐시에 추가합니다. let viewController = WebViewController() + viewController.delegate = self viewController.selectedWebsite = url viewController.title = name WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift new file mode 100644 index 0000000..011236f --- /dev/null +++ b/iBox/Sources/Web/RefreshControl.swift @@ -0,0 +1,32 @@ +// +// RefreshControl.swift +// iBox +// +// Created by jiyeon on 4/4/24. +// + +import UIKit + +class RefreshControl: UIView { + + // MARK: - UI Components + + + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupProperty() { + backgroundColor = .systemBlue + isUserInteractionEnabled = true + } + +} diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index c3d99ee..e8697af 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -12,6 +12,8 @@ import SnapKit class WebView: UIView { + var delegate: WebViewDelegate? + private var progressObserver: NSKeyValueObservation? var selectedWebsite: URL? { @@ -20,6 +22,9 @@ class WebView: UIView { } } + private var refreshControlHeight: CGFloat = 100.0 + private var isActive = false + // MARK: - UI Components private let webView = WKWebView().then { @@ -27,8 +32,6 @@ class WebView: UIView { $0.scrollView.contentInsetAdjustmentBehavior = .always } - private let refreshControl = UIRefreshControl() - private let progressView = UIProgressView().then { $0.progressViewStyle = .bar $0.tintColor = .label @@ -60,11 +63,21 @@ class WebView: UIView { private func setupProperty() { backgroundColor = .backgroundColor webView.navigationDelegate = self - webView.scrollView.refreshControl = refreshControl - refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged) progressObserver = webView.observe(\.estimatedProgress, options: .new) { [weak self] webView, _ in self?.progressView.setProgress(Float(webView.estimatedProgress), animated: true) } + setupRefreshControl() + } + + private func setupRefreshControl() { + // pan gesture + let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleSwipe)) + panGestureRecognizer.delegate = self + addGestureRecognizer(panGestureRecognizer) + // refresh control + let refreshControl = RefreshControl(frame: .init(x: 0, y: -refreshControlHeight, width: frame.width, height: refreshControlHeight)) + webView.scrollView.addSubview(refreshControl) + webView.scrollView.delegate = self } private func setupHierarchy() { @@ -88,10 +101,25 @@ class WebView: UIView { webView.allowsBackForwardNavigationGestures = true } - @objc private func handleRefreshControl() { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in - self?.webView.reload() - self?.refreshControl.endRefreshing() + @objc func handleSwipe(_ gesture: UIPanGestureRecognizer) { + guard isActive else { return } // 활성 상태일 때만 처리 + + let translation = gesture.translation(in: self) + if gesture.state == .ended { // 사용자의 터치가 끝났을 때 + if abs(translation.x) > 100 { + if translation.x > 0 { // 오른쪽 스와이프 : 처음 북마크로 돌아가기 + loadWebsite() + } else { // 왼쪽 스와이프 : 현재 링크 북마크 추가 + guard let url = webView.url else { return } + delegate?.pushAddBookMarkViewController(url: url) + } + } else { // 아래 : 새로고침 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + self?.webView.reload() + } + } + // 제스처 인식 후 초기화 + gesture.setTranslation(CGPoint.zero, in: self) } } @@ -108,3 +136,25 @@ extension WebView: WKNavigationDelegate { } } + +extension WebView: UIScrollViewDelegate { + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let refreshControlHeight: CGFloat = 100.0 + if scrollView.contentOffset.y < -refreshControlHeight { + isActive = true + } else { + isActive = false + } + } + +} + +extension WebView: UIGestureRecognizerDelegate { + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + // 다른 제스처 인식기와 동시에 인식되도록 허용 + return true + } + +} diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index ac000fd..d5741ce 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -7,8 +7,13 @@ import UIKit +protocol WebViewDelegate { + func pushAddBookMarkViewController(url: URL) +} + class WebViewController: BaseViewController, BaseViewControllerProtocol { + var delegate: AddBookmarkViewControllerProtocol? var selectedWebsite: URL? // MARK: - Life Cycle @@ -20,6 +25,7 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol view.backgroundColor = .backgroundColor guard let contentView = contentView as? WebView else { return } + contentView.delegate = self contentView.selectedWebsite = selectedWebsite } @@ -30,3 +36,18 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol } } + +extension WebViewController: WebViewDelegate { + + func pushAddBookMarkViewController(url: URL) { + URLDataManager.shared.incomingData = url.absoluteString + + let addBookmarkViewController = AddBookmarkViewController() + addBookmarkViewController.delegate = delegate + + let navigationController = UINavigationController(rootViewController: addBookmarkViewController) + navigationController.modalPresentationStyle = .pageSheet + self.present(navigationController, animated: true, completion: nil) + } + +} From aa7a290c730edf6a48c24d6bc6e359eae3cd3383 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 9 Apr 2024 02:14:44 +0900 Subject: [PATCH 211/370] feat : Add clearButton in nameTextView --- .../BoxList/AddBookmark/AddBookmarkView.swift | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 6b4a942..1e4e07b 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -45,6 +45,12 @@ class AddBookmarkView: UIView { $0.autocorrectionType = .no } + private let clearButton = UIButton().then { + $0.setImage(UIImage(systemName: "xmark.circle.fill"), for: .normal) + $0.tintColor = .systemGray3 + $0.isHidden = true + } + private let separatorView = UIView().then { $0.backgroundColor = .systemGray3 } @@ -111,6 +117,7 @@ class AddBookmarkView: UIView { private func setupProperty() { backgroundColor = .systemGroupedBackground updateTextFieldWithIncomingData() + clearButton.addTarget(self, action: #selector(clearTextView), for: .touchUpInside) button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) nameTextView.delegate = self urlTextView.delegate = self @@ -119,6 +126,7 @@ class AddBookmarkView: UIView { private func setupHierarchy() { addSubview(textFieldView) addSubview(nameTextView) + addSubview(clearButton) addSubview(separatorView) addSubview(urlTextView) addSubview(nameTextViewPlaceHolder) @@ -150,6 +158,11 @@ class AddBookmarkView: UIView { make.leading.equalTo(nameTextView.snp.leading).offset(5) } + clearButton.snp.makeConstraints { make in + make.top.equalTo(nameTextView.snp.top).offset(7) + make.trailing.equalTo(nameTextView.snp.trailing).offset(-5) + } + separatorView.snp.makeConstraints { make in make.top.equalTo(nameTextView.snp.bottom).offset(10) make.leading.equalTo(nameTextView.snp.leading).offset(5) @@ -202,9 +215,15 @@ class AddBookmarkView: UIView { if let data = data, !data.isEmpty { textField.text = data placeholder.isHidden = true + if textField == nameTextView { + clearButton.isHidden = false + } } else { textField.text = "" placeholder.isHidden = false + if textField == nameTextView { + clearButton.isHidden = true + } } } @@ -221,6 +240,11 @@ class AddBookmarkView: UIView { onTextChange?(isBothTextViewsFilled) } + @objc func clearTextView() { + nameTextView.text = "" + textViewDidChange(nameTextView) + } + @objc private func buttonTapped() { onButtonTapped?() } @@ -255,6 +279,7 @@ extension AddBookmarkView: UITextViewDelegate { if textView == nameTextView { nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty + clearButton.isHidden = nameTextView.text.isEmpty } if textView == urlTextView { From fbcb4dbf61603dfdfdd23682650e282b0e52061f Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 03:10:43 +0900 Subject: [PATCH 212/370] =?UTF-8?q?feat:=20=EB=A6=AC=ED=94=84=EB=A0=88?= =?UTF-8?q?=EC=8B=9C=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Extension/UIColor+Extension.swift | 2 +- iBox/Sources/Extension/UIFont+Extension.swift | 1 + iBox/Sources/Web/RefreshControl.swift | 83 ++++++++++++++++++- iBox/Sources/Web/WebView.swift | 71 ++++++++++------ iBox/Sources/Web/WebViewController.swift | 6 ++ 5 files changed, 137 insertions(+), 26 deletions(-) diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index c0a3e69..2f30e8d 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -32,7 +32,7 @@ extension UIColor { static let box = UIColor(hex: 0xFF7F29) static let box2 = UIColor(hex: 0xFF9548) static let box3 = UIColor(hex: 0xFFDC6E) - static let tableViewBackgroundColor = color(light: .systemGroupedBackground, dark: .systemGray5) + static let tableViewBackgroundColor = color(light: .systemGroupedBackground, dark: .systemGray4) static let folderGray = color(light: .systemGray3, dark: .systemGray2) static let webIconColor = color(light: .black, dark: .systemGray) static let dimmedViewColor = UIColor.black.withAlphaComponent(0.75) diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift index 7cf7a00..c222e95 100644 --- a/iBox/Sources/Extension/UIFont+Extension.swift +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -17,5 +17,6 @@ extension UIFont { static let cellTitleFont = UIFont.systemFont(ofSize: 16.0) static let cellDescriptionFont = UIFont.systemFont(ofSize: 13.0, weight: .regular) static let descriptionFont = UIFont.systemFont(ofSize: 14.0) + static let refreshControlFont = UIFont.boldSystemFont(ofSize: 12.0) } diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift index 011236f..8f791aa 100644 --- a/iBox/Sources/Web/RefreshControl.swift +++ b/iBox/Sources/Web/RefreshControl.swift @@ -7,10 +7,58 @@ import UIKit +import SnapKit + +enum RefreshControlType { + case addBookmark + case refresh + case back +} + class RefreshControl: UIView { + var currentType: RefreshControlType? + // MARK: - UI Components + let addBookmarkButton = UIButton().then { + $0.configuration = .plain() + $0.tintColor = .label + $0.configuration?.image = UIImage(systemName: "bookmark.circle") + $0.configuration?.imagePadding = 10 + $0.configuration?.imagePlacement = .top + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 20.0) + $0.configuration?.attributedTitle = AttributedString("북마크 추가", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.refreshControlFont])) + $0.layer.cornerRadius = 15 + } + + let refreshButton = UIButton().then { + $0.configuration = .plain() + $0.tintColor = .label + $0.configuration?.image = UIImage(systemName: "arrow.clockwise.circle") + $0.configuration?.imagePadding = 10 + $0.configuration?.imagePlacement = .top + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 20.0) + $0.configuration?.attributedTitle = AttributedString("새로고침", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.refreshControlFont])) + $0.layer.cornerRadius = 15 + } + + let backButton = UIButton().then { + $0.configuration = .plain() + $0.tintColor = .label + $0.configuration?.image = UIImage(systemName: "arrowshape.turn.up.backward.circle") + $0.configuration?.imagePadding = 10 + $0.configuration?.imagePlacement = .top + $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 20.0) + $0.configuration?.attributedTitle = AttributedString("처음으로 이동", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.refreshControlFont])) + $0.layer.cornerRadius = 15 + } + + let stackView = UIStackView().then { + $0.axis = .horizontal + $0.distribution = .fillEqually + $0.spacing = 20 + } // MARK: - Initializer @@ -18,15 +66,48 @@ class RefreshControl: UIView { override init(frame: CGRect) { super.init(frame: frame) setupProperty() + setupHierarchy() + setupLayout() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + // MAKR: - Setup Methods + private func setupProperty() { - backgroundColor = .systemBlue isUserInteractionEnabled = true } + private func setupHierarchy() { + addSubview(stackView) + stackView.addArrangedSubview(addBookmarkButton) + stackView.addArrangedSubview(refreshButton) + stackView.addArrangedSubview(backButton) + } + + private func setupLayout() { + stackView.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(20) + } + } + + func setSelected(_ type: RefreshControlType) { + if type == currentType { return } + currentType = type + clear() + switch type { + case .addBookmark: addBookmarkButton.backgroundColor = .tableViewBackgroundColor + case .refresh: refreshButton.backgroundColor = .tableViewBackgroundColor + case .back: backButton.backgroundColor = .tableViewBackgroundColor + } + } + + func clear() { + [addBookmarkButton, refreshButton, backButton].forEach { button in + button.backgroundColor = .clear + } + } + } diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index e8697af..12c3cbd 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -22,7 +22,8 @@ class WebView: UIView { } } - private var refreshControlHeight: CGFloat = 100.0 + private var debounceTimer: Timer? + private var refreshControlHeight: CGFloat = 120.0 private var isActive = false // MARK: - UI Components @@ -38,6 +39,8 @@ class WebView: UIView { $0.sizeToFit() } + private var refreshControl: RefreshControl? + // MARK: - Initializer override init(frame: CGRect) { @@ -45,6 +48,7 @@ class WebView: UIView { setupProperty() setupHierarchy() setupLayout() +// setupRefreshControl() } required init?(coder: NSCoder) { @@ -66,18 +70,6 @@ class WebView: UIView { progressObserver = webView.observe(\.estimatedProgress, options: .new) { [weak self] webView, _ in self?.progressView.setProgress(Float(webView.estimatedProgress), animated: true) } - setupRefreshControl() - } - - private func setupRefreshControl() { - // pan gesture - let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleSwipe)) - panGestureRecognizer.delegate = self - addGestureRecognizer(panGestureRecognizer) - // refresh control - let refreshControl = RefreshControl(frame: .init(x: 0, y: -refreshControlHeight, width: frame.width, height: refreshControlHeight)) - webView.scrollView.addSubview(refreshControl) - webView.scrollView.delegate = self } private func setupHierarchy() { @@ -95,31 +87,63 @@ class WebView: UIView { } } + func setupRefreshControl() { + // pan gesture + let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleSwipe)) + panGestureRecognizer.delegate = self // UIGestureRecognizerDelegate + addGestureRecognizer(panGestureRecognizer) + // refresh control + let refreshControl = RefreshControl(frame: .init(x: 0, y: -refreshControlHeight, width: frame.size.width, height: refreshControlHeight)) + webView.scrollView.addSubview(refreshControl) + webView.scrollView.delegate = self // UIScrollViewDelegate + self.refreshControl = refreshControl + } + private func loadWebsite() { guard let url = selectedWebsite else { return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = true } + private func debounce(interval: TimeInterval, action: @escaping (() -> Void)) { + debounceTimer?.invalidate() + debounceTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: false, block: { _ in action() }) + } + @objc func handleSwipe(_ gesture: UIPanGestureRecognizer) { - guard isActive else { return } // 활성 상태일 때만 처리 + guard isActive, let refreshControl = refreshControl else { return } let translation = gesture.translation(in: self) - if gesture.state == .ended { // 사용자의 터치가 끝났을 때 - if abs(translation.x) > 100 { + if gesture.state == .changed { + if abs(translation.x) > refreshControlHeight { if translation.x > 0 { // 오른쪽 스와이프 : 처음 북마크로 돌아가기 - loadWebsite() + refreshControl.setSelected(.back) } else { // 왼쪽 스와이프 : 현재 링크 북마크 추가 - guard let url = webView.url else { return } - delegate?.pushAddBookMarkViewController(url: url) + refreshControl.setSelected(.addBookmark) } } else { // 아래 : 새로고침 - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in - self?.webView.reload() - } + refreshControl.setSelected(.refresh) + } + } else if gesture.state == .ended { // 사용자의 터치가 끝났을 때 + switch refreshControl.currentType { + case .addBookmark: + guard let url = webView.url else { return } + delegate?.pushAddBookMarkViewController(url: url) + case .refresh: + self.webView.reload() + case .back: + loadWebsite() + case .none: break } - // 제스처 인식 후 초기화 + // 제스처 완료 후 초기화 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + refreshControl.clear() + } + } + // 제스처 초기화 + if gesture.state == .ended || gesture.state == .cancelled { gesture.setTranslation(CGPoint.zero, in: self) + refreshControl.currentType = nil } } @@ -140,7 +164,6 @@ extension WebView: WKNavigationDelegate { extension WebView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { - let refreshControlHeight: CGFloat = 100.0 if scrollView.contentOffset.y < -refreshControlHeight { isActive = true } else { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index d5741ce..19b2ebe 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -29,6 +29,12 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol contentView.selectedWebsite = selectedWebsite } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + guard let contentView = contentView as? WebView else { return } + contentView.setupRefreshControl() + } + // MARK: - BaseViewControllerProtocol func setupNavigationBar() { From f34d3f5a099b19df6c76826b72ed8c0188cbdce4 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 10:17:38 +0900 Subject: [PATCH 213/370] =?UTF-8?q?feat:=20=EC=84=A4=EC=A0=95=20=EC=A7=84?= =?UTF-8?q?=EB=8F=99=20on/off=20=EC=8A=A4=EC=9C=84=EC=B9=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/SettingsItem.swift | 2 ++ iBox/Sources/Settings/SettingsView.swift | 17 +++++++++++++---- iBox/Sources/Settings/SettingsViewModel.swift | 4 ++++ iBox/Sources/Shared/UserDefaultsManager.swift | 3 +++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Model/SettingsItem.swift b/iBox/Sources/Model/SettingsItem.swift index d725301..4b0c992 100644 --- a/iBox/Sources/Model/SettingsItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -10,6 +10,7 @@ import Foundation enum SettingsType { case theme case homeTab + case haptics case preload case reset case guide @@ -19,6 +20,7 @@ enum SettingsType { switch self { case .theme: "테마" case .homeTab: "홈화면" + case .haptics: "진동" case .preload: "즐겨찾기 미리 로드" case .reset: "데이터 초기화" case .guide: "앱 소개" diff --git a/iBox/Sources/Settings/SettingsView.swift b/iBox/Sources/Settings/SettingsView.swift index e1fe94c..4f5745d 100644 --- a/iBox/Sources/Settings/SettingsView.swift +++ b/iBox/Sources/Settings/SettingsView.swift @@ -69,7 +69,12 @@ final class SettingsView: UIView { // MARK: - Action Functions - @objc private func handleSwitchControlTap(_ controlSwitch: UISwitch) { + @objc private func handleHapticsSwitchTap(_ controlSwitch: UISwitch) { + guard let viewModel = viewModel else { return } + viewModel.input.send(.setHaptics(controlSwitch.isOn)) + } + + @objc private func handlePreloadSwitchTap(_ controlSwitch: UISwitch) { guard let viewModel = viewModel else { return } viewModel.input.send(.setPreload(controlSwitch.isOn)) } @@ -100,7 +105,7 @@ extension SettingsView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } let settingsItem = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row].settingsItem - if (settingsItem.type != SettingsType.preload) { + if (settingsItem.type != SettingsType.haptics && settingsItem.type != SettingsType.preload) { delegate?.pushViewController(settingsItem.type) } } @@ -120,9 +125,13 @@ extension SettingsView: UITableViewDataSource { as? SettingsItemCell else { return UITableViewCell() } let cellViewModel = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row] cell.bindViewModel(cellViewModel) - if cellViewModel.flag != nil { + let settingsType = cellViewModel.settingsItem.type + if settingsType == .haptics { + cell.switchControl.removeTarget(nil, action: nil, for: .valueChanged) + cell.switchControl.addTarget(self, action: #selector(handleHapticsSwitchTap), for: .valueChanged) + } else if settingsType == .preload { cell.switchControl.removeTarget(nil, action: nil, for: .valueChanged) - cell.switchControl.addTarget(self, action: #selector(handleSwitchControlTap), for: .valueChanged) + cell.switchControl.addTarget(self, action: #selector(handlePreloadSwitchTap), for: .valueChanged) } return cell } diff --git a/iBox/Sources/Settings/SettingsViewModel.swift b/iBox/Sources/Settings/SettingsViewModel.swift index a6fbda4..73a1581 100644 --- a/iBox/Sources/Settings/SettingsViewModel.swift +++ b/iBox/Sources/Settings/SettingsViewModel.swift @@ -12,6 +12,7 @@ class SettingsViewModel { enum Input { case viewWillAppear + case setHaptics(_ isOn: Bool) case setPreload(_ isOn: Bool) } @@ -33,6 +34,8 @@ class SettingsViewModel { self?.sectionViewModels.removeAll() self?.updateSectionViewModels() self?.output.send(.updateSectionViewModels) + case let .setHaptics(isOn): + UserDefaultsManager.isHaptics = isOn case let .setPreload(isOn): UserDefaultsManager.isPreload = isOn } @@ -44,6 +47,7 @@ class SettingsViewModel { sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ SettingsCellViewModel(SettingsItem(type: .theme, description: UserDefaultsManager.theme.toString())), SettingsCellViewModel(SettingsItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), + SettingsCellViewModel(SettingsItem(type: .haptics, flag: UserDefaultsManager.isHaptics)), SettingsCellViewModel(SettingsItem(type: .preload, flag: UserDefaultsManager.isPreload)) ])) sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index e8de7dc..556951f 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -21,6 +21,9 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isDefaultDataInserted", defaultValue: false) static var isDefaultDataInserted: Bool + @UserDefaultsData(key: "isHaptics", defaultValue: true) + static var isHaptics: Bool + @UserDefaultsData(key: "isPreload", defaultValue: false) static var isPreload: Bool From 562f1c29d0f8a9fd89d4d04148b2266c1372e131 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 11:25:42 +0900 Subject: [PATCH 214/370] =?UTF-8?q?feat:=20=EC=A7=84=EB=8F=99=20=ED=9A=A8?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 15 +++++++++++++++ iBox/Sources/BoxList/BoxListViewController.swift | 15 +++++++++++++++ iBox/Sources/Main/MainTabBarController.swift | 5 +++++ 3 files changed, 35 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 2a99fe6..3c436ba 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -194,6 +194,11 @@ extension BoxListView: UITableViewDelegate { guard let viewModel else { return } viewModel.input.send(.folderTapped(section: button.tag)) button.toggleStatus() + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .light) + generator.prepare() + generator.impactOccurred() + } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { @@ -207,6 +212,11 @@ extension BoxListView: UITableViewDelegate { // 액션 정의 let favoriteAction = UIContextualAction(style: .normal, title: "favorite", handler: { [weak self] (action, view, completionHandler) in self?.viewModel?.input.send(.toggleFavorite(indexPath: indexPath)) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } completionHandler(true) }) favoriteAction.backgroundColor = .box2 @@ -226,6 +236,11 @@ extension BoxListView: UITableViewDelegate { let deleteAction = UIContextualAction(style: .normal, title: "delete", handler: {(action, view, completionHandler) in self.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } completionHandler(true) }) deleteAction.backgroundColor = .systemGray diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index da1fe42..4feee24 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -86,6 +86,11 @@ extension BoxListViewController: AddBookmarkViewControllerProtocol { func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) { guard let contentView = contentView as? BoxListView else { return } contentView.viewModel?.addBookmarkDirect(bookmark, at: folderIndex) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } } } @@ -195,10 +200,20 @@ extension BoxListViewController: EditFolderViewControllerDelegate { func deleteFolder(at row: Int) { guard let contentView = contentView as? BoxListView else { return } contentView.viewModel?.deleteFolder(at: row) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } } func addFolder(_ folder: Folder) { guard let contentView = contentView as? BoxListView else { return } contentView.viewModel?.addFolder(folder) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } } } diff --git a/iBox/Sources/Main/MainTabBarController.swift b/iBox/Sources/Main/MainTabBarController.swift index 625d21d..f1b8329 100644 --- a/iBox/Sources/Main/MainTabBarController.swift +++ b/iBox/Sources/Main/MainTabBarController.swift @@ -52,6 +52,11 @@ class MainTabBarController: UITabBarController { extension MainTabBarController: UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .light) + generator.prepare() + generator.impactOccurred() + } if tabBarController.selectedIndex == 1 && previousTabIndex == 1 { WebViewPreloader.shared.resetFavoriteView() } From 81116f82ca5206db805d2337310114ece6a486b9 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 11:37:34 +0900 Subject: [PATCH 215/370] =?UTF-8?q?feat:=20=EC=9B=B9=EB=B7=B0=20=EB=82=B4?= =?UTF-8?q?=20=EB=A1=9C=EB=94=A9=20=EC=B6=94=EC=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 22cbe7b..1305900 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -103,12 +103,18 @@ class WebView: UIView { extension WebView: WKNavigationDelegate { + func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { + // 로딩 시작 시 프로그레스 바를 보여주고 진행률 초기화 + progressView.isHidden = false + progressView.setProgress(0.0, animated: false) + } + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { progressView.setProgress(1.0, animated: true) - // 약간의 딜레이를 주어서 프로그레스 바가 완전히 차도록 함 + // 약간의 딜레이 후 프로그레스 바를 숨김 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.progressView.isHidden = true } } - + } From 8e1a703ef46d4cf316479d9b579f7ad4cdf88235 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 12:36:23 +0900 Subject: [PATCH 216/370] =?UTF-8?q?style:=20Share=20Extension=20UI=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/ShareViewController.swift | 7 ++-- .../View/ShareExtensionBackGroundView.swift | 33 +++++-------------- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 4f51405..d7d0a2b 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -40,9 +40,9 @@ class CustomShareViewController: UIViewController { private func setupLayout() { backgroundView.snp.makeConstraints { make in - make.trailing.leading.equalToSuperview().inset(20) - make.center.equalToSuperview() - make.height.equalTo(200) + make.trailing.leading.equalToSuperview().inset(30) + make.center.equalToSuperview().offset(-20) + make.height.equalTo(120) } } @@ -91,7 +91,6 @@ class CustomShareViewController: UIViewController { DispatchQueue.main.async { if let url = data as? URL, error == nil { self?.dataURL = url.absoluteString - self?.backgroundView.updateLinkLabel(with: url.absoluteString) print("Shared URL: \(url.absoluteString)") } else { print("Failed to retrieve URL: \(String(describing: error))") diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift index abf5c48..04a4b3a 100644 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/View/ShareExtensionBackGroundView.swift @@ -25,25 +25,17 @@ class ShareExtensionBackGroundView: UIView { lazy var label: UILabel = { let label = UILabel() label.text = "이 링크를 iBox 앱에서 여시겠습니까?" - label.font = .systemFont(ofSize: 17) + label.font = .systemFont(ofSize: 15) label.textColor = .label return label }() - lazy var linkLabel: UILabel = { - let label = UILabel() - label.textColor = .label - label.numberOfLines = 3 - label.lineBreakMode = .byTruncatingTail - return label - }() - lazy var cancelButton: UIButton = { let button = UIButton() button.configuration = .plain() button.configuration?.attributedTitle = .init( "Cancel", - attributes: .init([.font: UIFont.systemFont(ofSize: 14)]) + attributes: .init([.font: UIFont.systemFont(ofSize: 13)]) ) return button }() @@ -53,7 +45,7 @@ class ShareExtensionBackGroundView: UIView { button.configuration = .plain() button.configuration?.attributedTitle = .init( "Open", - attributes: .init([.font: UIFont.boldSystemFont(ofSize: 14)]) + attributes: .init([.font: UIFont.boldSystemFont(ofSize: 13)]) ) return button }() @@ -76,7 +68,7 @@ class ShareExtensionBackGroundView: UIView { private func setupProperty() { backgroundColor = .systemBackground clipsToBounds = true - layer.cornerRadius = 10 + layer.cornerRadius = 15 cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) @@ -84,35 +76,26 @@ class ShareExtensionBackGroundView: UIView { private func setupHierarchy() { addSubview(label) - addSubview(linkLabel) addSubview(cancelButton) addSubview(openAppButton) } private func setupLayout() { label.snp.makeConstraints { make in - make.top.leading.equalToSuperview().inset(20) - } - - linkLabel.snp.makeConstraints { make in - make.top.equalTo(label.snp.bottom).offset(10) - make.leading.trailing.equalToSuperview().inset(20) + make.top.equalToSuperview().inset(25) + make.leading.equalToSuperview().inset(20) } cancelButton.snp.makeConstraints { make in - make.trailing.equalTo(openAppButton.snp.leading).offset(-20) + make.trailing.equalTo(openAppButton.snp.leading) make.centerY.equalTo(openAppButton.snp.centerY) } openAppButton.snp.makeConstraints { make in - make.trailing.bottom.equalToSuperview().inset(20) + make.trailing.bottom.equalToSuperview().inset(15) } } - func updateLinkLabel(with text: String) { - linkLabel.text = text - } - // MARK: - Action Functions @objc func cancelButtonTapped() { From 47d0fe86a1ec91acc349e8e0ae2d398115ce04e4 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 12:54:51 +0900 Subject: [PATCH 217/370] =?UTF-8?q?fix:=20=EC=95=B1=20=ED=83=80=EA=B2=9F?= =?UTF-8?q?=20CFBundleShortVersionString=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index 5810beb..b358e2a 100644 --- a/Project.swift +++ b/Project.swift @@ -30,7 +30,7 @@ class iBoxFactory: ProjectFactory { "ITSAppUsesNonExemptEncryption": false, "CFBundleDisplayName": "iBox", "CFBundleName": "iBox", - "CFBundleShortVersionString": "1.2.2", + "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", "UILaunchStoryboardName": "LaunchScreen", "UIApplicationSceneManifest": [ @@ -58,7 +58,7 @@ class iBoxFactory: ProjectFactory { private let shareExtensionInfoPlist: [String: Plist.Value] = [ "CFBundleDisplayName": "iBox.Share", - "CFBundleShortVersionString": "1.0", + "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", "NSExtension": [ "NSExtensionAttributes": [ From 5e3e22982ddbd9b2b22be0d9687c526878945aab Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 14:03:24 +0900 Subject: [PATCH 218/370] =?UTF-8?q?style:=20RefreshControl=20backgroundCol?= =?UTF-8?q?or=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/RefreshControl.swift | 1 + iBox/Sources/Web/WebView.swift | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift index 8f791aa..874139f 100644 --- a/iBox/Sources/Web/RefreshControl.swift +++ b/iBox/Sources/Web/RefreshControl.swift @@ -77,6 +77,7 @@ class RefreshControl: UIView { // MAKR: - Setup Methods private func setupProperty() { + backgroundColor = .backgroundColor isUserInteractionEnabled = true } diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 12c3cbd..6d25a2c 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -48,7 +48,6 @@ class WebView: UIView { setupProperty() setupHierarchy() setupLayout() -// setupRefreshControl() } required init?(coder: NSCoder) { From 63477c9d513b6303c2e37d9e36ac0fd234afe13c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 14:06:52 +0900 Subject: [PATCH 219/370] =?UTF-8?q?feat:=20=EC=A6=90=EA=B2=A8=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0,=20=EA=B3=B5=EC=9C=A0,=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B6=80=EB=93=9C=EB=9F=AC=EC=9A=B4=20=EC=A7=84=EB=8F=99=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 3c436ba..316c5bf 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -229,6 +229,11 @@ extension BoxListView: UITableViewDelegate { let shareAction = UIContextualAction(style: .normal, title: "share", handler: {(action, view, completionHandler) in let cellViewModel = self.viewModel?.viewModel(at: indexPath) self.delegate?.pushViewController(url: cellViewModel?.url) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } completionHandler(true) }) shareAction.backgroundColor = .box3 @@ -291,6 +296,11 @@ extension BoxListView: UITableViewDelegate { private func makeContextMenu(for indexPath: IndexPath) -> UIMenu { let deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] action in self?.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } } let isFavorite = self.viewModel?.isFavoriteBookmark(at: indexPath) ?? false @@ -299,11 +309,22 @@ extension BoxListView: UITableViewDelegate { let favoriteAction = UIAction(title: favoriteActionTitle, image: favoriteActionImage) { [weak self] action in self?.viewModel?.input.send(.toggleFavorite(indexPath: indexPath)) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } } let shareAction = UIAction(title: "공유하기", image: UIImage(systemName: "square.and.arrow.up")) { [weak self] action in guard let self = self, let url = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].url else { return } + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } + let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil) if let viewController = self.delegate as? UIViewController { viewController.present(activityViewController, animated: true, completion: nil) From e16b77f4657126d2c33a8729e9fad9ac4f213366 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 9 Apr 2024 14:46:21 +0900 Subject: [PATCH 220/370] =?UTF-8?q?feat:=20RefreshControl=20=EB=86=92?= =?UTF-8?q?=EC=9D=B4=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=A7=84=EB=8F=99?= =?UTF-8?q?=20=ED=9A=A8=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/RefreshControl.swift | 7 ++++++- iBox/Sources/Web/WebView.swift | 11 +++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift index 874139f..6f1a80f 100644 --- a/iBox/Sources/Web/RefreshControl.swift +++ b/iBox/Sources/Web/RefreshControl.swift @@ -90,7 +90,7 @@ class RefreshControl: UIView { private func setupLayout() { stackView.snp.makeConstraints { make in - make.edges.equalToSuperview().inset(20) + make.leading.bottom.trailing.equalToSuperview().inset(20) } } @@ -103,6 +103,11 @@ class RefreshControl: UIView { case .refresh: refreshButton.backgroundColor = .tableViewBackgroundColor case .back: backButton.backgroundColor = .tableViewBackgroundColor } + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .light) + generator.prepare() + generator.impactOccurred() + } } func clear() { diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 6d25a2c..fd7f2ed 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -22,7 +22,6 @@ class WebView: UIView { } } - private var debounceTimer: Timer? private var refreshControlHeight: CGFloat = 120.0 private var isActive = false @@ -92,8 +91,9 @@ class WebView: UIView { panGestureRecognizer.delegate = self // UIGestureRecognizerDelegate addGestureRecognizer(panGestureRecognizer) // refresh control - let refreshControl = RefreshControl(frame: .init(x: 0, y: -refreshControlHeight, width: frame.size.width, height: refreshControlHeight)) + let refreshControl = RefreshControl(frame: .init(x: 0, y: -frame.size.height, width: frame.size.width, height: frame.size.height)) webView.scrollView.addSubview(refreshControl) + webView.scrollView.backgroundColor = .backgroundColor webView.scrollView.delegate = self // UIScrollViewDelegate self.refreshControl = refreshControl } @@ -104,17 +104,12 @@ class WebView: UIView { webView.allowsBackForwardNavigationGestures = true } - private func debounce(interval: TimeInterval, action: @escaping (() -> Void)) { - debounceTimer?.invalidate() - debounceTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: false, block: { _ in action() }) - } - @objc func handleSwipe(_ gesture: UIPanGestureRecognizer) { guard isActive, let refreshControl = refreshControl else { return } let translation = gesture.translation(in: self) if gesture.state == .changed { - if abs(translation.x) > refreshControlHeight { + if abs(translation.x) > 60.0 { if translation.x > 0 { // 오른쪽 스와이프 : 처음 북마크로 돌아가기 refreshControl.setSelected(.back) } else { // 왼쪽 스와이프 : 현재 링크 북마크 추가 From 33b9099450abb0ef34fe93cc0a6262a860817759 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 9 Apr 2024 14:46:42 +0900 Subject: [PATCH 221/370] fix: folder error --- iBox/Sources/BoxList/BoxListViewModel.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 7cc78ef..a4ba8e9 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -150,6 +150,9 @@ class BoxListViewModel { func deleteFolder(at row: Int) { sectionsToReload.remove(boxList[row].id) boxList.remove(at: row) + for box in boxList { + sectionsToReload.update(with: box.id) + } } func editFolderName(at row: Int, name: String) { From bd412b9671d73c59afb9a2c98b580f3cda867b21 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 9 Apr 2024 15:24:44 +0900 Subject: [PATCH 222/370] feat: back gesture in favorite view --- iBox/Sources/Shared/WebViewPreloader.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 7baf685..4d51fd1 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -20,6 +20,7 @@ class WebViewPreloader { config.allowsInlineMediaPlayback = true let webView = WKWebView(frame: .zero, configuration: config) + webView.allowsBackForwardNavigationGestures = true webView.isOpaque = false webView.load(URLRequest(url: url ?? defaultUrl)) favoriteView = (url ?? defaultUrl, webView) From 0c42fd82783cda5217a2934e9186d3be619e4754 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 11 Apr 2024 00:41:24 +0900 Subject: [PATCH 223/370] design: folder button animation --- iBox/Sources/BoxList/FolderButton.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 233f4da..23d6cbd 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -21,6 +21,7 @@ class FolderButton: UIButton { private let openCloseImageView = UIImageView().then { $0.tintColor = .tertiaryLabel + $0.contentMode = .scaleAspectFit } // MARK: - Initializer @@ -41,7 +42,7 @@ class FolderButton: UIButton { private func setupProperty() { backgroundColor = .tableViewBackgroundColor - openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.down") : UIImage(systemName: "chevron.right") + openCloseImageView.image = UIImage(systemName: "chevron.right") } private func setupHierarchy() { @@ -68,6 +69,15 @@ class FolderButton: UIButton { func toggleStatus() { isOpen = !isOpen - openCloseImageView.image = isOpen ? UIImage(systemName: "chevron.down") : UIImage(systemName: "chevron.right") + if isOpen { + UIView.animate(withDuration: 0.25) { [weak self] in + self?.openCloseImageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) + } + } else { + UIView.animate(withDuration: 0.25) { [weak self] in + self?.openCloseImageView.transform = CGAffineTransform(rotationAngle: 0) + } + } + } } From 2af20269c5e490e54103ee3f8ebce8f2fe69bbe6 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 11 Apr 2024 17:30:42 +0900 Subject: [PATCH 224/370] =?UTF-8?q?=F0=9F=94=A8=20refactor:=20FavoriteView?= =?UTF-8?q?=20WebView=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 4 ++-- .../Extension/Notification+Extension.swift | 15 +++++++++++++++ iBox/Sources/Favorite/FavoriteView.swift | 19 ++++++------------- .../Settings/Reset/ResetViewController.swift | 4 ---- iBox/Sources/Shared/WebViewPreloader.swift | 14 +++++--------- 5 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 iBox/Sources/Extension/Notification+Extension.swift diff --git a/Project.swift b/Project.swift index b358e2a..e5e117c 100644 --- a/Project.swift +++ b/Project.swift @@ -30,7 +30,7 @@ class iBoxFactory: ProjectFactory { "ITSAppUsesNonExemptEncryption": false, "CFBundleDisplayName": "iBox", "CFBundleName": "iBox", - "CFBundleShortVersionString": "1.0.0", + "CFBundleShortVersionString": "1.2.2", "CFBundleVersion": "1", "UILaunchStoryboardName": "LaunchScreen", "UIApplicationSceneManifest": [ @@ -58,7 +58,7 @@ class iBoxFactory: ProjectFactory { private let shareExtensionInfoPlist: [String: Plist.Value] = [ "CFBundleDisplayName": "iBox.Share", - "CFBundleShortVersionString": "1.0.0", + "CFBundleShortVersionString": "1.2.2", "CFBundleVersion": "1", "NSExtension": [ "NSExtensionAttributes": [ diff --git a/iBox/Sources/Extension/Notification+Extension.swift b/iBox/Sources/Extension/Notification+Extension.swift new file mode 100644 index 0000000..fbe5b65 --- /dev/null +++ b/iBox/Sources/Extension/Notification+Extension.swift @@ -0,0 +1,15 @@ +// +// Notification+Extension.swift +// iBox +// +// Created by jiyeon on 4/11/24. +// + +import Foundation + +extension Notification.Name { + + static let didResetData = Notification.Name("didResetData") + static let didAddBookmark = Notification.Name("didAddBookmark") + +} diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 5d32708..f4834e0 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -12,15 +12,13 @@ import SnapKit class FavoriteView: UIView { - private lazy var webView = { + lazy var webView = { if WebViewPreloader.shared.getFavoriteView() == nil { loadFavoriteWeb() } return WebViewPreloader.shared.getFavoriteView() }() - private let refreshControl = UIRefreshControl() - // MARK: - Initializer override init(frame: CGRect) { @@ -34,13 +32,16 @@ class FavoriteView: UIView { fatalError("init(coder:) has not been implemented") } + override func layoutSubviews() { + super.layoutSubviews() + webView?.setupRefreshControl() + } + // MARK: - Setup Methods private func setupProperty() { guard let webView else { return } backgroundColor = .backgroundColor - webView.scrollView.refreshControl = refreshControl - refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged) } private func setupHierarchy() { @@ -55,14 +56,6 @@ class FavoriteView: UIView { } } - @objc private func handleRefreshControl() { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in - guard let self = self , let webView = self.webView else { return } - webView.reload() - refreshControl.endRefreshing() - } - } - private func loadFavoriteWeb() { let favoriteId = UserDefaultsManager.favoriteId var favoriteUrl: URL? = nil diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index 4d2d4f7..3b0fded 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -86,7 +86,3 @@ extension ResetViewController: ResetViewDelegate { } } - -extension Notification.Name { - static let didResetData = Notification.Name("didResetData") -} diff --git a/iBox/Sources/Shared/WebViewPreloader.swift b/iBox/Sources/Shared/WebViewPreloader.swift index 4d51fd1..734c0df 100644 --- a/iBox/Sources/Shared/WebViewPreloader.swift +++ b/iBox/Sources/Shared/WebViewPreloader.swift @@ -10,29 +10,25 @@ import WebKit class WebViewPreloader { static let shared = WebViewPreloader() - private var favoriteView: (url: URL, webView: WKWebView)? + private var favoriteView: (url: URL, webView: WebView)? private var defaultUrl = URL(string: "https://profile.intra.42.fr/")! private init() {} func preloadFavoriteView(url: URL?) { - let config = WKWebViewConfiguration() - config.allowsInlineMediaPlayback = true - - let webView = WKWebView(frame: .zero, configuration: config) - webView.allowsBackForwardNavigationGestures = true + let webView = WebView() webView.isOpaque = false - webView.load(URLRequest(url: url ?? defaultUrl)) + webView.selectedWebsite = url ?? defaultUrl favoriteView = (url ?? defaultUrl, webView) } - func getFavoriteView() -> WKWebView? { + func getFavoriteView() -> WebView? { return favoriteView?.webView } func resetFavoriteView() { guard let favoriteView else { return } - favoriteView.webView.load(URLRequest(url: favoriteView.url)) + favoriteView.webView.selectedWebsite = favoriteView.url } func setFavoriteUrl(url: URL?) { From 406892655f77fbf66c2deaffe12ba11eab7066ae Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 11 Apr 2024 17:33:22 +0900 Subject: [PATCH 225/370] =?UTF-8?q?build:=20bundle=20version=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index e5e117c..b358e2a 100644 --- a/Project.swift +++ b/Project.swift @@ -30,7 +30,7 @@ class iBoxFactory: ProjectFactory { "ITSAppUsesNonExemptEncryption": false, "CFBundleDisplayName": "iBox", "CFBundleName": "iBox", - "CFBundleShortVersionString": "1.2.2", + "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", "UILaunchStoryboardName": "LaunchScreen", "UIApplicationSceneManifest": [ @@ -58,7 +58,7 @@ class iBoxFactory: ProjectFactory { private let shareExtensionInfoPlist: [String: Plist.Value] = [ "CFBundleDisplayName": "iBox.Share", - "CFBundleShortVersionString": "1.2.2", + "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", "NSExtension": [ "NSExtensionAttributes": [ From a4613a5ebb629b32eba941457894d5dbe677ecd0 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 11 Apr 2024 17:57:43 +0900 Subject: [PATCH 226/370] =?UTF-8?q?feat:=20=EC=83=88=20=EC=B0=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=97=B4=EA=B8=B0=20=EC=98=B5=EC=85=98=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EB=82=B4=EB=B6=80=EC=97=90=EC=84=9C=20=EC=97=B4?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index aa81580..0572dc6 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -162,7 +162,15 @@ extension WebView: WKNavigationDelegate { self.progressView.isHidden = true } } - + + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + // "새 창으로 열기" 링크 WebView 내에서 열기 + if navigationAction.targetFrame == nil { + webView.load(navigationAction.request) + } + decisionHandler(.allow) + } + } extension WebView: UIScrollViewDelegate { From 343b85545383fa5db0b47cd9238d04eea489d83b Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 11 Apr 2024 18:02:26 +0900 Subject: [PATCH 227/370] feat: empty folder label --- .../sitting_fox0.imageset/Contents.json | 3 ++ .../sitting_fox1.imageset/Contents.json | 3 ++ .../sitting_fox2.imageset/Contents.json | 3 ++ .../sitting_fox3.imageset/Contents.json | 3 ++ iBox/Sources/BoxList/BoxListView.swift | 42 ++++++++++++++++++- .../BoxList/BoxListViewController.swift | 2 - iBox/Sources/BoxList/FolderButton.swift | 2 +- iBox/Sources/Extension/UIFont+Extension.swift | 4 +- .../Sources/Extension/UIImage+Extension.swift | 27 ++++++++++++ 9 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 iBox/Sources/Extension/UIImage+Extension.swift diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json index 44e39c0..9190e47 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json @@ -17,5 +17,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" } } diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json index 1dfc5aa..688a821 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json @@ -17,5 +17,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" } } diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json index dd0f044..9321c41 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json @@ -17,5 +17,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" } } diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json index a64ac22..5acd3eb 100644 --- a/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json +++ b/iBox/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json @@ -17,5 +17,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" } } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 316c5bf..853026e 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -43,6 +43,32 @@ class BoxListView: UIView { $0.rowHeight = 50 } + private let emptyStackView = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 10 + $0.isHidden = true + } + + private let emptyLabel = UILabel().then { + $0.text = "폴더가 없습니다" + $0.font = .emptyLabelFont + $0.textColor = .secondaryLabel + $0.textAlignment = .center + } + + private let emptyImageView = UIImageView().then { + let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() + let images = [image0, image1, image2, image3] + $0.contentMode = .scaleAspectFit + $0.tintColor = .secondaryLabel + $0.animationImages = images + $0.animationDuration = 1.5 + $0.startAnimating() + } + // MARK: - Initializer override init(frame: CGRect) { @@ -74,6 +100,7 @@ class BoxListView: UIView { private func setupHierarchy() { addSubview(backgroundView) backgroundView.addSubview(tableView) + backgroundView.addSubview(emptyStackView) } private func setupLayout() { @@ -86,6 +113,18 @@ class BoxListView: UIView { make.top.bottom.equalToSuperview().offset(10) make.leading.trailing.equalToSuperview() } + + emptyStackView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + emptyImageView.snp.makeConstraints { make in + make.width.height.equalTo(30) + } + + emptyStackView.addArrangedSubview(emptyLabel) + emptyStackView.addArrangedSubview(emptyImageView) + } private func configureDataSource() { @@ -130,6 +169,7 @@ class BoxListView: UIView { switch event { case .sendBoxList(boxList: let boxList): self?.applySnapshot(with: boxList) + self?.emptyStackView.isHidden = !boxList.isEmpty case .editStatus(isEditing: let isEditing): self?.tableView.setEditing(isEditing, animated: true) guard let snapshot = self?.boxListDataSource.snapshot() else { return } @@ -150,7 +190,7 @@ class BoxListView: UIView { NotificationCenter.default.addObserver(self, selector: #selector(dataDidReset), name: .didResetData, object: nil) } - @objc func dataDidReset(notification: NSNotification) { + @objc private func dataDidReset(notification: NSNotification) { viewModel?.input.send(.viewDidLoad) } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 54ed918..d0b342b 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -51,8 +51,6 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - Action Functions @objc private func addButtonTapped() { - guard let contentView = contentView as? BoxListView else { return } - let addBookmarkViewController = AddBookmarkViewController() addBookmarkViewController.delegate = self diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 23d6cbd..5a38019 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -53,7 +53,7 @@ class FolderButton: UIButton { private func setupLayout() { openCloseImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.width.height.equalTo(20) + make.width.height.equalTo(15) make.trailing.equalToSuperview().offset(-20) } diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift index c222e95..c0cb074 100644 --- a/iBox/Sources/Extension/UIFont+Extension.swift +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -11,12 +11,12 @@ extension UIFont { static let titleFont = UIFont.systemFont(ofSize: 20.0, weight: .bold) static let subTitlefont = UIFont.systemFont(ofSize: 17.0, weight: .semibold) - static let lableFont = UIFont.systemFont(ofSize: 16.0) + static let labelFont = UIFont.systemFont(ofSize: 16.0) static let semiboldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .semibold) static let boldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .bold) static let cellTitleFont = UIFont.systemFont(ofSize: 16.0) static let cellDescriptionFont = UIFont.systemFont(ofSize: 13.0, weight: .regular) static let descriptionFont = UIFont.systemFont(ofSize: 14.0) static let refreshControlFont = UIFont.boldSystemFont(ofSize: 12.0) - + static let emptyLabelFont = UIFont.systemFont(ofSize: 17.0, weight: .regular) } diff --git a/iBox/Sources/Extension/UIImage+Extension.swift b/iBox/Sources/Extension/UIImage+Extension.swift new file mode 100644 index 0000000..1b7e640 --- /dev/null +++ b/iBox/Sources/Extension/UIImage+Extension.swift @@ -0,0 +1,27 @@ +// +// UIImage+Extension.swift +// iBox +// +// Created by 이지현 on 4/11/24. +// + +import UIKit + +extension UIImage { + func imageWithColor(_ color: UIColor) -> UIImage? { + UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale); + guard let context = UIGraphicsGetCurrentContext(), let cgImage = self.cgImage else { return nil } + + context.translateBy(x: 0, y: self.size.height) + context.scaleBy(x: 1.0, y: -1.0); + context.setBlendMode(.normal) + let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) + context.clip(to: rect, mask: cgImage) + color.setFill() + context.fill(rect) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext(); + + return newImage + } +} From cc369fb9ad088e9fb204bc2ad547c245aa7ba7ad Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:25:39 +0900 Subject: [PATCH 228/370] style: share extension assets --- .../Media.xcassets/128.imageset/128 1.png | Bin 0 -> 7717 bytes .../Media.xcassets/128.imageset/128.png | Bin 0 -> 7717 bytes .../Media.xcassets/128.imageset/Contents.json | 22 ++++++++++++++++++ .../Resources/Media.xcassets/Contents.json | 6 +++++ 4 files changed, 28 insertions(+) create mode 100644 ShareExtension/Resources/Media.xcassets/128.imageset/128 1.png create mode 100644 ShareExtension/Resources/Media.xcassets/128.imageset/128.png create mode 100644 ShareExtension/Resources/Media.xcassets/128.imageset/Contents.json create mode 100644 ShareExtension/Resources/Media.xcassets/Contents.json diff --git a/ShareExtension/Resources/Media.xcassets/128.imageset/128 1.png b/ShareExtension/Resources/Media.xcassets/128.imageset/128 1.png new file mode 100644 index 0000000000000000000000000000000000000000..077d76c18344fce066fb9f879587ff94f3e58f46 GIT binary patch literal 7717 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 Date: Sun, 14 Apr 2024 03:26:46 +0900 Subject: [PATCH 229/370] feat: change share extension view --- Project.swift | 8 +- ShareExtension/Model/Metadata.swift | 12 -- ShareExtension/ShareViewController.swift | 182 ------------------ .../ShareExtension+UIColor+Extension.swift | 22 +++ .../Extension/UIbutton+Extension.swift | 22 +++ .../Sources/ShareViewController.swift | 152 +++++++++++++++ .../View/ShareExtensionBackGroundView.swift | 145 ++++++++++++++ .../View/ShareExtensionBackGroundView.swift | 108 ----------- 8 files changed, 345 insertions(+), 306 deletions(-) delete mode 100644 ShareExtension/Model/Metadata.swift delete mode 100644 ShareExtension/ShareViewController.swift create mode 100644 ShareExtension/Sources/Extension/ShareExtension+UIColor+Extension.swift create mode 100644 ShareExtension/Sources/Extension/UIbutton+Extension.swift create mode 100644 ShareExtension/Sources/ShareViewController.swift create mode 100644 ShareExtension/Sources/View/ShareExtensionBackGroundView.swift delete mode 100644 ShareExtension/View/ShareExtensionBackGroundView.swift diff --git a/Project.swift b/Project.swift index b358e2a..dabac2a 100644 --- a/Project.swift +++ b/Project.swift @@ -18,12 +18,12 @@ class iBoxFactory: ProjectFactory { let dependencies: [TargetDependency] = [ .external(name: "SnapKit"), + .external(name: "SwiftSoup"), .target(name: "iBoxShareExtension") ] let iBoxShareExtensionDependencies: [TargetDependency] = [ - .external(name: "SnapKit"), - .external(name: "SwiftSoup") + .external(name: "SnapKit") ] private let appInfoPlist: [String: Plist.Value] = [ @@ -92,8 +92,8 @@ class iBoxFactory: ProjectFactory { bundleId: "\(bundleId).ShareExtension", deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), infoPlist: .extendingDefault(with: shareExtensionInfoPlist), - sources: ["ShareExtension/**"], - resources: [], + sources: ["ShareExtension/Sources/**"], + resources: ["ShareExtension/Resources/**"], dependencies: iBoxShareExtensionDependencies ) diff --git a/ShareExtension/Model/Metadata.swift b/ShareExtension/Model/Metadata.swift deleted file mode 100644 index 8f95deb..0000000 --- a/ShareExtension/Model/Metadata.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Metadata.swift -// iBoxShareExtension -// -// Created by 김찬희 on 2024/03/14. -// - -struct Metadata { - var title: String? - var faviconUrl: String? - var url: String? -} diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift deleted file mode 100644 index d7d0a2b..0000000 --- a/ShareExtension/ShareViewController.swift +++ /dev/null @@ -1,182 +0,0 @@ -// -// ShareViewController.swift -// iBoxWebShareExtension -// -// Created by Chan on 2/8/24. -// - -import UIKit -import Social -import UniformTypeIdentifiers - -import SnapKit -import SwiftSoup - -@objc(CustomShareViewController) -class CustomShareViewController: UIViewController { - - var backgroundView = ShareExtensionBackGroundView() - var dataURL: String? - - // MARK: - Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - setupProperty() - setupHierarchy() - setupLayout() - extractSharedURL() - } - - // MARK: - Setup Methods - - private func setupProperty() { - backgroundView.delegate = self - } - - private func setupHierarchy() { - view.addSubview(backgroundView) - } - - private func setupLayout() { - backgroundView.snp.makeConstraints { make in - make.trailing.leading.equalToSuperview().inset(30) - make.center.equalToSuperview().offset(-20) - make.height.equalTo(120) - } - } - - func getAppGroupUserDefaults() { - let defaults = UserDefaults(suiteName: "group.com.iBox") - if let data = defaults?.string(forKey: "share") { - print("ShareViewController: URL 가져오기: \(data)") - } - } - - func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { - UIView.animate(withDuration: 0.3, animations: { - self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) - }, completion: completion) - } - - // MARK: IBAction - - @IBAction func cancel() { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - } - - @objc func openURL(_ url: URL) -> Bool { - self.hideExtensionWithCompletionHandler(completion: { _ in - self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - - var responder: UIResponder? = self - while responder != nil { - if let application = responder as? UIApplication { - return application.perform(#selector(openURL(_:)), with: url) != nil - } - responder = responder?.next - } - return false - } - - func extractSharedURL() { - guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } - - for attachment in extensionItem.attachments ?? [] { - if attachment.hasItemConformingToTypeIdentifier(UTType.url.identifier) { - attachment.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { [weak self] (data, error) in - DispatchQueue.main.async { - if let url = data as? URL, error == nil { - self?.dataURL = url.absoluteString - print("Shared URL: \(url.absoluteString)") - } else { - print("Failed to retrieve URL: \(String(describing: error))") - } - } - } - break - } - } - } - - func fetchAndParseMetadata(from url: URL, completion: @escaping (Metadata) -> Void) { - URLSession.shared.dataTask(with: url) { data, response, error in - guard let data = data, error == nil else { - print("Failed to fetch data: \(String(describing: error))") - return - } - - let encodingName = (response as? HTTPURLResponse)?.textEncodingName ?? "utf-8" - let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) - - if let htmlContent = String(data: data, encoding: encoding) { - do { - let doc: Document = try SwiftSoup.parse(htmlContent) - let title: String? = try doc.title() - - let faviconSelectors = ["link[rel='shortcut icon']", "link[rel='icon']", "link[rel='apple-touch-icon']"] - var faviconUrl: String? = nil - - for selector in faviconSelectors { - if let faviconLink: Element = try doc.select(selector).first() { - if var href = try? faviconLink.attr("href"), !href.isEmpty { - if href.starts(with: "/") { - href = url.scheme! + "://" + url.host! + href - } else if !href.starts(with: "http") { - href = url.scheme! + "://" + url.host! + "/" + href - } - faviconUrl = href - break - } - } - } - - if faviconUrl == nil { - faviconUrl = url.scheme! + "://" + url.host! + "/favicon.ico" - } - - let decodedUrlString = url.absoluteString.removingPercentEncoding ?? url.absoluteString - let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: decodedUrlString) - - DispatchQueue.main.async { - completion(metadata) - } - } catch { - print("Failed to parse HTML: \(error.localizedDescription)") - } - } - }.resume() - } -} - -extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { - - func didTapCancel() { - cancel() - } - - func didTapOpenApp() { - guard let sharedURL = dataURL, let url = URL(string: sharedURL) else { - print("Share extension error") - return - } - fetchAndParseMetadata(from: url) { metadata in - dump(metadata) - let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" - let encodedData = metadata.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" - let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" - let urlString = "iBox://url?title=\(encodedTitle)&data=\(encodedData)&faviconUrl=\(encodedFaviconUrl)" - - if let openUrl = URL(string: urlString) { - if self.openURL(openUrl) { - print("iBox 앱이 성공적으로 열렸습니다.") - } else { - print("iBox 앱을 열 수 없습니다.") - } - } - } - } -} diff --git a/ShareExtension/Sources/Extension/ShareExtension+UIColor+Extension.swift b/ShareExtension/Sources/Extension/ShareExtension+UIColor+Extension.swift new file mode 100644 index 0000000..817e21e --- /dev/null +++ b/ShareExtension/Sources/Extension/ShareExtension+UIColor+Extension.swift @@ -0,0 +1,22 @@ +// +// ShareExtension+UIColor+Extension.swift +// iBoxShareExtension +// +// Created by Chan on 4/14/24. +// + +import UIKit + +extension UIColor { + + convenience init(hex: UInt, alpha: CGFloat = 1.0) { + self.init( + red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, + green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(hex & 0x0000FF) / 255.0, + alpha: CGFloat(alpha) + ) + } + + static let box2 = UIColor(hex: 0xFF9548) +} diff --git a/ShareExtension/Sources/Extension/UIbutton+Extension.swift b/ShareExtension/Sources/Extension/UIbutton+Extension.swift new file mode 100644 index 0000000..385e206 --- /dev/null +++ b/ShareExtension/Sources/Extension/UIbutton+Extension.swift @@ -0,0 +1,22 @@ +// +// UIbutton+Extension.swift +// iBoxShareExtension +// +// Created by Chan on 4/14/24. +// + +import UIKit + +extension UIButton { + func setBackgroundColor(_ color: UIColor, for state: UIControl.State) { + UIGraphicsBeginImageContext(CGSize(width: 1.0, height: 1.0)) + guard let context = UIGraphicsGetCurrentContext() else { return } + context.setFillColor(color.cgColor) + context.fill(CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)) + + let backgroundImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + setBackgroundImage(backgroundImage, for: state) + } +} diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift new file mode 100644 index 0000000..5e7b22b --- /dev/null +++ b/ShareExtension/Sources/ShareViewController.swift @@ -0,0 +1,152 @@ +// +// ShareViewController.swift +// iBoxWebShareExtension +// +// Created by Chan on 2/8/24. +// + +import UIKit +import Social +import UniformTypeIdentifiers + +import SnapKit +import SwiftSoup + +@objc(CustomShareViewController) +class CustomShareViewController: UIViewController { + + var dataURL: String? + var backgroundView = ShareExtensionBackGroundView() + var modalView: UIView = { + let modalview = UIView() + modalview.backgroundColor = UIColor.lightGray.withAlphaComponent(0.1) + return modalview + }() + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupProperty() + setupHierarchy() + setupLayout() + extractSharedURL() + setupModal() + } + + // MARK: - Setup Methods + + private func setupProperty() { + backgroundView.delegate = self + } + + private func setupHierarchy() { + view.addSubview(modalView) + modalView.addSubview(backgroundView) + } + + private func setupLayout() { + modalView.snp.makeConstraints { make in + make.top.bottom.leading.trailing.equalToSuperview() + } + + backgroundView.snp.makeConstraints { make in + make.trailing.leading.equalToSuperview().inset(30) + make.center.equalToSuperview().offset(-20) + make.height.equalTo(140) + } + } + + private func setupModal() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleBackgroundTap(_:))) + tapGesture.cancelsTouchesInView = false + tapGesture.delegate = self + modalView.addGestureRecognizer(tapGesture) + } + + func hideExtensionWithCompletionHandler(completion: @escaping (Bool) -> Void) { + UIView.animate(withDuration: 0.3, animations: { + self.navigationController?.view.transform = CGAffineTransform(translationX: 0, y:self.navigationController!.view.frame.size.height) + }, completion: completion) + } + + func extractSharedURL() { + guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } + + for attachment in extensionItem.attachments ?? [] { + if attachment.hasItemConformingToTypeIdentifier(UTType.url.identifier) { + attachment.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { [weak self] (data, error) in + DispatchQueue.main.async { + if let url = data as? URL, error == nil { + self?.dataURL = url.absoluteString + print("Shared URL: \(url.absoluteString)") + } else { + print("Failed to retrieve URL: \(String(describing: error))") + } + } + } + break + } + } + } + + // MARK: IBAction + + @IBAction func cancel() { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } + + @objc func openURL(_ url: URL) -> Bool { + self.hideExtensionWithCompletionHandler(completion: { _ in + self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) + }) + + var responder: UIResponder? = self + while responder != nil { + if let application = responder as? UIApplication { + return application.perform(#selector(openURL(_:)), with: url) != nil + } + responder = responder?.next + } + return false + } + + @objc func handleBackgroundTap(_ sender: UITapGestureRecognizer) { + let location = sender.location(in: self.view) + if !backgroundView.frame.contains(location) { + cancel() + } + } +} + +extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { + + func didTapCancel() { + cancel() + } + + func didTapOpenApp() { + guard let sharedURL = dataURL, let url = URL(string: sharedURL) else { + print("Share extension error") + return + } + + let urlString = "iBox://url?data=\(sharedURL)" + + if let openUrl = URL(string: urlString) { + if self.openURL(openUrl) { + print("iBox 앱이 성공적으로 열렸습니다.") + } else { + print("iBox 앱을 열 수 없습니다.") + } + } + } +} + +extension CustomShareViewController: UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } +} diff --git a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift new file mode 100644 index 0000000..d8bf165 --- /dev/null +++ b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift @@ -0,0 +1,145 @@ +// +// BackGroundView.swift +// iBox +// +// Created by Chan on 2/19/24. +// + +import UIKit + +import SnapKit + +protocol ShareExtensionBackGroundViewDelegate: AnyObject { + func didTapCancel() + func didTapOpenApp() +} + +class ShareExtensionBackGroundView: UIView { + + // MARK: - Properties + weak var delegate: ShareExtensionBackGroundViewDelegate? + + // MARK: - UI Components + lazy var stackView: UIStackView = { + let stack = UIStackView() + stack.axis = .horizontal + stack.distribution = .fillProportionally + stack.spacing = 10 + return stack + }() + + lazy var logoImageView: UIImageView = { + let logoImageView = UIImageView() + logoImageView.image = UIImage(named: "128") + logoImageView.contentMode = .scaleAspectFit + logoImageView.setContentHuggingPriority(.required, for: .horizontal) + logoImageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return logoImageView + }() + + lazy var label: UILabel = { + let label = UILabel() + label.text = "이 링크를 iBox 앱에서 여시겠습니까?" + label.font = .systemFont(ofSize: 15) + label.textColor = .label + label.numberOfLines = 3 + label.setContentHuggingPriority(.defaultLow, for: .horizontal) + return label + }() + + lazy var cancelButton: UIButton = { + let button = UIButton() + button.setImage(UIImage(systemName: "xmark.circle.fill"), for: .normal) + button.tintColor = .systemGray3 + button.setContentHuggingPriority(.required, for: .horizontal) + button.setContentCompressionResistancePriority(.required, for: .horizontal) + return button + }() + + lazy var divider: UIView = { + let view = UIView() + view.backgroundColor = .lightGray + view.layer.opacity = 0.2 + return view + }() + + lazy var openAppButton: UIButton = { + let button = UIButton(type: .system) + button.setImage(UIImage(systemName: "arrow.up.forward.square"), for: .normal) + button.setTitle("앱으로 담아가기", for: .normal) + button.setTitleColor(.black, for: .normal) + button.setBackgroundColor(.clear, for: .normal) + + button.setTitle("앱이 실행됩니다", for: .highlighted) + button.setTitleColor(.white, for: .highlighted) + button.setBackgroundColor(.box2, for: .highlighted) + button.setImage(UIImage(systemName: "heart.fill"), for: .highlighted) + + button.imageView?.contentMode = .scaleAspectFit + button.tintColor = .box2 + + let spacing: CGFloat = 5 + button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: spacing) + button.titleEdgeInsets = UIEdgeInsets(top: 0, left: spacing, bottom: 0, right: 0) + + return button + }() + + // MARK: - Initializer + override init(frame: CGRect) { + super.init(frame: frame) + setupProperty() + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup Methods + private func setupProperty() { + backgroundColor = .systemBackground + clipsToBounds = true + layer.cornerRadius = 15 + + cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) + openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) + } + + private func setupHierarchy() { + addSubview(stackView) + stackView.addArrangedSubview(logoImageView) + stackView.addArrangedSubview(label) + stackView.addArrangedSubview(cancelButton) + + addSubview(divider) + addSubview(openAppButton) + } + + private func setupLayout() { + stackView.snp.makeConstraints { make in + make.top.leading.trailing.equalToSuperview().inset(20) + } + + divider.snp.makeConstraints { make in + make.top.equalTo(stackView.snp.bottom).offset(10) + make.leading.trailing.equalToSuperview() + make.height.equalTo(1) + } + + openAppButton.snp.makeConstraints { make in + make.top.equalTo(divider.snp.bottom) + make.width.leading.trailing.bottom.equalToSuperview() + } + } + + // MARK: - Action Functions + @objc func cancelButtonTapped() { + delegate?.didTapCancel() + } + + @objc func openAppButtonTapped() { + delegate?.didTapOpenApp() + } +} diff --git a/ShareExtension/View/ShareExtensionBackGroundView.swift b/ShareExtension/View/ShareExtensionBackGroundView.swift deleted file mode 100644 index 04a4b3a..0000000 --- a/ShareExtension/View/ShareExtensionBackGroundView.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// BackGroundView.swift -// iBox -// -// Created by Chan on 2/19/24. -// - -import UIKit - -import SnapKit - -protocol ShareExtensionBackGroundViewDelegate: AnyObject { - func didTapCancel() - func didTapOpenApp() -} - -class ShareExtensionBackGroundView: UIView { - - // MARK: - Properties - - weak var delegate: ShareExtensionBackGroundViewDelegate? - - // MARK: - UI Components - - lazy var label: UILabel = { - let label = UILabel() - label.text = "이 링크를 iBox 앱에서 여시겠습니까?" - label.font = .systemFont(ofSize: 15) - label.textColor = .label - return label - }() - - lazy var cancelButton: UIButton = { - let button = UIButton() - button.configuration = .plain() - button.configuration?.attributedTitle = .init( - "Cancel", - attributes: .init([.font: UIFont.systemFont(ofSize: 13)]) - ) - return button - }() - - lazy var openAppButton: UIButton = { - let button = UIButton() - button.configuration = .plain() - button.configuration?.attributedTitle = .init( - "Open", - attributes: .init([.font: UIFont.boldSystemFont(ofSize: 13)]) - ) - return button - }() - - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - setupProperty() - setupHierarchy() - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setup Methods - - private func setupProperty() { - backgroundColor = .systemBackground - clipsToBounds = true - layer.cornerRadius = 15 - - cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside) - openAppButton.addTarget(self, action: #selector(openAppButtonTapped), for: .touchUpInside) - } - - private func setupHierarchy() { - addSubview(label) - addSubview(cancelButton) - addSubview(openAppButton) - } - - private func setupLayout() { - label.snp.makeConstraints { make in - make.top.equalToSuperview().inset(25) - make.leading.equalToSuperview().inset(20) - } - - cancelButton.snp.makeConstraints { make in - make.trailing.equalTo(openAppButton.snp.leading) - make.centerY.equalTo(openAppButton.snp.centerY) - } - - openAppButton.snp.makeConstraints { make in - make.trailing.bottom.equalToSuperview().inset(15) - } - } - - // MARK: - Action Functions - - @objc func cancelButtonTapped() { - delegate?.didTapCancel() - } - - @objc func openAppButtonTapped() { - delegate?.didTapOpenApp() - } -} From fcc410c3e853bc207e265fd173f6f7ae20cb6ebf Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:28:50 +0900 Subject: [PATCH 230/370] fix: separte addbookmark function --- .../AddBookmark/AddBookmarkView.swift | 0 .../AddBookmarkViewController.swift | 71 ++++++++++++++++++- .../AddBookmark/FolderListCell.swift | 0 .../AddBookmark/FolderListView.swift | 0 .../FolderListViewController.swift | 0 iBox/Sources/Model/Metadata.swift | 12 ++++ 6 files changed, 82 insertions(+), 1 deletion(-) rename iBox/Sources/{BoxList => }/AddBookmark/AddBookmarkView.swift (100%) rename iBox/Sources/{BoxList => }/AddBookmark/AddBookmarkViewController.swift (63%) rename iBox/Sources/{BoxList => }/AddBookmark/FolderListCell.swift (100%) rename iBox/Sources/{BoxList => }/AddBookmark/FolderListView.swift (100%) rename iBox/Sources/{BoxList => }/AddBookmark/FolderListViewController.swift (100%) create mode 100644 iBox/Sources/Model/Metadata.swift diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift similarity index 100% rename from iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift rename to iBox/Sources/AddBookmark/AddBookmarkView.swift diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift similarity index 63% rename from iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift rename to iBox/Sources/AddBookmark/AddBookmarkViewController.swift index a7154d0..c7e51c6 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -7,6 +7,8 @@ import UIKit +import SwiftSoup + protocol AddBookmarkViewControllerProtocol: AnyObject { func addFolderDirect(_ folder: Folder) func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) @@ -20,7 +22,7 @@ final class AddBookmarkViewController: UIViewController { var selectedFolderIndex: Int? var folders = [Folder]() - private let addBookmarkView = AddBookmarkView() + let addBookmarkView = AddBookmarkView() override func loadView() { super.loadView() @@ -31,6 +33,7 @@ final class AddBookmarkViewController: UIViewController { super.viewWillAppear(animated) updateSelectedFolder() addBookmarkView.updateTextFieldsFilledState() + addBookmarkView.nameTextView.becomeFirstResponder() } override func viewDidLoad() { @@ -156,6 +159,72 @@ final class AddBookmarkViewController: UIViewController { navigationController?.pushViewController(folderListViewController, animated: true) } + private func fetchAndParseMetadata(from url: URL, completion: @escaping (Metadata) -> Void) { + URLSession.shared.dataTask(with: url) { data, response, error in + guard let data = data, error == nil else { + print("Failed to fetch data: \(String(describing: error))") + return + } + + let encodingName = (response as? HTTPURLResponse)?.textEncodingName ?? "utf-8" + let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) + + if let htmlContent = String(data: data, encoding: encoding) { + do { + let doc: Document = try SwiftSoup.parse(htmlContent) + let title: String? = try doc.title() + + let faviconSelectors = ["link[rel='shortcut icon']", "link[rel='icon']", "link[rel='apple-touch-icon']"] + var faviconUrl: String? = nil + + for selector in faviconSelectors { + if let faviconLink: Element = try doc.select(selector).first() { + if var href = try? faviconLink.attr("href"), !href.isEmpty { + if href.starts(with: "/") { + href = url.scheme! + "://" + url.host! + href + } else if !href.starts(with: "http") { + href = url.scheme! + "://" + url.host! + "/" + href + } + faviconUrl = href + break + } + } + } + + if faviconUrl == nil { + faviconUrl = url.scheme! + "://" + url.host! + "/favicon.ico" + } + + let decodedUrlString = url.absoluteString.removingPercentEncoding ?? url.absoluteString + let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: decodedUrlString) + + DispatchQueue.main.async { + completion(metadata) + } + } catch { + print("Failed to parse HTML: \(error.localizedDescription)") + } + } + }.resume() + } + + private func getMetadata() { +// fetchAndParseMetadata(from: url) { metadata in +// dump(metadata) +// let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" +// let encodedData = metadata.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" +// let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" +// let urlString = "iBox://url?title=\(encodedTitle)&data=\(encodedData)&faviconUrl=\(encodedFaviconUrl)" +// +// if let openUrl = URL(string: urlString) { +// if self.openURL(openUrl) { +// print("iBox 앱이 성공적으로 열렸습니다.") +// } else { +// print("iBox 앱을 열 수 없습니다.") +// } +// } +// } + } } extension AddBookmarkViewController: FolderListViewControllerDelegate { diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/AddBookmark/FolderListCell.swift similarity index 100% rename from iBox/Sources/BoxList/AddBookmark/FolderListCell.swift rename to iBox/Sources/AddBookmark/FolderListCell.swift diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/AddBookmark/FolderListView.swift similarity index 100% rename from iBox/Sources/BoxList/AddBookmark/FolderListView.swift rename to iBox/Sources/AddBookmark/FolderListView.swift diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/AddBookmark/FolderListViewController.swift similarity index 100% rename from iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift rename to iBox/Sources/AddBookmark/FolderListViewController.swift diff --git a/iBox/Sources/Model/Metadata.swift b/iBox/Sources/Model/Metadata.swift new file mode 100644 index 0000000..8f95deb --- /dev/null +++ b/iBox/Sources/Model/Metadata.swift @@ -0,0 +1,12 @@ +// +// Metadata.swift +// iBoxShareExtension +// +// Created by 김찬희 on 2024/03/14. +// + +struct Metadata { + var title: String? + var faviconUrl: String? + var url: String? +} From 79ee850838aea9774c87bd5b02a90eb27892664f Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:37:16 +0900 Subject: [PATCH 231/370] fix: consider safe area layout --- ShareExtension/Sources/ShareViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index 5e7b22b..5007967 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -47,12 +47,12 @@ class CustomShareViewController: UIViewController { private func setupLayout() { modalView.snp.makeConstraints { make in - make.top.bottom.leading.trailing.equalToSuperview() + make.edges.equalTo(view.safeAreaLayoutGuide) } backgroundView.snp.makeConstraints { make in - make.trailing.leading.equalToSuperview().inset(30) - make.center.equalToSuperview().offset(-20) + make.leading.trailing.equalToSuperview().inset(30) + make.centerY.equalToSuperview().inset(20) make.height.equalTo(140) } } From 0009301dd8f8d37e4b0ba20cea7ca05cf5050bf5 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:37:28 +0900 Subject: [PATCH 232/370] style: font color black --- ShareExtension/Sources/View/ShareExtensionBackGroundView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift index d8bf165..8fd1643 100644 --- a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift @@ -71,7 +71,7 @@ class ShareExtensionBackGroundView: UIView { button.setBackgroundColor(.clear, for: .normal) button.setTitle("앱이 실행됩니다", for: .highlighted) - button.setTitleColor(.white, for: .highlighted) + button.setTitleColor(.darkGray, for: .highlighted) button.setBackgroundColor(.box2, for: .highlighted) button.setImage(UIImage(systemName: "heart.fill"), for: .highlighted) From 6670f48e5e1d08e090e4c74a5d2fd7a5d7f6b002 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:38:58 +0900 Subject: [PATCH 233/370] chore: rename --- ...+Extension.swift => ShareExtension+UIbutton+Extension.swift} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ShareExtension/Sources/Extension/{UIbutton+Extension.swift => ShareExtension+UIbutton+Extension.swift} (93%) diff --git a/ShareExtension/Sources/Extension/UIbutton+Extension.swift b/ShareExtension/Sources/Extension/ShareExtension+UIbutton+Extension.swift similarity index 93% rename from ShareExtension/Sources/Extension/UIbutton+Extension.swift rename to ShareExtension/Sources/Extension/ShareExtension+UIbutton+Extension.swift index 385e206..466fe44 100644 --- a/ShareExtension/Sources/Extension/UIbutton+Extension.swift +++ b/ShareExtension/Sources/Extension/ShareExtension+UIbutton+Extension.swift @@ -1,5 +1,5 @@ // -// UIbutton+Extension.swift +// ShareExtension+UIbutton+Extension.swift // iBoxShareExtension // // Created by Chan on 4/14/24. From 8904fd839d5312621915dcadf911431c9696714a Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 14 Apr 2024 03:46:25 +0900 Subject: [PATCH 234/370] fix: url error --- ShareExtension/Sources/ShareViewController.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index 5007967..a0678cd 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -30,8 +30,8 @@ class CustomShareViewController: UIViewController { setupProperty() setupHierarchy() setupLayout() - extractSharedURL() setupModal() + extractSharedURL() } // MARK: - Setup Methods @@ -128,7 +128,7 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { } func didTapOpenApp() { - guard let sharedURL = dataURL, let url = URL(string: sharedURL) else { + guard let sharedURL = dataURL else { print("Share extension error") return } @@ -141,6 +141,8 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { } else { print("iBox 앱을 열 수 없습니다.") } + } else { + print("url error") } } } From 7da8ab1e5e2ddc1a77f95d9343f32ad11485fb06 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 15 Apr 2024 23:25:31 +0900 Subject: [PATCH 235/370] =?UTF-8?q?refactor:=20FolderListCell=EC=9D=98=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=EB=A7=88=ED=81=AC=20config=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/FolderListCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift index 2d8facf..8e86e22 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListCell.swift @@ -25,7 +25,8 @@ class FolderListCell: UITableViewCell { } private let checkImageView = UIImageView().then { - $0.image = UIImage(systemName: "checkmark") + let config = UIImage.SymbolConfiguration(pointSize: 14, weight: .semibold, scale: .default) + $0.image = UIImage(systemName: "checkmark", withConfiguration: config) $0.contentMode = .scaleAspectFit $0.tintColor = .box $0.isHidden = true @@ -68,7 +69,6 @@ class FolderListCell: UITableViewCell { checkImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() make.trailing.equalToSuperview().offset(-20) - make.width.height.equalTo(24) } folderNameLabel.snp.makeConstraints { make in From b54595b2c79b7a4c58da8827946c967d55e13bf6 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 14:49:11 +0900 Subject: [PATCH 236/370] =?UTF-8?q?feat:=20=EC=83=81=EC=9C=84=20UITabBar?= =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B0=BE=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UIViewController+Extension.swift | 21 ++++++++++++++ iBox/Sources/Shared/URLdecoder.swift | 29 ------------------- 2 files changed, 21 insertions(+), 29 deletions(-) create mode 100644 iBox/Sources/Extension/UIViewController+Extension.swift delete mode 100644 iBox/Sources/Shared/URLdecoder.swift diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift new file mode 100644 index 0000000..db7a491 --- /dev/null +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -0,0 +1,21 @@ +// +// UIViewController+Extension.swift +// iBox +// +// Created by Chan on 4/16/24. +// + +import UIKit + +extension UIViewController { + func findMainTabBarController() -> UITabBarController? { + var responder: UIResponder? = self + while let nextResponder = responder?.next { + if let viewController = nextResponder as? UITabBarController { + return viewController + } + responder = nextResponder + } + return nil + } +} diff --git a/iBox/Sources/Shared/URLdecoder.swift b/iBox/Sources/Shared/URLdecoder.swift deleted file mode 100644 index 7efb229..0000000 --- a/iBox/Sources/Shared/URLdecoder.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// URLdecoder.swift -// iBoxShareExtension -// -// Created by 김찬희 on 2024/03/14. -// - -import Foundation - -class URLdecoder { - static func handleCustomURL(_ url: URL) -> (title: String?, data: String?, faviconUrl: String?) { - guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return (nil, nil, nil) } - - let title = urlComponents.queryItems?.first(where: { $0.name == "title" })?.value - let data = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value - let faviconUrl = urlComponents.queryItems?.first(where: { $0.name == "faviconUrl" })?.value - - let finalTitle: String? - if let title = title, !title.isEmpty { - finalTitle = title - } else if let data = data, let dataUrl = URL(string: data) { - finalTitle = dataUrl.host ?? "No Title" - } else { - finalTitle = nil - } - - return (finalTitle, data, faviconUrl) - } -} From 25d05724c1adfc88dece907b350d278c99096c06 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 14:50:12 +0900 Subject: [PATCH 237/370] feat: metadata manager --- iBox/Sources/Shared/URLDataManager.swift | 57 ++++++++++++++++++++---- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/iBox/Sources/Shared/URLDataManager.swift b/iBox/Sources/Shared/URLDataManager.swift index 2f535ab..06fec25 100644 --- a/iBox/Sources/Shared/URLDataManager.swift +++ b/iBox/Sources/Shared/URLDataManager.swift @@ -6,6 +6,7 @@ // import UIKit +import SwiftSoup class URLDataManager { static let shared = URLDataManager() @@ -13,22 +14,61 @@ class URLDataManager { var incomingTitle: String? var incomingData: String? var incomingFaviconUrl: String? - + private init() {} - - func update(with data: (title: String?, data: String?, faviconUrl: String?)) { + + private func update(with data: (title: String?, data: String?, faviconUrl: String?)) { incomingTitle = data.title incomingData = data.data incomingFaviconUrl = data.faviconUrl } + private func parseHTML(_ html: String, _ url: URL) { + do { + let doc = try SwiftSoup.parse(html) + let title = try doc.title() + let faviconLink = try doc.select("link[rel='icon']").first()?.attr("href") + + DispatchQueue.main.async { + self.update(with: (title: title, data: url.absoluteString, faviconUrl: faviconLink)) + } + } catch { + print("Error parsing HTML: \(error)") + } + } + + private func extractDataParameter(from url: URL) -> String? { + guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let queryItems = components.queryItems else { + return nil + } + return queryItems.first { $0.name == "data" }?.value + } + + private func fetchWebsiteDetails(from url: URL) { + let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in + guard let data = data, error == nil, + let html = String(data: data, encoding: .utf8) else { + print("Error downloading HTML: \(String(describing: error))") + return + } + + self?.parseHTML(html, url) + } + task.resume() + } + func navigateToAddBookmarkView(from url: URL, in tabBarController: UITabBarController) { - guard url.scheme == "iBox" else { return } - - let urlData = URLdecoder.handleCustomURL(url) - self.update(with: urlData) - + guard url.scheme == "iBox", let urlString = extractDataParameter(from: url) else { return } + guard let url = URL(string: urlString) else { + print("Invalid URL") + return + } + + fetchWebsiteDetails(from: url) + tabBarController.selectedIndex = 0 + DispatchQueue.main.async { guard let navigationController = tabBarController.selectedViewController as? UINavigationController, let boxListViewController = navigationController.viewControllers.first as? BoxListViewController else { @@ -37,4 +77,5 @@ class URLDataManager { boxListViewController.shouldPresentModalAutomatically = true } } + } From a0312c51e619545b38893ede77eef316643a5586 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 14:50:41 +0900 Subject: [PATCH 238/370] =?UTF-8?q?fix:=20=EA=B8=B0=EC=A1=B4=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=97=90=EC=84=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebViewController.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 19b2ebe..00346d6 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -48,12 +48,12 @@ extension WebViewController: WebViewDelegate { func pushAddBookMarkViewController(url: URL) { URLDataManager.shared.incomingData = url.absoluteString - let addBookmarkViewController = AddBookmarkViewController() - addBookmarkViewController.delegate = delegate + if let iBoxUrl = URL(string: "iBox://url?data=" + url.absoluteString) { + if let tabBarController = findMainTabBarController() { + URLDataManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) + } + } - let navigationController = UINavigationController(rootViewController: addBookmarkViewController) - navigationController.modalPresentationStyle = .pageSheet - self.present(navigationController, animated: true, completion: nil) } } From bbaaea98739c0debc570a452bc1b7229ecaab4ac Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 16 Apr 2024 14:55:23 +0900 Subject: [PATCH 239/370] feat: folder menu in boxList --- iBox/Sources/BoxList/BoxListView.swift | 12 +++++ .../BoxList/BoxListViewController.swift | 46 +++++++++++++++++++ iBox/Sources/BoxList/BoxListViewModel.swift | 21 +++++++++ 3 files changed, 79 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 316c5bf..b718866 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -15,6 +15,8 @@ protocol BoxListViewDelegate: AnyObject { func pushViewController(type: EditType) func pushViewController(url: URL?) func presentEditBookmarkController(at indexPath: IndexPath) + func deleteFolderinBoxList(at section: Int) + func editFolderNameinBoxList(at section: Int, currentName: String) } class BoxListView: UIView { @@ -187,6 +189,16 @@ extension BoxListView: UITableViewDelegate { button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside) + let edit = UIAction(title: "폴더 편집", image: UIImage(systemName: "pencil")) { [weak self] _ in + guard let folderName = self?.viewModel?.boxList[section].name else { return } + self?.delegate?.editFolderNameinBoxList(at: section, currentName: folderName) + } + let delete = UIAction(title: "폴더 삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in + self?.delegate?.deleteFolderinBoxList(at: section) + } + + button.menu = UIMenu(options: .displayInline, children: [edit, delete]) + return button } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 54ed918..553dde3 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -96,6 +96,52 @@ extension BoxListViewController: AddBookmarkViewControllerProtocol { } extension BoxListViewController: BoxListViewDelegate { + func deleteFolderinBoxList(at section: Int) { + recheckDeleteFolder(at: section) + } + + private func recheckDeleteFolder(at section: Int) { + let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .actionSheet) + let firstAction = UIAlertAction(title: "폴더 삭제", style: .destructive) {[weak self] _ in + guard let contentView = self?.contentView as? BoxListView else { return } + contentView.viewModel?.deleteFolderDirect(section) + } + let cancelAction = UIAlertAction(title: "취소", style: .cancel) + actionSheetController.addAction(firstAction) + actionSheetController.addAction(cancelAction) + present(actionSheetController, animated: true) + } + + func editFolderNameinBoxList(at section: Int, currentName: String) { + let controller = UIAlertController(title: "폴더 이름 변경", message: nil, preferredStyle: .alert) + + let cancelAction = UIAlertAction(title: "취소", style: .default) { _ in return } + let okAction = UIAlertAction(title: "확인", style: .default) { [weak self] action in + guard let newName = controller.textFields?.first?.text else { return } + guard let contentView = self?.contentView as? BoxListView else { return } + contentView.viewModel?.editFolderDirect(section, name: newName) + } + controller.addAction(cancelAction) + controller.addAction(okAction) + okAction.isEnabled = true + + controller.addTextField() { textField in + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: + {_ in + let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 + let textIsNotEmpty = textCount > 0 + + okAction.isEnabled = textIsNotEmpty + + }) + } + controller.textFields?.first?.text = currentName + controller.textFields?.first?.autocorrectionType = .no + controller.textFields?.first?.spellCheckingType = .no + + self.present(controller, animated: true) + } + func presentEditBookmarkController(at indexPath: IndexPath) { guard let contentView = contentView as? BoxListView else { return } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index a4ba8e9..3fbcf25 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -179,4 +179,25 @@ class BoxListViewModel { output.send(.sendBoxList(boxList: boxList)) } + func deleteFolderDirect(_ section: Int) { + let folderId = boxList[section].id + CoreDataManager.shared.deleteFolder(id: folderId) + boxList.remove(at: section) + for box in boxList { + sectionsToReload.update(with: box.id) + } + output.send(.sendBoxList(boxList: boxList)) + output.send(.reloadSections(idArray: Array(sectionsToReload))) + sectionsToReload.removeAll() + } + + func editFolderDirect(_ section: Int, name: String) { + let folderId = boxList[section].id + CoreDataManager.shared.updateFolder(id: folderId, name: name) + boxList[section].name = name + sectionsToReload.update(with: boxList[section].id) + output.send(.reloadSections(idArray: Array(sectionsToReload))) + sectionsToReload.removeAll() + } + } From ebe71801fab5dcecd808e85975d2b316cc5a843f Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 16 Apr 2024 15:15:58 +0900 Subject: [PATCH 240/370] =?UTF-8?q?refactor:=20chevron=20=EA=B5=B5?= =?UTF-8?q?=EA=B8=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 10 +++++----- iBox/Sources/BoxList/FolderButton.swift | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index 62ef8fb..e393b8a 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -93,9 +93,10 @@ class AddBookmarkView: UIView { } private let chevronImageView = UIImageView().then { - let image = UIImage(systemName: "chevron.forward")?.withRenderingMode(.alwaysTemplate) + let config = UIImage.SymbolConfiguration(pointSize: 15, weight: .medium, scale: .default) + let image = UIImage(systemName: "chevron.forward", withConfiguration: config)?.withRenderingMode(.alwaysTemplate) $0.image = image - $0.tintColor = .systemGray + $0.tintColor = .systemGray3 $0.contentMode = .scaleAspectFit } @@ -199,14 +200,13 @@ class AddBookmarkView: UIView { make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) make.height.equalTo(40) - make.width.equalTo(100) +// make.width.equalTo(100) } chevronImageView.snp.makeConstraints { make in make.trailing.equalTo(button.snp.trailing).offset(-20) make.centerY.equalTo(button.snp.centerY) - make.width.equalTo(17) - make.height.equalTo(17) + make.width.height.equalTo(15) } } diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 5a38019..3d80e7c 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -42,7 +42,8 @@ class FolderButton: UIButton { private func setupProperty() { backgroundColor = .tableViewBackgroundColor - openCloseImageView.image = UIImage(systemName: "chevron.right") + let config = UIImage.SymbolConfiguration(pointSize: 15, weight: .medium, scale: .default) + openCloseImageView.image = UIImage(systemName: "chevron.right", withConfiguration: config) } private func setupHierarchy() { From 9df0ac0dbaa84882b1a668799e3e30c304147e5c Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 16 Apr 2024 15:24:17 +0900 Subject: [PATCH 241/370] =?UTF-8?q?refactor:=20selectedFolderLabel=20width?= =?UTF-8?q?=20=EC=A1=B0=EC=A1=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - '선택된 폴더가 없습니다' 문구 잘림 방지 --- iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift index e393b8a..9609862 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkView.swift @@ -196,11 +196,10 @@ class AddBookmarkView: UIView { } selectedFolderLabel.snp.makeConstraints { make in - make.leading.equalTo(buttonLabel.snp.trailing).offset(10) make.trailing.equalTo(chevronImageView.snp.leading).offset(-10) make.centerY.equalTo(button.snp.centerY) make.height.equalTo(40) -// make.width.equalTo(100) + make.width.equalTo(200) } chevronImageView.snp.makeConstraints { make in From 7239e7389afdbf02401b54d6086dd83707d648c6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 16 Apr 2024 15:26:11 +0900 Subject: [PATCH 242/370] fix: initial button rotate --- iBox/Sources/BoxList/FolderButton.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iBox/Sources/BoxList/FolderButton.swift b/iBox/Sources/BoxList/FolderButton.swift index 23d6cbd..66cfbd4 100644 --- a/iBox/Sources/BoxList/FolderButton.swift +++ b/iBox/Sources/BoxList/FolderButton.swift @@ -43,6 +43,9 @@ class FolderButton: UIButton { private func setupProperty() { backgroundColor = .tableViewBackgroundColor openCloseImageView.image = UIImage(systemName: "chevron.right") + if isOpen { + openCloseImageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) + } } private func setupHierarchy() { From 85b5588ca1a466cc2341981d83f33d569ca42579 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 16 Apr 2024 15:40:38 +0900 Subject: [PATCH 243/370] =?UTF-8?q?fix:=20SettingItemCell=20chevron=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=ED=84=B0=EC=B9=98=20=EC=95=88=20=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Settings/SettingsItemCell.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iBox/Sources/Settings/SettingsItemCell.swift b/iBox/Sources/Settings/SettingsItemCell.swift index 0499b84..f3a239c 100644 --- a/iBox/Sources/Settings/SettingsItemCell.swift +++ b/iBox/Sources/Settings/SettingsItemCell.swift @@ -34,6 +34,7 @@ class SettingsItemCell: UITableViewCell { $0.configuration?.image = UIImage(systemName: "chevron.right") $0.configuration?.preferredSymbolConfigurationForImage = .init(pointSize: 10, weight: .bold) $0.tintColor = .systemGray3 + $0.isUserInteractionEnabled = false } // MARK: - Initializer From ef170b0fa8a0461e31f470512afa9d9c937933e7 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 16 Apr 2024 16:13:30 +0900 Subject: [PATCH 244/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EA=BE=B9=20=EB=88=84=EB=A5=BC=20=EB=95=8C=20?= =?UTF-8?q?=EC=A7=84=EB=8F=99=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 37a987b..6598ba1 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -227,7 +227,10 @@ extension BoxListView: UITableViewDelegate { button.setFolderName(viewModel.boxList[section].name) button.tag = section + // 터치했을 때 button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside) + // 길게 눌렀을 때 + button.addTarget(self, action: #selector(handleMenu), for: .menuActionTriggered) let edit = UIAction(title: "폴더 편집", image: UIImage(systemName: "pencil")) { [weak self] _ in guard let folderName = self?.viewModel?.boxList[section].name else { return } @@ -253,6 +256,14 @@ extension BoxListView: UITableViewDelegate { } } + @objc private func handleMenu(button: FolderButton) { + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .medium) + generator.prepare() + generator.impactOccurred() + } + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let cellViewModel = viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return } delegate?.didSelectWeb(id: cellViewModel.id, at: cellViewModel.url, withName: cellViewModel.name) From 5c6ead5a7dcd8fdd014401b5fae33c36f6bf3fdb Mon Sep 17 00:00:00 2001 From: noeyiz Date: Tue, 16 Apr 2024 17:09:46 +0900 Subject: [PATCH 245/370] =?UTF-8?q?style:=20=EC=95=B1=EC=9D=98=20=EC=A0=84?= =?UTF-8?q?=EB=B0=98=EC=A0=81=EC=9D=B8=20=ED=8F=B0=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddBookmark/AddBookmarkViewController.swift | 5 +++-- .../BoxList/AddBookmark/FolderListView.swift | 2 +- .../AddBookmark/FolderListViewController.swift | 7 +++++++ iBox/Sources/BoxList/BoxListCell.swift | 9 +++++---- iBox/Sources/BoxList/BoxListView.swift | 7 ++++++- iBox/Sources/BoxList/FolderView.swift | 2 +- iBox/Sources/Extension/UIFont+Extension.swift | 15 ++++++++------- iBox/Sources/Settings/Reset/ResetView.swift | 2 +- 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift index a7154d0..28fac27 100644 --- a/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/AddBookmarkViewController.swift @@ -42,6 +42,7 @@ final class AddBookmarkViewController: UIViewController { private func setupNavigationBar() { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() + appearance.titleTextAttributes = [.font: UIFont.subTitlefont] navigationController?.navigationBar.tintColor = .box navigationController?.navigationBar.standardAppearance = appearance @@ -55,11 +56,11 @@ final class AddBookmarkViewController: UIViewController { navigationItem.rightBarButtonItem?.isEnabled = false let attributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.semiboldLabelFont + .font: UIFont.barItemFont ] - navigationItem.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) + navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .disabled) } private func setupAddBookmarkView() { diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift index 77edf93..9ea7286 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListView.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListView.swift @@ -22,7 +22,7 @@ class FolderListView: UIView { private let infoLabel = UILabel().then { $0.text = "새로운 북마크를 추가할 폴더를 선택해주세요." - $0.font = .semiboldLabelFont + $0.font = .barItemFont $0.textColor = .label $0.textAlignment = .center } diff --git a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift index 3fd25c3..40f2215 100644 --- a/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/BoxList/AddBookmark/FolderListViewController.swift @@ -37,10 +37,17 @@ class FolderListViewController: UIViewController { } private func setupNavigationBar() { + navigationItem.hidesBackButton = true + let backButton = UIBarButtonItem(image: UIImage(systemName: "chevron.left"), style: .plain, target: self, action: #selector(back)) let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addFolder)) + navigationItem.leftBarButtonItem = backButton navigationItem.rightBarButtonItem = addButton } + @objc private func back() { + self.navigationController?.popViewController(animated: true) + } + @objc private func addFolder() { let controller = UIAlertController(title: "새로운 폴더", message: "이 폴더의 이름을 입력하십시오.", preferredStyle: .alert) diff --git a/iBox/Sources/BoxList/BoxListCell.swift b/iBox/Sources/BoxList/BoxListCell.swift index 2daa2ef..b9929b4 100644 --- a/iBox/Sources/BoxList/BoxListCell.swift +++ b/iBox/Sources/BoxList/BoxListCell.swift @@ -79,18 +79,19 @@ class BoxListCell: UITableViewCell { private func setupLayout() { cellImageView.snp.makeConstraints { make in - make.leading.equalToSuperview().inset(20) + make.leading.equalToSuperview().inset(25) make.top.bottom.equalToSuperview().inset(10) - make.width.equalTo(25) + make.width.equalTo(23) } label.snp.makeConstraints { make in make.top.bottom.equalToSuperview() make.trailing.equalToSuperview().inset(25) - make.leading.equalTo(cellImageView.snp.trailing).offset(10) + make.leading.equalTo(cellImageView.snp.trailing).offset(8) } + editButton.snp.makeConstraints { make in - make.width.equalTo(30) + make.width.equalTo(25) make.top.bottom.equalToSuperview() make.trailing.equalToSuperview().offset(-10) } diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 37a987b..7883be5 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -221,6 +221,10 @@ extension BoxListView: UITableViewDelegate { return 50 } + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 48 + } + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { guard let viewModel else { return nil } let button = FolderButton(isOpen: viewModel.boxList[section].isOpened) @@ -388,7 +392,8 @@ extension BoxListView: UITableViewDelegate { } extension BoxListView: BoxListDataSourceDelegate { - func openFolderIfNeeded(_ folderIndex: Int) { viewModel?.input.send(.openFolderIfNeeded(folderIndex: folderIndex)) + func openFolderIfNeeded(_ folderIndex: Int) { + viewModel?.input.send(.openFolderIfNeeded(folderIndex: folderIndex)) } func moveCell(at sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { diff --git a/iBox/Sources/BoxList/FolderView.swift b/iBox/Sources/BoxList/FolderView.swift index 755ade6..37af8c4 100644 --- a/iBox/Sources/BoxList/FolderView.swift +++ b/iBox/Sources/BoxList/FolderView.swift @@ -44,7 +44,7 @@ class FolderView: UIView { private func setupLayout() { folderImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.width.height.equalTo(30) + make.width.height.equalTo(25) make.leading.equalToSuperview().offset(20) } diff --git a/iBox/Sources/Extension/UIFont+Extension.swift b/iBox/Sources/Extension/UIFont+Extension.swift index c0cb074..cdca19a 100644 --- a/iBox/Sources/Extension/UIFont+Extension.swift +++ b/iBox/Sources/Extension/UIFont+Extension.swift @@ -10,13 +10,14 @@ import UIKit extension UIFont { static let titleFont = UIFont.systemFont(ofSize: 20.0, weight: .bold) - static let subTitlefont = UIFont.systemFont(ofSize: 17.0, weight: .semibold) + static let subTitlefont = UIFont.systemFont(ofSize: 16.0, weight: .semibold) + static let barItemFont = UIFont.systemFont(ofSize: 14.5, weight: .semibold) static let labelFont = UIFont.systemFont(ofSize: 16.0) static let semiboldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .semibold) - static let boldLabelFont = UIFont.systemFont(ofSize: 16.0, weight: .bold) - static let cellTitleFont = UIFont.systemFont(ofSize: 16.0) - static let cellDescriptionFont = UIFont.systemFont(ofSize: 13.0, weight: .regular) - static let descriptionFont = UIFont.systemFont(ofSize: 14.0) - static let refreshControlFont = UIFont.boldSystemFont(ofSize: 12.0) - static let emptyLabelFont = UIFont.systemFont(ofSize: 17.0, weight: .regular) + static let boldLabelFont = UIFont.systemFont(ofSize: 14.5, weight: .bold) + static let cellTitleFont = UIFont.systemFont(ofSize: 14.5) + static let cellDescriptionFont = UIFont.systemFont(ofSize: 12.0, weight: .regular) + static let descriptionFont = UIFont.systemFont(ofSize: 12.5) + static let refreshControlFont = UIFont.boldSystemFont(ofSize: 11.0) + static let emptyLabelFont = UIFont.systemFont(ofSize: 15.0, weight: .regular) } diff --git a/iBox/Sources/Settings/Reset/ResetView.swift b/iBox/Sources/Settings/Reset/ResetView.swift index 41ae9e0..303f22f 100644 --- a/iBox/Sources/Settings/Reset/ResetView.swift +++ b/iBox/Sources/Settings/Reset/ResetView.swift @@ -23,7 +23,7 @@ class ResetView: UIView { let resetButton = UIButton().then { $0.configuration = .plain() - $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.descriptionFont])) + $0.configuration?.attributedTitle = .init("초기화", attributes: .init([.font: UIFont.boldLabelFont])) $0.tintColor = .white $0.backgroundColor = .box $0.clipsToBounds = true From 899a333646af32bf198f5e0f018e40debce6a47c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 17:11:15 +0900 Subject: [PATCH 246/370] feat: addbookmarkmanager setup bidings --- .../Sources/AddBookmark/AddBookmarkView.swift | 42 +++++++++++++++---- .../CustomLaunchScreenViewController.swift | 3 +- iBox/Sources/SceneDelegate.swift | 2 +- ...Manager.swift => AddBookmarkManager.swift} | 24 ++++++----- iBox/Sources/Web/WebViewController.swift | 4 +- 5 files changed, 52 insertions(+), 23 deletions(-) rename iBox/Sources/Shared/{URLDataManager.swift => AddBookmarkManager.swift} (81%) diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index 62ef8fb..aece6c2 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -1,16 +1,19 @@ // -// AddBookmarkBottomSheetView.swift +// AddBookmarkView.swift // iBox // // Created by jiyeon on 1/5/24. // import UIKit +import Combine import SnapKit class AddBookmarkView: UIView { + var cancellables = Set() + var onButtonTapped: (() -> Void)? var onTextChange: ((Bool) -> Void)? @@ -19,9 +22,9 @@ class AddBookmarkView: UIView { selectedFolderLabel.text = selectedFolderName } } - + // MARK: - UI Components - + private let textFieldView: UIView = UIView().then { $0.backgroundColor = UIColor.backgroundColor $0.layer.cornerRadius = 20 @@ -106,6 +109,8 @@ class AddBookmarkView: UIView { setupProperty() setupHierarchy() setupLayout() + setupBindings() + } required init?(coder: NSCoder) { @@ -227,12 +232,33 @@ class AddBookmarkView: UIView { } } + private func setupBindings() { + AddBookmarkManager.shared.$incomingTitle + .receive(on: DispatchQueue.main) + .sink { [weak self] title in + self?.nameTextView.text = title + self?.nameTextViewPlaceHolder.isHidden = !(title?.isEmpty ?? true) + self?.clearButton.isHidden = title?.isEmpty ?? true + self?.updateTextFieldsFilledState() + } + .store(in: &cancellables) + + AddBookmarkManager.shared.$incomingData + .receive(on: DispatchQueue.main) + .sink { [weak self] url in + self?.urlTextView.text = url + self?.urlTextViewPlaceHolder.isHidden = !(url?.isEmpty ?? true) + self?.updateTextFieldsFilledState() + } + .store(in: &cancellables) + } + private func updateTextFieldWithIncomingData() { - updateTextField(textField: nameTextView, placeholder: nameTextViewPlaceHolder, withData: URLDataManager.shared.incomingTitle) - URLDataManager.shared.incomingTitle = nil + updateTextField(textField: nameTextView, placeholder: nameTextViewPlaceHolder, withData: AddBookmarkManager.shared.incomingTitle) + AddBookmarkManager.shared.incomingTitle = nil - updateTextField(textField: urlTextView, placeholder: urlTextViewPlaceHolder, withData: URLDataManager.shared.incomingData) - URLDataManager.shared.incomingData = nil + updateTextField(textField: urlTextView, placeholder: urlTextViewPlaceHolder, withData: AddBookmarkManager.shared.incomingData) + AddBookmarkManager.shared.incomingData = nil } func updateTextFieldsFilledState() { @@ -281,7 +307,7 @@ extension AddBookmarkView: UITextViewDelegate { nameTextViewPlaceHolder.isHidden = !nameTextView.text.isEmpty clearButton.isHidden = nameTextView.text.isEmpty } - + if textView == urlTextView { urlTextViewPlaceHolder.isHidden = !urlTextView.text.isEmpty } diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 935d34d..0e80413 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -80,8 +80,9 @@ class CustomLaunchScreenViewController: UIViewController { if let urlContext = self.urlContext, let tabBarController = window.rootViewController as? UITabBarController { - URLDataManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) + AddBookmarkManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) } + UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {}, completion: nil) } } diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index c3b0c18..42915c7 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -49,7 +49,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { if let urlContext = URLContexts.first, let tabBarController = window?.rootViewController as? UITabBarController { - URLDataManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) + AddBookmarkManager.shared.navigateToAddBookmarkView(from: urlContext.url, in: tabBarController) } } diff --git a/iBox/Sources/Shared/URLDataManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift similarity index 81% rename from iBox/Sources/Shared/URLDataManager.swift rename to iBox/Sources/Shared/AddBookmarkManager.swift index 06fec25..68ce206 100644 --- a/iBox/Sources/Shared/URLDataManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -6,21 +6,24 @@ // import UIKit + import SwiftSoup -class URLDataManager { - static let shared = URLDataManager() +class AddBookmarkManager { + static let shared = AddBookmarkManager() - var incomingTitle: String? - var incomingData: String? - var incomingFaviconUrl: String? + @Published var incomingTitle: String? + @Published var incomingData: String? + @Published var incomingFaviconUrl: String? private init() {} private func update(with data: (title: String?, data: String?, faviconUrl: String?)) { - incomingTitle = data.title - incomingData = data.data - incomingFaviconUrl = data.faviconUrl + DispatchQueue.main.async { + self.incomingTitle = data.title + self.incomingData = data.data + self.incomingFaviconUrl = data.faviconUrl + } } private func parseHTML(_ html: String, _ url: URL) { @@ -29,9 +32,8 @@ class URLDataManager { let title = try doc.title() let faviconLink = try doc.select("link[rel='icon']").first()?.attr("href") - DispatchQueue.main.async { - self.update(with: (title: title, data: url.absoluteString, faviconUrl: faviconLink)) - } + self.update(with: (title: title, data: url.absoluteString, faviconUrl: faviconLink)) + } catch { print("Error parsing HTML: \(error)") } diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 00346d6..5f017ea 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -46,11 +46,11 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol extension WebViewController: WebViewDelegate { func pushAddBookMarkViewController(url: URL) { - URLDataManager.shared.incomingData = url.absoluteString + AddBookmarkManager.shared.incomingData = url.absoluteString if let iBoxUrl = URL(string: "iBox://url?data=" + url.absoluteString) { if let tabBarController = findMainTabBarController() { - URLDataManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) + AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) } } From d27e2783b1ae8f00a7b262d77e4b4a0a707579fe Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 17:11:38 +0900 Subject: [PATCH 247/370] chore: delete unnecessray lines --- .../AddBookmarkViewController.swift | 68 ------------------- 1 file changed, 68 deletions(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index c7e51c6..0fa2ad8 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -7,8 +7,6 @@ import UIKit -import SwiftSoup - protocol AddBookmarkViewControllerProtocol: AnyObject { func addFolderDirect(_ folder: Folder) func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) @@ -159,72 +157,6 @@ final class AddBookmarkViewController: UIViewController { navigationController?.pushViewController(folderListViewController, animated: true) } - private func fetchAndParseMetadata(from url: URL, completion: @escaping (Metadata) -> Void) { - URLSession.shared.dataTask(with: url) { data, response, error in - guard let data = data, error == nil else { - print("Failed to fetch data: \(String(describing: error))") - return - } - - let encodingName = (response as? HTTPURLResponse)?.textEncodingName ?? "utf-8" - let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) - - if let htmlContent = String(data: data, encoding: encoding) { - do { - let doc: Document = try SwiftSoup.parse(htmlContent) - let title: String? = try doc.title() - - let faviconSelectors = ["link[rel='shortcut icon']", "link[rel='icon']", "link[rel='apple-touch-icon']"] - var faviconUrl: String? = nil - - for selector in faviconSelectors { - if let faviconLink: Element = try doc.select(selector).first() { - if var href = try? faviconLink.attr("href"), !href.isEmpty { - if href.starts(with: "/") { - href = url.scheme! + "://" + url.host! + href - } else if !href.starts(with: "http") { - href = url.scheme! + "://" + url.host! + "/" + href - } - faviconUrl = href - break - } - } - } - - if faviconUrl == nil { - faviconUrl = url.scheme! + "://" + url.host! + "/favicon.ico" - } - - let decodedUrlString = url.absoluteString.removingPercentEncoding ?? url.absoluteString - let metadata = Metadata(title: title, faviconUrl: faviconUrl, url: decodedUrlString) - - DispatchQueue.main.async { - completion(metadata) - } - } catch { - print("Failed to parse HTML: \(error.localizedDescription)") - } - } - }.resume() - } - - private func getMetadata() { -// fetchAndParseMetadata(from: url) { metadata in -// dump(metadata) -// let encodedTitle = metadata.title?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" -// let encodedData = metadata.url?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" -// let encodedFaviconUrl = metadata.faviconUrl?.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" -// let urlString = "iBox://url?title=\(encodedTitle)&data=\(encodedData)&faviconUrl=\(encodedFaviconUrl)" -// -// if let openUrl = URL(string: urlString) { -// if self.openURL(openUrl) { -// print("iBox 앱이 성공적으로 열렸습니다.") -// } else { -// print("iBox 앱을 열 수 없습니다.") -// } -// } -// } - } } extension AddBookmarkViewController: FolderListViewControllerDelegate { From ef111835203cde25591f6237564f66c0145357cd Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 17:27:00 +0900 Subject: [PATCH 248/370] chore: delete unused function --- .../Sources/AddBookmark/AddBookmarkView.swift | 31 +++---------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index aece6c2..ad54c0f 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -110,18 +110,21 @@ class AddBookmarkView: UIView { setupHierarchy() setupLayout() setupBindings() - } required init?(coder: NSCoder) { super.init(coder: coder) } + deinit { + AddBookmarkManager.shared.incomingTitle = nil + AddBookmarkManager.shared.incomingData = nil + } + // MARK: - Setup Methods private func setupProperty() { backgroundColor = .systemGroupedBackground - updateTextFieldWithIncomingData() clearButton.addTarget(self, action: #selector(clearTextView), for: .touchUpInside) button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) nameTextView.delegate = self @@ -216,22 +219,6 @@ class AddBookmarkView: UIView { } - private func updateTextField(textField: UITextView, placeholder: UILabel, withData data: String?) { - if let data = data, !data.isEmpty { - textField.text = data - placeholder.isHidden = true - if textField == nameTextView { - clearButton.isHidden = false - } - } else { - textField.text = "" - placeholder.isHidden = false - if textField == nameTextView { - clearButton.isHidden = true - } - } - } - private func setupBindings() { AddBookmarkManager.shared.$incomingTitle .receive(on: DispatchQueue.main) @@ -253,14 +240,6 @@ class AddBookmarkView: UIView { .store(in: &cancellables) } - private func updateTextFieldWithIncomingData() { - updateTextField(textField: nameTextView, placeholder: nameTextViewPlaceHolder, withData: AddBookmarkManager.shared.incomingTitle) - AddBookmarkManager.shared.incomingTitle = nil - - updateTextField(textField: urlTextView, placeholder: urlTextViewPlaceHolder, withData: AddBookmarkManager.shared.incomingData) - AddBookmarkManager.shared.incomingData = nil - } - func updateTextFieldsFilledState() { let isBothTextViewsFilled = !(nameTextView.text?.isEmpty ?? true) && !(urlTextView.text?.isEmpty ?? true) onTextChange?(isBothTextViewsFilled) From 26aab00541b5ea528c6436d56278faf3c3a8662a Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 16 Apr 2024 17:50:36 +0900 Subject: [PATCH 249/370] =?UTF-8?q?fix:=20addbookmarkview=EA=B0=80=20?= =?UTF-8?q?=EB=96=A0=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20dismiss=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 2 +- .../Extension/UIViewController+Extension.swift | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 57aa367..74d81cb 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -13,7 +13,7 @@ class BoxListViewController: BaseViewController, BaseViewController didSet { if shouldPresentModalAutomatically { // shouldPresentModalAutomatically가 true로 설정될 때 함수 호출 - dismiss(animated: false) { + if findAddBookmarkView() == nil { self.addButtonTapped() } // 함수 호출 후 shouldPresentModalAutomatically를 false로 설정 diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift index db7a491..5277a9d 100644 --- a/iBox/Sources/Extension/UIViewController+Extension.swift +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -18,4 +18,17 @@ extension UIViewController { } return nil } + + func findAddBookmarkView() -> Bool? { + var responder: UIResponder? = self + while let nextResponder = responder?.next { + if let viewController = nextResponder as? AddBookmarkView { + return true + } + responder = nextResponder + } + return nil + } + + } From 58ce3d61ed2ab712713322bf69420c39afc612b3 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Tue, 16 Apr 2024 19:12:20 +0900 Subject: [PATCH 250/370] =?UTF-8?q?refactor:=20nameTextView=20=EB=B0=8F=20?= =?UTF-8?q?clearButton=20=EC=A0=9C=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nameTextView의 data와 clearButton 겹치는 문제 수정 --- iBox/Sources/AddBookmark/AddBookmarkView.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index 31d488b..87688be 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -158,7 +158,7 @@ class AddBookmarkView: UIView { nameTextView.snp.makeConstraints { make in make.top.equalTo(textFieldView.snp.top).offset(10) make.leading.equalTo(textFieldView.snp.leading).offset(15) - make.trailing.equalTo(textFieldView.snp.trailing).offset(-15) + make.trailing.equalTo(clearButton.snp.leading) make.height.equalTo(30) } @@ -169,13 +169,14 @@ class AddBookmarkView: UIView { clearButton.snp.makeConstraints { make in make.top.equalTo(nameTextView.snp.top).offset(7) - make.trailing.equalTo(nameTextView.snp.trailing).offset(-5) + make.trailing.equalTo(textFieldView.snp.trailing).offset(-15) + make.width.height.equalTo(24) } separatorView.snp.makeConstraints { make in make.top.equalTo(nameTextView.snp.bottom).offset(10) make.leading.equalTo(nameTextView.snp.leading).offset(5) - make.trailing.equalTo(nameTextView.snp.trailing).offset(-5) + make.trailing.equalTo(textFieldView.snp.trailing).offset(-15) make.height.equalTo(1) } From 806a6683328084b3d679e03f52485d1511b27a2c Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 16 Apr 2024 22:21:15 +0900 Subject: [PATCH 251/370] fix: bookmark move error --- iBox/Sources/BoxList/BoxListView.swift | 8 ++++++-- iBox/Sources/BoxList/BoxListViewModel.swift | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index a492c96..c42d999 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -150,6 +150,7 @@ class BoxListView: UIView { return cell } + boxListDataSource.defaultRowAnimation = .top boxListDataSource.delegate = self } @@ -422,7 +423,6 @@ class BoxListDataSource: UITableViewDiffableDataSource() + var rowsToReload = Set() var isEditing = false var favoriteId: UUID? = nil From 3fb859a39b381a7b1444560b02580ea2f8197878 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 16 Apr 2024 23:11:40 +0900 Subject: [PATCH 252/370] feat: folder open scroll action --- iBox/Sources/BoxList/BoxListView.swift | 11 +++++++++++ iBox/Sources/BoxList/BoxListViewModel.swift | 3 ++- iBox/Sources/Favorite/FavoriteView.swift | 1 - 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index c42d999..c230eb8 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -43,6 +43,9 @@ class BoxListView: UIView { $0.backgroundColor = .clear $0.separatorColor = .clear $0.rowHeight = 50 + $0.estimatedSectionHeaderHeight = 0 + $0.estimatedSectionFooterHeight = 0 + $0.estimatedRowHeight = 0 } private let emptyStackView = UIStackView().then { @@ -185,6 +188,14 @@ class BoxListView: UIView { guard var snapshot = self?.boxListDataSource.snapshot() else { return } snapshot.reloadItems(idArray) self?.boxListDataSource.apply(snapshot) + case .openCloseFolder(boxList: let boxList, section: let section, isEmpty: let isEmpty): + guard let prevOffset = self?.tableView.contentOffset else { return } + self?.applySnapshot(with: boxList) + self?.tableView.layoutIfNeeded() + if !isEmpty { + let indexPath = IndexPath(row: NSNotFound, section: section) + self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true) + } } }.store(in: &cancellables) } diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index 867a7bb..d7bbcf0 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -38,6 +38,7 @@ class BoxListViewModel { case reloadSections(idArray: [BoxListSectionViewModel.ID]) case reloadRows(idArray: [BoxListCellViewModel.ID]) case editStatus(isEditing: Bool) + case openCloseFolder(boxList: [BoxListSectionViewModel], section: Int, isEmpty: Bool) } let input = PassthroughSubject() @@ -63,7 +64,7 @@ class BoxListViewModel { } case let .folderTapped(section): boxList[section].isOpened.toggle() - output.send(.sendBoxList(boxList: boxList)) + output.send(.openCloseFolder(boxList: boxList, section: section, isEmpty: boxList[section].boxListCellViewModelsWithStatus.isEmpty)) case let .deleteBookmark(indexPath): deleteBookmark(at: indexPath) case let .toggleFavorite(indexPath): diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index f4834e0..0963419 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -40,7 +40,6 @@ class FavoriteView: UIView { // MARK: - Setup Methods private func setupProperty() { - guard let webView else { return } backgroundColor = .backgroundColor } From 87e1f37d86c9490591298b01e4650ac8f93304da Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 16 Apr 2024 23:22:55 +0900 Subject: [PATCH 253/370] =?UTF-8?q?chore:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=A4=84=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index c230eb8..5403162 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -189,7 +189,6 @@ class BoxListView: UIView { snapshot.reloadItems(idArray) self?.boxListDataSource.apply(snapshot) case .openCloseFolder(boxList: let boxList, section: let section, isEmpty: let isEmpty): - guard let prevOffset = self?.tableView.contentOffset else { return } self?.applySnapshot(with: boxList) self?.tableView.layoutIfNeeded() if !isEmpty { From 37f26ba0b04149ea56221361c6f4c9dff6f57372 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 00:05:13 +0900 Subject: [PATCH 254/370] fix: url decoding encoding --- iBox/Sources/Shared/AddBookmarkManager.swift | 28 +++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/iBox/Sources/Shared/AddBookmarkManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift index 68ce206..1b0962d 100644 --- a/iBox/Sources/Shared/AddBookmarkManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -20,9 +20,9 @@ class AddBookmarkManager { private func update(with data: (title: String?, data: String?, faviconUrl: String?)) { DispatchQueue.main.async { - self.incomingTitle = data.title - self.incomingData = data.data - self.incomingFaviconUrl = data.faviconUrl + self.incomingTitle = data.title?.removingPercentEncoding + self.incomingData = data.data?.removingPercentEncoding + self.incomingFaviconUrl = data.faviconUrl?.removingPercentEncoding } } @@ -40,21 +40,31 @@ class AddBookmarkManager { } private func extractDataParameter(from url: URL) -> String? { - guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), - let queryItems = components.queryItems else { + let urlString = url.absoluteString + + guard let range = urlString.range(of: "url?data=") else { return nil } - return queryItems.first { $0.name == "data" }?.value + + let dataParameter = urlString[range.upperBound...] + return String(dataParameter).removingPercentEncoding } private func fetchWebsiteDetails(from url: URL) { let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in - guard let data = data, error == nil, - let html = String(data: data, encoding: .utf8) else { + guard let data = data, error == nil else { print("Error downloading HTML: \(String(describing: error))") return } + let encodingName = (response as? HTTPURLResponse)?.textEncodingName ?? "utf-8" + let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) + + guard let html = String(data: data, encoding: encoding) else { + print("Failed to decode data with encoding: \(encodingName)") + return + } + self?.parseHTML(html, url) } task.resume() @@ -63,7 +73,7 @@ class AddBookmarkManager { func navigateToAddBookmarkView(from url: URL, in tabBarController: UITabBarController) { guard url.scheme == "iBox", let urlString = extractDataParameter(from: url) else { return } guard let url = URL(string: urlString) else { - print("Invalid URL") + print("Invalid URL \(urlString)") return } From 041e207f869828501049d436be9f7da824ccadf5 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 00:05:37 +0900 Subject: [PATCH 255/370] fix: share extension encoding --- ShareExtension/Sources/ShareViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index a0678cd..f7493a6 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -133,7 +133,7 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { return } - let urlString = "iBox://url?data=\(sharedURL)" + let urlString = "iBox://url?data=\(sharedURL)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" if let openUrl = URL(string: urlString) { if self.openURL(openUrl) { @@ -143,6 +143,7 @@ extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { } } else { print("url error") + // 해당 url은 사용할 수 없음을 보여주는 뷰를 만들어야함. } } } From db1dcbec07a7efa6791f9fd2a389aeccddbd72b9 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 00:28:22 +0900 Subject: [PATCH 256/370] fix: url encoding in webviewdelegate --- iBox/Sources/Web/WebViewController.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 5f017ea..e838341 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -46,9 +46,11 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol extension WebViewController: WebViewDelegate { func pushAddBookMarkViewController(url: URL) { - AddBookmarkManager.shared.incomingData = url.absoluteString + let encodingURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" - if let iBoxUrl = URL(string: "iBox://url?data=" + url.absoluteString) { + AddBookmarkManager.shared.incomingData = encodingURL + + if let iBoxUrl = URL(string: "iBox://url?data=" + encodingURL) { if let tabBarController = findMainTabBarController() { AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) } From 24fd632584a42e37d7412f12ade056523862c36c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 00:35:53 +0900 Subject: [PATCH 257/370] fix: delete incomingData --- iBox/Sources/Web/WebViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index e838341..d129f79 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -48,7 +48,7 @@ extension WebViewController: WebViewDelegate { func pushAddBookMarkViewController(url: URL) { let encodingURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" - AddBookmarkManager.shared.incomingData = encodingURL +// AddBookmarkManager.shared.incomingData = encodingURL if let iBoxUrl = URL(string: "iBox://url?data=" + encodingURL) { if let tabBarController = findMainTabBarController() { From 41e90899756b74ab6cdcb3c172b994e21e4321b8 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Wed, 17 Apr 2024 00:42:44 +0900 Subject: [PATCH 258/370] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebViewController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index d129f79..4c09737 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -48,8 +48,6 @@ extension WebViewController: WebViewDelegate { func pushAddBookMarkViewController(url: URL) { let encodingURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" -// AddBookmarkManager.shared.incomingData = encodingURL - if let iBoxUrl = URL(string: "iBox://url?data=" + encodingURL) { if let tabBarController = findMainTabBarController() { AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) From d7621d2a88c2b05a6749960fa71ad135d37e90ec Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 01:13:52 +0900 Subject: [PATCH 259/370] =?UTF-8?q?fix:=20=EC=9D=B4=EC=A0=84=20=EC=BA=90?= =?UTF-8?q?=EC=8B=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 74d81cb..147e668 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -151,14 +151,20 @@ extension BoxListViewController: BoxListViewDelegate { guard let newUrlString = controller.textFields?.last?.text, let newUrl = URL(string: newUrlString) else { return } guard let contentView = self?.contentView as? BoxListView else { return } - + guard let bookmark = contentView.viewModel?.bookmark(at: indexPath) else { return } + contentView.viewModel?.editBookmark(at: indexPath, name: newName, url: newUrl) + + WebCacheManager.shared.removeViewControllerForKey(bookmark.id) } + controller.addAction(cancelAction) controller.addAction(okAction) okAction.isEnabled = true controller.addTextField() { textField in + textField.clearButtonMode = .whileEditing + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: {_ in let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 @@ -169,6 +175,8 @@ extension BoxListViewController: BoxListViewDelegate { }) } controller.addTextField() { textField in + textField.clearButtonMode = .whileEditing + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main, using: {_ in let textCount = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines).count ?? 0 From 792befce5ef7e0407b25dd134946c75be7261215 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 01:15:25 +0900 Subject: [PATCH 260/370] feat: edit action --- iBox/Sources/BoxList/BoxListView.swift | 38 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index a492c96..7fd2f0d 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -361,15 +361,6 @@ extension BoxListView: UITableViewDelegate { } private func makeContextMenu(for indexPath: IndexPath) -> UIMenu { - let deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] action in - self?.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) - if UserDefaultsManager.isHaptics { - let generator = UIImpactFeedbackGenerator(style: .soft) - generator.prepare() - generator.impactOccurred() - } - } - let isFavorite = self.viewModel?.isFavoriteBookmark(at: indexPath) ?? false let favoriteActionTitle = isFavorite ? "즐겨찾기 해제" : "즐겨찾기로 등록" let favoriteActionImage = UIImage(systemName: isFavorite ? "heart.slash.fill" : "heart.fill") @@ -382,7 +373,9 @@ extension BoxListView: UITableViewDelegate { generator.impactOccurred() } } - + + favoriteAction.image?.withTintColor(.box2) + let shareAction = UIAction(title: "공유하기", image: UIImage(systemName: "square.and.arrow.up")) { [weak self] action in guard let self = self, let url = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row].url else { return } @@ -397,8 +390,31 @@ extension BoxListView: UITableViewDelegate { viewController.present(activityViewController, animated: true, completion: nil) } } + + let editAction = UIAction(title: "북마크 편집", image: UIImage(systemName: "pencil")) { [weak self] action in + guard let self = self else { return } - return UIMenu(title: "", children: [favoriteAction, shareAction, deleteAction]) + self.delegate?.presentEditBookmarkController(at: indexPath) + + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } + } + + let deleteAction = UIAction(title: "삭제", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] action in + self?.viewModel?.input.send(.deleteBookmark(indexPath: indexPath)) + if UserDefaultsManager.isHaptics { + let generator = UIImpactFeedbackGenerator(style: .soft) + generator.prepare() + generator.impactOccurred() + } + } + + + + return UIMenu(title: "", children: [favoriteAction, shareAction, editAction, deleteAction]) } } From 0635f7cf08ec79ea96917e1453e7634331e8256e Mon Sep 17 00:00:00 2001 From: chanhihi Date: Wed, 17 Apr 2024 01:15:41 +0900 Subject: [PATCH 261/370] feat: remove cache --- iBox/Sources/Shared/WebCacheManager.swift | 38 +++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/iBox/Sources/Shared/WebCacheManager.swift b/iBox/Sources/Shared/WebCacheManager.swift index a54e26b..c3123d3 100644 --- a/iBox/Sources/Shared/WebCacheManager.swift +++ b/iBox/Sources/Shared/WebCacheManager.swift @@ -7,23 +7,6 @@ import UIKit -class UUIDWrapper: NSObject { - let uuid: UUID - - init(uuid: UUID) { - self.uuid = uuid - } - - override func isEqual(_ object: Any?) -> Bool { - guard let other = object as? UUIDWrapper else { return false } - return uuid == other.uuid - } - - override var hash: Int { - return uuid.hashValue - } -} - class WebCacheManager { static let shared = WebCacheManager() @@ -42,4 +25,25 @@ class WebCacheManager { return cache.object(forKey: wrapper) } + func removeViewControllerForKey(_ uuid: UUID) { + let wrapper = UUIDWrapper(uuid: uuid) + cache.removeObject(forKey: wrapper) + } +} + +class UUIDWrapper: NSObject { + let uuid: UUID + + init(uuid: UUID) { + self.uuid = uuid + } + + override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? UUIDWrapper else { return false } + return uuid == other.uuid + } + + override var hash: Int { + return uuid.hashValue + } } From c46c5eed6b2a82e7600f5ea9b2be4cc7ed4d735e Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 17 Apr 2024 15:30:55 +0900 Subject: [PATCH 262/370] =?UTF-8?q?feat:=20FolderListViewController?= =?UTF-8?q?=EC=97=90=20=EB=B0=B1=20=EC=A0=9C=EC=8A=A4=EC=B2=98=20=ED=97=88?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AddBookmark/FolderListViewController.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/iBox/Sources/AddBookmark/FolderListViewController.swift b/iBox/Sources/AddBookmark/FolderListViewController.swift index 40f2215..4c9f1c8 100644 --- a/iBox/Sources/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/AddBookmark/FolderListViewController.swift @@ -34,6 +34,7 @@ class FolderListViewController: UIViewController { super.viewDidLoad() setupNavigationBar() + navigationController?.interactivePopGestureRecognizer?.delegate = self } private func setupNavigationBar() { @@ -100,3 +101,9 @@ extension FolderListViewController: FolderListViewDelegate { } } + +extension FolderListViewController: UIGestureRecognizerDelegate { + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } +} From f56b826b6a20ed799e28f3659968685825fb2667 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 17 Apr 2024 15:39:41 +0900 Subject: [PATCH 263/370] =?UTF-8?q?fix:=20bookmark=20=ED=8E=B8=EC=A7=91?= =?UTF-8?q?=EC=8B=9C=20=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index f46a283..7b8b29c 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -177,7 +177,7 @@ class BoxListView: UIView { self?.applySnapshot(with: boxList) self?.emptyStackView.isHidden = !boxList.isEmpty case .editStatus(isEditing: let isEditing): - self?.tableView.setEditing(isEditing, animated: true) + self?.tableView.setEditing(isEditing, animated: false) guard let snapshot = self?.boxListDataSource.snapshot() else { return } self?.boxListDataSource.applySnapshotUsingReloadData(snapshot) case .reloadSections(idArray: let idArray): From f9cc1b4ba76f174d5ec1a7540677cd3ff81c114e Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 17 Apr 2024 15:40:09 +0900 Subject: [PATCH 264/370] =?UTF-8?q?feat:=20clearButton=20=ED=84=B0?= =?UTF-8?q?=EC=B9=98=20=EC=8B=9C=20nameTextView=20firstResponder=EB=A1=9C?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AddBookmark/AddBookmarkView.swift | 1 + iBox/Sources/AddBookmark/AddBookmarkViewController.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index 87688be..085283a 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -248,6 +248,7 @@ class AddBookmarkView: UIView { @objc func clearTextView() { nameTextView.text = "" textViewDidChange(nameTextView) + nameTextView.becomeFirstResponder() } @objc private func buttonTapped() { diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index 521379d..e9fb193 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -31,13 +31,13 @@ final class AddBookmarkViewController: UIViewController { super.viewWillAppear(animated) updateSelectedFolder() addBookmarkView.updateTextFieldsFilledState() - addBookmarkView.nameTextView.becomeFirstResponder() } override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() updateSelectedFolder() + addBookmarkView.nameTextView.becomeFirstResponder() } private func setupNavigationBar() { From 3e21695f8f2b1e455214a2de8f6ceed01c0a0241 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 17 Apr 2024 16:46:05 +0900 Subject: [PATCH 265/370] fix: empty image view color in systemmode change --- iBox/Sources/BoxList/BoxListView.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 7b8b29c..d09eaca 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -94,6 +94,21 @@ class BoxListView: UIView { NotificationCenter.default.removeObserver(self) } + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() + let images = [image0, image1, image2, image3] + emptyImageView.animationImages = images + if !emptyStackView.isHidden { + emptyImageView.startAnimating() + } + } + } + // MARK: - Setup Methods private func setupProperty() { @@ -176,6 +191,11 @@ class BoxListView: UIView { case .sendBoxList(boxList: let boxList): self?.applySnapshot(with: boxList) self?.emptyStackView.isHidden = !boxList.isEmpty + if self?.emptyStackView.isHidden == false { + self?.emptyImageView.startAnimating() + } else { + self?.emptyImageView.stopAnimating() + } case .editStatus(isEditing: let isEditing): self?.tableView.setEditing(isEditing, animated: false) guard let snapshot = self?.boxListDataSource.snapshot() else { return } From 46412581e57c68d31a5ba1e498b44bb7c2084a59 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 17 Apr 2024 18:31:40 +0900 Subject: [PATCH 266/370] feat: cache image --- iBox/Sources/BoxList/BoxListView.swift | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index d09eaca..77ae181 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -94,20 +94,20 @@ class BoxListView: UIView { NotificationCenter.default.removeObserver(self) } - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) - if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { - let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() - let images = [image0, image1, image2, image3] - emptyImageView.animationImages = images - if !emptyStackView.isHidden { - emptyImageView.startAnimating() - } - } - } +// override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { +// super.traitCollectionDidChange(previousTraitCollection) +// if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { +// let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() +// let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() +// let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() +// let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() +// let images = [image0, image1, image2, image3] +// emptyImageView.animationImages = images +// if !emptyStackView.isHidden { +// emptyImageView.startAnimating() +// } +// } +// } // MARK: - Setup Methods From a78f815d737a0047917e4400ec5c348d03ac9609 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 17 Apr 2024 18:33:18 +0900 Subject: [PATCH 267/370] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListView.swift | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 77ae181..d09eaca 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -94,20 +94,20 @@ class BoxListView: UIView { NotificationCenter.default.removeObserver(self) } -// override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { -// super.traitCollectionDidChange(previousTraitCollection) -// if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { -// let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() -// let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() -// let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() -// let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() -// let images = [image0, image1, image2, image3] -// emptyImageView.animationImages = images -// if !emptyStackView.isHidden { -// emptyImageView.startAnimating() -// } -// } -// } + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() + let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() + let images = [image0, image1, image2, image3] + emptyImageView.animationImages = images + if !emptyStackView.isHidden { + emptyImageView.startAnimating() + } + } + } // MARK: - Setup Methods From 69ce2ab1b414a63fe979bf4974e0ee5f3ac0cf98 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 17 Apr 2024 18:36:05 +0900 Subject: [PATCH 268/370] feat: cache image --- iBox/Sources/BoxList/BoxListView.swift | 38 +++++++++++++++++--------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index d09eaca..ddf6b30 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -61,17 +61,24 @@ class BoxListView: UIView { $0.textAlignment = .center } + private lazy var lightEmptyImages = [ + UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .light))) ?? UIImage(), + UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .light))) ?? UIImage(), + UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .light))) ?? UIImage(), + UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .light))) ?? UIImage() + ] + + private lazy var darkEmptyImages = [ + UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .dark))) ?? UIImage(), + UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .dark))) ?? UIImage(), + UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .dark))) ?? UIImage(), + UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel.resolvedColor(with: .init(userInterfaceStyle: .dark))) ?? UIImage() + ] + private let emptyImageView = UIImageView().then { - let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() - let images = [image0, image1, image2, image3] $0.contentMode = .scaleAspectFit $0.tintColor = .secondaryLabel - $0.animationImages = images $0.animationDuration = 1.5 - $0.startAnimating() } // MARK: - Initializer @@ -97,12 +104,11 @@ class BoxListView: UIView { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { - let image0 = UIImage(named: "sitting_fox0")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image1 = UIImage(named: "sitting_fox1")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image2 = UIImage(named: "sitting_fox2")?.imageWithColor(.secondaryLabel) ?? UIImage() - let image3 = UIImage(named: "sitting_fox3")?.imageWithColor(.secondaryLabel) ?? UIImage() - let images = [image0, image1, image2, image3] - emptyImageView.animationImages = images + if previousTraitCollection?.userInterfaceStyle == .light { + emptyImageView.animationImages = darkEmptyImages + } else { + emptyImageView.animationImages = lightEmptyImages + } if !emptyStackView.isHidden { emptyImageView.startAnimating() } @@ -115,6 +121,12 @@ class BoxListView: UIView { backgroundColor = .backgroundColor viewModel = BoxListViewModel() tableView.delegate = self + + if UITraitCollection.current.userInterfaceStyle == .light { + emptyImageView.animationImages = lightEmptyImages + } else { + emptyImageView.animationImages = darkEmptyImages + } } private func setupHierarchy() { From 614e8c3fec51be9881bfb905dd6369e541865f40 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Wed, 17 Apr 2024 20:24:44 +0900 Subject: [PATCH 269/370] =?UTF-8?q?fix:=20ShareExtension=EC=8B=9C=20presen?= =?UTF-8?q?t=20=EB=90=98=EC=96=B4=20=EC=9E=88=EB=8A=94=20view=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이미 present된 view가 있는 경우 ShareExtension시 북마크 추가화면이 뜨지 않는 버그 수정 --- iBox/Sources/BoxList/BoxListViewController.swift | 5 ++--- .../Extension/UIViewController+Extension.swift | 15 +++++---------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 147e668..5acb884 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -12,11 +12,10 @@ class BoxListViewController: BaseViewController, BaseViewController var shouldPresentModalAutomatically: Bool = false { didSet { if shouldPresentModalAutomatically { - // shouldPresentModalAutomatically가 true로 설정될 때 함수 호출 - if findAddBookmarkView() == nil { + if findAddBookmarkViewController() == false { + dismiss(animated: false) self.addButtonTapped() } - // 함수 호출 후 shouldPresentModalAutomatically를 false로 설정 shouldPresentModalAutomatically = false } } diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift index 5277a9d..51b6343 100644 --- a/iBox/Sources/Extension/UIViewController+Extension.swift +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -19,16 +19,11 @@ extension UIViewController { return nil } - func findAddBookmarkView() -> Bool? { - var responder: UIResponder? = self - while let nextResponder = responder?.next { - if let viewController = nextResponder as? AddBookmarkView { - return true - } - responder = nextResponder + func findAddBookmarkViewController() -> Bool { + if let navigationController = presentedViewController as? UINavigationController, + let _ = navigationController.topViewController as? AddBookmarkViewController { + return true } - return nil + return false } - - } From 3febabb7a728d5331e7a11e60025a5c746a1ee6c Mon Sep 17 00:00:00 2001 From: jonnwon Date: Wed, 17 Apr 2024 22:02:36 +0900 Subject: [PATCH 270/370] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=9E=85=EB=A0=A5=ED=95=9C=20URL=EC=97=90=20https:?= =?UTF-8?q?//=EA=B0=80=20=EC=97=86=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - https:// 와 http:// 가 둘 다 없는 경우 https:// 를 추가 --- .../AddBookmark/AddBookmarkViewController.swift | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index e9fb193..363850a 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -130,12 +130,21 @@ final class AddBookmarkViewController: UIViewController { @objc private func addButtonTapped() { guard let name = addBookmarkView.nameTextView.text, !name.isEmpty, - let urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty, - let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), - let url = URL(string: encodedUrlString) else { + var urlString = addBookmarkView.urlTextView.text, !urlString.isEmpty else { print("Invalid input") return } + + let lowercasedUrlString = urlString.lowercased() + if !lowercasedUrlString.hasPrefix("https://") && !lowercasedUrlString.hasPrefix("http://") { + urlString = "https://" + urlString + } + + guard let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), + let url = URL(string: encodedUrlString) else { + print("Invalid URL format") + return + } let newBookmark = Bookmark(id: UUID(), name: name, url: url) From 8cf8c98c62faeb143a653d095aad6f4e3dbe00ca Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 18 Apr 2024 01:00:15 +0900 Subject: [PATCH 271/370] feat: separate default data --- iBox/Sources/Initializer/DefaultData.swift | 50 +++++++++++++++++++ .../Initializer/DefaultDataModel.swift | 31 ++++++++++++ iBox/Sources/SceneDelegate.swift | 46 +---------------- 3 files changed, 83 insertions(+), 44 deletions(-) create mode 100644 iBox/Sources/Initializer/DefaultData.swift create mode 100644 iBox/Sources/Initializer/DefaultDataModel.swift diff --git a/iBox/Sources/Initializer/DefaultData.swift b/iBox/Sources/Initializer/DefaultData.swift new file mode 100644 index 0000000..4cc8522 --- /dev/null +++ b/iBox/Sources/Initializer/DefaultData.swift @@ -0,0 +1,50 @@ +// +// DefaultData.swift +// iBox +// +// Created by Chan on 4/17/24. +// + +import Foundation + + +class DefaultData { + + static func insertDefaultDataIfNeeded(_ isReset: Bool = false, completion: (() -> Void)? = nil) { + let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted + if !isDefaultDataInserted || isReset { + fetchDefaultData { defaultFolders in + DispatchQueue.main.async { + CoreDataManager.shared.deleteAllFolders() + CoreDataManager.shared.addInitialFolders(defaultFolders) + UserDefaultsManager.isDefaultDataInserted = true + completion?() + } + } + } + } + + static func fetchDefaultData(completion: @escaping ([Folder]) -> Void) { + let localDic: [String : String] = ["Seoul" : "default-kr", "default" : "default"] + let cityName = "Seoul" // 추후 global 예정 + let local = localDic[cityName] ?? "default" + + let url = URL(string: "https://raw.githubusercontent.com/42Box/versioning/main/\(local).json")! + URLSession.shared.dataTask(with: url) { data, response, error in + guard let data = data, error == nil else { + print("Error fetching default data: \(String(describing: error))") + completion(DefaultDataLoader.defaultData) + return + } + + do { + let folderData = try JSONDecoder().decode(FolderData.self, from: data) + let folders = [Folder(id: UUID(), name: "42 \(cityName)", bookmarks: folderData.list.map { Bookmark(id: UUID(), name: $0.name, url: URL(string: $0.url)!) })] + completion(folders) + } catch { + print("Error decoding JSON: \(error)") + completion(DefaultDataLoader.defaultData) + } + }.resume() + } +} diff --git a/iBox/Sources/Initializer/DefaultDataModel.swift b/iBox/Sources/Initializer/DefaultDataModel.swift new file mode 100644 index 0000000..7a3bb89 --- /dev/null +++ b/iBox/Sources/Initializer/DefaultDataModel.swift @@ -0,0 +1,31 @@ +// +// DefaultDataModel.swift +// iBox +// +// Created by Chan on 4/17/24. +// + +import Foundation + + +struct FolderData: Codable { + var list: [BookmarkData] +} + +struct BookmarkData: Codable { + var name: String + var url: String +} + +struct DefaultDataLoader { + static let defaultData = [ + Folder(id: UUID(), name: "42 폴더", bookmarks: [ + Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), + Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), + Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), + Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), + Bookmark(id: UUID(), name: "42gg", url: URL(string: "https://gg.42seoul.kr/")!), + Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) + ]) + ] +} diff --git a/iBox/Sources/SceneDelegate.swift b/iBox/Sources/SceneDelegate.swift index 7824184..2c7da4b 100644 --- a/iBox/Sources/SceneDelegate.swift +++ b/iBox/Sources/SceneDelegate.swift @@ -17,53 +17,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene - // 앱 테마 정보 window?.overrideUserInterfaceStyle = window?.toUserInterfaceStyle(UserDefaultsManager.theme) ?? .unspecified - insertDefaultDataIfNeeded() + window?.rootViewController = CustomLaunchScreenViewController(urlContext: connectionOptions.urlContexts.first) + window?.makeKeyAndVisible() - window?.rootViewController = CustomLaunchScreenViewController() - window?.makeKeyAndVisible() // 윈도우를 화면에 보여줌 - - if let urlContext = connectionOptions.urlContexts.first { - let url = urlContext.url - guard url.scheme == "iBox" else { return } - - print("Opened URL: \(url)") - - // URLdecoder.handleCustomURL(url) - GlobalURLManager.shared.incomingURL = url - - if let windowScene = scene as? UIWindowScene, - let tabBarController = windowScene.windows.first?.rootViewController as? UITabBarController { - tabBarController.selectedIndex = 0 // 첫 번째 탭으로 이동 - - // 첫 번째 탭(FirstViewController)에 있는 shouldPresentModalAutomatically를 true로 설정 - if let navigationController = tabBarController.selectedViewController as? UINavigationController, - let boxListViewController = navigationController.viewControllers.first as? BoxListViewController { - boxListViewController.shouldPresentModalAutomatically = true - } - } - } - } - - private func insertDefaultDataIfNeeded() { - let isDefaultDataInserted = UserDefaultsManager.isDefaultDataInserted - if !isDefaultDataInserted { - let defaultData = [ - Folder(id: UUID(), name: "42 폴더", bookmarks: [ - Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), - Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), - Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), - Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), - Bookmark(id: UUID(), name: "Cabi", url: URL(string: "https://cabi.42seoul.io/")!), - Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) - ]) - ] - CoreDataManager.shared.deleteAllFolders() - CoreDataManager.shared.addInitialFolders(defaultData) - UserDefaultsManager.isDefaultDataInserted = true - } } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { From e8ae061cc0cf569c82fadc27c16b0c70db0a1758 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 18 Apr 2024 01:00:53 +0900 Subject: [PATCH 272/370] feat: launchscreen startup flow --- .../CustomLaunchScreenViewController.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 01aefba..7891ae3 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -34,6 +34,7 @@ class CustomLaunchScreenViewController: UIViewController { switch result { case .success, .maxRetryReached, .later: self?.transitionToNextScreen() + print("App 정상 실행") case .urlError: print("URL 에러가 발생했습니다.") case .networkError: @@ -54,13 +55,17 @@ class CustomLaunchScreenViewController: UIViewController { print("scene error 수집") case .internalInfoError: print("info error 수집") - case .Initial: - print("초기값") + case .initial: + self?.startupFlow() + print("init") } } .store(in: &cancellables) } + private func startupFlow() { + DefaultData.insertDefaultDataIfNeeded() + } private func transitionToNextScreen() { let mainViewController = MainTabBarController() From 10e6b80a2be120e20407404bdfe31799c21f6493 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 18 Apr 2024 01:01:27 +0900 Subject: [PATCH 273/370] fix: reset data --- .../Sources/Extension/UIColor+Extension.swift | 2 +- .../UIViewController+Extension.swift | 30 ++++++ .../Settings/Reset/ResetSuccessView.swift | 98 +++++++++++++++++++ .../Settings/Reset/ResetViewController.swift | 80 +++++---------- 4 files changed, 154 insertions(+), 56 deletions(-) create mode 100644 iBox/Sources/Extension/UIViewController+Extension.swift create mode 100644 iBox/Sources/Settings/Reset/ResetSuccessView.swift diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index c0a3e69..5c3dd1c 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -37,5 +37,5 @@ extension UIColor { static let webIconColor = color(light: .black, dark: .systemGray) static let dimmedViewColor = UIColor.black.withAlphaComponent(0.75) static let backgroundColor = color(light: .white, dark: UIColor(hex: 0x242424)) - + static let invertBackgroundColor = color(light: UIColor(hex: 0x242424), dark: .white) } diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift new file mode 100644 index 0000000..cf8c7f5 --- /dev/null +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -0,0 +1,30 @@ +// +// UIViewController+Extension.swift +// iBox +// +// Created by Chan on 4/16/24. +// + +import UIKit + +extension UIViewController { + func findMainTabBarController() -> UITabBarController? { + var responder: UIResponder? = self + while let nextResponder = responder?.next { + if let viewController = nextResponder as? UITabBarController { + return viewController + } + responder = nextResponder + } + return nil + } + + func findAddBookmarkViewController() -> Bool { + if let navigationController = presentedViewController as? UINavigationController, + let topViewController = navigationController.topViewController as? AddBookmarkViewController { + return true + } + return false + } + +} diff --git a/iBox/Sources/Settings/Reset/ResetSuccessView.swift b/iBox/Sources/Settings/Reset/ResetSuccessView.swift new file mode 100644 index 0000000..a52388b --- /dev/null +++ b/iBox/Sources/Settings/Reset/ResetSuccessView.swift @@ -0,0 +1,98 @@ +// +// ResetSuccessView.swift +// iBox +// +// Created by Chan on 4/17/24. +// + +import UIKit + +import SnapKit + +protocol ResetSuccessViewDelegate: AnyObject { + func didCompleteReset() +} + +class ResetSuccessView: UIView { + + weak var delegate: ResetSuccessViewDelegate? + + private let checkMarkImageView = UIImageView().then { + $0.image = UIImage(systemName: "checkmark") + $0.contentMode = .scaleAspectFit + $0.tintColor = .box2 + } + + private let label = UILabel().then { + $0.text = "초기화 성공" + $0.textColor = .invertBackgroundColor + $0.textAlignment = .center + $0.font = UIFont.systemFont(ofSize: 16) + } + + private let stackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 10 + $0.alignment = .center + $0.distribution = .equalSpacing + } + + private let backPannelView = UIView().then { + $0.backgroundColor = .backgroundColor + $0.layer.cornerRadius = 20 + $0.clipsToBounds = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + animateView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupView() { + self.alpha = 0 + self.backgroundColor = UIColor.invertBackgroundColor.withAlphaComponent(0.35) + self.addSubview(backPannelView) + backPannelView.addSubview(stackView) + + stackView.addArrangedSubview(checkMarkImageView) + stackView.addArrangedSubview(label) + + backPannelView.snp.makeConstraints { make in + make.width.height.equalTo(200) + make.center.equalToSuperview() + } + + stackView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + checkMarkImageView.snp.makeConstraints { make in + make.width.height.equalTo(50) + } + } + private func animateView() { + UIView.animate(withDuration: 0.5, animations: { + self.alpha = 1.0 + }) { _ in + UIView.animate(withDuration: 0.5) { + self.backPannelView.alpha = 1.0 + } + + UIView.animate(withDuration: 0.5, delay: 2, options: []) { + self.backPannelView.alpha = 0.0 + } completion: { _ in + UIView.animate(withDuration: 0.5, animations: { + self.alpha = 0.0 + }) { _ in + self.removeFromSuperview() + self.delegate?.didCompleteReset() + } + } + } + } +} diff --git a/iBox/Sources/Settings/Reset/ResetViewController.swift b/iBox/Sources/Settings/Reset/ResetViewController.swift index 3f8088e..eb2bdb6 100644 --- a/iBox/Sources/Settings/Reset/ResetViewController.swift +++ b/iBox/Sources/Settings/Reset/ResetViewController.swift @@ -42,14 +42,17 @@ extension ResetViewController: ResetViewDelegate { alertController.addAction(cancelAction) let confirmAction = UIAlertAction(title: "확인", style: .default) { [weak self] _ in + guard let self = self else { return } if let textField = alertController.textFields?.first, let text = textField.text, text == "iBox" { - self?.resetData() - self?.navigationController?.popViewController(animated: true) + self.resetData() } else { - self?.showAlert() + self.showAlert() } } + confirmAction.isEnabled = false + confirmAction.setValue(UIColor.red, forKey: "titleTextColor") + alertController.addAction(confirmAction) alertController.addTextField() { textField in @@ -65,62 +68,29 @@ extension ResetViewController: ResetViewDelegate { self.present(alertController, animated: true, completion: nil) } - private func storeDataHandler(defaultData: [Folder]) { - DispatchQueue.main.async { - CoreDataManager.shared.deleteAllFolders() - CoreDataManager.shared.addInitialFolders(defaultData) - UserDefaultsManager.isDefaultDataInserted = true - } - } - - private func resetHandler() { - let urlString = "https://raw.githubusercontent.com/42Box/versioning/main/raw.json" - - NetworkManager.shared.fetchModel(from: urlString, modelType: VersionInfo.self) { result in - switch result { - case .success(let model): - if let defaultList = model.url.filter({ $0.id == 0 }).first?.defaultList?.first?.list { - var bookmarks = [Bookmark]() - for item in defaultList { - if let url = URL(string: item.url) { - let bookmark = Bookmark(id: UUID(), name: item.name ?? "", url: url) - bookmarks.append(bookmark) - } - } - - let defaultData = [ - Folder(id: UUID(), name: "42 폴더", bookmarks: bookmarks) - ] - - self.storeDataHandler(defaultData: defaultData) - - print("success") + private func resetData() { + DefaultData.insertDefaultDataIfNeeded(true) { + UserDefaultsManager.favoriteId = nil + WebViewPreloader.shared.setFavoriteUrl(url: nil) + NotificationCenter.default.post(name: .didResetData, object: nil) + DispatchQueue.main.async { + let successView = ResetSuccessView(frame: self.view.bounds) + successView.delegate = self + self.view.addSubview(successView) + successView.snp.makeConstraints { make in + make.edges.equalToSuperview() } - case .failure(let error): - print("Error fetching version info: \(error.localizedDescription)") - - let defaultData = [ - Folder(id: UUID(), name: "42 폴더", bookmarks: [ - Bookmark(id: UUID(), name: "42 Intra", url: URL(string: "https://profile.intra.42.fr/")!), - Bookmark(id: UUID(), name: "집현전", url: URL(string: "https://42library.kr/")!), - Bookmark(id: UUID(), name: "42Where", url: URL(string: "https://www.where42.kr/")! ), - Bookmark(id: UUID(), name: "42Stat", url: URL(string: "https://stat.42seoul.kr/")!), - Bookmark(id: UUID(), name: "24HANE", url: URL(string: "https://24hoursarenotenough.42seoul.kr/")!) - ]) - ] - - self.storeDataHandler(defaultData: defaultData) } } } - - private func resetData() { - // https://my-json-server.typicode.com/42Box/versioning/version/1 - - resetHandler() - UserDefaultsManager.favoriteId = nil - WebViewPreloader.shared.setFavoriteUrl(url: nil) - NotificationCenter.default.post(name: .didResetData, object: nil) +} + +// MARK: - ResetSuccessView + +extension ResetViewController: ResetSuccessViewDelegate { + + func didCompleteReset() { + self.navigationController?.popViewController(animated: true) } } From 7a30189e6b4c7cc6cfd2125cd80956eac6fb9208 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 18 Apr 2024 01:01:44 +0900 Subject: [PATCH 274/370] fix: version check code --- iBox/Sources/Shared/AppStateManager.swift | 5 +---- iBox/Sources/Versioning/VersionCheckCode.swift | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/iBox/Sources/Shared/AppStateManager.swift b/iBox/Sources/Shared/AppStateManager.swift index e2422b1..3c32cda 100644 --- a/iBox/Sources/Shared/AppStateManager.swift +++ b/iBox/Sources/Shared/AppStateManager.swift @@ -10,9 +10,6 @@ import Combine class AppStateManager { static let shared = AppStateManager() - @Published var isVersionCheckCompleted: VersionCheckCode = .Initial + @Published var isVersionCheckCompleted: VersionCheckCode = .initial - func shouldTransitionToNextScreen(completion: @escaping (VersionCheckCode) -> Void) { - completion(isVersionCheckCompleted) - } } diff --git a/iBox/Sources/Versioning/VersionCheckCode.swift b/iBox/Sources/Versioning/VersionCheckCode.swift index 2a648ba..37b250e 100644 --- a/iBox/Sources/Versioning/VersionCheckCode.swift +++ b/iBox/Sources/Versioning/VersionCheckCode.swift @@ -6,7 +6,7 @@ // enum VersionCheckCode: Equatable { - case Initial // 초기값 + case initial // 초기값 case success // 성공 case later // 나중에 (ab testing code) case update // 업데이트 (ab testing code) From e02431296ec140f1d55d14b7ef5342d06c69c198 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 18 Apr 2024 01:42:13 +0900 Subject: [PATCH 275/370] fix: versioning --- iBox/Sources/Model/VersionInfo.swift | 41 ++----------------- .../Versioning/VersioningHandler.swift | 6 +-- 2 files changed, 7 insertions(+), 40 deletions(-) diff --git a/iBox/Sources/Model/VersionInfo.swift b/iBox/Sources/Model/VersionInfo.swift index 1fab73e..1f83182 100644 --- a/iBox/Sources/Model/VersionInfo.swift +++ b/iBox/Sources/Model/VersionInfo.swift @@ -8,45 +8,12 @@ // MARK: - VersionInfo struct VersionInfo: Codable { let version: [Version] - let storeUrl: String - let url: [URLUpdate] -} - -// MARK: - URLUpdate -struct URLUpdate: Codable { - let id: Int - let defaultList: [URLList]? - let remove: [URLList]? - let add: [URLList]? - let fix: [FixList]? - - enum CodingKeys: String, CodingKey { - case id - case defaultList = "default" - case remove, add, fix - } -} - -// MARK: - URLList -struct URLList: Codable { - let list: [URLItem] -} - -// MARK: - URLItem -struct URLItem: Codable { - let name: String? - let url: String + let url: URLClass } -// MARK: - FixList -struct FixList: Codable { - let list: [FixItem] -} - -// MARK: - FixItem -struct FixItem: Codable { - let from: String - let to: String +// MARK: - URLClass +struct URLClass: Codable { + let storeUrl: String } // MARK: - Version diff --git a/iBox/Sources/Versioning/VersioningHandler.swift b/iBox/Sources/Versioning/VersioningHandler.swift index 433454c..cccde8f 100644 --- a/iBox/Sources/Versioning/VersioningHandler.swift +++ b/iBox/Sources/Versioning/VersioningHandler.swift @@ -11,7 +11,7 @@ class VersioningHandler { func checkAppVersion(retryCount: Int = 0, completion: @escaping (VersionCheckCode) -> Void) { let maxRetryCount = 3 - let urlString = "https://raw.githubusercontent.com/42Box/versioning/main/raw.json" + let urlString = "https://raw.githubusercontent.com/42Box/versioning/main/db.json" NetworkManager.shared.fetchModel(from: urlString, modelType: VersionInfo.self) { result in switch result { @@ -21,8 +21,8 @@ class VersioningHandler { completion(.urlError) return } - - self.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, storeURL: versionInfo.storeUrl, completion: completion) + + self.compareVersion(latestVersion: latestVersion, minRequiredVersion: minRequiredVersion, storeURL: versionInfo.url.storeUrl, completion: completion) case .failure(let error): print("Error: \(error.localizedDescription)") From 51014213d869e6c264e84e8ba620cfdfd9ed9e79 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 18 Apr 2024 16:26:15 +0900 Subject: [PATCH 276/370] fix: cell remove animation --- iBox/Sources/BoxList/BoxListView.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index ddf6b30..63e6d40 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -377,7 +377,7 @@ extension BoxListView: UITableViewDelegate { } func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { - let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: { [weak self] () -> UIViewController? in + let configuration = UIContextMenuConfiguration(identifier: indexPath as NSIndexPath, previewProvider: { [weak self] () -> UIViewController? in guard let self = self, let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return nil } let id = cellViewModel.id @@ -403,6 +403,17 @@ extension BoxListView: UITableViewDelegate { return configuration } + func tableView(_ tableView: UITableView, previewForDismissingContextMenuWithConfiguration configuration: UIContextMenuConfiguration) -> UITargetedPreview? { + guard let indexPath = configuration.identifier as? IndexPath, let cell = tableView.cellForRow(at: indexPath) else { + return nil + } + + let parameters = UIPreviewParameters() + parameters.backgroundColor = .clear + + return UITargetedPreview(view: cell, parameters: parameters) + } + private func makeContextMenu(for indexPath: IndexPath) -> UIMenu { let isFavorite = self.viewModel?.isFavoriteBookmark(at: indexPath) ?? false let favoriteActionTitle = isFavorite ? "즐겨찾기 해제" : "즐겨찾기로 등록" From 5873922ee73c611091439ca9acd2b6c1250bb7e0 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 18 Apr 2024 16:50:02 +0900 Subject: [PATCH 277/370] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=8B=9C=20=EC=9E=90=EB=8F=99=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AddBookmark/FolderListViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iBox/Sources/AddBookmark/FolderListViewController.swift b/iBox/Sources/AddBookmark/FolderListViewController.swift index 4c9f1c8..338b853 100644 --- a/iBox/Sources/AddBookmark/FolderListViewController.swift +++ b/iBox/Sources/AddBookmark/FolderListViewController.swift @@ -66,6 +66,10 @@ class FolderListViewController: UIViewController { let newFolder = Folder(id: UUID(), name: folderName, bookmarks: []) CoreDataManager.shared.addFolder(newFolder) self?.folderListView.folders.append(newFolder) + + self?.folderListView.selectedFolderId = newFolder.id + UserDefaultsManager.selectedFolderId = newFolder.id + self?.folderListView.reloadFolderList() self?.delegate?.addFolder(newFolder) } From 1c0ebc6e397dba984c6b97db4073c4b8061f60f4 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 18 Apr 2024 17:31:03 +0900 Subject: [PATCH 278/370] =?UTF-8?q?feat:=20=ED=99=88=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/SettingsItem.swift | 2 +- .../Settings/HomeTab/HomeTabSelectorViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Model/SettingsItem.swift b/iBox/Sources/Model/SettingsItem.swift index 4b0c992..5d82328 100644 --- a/iBox/Sources/Model/SettingsItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -19,7 +19,7 @@ enum SettingsType { func toString() -> String { switch self { case .theme: "테마" - case .homeTab: "홈화면" + case .homeTab: "시작 화면" case .haptics: "진동" case .preload: "즐겨찾기 미리 로드" case .reset: "데이터 초기화" diff --git a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift index f98defb..b22096a 100644 --- a/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift +++ b/iBox/Sources/Settings/HomeTab/HomeTabSelectorViewController.swift @@ -24,7 +24,7 @@ class HomeTabSelectorViewController: BaseViewController, Ba // MARK: - BaseViewControllerProtocol func setupNavigationBar() { - setNavigationBarTitleLabelText("홈화면 설정하기") + setNavigationBarTitleLabelText("시작 화면 설정하기") setNavigationBarTitleLabelFont(.subTitlefont) setNavigationBarBackButtonHidden(false) } From 2d852b06c2fbb766e4e288b83f7237b2b477e851 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 18 Apr 2024 17:33:12 +0900 Subject: [PATCH 279/370] =?UTF-8?q?style:=20=EC=9B=B9=EB=B7=B0=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EB=A0=88=EC=8A=A4=EB=B0=94=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 0572dc6..b8c4ca2 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -32,7 +32,7 @@ class WebView: UIView { private let progressView = UIProgressView().then { $0.progressViewStyle = .bar - $0.tintColor = .label + $0.tintColor = .box2 $0.sizeToFit() } From 0dc8a4f573e972e30fbb6d43c7d78332a2dc6ed9 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 18 Apr 2024 17:37:33 +0900 Subject: [PATCH 280/370] =?UTF-8?q?build:=20=EB=B9=8C=EB=93=9C=20=ED=83=80?= =?UTF-8?q?=EA=B2=9F=20iPhone=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Project.swift b/Project.swift index dabac2a..c0624fb 100644 --- a/Project.swift +++ b/Project.swift @@ -75,10 +75,10 @@ class iBoxFactory: ProjectFactory { func generateTarget() -> [ProjectDescription.Target] { let appTarget = Target( name: projectName, - platform: .iOS, + destinations: [.iPhone], product: .app, bundleId: bundleId, - deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), + deploymentTargets: .iOS(iosVersion), infoPlist: .extendingDefault(with: appInfoPlist), sources: ["\(projectName)/Sources/**"], resources: "\(projectName)/Resources/**", @@ -87,10 +87,10 @@ class iBoxFactory: ProjectFactory { let shareExtensionTarget = Target( name: "\(projectName)ShareExtension", - platform: .iOS, + destinations: [.iPhone], product: .appExtension, bundleId: "\(bundleId).ShareExtension", - deploymentTarget: .iOS(targetVersion: iosVersion, devices: [.iphone]), + deploymentTargets: .iOS(iosVersion), infoPlist: .extendingDefault(with: shareExtensionInfoPlist), sources: ["ShareExtension/Sources/**"], resources: ["ShareExtension/Resources/**"], From ea9908c8d4edd2b0c0d2332175abb4a003010753 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 18 Apr 2024 21:09:01 +0900 Subject: [PATCH 281/370] =?UTF-8?q?fix:=20=EC=9B=B9=20=EB=B7=B0=20?= =?UTF-8?q?=EC=95=84=EB=9E=98=20=EC=95=88=EB=B3=B4=EC=9E=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 웹뷰 제약 수정 --- iBox/Sources/Web/WebView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index b8c4ca2..2298612 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -81,11 +81,15 @@ class WebView: UIView { private func setupLayout() { webView.snp.makeConstraints { make in - make.edges.equalToSuperview() + make.top.equalTo(self.safeAreaLayoutGuide.snp.topMargin) + make.bottom.equalTo(self.safeAreaLayoutGuide.snp.bottomMargin) + make.leading.equalTo(self.safeAreaLayoutGuide.snp.leadingMargin) + make.trailing.equalTo(self.safeAreaLayoutGuide.snp.trailingMargin) } progressView.snp.makeConstraints { make in - make.top.leading.trailing.equalToSuperview() + make.top.equalTo(self.safeAreaLayoutGuide.snp.topMargin) + make.leading.trailing.equalToSuperview() } } From 982968434e650af0ea32dbe1ed1153c5fd9e93c9 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 19 Apr 2024 15:44:13 +0900 Subject: [PATCH 282/370] fix: wip --- .../View/ShareExtensionBackGroundView.swift | 2 +- iBox/Sources/Extension/UIView+Extension.swift | 10 +++ .../UIViewController+Extension.swift | 1 + iBox/Sources/Favorite/FavoriteView.swift | 19 +++--- .../Favorite/FavoriteViewController.swift | 33 ++++++++++ iBox/Sources/Web/ErrorPageView.swift | 61 +++++++++++++++++++ .../Sources/Web/ErrorPageViewController.swift | 34 +++++++++++ iBox/Sources/Web/WebView.swift | 1 + iBox/Sources/Web/WebViewController.swift | 2 +- 9 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 iBox/Sources/Web/ErrorPageView.swift create mode 100644 iBox/Sources/Web/ErrorPageViewController.swift diff --git a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift index 8fd1643..ae57b3c 100644 --- a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift @@ -67,7 +67,7 @@ class ShareExtensionBackGroundView: UIView { let button = UIButton(type: .system) button.setImage(UIImage(systemName: "arrow.up.forward.square"), for: .normal) button.setTitle("앱으로 담아가기", for: .normal) - button.setTitleColor(.black, for: .normal) + button.setTitleColor(.label, for: .normal) button.setBackgroundColor(.clear, for: .normal) button.setTitle("앱이 실행됩니다", for: .highlighted) diff --git a/iBox/Sources/Extension/UIView+Extension.swift b/iBox/Sources/Extension/UIView+Extension.swift index 77e401b..890082d 100644 --- a/iBox/Sources/Extension/UIView+Extension.swift +++ b/iBox/Sources/Extension/UIView+Extension.swift @@ -30,4 +30,14 @@ extension UIView { } } + // MARK: - 뷰 계층 구조 log + func printViewHierarchy(level: Int = 0) { + let padding = String(repeating: " ", count: level * 2) + let viewInfo = "\(padding)\(type(of: self)) - Frame: \(self.frame)" + print(viewInfo) + + for subview in self.subviews { + subview.printViewHierarchy(level: level + 1) + } + } } diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift index 51b6343..6e7a9f5 100644 --- a/iBox/Sources/Extension/UIViewController+Extension.swift +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -26,4 +26,5 @@ extension UIViewController { } return false } + } diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 0963419..0fdaf5e 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -6,18 +6,18 @@ // import UIKit -import WebKit - import SnapKit class FavoriteView: UIView { - lazy var webView = { - if WebViewPreloader.shared.getFavoriteView() == nil { + var webView: WebView { + if let view = WebViewPreloader.shared.getFavoriteView() { + return view + } else { loadFavoriteWeb() + return WebViewPreloader.shared.getFavoriteView()! } - return WebViewPreloader.shared.getFavoriteView() - }() + } // MARK: - Initializer @@ -34,7 +34,7 @@ class FavoriteView: UIView { override func layoutSubviews() { super.layoutSubviews() - webView?.setupRefreshControl() + webView.setupRefreshControl() } // MARK: - Setup Methods @@ -44,12 +44,10 @@ class FavoriteView: UIView { } private func setupHierarchy() { - guard let webView else { return } addSubview(webView) } private func setupLayout() { - guard let webView else { return } webView.snp.makeConstraints { make in make.edges.equalToSuperview() } @@ -58,7 +56,7 @@ class FavoriteView: UIView { private func loadFavoriteWeb() { let favoriteId = UserDefaultsManager.favoriteId var favoriteUrl: URL? = nil - if let favoriteId { + if let favoriteId = favoriteId { favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) if favoriteUrl == nil { UserDefaultsManager.favoriteId = nil @@ -66,5 +64,4 @@ class FavoriteView: UIView { } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } - } diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 7d2e018..1c897be 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -8,12 +8,31 @@ import UIKit class FavoriteViewController: BaseViewController, BaseViewControllerProtocol { + + var selectedWebsite: URL? // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() + setupNavigationBar() + view.backgroundColor = .backgroundColor + + // contentView가 FavoriteView 인스턴스인 경우, WebView의 delegate 설정 + if let favoriteView = self.view as? FavoriteView { + // WebViewPreloader를 통해 가져온 WebView의 delegate를 이 ViewController로 설정 + let webView = favoriteView.webView + webView.delegate = self + webView.selectedWebsite = selectedWebsite // 웹 사이트 설정 + } + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if let favoriteView = self.view as? FavoriteView { + favoriteView.webView.setupRefreshControl() + } } // MARK: - BaseViewControllerProtocol @@ -23,3 +42,17 @@ class FavoriteViewController: BaseViewController, BaseViewControll } } + +extension FavoriteViewController: WebViewDelegate { + + func pushAddBookMarkViewController(url: URL) { + let encodingURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" + + if let iBoxUrl = URL(string: "iBox://url?data=" + encodingURL) { + if let tabBarController = findMainTabBarController() { + AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) + } + } + } + +} diff --git a/iBox/Sources/Web/ErrorPageView.swift b/iBox/Sources/Web/ErrorPageView.swift new file mode 100644 index 0000000..ef395ac --- /dev/null +++ b/iBox/Sources/Web/ErrorPageView.swift @@ -0,0 +1,61 @@ +// +// ErrorPageView.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit + +import SnapKit + +class ErrorPageView: UIView { + + let messageLabel = UILabel() + let retryButton = UIButton() + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupViews() { + backgroundColor = .red + + messageLabel.textAlignment = .center + messageLabel.numberOfLines = 0 + + retryButton.setTitle("Retry", for: .normal) + retryButton.backgroundColor = .systemBlue + retryButton.setTitleColor(.white, for: .normal) + retryButton.layer.cornerRadius = 10 + + addSubview(messageLabel) + addSubview(retryButton) + } + + private func setupLayout() { + messageLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.leading.greaterThanOrEqualToSuperview().offset(20) + make.trailing.lessThanOrEqualToSuperview().offset(-20) + } + + retryButton.snp.makeConstraints { make in + make.top.equalTo(messageLabel.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(100) + make.height.equalTo(44) + } + } + + func configure(with error: Error, url: URL) { + messageLabel.text = "Failed to load \(url.absoluteString): \(error.localizedDescription)" + } +} diff --git a/iBox/Sources/Web/ErrorPageViewController.swift b/iBox/Sources/Web/ErrorPageViewController.swift new file mode 100644 index 0000000..bea7ac1 --- /dev/null +++ b/iBox/Sources/Web/ErrorPageViewController.swift @@ -0,0 +1,34 @@ +// +// ErrorPageViewController.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit + +class ErrorPageViewController: UIViewController { + + override func loadView() { + self.view = ErrorPageView() + } + + override func viewDidLoad() { + super.viewDidLoad() + if let errorPageView = view as? ErrorPageView { + errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) + } + } + + func configureWithError(_ error: Error, url: URL) { + if let errorPageView = view as? ErrorPageView { + errorPageView.configure(with: error, url: url) + } + } + + @objc private func retryButtonTapped() { + dismiss(animated: true, completion: { + // 재시도 로직 구현 + }) + } +} diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 0572dc6..58f9033 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -173,6 +173,7 @@ extension WebView: WKNavigationDelegate { } + extension WebView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 4c09737..5da41a1 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -27,6 +27,7 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol guard let contentView = contentView as? WebView else { return } contentView.delegate = self contentView.selectedWebsite = selectedWebsite + } override func viewDidLayoutSubviews() { @@ -53,7 +54,6 @@ extension WebViewController: WebViewDelegate { AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) } } - } } From 7d8ea17ff08de194e0bbef5e64179bdef347841e Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 21 Apr 2024 16:33:22 +0900 Subject: [PATCH 283/370] build: add SkeletonView library --- Project.swift | 1 + Tuist/Dependencies.swift | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Project.swift b/Project.swift index dabac2a..4fa1bf0 100644 --- a/Project.swift +++ b/Project.swift @@ -19,6 +19,7 @@ class iBoxFactory: ProjectFactory { let dependencies: [TargetDependency] = [ .external(name: "SnapKit"), .external(name: "SwiftSoup"), + .external(name: "SkeletonView"), .target(name: "iBoxShareExtension") ] diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index 98b323e..0e66bfc 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -10,7 +10,8 @@ import ProjectDescription let spm = SwiftPackageManagerDependencies([ .remote(url: "https://github.com/SnapKit/SnapKit.git", requirement: .upToNextMinor(from: "5.0.1")), .remote(url: "https://github.com/scinfu/SwiftSoup.git", requirement: .upToNextMajor(from: "2.7.1")), -], productTypes: ["SnapKit": .framework, "SwiftSoup": .framework] + .remote(url: "https://github.com/Juanpe/SkeletonView.git", requirement: .upToNextMajor(from: "1.0.0")) +], productTypes: ["SnapKit": .framework, "SwiftSoup": .framework, "SkeletonView": .framework] ) let dependencies = Dependencies( From 925af31a7cb6fd13cfbc98195aa54d7177e1ec5d Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 21 Apr 2024 16:50:34 +0900 Subject: [PATCH 284/370] feat: skeleton ui --- iBox/Sources/AddBookmark/AddBookmarkView.swift | 10 ++++++++++ .../AddBookmark/AddBookmarkViewController.swift | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index 085283a..50b2873 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import SkeletonView import SnapKit class AddBookmarkView: UIView { @@ -46,6 +47,9 @@ class AddBookmarkView: UIView { $0.isScrollEnabled = true $0.keyboardType = .default $0.autocorrectionType = .no + $0.isSkeletonable = true + $0.skeletonTextLineHeight = .fixed(20) + $0.skeletonPaddingInsets = .init(top: 5, left: 0, bottom: 5, right: 0) } private let clearButton = UIButton().then { @@ -73,6 +77,10 @@ class AddBookmarkView: UIView { $0.isScrollEnabled = true $0.keyboardType = .URL $0.autocorrectionType = .no + $0.isSkeletonable = true + $0.skeletonTextLineHeight = .fixed(20) + $0.skeletonTextNumberOfLines = 2 + $0.skeletonPaddingInsets = .init(top: 5, left: 0, bottom: 5, right: 0) } private let button = UIButton(type: .custom).then { @@ -130,6 +138,8 @@ class AddBookmarkView: UIView { button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) nameTextView.delegate = self urlTextView.delegate = self + + isSkeletonable = true } private func setupHierarchy() { diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index 363850a..09588d6 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -7,6 +7,8 @@ import UIKit +import SkeletonView + protocol AddBookmarkViewControllerProtocol: AnyObject { func addFolderDirect(_ folder: Folder) func addBookmarkDirect(_ bookmark: Bookmark, at folderIndex: Int) @@ -31,6 +33,8 @@ final class AddBookmarkViewController: UIViewController { super.viewWillAppear(animated) updateSelectedFolder() addBookmarkView.updateTextFieldsFilledState() + +// view.showAnimatedGradientSkeleton() } override func viewDidLoad() { @@ -38,6 +42,8 @@ final class AddBookmarkViewController: UIViewController { setupNavigationBar() updateSelectedFolder() addBookmarkView.nameTextView.becomeFirstResponder() + + view.isSkeletonable = true } private func setupNavigationBar() { From 32a0a5f3d6021d0b17e25aa7a840e1db5b3e7eac Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:35:18 +0900 Subject: [PATCH 285/370] feat: set delegate simply --- iBox/Sources/Favorite/FavoriteView.swift | 19 ++++++++------- .../Favorite/FavoriteViewController.swift | 24 +++++++------------ 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 0fdaf5e..0963419 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -6,18 +6,18 @@ // import UIKit +import WebKit + import SnapKit class FavoriteView: UIView { - var webView: WebView { - if let view = WebViewPreloader.shared.getFavoriteView() { - return view - } else { + lazy var webView = { + if WebViewPreloader.shared.getFavoriteView() == nil { loadFavoriteWeb() - return WebViewPreloader.shared.getFavoriteView()! } - } + return WebViewPreloader.shared.getFavoriteView() + }() // MARK: - Initializer @@ -34,7 +34,7 @@ class FavoriteView: UIView { override func layoutSubviews() { super.layoutSubviews() - webView.setupRefreshControl() + webView?.setupRefreshControl() } // MARK: - Setup Methods @@ -44,10 +44,12 @@ class FavoriteView: UIView { } private func setupHierarchy() { + guard let webView else { return } addSubview(webView) } private func setupLayout() { + guard let webView else { return } webView.snp.makeConstraints { make in make.edges.equalToSuperview() } @@ -56,7 +58,7 @@ class FavoriteView: UIView { private func loadFavoriteWeb() { let favoriteId = UserDefaultsManager.favoriteId var favoriteUrl: URL? = nil - if let favoriteId = favoriteId { + if let favoriteId { favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) if favoriteUrl == nil { UserDefaultsManager.favoriteId = nil @@ -64,4 +66,5 @@ class FavoriteView: UIView { } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } + } diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 1c897be..41ce1e8 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -8,31 +8,23 @@ import UIKit class FavoriteViewController: BaseViewController, BaseViewControllerProtocol { - - var selectedWebsite: URL? + var delegate: AddBookmarkViewControllerProtocol? + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setupNavigationBar() - view.backgroundColor = .backgroundColor - - // contentView가 FavoriteView 인스턴스인 경우, WebView의 delegate 설정 - if let favoriteView = self.view as? FavoriteView { - // WebViewPreloader를 통해 가져온 WebView의 delegate를 이 ViewController로 설정 - let webView = favoriteView.webView - webView.delegate = self - webView.selectedWebsite = selectedWebsite // 웹 사이트 설정 - } + + guard let contentView = contentView as? FavoriteView else { return } + contentView.webView?.delegate = self } - + override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - if let favoriteView = self.view as? FavoriteView { - favoriteView.webView.setupRefreshControl() - } + guard let contentView = contentView as? FavoriteView else { return } + contentView.webView?.setupRefreshControl() } // MARK: - BaseViewControllerProtocol From 8e8f2cd7a189a63d28372ad57a953df120158cc3 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:37:12 +0900 Subject: [PATCH 286/370] chore: style --- iBox/Sources/Web/WebView.swift | 1 - iBox/Sources/Web/WebViewController.swift | 1 - 2 files changed, 2 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 58f9033..0572dc6 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -173,7 +173,6 @@ extension WebView: WKNavigationDelegate { } - extension WebView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 5da41a1..86a6831 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -27,7 +27,6 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol guard let contentView = contentView as? WebView else { return } contentView.delegate = self contentView.selectedWebsite = selectedWebsite - } override func viewDidLayoutSubviews() { From 59abcab6729f097632da907818eb3f4cb1d75158 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:40:18 +0900 Subject: [PATCH 287/370] chore: delete files --- iBox/Sources/Web/ErrorPageView.swift | 61 ------------------- .../Sources/Web/ErrorPageViewController.swift | 34 ----------- 2 files changed, 95 deletions(-) delete mode 100644 iBox/Sources/Web/ErrorPageView.swift delete mode 100644 iBox/Sources/Web/ErrorPageViewController.swift diff --git a/iBox/Sources/Web/ErrorPageView.swift b/iBox/Sources/Web/ErrorPageView.swift deleted file mode 100644 index ef395ac..0000000 --- a/iBox/Sources/Web/ErrorPageView.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// ErrorPageView.swift -// iBox -// -// Created by Chan on 4/18/24. -// - -import UIKit - -import SnapKit - -class ErrorPageView: UIView { - - let messageLabel = UILabel() - let retryButton = UIButton() - - override init(frame: CGRect) { - super.init(frame: frame) - setupViews() - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setupViews() { - backgroundColor = .red - - messageLabel.textAlignment = .center - messageLabel.numberOfLines = 0 - - retryButton.setTitle("Retry", for: .normal) - retryButton.backgroundColor = .systemBlue - retryButton.setTitleColor(.white, for: .normal) - retryButton.layer.cornerRadius = 10 - - addSubview(messageLabel) - addSubview(retryButton) - } - - private func setupLayout() { - messageLabel.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.centerY.equalToSuperview() - make.leading.greaterThanOrEqualToSuperview().offset(20) - make.trailing.lessThanOrEqualToSuperview().offset(-20) - } - - retryButton.snp.makeConstraints { make in - make.top.equalTo(messageLabel.snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(100) - make.height.equalTo(44) - } - } - - func configure(with error: Error, url: URL) { - messageLabel.text = "Failed to load \(url.absoluteString): \(error.localizedDescription)" - } -} diff --git a/iBox/Sources/Web/ErrorPageViewController.swift b/iBox/Sources/Web/ErrorPageViewController.swift deleted file mode 100644 index bea7ac1..0000000 --- a/iBox/Sources/Web/ErrorPageViewController.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// ErrorPageViewController.swift -// iBox -// -// Created by Chan on 4/18/24. -// - -import UIKit - -class ErrorPageViewController: UIViewController { - - override func loadView() { - self.view = ErrorPageView() - } - - override func viewDidLoad() { - super.viewDidLoad() - if let errorPageView = view as? ErrorPageView { - errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) - } - } - - func configureWithError(_ error: Error, url: URL) { - if let errorPageView = view as? ErrorPageView { - errorPageView.configure(with: error, url: url) - } - } - - @objc private func retryButtonTapped() { - dismiss(animated: true, completion: { - // 재시도 로직 구현 - }) - } -} From 5b58dbe7fdadd96e1a31224027841342980cf4e2 Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 21 Apr 2024 21:32:08 +0900 Subject: [PATCH 288/370] =?UTF-8?q?feat:=20loading=20=EC=A4=91=20skeletonv?= =?UTF-8?q?iew=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/AddBookmark/AddBookmarkView.swift | 6 ++++ .../AddBookmarkViewController.swift | 30 +++++++++++++++++-- iBox/Sources/Model/BookmarkError.swift | 14 +++++++++ iBox/Sources/Shared/AddBookmarkManager.swift | 22 +++++++++----- 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 iBox/Sources/Model/BookmarkError.swift diff --git a/iBox/Sources/AddBookmark/AddBookmarkView.swift b/iBox/Sources/AddBookmark/AddBookmarkView.swift index 50b2873..e8d7d99 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkView.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkView.swift @@ -36,6 +36,8 @@ class AddBookmarkView: UIView { $0.text = "북마크 이름" $0.font = .cellTitleFont $0.textColor = .systemGray3 + $0.isSkeletonable = true + $0.isHiddenWhenSkeletonIsActive = true } let nameTextView = UITextView().then { @@ -66,6 +68,8 @@ class AddBookmarkView: UIView { $0.text = "URL" $0.font = .cellTitleFont $0.textColor = .systemGray3 + $0.isSkeletonable = true + $0.isHiddenWhenSkeletonIsActive = true } let urlTextView = UITextView().then { @@ -128,6 +132,8 @@ class AddBookmarkView: UIView { deinit { AddBookmarkManager.shared.incomingTitle = nil AddBookmarkManager.shared.incomingData = nil + AddBookmarkManager.shared.incomingFaviconUrl = nil + AddBookmarkManager.shared.incomingError = nil } // MARK: - Setup Methods diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index 09588d6..ec81c88 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -5,6 +5,7 @@ // Created by jiyeon on 1/5/24. // +import Combine import UIKit import SkeletonView @@ -17,6 +18,8 @@ protocol AddBookmarkViewControllerProtocol: AnyObject { final class AddBookmarkViewController: UIViewController { weak var delegate: AddBookmarkViewControllerProtocol? + var cancellables = Set() + var haveValidInput = false var selectedFolder: Folder? var selectedFolderIndex: Int? @@ -33,8 +36,6 @@ final class AddBookmarkViewController: UIViewController { super.viewWillAppear(animated) updateSelectedFolder() addBookmarkView.updateTextFieldsFilledState() - -// view.showAnimatedGradientSkeleton() } override func viewDidLoad() { @@ -42,6 +43,7 @@ final class AddBookmarkViewController: UIViewController { setupNavigationBar() updateSelectedFolder() addBookmarkView.nameTextView.becomeFirstResponder() + setupBindings() view.isSkeletonable = true } @@ -111,6 +113,30 @@ final class AddBookmarkViewController: UIViewController { } } + private func setupBindings() { + AddBookmarkManager.shared.$isFetching + .receive(on: DispatchQueue.main) + .sink { [weak self] isFetching in + if isFetching { + self?.view.showAnimatedGradientSkeleton() + } else { + self?.view.hideSkeleton() + } + } + .store(in: &cancellables) + + AddBookmarkManager.shared.$incomingError + .receive(on: DispatchQueue.main) + .sink { [weak self] error in + guard error != nil else { return } + let alert = UIAlertController(title: "오류", message: "해당 URL을 가져올 수 없습니다", preferredStyle: .alert) + let okAction = UIAlertAction(title: "확인", style: .default) + alert.addAction(okAction) + self?.present(alert, animated: true) + } + .store(in: &cancellables) + } + @objc private func cancelButtonTapped() { let isTextFieldsEmpty = addBookmarkView.nameTextView.text?.isEmpty ?? true && addBookmarkView.urlTextView.text?.isEmpty ?? true diff --git a/iBox/Sources/Model/BookmarkError.swift b/iBox/Sources/Model/BookmarkError.swift new file mode 100644 index 0000000..0128173 --- /dev/null +++ b/iBox/Sources/Model/BookmarkError.swift @@ -0,0 +1,14 @@ +// +// BookmarkError.swift +// iBox +// +// Created by 이지현 on 4/21/24. +// + +import Foundation + +enum BookmarkError { + case htmlError + case decodeError + case parseError +} diff --git a/iBox/Sources/Shared/AddBookmarkManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift index 1b0962d..7015639 100644 --- a/iBox/Sources/Shared/AddBookmarkManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -12,14 +12,17 @@ import SwiftSoup class AddBookmarkManager { static let shared = AddBookmarkManager() + @Published var isFetching: Bool = false @Published var incomingTitle: String? @Published var incomingData: String? @Published var incomingFaviconUrl: String? + @Published var incomingError: BookmarkError? private init() {} private func update(with data: (title: String?, data: String?, faviconUrl: String?)) { DispatchQueue.main.async { + self.isFetching = false self.incomingTitle = data.title?.removingPercentEncoding self.incomingData = data.data?.removingPercentEncoding self.incomingFaviconUrl = data.faviconUrl?.removingPercentEncoding @@ -33,9 +36,9 @@ class AddBookmarkManager { let faviconLink = try doc.select("link[rel='icon']").first()?.attr("href") self.update(with: (title: title, data: url.absoluteString, faviconUrl: faviconLink)) - } catch { - print("Error parsing HTML: \(error)") + self.isFetching = false + self.incomingError = .parseError } } @@ -53,7 +56,8 @@ class AddBookmarkManager { private func fetchWebsiteDetails(from url: URL) { let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let data = data, error == nil else { - print("Error downloading HTML: \(String(describing: error))") + self?.isFetching = false + self?.incomingError = .htmlError return } @@ -61,7 +65,8 @@ class AddBookmarkManager { let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) guard let html = String(data: data, encoding: encoding) else { - print("Failed to decode data with encoding: \(encodingName)") + self?.isFetching = false + self?.incomingError = .decodeError return } @@ -72,11 +77,12 @@ class AddBookmarkManager { func navigateToAddBookmarkView(from url: URL, in tabBarController: UITabBarController) { guard url.scheme == "iBox", let urlString = extractDataParameter(from: url) else { return } - guard let url = URL(string: urlString) else { - print("Invalid URL \(urlString)") - return - } + guard let url = URL(string: urlString) else { return } + incomingTitle = nil + incomingData = nil + incomingFaviconUrl = nil + isFetching = true fetchWebsiteDetails(from: url) tabBarController.selectedIndex = 0 From 4b90a42e52b958d580e4f87bb5d6961118d7f16c Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 21 Apr 2024 22:13:53 +0900 Subject: [PATCH 289/370] =?UTF-8?q?feat:=20fetch=20error=20=EC=8B=9C=20ske?= =?UTF-8?q?letonView=20=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AddBookmark/AddBookmarkViewController.swift | 5 ++++- iBox/Sources/BoxList/BoxListViewController.swift | 8 +++++++- iBox/Sources/Extension/UIViewController+Extension.swift | 8 ++++---- iBox/Sources/Shared/AddBookmarkManager.swift | 3 --- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index ec81c88..671572a 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -118,6 +118,7 @@ final class AddBookmarkViewController: UIViewController { .receive(on: DispatchQueue.main) .sink { [weak self] isFetching in if isFetching { + self?.view.hideSkeleton() self?.view.showAnimatedGradientSkeleton() } else { self?.view.hideSkeleton() @@ -130,7 +131,9 @@ final class AddBookmarkViewController: UIViewController { .sink { [weak self] error in guard error != nil else { return } let alert = UIAlertController(title: "오류", message: "해당 URL을 가져올 수 없습니다", preferredStyle: .alert) - let okAction = UIAlertAction(title: "확인", style: .default) + let okAction = UIAlertAction(title: "확인", style: .default) { _ in + AddBookmarkManager.shared.isFetching = false + } alert.addAction(okAction) self?.present(alert, animated: true) } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 5acb884..a0665f8 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -7,12 +7,18 @@ import UIKit +import SkeletonView + class BoxListViewController: BaseViewController, BaseViewControllerProtocol { var shouldPresentModalAutomatically: Bool = false { didSet { if shouldPresentModalAutomatically { - if findAddBookmarkViewController() == false { + if let vc = findAddBookmarkViewController() { + if let currentAlert = vc.presentedViewController as? UIAlertController { + vc.dismiss(animated: true) + } + } else { dismiss(animated: false) self.addButtonTapped() } diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift index 51b6343..ff81455 100644 --- a/iBox/Sources/Extension/UIViewController+Extension.swift +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -19,11 +19,11 @@ extension UIViewController { return nil } - func findAddBookmarkViewController() -> Bool { + func findAddBookmarkViewController() -> AddBookmarkViewController? { if let navigationController = presentedViewController as? UINavigationController, - let _ = navigationController.topViewController as? AddBookmarkViewController { - return true + let vc = navigationController.topViewController as? AddBookmarkViewController { + return vc } - return false + return nil } } diff --git a/iBox/Sources/Shared/AddBookmarkManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift index 7015639..e1f8096 100644 --- a/iBox/Sources/Shared/AddBookmarkManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -37,7 +37,6 @@ class AddBookmarkManager { self.update(with: (title: title, data: url.absoluteString, faviconUrl: faviconLink)) } catch { - self.isFetching = false self.incomingError = .parseError } } @@ -56,7 +55,6 @@ class AddBookmarkManager { private func fetchWebsiteDetails(from url: URL) { let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let data = data, error == nil else { - self?.isFetching = false self?.incomingError = .htmlError return } @@ -65,7 +63,6 @@ class AddBookmarkManager { let encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))) guard let html = String(data: data, encoding: encoding) else { - self?.isFetching = false self?.incomingError = .decodeError return } From 1a2798b616937a95afed9f213e15b8a7749e5c42 Mon Sep 17 00:00:00 2001 From: JH713 Date: Sun, 21 Apr 2024 22:14:34 +0900 Subject: [PATCH 290/370] =?UTF-8?q?chore:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index a0665f8..87ba714 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -15,8 +15,8 @@ class BoxListViewController: BaseViewController, BaseViewController didSet { if shouldPresentModalAutomatically { if let vc = findAddBookmarkViewController() { - if let currentAlert = vc.presentedViewController as? UIAlertController { - vc.dismiss(animated: true) + if vc.presentedViewController is UIAlertController { + vc.dismiss(animated: false) } } else { dismiss(animated: false) From 005e6742804f44ba51fb654f4f364a1d394c5765 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 23:41:04 +0900 Subject: [PATCH 291/370] feat: errorpage view --- iBox/Sources/Error/ErrorPageView.swift | 111 +++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 iBox/Sources/Error/ErrorPageView.swift diff --git a/iBox/Sources/Error/ErrorPageView.swift b/iBox/Sources/Error/ErrorPageView.swift new file mode 100644 index 0000000..bfa39bd --- /dev/null +++ b/iBox/Sources/Error/ErrorPageView.swift @@ -0,0 +1,111 @@ +// +// ErrorPageView.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit + +import SnapKit + +class ErrorPageView: UIView { + private var imageViews: [UIImageView] = [] + private let images = ["fox_page0", "fox_page1", "fox_page2", "fox_page3", "fox_page4"] + private var timer: Timer? + + let messageLabel = UILabel() + + let backButton = UIButton() + let retryButton = UIButton() + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + setupLayout() + changeImages() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupViews() { + backgroundColor = .clear + + messageLabel.textAlignment = .center + messageLabel.numberOfLines = 0 + + retryButton.setTitle("무시하기", for: .normal) + retryButton.backgroundColor = .systemBlue + retryButton.setTitleColor(.white, for: .normal) + retryButton.layer.cornerRadius = 10 + + addSubview(messageLabel) + addSubview(retryButton) + + for imageName in images { + let imageView = UIImageView(image: UIImage(named: imageName)) + imageView.contentMode = .scaleAspectFit + imageView.isHidden = true + imageView.tintColor = .box2 + addSubview(imageView) + imageViews.append(imageView) + } + + changeImages() + + } + + private func setupLayout() { + + imageViews.forEach { imageView in + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.leading.greaterThanOrEqualToSuperview().offset(20) + make.trailing.lessThanOrEqualToSuperview().offset(-20) + make.width.height.equalTo(32) + } + } + + messageLabel.snp.makeConstraints { make in + make.top.equalTo(imageViews[0].snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.leading.greaterThanOrEqualToSuperview().offset(20) + make.trailing.lessThanOrEqualToSuperview().offset(-20) + } + + retryButton.snp.makeConstraints { make in + make.top.equalTo(messageLabel.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(100) + make.height.equalTo(44) + } + } + + func configure(with error: Error, url: String) { + messageLabel.text = "\(url): \n해당 주소를 불러오는데 실패했어요!" + print(error.localizedDescription) + } + + private func changeImages() { + var currentIndex = 0 + + timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] timer in + guard let self = self else { return } + + let state = AppStateManager.shared.isVersionCheckCompleted + if state == .success || state == .later || state == .maxRetryReached { + timer.invalidate() + self.timer = nil + return + } + + self.imageViews.forEach { $0.isHidden = true } + self.imageViews[currentIndex].isHidden = false + + currentIndex = (currentIndex + 1) % self.imageViews.count + } + } +} From da28d907b9e17841ecef1aba547cda27886dc31a Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 23:41:16 +0900 Subject: [PATCH 292/370] feat: errorpage view controller --- .../Error/ErrorPageViewController.swift | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 iBox/Sources/Error/ErrorPageViewController.swift diff --git a/iBox/Sources/Error/ErrorPageViewController.swift b/iBox/Sources/Error/ErrorPageViewController.swift new file mode 100644 index 0000000..04837c5 --- /dev/null +++ b/iBox/Sources/Error/ErrorPageViewController.swift @@ -0,0 +1,67 @@ +// +// ErrorPageViewController.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit +import WebKit + +protocol ErrorPageControllerDelegate: AnyObject { + func presentErrorPage(_ errorPage: ErrorPageViewController) +} + +protocol WebViewErrorDelegate { + func webView(_ webView: WebView, didFailWithError error: Error, url: URL?) +} + +class ErrorPageViewController: UIViewController { + weak var delegate: ErrorPageControllerDelegate? + var webView: WebView? + + init(webView: WebView) { + super.init(nibName: nil, bundle: nil) + self.webView = webView + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + self.view = ErrorPageView() + } + + override func viewDidLoad() { + super.viewDidLoad() + if let errorPageView = view as? ErrorPageView { + errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) + } + } + + func configureWithError(_ error: Error, url: String) { + if let errorPageView = view as? ErrorPageView { + errorPageView.configure(with: error, url: url) + } + } + + @objc private func retryButtonTapped() { + webView?.retryLoading() + dismiss(animated: true) + } + + func handleError(_ error: Error, _ url: URL?) { + self.modalPresentationStyle = .overFullScreen + self.configureWithError(error, url: url?.absoluteString ?? "") + delegate?.presentErrorPage(self) + } +} + +extension ErrorPageViewController: WebViewErrorDelegate { + + func webView(_ webView: WebView, didFailWithError error: Error, url: URL?) { + handleError(error, url) + } + +} From 2dcc893ca642ae5d2c453ad6d67162323c961195 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 23:42:53 +0900 Subject: [PATCH 293/370] feat: separate responsibilities error delegate --- iBox/Sources/Web/WebView.swift | 26 +++++++++++++++++++- iBox/Sources/Web/WebViewController.swift | 30 ++++++++++++++++++------ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 0572dc6..13d48ae 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -13,6 +13,8 @@ import SnapKit class WebView: UIView { var delegate: WebViewDelegate? + var errorDelegate: WebViewErrorDelegate? + var lastRequestedURL: URL? private var progressObserver: NSKeyValueObservation? @@ -26,7 +28,7 @@ class WebView: UIView { private var isActive = false // MARK: - UI Components - + private let webView:WKWebView @@ -164,6 +166,10 @@ extension WebView: WKNavigationDelegate { } func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + + // 마지막으로 시도한 navigation url + lastRequestedURL = navigationAction.request.url + // "새 창으로 열기" 링크 WebView 내에서 열기 if navigationAction.targetFrame == nil { webView.load(navigationAction.request) @@ -171,6 +177,24 @@ extension WebView: WKNavigationDelegate { decisionHandler(.allow) } + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + // 초기 로드시 에러 발생 + errorDelegate?.webView(self, didFailWithError: error, url: selectedWebsite) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + // 네비게이션 중 에러 발생 시 + if let lastURL = lastRequestedURL { + errorDelegate?.webView(self, didFailWithError: error, url: lastURL) + } else { + // lastRequestedURL이 nil인 경우 대비 + errorDelegate?.webView(self, didFailWithError: error, url: nil) + } + } + + func retryLoading() { + webView.reload() + } } extension WebView: UIScrollViewDelegate { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 4c09737..c67e266 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -6,6 +6,7 @@ // import UIKit +import WebKit protocol WebViewDelegate { func pushAddBookMarkViewController(url: URL) @@ -13,6 +14,7 @@ protocol WebViewDelegate { class WebViewController: BaseViewController, BaseViewControllerProtocol { + var errorViewController: ErrorPageViewController? var delegate: AddBookmarkViewControllerProtocol? var selectedWebsite: URL? @@ -22,11 +24,8 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol super.viewDidLoad() setupNavigationBar() - view.backgroundColor = .backgroundColor - - guard let contentView = contentView as? WebView else { return } - contentView.delegate = self - contentView.selectedWebsite = selectedWebsite + setupView() + setupDelegate() } override func viewDidLayoutSubviews() { @@ -40,7 +39,20 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol func setupNavigationBar() { setNavigationBarHidden(true) } + + func setupDelegate() { + guard let contentView = contentView as? WebView else { return } + contentView.delegate = self + contentView.selectedWebsite = selectedWebsite + errorViewController = ErrorPageViewController(webView: contentView) + contentView.errorDelegate = errorViewController + errorViewController?.delegate = self + } + + func setupView() { + view.backgroundColor = .backgroundColor + } } extension WebViewController: WebViewDelegate { @@ -53,7 +65,11 @@ extension WebViewController: WebViewDelegate { AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) } } - } - +} + +extension WebViewController: ErrorPageControllerDelegate { + func presentErrorPage(_ errorPage: ErrorPageViewController) { + self.present(errorPage, animated: true, completion: nil) + } } From 4c47c0fa0971b12edb194c03b3965b84e1a7eff6 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 22 Apr 2024 15:44:48 +0900 Subject: [PATCH 294/370] =?UTF-8?q?feat:=20=EC=84=A4=EC=A0=95=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Model/SettingsItem.swift | 2 - iBox/Sources/Settings/Guide/GuideView.swift | 68 +++++++++++++++++++ .../Settings/Guide/GuideViewController.swift | 30 ++++++++ .../Settings/SettingsViewController.swift | 4 +- iBox/Sources/Settings/SettingsViewModel.swift | 3 +- iBox/Sources/Web/WebView.swift | 2 +- 6 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 iBox/Sources/Settings/Guide/GuideView.swift create mode 100644 iBox/Sources/Settings/Guide/GuideViewController.swift diff --git a/iBox/Sources/Model/SettingsItem.swift b/iBox/Sources/Model/SettingsItem.swift index 5d82328..ed8d507 100644 --- a/iBox/Sources/Model/SettingsItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -14,7 +14,6 @@ enum SettingsType { case preload case reset case guide - case feedback func toString() -> String { switch self { @@ -24,7 +23,6 @@ enum SettingsType { case .preload: "즐겨찾기 미리 로드" case .reset: "데이터 초기화" case .guide: "앱 소개" - case .feedback: "앱 피드백" } } diff --git a/iBox/Sources/Settings/Guide/GuideView.swift b/iBox/Sources/Settings/Guide/GuideView.swift new file mode 100644 index 0000000..7162049 --- /dev/null +++ b/iBox/Sources/Settings/Guide/GuideView.swift @@ -0,0 +1,68 @@ +// +// GuideView.swift +// iBox +// +// Created by jiyeon on 4/22/24. +// + +import UIKit +import WebKit + +import SnapKit + +class GuideView: UIView { + + var guideUrl: URL? { + didSet { + loadWebsite() + } + } + + // MARK: - UI Components + + private let webView: WKWebView + + // MARK: - Initializer + + override init(frame: CGRect) { + let config = WKWebViewConfiguration() + config.allowsInlineMediaPlayback = true + + webView = WKWebView(frame: .zero, configuration: config) + super.init(frame: frame) + + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + webView.stopLoading() + webView.isOpaque = false + } + + // MARK: - Setup Methods + + private func setupHierarchy() { + addSubview(webView) + } + + private func setupLayout() { + webView.snp.makeConstraints { make in + make.top.equalTo(self.safeAreaLayoutGuide.snp.topMargin) + make.bottom.equalTo(self.safeAreaLayoutGuide.snp.bottomMargin) + make.leading.equalTo(self.safeAreaLayoutGuide.snp.leadingMargin) + make.trailing.equalTo(self.safeAreaLayoutGuide.snp.trailingMargin) + } + } + + private func loadWebsite() { + guard let url = guideUrl else { return } + webView.load(URLRequest(url: url)) + webView.allowsBackForwardNavigationGestures = true + } + +} diff --git a/iBox/Sources/Settings/Guide/GuideViewController.swift b/iBox/Sources/Settings/Guide/GuideViewController.swift new file mode 100644 index 0000000..2f0c8df --- /dev/null +++ b/iBox/Sources/Settings/Guide/GuideViewController.swift @@ -0,0 +1,30 @@ +// +// GuideViewController.swift +// iBox +// +// Created by jiyeon on 4/22/24. +// + +import UIKit + +class GuideViewController: BaseViewController, BaseViewControllerProtocol { + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupNavigationBar() + + guard let contentView = contentView as? GuideView else { return } + contentView.guideUrl = URL(string: "https://github.com/42Box/iOS") + } + + // MARK: - BaseViewControllerProtocol + + func setupNavigationBar() { + setNavigationBarTitleLabelText("앱 소개") + setNavigationBarTitleLabelFont(.subTitlefont) + setNavigationBarBackButtonHidden(false) + } + +} diff --git a/iBox/Sources/Settings/SettingsViewController.swift b/iBox/Sources/Settings/SettingsViewController.swift index bd753ad..13ff56e 100644 --- a/iBox/Sources/Settings/SettingsViewController.swift +++ b/iBox/Sources/Settings/SettingsViewController.swift @@ -51,9 +51,7 @@ extension SettingsViewController: SettingsViewDelegate { case .reset: navigationController?.pushViewController(ResetViewController(), animated: true) case .guide: - print("앱 소개 탭 !") - case .feedback: - print("앱 피드백 탭 !") + navigationController?.pushViewController(GuideViewController(), animated: true) default: break } } diff --git a/iBox/Sources/Settings/SettingsViewModel.swift b/iBox/Sources/Settings/SettingsViewModel.swift index 73a1581..c01cc85 100644 --- a/iBox/Sources/Settings/SettingsViewModel.swift +++ b/iBox/Sources/Settings/SettingsViewModel.swift @@ -52,8 +52,7 @@ class SettingsViewModel { ])) sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ SettingsCellViewModel(SettingsItem(type: .reset)), - SettingsCellViewModel(SettingsItem(type: .guide)), - SettingsCellViewModel(SettingsItem(type: .feedback)) + SettingsCellViewModel(SettingsItem(type: .guide)) ])) } diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 2298612..2eaf0e2 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -28,7 +28,7 @@ class WebView: UIView { // MARK: - UI Components - private let webView:WKWebView + private let webView: WKWebView private let progressView = UIProgressView().then { $0.progressViewStyle = .bar From 29523dff8d08d0c78059ffd5357b4d3dc74ed885 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 22 Apr 2024 16:33:17 +0900 Subject: [PATCH 295/370] docs: Add README.md file --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..1ce7e82 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# 42Box +The collection of all the sites you need. + +# ✨ Introduction +간단 소개글 + +### ⭐️ Key Function +1. 42폴더 + + > 42서울 서비스와 관련된 링크를 사전 저장한 전용 폴더를 제공합니다. + +2. 북마크 관리 + + > 웹 링크를 손쉽게 저장하고 사용자 정의 폴더로 정리하세요. + +3. 즐겨찾기 + + > 가장 자주 방문하는 웹 링크에 빠르게 접근하기 위해 즐겨찾기로 표시하세요. + +4. 링크 미리보기 + + > 북마크를 길게 눌러 WebView에서 링크를 완전히 열지 않고도 미리 볼 수 있습니다. + +5. WebView에서 북마크 추가 + + > WebView에서 브라우징하는 동안 간단한 제스처로 현재 웹 페이지를 북마크로 쉽게 저장할 수 있습니다. + +6. 홈 탭 구성 + + > 기본 홈 화면으로 북마크 목록 또는 즐겨찾기 탭 중에서 선택하세요. + +7. 테마 및 설정 + + > 다크 모드 또는 라이트 모드와 같은 테마를 설정하고 다른 설정을 통해 앱 경험을 사용자 정의하세요. + +### 📷 스크린샷 + + +# 🛠 Development Environment +iOS15.0+ Xcode 15.0 + +### ✨ Skills & Tech Stack +* UIKit +* Tuist +* MVVM Architecture +* Combine +* URLSession +* Webkit +* ... + + +# 🧑🏻‍💻 Contributor \ No newline at end of file From c73e2c7db3319c4cc03bf33f4d45993c8a8041e5 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 22 Apr 2024 16:54:26 +0900 Subject: [PATCH 296/370] =?UTF-8?q?style:=20BoxList=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=ED=83=80=EC=9D=B4=ED=8B=80=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 5acb884..62d6f18 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -40,7 +40,7 @@ class BoxListViewController: BaseViewController, BaseViewController // MARK: - BaseViewControllerProtocol func setupNavigationBar() { - setNavigationBarTitleLabelText("iBox") + setNavigationBarTitleLabelText("42Box") setNavigationBarMenuButtonHidden(false) setNavigationBarAddButtonAction(#selector(addButtonTapped)) setNavigationBarMoreButtonAction(#selector(moreButtonTapped)) From 0cea9f3c924fe39066d1c2f18bdc6e86b56ff83c Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 22 Apr 2024 20:14:26 +0900 Subject: [PATCH 297/370] =?UTF-8?q?docs:=20README.md=20=EC=B4=88=EC=95=88?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1ce7e82..ff93b45 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,15 @@ # 42Box -The collection of all the sites you need. +

+ appstore +
+ +### The collection of all the sites you need. # ✨ Introduction -간단 소개글 + 안녕하세요 :) 42Box ios 팀입니다.

+ 42Box는 웹 링크를 쉽게 관리하고 저장할 수 있는 사용자 친화적인 iOS 앱을 만들겠다는 단순한 아이디어에서 시작되었습니다.

+ 여러 웹 링크를 쉽게 저장하고 깔끔하게 정리하여 쉽게 접근할 수 있게 해줍니다.

+서비스를 원활하게 이용하실 수 있도록 핵심 기능을 소개합니다. 👋👋👋

### ⭐️ Key Function 1. 42폴더 @@ -35,18 +42,44 @@ The collection of all the sites you need. ### 📷 스크린샷 +| [폴더관리] | [공유] | [제스처] | +|:---:|:---:|:---:| +|image|image|image| + + +| [미리보기] | [테마설정] | +|:---:|:---:| +|image|image| + # 🛠 Development Environment -iOS15.0+ Xcode 15.0 +![iOS badge](https://img.shields.io/badge/iOS-15.0+-silver?style=flat-square) +![iOS badge](https://img.shields.io/badge/Xcode-15.0+-blue?style=flat-square) ### ✨ Skills & Tech Stack + * UIKit * Tuist -* MVVM Architecture * Combine * URLSession * Webkit -* ... +* ShareExtension + + + ### 🎁 Library +| Name |Version | +| ----------------- | ------ | +| SnapKit | `5.0.1`| +| SwiftSoup | `2.7.1`| +| SkeletonView | `1.0.0`| + +# 🧑🏻‍💻 Contributor + +
+ +| [jikoo](https://github.com/noeyiz) | [chanheki](https://github.com/chanhihi) | [jihyeole](https://github.com/JH713) | [jonchoi](https://github.com/jonnwon) | +|:---:|:---:|:---:|:---:| +|image|image|image|image| -# 🧑🏻‍💻 Contributor \ No newline at end of file +
From aae8021702e8d3c154f519a80a932cef06cd191a Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 22 Apr 2024 22:17:36 +0900 Subject: [PATCH 298/370] =?UTF-8?q?docs:=20README.md=20=EB=82=B4=20gif=20?= =?UTF-8?q?=EB=B0=8F=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ff93b45..107ff0c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ ### The collection of all the sites you need. +[appstore](https://apps.apple.com) + # ✨ Introduction 안녕하세요 :) 42Box ios 팀입니다.

@@ -42,14 +44,14 @@ ### 📷 스크린샷 -| [폴더관리] | [공유] | [제스처] | +| [폴더추가] | [공유] | [제스처] | |:---:|:---:|:---:| -|image|image|image| +|image|image|image| -| [미리보기] | [테마설정] | +| [즐겨찾기] | [설정] | |:---:|:---:| -|image|image| +|image|image| # 🛠 Development Environment @@ -82,4 +84,4 @@ |:---:|:---:|:---:|:---:| |image|image|image|image| - + \ No newline at end of file From 251954f70b75f976f8bd98bc77593558c80e9423 Mon Sep 17 00:00:00 2001 From: jonnwon Date: Mon, 22 Apr 2024 22:41:48 +0900 Subject: [PATCH 299/370] =?UTF-8?q?docs:=20README.md=20=EB=82=B4=20?= =?UTF-8?q?=EC=95=B1=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EB=B0=B0=EC=B9=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 107ff0c..27c7f69 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -# 42Box
- appstore + Fox +
+ + + +
+

appicon42Box

### The collection of all the sites you need. -[appstore](https://apps.apple.com) +[appstore](https://apps.apple.com) # ✨ Introduction From f60ff3fe37d05a9b5356ef8f1dc4998f1b9b1700 Mon Sep 17 00:00:00 2001 From: jonnwon <116494364+jonnwon@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:47:24 +0900 Subject: [PATCH 300/370] =?UTF-8?q?docs:=20README.md=20=EB=82=B4=20gif=20?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 27c7f69..ee22627 100644 --- a/README.md +++ b/README.md @@ -49,14 +49,14 @@ ### 📷 스크린샷 -| [폴더추가] | [공유] | [제스처] | +| 폴더추가 | 공유 | 제스처 | |:---:|:---:|:---:| -|image|image|image| +|image|image|image| -| [즐겨찾기] | [설정] | +| 즐겨찾기 | 테마 및 설정 | |:---:|:---:| -|image|image| +|image|image| # 🛠 Development Environment @@ -89,4 +89,4 @@ |:---:|:---:|:---:|:---:| |image|image|image|image| - \ No newline at end of file + From b4edbd5fcd7c281812efabd2a6cd280f7bd61d33 Mon Sep 17 00:00:00 2001 From: jonnwon <116494364+jonnwon@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:58:50 +0900 Subject: [PATCH 301/370] =?UTF-8?q?docs:=20=ED=8C=8C=EC=9D=BC=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ee22627..a24b446 100644 --- a/README.md +++ b/README.md @@ -51,13 +51,12 @@ | 폴더추가 | 공유 | 제스처 | |:---:|:---:|:---:| -|image|image|image| +|image|image|image| | 즐겨찾기 | 테마 및 설정 | |:---:|:---:| -|image|image| - +|image|image| # 🛠 Development Environment ![iOS badge](https://img.shields.io/badge/iOS-15.0+-silver?style=flat-square) @@ -87,6 +86,6 @@ | [jikoo](https://github.com/noeyiz) | [chanheki](https://github.com/chanhihi) | [jihyeole](https://github.com/JH713) | [jonchoi](https://github.com/jonnwon) | |:---:|:---:|:---:|:---:| -|image|image|image|image| +|image|image|image|image| From 7a6c369699039d250ede7069d01fab4352d54c5f Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 08:48:36 +0900 Subject: [PATCH 302/370] feat: register subquery extensionItems public.data --- Project.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index 4fa1bf0..9d57166 100644 --- a/Project.swift +++ b/Project.swift @@ -64,8 +64,19 @@ class iBoxFactory: ProjectFactory { "NSExtension": [ "NSExtensionAttributes": [ "NSExtensionActivationRule": [ - "NSExtensionActivationSupportsWebPageWithMaxCount" : 1, - "NSExtensionActivationSupportsWebURLWithMaxCount" : 1 + "NSExtensionActivationSupportsWebPageWithMaxCount": 1, + "NSExtensionActivationSupportsWebURLWithMaxCount": 1, + "SUBQUERY": [ + "extensionItems": [ + "SUBQUERY": [ + "attachments": [ + "ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO 'public.data'": "TRUE" + ], + "@count": 1 + ] + ], + "@count": 1 + ] ] ], "NSExtensionPointIdentifier": "com.apple.share-services", From 353f1db0127f92abc5f07199b48480103a6534c5 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 09:11:00 +0900 Subject: [PATCH 303/370] fix: support file, movie, image --- Project.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Project.swift b/Project.swift index 9d57166..73c8e2e 100644 --- a/Project.swift +++ b/Project.swift @@ -66,6 +66,9 @@ class iBoxFactory: ProjectFactory { "NSExtensionActivationRule": [ "NSExtensionActivationSupportsWebPageWithMaxCount": 1, "NSExtensionActivationSupportsWebURLWithMaxCount": 1, + "NSExtensionActivationSupportsImageWithMaxCount": 1, + "NSExtensionActivationSupportsMovieWithMaxCount": 1, + "NSExtensionActivationSupportsFileWithMaxCount": 1, "SUBQUERY": [ "extensionItems": [ "SUBQUERY": [ From dab32ad1efa5110a0c2b5a822de7c588240f56d9 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 09:12:13 +0900 Subject: [PATCH 304/370] feat: add extension item --- .../Sources/ShareViewController.swift | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index f7493a6..15b3437 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -71,7 +71,30 @@ class CustomShareViewController: UIViewController { } func extractSharedURL() { - guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { return } + guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem else { + print("No extension items found.") + return + } + + if let item = extensionContext?.inputItems.first as? NSExtensionItem { + for attachment in item.attachments ?? [] { + if let itemProvider = attachment as? NSItemProvider { + if itemProvider.hasItemConformingToTypeIdentifier("public.plain-text") { + // 텍스트 데이터 로드 + itemProvider.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { (data, error) in + DispatchQueue.main.async { + if let text = data as? String { + // 텍스트에서 URL 추출 + self.extractURL(fromText: text) + } else { + print("Error loading text: \(String(describing: error))") + } + } + } + } + } + } + } for attachment in extensionItem.attachments ?? [] { if attachment.hasItemConformingToTypeIdentifier(UTType.url.identifier) { @@ -86,10 +109,24 @@ class CustomShareViewController: UIViewController { } } break + } else { + print("Attachment does not conform to URL type.") } } } + private func extractURL(fromText text: String) { + let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) + let matches = detector?.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf8.count)) + + if let firstMatch = matches?.first, let range = Range(firstMatch.range, in: text), let url = URL(string: String(text[range])) { + print("Extracted URL: \(url)") + self.dataURL = url.absoluteString + } else { + print("No URL found in text") + } + } + // MARK: IBAction @IBAction func cancel() { From 863b7fc98b6c1805532499b81abfeada86e275cc Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 09:16:59 +0900 Subject: [PATCH 305/370] chore: delete commnets --- ShareExtension/Sources/ShareViewController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index 15b3437..de61ad6 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -80,11 +80,9 @@ class CustomShareViewController: UIViewController { for attachment in item.attachments ?? [] { if let itemProvider = attachment as? NSItemProvider { if itemProvider.hasItemConformingToTypeIdentifier("public.plain-text") { - // 텍스트 데이터 로드 itemProvider.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { (data, error) in DispatchQueue.main.async { if let text = data as? String { - // 텍스트에서 URL 추출 self.extractURL(fromText: text) } else { print("Error loading text: \(String(describing: error))") From d09c2c14fbf0602f0fe4e99306cfa5cf934a2848 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 09:32:09 +0900 Subject: [PATCH 306/370] fix: delete unnecessary line --- ShareExtension/Sources/ShareViewController.swift | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index de61ad6..d81bf15 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -78,15 +78,13 @@ class CustomShareViewController: UIViewController { if let item = extensionContext?.inputItems.first as? NSExtensionItem { for attachment in item.attachments ?? [] { - if let itemProvider = attachment as? NSItemProvider { - if itemProvider.hasItemConformingToTypeIdentifier("public.plain-text") { - itemProvider.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { (data, error) in - DispatchQueue.main.async { - if let text = data as? String { - self.extractURL(fromText: text) - } else { - print("Error loading text: \(String(describing: error))") - } + if attachment.hasItemConformingToTypeIdentifier("public.plain-text") { + attachment.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { (data, error) in + DispatchQueue.main.async { + if let text = data as? String { + self.extractURL(fromText: text) + } else { + print("Error loading text: \(String(describing: error))") } } } From a1141abff11323543562a961909ee2e2f59ae48d Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 16:58:18 +0900 Subject: [PATCH 307/370] feat: webview error code --- iBox/Sources/AppDelegate.swift | 2 +- .../CustomLaunchScreenView.swift | 2 +- .../CustomLaunchScreenViewController.swift | 2 +- iBox/Sources/Error/ErrorCode.swift | 18 +++++ .../Error/ErrorPageViewController.swift | 78 ++++++++++++++++++- iBox/Sources/Shared/AppStateManager.swift | 9 ++- .../Shared/SlideInPresentationManager.swift | 8 ++ 7 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 iBox/Sources/Error/ErrorCode.swift create mode 100644 iBox/Sources/Shared/SlideInPresentationManager.swift diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 8ba7e6f..eb8fbd4 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -21,7 +21,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } versioningHandler.checkAppVersion { result in - AppStateManager.shared.isVersionCheckCompleted = result + AppStateManager.shared.versionCheckCompleted = result } return true diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift index d1d0202..92876d2 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift @@ -63,7 +63,7 @@ class CustomLaunchScreenView: UIView { timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] timer in guard let self = self else { return } - let state = AppStateManager.shared.isVersionCheckCompleted + let state = AppStateManager.shared.versionCheckCompleted if state == .success || state == .later || state == .maxRetryReached { timer.invalidate() self.timer = nil diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 9251691..1c63d5b 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -38,7 +38,7 @@ class CustomLaunchScreenViewController: UIViewController { // MARK: - Custom Update Checker View (예정) private func observeVersionCheckCompletion() { - AppStateManager.shared.$isVersionCheckCompleted + AppStateManager.shared.$versionCheckCompleted .receive(on: DispatchQueue.main) .sink { [weak self] result in switch result { diff --git a/iBox/Sources/Error/ErrorCode.swift b/iBox/Sources/Error/ErrorCode.swift new file mode 100644 index 0000000..65a90fe --- /dev/null +++ b/iBox/Sources/Error/ErrorCode.swift @@ -0,0 +1,18 @@ +// +// ErrorCode.swift +// iBox +// +// Created by Chan on 4/23/24. +// + +import Foundation + +enum ViewErrorCode: Equatable { + case normal + case unknown + case webContentProcessTerminated + case webViewInvalidated + case javaScriptExceptionOccurred + case javaScriptResultTypeIsUnsupported + case networkError(URLError) +} diff --git a/iBox/Sources/Error/ErrorPageViewController.swift b/iBox/Sources/Error/ErrorPageViewController.swift index 04837c5..9021bf4 100644 --- a/iBox/Sources/Error/ErrorPageViewController.swift +++ b/iBox/Sources/Error/ErrorPageViewController.swift @@ -10,6 +10,7 @@ import WebKit protocol ErrorPageControllerDelegate: AnyObject { func presentErrorPage(_ errorPage: ErrorPageViewController) + func backButton() } protocol WebViewErrorDelegate { @@ -19,7 +20,9 @@ protocol WebViewErrorDelegate { class ErrorPageViewController: UIViewController { weak var delegate: ErrorPageControllerDelegate? var webView: WebView? - + + let slideInPresentationManager = SlideInPresentationManager() + init(webView: WebView) { super.init(nibName: nil, bundle: nil) self.webView = webView @@ -35,11 +38,23 @@ class ErrorPageViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + setupProperty() + setupPresentation() + } + + private func setupProperty() { if let errorPageView = view as? ErrorPageView { errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) + errorPageView.closeButton.addTarget(self, action: #selector(closeButtonTapped), for: .touchUpInside) + errorPageView.backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) } } + func setupPresentation() { + self.modalPresentationStyle = .custom + self.transitioningDelegate = slideInPresentationManager + } + func configureWithError(_ error: Error, url: String) { if let errorPageView = view as? ErrorPageView { errorPageView.configure(with: error, url: url) @@ -48,13 +63,65 @@ class ErrorPageViewController: UIViewController { @objc private func retryButtonTapped() { webView?.retryLoading() + } + + @objc private func closeButtonTapped() { dismiss(animated: true) } + @objc func backButtonTapped() { + self.dismiss(animated: true) { + self.delegate?.backButton() + } + } + + func handleError(_ error: Error, _ url: URL?) { - self.modalPresentationStyle = .overFullScreen - self.configureWithError(error, url: url?.absoluteString ?? "") - delegate?.presentErrorPage(self) + configureWithError(error, url: url?.absoluteString ?? "") + + self.delegate?.presentErrorPage(self) + } + + private func convertErrorToViewErrorCode(_ error: Error) -> ViewErrorCode { + if let wkError = error as? WKError { + switch wkError.code { + case .webContentProcessTerminated: + return .webContentProcessTerminated + case .webViewInvalidated: + return .webViewInvalidated + case .javaScriptExceptionOccurred: + return .javaScriptExceptionOccurred + case .javaScriptResultTypeIsUnsupported: + return .javaScriptResultTypeIsUnsupported + default: + return .unknown + } + } else if let urlError = error as? URLError { + return .networkError(urlError) + } + + return .unknown + } + + private func handleViewError(_ error: ViewErrorCode) { + switch error { + case .normal: + print("OK.") + case .unknown: + print("Unknown error occurred in the view.") + case .webContentProcessTerminated: + print("Web content process has been terminated unexpectedly.") + case .webViewInvalidated: + print("The web view has been invalidated.") + case .javaScriptExceptionOccurred: + print("A JavaScript exception occurred.") + case .javaScriptResultTypeIsUnsupported: + print("JavaScript returned a result type that is not supported.") + case .networkError(let urlError): + print("Network error occurred: \(urlError.localizedDescription)") + } + + AppStateManager.shared.updateViewError(error) } } @@ -62,6 +129,9 @@ extension ErrorPageViewController: WebViewErrorDelegate { func webView(_ webView: WebView, didFailWithError error: Error, url: URL?) { handleError(error, url) + + let viewErrorCode = convertErrorToViewErrorCode(error) + handleViewError(viewErrorCode) } } diff --git a/iBox/Sources/Shared/AppStateManager.swift b/iBox/Sources/Shared/AppStateManager.swift index 3c32cda..34e12bf 100644 --- a/iBox/Sources/Shared/AppStateManager.swift +++ b/iBox/Sources/Shared/AppStateManager.swift @@ -10,6 +10,11 @@ import Combine class AppStateManager { static let shared = AppStateManager() - @Published var isVersionCheckCompleted: VersionCheckCode = .initial - + @Published var versionCheckCompleted: VersionCheckCode = .initial + var currentViewErrorState: ViewErrorCode = .normal + + // 여기서 오류 상태를 업데이트하면 됩니다. + func updateViewError(_ error: ViewErrorCode) { + currentViewErrorState = error + } } diff --git a/iBox/Sources/Shared/SlideInPresentationManager.swift b/iBox/Sources/Shared/SlideInPresentationManager.swift new file mode 100644 index 0000000..87c9f41 --- /dev/null +++ b/iBox/Sources/Shared/SlideInPresentationManager.swift @@ -0,0 +1,8 @@ +// +// SlideInPresentationManager.swift +// iBox +// +// Created by Chan on 4/23/24. +// + +import Foundation From 060fbb2da37011ff31eecd588783a5b2da0b91dd Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 16:59:54 +0900 Subject: [PATCH 308/370] feat: errorview page presentation animation --- .../Settings/Reset/ResetSuccessView.swift | 1 + .../Shared/SlideInPresentationManager.swift | 105 +++++++++++++++++- iBox/Sources/Web/WebViewController.swift | 26 ++++- 3 files changed, 130 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Settings/Reset/ResetSuccessView.swift b/iBox/Sources/Settings/Reset/ResetSuccessView.swift index a52388b..c72685d 100644 --- a/iBox/Sources/Settings/Reset/ResetSuccessView.swift +++ b/iBox/Sources/Settings/Reset/ResetSuccessView.swift @@ -75,6 +75,7 @@ class ResetSuccessView: UIView { make.width.height.equalTo(50) } } + private func animateView() { UIView.animate(withDuration: 0.5, animations: { self.alpha = 1.0 diff --git a/iBox/Sources/Shared/SlideInPresentationManager.swift b/iBox/Sources/Shared/SlideInPresentationManager.swift index 87c9f41..71bbf47 100644 --- a/iBox/Sources/Shared/SlideInPresentationManager.swift +++ b/iBox/Sources/Shared/SlideInPresentationManager.swift @@ -5,4 +5,107 @@ // Created by Chan on 4/23/24. // -import Foundation +import UIKit + +// Presentation Manager 수정 +class SlideInPresentationManager: NSObject, UIViewControllerTransitioningDelegate { + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return HalfSizePresentationController(presentedViewController: presented, presenting: presenting) + } + + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return SlideInPresentationAnimator(isPresentation: true) + } + + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return SlideInPresentationAnimator(isPresentation: false) + } +} + +class SlideInPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning { + let isPresentation: Bool + + init(isPresentation: Bool) { + self.isPresentation = isPresentation + super.init() + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return 0.3 + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + let key = isPresentation ? UITransitionContextViewControllerKey.to : UITransitionContextViewControllerKey.from + guard let controller = transitionContext.viewController(forKey: key) else { return } + + if isPresentation { + transitionContext.containerView.addSubview(controller.view) + } + + let presentedFrame = transitionContext.finalFrame(for: controller) + var dismissedFrame = presentedFrame + dismissedFrame.origin.y = -presentedFrame.height + + let initialFrame = isPresentation ? dismissedFrame : presentedFrame + let finalFrame = isPresentation ? presentedFrame : dismissedFrame + + controller.view.frame = initialFrame + UIView.animate( + withDuration: transitionDuration(using: transitionContext), + animations: { + controller.view.frame = finalFrame + }, completion: { finished in + transitionContext.completeTransition(finished) + }) + } +} + +class TransparentTouchView: UIView { + var passThroughArea: CGRect? + + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + // 터치 포인트가 passThroughArea 안에 있으면 false를 반환하여 이벤트를 무시 + if let passThroughArea = passThroughArea, passThroughArea.contains(point) { + print("passtrou") + return false + } + return true + } +} + +class PassthroughView: UIView { + var passThroughAreas: [CGRect] = [] + + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + for rect in passThroughAreas { + if rect.contains(point) { + return false + } + } + return true + } +} + +class HalfSizePresentationController: UIPresentationController { + private var dimmingView: PassthroughView! + + override func presentationTransitionWillBegin() { + guard let containerView = containerView else { return } + + dimmingView = PassthroughView(frame: containerView.bounds) + dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.4) // 조절 가능 + dimmingView.passThroughAreas = [ + CGRect(x: 0, y: containerView.bounds.height / 2, width: containerView.bounds.width, height: containerView.bounds.height / 2) // 하단 절반 + ] + + containerView.addSubview(dimmingView) + containerView.sendSubviewToBack(dimmingView) + + super.presentationTransitionWillBegin() + } + + override var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + return CGRect(x: 0, y: 0, width: containerView.bounds.width, height: containerView.bounds.height / 2) + } +} diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index c67e266..e6abd3e 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -13,7 +13,8 @@ protocol WebViewDelegate { } class WebViewController: BaseViewController, BaseViewControllerProtocol { - + var id: UUID? + var slideInPresentationManager = SlideInPresentationManager() var errorViewController: ErrorPageViewController? var delegate: AddBookmarkViewControllerProtocol? var selectedWebsite: URL? @@ -34,6 +35,21 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol contentView.setupRefreshControl() } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + if ((isMovingFromParent || isBeingDismissed) && AppStateManager.shared.currentViewErrorState != .normal){ + if let id = self.id { + WebCacheManager.shared.removeViewControllerForKey(id) + } + } + } + + deinit { + AppStateManager.shared.currentViewErrorState = .normal + } + + // MARK: - BaseViewControllerProtocol func setupNavigationBar() { @@ -72,4 +88,12 @@ extension WebViewController: ErrorPageControllerDelegate { func presentErrorPage(_ errorPage: ErrorPageViewController) { self.present(errorPage, animated: true, completion: nil) } + + func backButton() { + if let navController = navigationController { + navController.popViewController(animated: true) + } else { + dismiss(animated: true) + } + } } From be66736fe19d4a08c002af6cce9fd9a7fa3cd64a Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 17:00:52 +0900 Subject: [PATCH 309/370] feat: error page view --- iBox/Sources/BoxList/BoxListView.swift | 1 + .../BoxList/BoxListViewController.swift | 1 + iBox/Sources/Error/ErrorPageView.swift | 87 ++++++++++++++----- 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index 63e6d40..b94075f 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -392,6 +392,7 @@ extension BoxListView: UITableViewDelegate { let viewController = WebViewController() viewController.selectedWebsite = url viewController.title = name + viewController.id = id WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) previewViewController = viewController } diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index 87ba714..bcf0e9b 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -216,6 +216,7 @@ extension BoxListViewController: BoxListViewDelegate { viewController.delegate = self viewController.selectedWebsite = url viewController.title = name + viewController.id = id WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) navigationController?.pushViewController(viewController, animated: true) } diff --git a/iBox/Sources/Error/ErrorPageView.swift b/iBox/Sources/Error/ErrorPageView.swift index bfa39bd..b112b36 100644 --- a/iBox/Sources/Error/ErrorPageView.swift +++ b/iBox/Sources/Error/ErrorPageView.swift @@ -14,14 +14,43 @@ class ErrorPageView: UIView { private let images = ["fox_page0", "fox_page1", "fox_page2", "fox_page3", "fox_page4"] private var timer: Timer? - let messageLabel = UILabel() + private let backPannelView = UIView().then { + $0.backgroundColor = .backgroundColor + $0.layer.cornerRadius = 20 + $0.clipsToBounds = true + } + + private let messageLabel = UILabel().then { + $0.textAlignment = .center + $0.numberOfLines = 0 + } + + private let backButton = UIButton().then { + $0.setTitle("나가기", for: .normal) + $0.backgroundColor = .box2 + $0.setTitleColor(.white, for: .normal) + $0.layer.cornerRadius = 10 + } + + private let retryButton = UIButton().then { + $0.setTitle("새로고침", for: .normal) + $0.backgroundColor = .box2 + $0.setTitleColor(.white, for: .normal) + $0.layer.cornerRadius = 10 + } - let backButton = UIButton() - let retryButton = UIButton() + private let closeButton = UIButton().then { + $0.setTitle("닫기", for: .normal) + $0.backgroundColor = .box2 + $0.setTitleColor(.white, for: .normal) + $0.layer.cornerRadius = 10 + } override init(frame: CGRect) { super.init(frame: frame) - setupViews() + setupProperty() + setupHierarchy() + setupAnimation() setupLayout() changeImages() } @@ -30,20 +59,20 @@ class ErrorPageView: UIView { fatalError("init(coder:) has not been implemented") } - private func setupViews() { + private func setupProperty() { backgroundColor = .clear - messageLabel.textAlignment = .center - messageLabel.numberOfLines = 0 - - retryButton.setTitle("무시하기", for: .normal) - retryButton.backgroundColor = .systemBlue - retryButton.setTitleColor(.white, for: .normal) - retryButton.layer.cornerRadius = 10 - + changeImages() + } + + private func setupHierarchy() { addSubview(messageLabel) addSubview(retryButton) - + addSubview(closeButton) + addSubview(backButton) + } + + private func setupAnimation() { for imageName in images { let imageView = UIImageView(image: UIImage(named: imageName)) imageView.contentMode = .scaleAspectFit @@ -52,9 +81,6 @@ class ErrorPageView: UIView { addSubview(imageView) imageViews.append(imageView) } - - changeImages() - } private func setupLayout() { @@ -62,7 +88,7 @@ class ErrorPageView: UIView { imageViews.forEach { imageView in imageView.snp.makeConstraints { make in make.centerX.equalToSuperview() - make.centerY.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.main.bounds.height * 0.3) make.leading.greaterThanOrEqualToSuperview().offset(20) make.trailing.lessThanOrEqualToSuperview().offset(-20) make.width.height.equalTo(32) @@ -75,17 +101,31 @@ class ErrorPageView: UIView { make.leading.greaterThanOrEqualToSuperview().offset(20) make.trailing.lessThanOrEqualToSuperview().offset(-20) } - + retryButton.snp.makeConstraints { make in make.top.equalTo(messageLabel.snp.bottom).offset(20) make.centerX.equalToSuperview() make.width.equalTo(100) make.height.equalTo(44) } + + closeButton.snp.makeConstraints { make in + make.leading.equalTo(retryButton.snp.trailing).offset(20) + make.centerY.equalTo(retryButton.snp.centerY) + make.width.equalTo(100) + make.height.equalTo(44) + } + + backButton.snp.makeConstraints { make in + make.trailing.equalTo(retryButton.snp.leading).offset(-20) + make.centerY.equalTo(retryButton.snp.centerY) + make.width.equalTo(100) + make.height.equalTo(44) + } } func configure(with error: Error, url: String) { - messageLabel.text = "\(url): \n해당 주소를 불러오는데 실패했어요!" + messageLabel.text = "\(url)\n해당 주소에서 문제가 발생했습니다." print(error.localizedDescription) } @@ -95,10 +135,9 @@ class ErrorPageView: UIView { timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] timer in guard let self = self else { return } - let state = AppStateManager.shared.isVersionCheckCompleted - if state == .success || state == .later || state == .maxRetryReached { - timer.invalidate() - self.timer = nil + let state = AppStateManager.shared.currentViewErrorState + + if state == .normal { return } From 8080da6c57680b84f942e3476ac7cfc72b331baf Mon Sep 17 00:00:00 2001 From: chanhihi Date: Tue, 23 Apr 2024 17:01:25 +0900 Subject: [PATCH 310/370] style: refresh controller color --- iBox/Sources/Extension/UIColor+Extension.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iBox/Sources/Extension/UIColor+Extension.swift b/iBox/Sources/Extension/UIColor+Extension.swift index f4c0fc4..2a5fc3f 100644 --- a/iBox/Sources/Extension/UIColor+Extension.swift +++ b/iBox/Sources/Extension/UIColor+Extension.swift @@ -32,6 +32,8 @@ extension UIColor { static let box = UIColor(hex: 0xFF7F29) static let box2 = UIColor(hex: 0xFF9548) static let box3 = UIColor(hex: 0xFFDC6E) + static let boxWithOpacity = UIColor(hex: 0xFF7F29, alpha: 0.7) + static let box2WithOpacity = UIColor(hex: 0xFF9548, alpha: 0.7) static let tableViewBackgroundColor = color(light: .systemGroupedBackground, dark: .systemGray4) static let folderGray = color(light: .systemGray3, dark: .systemGray2) static let webIconColor = color(light: .black, dark: .systemGray) From cfa45880b5ea7ba096dec774005ee64587149c19 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 23 Apr 2024 18:39:39 +0900 Subject: [PATCH 311/370] =?UTF-8?q?fix:=20http=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/AddBookmarkManager.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/Shared/AddBookmarkManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift index e1f8096..12c8222 100644 --- a/iBox/Sources/Shared/AddBookmarkManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -74,13 +74,19 @@ class AddBookmarkManager { func navigateToAddBookmarkView(from url: URL, in tabBarController: UITabBarController) { guard url.scheme == "iBox", let urlString = extractDataParameter(from: url) else { return } - guard let url = URL(string: urlString) else { return } incomingTitle = nil incomingData = nil incomingFaviconUrl = nil isFetching = true - fetchWebsiteDetails(from: url) + + + if urlString.hasPrefix("http://") { + update(with: (nil, urlString, nil)) + } else { + guard let url = URL(string: urlString) else { return } + fetchWebsiteDetails(from: url) + } tabBarController.selectedIndex = 0 From 4dffe8e341a6b5d7d2b6040362d8c33cb56ffbda Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 23 Apr 2024 18:50:05 +0900 Subject: [PATCH 312/370] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=EC=8B=9C=20is?= =?UTF-8?q?Fetching=20false=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Shared/AddBookmarkManager.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Shared/AddBookmarkManager.swift b/iBox/Sources/Shared/AddBookmarkManager.swift index 12c8222..fbb7f70 100644 --- a/iBox/Sources/Shared/AddBookmarkManager.swift +++ b/iBox/Sources/Shared/AddBookmarkManager.swift @@ -84,7 +84,10 @@ class AddBookmarkManager { if urlString.hasPrefix("http://") { update(with: (nil, urlString, nil)) } else { - guard let url = URL(string: urlString) else { return } + guard let url = URL(string: urlString) else { + isFetching = false + return + } fetchWebsiteDetails(from: url) } From adebd985bb6d09f042f1bd01bdd25d3e4a353bc6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 23 Apr 2024 20:13:51 +0900 Subject: [PATCH 313/370] feat: remove preload --- iBox/Sources/AppDelegate.swift | 23 +++++-------------- iBox/Sources/Favorite/FavoriteView.swift | 17 +++++++++----- iBox/Sources/Model/SettingsItem.swift | 2 -- iBox/Sources/Settings/SettingsView.swift | 10 +------- iBox/Sources/Settings/SettingsViewModel.swift | 6 +---- iBox/Sources/Shared/UserDefaultsManager.swift | 3 --- iBox/Sources/Web/RefreshControl.swift | 1 + 7 files changed, 20 insertions(+), 42 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index 8ba7e6f..dbec944 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -5,20 +5,16 @@ // Created by 김찬희 on 2023/12/21. // -import UIKit import CoreData +import UIKit +import WebKit @main class AppDelegate: UIResponder, UIApplicationDelegate { let versioningHandler: VersioningHandler = VersioningHandler() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - if UserDefaultsManager.isPreload { - Task { [weak self] in - self?.preloadFavoriteWeb() - } - } + woraroundInitialWebViewDelay() versioningHandler.checkAppVersion { result in AppStateManager.shared.isVersionCheckCompleted = result @@ -27,16 +23,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - private func preloadFavoriteWeb() { - let favoriteId = UserDefaultsManager.favoriteId - var favoriteUrl: URL? = nil - if let favoriteId { - favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) - if favoriteUrl == nil { - UserDefaultsManager.favoriteId = nil - } - } - WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) + func woraroundInitialWebViewDelay() { + let webView = WKWebView() + webView.loadHTMLString("", baseURL: nil) } // MARK: UISceneSession Lifecycle diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 0963419..1a668ce 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -12,12 +12,14 @@ import SnapKit class FavoriteView: UIView { - lazy var webView = { - if WebViewPreloader.shared.getFavoriteView() == nil { - loadFavoriteWeb() - } - return WebViewPreloader.shared.getFavoriteView() - }() + var webView: WebView? + +// lazy var webView = { +// if WebViewPreloader.shared.getFavoriteView() == nil { +// loadFavoriteWeb() +// } +// return WebViewPreloader.shared.getFavoriteView() +// }() // MARK: - Initializer @@ -41,6 +43,9 @@ class FavoriteView: UIView { private func setupProperty() { backgroundColor = .backgroundColor + + loadFavoriteWeb() + webView = WebViewPreloader.shared.getFavoriteView() } private func setupHierarchy() { diff --git a/iBox/Sources/Model/SettingsItem.swift b/iBox/Sources/Model/SettingsItem.swift index 4b0c992..c8befa6 100644 --- a/iBox/Sources/Model/SettingsItem.swift +++ b/iBox/Sources/Model/SettingsItem.swift @@ -11,7 +11,6 @@ enum SettingsType { case theme case homeTab case haptics - case preload case reset case guide case feedback @@ -21,7 +20,6 @@ enum SettingsType { case .theme: "테마" case .homeTab: "홈화면" case .haptics: "진동" - case .preload: "즐겨찾기 미리 로드" case .reset: "데이터 초기화" case .guide: "앱 소개" case .feedback: "앱 피드백" diff --git a/iBox/Sources/Settings/SettingsView.swift b/iBox/Sources/Settings/SettingsView.swift index 4f5745d..24a151b 100644 --- a/iBox/Sources/Settings/SettingsView.swift +++ b/iBox/Sources/Settings/SettingsView.swift @@ -74,11 +74,6 @@ final class SettingsView: UIView { viewModel.input.send(.setHaptics(controlSwitch.isOn)) } - @objc private func handlePreloadSwitchTap(_ controlSwitch: UISwitch) { - guard let viewModel = viewModel else { return } - viewModel.input.send(.setPreload(controlSwitch.isOn)) - } - } extension SettingsView: UITableViewDelegate { @@ -105,7 +100,7 @@ extension SettingsView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let viewModel = viewModel else { return } let settingsItem = viewModel.sectionViewModels[indexPath.section].cellViewModels[indexPath.row].settingsItem - if (settingsItem.type != SettingsType.haptics && settingsItem.type != SettingsType.preload) { + if (settingsItem.type != SettingsType.haptics) { delegate?.pushViewController(settingsItem.type) } } @@ -129,9 +124,6 @@ extension SettingsView: UITableViewDataSource { if settingsType == .haptics { cell.switchControl.removeTarget(nil, action: nil, for: .valueChanged) cell.switchControl.addTarget(self, action: #selector(handleHapticsSwitchTap), for: .valueChanged) - } else if settingsType == .preload { - cell.switchControl.removeTarget(nil, action: nil, for: .valueChanged) - cell.switchControl.addTarget(self, action: #selector(handlePreloadSwitchTap), for: .valueChanged) } return cell } diff --git a/iBox/Sources/Settings/SettingsViewModel.swift b/iBox/Sources/Settings/SettingsViewModel.swift index 73a1581..5d83a46 100644 --- a/iBox/Sources/Settings/SettingsViewModel.swift +++ b/iBox/Sources/Settings/SettingsViewModel.swift @@ -13,7 +13,6 @@ class SettingsViewModel { enum Input { case viewWillAppear case setHaptics(_ isOn: Bool) - case setPreload(_ isOn: Bool) } enum Output { @@ -36,8 +35,6 @@ class SettingsViewModel { self?.output.send(.updateSectionViewModels) case let .setHaptics(isOn): UserDefaultsManager.isHaptics = isOn - case let .setPreload(isOn): - UserDefaultsManager.isPreload = isOn } }.store(in: &cancellables) return output.eraseToAnyPublisher() @@ -47,8 +44,7 @@ class SettingsViewModel { sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ SettingsCellViewModel(SettingsItem(type: .theme, description: UserDefaultsManager.theme.toString())), SettingsCellViewModel(SettingsItem(type: .homeTab, description: HomeTabType.allCases[UserDefaultsManager.homeTabIndex].toString())), - SettingsCellViewModel(SettingsItem(type: .haptics, flag: UserDefaultsManager.isHaptics)), - SettingsCellViewModel(SettingsItem(type: .preload, flag: UserDefaultsManager.isPreload)) + SettingsCellViewModel(SettingsItem(type: .haptics, flag: UserDefaultsManager.isHaptics)) ])) sectionViewModels.append(SettingsSectionViewModel(cellViewModels: [ SettingsCellViewModel(SettingsItem(type: .reset)), diff --git a/iBox/Sources/Shared/UserDefaultsManager.swift b/iBox/Sources/Shared/UserDefaultsManager.swift index 556951f..36c58bb 100644 --- a/iBox/Sources/Shared/UserDefaultsManager.swift +++ b/iBox/Sources/Shared/UserDefaultsManager.swift @@ -24,9 +24,6 @@ final class UserDefaultsManager { @UserDefaultsData(key: "isHaptics", defaultValue: true) static var isHaptics: Bool - @UserDefaultsData(key: "isPreload", defaultValue: false) - static var isPreload: Bool - @UserDefaultsData(key: "selectedFolderId", defaultValue: nil) static var selectedFolderId: UUID? diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift index 6f1a80f..0c89d4d 100644 --- a/iBox/Sources/Web/RefreshControl.swift +++ b/iBox/Sources/Web/RefreshControl.swift @@ -78,6 +78,7 @@ class RefreshControl: UIView { private func setupProperty() { backgroundColor = .backgroundColor + translatesAutoresizingMaskIntoConstraints = false isUserInteractionEnabled = true } From d7f884a2e3a8c6cf0c1dad458ef78f11d2a5153c Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 23 Apr 2024 20:16:03 +0900 Subject: [PATCH 314/370] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/AppDelegate.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/AppDelegate.swift b/iBox/Sources/AppDelegate.swift index dbec944..46fb653 100644 --- a/iBox/Sources/AppDelegate.swift +++ b/iBox/Sources/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let versioningHandler: VersioningHandler = VersioningHandler() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - woraroundInitialWebViewDelay() + workaroundInitialWebViewDelay() versioningHandler.checkAppVersion { result in AppStateManager.shared.isVersionCheckCompleted = result @@ -23,7 +23,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func woraroundInitialWebViewDelay() { + func workaroundInitialWebViewDelay() { let webView = WKWebView() webView.loadHTMLString("", baseURL: nil) } From b03416fc99a17a1f9d897bee0b75e2e7972225c6 Mon Sep 17 00:00:00 2001 From: JH713 Date: Tue, 23 Apr 2024 20:28:33 +0900 Subject: [PATCH 315/370] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Favorite/FavoriteView.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 1a668ce..fd475f3 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -14,13 +14,6 @@ class FavoriteView: UIView { var webView: WebView? -// lazy var webView = { -// if WebViewPreloader.shared.getFavoriteView() == nil { -// loadFavoriteWeb() -// } -// return WebViewPreloader.shared.getFavoriteView() -// }() - // MARK: - Initializer override init(frame: CGRect) { From c7cda4284d9ca9f16c9411633d23ea6434148817 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 24 Apr 2024 01:53:50 +0900 Subject: [PATCH 316/370] fix: refresh control layout --- iBox/Sources/Favorite/FavoriteViewController.swift | 8 +------- iBox/Sources/Web/RefreshControl.swift | 1 - 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 41ce1e8..237813c 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -20,13 +20,7 @@ class FavoriteViewController: BaseViewController, BaseViewControll guard let contentView = contentView as? FavoriteView else { return } contentView.webView?.delegate = self } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - guard let contentView = contentView as? FavoriteView else { return } - contentView.webView?.setupRefreshControl() - } - + // MARK: - BaseViewControllerProtocol func setupNavigationBar() { diff --git a/iBox/Sources/Web/RefreshControl.swift b/iBox/Sources/Web/RefreshControl.swift index 0c89d4d..6f1a80f 100644 --- a/iBox/Sources/Web/RefreshControl.swift +++ b/iBox/Sources/Web/RefreshControl.swift @@ -78,7 +78,6 @@ class RefreshControl: UIView { private func setupProperty() { backgroundColor = .backgroundColor - translatesAutoresizingMaskIntoConstraints = false isUserInteractionEnabled = true } From 5c649fe76b7b611f727ed0cb8b8a88b871bbb029 Mon Sep 17 00:00:00 2001 From: JH713 Date: Wed, 24 Apr 2024 15:17:16 +0900 Subject: [PATCH 317/370] fix: hash in url --- iBox/Sources/AddBookmark/AddBookmarkViewController.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift index 671572a..0388234 100644 --- a/iBox/Sources/AddBookmark/AddBookmarkViewController.swift +++ b/iBox/Sources/AddBookmark/AddBookmarkViewController.swift @@ -175,7 +175,10 @@ final class AddBookmarkViewController: UIViewController { urlString = "https://" + urlString } - guard let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), + var allowedCharacters = CharacterSet.urlQueryAllowed + allowedCharacters.insert("#") + + guard let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: allowedCharacters), let url = URL(string: encodedUrlString) else { print("Invalid URL format") return From 12bcf7c13276c6cdf0751237726577cf7aa46826 Mon Sep 17 00:00:00 2001 From: jonnwon <116494364+jonnwon@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:32:28 +0900 Subject: [PATCH 318/370] =?UTF-8?q?docs:=20=EC=95=B1=20=EC=86=8C=EA=B0=9C?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a24b446..255d4d1 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,16 @@
- Fox + Fox
- -
-

appicon42Box

-
- -### The collection of all the sites you need. [appstore](https://apps.apple.com) # ✨ Introduction - 안녕하세요 :) 42Box ios 팀입니다.

- 42Box는 웹 링크를 쉽게 관리하고 저장할 수 있는 사용자 친화적인 iOS 앱을 만들겠다는 단순한 아이디어에서 시작되었습니다.

- 여러 웹 링크를 쉽게 저장하고 깔끔하게 정리하여 쉽게 접근할 수 있게 해줍니다.

-서비스를 원활하게 이용하실 수 있도록 핵심 기능을 소개합니다. 👋👋👋

+ 안녕하세요 :) 42Box iOS 팀입니다.
+ 42Box는 웹 링크를 쉽게 관리하고 저장할 수 있는 사용자 친화적인 iOS 앱을 만들겠다는 단순한 아이디어에서 시작되었습니다.
+ 여러 웹 링크를 쉽게 저장하고 깔끔하게 정리하여 쉽게 접근할 수 있게 해줍니다.
+ 서비스를 원활하게 이용하실 수 있도록 핵심 기능을 소개합니다. 👋👋👋
### ⭐️ Key Function 1. 42폴더 @@ -47,7 +41,7 @@ > 다크 모드 또는 라이트 모드와 같은 테마를 설정하고 다른 설정을 통해 앱 경험을 사용자 정의하세요. -### 📷 스크린샷 +### 📷 ScreenShot | 폴더추가 | 공유 | 제스처 | |:---:|:---:|:---:| @@ -72,7 +66,7 @@ * ShareExtension - ### 🎁 Library +### 🎁 Library | Name |Version | | ----------------- | ------ | | SnapKit | `5.0.1`| From 0cc1efb7e8f5106e4fe3c858e5642141027827c0 Mon Sep 17 00:00:00 2001 From: KIM CHANHEE <85754295+chanhihi@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:34:16 +0900 Subject: [PATCH 319/370] fix: delete unnecessary line --- Project.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Project.swift b/Project.swift index 73c8e2e..9d57166 100644 --- a/Project.swift +++ b/Project.swift @@ -66,9 +66,6 @@ class iBoxFactory: ProjectFactory { "NSExtensionActivationRule": [ "NSExtensionActivationSupportsWebPageWithMaxCount": 1, "NSExtensionActivationSupportsWebURLWithMaxCount": 1, - "NSExtensionActivationSupportsImageWithMaxCount": 1, - "NSExtensionActivationSupportsMovieWithMaxCount": 1, - "NSExtensionActivationSupportsFileWithMaxCount": 1, "SUBQUERY": [ "extensionItems": [ "SUBQUERY": [ From 19019a420bc7870106bd81ed358c2d54980ef8f7 Mon Sep 17 00:00:00 2001 From: jonnwon <116494364+jonnwon@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:34:57 +0900 Subject: [PATCH 320/370] =?UTF-8?q?docs:=20=EC=82=AC=EC=A7=84=20=EB=B9=84?= =?UTF-8?q?=EC=9C=A8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 255d4d1..9b2a217 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- Fox + Fox
From a1d2b545e30a2f123a37a57ba4294e2fdcd895b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=ED=98=84?= Date: Wed, 24 Apr 2024 15:44:12 +0900 Subject: [PATCH 321/370] docs: update img --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b2a217..97867ac 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,6 @@ | [jikoo](https://github.com/noeyiz) | [chanheki](https://github.com/chanhihi) | [jihyeole](https://github.com/JH713) | [jonchoi](https://github.com/jonnwon) | |:---:|:---:|:---:|:---:| -|image|image|image|image| +|image|image|image|image| From 6f2660946a47a1905156fa33ad24245acb87aeeb Mon Sep 17 00:00:00 2001 From: jonnwon <116494364+jonnwon@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:09:22 +0900 Subject: [PATCH 322/370] docs: Update README.md --- README.md | 55 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 97867ac..f3a11a1 100644 --- a/README.md +++ b/README.md @@ -5,58 +5,63 @@ [appstore](https://apps.apple.com) +
+ +# 💁‍♀️💁‍♂️ Introduction +안녕하세요! 42Box iOS 팀입니다. 🦊 
+42Box는 여러 웹 링크를 쉽게 저장하고 폴더별로 정리할 수 있는 앱입니다. 
+도서관 서비스, 출입 관리 등 42서울 생활에 필수적인 서비스들을 기본 폴더에 모아 제공하고 있어요. 
+📢 서비스를 원활하게 이용하실 수 있도록 핵심 기능을 소개합니다. 👀 
-# ✨ Introduction - 안녕하세요 :) 42Box iOS 팀입니다.
- 42Box는 웹 링크를 쉽게 관리하고 저장할 수 있는 사용자 친화적인 iOS 앱을 만들겠다는 단순한 아이디어에서 시작되었습니다.
- 여러 웹 링크를 쉽게 저장하고 깔끔하게 정리하여 쉽게 접근할 수 있게 해줍니다.
- 서비스를 원활하게 이용하실 수 있도록 핵심 기능을 소개합니다. 👋👋👋
### ⭐️ Key Function -1. 42폴더 +1. 기본 42폴더 제공 > 42서울 서비스와 관련된 링크를 사전 저장한 전용 폴더를 제공합니다. 2. 북마크 관리 - > 웹 링크를 손쉽게 저장하고 사용자 정의 폴더로 정리하세요. + > 웹 링크를 손쉽게 저장하고 나만의 폴더로 정리할 수 있습니다. 3. 즐겨찾기 - > 가장 자주 방문하는 웹 링크에 빠르게 접근하기 위해 즐겨찾기로 표시하세요. + > 가장 자주 방문하는 웹 링크에 빠르게 접근하기 위해 즐겨찾기 탭으로 추가할 수 있습니다. + +4. 공유 -4. 링크 미리보기 + > 외부 앱에서 웹 링크를 공유해 북마크를 쉽게 추가할 수 있습니다. + +5. 링크 미리보기 - > 북마크를 길게 눌러 WebView에서 링크를 완전히 열지 않고도 미리 볼 수 있습니다. + > 링크를 완전히 열지 않고도 북마크를 길게 눌러 미리 볼 수 있습니다. -5. WebView에서 북마크 추가 +6. 제스처로 북마크 추가 - > WebView에서 브라우징하는 동안 간단한 제스처로 현재 웹 페이지를 북마크로 쉽게 저장할 수 있습니다. - -6. 홈 탭 구성 - - > 기본 홈 화면으로 북마크 목록 또는 즐겨찾기 탭 중에서 선택하세요. + > 브라우징하는 동안 간단한 제스처로 현재 웹 링크를 북마크로 쉽게 저장할 수 있습니다. 7. 테마 및 설정 - > 다크 모드 또는 라이트 모드와 같은 테마를 설정하고 다른 설정을 통해 앱 경험을 사용자 정의하세요. + > 테마와 시작 화면 설정 등 개인 맞춤화 설정을 할 수 있습니다. ### 📷 ScreenShot -| 폴더추가 | 공유 | 제스처 | +| 폴더 관리 | 외부 앱에서 공유 | 제스처로 북마크 추가 | |:---:|:---:|:---:| |image|image|image| -| 즐겨찾기 | 테마 및 설정 | +| 즐겨찾기 설정 | 테마 및 설정 | |:---:|:---:| |image|image| -# 🛠 Development Environment +
+
+ +# ⚙️ Development Environment ![iOS badge](https://img.shields.io/badge/iOS-15.0+-silver?style=flat-square) ![iOS badge](https://img.shields.io/badge/Xcode-15.0+-blue?style=flat-square) -### ✨ Skills & Tech Stack +### 🛠 Skills & Tech Stack * UIKit * Tuist @@ -66,15 +71,17 @@ * ShareExtension -### 🎁 Library +### 📚 Library | Name |Version | | ----------------- | ------ | | SnapKit | `5.0.1`| | SwiftSoup | `2.7.1`| | SkeletonView | `1.0.0`| - -# 🧑🏻‍💻 Contributor +
+
+ +# 👩🏻‍💻🧑🏻‍💻 Contributor
From a8bfc89548090e8babd3de27f6a4b4cc5b6fd94c Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 24 Apr 2024 17:11:10 +0900 Subject: [PATCH 323/370] docs: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3a11a1..7adb0a6 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,6 @@ | [jikoo](https://github.com/noeyiz) | [chanheki](https://github.com/chanhihi) | [jihyeole](https://github.com/JH713) | [jonchoi](https://github.com/jonnwon) | |:---:|:---:|:---:|:---:| -|image|image|image|image| +|image|image|image|image|
From 4a8f8d277e5051702e6e9c907421f0e35e19a8eb Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 24 Apr 2024 17:20:15 +0900 Subject: [PATCH 324/370] docs: Update README.md --- README.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7adb0a6..4628625 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ * UIKit * Tuist * Combine -* URLSession +* MVVM * Webkit * ShareExtension @@ -83,10 +83,18 @@ # 👩🏻‍💻🧑🏻‍💻 Contributor -
- -| [jikoo](https://github.com/noeyiz) | [chanheki](https://github.com/chanhihi) | [jihyeole](https://github.com/JH713) | [jonchoi](https://github.com/jonnwon) | -|:---:|:---:|:---:|:---:| -|image|image|image|image| - -
+ + + + + + + + + + + + + + +
구지연김찬희이지현최종원

jikoo


chanheki


jihyeole


jonchoi

From edcf45fee31c79dcac06dc7a3f74ab9439b0d802 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Wed, 24 Apr 2024 18:41:51 +0900 Subject: [PATCH 325/370] =?UTF-8?q?feat:=20=EC=95=B1=20=EC=86=8C=EA=B0=9C?= =?UTF-8?q?=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Settings/Guide/GuideViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Settings/Guide/GuideViewController.swift b/iBox/Sources/Settings/Guide/GuideViewController.swift index 2f0c8df..bc393b5 100644 --- a/iBox/Sources/Settings/Guide/GuideViewController.swift +++ b/iBox/Sources/Settings/Guide/GuideViewController.swift @@ -16,7 +16,7 @@ class GuideViewController: BaseViewController, BaseViewControllerProt setupNavigationBar() guard let contentView = contentView as? GuideView else { return } - contentView.guideUrl = URL(string: "https://github.com/42Box/iOS") + contentView.guideUrl = URL(string: "https://github.com/42Box/iOS/tree/develop?tab=readme-ov-file#%EF%B8%8F%EF%B8%8F-introduction") } // MARK: - BaseViewControllerProtocol From affca3f47d53d63969ac417a5fb3c5f4a16533e8 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:15:45 +0900 Subject: [PATCH 326/370] feat: error view controller present effect --- .../Extension/UIButton+Extension.swift | 8 ++ .../FullSizePresentationController.swift | 37 ++++++++ .../SlideInPresentationAnimator.swift | 46 +++++++++ .../Shared/SlideInPresentationManager.swift | 95 +------------------ 4 files changed, 94 insertions(+), 92 deletions(-) create mode 100644 iBox/Sources/Extension/UIButton+Extension.swift create mode 100644 iBox/Sources/Shared/Animator/FullSizePresentationController.swift create mode 100644 iBox/Sources/Shared/Animator/SlideInPresentationAnimator.swift diff --git a/iBox/Sources/Extension/UIButton+Extension.swift b/iBox/Sources/Extension/UIButton+Extension.swift new file mode 100644 index 0000000..90a8903 --- /dev/null +++ b/iBox/Sources/Extension/UIButton+Extension.swift @@ -0,0 +1,8 @@ +// +// UIButton+Extension.swift +// iBox +// +// Created by Chan on 4/25/24. +// + +import Foundation diff --git a/iBox/Sources/Shared/Animator/FullSizePresentationController.swift b/iBox/Sources/Shared/Animator/FullSizePresentationController.swift new file mode 100644 index 0000000..8693cab --- /dev/null +++ b/iBox/Sources/Shared/Animator/FullSizePresentationController.swift @@ -0,0 +1,37 @@ +// +// FullSizePresentationController.swift +// iBox +// +// Created by Chan on 4/24/24. +// + +import UIKit + +class FullSizePresentationController: UIPresentationController { + private var dimmingView: UIView! + + override func containerViewDidLayoutSubviews() { + super.containerViewDidLayoutSubviews() + + dimmingView.frame = containerView?.bounds ?? CGRect.zero + presentedView?.frame = frameOfPresentedViewInContainerView + } + + override func presentationTransitionWillBegin() { + guard let containerView = containerView else { return } + + dimmingView = UIView(frame: containerView.bounds) + dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.4) + dimmingView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + containerView.addSubview(dimmingView) + containerView.sendSubviewToBack(dimmingView) + + super.presentationTransitionWillBegin() + } + + override var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + return CGRect(x: 0, y: 0, width: containerView.bounds.width, height: containerView.bounds.height) + } +} diff --git a/iBox/Sources/Shared/Animator/SlideInPresentationAnimator.swift b/iBox/Sources/Shared/Animator/SlideInPresentationAnimator.swift new file mode 100644 index 0000000..f003178 --- /dev/null +++ b/iBox/Sources/Shared/Animator/SlideInPresentationAnimator.swift @@ -0,0 +1,46 @@ +// +// SlideInPresentationAnimator.swift +// iBox +// +// Created by Chan on 4/24/24. +// + +import UIKit + +class SlideInPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning { + let isPresentation: Bool + + init(isPresentation: Bool) { + self.isPresentation = isPresentation + super.init() + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return 0.3 + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + let key = isPresentation ? UITransitionContextViewControllerKey.to : UITransitionContextViewControllerKey.from + guard let controller = transitionContext.viewController(forKey: key) else { return } + + if isPresentation { + transitionContext.containerView.addSubview(controller.view) + } + + let presentedFrame = transitionContext.finalFrame(for: controller) + var dismissedFrame = presentedFrame + dismissedFrame.origin.y = -presentedFrame.height + + let initialFrame = isPresentation ? dismissedFrame : presentedFrame + let finalFrame = isPresentation ? presentedFrame : dismissedFrame + + controller.view.frame = initialFrame + UIView.animate( + withDuration: transitionDuration(using: transitionContext), + animations: { + controller.view.frame = finalFrame + }, completion: { finished in + transitionContext.completeTransition(finished) + }) + } +} diff --git a/iBox/Sources/Shared/SlideInPresentationManager.swift b/iBox/Sources/Shared/SlideInPresentationManager.swift index 71bbf47..6e51d0f 100644 --- a/iBox/Sources/Shared/SlideInPresentationManager.swift +++ b/iBox/Sources/Shared/SlideInPresentationManager.swift @@ -7,105 +7,16 @@ import UIKit -// Presentation Manager 수정 class SlideInPresentationManager: NSObject, UIViewControllerTransitioningDelegate { func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { - return HalfSizePresentationController(presentedViewController: presented, presenting: presenting) + return FullSizePresentationController(presentedViewController: presented, presenting: presenting) } - + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return SlideInPresentationAnimator(isPresentation: true) } - + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return SlideInPresentationAnimator(isPresentation: false) } } - -class SlideInPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning { - let isPresentation: Bool - - init(isPresentation: Bool) { - self.isPresentation = isPresentation - super.init() - } - - func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return 0.3 - } - - func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - let key = isPresentation ? UITransitionContextViewControllerKey.to : UITransitionContextViewControllerKey.from - guard let controller = transitionContext.viewController(forKey: key) else { return } - - if isPresentation { - transitionContext.containerView.addSubview(controller.view) - } - - let presentedFrame = transitionContext.finalFrame(for: controller) - var dismissedFrame = presentedFrame - dismissedFrame.origin.y = -presentedFrame.height - - let initialFrame = isPresentation ? dismissedFrame : presentedFrame - let finalFrame = isPresentation ? presentedFrame : dismissedFrame - - controller.view.frame = initialFrame - UIView.animate( - withDuration: transitionDuration(using: transitionContext), - animations: { - controller.view.frame = finalFrame - }, completion: { finished in - transitionContext.completeTransition(finished) - }) - } -} - -class TransparentTouchView: UIView { - var passThroughArea: CGRect? - - override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { - // 터치 포인트가 passThroughArea 안에 있으면 false를 반환하여 이벤트를 무시 - if let passThroughArea = passThroughArea, passThroughArea.contains(point) { - print("passtrou") - return false - } - return true - } -} - -class PassthroughView: UIView { - var passThroughAreas: [CGRect] = [] - - override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { - for rect in passThroughAreas { - if rect.contains(point) { - return false - } - } - return true - } -} - -class HalfSizePresentationController: UIPresentationController { - private var dimmingView: PassthroughView! - - override func presentationTransitionWillBegin() { - guard let containerView = containerView else { return } - - dimmingView = PassthroughView(frame: containerView.bounds) - dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.4) // 조절 가능 - dimmingView.passThroughAreas = [ - CGRect(x: 0, y: containerView.bounds.height / 2, width: containerView.bounds.width, height: containerView.bounds.height / 2) // 하단 절반 - ] - - containerView.addSubview(dimmingView) - containerView.sendSubviewToBack(dimmingView) - - super.presentationTransitionWillBegin() - } - - override var frameOfPresentedViewInContainerView: CGRect { - guard let containerView = containerView else { return .zero } - return CGRect(x: 0, y: 0, width: containerView.bounds.width, height: containerView.bounds.height / 2) - } -} From e76bf62fc729915f2a9583ef1b5ceac0eff506f6 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:16:26 +0900 Subject: [PATCH 327/370] fix: correct push error page view controller --- iBox/Sources/BoxList/BoxListView.swift | 48 +++++++++-------- .../BoxList/BoxListViewController.swift | 51 ++++++++++++++----- 2 files changed, 66 insertions(+), 33 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListView.swift b/iBox/Sources/BoxList/BoxListView.swift index b94075f..abbaba0 100644 --- a/iBox/Sources/BoxList/BoxListView.swift +++ b/iBox/Sources/BoxList/BoxListView.swift @@ -378,32 +378,40 @@ extension BoxListView: UITableViewDelegate { func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: indexPath as NSIndexPath, previewProvider: { [weak self] () -> UIViewController? in - guard let self = self, let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return nil } - - let id = cellViewModel.id - let url = cellViewModel.url - let name = cellViewModel.name - - let previewViewController: UIViewController - - if let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) { - previewViewController = cachedViewController - } else { - let viewController = WebViewController() - viewController.selectedWebsite = url - viewController.title = name - viewController.id = id - WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) - previewViewController = viewController - } - - return previewViewController + guard let self = self else { return nil } + return self.createOrRetrievePreviewController(for: indexPath) }, actionProvider: { suggestedActions in return self.makeContextMenu(for: indexPath) }) return configuration } + private func createOrRetrievePreviewController(for indexPath: IndexPath) -> UIViewController? { + guard let cellViewModel = self.viewModel?.boxList[indexPath.section].boxListCellViewModelsWithStatus[indexPath.row] else { return nil } + let id = cellViewModel.id + let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) + + if let cachedViewController = cachedViewController, cachedViewController.errorViewController?.isHandlingError == nil { + return cachedViewController + } + + if cachedViewController?.errorViewController?.isHandlingError ?? false { + WebCacheManager.shared.removeViewControllerForKey(id) + } + + let newViewController = createWebViewController(with: cellViewModel) + WebCacheManager.shared.cacheData(forKey: id, viewController: newViewController) + return newViewController + } + + private func createWebViewController(with viewModel: BoxListCellViewModel) -> WebViewController { + let viewController = WebViewController() + viewController.selectedWebsite = viewModel.url + viewController.title = viewModel.name + viewController.id = viewModel.id + return viewController + } + func tableView(_ tableView: UITableView, previewForDismissingContextMenuWithConfiguration configuration: UIContextMenuConfiguration) -> UITargetedPreview? { guard let indexPath = configuration.identifier as? IndexPath, let cell = tableView.cellForRow(at: indexPath) else { return nil diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index bcf0e9b..120d6d6 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -43,6 +43,19 @@ class BoxListViewController: BaseViewController, BaseViewController contentView.viewModel?.input.send(.viewWillAppear) } + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + coordinator.animate(alongsideTransition: nil) { _ in + self.dismissPreviewIfNeeded() + } + } + + func dismissPreviewIfNeeded() { + if let previewVC = self.presentedViewController as? WebViewController { + previewVC.dismiss(animated: true, completion: nil) + } + } + // MARK: - BaseViewControllerProtocol func setupNavigationBar() { @@ -205,21 +218,33 @@ extension BoxListViewController: BoxListViewDelegate { self.present(controller, animated: true) } - func didSelectWeb(id: UUID, at url: URL, withName name: String) { - if let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) { - // 이미 캐시에 존재한다면, 그 인스턴스를 재사용 - navigationController?.pushViewController(cachedViewController, animated: true) - } else { - // 캐시에 없는 경우, 새로운 viewController 인스턴스를 생성하고 캐시에 추가합니다. - let viewController = WebViewController() - viewController.delegate = self - viewController.selectedWebsite = url - viewController.title = name - viewController.id = id - WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) - navigationController?.pushViewController(viewController, animated: true) + let viewController = getOrCreateWebViewController(id: id, url: url, name: name) + navigationController?.pushViewController(viewController, animated: true) + } + + private func getOrCreateWebViewController(id: UUID, url: URL, name: String) -> WebViewController { + let cachedViewController = WebCacheManager.shared.viewControllerForKey(id) + + if let cachedViewController = cachedViewController, cachedViewController.errorViewController?.isHandlingError == nil { + return cachedViewController + } + + if cachedViewController?.errorViewController?.isHandlingError ?? false { + WebCacheManager.shared.removeViewControllerForKey(id) } + + return createAndCacheWebViewController(id: id, url: url, name: name) + } + + private func createAndCacheWebViewController(id: UUID, url: URL, name: String) -> WebViewController { + let viewController = WebViewController() + viewController.delegate = self + viewController.selectedWebsite = url + viewController.title = name + viewController.id = id + WebCacheManager.shared.cacheData(forKey: id, viewController: viewController) + return viewController } func pushViewController(type: EditType) { From 044d552e23e6deaaae318d9662271ed002b1503f Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:18:52 +0900 Subject: [PATCH 328/370] feat: error logic --- .../Error/ErrorPageViewController.swift | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/iBox/Sources/Error/ErrorPageViewController.swift b/iBox/Sources/Error/ErrorPageViewController.swift index 9021bf4..0cc570e 100644 --- a/iBox/Sources/Error/ErrorPageViewController.swift +++ b/iBox/Sources/Error/ErrorPageViewController.swift @@ -20,6 +20,7 @@ protocol WebViewErrorDelegate { class ErrorPageViewController: UIViewController { weak var delegate: ErrorPageControllerDelegate? var webView: WebView? + var isHandlingError = false let slideInPresentationManager = SlideInPresentationManager() @@ -42,6 +43,10 @@ class ErrorPageViewController: UIViewController { setupPresentation() } + override func viewWillDisappear(_ animated: Bool) { + resetErrorHandling() + } + private func setupProperty() { if let errorPageView = view as? ErrorPageView { errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) @@ -75,11 +80,23 @@ class ErrorPageViewController: UIViewController { } } - func handleError(_ error: Error, _ url: URL?) { - configureWithError(error, url: url?.absoluteString ?? "") + guard !isHandlingError else { return } + isHandlingError = true - self.delegate?.presentErrorPage(self) + if presentedViewController != nil { + dismiss(animated: true) { + self.configureWithError(error, url: url?.absoluteString ?? "") + self.delegate?.presentErrorPage(self) + } + } else { + configureWithError(error, url: url?.absoluteString ?? "") + delegate?.presentErrorPage(self) + } + } + + func resetErrorHandling() { + isHandlingError = false } private func convertErrorToViewErrorCode(_ error: Error) -> ViewErrorCode { @@ -128,7 +145,7 @@ class ErrorPageViewController: UIViewController { extension ErrorPageViewController: WebViewErrorDelegate { func webView(_ webView: WebView, didFailWithError error: Error, url: URL?) { - handleError(error, url) + handleError(error, url) let viewErrorCode = convertErrorToViewErrorCode(error) handleViewError(viewErrorCode) From d4de5ab1f07538f2c1e907d8c6927a71463d9b8c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:19:35 +0900 Subject: [PATCH 329/370] feat: error page view --- iBox/Sources/Error/ErrorPageView.swift | 108 +++++++++++++++++-------- 1 file changed, 73 insertions(+), 35 deletions(-) diff --git a/iBox/Sources/Error/ErrorPageView.swift b/iBox/Sources/Error/ErrorPageView.swift index b112b36..1338548 100644 --- a/iBox/Sources/Error/ErrorPageView.swift +++ b/iBox/Sources/Error/ErrorPageView.swift @@ -12,40 +12,48 @@ import SnapKit class ErrorPageView: UIView { private var imageViews: [UIImageView] = [] private let images = ["fox_page0", "fox_page1", "fox_page2", "fox_page3", "fox_page4"] - private var timer: Timer? + var timer: Timer? private let backPannelView = UIView().then { $0.backgroundColor = .backgroundColor - $0.layer.cornerRadius = 20 - $0.clipsToBounds = true } private let messageLabel = UILabel().then { $0.textAlignment = .center $0.numberOfLines = 0 + $0.lineBreakMode = .byTruncatingTail } - private let backButton = UIButton().then { + private let problemLabel = UILabel().then { + $0.textAlignment = .center + $0.numberOfLines = 0 + $0.text = "해당 주소에서 문제가 발생했습니다." + } + + let backButton = UIButton().then { $0.setTitle("나가기", for: .normal) $0.backgroundColor = .box2 $0.setTitleColor(.white, for: .normal) $0.layer.cornerRadius = 10 + $0.addAnimationForStateChange(from: .box, to: .box2) } - private let retryButton = UIButton().then { + let retryButton = UIButton().then { $0.setTitle("새로고침", for: .normal) - $0.backgroundColor = .box2 + $0.backgroundColor = .systemGray $0.setTitleColor(.white, for: .normal) $0.layer.cornerRadius = 10 + $0.addAnimationForStateChange(from: .box, to: .systemGray) } - private let closeButton = UIButton().then { + let closeButton = UIButton().then { $0.setTitle("닫기", for: .normal) - $0.backgroundColor = .box2 + $0.backgroundColor = .systemGray $0.setTitleColor(.white, for: .normal) $0.layer.cornerRadius = 10 + $0.addAnimationForStateChange(from: .box, to: .systemGray) } - + override init(frame: CGRect) { super.init(frame: frame) setupProperty() @@ -55,21 +63,35 @@ class ErrorPageView: UIView { changeImages() } + override func willMove(toSuperview newSuperview: UIView?) { + super.willMove(toSuperview: newSuperview) + + if newSuperview == nil { + timer?.invalidate() + timer = nil + } + } + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + override func layoutSubviews() { + super.layoutSubviews() + backPannelView.roundCorners([.bottomLeft, .bottomRight], radius: 20) + } + private func setupProperty() { - backgroundColor = .clear - changeImages() } private func setupHierarchy() { - addSubview(messageLabel) - addSubview(retryButton) - addSubview(closeButton) - addSubview(backButton) + addSubview(backPannelView) + backPannelView.addSubview(retryButton) + backPannelView.addSubview(closeButton) + backPannelView.addSubview(backButton) + backPannelView.addSubview(problemLabel) + backPannelView.addSubview(messageLabel) } private func setupAnimation() { @@ -85,47 +107,60 @@ class ErrorPageView: UIView { private func setupLayout() { - imageViews.forEach { imageView in - imageView.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.top.equalToSuperview().offset(UIScreen.main.bounds.height * 0.3) - make.leading.greaterThanOrEqualToSuperview().offset(20) - make.trailing.lessThanOrEqualToSuperview().offset(-20) - make.width.height.equalTo(32) - } + backPannelView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.trailing.leading.equalToSuperview().inset(20) + make.height.equalToSuperview().multipliedBy(0.5) } - messageLabel.snp.makeConstraints { make in - make.top.equalTo(imageViews[0].snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.leading.greaterThanOrEqualToSuperview().offset(20) - make.trailing.lessThanOrEqualToSuperview().offset(-20) - } - retryButton.snp.makeConstraints { make in - make.top.equalTo(messageLabel.snp.bottom).offset(20) + make.bottom.equalToSuperview().inset(10) make.centerX.equalToSuperview() make.width.equalTo(100) make.height.equalTo(44) } - + closeButton.snp.makeConstraints { make in make.leading.equalTo(retryButton.snp.trailing).offset(20) make.centerY.equalTo(retryButton.snp.centerY) make.width.equalTo(100) make.height.equalTo(44) } - + backButton.snp.makeConstraints { make in make.trailing.equalTo(retryButton.snp.leading).offset(-20) make.centerY.equalTo(retryButton.snp.centerY) make.width.equalTo(100) make.height.equalTo(44) } + + problemLabel.snp.makeConstraints { make in + make.bottom.equalTo(retryButton.snp.top).offset(-10) + make.leading.equalToSuperview().offset(20) + make.trailing.equalToSuperview().offset(-20) + } + + messageLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(problemLabel.snp.top).offset(-10) + make.leading.equalToSuperview().offset(20) + make.trailing.equalToSuperview().offset(-20) + } + + imageViews.forEach { imageView in + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(safeAreaLayoutGuide).offset(10) + make.bottom.equalTo(messageLabel.snp.top).offset(-10) + make.leading.greaterThanOrEqualToSuperview().offset(20) + make.trailing.lessThanOrEqualToSuperview().offset(-20) + make.width.height.equalTo(32) + } + } } func configure(with error: Error, url: String) { - messageLabel.text = "\(url)\n해당 주소에서 문제가 발생했습니다." + messageLabel.text = "\(url)" print(error.localizedDescription) } @@ -133,7 +168,10 @@ class ErrorPageView: UIView { var currentIndex = 0 timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] timer in - guard let self = self else { return } + guard let self = self else { + timer.invalidate() + return + } let state = AppStateManager.shared.currentViewErrorState From dba089efc28f8b30ed683a60619edcb7c61a0b97 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:19:51 +0900 Subject: [PATCH 330/370] feat: uibutton animate --- .../Extension/UIButton+Extension.swift | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/iBox/Sources/Extension/UIButton+Extension.swift b/iBox/Sources/Extension/UIButton+Extension.swift index 90a8903..16dee87 100644 --- a/iBox/Sources/Extension/UIButton+Extension.swift +++ b/iBox/Sources/Extension/UIButton+Extension.swift @@ -5,4 +5,51 @@ // Created by Chan on 4/25/24. // -import Foundation +import UIKit +import ObjectiveC + +private var touchDownColorKey: UInt8 = 0 +private var touchUpColorKey: UInt8 = 0 + +extension UIButton { + var touchDownColor: UIColor? { + get { + return objc_getAssociatedObject(self, &touchDownColorKey) as? UIColor + } + set { + objc_setAssociatedObject(self, &touchDownColorKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + var touchUpColor: UIColor? { + get { + return objc_getAssociatedObject(self, &touchUpColorKey) as? UIColor + } + set { + objc_setAssociatedObject(self, &touchUpColorKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + func addAnimationForStateChange(from: UIColor, to: UIColor) { + self.touchDownColor = from + self.touchUpColor = to + addTarget(self, action: #selector(animateOnTouchDown), for: .touchDown) + addTarget(self, action: #selector(animateOnTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel]) + } + + @objc private func animateOnTouchDown() { + if let color = touchDownColor { + UIView.animate(withDuration: 0.3) { + self.backgroundColor = color + } + } + } + + @objc private func animateOnTouchUp() { + if let color = touchUpColor { + UIView.animate(withDuration: 0.3) { + self.backgroundColor = color + } + } + } +} From 6709b974c102361963658ac0ea03ed23d4c74885 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:20:02 +0900 Subject: [PATCH 331/370] feat: pannel view back layer --- iBox/Sources/Extension/UIView+Extension.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/iBox/Sources/Extension/UIView+Extension.swift b/iBox/Sources/Extension/UIView+Extension.swift index 890082d..e7f584c 100644 --- a/iBox/Sources/Extension/UIView+Extension.swift +++ b/iBox/Sources/Extension/UIView+Extension.swift @@ -30,6 +30,16 @@ extension UIView { } } + func roundCorners(_ corners: UIRectCorner, radius: CGFloat) { + DispatchQueue.main.async { // 확실히 메인 스레드에서 실행되도록 강제 + let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) + let mask = CAShapeLayer() + mask.path = path.cgPath + mask.frame = self.bounds + self.layer.mask = mask + } + } + // MARK: - 뷰 계층 구조 log func printViewHierarchy(level: Int = 0) { let padding = String(repeating: " ", count: level * 2) @@ -40,4 +50,5 @@ extension UIView { subview.printViewHierarchy(level: level + 1) } } + } From bf42e41b5b2aaf2fa9ccf64b3d0e51c480dbb811 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:20:11 +0900 Subject: [PATCH 332/370] chore: delete comment --- iBox/Sources/Shared/AppStateManager.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/iBox/Sources/Shared/AppStateManager.swift b/iBox/Sources/Shared/AppStateManager.swift index 34e12bf..10f8b22 100644 --- a/iBox/Sources/Shared/AppStateManager.swift +++ b/iBox/Sources/Shared/AppStateManager.swift @@ -13,7 +13,6 @@ class AppStateManager { @Published var versionCheckCompleted: VersionCheckCode = .initial var currentViewErrorState: ViewErrorCode = .normal - // 여기서 오류 상태를 업데이트하면 됩니다. func updateViewError(_ error: ViewErrorCode) { currentViewErrorState = error } From c97a47c1b8c526ba1b34f8b3b93cad579c1d27f0 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Thu, 25 Apr 2024 03:20:29 +0900 Subject: [PATCH 333/370] fix: errorviewcontroller nil --- iBox/Sources/Web/WebViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index e6abd3e..b872a1a 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -47,9 +47,9 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol deinit { AppStateManager.shared.currentViewErrorState = .normal + errorViewController = nil } - // MARK: - BaseViewControllerProtocol func setupNavigationBar() { From 786e8962c1c6217cf1dba8afee11e68393f226cf Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 25 Apr 2024 20:21:11 +0900 Subject: [PATCH 334/370] =?UTF-8?q?chore:=20Project=EB=82=B4=20destination?= =?UTF-8?q?s=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.swift b/Project.swift index 1c90680..7e20388 100644 --- a/Project.swift +++ b/Project.swift @@ -87,7 +87,7 @@ class iBoxFactory: ProjectFactory { func generateTarget() -> [ProjectDescription.Target] { let appTarget = Target( name: projectName, - destinations: [.iPhone], + destinations: .iOS, product: .app, bundleId: bundleId, deploymentTargets: .iOS(iosVersion), @@ -99,7 +99,7 @@ class iBoxFactory: ProjectFactory { let shareExtensionTarget = Target( name: "\(projectName)ShareExtension", - destinations: [.iPhone], + destinations: .iOS, product: .appExtension, bundleId: "\(bundleId).ShareExtension", deploymentTargets: .iOS(iosVersion), From 6b869600f4c2fa64de90fd5ebb536d91a4b130e9 Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 25 Apr 2024 20:26:02 +0900 Subject: [PATCH 335/370] chore: remove needless assets --- .mise.toml | 2 ++ .../42box3/42box_1.imageset/42box_1.png | Bin 1356 -> 0 bytes .../42box3/42box_1.imageset/Contents.json | 21 --------------- .../42box3/42box_2.imageset/42box_2.png | Bin 1430 -> 0 bytes .../42box3/42box_2.imageset/Contents.json | 21 --------------- .../42box3/42box_3.imageset/42box_3.png | Bin 1494 -> 0 bytes .../42box3/42box_3.imageset/Contents.json | 21 --------------- .../42box3/42box_4.imageset/42box_4.png | Bin 1503 -> 0 bytes .../42box3/42box_4.imageset/Contents.json | 21 --------------- .../42pack_icon/42box3/Contents.json | 6 ----- .../42box_oc1.imageset/42box_opend_black.png | Bin 1802 -> 0 bytes .../42box_oc/42box_oc1.imageset/Contents.json | 21 --------------- .../42box_oc2.imageset/42box_closed_black.png | Bin 1654 -> 0 bytes .../42box_oc/42box_oc2.imageset/Contents.json | 21 --------------- .../42pack_icon/42box_oc/Contents.json | 6 ----- .../42flip/42flip_01.imageset/42flip_01.png | Bin 4224 -> 0 bytes .../42flip/42flip_01.imageset/Contents.json | 24 ------------------ .../42flip/42flip_010.imageset/42flip_010.png | Bin 4151 -> 0 bytes .../42flip/42flip_010.imageset/Contents.json | 24 ------------------ .../42flip/42flip_011.imageset/42flip_011.png | Bin 4380 -> 0 bytes .../42flip/42flip_011.imageset/Contents.json | 24 ------------------ .../42flip/42flip_02.imageset/42flip_02.png | Bin 4311 -> 0 bytes .../42flip/42flip_02.imageset/Contents.json | 24 ------------------ .../42flip/42flip_03.imageset/42flip_03.png | Bin 3937 -> 0 bytes .../42flip/42flip_03.imageset/Contents.json | 24 ------------------ .../42flip/42flip_04.imageset/42flip_04.png | Bin 3596 -> 0 bytes .../42flip/42flip_04.imageset/Contents.json | 24 ------------------ .../42flip/42flip_05.imageset/42flip_05.png | Bin 4118 -> 0 bytes .../42flip/42flip_05.imageset/Contents.json | 24 ------------------ .../42flip/42flip_06.imageset/42flip_06.png | Bin 4262 -> 0 bytes .../42flip/42flip_06.imageset/Contents.json | 24 ------------------ .../42flip/42flip_07.imageset/42flip_07.png | Bin 4254 -> 0 bytes .../42flip/42flip_07.imageset/Contents.json | 24 ------------------ .../42flip/42flip_08.imageset/42flip_08.png | Bin 4251 -> 0 bytes .../42flip/42flip_08.imageset/Contents.json | 24 ------------------ .../42flip/42flip_09.imageset/42flip_09.png | Bin 3426 -> 0 bytes .../42flip/42flip_09.imageset/Contents.json | 24 ------------------ .../42pack_icon/42flip/42flip/Contents.json | 6 ----- .../42pack_icon/42flip/Contents.json | 6 ----- .../42pack_icon/cat/Contents.json | 6 ----- .../cat/cat_page0.imageset/Contents.json | 24 ------------------ .../cat/cat_page0.imageset/cat0.png | Bin 4387 -> 0 bytes .../cat/cat_page1.imageset/Contents.json | 24 ------------------ .../cat/cat_page1.imageset/cat1.png | Bin 4423 -> 0 bytes .../cat/cat_page2.imageset/Contents.json | 24 ------------------ .../cat/cat_page2.imageset/cat2.png | Bin 4367 -> 0 bytes .../cat/cat_page3.imageset/Contents.json | 24 ------------------ .../cat/cat_page3.imageset/cat3.png | Bin 4403 -> 0 bytes .../cat/cat_page4.imageset/Contents.json | 24 ------------------ .../cat/cat_page4.imageset/cat4.png | Bin 4338 -> 0 bytes .../42pack_icon/gam/Contents.json | 6 ----- .../gam/gam_1.imageset/Contents.json | 21 --------------- .../42pack_icon/gam/gam_1.imageset/gam_1.png | Bin 7100 -> 0 bytes .../gam/gam_2.imageset/Contents.json | 21 --------------- .../42pack_icon/gam/gam_2.imageset/gam_2.png | Bin 7147 -> 0 bytes .../gam/gam_3.imageset/Contents.json | 21 --------------- .../42pack_icon/gam/gam_3.imageset/gam_3.png | Bin 7291 -> 0 bytes .../gam/gam_4.imageset/Contents.json | 21 --------------- .../42pack_icon/gam/gam_4.imageset/gam_4.png | Bin 6947 -> 0 bytes .../gam/gam_5.imageset/Contents.json | 21 --------------- .../42pack_icon/gam/gam_5.imageset/gam_5.png | Bin 6800 -> 0 bytes .../42pack_icon/gon/Contents.json | 6 ----- .../gon/gon_1.imageset/Contents.json | 21 --------------- .../42pack_icon/gon/gon_1.imageset/gon_1.png | Bin 7228 -> 0 bytes .../gon/gon_2.imageset/Contents.json | 21 --------------- .../42pack_icon/gon/gon_2.imageset/gon_2.png | Bin 7158 -> 0 bytes .../gon/gon_3.imageset/Contents.json | 21 --------------- .../42pack_icon/gon/gon_3.imageset/gon_3.png | Bin 6617 -> 0 bytes .../gon/gon_4.imageset/Contents.json | 21 --------------- .../42pack_icon/gon/gon_4.imageset/gon_4.png | Bin 7188 -> 0 bytes .../gon/gon_5.imageset/Contents.json | 21 --------------- .../42pack_icon/gon/gon_5.imageset/gon_5.png | Bin 7507 -> 0 bytes .../42pack_icon/gun/Contents.json | 6 ----- .../gun/gun_1.imageset/Contents.json | 21 --------------- .../42pack_icon/gun/gun_1.imageset/gun_1.png | Bin 6413 -> 0 bytes .../gun/gun_2.imageset/Contents.json | 21 --------------- .../42pack_icon/gun/gun_2.imageset/gun_2.png | Bin 5862 -> 0 bytes .../gun/gun_3.imageset/Contents.json | 21 --------------- .../42pack_icon/gun/gun_3.imageset/gun_3.png | Bin 6110 -> 0 bytes .../gun/gun_4.imageset/Contents.json | 21 --------------- .../42pack_icon/gun/gun_4.imageset/gun_4.png | Bin 6610 -> 0 bytes .../gun/gun_5.imageset/Contents.json | 21 --------------- .../42pack_icon/gun/gun_5.imageset/gun_5.png | Bin 6727 -> 0 bytes .../42pack_icon/lee/Contents.json | 6 ----- .../lee/lee_1.imageset/Contents.json | 21 --------------- .../42pack_icon/lee/lee_1.imageset/lee_1.png | Bin 7149 -> 0 bytes .../lee/lee_2.imageset/Contents.json | 21 --------------- .../42pack_icon/lee/lee_2.imageset/lee_2.png | Bin 7409 -> 0 bytes .../lee/lee_3.imageset/Contents.json | 21 --------------- .../42pack_icon/lee/lee_3.imageset/lee_3.png | Bin 7445 -> 0 bytes .../lee/lee_4.imageset/Contents.json | 21 --------------- .../42pack_icon/lee/lee_4.imageset/lee_4.png | Bin 7031 -> 0 bytes .../lee/lee_5.imageset/Contents.json | 21 --------------- .../42pack_icon/lee/lee_5.imageset/lee_5.png | Bin 6605 -> 0 bytes .../AppIcons/appstore.imageset/Contents.json | 21 --------------- .../AppIcons/appstore.imageset/appstore.png | Bin 47451 -> 0 bytes .../Logo/1024.imageset/1024 1.png | Bin 193380 -> 0 bytes .../Logo/1024.imageset/1024.png | Bin 193380 -> 0 bytes .../Logo/1024.imageset/Contents.json | 22 ---------------- .../Logo/256.imageset/256 1.png | Bin 22350 -> 0 bytes .../Assets.xcassets/Logo/256.imageset/256.png | Bin 22350 -> 0 bytes .../Logo/256.imageset/Contents.json | 22 ---------------- .../Assets.xcassets/Logo/32.imageset/32 1.png | Bin 1196 -> 0 bytes .../Assets.xcassets/Logo/32.imageset/32.png | Bin 1196 -> 0 bytes .../Logo/32.imageset/Contents.json | 22 ---------------- .../Logo/512.imageset/512 1.png | Bin 67765 -> 0 bytes .../Assets.xcassets/Logo/512.imageset/512.png | Bin 67765 -> 0 bytes .../Logo/512.imageset/Contents.json | 22 ---------------- .../Assets.xcassets/Logo/64.imageset/64 1.png | Bin 2884 -> 0 bytes .../Assets.xcassets/Logo/64.imageset/64.png | Bin 2884 -> 0 bytes .../Logo/64.imageset/Contents.json | 22 ---------------- 111 files changed, 2 insertions(+), 1115 deletions(-) create mode 100644 .mise.toml delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_2.imageset/42box_2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_3.imageset/42box_3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/42box_4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/42flip_010.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/42flip_02.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/42flip_05.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/42flip_07.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_07.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/42flip_08.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/42flip/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page0.imageset/cat0.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page1.imageset/cat1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page2.imageset/cat2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page4.imageset/cat4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_2.imageset/gam_2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_5.imageset/gam_5.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_1.imageset/gon_1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_2.imageset/gon_2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_4.imageset/gon_4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_5.imageset/gon_5.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_3.imageset/gun_3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_4.imageset/gun_4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_5.imageset/gun_5.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_3.imageset/lee_3.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_5.imageset/lee_5.png delete mode 100644 iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/256 1.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/32.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/32.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/512 1.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/512.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/512.imageset/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/64 1.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/64.png delete mode 100644 iBox/Resources/Assets.xcassets/Logo/64.imageset/Contents.json diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..b05dc4f --- /dev/null +++ b/.mise.toml @@ -0,0 +1,2 @@ +[tools] +tuist = "3.36.2" diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_1.imageset/42box_1.png deleted file mode 100644 index edca1199a7a942f577ab79fa9ccdeb0d8445095a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1356 zcmV-S1+)5zP)YAX9X8WNB|8RBvx=!KdMT000En zNkl`YJF zG1>piWY767XMQ<*<~wJ0MJYvI*^)dMXXU}TNIMvFgT#OmtwA-Zps0WqP0M~0C3`$h+#Qm#sE1=0<4&UIXT938+y5YJ3@&>n~A} zYWfJ+B8Sz8tB(#a<|cUt*k_F)S}G7mrH;|%mngM$9S54_E%ld^-?YG(4N?f~2lj*x zGJ`5AWT>Qu`IT2Fb}=~tY?e3Fu)QNR7_(7IfH#3Hp#sdX78Eg9Q$e{DQ0Qa&DbOef zr@{#Z#@sA%;3#l+VCPv-X)yy;aS{jxIl6oXG)TAlbD|+I7_(Vwfn&g`K#sGdic)?` z#HmCAuXm?_26=c@>GG7-b={0rUae<*~^{cS4?E)LvPH;sV0L zkcnqjSAi=Gatm>a0(-v>81jg6+&6iH>5?8`SKyShrEh_8lEg^JT3}wzo-YC&Ys&Bh+b zo;&UL9i$(ui!#6fl!L4T7Gya84eBJ;ECWLhgaPxm#DH&zXc5NT|*d1}r%1 zvEU4W`oy}XWXMZlz#Ne-;OS`$eMY7Ffr}XpH#mR+>ua?Z)M>1*+@uWY3JRuA76J#z zoQS_u&k(Bvjee#y4CkH|kQotBo$|3u%m2O7VQa>Cm6Ew-!egQE=<`#ZFPIBJ6Km90LBjfjIU4OXhFX${ zE0`})Y~ofm5Hzemn7)XEao=4Z2exsu^^!iQ{K0%2aWG3A!Sn*HtW=|6!}^0c8F4U` zSztPWXSr#5zoGL7b2{Q+CeM7wfG4O`uj&Zv59Un7!C0?PV!*>xs}FRA^#^k{;$W`F z1a?xXKGzx6AIv$q4Y*HdQmwjc4aUji59!MG?7#zlEBF8U9{d<(mHCR36C O0000YAX9X8WNB|8RBvx=!KdMT000Fc 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 FV1kXju#*4) diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json deleted file mode 100644 index 9352958..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/42box_4.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42box_4.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42box3/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/42box_opend_black.png deleted file mode 100644 index 2099048c8dd41251b6561c9cace69d63601efc69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1802 zcmV+l2le=gP)YAX9X8WNB|8RBvx=!KdMT000J+ zNkl1v3St+!*ZCSBMOIxUN6HshXKq+d1N-v}sL1F~aiVRQzl@tjm zmk3F%Mp2=~c!`QP5DmeWD8{G(0>JZDu^`2<@jTkz0Xc}JJk8n_s{Nr z=ewNq7KP%Jg-@5_d`!Fb9f7uW&}h%2z2l-`Zw8E!I> zxYxUFK(V~4&O)4EJon2mpboe$&Z6z2jP9IBchif+ZUU!)`=m`OtSGFMNqkUG$p0__bBmdH&7}IR6|H!Gce~XWWo6s%3Cq7 zM8x0OO9@S8UlFAcr2_c?CE{xh%bS)(hSNoA0@VQOfd}Quz@mFuF~O)6(gVfs2+0W+ zzOrft{-Tk=xN*iE{SKhXV=C%%Q*1ERvKDwE?vm}L!@wmPaFHPez*Vh|Tn;SdLF2(2 zf>EzYKClZ+H%R}F8i9jAIt@SusURbXy$UMe80(m&rkJIV3P!CJLBFq$N~qHoNboN? zk+w^~PT&II_JILN1@CBZc8QYkUr@V%lW0<-)|%Fj3g$hTD)3%}-JsJF)GlG4(FSJZ z6P_o$wmTlN|t4u~}c7SC{HdPj7)8N8yzsxaft#TmUp#Yz3HEHV2av z05fbAJW~h{4}+skFuzX!oH!JQXF;L9&S;#7sKI&u=Qv7=CIy; ztO>HxU~VCd?hAk>Pgw!xX`6$|)4^;#1dqHASn^go&abv z+X^t1HV1Qq4rbYAc%crwmvnR4&ERmr{^L+P1@7wakI-bg6<`+G8;tbV!IZ6nO?v|N zvV6$y4&`^k&@A2N8>uE!tpKys7)*;7K0W{rfysm6su)MlXPV)Y1JK(ACH-P|Djr`M zpo1x{g8F>{`-I`Jel9p8AAvO{TLET;F&J$Vyt!NdUNHh*D>2S9vKDq7*T1hVgXsm< z_{u;XOwkJ1vIi#L0Y^?k_BHT%Wz-Oj`>g;|Z473}%kY!$K=77K_;GIZ94%f*SroYb zrxn0EliKbJL131`plo>YQ5d}ddZxq1g;7H^N~{30${5U=Z7^peh(OIGczlF$o>?29 zb~~hWhPoM0m}l%edjr&Lhvd#sKLf_(MLwzf2jBy<;~$}K z4ymH_Gcw-5H~gR~mfa{$z`u_PuG!oIT|$pI8-X%zQ`=&6HALp`mDcMs#_%F z^@bH`&B5%pIT-!*i3@m`Z1uTSY0bgxwKcKg#Z8m diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json deleted file mode 100644 index c464fb3..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc1.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42box_opend_black.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/42box_closed_black.png deleted file mode 100644 index 5e541ee631bd543d12b84d40ca23e120ce176279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmV-+28sEJP)YAX9X8WNB|8RBvx=!KdMT000I7 zNklbeYIFhC|nurqkB6Z^B<@Cn_m+QTISMXpvBfmdj_nhDP z?e1rmbCRc)&O2g3aSlB0jJ5QBcO>Sxyo#S5*RsId;lx~#A6pzABEiG zPx5G6vS0Nua;ESEmIJYsE>g8|mz&%qkLSv@RV|F1BWeK~f#H=ZP}L#HA(LYAY4T7{ z)xpRaB9wf7;Q@6kJorgO4f4205d|(k1gZu`&J$tek&4ZdlPuKaU#{Uv5#9zF>S5$k zF@^%xQHo12OA!4ved%JHR3}aun1|%Pab%{4UW->V&|^p>rl@NUTz40 zCbp=8*(tsOqOs=3vE(*c@*vGzb#A@_SVNGmO0kdAj;?F1G_V%=&BuFI1 zCEFDZQS#NJWZPatmfZ^ub>$WAbBJJ9#g?6e)GXM49a09st4#sW#PhSYEvPztl|X@IHY3^Vd4c%>;E&W3R)_a%u@XY8z-LF{ z)I_~&>sgq8NZ(KU8@l@gpoxVlVBWPjOrRZR@^1aHc*Rh?YsNk}ngPoOLy--_f&tLP zToo{rEDjT7hv~E&W`@DoPLPoc?#YDB7lS!@iW?Sj=O^zF$#;L9P#b$TYk@l1Vt zRRqLzRg){)=rDs9!@iRc*&8lqL107J5$AG<#t0QKOO0XLe-6KA>)W0E;n%6IYZThR zXO8{ne|%S1JL>Usp&ZNtXd4KhPJlkMphp;yUE*k041nICMM=W>X~ zYbsz8+)uulx%%R)e?7B9!NnZ#^MM9F>T*lxnDT8sCqwf_kTl;Z-3AP$zuaebd~=v@ zMI3^7$CYXO>w<^dq|`SY@@2UJ?%EzD|Diq+>I^e_A$&9*S_e5)$OEG2Ew>vS)gjDb zHi$R@@ugYiFWAL-I*&KVEq|Suv>S~RQ1%>C{+RiN@QmYo(px|T-Q{67r|J;quTPTn zJEl@ELmZBTn~B0rpIL-B!#os!0Ym8`(<@Te9A=lbAMgk!8(|2OhGZ}=%B+f(HHX=2 zahM>(J0=x)ix=eG%9J&SIbd;^<}P720MWFPg_SL94)e3cVf>w7;(^(;e7wJ*Glw~9 zaTxoWuML<+u>4v@S#y{Z7KhPapZEe}36wijl{JSsWpS8iIS0hxFOR4!YYuZpyae=B zc~GU%kRNC&GgOzY{$B!vsD?3!Y8Zp4hB1i$02wW^yWcP5>Hq)$07*qoM6N<$f>1#7 AwEzGB diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json deleted file mode 100644 index ebc93da..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/42box_oc2.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42box_closed_black.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42box_oc/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_01.imageset/42flip_01.png deleted file mode 100644 index 4ca84f74fdacbca5a03ed6fa9a93b264d06a3f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600oRmL_t(|ob8)ih*f12$A4=a zk(@*;Dk#%x66`4ovkOHtGMNySA*6*#);KecTF{Lk>aDAVT`Vf{k~SGgT4dQv4_%B% zjiRR>(yXAGbYwI&%{i-wwYToJ`<(Cl&YXRi!TpEB*|TST>s#~N>$~p}Ri%)>qyQGC z0$895V1X)t1*!lRr~+7^aswtJ7Xx#Ekw9EYx$h&udR6@~0b&UDzv z*S%4lM}q#YJb*>8)&ZAzm>&jS0v=Pj8Eb}9aKri+cmsGyRS#A0SqWGl&;e{z)sl#eVz>YkkqfcRx(Yv7 zZvqdi>fa8(<$(2J{ndI^Ek(AWz_tUebq6LQ=L2hiYjDFF09FDIs_H%u-&w%+0!x5( zF|5dT6tEd+^$flKz(iy`&;wkHAFQ{5CB8vs0P6=9W3UENwnH0O1Zxe@f?o&U1Kg*o z{Q-4!1Ir`-{a9x8Br_{v8wzY2Fs&}YMC4px70`xXW~~G6Rn@(L^~AvT0rvxMr86sG zTMe*QS3i0}J)yuv6au4(PVRoqMp5VG%z@n$T z0+@*(tj!p#KSP75Mj~!Vuo3Gfc2`|zIbb3(7I+P~4ZqC#6qu)~zgHVfh@#Bu0j|WaPyG;R9}Fxg158B5 z0Ivdf;0Nn7;7(QjZ7{+3N<=0A?*Lch2Wu0sKvjDOU3VH-1Zz1k7e82^19R&LYa+JL z_gTBfnblDXSdao1!Fmyx2aIr(Rp2XNPMtGrEq-g)IJ4SoIa(hBCL&G13&4E*V0{hT zuBy9g6-*^X%dxfitzBbS9km{SL{$-y(ZF-qhMWr)*erRrs_v|1Fy$m7=U~gRY50xS zF|0po9t$uUSPFFF2WvYptB#o!0;_~gn(xVL(k#F-Y>%nY!+s~$WPjqsBP=rRxxSOv zhtdZjB62p?41IP*6x(ra&m*&r#RU8UoabqO5Zh`|{(r`obzSaWIh$3$Qca9PBGL}L zj(fC@W1FF>U$_iKWCU;>uqA!8=PV2S3XBgal#`yv4n>l{k{gIF9l&-UzNus+B8}L2 zz%9T{S;u=7%M+Gic`A2cA~F(K1UvzJ544@^z*<#xYt}ELX1ExG)r8Fk2t3VkSO8mq=>@O^umr3pfm2iVRRjAOm>5zhCuIR! zguSd13@mDfomew$%CN5**bXeivV!snw36=-)eKmaS)EujOlMZCs)5anoC-EUl*FgO zah?87UY~-EN@sY+QVU=$z<0P|0ep!8EBi7`mhyZ9aU6E`=W~h!wE@-!Tn0QtWmqr- zfsMr$>Vp9`8+ZiU6v)c_WM&`64nt-GW2oFB1bdjb4mDugfQvkfWC3d+ds85taq-WZ zxOVl)B~|^$Gq&RnhBC0Br~+7^3SfaMfCZ`m7N`PPpz;Q`6`15%qyUDUUB(&anyoLx zUPV7?fi(h`Vmk#5WUoJy_jjo354i+WLlyu27pMYQpbB7tDu4y502ZhMSfC1Ef%*@# W!b-OItQG430000f6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600l!yL_t(|obB6NjNMfg$MMge zX@O!3DVTu50}xDsq!KihBAB#N!$m@j!5ChIUQ%$f&VnR$bCWsG6yaZBXgrFoP zB>I42R4Q^4c;ND4BD6({TqG?v0j?mg<1D)IkBPlu}SIR{b8s5*&foBVuwSzAPlLQpz%X z6f5unESErjjY(XKGaLKz#uoTU^ZzpJ#U~=-m676Lje&W?y@s&+kKYq35e9xbIT!B(78^*!W)U5;PMRHCQf;&XNKSpkC!B4T3E z0c#%kcV^~R`|yQ`xOZ0D@uuz1BjV1g|Dpo61`nE6Ij>p!e9+dgjzWw)l&lsP_ z-KNu#DY-f~57O6p{TMc|CbIno7gpveTon<&XfehXTw0m`iI0z}4)(4uBLH@m%X%k7VVvr;wZf4gEZ9GsgF@$#lSY3+G0} zlY{kmehnMgiFgbjs?57^UPL_G=NQM}Z#bng{{a_A#KfR{?N`GFwoz6g#wznY_+pFA z{&HEi?u{{tD0@hRiD+^9uaR0@)-{3Yl8*?|TqzUsDD;fX`g`gDdkxp)a0zBR zUTFI7#bm#?O@q|1&XP+sD{HPQLUXiv)_#DEx>nz>7Wy-;9k5oDcfeXs-T`Ylc?YcJ zaNDAV0Esm^=l%AT$3>5wT~%9GgQ64eUtyU85cHDD(#Q zEyR(hUmXc3Wv3AXYiHt+xd002ovPDHLkV1jix B^_~C# diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json deleted file mode 100644 index 1adb61c..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_010.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42flip_010.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_011.imageset/42flip_011.png deleted file mode 100644 index 2a961936819cf97a6d4994eb6775dad0122cb5b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4380 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600rYoL_t(|ob8)yh*eb-$A4?a zaeR%BG$^66d=*4grXNIm*{G#SLy-wqNQDtmSwTV3gPw$uQ3*ZtOAp90dr&?oC`v1^ z(uz>Ahh-!=Hb#xFd8|IHbD7hbySHcGd*(LR&L1}S+{@Z~?en|)tiAT$_ll~LE4?HK z7N#6npmJb=%7Fzc2NtM`0TYp$=u)+czom)*6OjqP-9Qb{<|v;4D+(}0wzce8Uaal01p8VsA_wnz6+QF%Yhq!Q-IGnLV!&L-T+2;%-#g%t7>bJ`YvGW zflE}iSwv0;KBd}$iO5J`HE^28Y%4HbReyH0Q4H8lV3w+W9obYrFcIkoECc4@j$19j z<*NF=r=29Q{lJx~x-w>y7T82p{XX?gc$6uyDA!s9JVNnc4HmHP1eU03r>Ct(Y<8`~ zV%@{Q{i@m#v#EMu(}7okp$-!TUIZ4Z>Vd0Yw_oJ|6Ol2%THqv)*?Qn&Rc$HRQE}fRfVY6j z99?ZmVslY^}0eB6V;W7IaTU38rk`uS@dSEHA0C%nj@DXsSs_x0mcPYR` zqz-rxxEUg4=g`${w6Yv<&$78x38`)btHsSt5fklhzxxfp+K!;f;mb~7V zTvV4U5xEd}1$V9o7U<^#YqH*~ECtx9SfD-5W40QYtEzvM(YIp0$6>kI7?0T@;11xa z_^KeYK7;@hkzrV%o$4{$23(X?q8Rf%6j%wI?=kBHo(FEuD#&;1M_OPa(ieCf+lO++ zt-ZiJRb7)!_kw%_d;nabs?AyY|5snq0E^<*0xX|$C5i1=0=w9^s1EL+`MwT#(&HO! zWH+hmcUk!^+Mkrb&H~;6j&YbMumYPEGkp|9WD2&?INW3QCpHnS>**7z!vc$9$68>L z$Lt$mHkNlOU55~WovW49Ig#Umb-;L!Sz&*FX_h0~*{2l1#sXjAP9Xq(#2$%#*hXKg zqwJ5_B+EWvSL~Rr0b6{}@%Zfoo&#>_sUV+JR=|p>Si_yM(vi5{jLok5BfsYXYw)iV zw*Y6W>TXZ}1xg>~-P-FxV4>O!Ojgx>k>A1wqA#1@0G#VOq>W(B0X|Q&2bV@^fQvhzb`mS) zDhX^lwlfg|Y#O%WI4WjSabSIbkwAZJE!Q7tC{hMTuY+RO4N;u|z$n~@yHF-D5gCsK z`Ed!G$^r{&%pQsO=&QkQcsMpnM|-N53=I2%UXQMm>b=06PDBO+8?j?Emr4aT1Kaw! zmf~AK&A=I|y0e6?cT=T+H2_}_25c(uGB$c@F&MS6Yr%dSwhB96a4n(!H^6GJnXV2? zX$Hk!3vm)Gz#kjEkH^kJX$NMj>Tj9cOK$~MqM!JzT`0A{!HO-uGjU?THqw0ti>qv4 zl~4{WP&u$b<-h`!0}E6REKrpKR*(JHXf!Yc%a?{=c~yN>wgHVfu!1AYk&@YZ9kwtZ z5WU}CiKDV|l>c8cP&u$b<-h`!0}E6REKoVHK;^&!^$!RvWws*P`+@)f002ovPDHLk FV1mm=1|R?c diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json deleted file mode 100644 index 29b6d7a..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_02.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42flip_02.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/42flip_03.png deleted file mode 100644 index a45d294c82088c72764ccbf2021632e99e2f3a35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3937 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600eDGL_t(|obB3Qh*eb-$MMhh z&sg?Qlm!t8VWp5crKTnH$4a691_coXf@M}<+0a9U4}tZfr2T~?f~Y7fDx^@+rlFQyhX@;76^*(scl{vqsIeRbW{`hjv-fQi>QbeeA@JcnX)>H#) zQ8lm@RRe2LHLw=d7Qj+UBe5U*qa6%2QRTo=N+;ks8Q2coi?Nu5pRp6a;uq{eZp%!-KZ)wrz~SV}43LHVtMl~{ng^#famE)2(SI5Q%? zE#GZc)xbuf8#81$H$=p$lv0-rY8U3?Wi>ETN+)9zj+WP`$q}(_0I)S!iuL+|bwY$@)+M)@tQfu)pI;+EoZNkl9z#=Ect=V7!O7%8O=e1`Gz z4mc|!-YMp~a5JXiEHyAvN~hyfbjZ2Z_=wnD%ynUcyx^aw21ZKhc05r$uEsSHvA>vG zgdZc~rIgb7hB~m6(lD&TwFul55swa-pN9<*@m&oJDWzlObYd+2z_}5zWx)J&d=e3V z*T7IfSTC<%Jvb*KdI!vRM8sdk-!l#MJS?TO7!M%fY0Pg_P^Xj@Vnq@A6DCH)uCl!T z&rjLFildx0xL7WSZj6W*8^jKiH-yWJp*L}L-{w$-ssMHpHe-xj4ozuP8>W=T;42&_ zZw?D1;_V12C-M*jUx6>OpS=1vb+xJsRCdtaA)!OP(<9{ zATD9~fY>ea=J4mCciC8_0xQ<9jp&riq1h49-5_?f{04RwL(9=s^$~X2z{cTo94Q|^ zpW0Ur4H7#^26hzw#+4DVwk)rWR5q}=ct%bUR%1?+bm9&?R>W?X*RP!=S#7A&fE8=f zv$#p#@fJnIBMoAQ<5kQlhF-^Y5wWifugz2@u#xg7HdX$_=3$+jz3&;ATcwnamlydH zWw^IR#8aghJ%Gvv_5mgrL%+*s_TONud^YwaKEws`P111mVp>FOEyd^oR3)(gYQGHU zd|ZTwi}B5JI+}W4eWhPX%e;<)8(>hX))F^?jn5#JwDvrTl^0FyU>wU}E2>sK>id(in3@4wAm3GX z4i#Vtvv7$FZM=LYHbOtZM!+t`D{_7|X-EM3_Xjh$4jI-2xxMKgxxZpCU~gkCK9X<2 zhZeB^8OR+xJs77kuqWjXo?bPu0|M*D*K(8HZZ)vfA=i)tfz6QHokq!@;xY1?R|6}6 z_23l!zA0&e&bG-PdPdx;)iP7wkfcP*fd~1;RqSnM67FcN?V579$34n2G*i# zU@fW!)}m@)Evj9B_4T^ezz%4jzbL;9=VD$&d{L>XCaN4*pNiI|(ejnspv@`mptb>a vxTpr!qH16*ss`4gYG5s@2G*i#U@ht&CB3kxEKffD00000NkvXXu0mjf6A5W9 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json deleted file mode 100644 index f2cd717..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_03.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42flip_03.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_04.imageset/42flip_04.png deleted file mode 100644 index 9ec754b64dd30763ee037174ce196abdc43b3896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3596 zcmV+n4)gJeP)f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600kmRL_t(|ob8%xh!tfR$A9l$ zw6e9di`_8_Gh9r|q!fc%%S7*VaF84^aK#a5;n zbVD#JymU`fVs}+m*Yoeg^RD}zv*#Rlezgz|^ znlfM!l>v*W3|K^Ez#^*ZfjQ@D00-0n2PEZE^^*iJ=Ugq&0Mr2|0E7HC02u1OH~7yF zByDrfH39bq@j<{+NiW21xQvnlHWpYxFEj`2_pw{Bs|TPPm@KKyIX4nmg8}W)W?;Oe zow1uPp`?I~$9{ZW5bgqQ2Hpb(`&bC97FY<(3eGtI+%IWi+@4D*ZD1Dx&jYvm*g;_a zyh*?+?62FSFM#VL?Ty=aF{KUc0^nlcLtr3%fz@Nct|~ZhnxxgS8!w`20JaPG7??x> zFn?|{@HS8zoZAY_l5`+u>wT0uFiC$n=Vk$K0Xg~t8v=X@j112G54b|orr6CFs9JzE z0N((^=?lyObAYF@r)!U%0iIC8g=E^mE|m1UKjv}ZDd5@=nBO-XSPPsHgtr0XB>fwo z^S(+7*yY&YsvNL${4sYG0agRN0z43ebHIa=UXRmzp{fa34KNQ_UI;A6(FPnJgx6w! z;XQGA@8hFdfcfJ_0Rtp`TO>yvupF3LkYk3Vm9ZEvqNIS0!+_NX;eEhJNn3*BYJhr4 zT_y6|2rMBV{9@ovN!=AUUd%&6z|IBMlYi3|@Q9?BBjjlSJ_E)C;dZRV*jNd#hxCvT zuo_?i&_aG`umPATsXaoj*}zNmPS^pS1Lh=AVkFiNbIy&%ZrUdY;cnm_N$*C;b0)A3 zI4=nQhLsrGE8(^5_z425#ilsT1-sgSsr{Wy`$Bde@MsXu0WFeVtAy9G<0n}tJLe_> zpOD{u=mMroS`{HrBUT6x4#Mk!Yb5Qigx8W|Ck(6(>r6~3*tHC}t-q6Lf3>#K+ZFfR)2MJ2qJ96RZrzH@Fm@ILt^#$Mn`N#94v(*%4}kY^cidz>Xk8o&ktD}f0GyI#fa zL;W)3oI4I!U67{(m>_9GCA=0LH;uPO&bhmRH_0zRcVPYctr7Cv2fRUkiSZ)vSX?DW zTEI@iTFs3?SiqCO++si0KOG(Rz!-?VeHwvP`lknnZUn|i+82xWwBAel0(3t4h3sam zYTx0z7b7qjX8~vXZ5VJGa0)gNZy^5)`vn+vGy)rjRr;p};cnn+tYml=cnG_qdVqv* zOXKzTrU49W8B+^ZxJCiiEU7hCvxiWU3+le27uYTg%u-4NTL3&cVQasxVr$z^YXlu!zclMN|eXqB39+l>v*W3|K_{4{9;< Ur+(t)>Hq)$07*qoM6N<$f{D1Sx&QzG diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json deleted file mode 100644 index 36d8b0f..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_05.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42flip_05.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_06.imageset/42flip_06.png deleted file mode 100644 index 35c156c85ca2fd2eae0a82fc0b25f0c41b7a6078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4262 zcmV;X5LxeuP)f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pv1L_t(|obB3QtQ}Pq$MMfT zZ4p}v7zqjfjRNrjV~h`g7%>V8;ZITiL{Oqq6BUC9Q7{lRXpEYu2pR?Tp-}`Yf&q-B z$O|#}g0UJzV@#uBq6ulBt<>An`)B#E_knXy@0>f+JLlZ1%rDuQJ9pNsJ@Y*?Yp=cb zq=?X|zETIQnL1z%)d6d$4p>8Vz#8g*3Rp@hA@z45B4#Ig4Q&BSDII~Mu^NY9P1&v< z*zUti%l=^N+wR1sh?prpUyqOD#Y49Jwg*>7#1pODL=CkG>`HvKzdNw)|2>E6ag7Xi zA#KAc5%FyCc_@B_^9TG4DzF(FBVylD@1c&`1a=j^F~VdP=in9iw*0gVYaX!T_ceGB z$5;5>kE?K7Od!5Y8ra!*7~jEV4t#1309Jf&z@1oE;rmIP6%pH-UwJdN3G9=&d4$O< z&W?x&Q%XnU0laC*rV3aOU&Lq7tMLB_&Wnhr59a#oYFU64`;+8X?T7)J1%Va&!*M^} zR^fjRH{rVepfL_j8rV4zv9;JId;(vWM^HupE9blsTX0N8A5*v_BJOW~2ldqUD0#~W zlX<|(Ifr5s-Ydtm#egMjln0F$RrIqR?~I7QH@$~CT2^4?yjRNc>;#JdEB1%rRtpar z2R_u?#R=lCYWIwLOw<2P$#^u-6N&(iBliCe< z>tevlId8|kIK0ASN9pg;#e6lgm*>6 zKU?WE_j^1Z!mBGxrtl%$-Nw|Z)$&eC={($y^&`xFj1Nb|-WL145I>Zw8Vl*K@~gRh z$$hm9Y!z-Ottzg}$g$_5D<`8>B^h`er$@w-E%tjNeu1MZOrFBKBjS;R z?qggfq?FQGxC2L4n1me9Hr7caYWA6Mxt!iqg@oVAMSz3)p~eYpl^m;Xl*`ErX&RrF zGxAn0q)eSQ;S$xU#`kc=!BjQIx(HJ8q#xjd5oS-xb*x{v*zc?4s>TTwCi~<`{N|=V z)Yw;z%H;YXyl#ZqV{$y((PF=6;HRonoF{N*MEtpt-$^X9rIg+wR}iY=899&oNRxP0 zV%BrJrL8J$4L*xcsUEHG!$nPI0h0pO!`1kT>R>!A=TYD7za}MBcsbUVwr*g%9)}HW z*A3XN#Y^y7)xiFU6Px5_ZBC6=japPqDXo=LjZ;Usc@(D(EVErN4;=lcrdPIu%Xd@* zSxk@Pq~!v3I{p$7|EM_L!`*n#2shjCmWbF_Ubh?ZxmGT4Vf_IoFBh*vU;wO>M`pTL=ENRbC_9RgQPS<~ceL*et$=8zN$68Gyx5o58a~?f1B} zQL@}3u#e)lp?^=w)rg;r3D|BqaPO|s_F%6(kK9|@bkonI#tjVqg)`->x@};;lna$J z%9AwiPo5?L41R@+zDUpaUo09zwZj^|2SQcU^32iCS~0($`GcEEJN8mj}= zPzBiM<$Y)+bOSS{towydpb1lnpQZlBjvB9 zryMvtFiB9)UDHYiwi49=Yp4!bLv_F!ssq+g9k7P#fHl;A0g^gww$G>QX#fBK07*qo IM6N<$ff6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pW^L_t(|obB3MtXx$c$MMfP zv{eDaEsbJAf}zF&Vz>&a(U|z4PsSTcgLpwipp=+kq|rbFF@{7N8w|AAQZzupUI@N; zi-|Er0jY)%6MZ0kz(ku^L`zyqDgFDf)+xjE%$c?K%$$~!{Yy?}Py7F`wdOnjwf9=T zH7O!=s#ofOHB$$yp*mm<)d6d$4p>8Vz#6JCu$0o7xEWK3@~7{0`uY%_!Ff1tKx}W$ zZu}@B_V@I+2w%Wiv-H#Z{yF?CB3^Cu!79}T*d_P_7FL8G!WZ!Y+<*l`;{S%rB4STp zpBLi+EUoBsKUQOHL>#DyZ=^QBF2*0#1G^l*!JYWJ*`W;rmT(Ck!jg)9_u@9WTE|*x za{=sg5wSg`bRvF$ugTMSCd~+}r|)HW5bv(&doR9?yCdSYiufwc8L*Oj0`9_>kB zGKdcu4(&C0s@zfoZB!L#SIKL=8fgEVnxa>xzc_;8?=!P z#FWxmvWswOMfgGa1FW9IO1n;WN@}3}OZMJ=HwfBT9M_c65_x)FR1tmvYjAr+yfSj< zLzGflfED;2j;~1hhwS0~ekN#Rv#1NStvJ6T`~bd>J0@ZB^{Z6cO)|8%R-`;HKR6!m zhc;GEKc%!3n{h!!_^bFX?wliN3uJ43HQrW{@;sK~iC$=9KLklBor8z*{)+JZxC3kE z2-+gqwYXJXrR|g*m8YhmP2|+5K--41E5fHe_%-8nMh7XSv`}_pzoTxq@*I{ BS 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600pN>L_t(|ob8%>h*d=#$3L^~ zuC9sM)@~0XA&k%{D#)}Itw>EvBYRi|WmzO4Aw8hbFsc41iV!o>q?eDf(jr59P{vxB zmL(BHK~hRlWR|GAH}~=FkD2SVT-U_q;Pf7aOX-o!2xNBN-bTYtqlKzOT10IVT*j2y=peo=JFb}vBI49t12bv`9 za2l5a?*PZ-T$?Sg0k=sy5=#d>)|bF;#*UITKy8jM2&@Kp-qkk&ofhC)Nt??bz2Ev8 z*qgw5U}}yp517*#32XsQ^fa>#m@MgF8AC5>aRZwUyhRaUl2#jI#scpFL!HkD%m533 z#U8CrV7{cKF?6B8DgoF4;2B`9^A!MdTJ^wIV3en+y}&q0d&(KV&-xsgt2Z3jj(z03 zz+Amqz{^0jM{gN+q;-_F6Tukz5ZEn}R^`-v0C)`hh!q1?2fPhT@-%kGKKH8 zN&;37d;*N52ryT#3D`u}J1^JX2dsX}|_y(~QN%fVq07V<&)9Jnrv-@sjqH5_{3MV+J-3_z)Nra0!?r z=|#^qqk)X1Z@bYoz`elZ_;1Fez@j+Tr*Q)th)qtf^te9&rUjQZ4o0=4wjQ*H0UrbB zdE9>jmvsj{s>Qy&<3`LDU~s_I4$PFap#<$2z*=CS$Gr}lx|DUDnFO#ZU^#HR$Gr>t zfEn5@wS%`Fas~}}eE@&&sond3lY+xlYAmBQPT|7sc)!Yca3kyD|Eno#O zPf~jn{k*mk23Cj7%bGmy^}vlir4!v~55;a1jrF(>0ar+Bj-s8{PSR%&#+b{on~HS- zS1Wc_i@ba4&JZ?Gm?(pt7^aoF&g=_dwZLlNI*j@JiV9l%^kD@$l|6gGtkY6JWTTq5bW$oeq@I~({b7@*r_eHH&G z+YMYGX}_ymL;e{i-OZ*h&3FWOkis;h6LQe&elH-7dxt(;g+6w&He>-rI zq%R%VWx#M?Kk#?X-)#BEmBVzMYaWYTtDfP}-v>;Tv@24dVg@!9ScL`fL(cC#0c(=9 z!|i=FQ#kWwPtLO=uY>%9-WKe3cSDiT)&aAkjItzvZN$Ea=VbGsG5{;pz5zx@$;*-g z)iE!Hv=;yWhwyJ*T9992y6=QE*4lDaFe7rQeefz^MQeV6eeJo zD%}Cg&XWIoV4c9-z_auo*j8XnnM2zNjOh=+0Di)bvPGo80^%0fM)J2@ggxzP0Ooiu z3j?eJo6To4`e0^X%qkYxa9}2OYr4^udMuRRfr(g{)!0#J=smD@;34b@Q6u&SG&uci z8G_xp7=-->E!)OUU~I(!JKBhy6|_AJ(+3Nr z+LapYSBpbkIgT!<8Q{5!%k)dN-U3TBrW9Dnm{MRNV@iRAj41^cGNu$*$e8*$uDmMwMICC?DxS4oEx xjio;Tt0YT-g|rk{NK1i*v=mrKOM!*7{{V<^TefLCKhFRF002ovPDHLkV1mv{^Hu-= diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json deleted file mode 100644 index 8b2281e..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_08.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "42flip_08.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png b/iBox/Resources/Assets.xcassets/42pack_icon/42flip/42flip/42flip_09.imageset/42flip_09.png deleted file mode 100644 index c0f72609954efb5636bc9c1271eed00f86ad0827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3426 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%0Dy!50Qvv` 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

<$UrE1WEgx|fLyZ8Nu*vd!ji2O zb!gJxSnSTJX5ItgW!*vVauZ#i+34I+za^ll`pZqIF}%f7e@1lBSb0fmSWx-(s{W01 zp)cnIm7f`5-Cl=Mc5YX#*65cY@;yo1(NYg#I_^#@KAWAjC6&7)12cf%xWpqaAk1np zxs%TE6rCX(vw1eq4WlmZ)e;fUHqQrds0>vt5{HVgI0#!07?mq@5Xt+e{k`ku^n zKs#b3tzOJic`IB%TH`?WmW{ovw3kIhd?xLzNbGu>?}NuhW@VG?gE|7*m(8WwKH8l0 zQch3rR>)Fg-IMox9>`f(ler!=V6I)WF2CJH!q@R?~V{#7ip!2^txwEp&t!+w_H=U z)LD8Rh$wqUHW|^vym6xEtsHZvpcXsXCmF0=>akKHUG9;vV#ikc z?v3^$sI_JzKIB!VcAcQU7~>foWe3gfmYBqNO38_a*)Q1_NeiE?Nu@)lE@~%O|Ky%X zMFx*ssDhk>IVxq}GeI4CkD|`AHEwsW2kB-#UEXd@SM&g>iJwVX%Z@t8cf_ECGh!I) zuZKz*CQ0@yf)MywC&-siFv83_HtlxRtCvfo=k8g1K8VZ_X{}6(nBG&JGApBV(}!8- z@}flFP-SgmD>?PNNNo6yYBHj$=b|c1N>2C|zXk8F0S_KQAUw{sVBdXc+wU{Q+We$h Jk%{M({{h#%zrX+h diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json deleted file mode 100644 index e09cac4..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "cat3.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png b/iBox/Resources/Assets.xcassets/42pack_icon/cat/cat_page3.imageset/cat3.png deleted file mode 100644 index 97bd00ced653d2525505857e70720c049c56fc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4403 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≦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


FmnPksAb`9n1mvXR+ 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⪙!$x}pihTVbK%$nZohE-Qj8?g%EBlCkE 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

mm zV!#9HU8GXDZfA9b2dHJphy>dBu15OR%9hQ{phd+02!jsG#Rr{noiLR&wjDG zW#PKa+cp>$cL(@c7$_M=F)lHXk?9UrUQI2`5HX pivRDT|NHsh75M+J0F)2MeP;BuUc>(5{{a3kP}l$f diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024.png deleted file mode 100644 index 83ffffa3bbea51c68799b95c215ef63a5b64a824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193380 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�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


FmnPksAb`9n1mvXR+ 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⪙!$x}pihTVbK%$nZohE-Qj8?g%EBlCkE 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

mm zV!#9HU8GXDZfA9b2dHJphy>dBu15OR%9hQ{phd+02!jsG#Rr{noiLR&wjDG zW#PKa+cp>$cL(@c7$_M=F)lHXk?9UrUQI2`5HX pivRDT|NHsh75M+J0F)2MeP;BuUc>(5{{a3kP}l$f diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json deleted file mode 100644 index 2ed3677..0000000 --- a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "1024.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "1024 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/Logo/256.imageset/256 1.png b/iBox/Resources/Assets.xcassets/Logo/256.imageset/256 1.png deleted file mode 100644 index fd64f798c4b32616e5d22f02432bea6d93497da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22350 zcmcFqg;yKR+f8uy;#w$Dv=Fp76fIIHP#g*k1a}VvZ(p>yyOsh460A5B*I>mZxDo86m z>FTcSM{}I}SgYqz({`4B1zw(PFd8Nv1*i7^-@$4zj58M1pHs(_CZ>XV!w~Nwi<~Mh z1yMU@$b2J58t1^a5u2qqoH9mG+1HuLhJ}6mT9e|oO3{JA(H}z4;N(h!p5F+jHm)b) z0^wop=go?fR$}k#9m7<{>@8DGy$szRYvQ0k!%lo0i4Z;sRnaFAW@KQ^p|q5Zh5$Cm z8y+dGonnxEfTb^&R&i2wEiW+yB^<%J1ajoku!>X7;>8b2p`wd}>jv_gE?^;kCCM0j zS?_D^DAn_o=at#Z%=8w698FDkTNA?KnSJnEKFT>u=PZnV#(qHm_ z@XJ!c?LEqPrqXyeMESI0-aRwrPs2~cx{_(elT>6G!=y*$rKE;dx4rM7@PPUxyJfv3 zowAS9X3GR9NtDjH8ZyUYYRagt{3A+=!?F_Y=<`W!b{TzPMvtKMsgsLCD6~?`)cp< z@={2kMW;N=@{~`obm=eG;O6OWifs8u2?ZX3|3+bGby)7^W+Yv)=_?<|JUl*sUQZKe zU%RHGrS+RIVVbM68H=)?tvakRJmf!Qq89m%?D4-#&?7e!L<3;ICi0Ou9vO)qe%>5N zpj$$@h5@&`rPXH59=qYY0GV!r1A`anS5$PID$(&BD<~@~EB-XxwVHQPluI_Z!#!Ig znf4(pIR_S=hHI~2zWjiL4z2G5x9HeJig#B>{7e2vtyG?#o~E`~5|3tI)~Skp6^%Z^ zR3IiNZ7m>;!W;RHGa<_~<|2BkIHR;`Q`;NqX6d$oiz0~pQEAx8$;n+rWMuoo?5y|L zU@~_D^_lbfzu!kCXe<*1$VUS)GEG34R9t%x_-WL;t?sjn%kgX03IF4NX@ytHqzTet zj8eDArc($+eg~9UHP*%HUlP(_6Zu| zW~9!a2Us=NOFOW+4wPBHau*skX%Bo@q1|2#w=2P#J_VnF{`WdO;sNW$v6>d^MOVY5s<)D~KF z*B2gUB#zogmq_8 zs4md=>faKb!Ou@8zUQlbM9Kzb=!4rJHwZ5LeI<_>*0ye?4|>2gmM~#yK!gPQt4A)W zZ&6Fgky=ixvN_QbBISfoA>}c zLEj3GM&BNpxINx%2NfX@7f=KS(U|*A$HvJ#ARc*qPQel?NkPVML=%G(rZhMc2GHO* zq4=yBj-xaSbD$K0aOaF(=T+VP^KQSR%DtT`B}#v#_|f?DX=Y;D5L#ZzY4vjl4nW0- z=GrElSX_6Jmc=MuaMNo*LT9eT?I2j=Ni>zm@U+R+%{xb;j?P?m1dRWI7-6rb zYd!jXM!2vE{vs!(Z&KhVN5h%0DW1XigtH6nYJOby#a+0 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 diff --git a/iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png b/iBox/Resources/Assets.xcassets/Logo/256.imageset/256.png deleted file mode 100644 index fd64f798c4b32616e5d22f02432bea6d93497da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22350 zcmcFqg;yKR+f8uy;#w$Dv=Fp76fIIHP#g*k1a}VvZ(p>yyOsh460A5B*I>mZxDo86m z>FTcSM{}I}SgYqz({`4B1zw(PFd8Nv1*i7^-@$4zj58M1pHs(_CZ>XV!w~Nwi<~Mh z1yMU@$b2J58t1^a5u2qqoH9mG+1HuLhJ}6mT9e|oO3{JA(H}z4;N(h!p5F+jHm)b) z0^wop=go?fR$}k#9m7<{>@8DGy$szRYvQ0k!%lo0i4Z;sRnaFAW@KQ^p|q5Zh5$Cm z8y+dGonnxEfTb^&R&i2wEiW+yB^<%J1ajoku!>X7;>8b2p`wd}>jv_gE?^;kCCM0j zS?_D^DAn_o=at#Z%=8w698FDkTNA?KnSJnEKFT>u=PZnV#(qHm_ z@XJ!c?LEqPrqXyeMESI0-aRwrPs2~cx{_(elT>6G!=y*$rKE;dx4rM7@PPUxyJfv3 zowAS9X3GR9NtDjH8ZyUYYRagt{3A+=!?F_Y=<`W!b{TzPMvtKMsgsLCD6~?`)cp< z@={2kMW;N=@{~`obm=eG;O6OWifs8u2?ZX3|3+bGby)7^W+Yv)=_?<|JUl*sUQZKe zU%RHGrS+RIVVbM68H=)?tvakRJmf!Qq89m%?D4-#&?7e!L<3;ICi0Ou9vO)qe%>5N zpj$$@h5@&`rPXH59=qYY0GV!r1A`anS5$PID$(&BD<~@~EB-XxwVHQPluI_Z!#!Ig znf4(pIR_S=hHI~2zWjiL4z2G5x9HeJig#B>{7e2vtyG?#o~E`~5|3tI)~Skp6^%Z^ zR3IiNZ7m>;!W;RHGa<_~<|2BkIHR;`Q`;NqX6d$oiz0~pQEAx8$;n+rWMuoo?5y|L zU@~_D^_lbfzu!kCXe<*1$VUS)GEG34R9t%x_-WL;t?sjn%kgX03IF4NX@ytHqzTet zj8eDArc($+eg~9UHP*%HUlP(_6Zu| zW~9!a2Us=NOFOW+4wPBHau*skX%Bo@q1|2#w=2P#J_VnF{`WdO;sNW$v6>d^MOVY5s<)D~KF z*B2gUB#zogmq_8 zs4md=>faKb!Ou@8zUQlbM9Kzb=!4rJHwZ5LeI<_>*0ye?4|>2gmM~#yK!gPQt4A)W zZ&6Fgky=ixvN_QbBISfoA>}c zLEj3GM&BNpxINx%2NfX@7f=KS(U|*A$HvJ#ARc*qPQel?NkPVML=%G(rZhMc2GHO* zq4=yBj-xaSbD$K0aOaF(=T+VP^KQSR%DtT`B}#v#_|f?DX=Y;D5L#ZzY4vjl4nW0- z=GrElSX_6Jmc=MuaMNo*LT9eT?I2j=Ni>zm@U+R+%{xb;j?P?m1dRWI7-6rb zYd!jXM!2vE{vs!(Z&KhVN5h%0DW1XigtH6nYJOby#a+0 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 diff --git a/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json b/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json deleted file mode 100644 index 6c63c7e..0000000 --- a/iBox/Resources/Assets.xcassets/Logo/256.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "256.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "256 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png b/iBox/Resources/Assets.xcassets/Logo/32.imageset/32 1.png deleted file mode 100644 index 7a1538725118315a4665ccd61787a1981cf64ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 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 Date: Thu, 25 Apr 2024 20:26:55 +0900 Subject: [PATCH 336/370] =?UTF-8?q?refactor:=20backgroundView=20->=20panel?= =?UTF-8?q?View=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/Sources/ShareViewController.swift | 12 ++++++------ ...roundView.swift => ShareExtensionPanelView.swift} | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) rename ShareExtension/Sources/View/{ShareExtensionBackGroundView.swift => ShareExtensionPanelView.swift} (96%) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index d81bf15..45ff169 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -16,7 +16,7 @@ import SwiftSoup class CustomShareViewController: UIViewController { var dataURL: String? - var backgroundView = ShareExtensionBackGroundView() + var panelView = ShareExtensionPanelView() var modalView: UIView = { let modalview = UIView() modalview.backgroundColor = UIColor.lightGray.withAlphaComponent(0.1) @@ -37,12 +37,12 @@ class CustomShareViewController: UIViewController { // MARK: - Setup Methods private func setupProperty() { - backgroundView.delegate = self + panelView.delegate = self } private func setupHierarchy() { view.addSubview(modalView) - modalView.addSubview(backgroundView) + modalView.addSubview(panelView) } private func setupLayout() { @@ -50,7 +50,7 @@ class CustomShareViewController: UIViewController { make.edges.equalTo(view.safeAreaLayoutGuide) } - backgroundView.snp.makeConstraints { make in + panelView.snp.makeConstraints { make in make.leading.trailing.equalToSuperview().inset(30) make.centerY.equalToSuperview().inset(20) make.height.equalTo(140) @@ -148,13 +148,13 @@ class CustomShareViewController: UIViewController { @objc func handleBackgroundTap(_ sender: UITapGestureRecognizer) { let location = sender.location(in: self.view) - if !backgroundView.frame.contains(location) { + if !panelView.frame.contains(location) { cancel() } } } -extension CustomShareViewController: ShareExtensionBackGroundViewDelegate { +extension CustomShareViewController: ShareExtensionPanelViewDelegate { func didTapCancel() { cancel() diff --git a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift b/ShareExtension/Sources/View/ShareExtensionPanelView.swift similarity index 96% rename from ShareExtension/Sources/View/ShareExtensionBackGroundView.swift rename to ShareExtension/Sources/View/ShareExtensionPanelView.swift index ae57b3c..c84f702 100644 --- a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/Sources/View/ShareExtensionPanelView.swift @@ -9,15 +9,15 @@ import UIKit import SnapKit -protocol ShareExtensionBackGroundViewDelegate: AnyObject { +protocol ShareExtensionPanelViewDelegate: AnyObject { func didTapCancel() func didTapOpenApp() } -class ShareExtensionBackGroundView: UIView { +class ShareExtensionPanelView: UIView { // MARK: - Properties - weak var delegate: ShareExtensionBackGroundViewDelegate? + weak var delegate: ShareExtensionPanelViewDelegate? // MARK: - UI Components lazy var stackView: UIStackView = { From 47a2479ebdce70c1eaca51ac2d365a5b0caafbfa Mon Sep 17 00:00:00 2001 From: JH713 Date: Thu, 25 Apr 2024 20:27:37 +0900 Subject: [PATCH 337/370] =?UTF-8?q?chore:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mise.toml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .mise.toml diff --git a/.mise.toml b/.mise.toml deleted file mode 100644 index b05dc4f..0000000 --- a/.mise.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tools] -tuist = "3.36.2" From dab274ef2c36623978b68239ed7c8f0975babf2f Mon Sep 17 00:00:00 2001 From: jonnwon Date: Thu, 25 Apr 2024 20:28:56 +0900 Subject: [PATCH 338/370] =?UTF-8?q?fix:=20modalview=20backgroundColor=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShareExtension/Sources/ShareViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index 45ff169..e1e7033 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -19,7 +19,7 @@ class CustomShareViewController: UIViewController { var panelView = ShareExtensionPanelView() var modalView: UIView = { let modalview = UIView() - modalview.backgroundColor = UIColor.lightGray.withAlphaComponent(0.1) + modalview.backgroundColor = .clear return modalview }() From 3624d9b39e33d9eb82f4176501da810f8779dcb8 Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 25 Apr 2024 20:57:00 +0900 Subject: [PATCH 339/370] =?UTF-8?q?style:=20ErrorPageView=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Error/ErrorPageView.swift | 121 ++++++++++++------------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/iBox/Sources/Error/ErrorPageView.swift b/iBox/Sources/Error/ErrorPageView.swift index 1338548..8c3836b 100644 --- a/iBox/Sources/Error/ErrorPageView.swift +++ b/iBox/Sources/Error/ErrorPageView.swift @@ -16,42 +16,62 @@ class ErrorPageView: UIView { private let backPannelView = UIView().then { $0.backgroundColor = .backgroundColor + $0.clipsToBounds = true + $0.layer.cornerRadius = 15 } - private let messageLabel = UILabel().then { + private let problemUrlLabel = UILabel().then { + $0.font = .cellTitleFont $0.textAlignment = .center $0.numberOfLines = 0 $0.lineBreakMode = .byTruncatingTail } - private let problemLabel = UILabel().then { + private let messageLabel = UILabel().then { $0.textAlignment = .center $0.numberOfLines = 0 $0.text = "해당 주소에서 문제가 발생했습니다." + $0.font = .boldLabelFont } - let backButton = UIButton().then { - $0.setTitle("나가기", for: .normal) - $0.backgroundColor = .box2 + let closeButton = UIButton().then { + $0.configuration = .plain() + $0.configuration?.attributedTitle = .init( + "닫기", + attributes: .init([.font: UIFont.boldLabelFont, .foregroundColor: UIColor.white]) + ) $0.setTitleColor(.white, for: .normal) + $0.backgroundColor = .systemGray $0.layer.cornerRadius = 10 - $0.addAnimationForStateChange(from: .box, to: .box2) + $0.addAnimationForStateChange(from: .box, to: .systemGray) } let retryButton = UIButton().then { - $0.setTitle("새로고침", for: .normal) - $0.backgroundColor = .systemGray + $0.configuration = .plain() + $0.configuration?.attributedTitle = .init( + "새로고침", + attributes: .init([.font: UIFont.boldLabelFont, .foregroundColor: UIColor.white]) + ) $0.setTitleColor(.white, for: .normal) + $0.backgroundColor = .systemGray $0.layer.cornerRadius = 10 $0.addAnimationForStateChange(from: .box, to: .systemGray) } - let closeButton = UIButton().then { - $0.setTitle("닫기", for: .normal) - $0.backgroundColor = .systemGray - $0.setTitleColor(.white, for: .normal) + let backButton = UIButton().then { + $0.configuration = .plain() + $0.configuration?.attributedTitle = .init( + "나가기", + attributes: .init([.font: UIFont.boldLabelFont, .foregroundColor: UIColor.white]) + ) + $0.backgroundColor = .box2 $0.layer.cornerRadius = 10 - $0.addAnimationForStateChange(from: .box, to: .systemGray) + $0.addAnimationForStateChange(from: .box, to: .box2) + } + + let stackView = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 20 } override init(frame: CGRect) { @@ -76,22 +96,18 @@ class ErrorPageView: UIView { fatalError("init(coder:) has not been implemented") } - override func layoutSubviews() { - super.layoutSubviews() - backPannelView.roundCorners([.bottomLeft, .bottomRight], radius: 20) - } - private func setupProperty() { changeImages() } private func setupHierarchy() { addSubview(backPannelView) - backPannelView.addSubview(retryButton) - backPannelView.addSubview(closeButton) - backPannelView.addSubview(backButton) - backPannelView.addSubview(problemLabel) backPannelView.addSubview(messageLabel) + backPannelView.addSubview(problemUrlLabel) + backPannelView.addSubview(stackView) + stackView.addArrangedSubview(backButton) + stackView.addArrangedSubview(retryButton) + stackView.addArrangedSubview(closeButton) } private func setupAnimation() { @@ -106,61 +122,44 @@ class ErrorPageView: UIView { } private func setupLayout() { + imageViews.forEach { imageView in + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(backPannelView.snp.top).offset(5) + make.width.height.equalTo(38) + } + } backPannelView.snp.makeConstraints { make in - make.top.equalToSuperview() + make.top.equalToSuperview().inset(100) make.trailing.leading.equalToSuperview().inset(20) - make.height.equalToSuperview().multipliedBy(0.5) + make.height.equalToSuperview().multipliedBy(0.4) } - retryButton.snp.makeConstraints { make in - make.bottom.equalToSuperview().inset(10) - make.centerX.equalToSuperview() - make.width.equalTo(100) - make.height.equalTo(44) + problemUrlLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(20) + make.bottom.equalTo(messageLabel.snp.top).offset(-20) + make.leading.trailing.equalToSuperview().inset(20) } - closeButton.snp.makeConstraints { make in - make.leading.equalTo(retryButton.snp.trailing).offset(20) - make.centerY.equalTo(retryButton.snp.centerY) - make.width.equalTo(100) - make.height.equalTo(44) - } - - backButton.snp.makeConstraints { make in - make.trailing.equalTo(retryButton.snp.leading).offset(-20) - make.centerY.equalTo(retryButton.snp.centerY) - make.width.equalTo(100) - make.height.equalTo(44) - } - - problemLabel.snp.makeConstraints { make in - make.bottom.equalTo(retryButton.snp.top).offset(-10) - make.leading.equalToSuperview().offset(20) - make.trailing.equalToSuperview().offset(-20) + messageLabel.snp.makeConstraints { make in + make.bottom.equalTo(stackView.snp.top).offset(-20) + make.leading.trailing.equalToSuperview().inset(20) } - messageLabel.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.bottom.equalTo(problemLabel.snp.top).offset(-10) - make.leading.equalToSuperview().offset(20) - make.trailing.equalToSuperview().offset(-20) + stackView.snp.makeConstraints { make in + make.leading.bottom.trailing.equalToSuperview().inset(20) } - imageViews.forEach { imageView in - imageView.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.top.equalTo(safeAreaLayoutGuide).offset(10) - make.bottom.equalTo(messageLabel.snp.top).offset(-10) - make.leading.greaterThanOrEqualToSuperview().offset(20) - make.trailing.lessThanOrEqualToSuperview().offset(-20) - make.width.height.equalTo(32) + [backButton, retryButton, closeButton].forEach { button in + button.snp.makeConstraints { make in + make.height.equalTo(40) } } } func configure(with error: Error, url: String) { - messageLabel.text = "\(url)" + problemUrlLabel.text = "\(url)" print(error.localizedDescription) } From 04813903fe7543e4de3c122fe74df228f953f68e Mon Sep 17 00:00:00 2001 From: noeyiz Date: Thu, 25 Apr 2024 21:16:21 +0900 Subject: [PATCH 340/370] =?UTF-8?q?fix:=20=EC=95=84=EC=9D=B4=ED=8C=A8?= =?UTF-8?q?=EB=93=9C=20=EB=8C=80=EC=9D=91=20UIAlertConteollr=20preferredSt?= =?UTF-8?q?yle=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewController.swift | 2 +- iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/BoxList/BoxListViewController.swift b/iBox/Sources/BoxList/BoxListViewController.swift index fc61877..5c95f7b 100644 --- a/iBox/Sources/BoxList/BoxListViewController.swift +++ b/iBox/Sources/BoxList/BoxListViewController.swift @@ -117,7 +117,7 @@ extension BoxListViewController: BoxListViewDelegate { } private func recheckDeleteFolder(at section: Int) { - let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .actionSheet) + let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .alert) let firstAction = UIAlertAction(title: "폴더 삭제", style: .destructive) {[weak self] _ in guard let contentView = self?.contentView as? BoxListView else { return } contentView.viewModel?.deleteFolderDirect(section) diff --git a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift index e72e106..a708a8f 100644 --- a/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift +++ b/iBox/Sources/BoxList/EditFolder/EditFolderViewController.swift @@ -93,7 +93,7 @@ extension EditFolderViewController: EditFolderViewDelegate { } private func recheckDeleteFolder(at indexPath: IndexPath) { - let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .actionSheet) + let actionSheetController = UIAlertController(title: nil, message: "모든 북마크가 삭제됩니다.", preferredStyle: .alert) let firstAction = UIAlertAction(title: "폴더 삭제", style: .destructive) {[weak self] _ in guard let contentView = self?.contentView as? EditFolderView else { return } contentView.viewModel?.deleteFolder(at: indexPath) From b3782fb052ac8aba1588cef3e7935c1d65fa76a3 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:19:17 +0900 Subject: [PATCH 341/370] fix: delete unnecessary import --- ShareExtension/Sources/ShareViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/ShareExtension/Sources/ShareViewController.swift b/ShareExtension/Sources/ShareViewController.swift index f7493a6..72bd4fa 100644 --- a/ShareExtension/Sources/ShareViewController.swift +++ b/ShareExtension/Sources/ShareViewController.swift @@ -10,7 +10,6 @@ import Social import UniformTypeIdentifiers import SnapKit -import SwiftSoup @objc(CustomShareViewController) class CustomShareViewController: UIViewController { From 27b599cd1804297011c93fec0fe48c95142da552 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:20:32 +0900 Subject: [PATCH 342/370] docs: gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 551a3f5..6a56f19 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .DS_Store .AppleDouble .LSOverride +.env # Icon must end with two Icon From eb46287d3ac2560e80c2711c51077b1c93cf0b30 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:23:49 +0900 Subject: [PATCH 343/370] feat: fastlane --- Gemfile | 4 +++ fastlane/Appfile | 8 +++++ fastlane/Fastfile | 73 +++++++++++++++++++++++++++++++++++++++++++++ fastlane/README.md | 40 +++++++++++++++++++++++++ fastlane/report.xml | 38 +++++++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 Gemfile create mode 100644 fastlane/Appfile create mode 100644 fastlane/Fastfile create mode 100644 fastlane/README.md create mode 100644 fastlane/report.xml diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..f0e202f --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "dotenv" +gem "fastlane" diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 0000000..ead9487 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,8 @@ +# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app +# apple_id("[[APPLE_ID]]") # Your Apple Developer Portal username + + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile + +app_identifier("com.box42.iBox") diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000..1c196f1 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,73 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +# Constants +APP_NAME = "iBox" +SCHEME = "iBox" +BUNDLE_ID = "com.box42.iBox" + +KEYCHAIN_NAME = ENV["KEYCHAIN_NAME"] +KEYCHAIN_PASSWORD = ENV["KEYCHAIN_PASSWORD"] + +default_platform(:ios) + +platform :ios do + # Keychain + desc "Save To Keychain" + lane :set_keychain do |options| + create_keychain( + name: "#{KEYCHAIN_NAME}", + password: "#{KEYCHAIN_PASSWORD}", + default_keychain: true, + unlock: true, + timeout: 3600, + lock_when_sleeps: true + ) + + import_certificate( + certificate_path: "Tuist/Signing/release.cer", + keychain_name: "#{KEYCHAIN_NAME}", + keychain_password: "#{KEYCHAIN_PASSWORD}" + ) + + import_certificate( + certificate_path: "Tuist/Signing/release.p12", + keychain_name: "#{KEYCHAIN_NAME}", + keychain_password: "#{KEYCHAIN_PASSWORD}" + ) + + install_provisioning_profile(path: "Tuist/Signing/#{APP_NAME}.Release.mobileprovision") + end + + # Upload TestFlight + desc "Push to TestFlight" + lane :tf do |options| + # AppStore Connect API key + app_store_connect_api_key(is_key_content_base64: true, in_house: false) + + # BuildNumber Up + increment_build_number({ build_number: latest_testflight_build_number() + 1 }) + + # Build App + build_app( + workspace: "#{APP_NAME}.xcworkspace", + scheme: "#{SCHEME}", + export_method: "app-store" + ) + + # Upload to TestFlight + upload_to_testflight(skip_waiting_for_build_processing: true) + end +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 0000000..5bde376 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,40 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios set_keychain + +```sh +[bundle exec] fastlane ios set_keychain +``` + +Save To Keychain + +### ios tf + +```sh +[bundle exec] fastlane ios tf +``` + +Push to TestFlight + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/report.xml b/fastlane/report.xml new file mode 100644 index 0000000..7abd9a5 --- /dev/null +++ b/fastlane/report.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 77445ccf9e9588c625cc350c84fb84c4753605a7 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:24:00 +0900 Subject: [PATCH 344/370] feat: tuist signing --- Tuist/Signing/debug.cer.encrypted | 1 + Tuist/Signing/debug.p12.encrypted | 1 + Tuist/Signing/iBox.Debug.mobileprovision | Bin 0 -> 17472 bytes Tuist/Signing/iBox.Release.mobileprovision | Bin 0 -> 13200 bytes .../iBoxShareExtension.Debug.mobileprovision | Bin 0 -> 16701 bytes .../iBoxShareExtension.Release.mobileprovision | Bin 0 -> 12415 bytes Tuist/Signing/release.cer.encrypted | 1 + Tuist/Signing/release.p12.encrypted | 1 + 8 files changed, 4 insertions(+) create mode 100644 Tuist/Signing/debug.cer.encrypted create mode 100644 Tuist/Signing/debug.p12.encrypted create mode 100644 Tuist/Signing/iBox.Debug.mobileprovision create mode 100644 Tuist/Signing/iBox.Release.mobileprovision create mode 100644 Tuist/Signing/iBoxShareExtension.Debug.mobileprovision create mode 100644 Tuist/Signing/iBoxShareExtension.Release.mobileprovision create mode 100644 Tuist/Signing/release.cer.encrypted create mode 100644 Tuist/Signing/release.p12.encrypted diff --git a/Tuist/Signing/debug.cer.encrypted b/Tuist/Signing/debug.cer.encrypted new file mode 100644 index 0000000..30ca264 --- /dev/null +++ b/Tuist/Signing/debug.cer.encrypted @@ -0,0 +1 @@ +IIQiI4/q9SfKX3HQz+Il4A==-Zm/M7463yYLz0r3uVmfIOViANQzqd+o0Npp9PpW/mNLB8t26kilJbNnJFsvURmuT5rmcZ0LbUxnfK9c2vPuRRwqcTsznLL9SEW8CZHt4CH5pF07LrSvoNQqkfWiBCHO/4dLgIa6NoiVN8rOIsIQ9ghgYTgwItg427WTKX8cB7tiewG1oOUEtxJvj/ju4Aa+qV+xh3Vp96x0dJvPXO6DToJTEWwU1o3CNWk8j+ibLmPz/7UzOq3u6s1rGNjsmNyyoQ6jjQ3HyMtlaH18LfqwK2JKiMOny1hA4sL3B9sAkJl2r7cyxM7MLFMI/qg4kfNIHtYs5bTQ359uke29QwRnV7F6YcV+hfZSxMcxMUSkOvGaEk7Q4jhlAkDSt1YmvOC+pqs6E4LI8RktFPYd+Z2Kvb1aG2TOoRjSHLojJNKrlobOOIzmnlKesLj3YzfnfXfz6T5rssyRa9kfWrGkkdjSE4CbW0Tc/tt4t8zGp964b8fYaBh7iTFyKUhUuCZR9Rl+0Gd3aSwCETG+cjw/6IeGTF6FKlJygckhT0h17eI0IgxsRQoKjJnKj35Sqd8Etlp1b6dTsODi8FSAq7UM1OHOFcwBqMPqcpgSYkxzBuQ8cyH0AGs1H3UToWZ3KQ5Zdfc8lR0njnRHpqYpNdBJBClEXJbra80jtGGYRtoF51msE81j61HpKivYuG6G5MX/vf6He3R0u+fEXX0fcouwfGPR+rK6GcX3YbMKdHw0tZ01uODlp5WctdRfuiGNJU/VV34OmqmNygFbeXINfSqFgAyb06gXcQ6flmW01/skfdgt7CqM9lviK7mWrpwzk3qqMqPbxw+1KJ7/T56ct9u/kjsxx5GNG2hI/a3hVvZX8eZCyg1PV3WVbXP+Fw1C3RZeUvll0SwxsZzihlb3gC+dU7CXVdPkImDpC7EfJdJIzWF5NeTltvugAtpy0EYsGXlhzbk020rDonAO1vDxqh+2lTNKG0/00ISItDKZZloY3phXAQqxLidJ68gwmVN2P1SqD1Ynim0EvKqvWPba9HZI9vrsd6qBZtBibx3Dna5gp/fyGi8recNatuzyCXe8QjVpuRB0N3y9at0j9Fz37jY7K99G1h81XEpaWaLXXFeFTFluQsb23Q3MUdJsgpXEzjvmKgLak5ZFx1cQ8Js3TLOPUk9PgJBc5ghgkUcXsgWT2q4PvoKAO3r4Safng5vhTG4RapuxpUBWlRumCExPKsUQtM4vpwD5F8gsKlWahiziVO6fB7TcS83Wfdx44zCxu31Xn6zffedlUOqFNHEtpDOjjrMHBOfG2uXJG7Ff+jYUtE6Vsx/bx+FwCoPlQHedETMgGZx5XURuXBZ8VXv+z4kX9o9Ohu6RO8g2KY9DgLQhkM9XRJIJkW7lqVuG5CzA/+p5KfL9f84l5YbnMIheL9UkT427E8YXyaGkJiI26wv9dO2Og4inP+DMcsDJva0+ClcHWf8/9VnHWDPku3LTDQFSxaPhOPaobEtc5/kjjzDmCDn7ZE7hFQoiYtyXRKpmQ80Ez8Ji4IR0OAQl2Z2bcN+9rpBrCv0kyZJYGKK/o3QcdqZj5HNkRGBE4EOZiKvTniIY2Z7kNGxM5moZYqSWhU9/8pUtA9RUIX5E3mW4KGCJ2+uXaEl2b9H8ia+cQVUzzidoNXwWhGD2wlZPrKewTb8K+zapxsyUbWLrkvYAXRCvQunmVHmD+v4DaR/95J+8xjCxc/02nMUWAxmPJrptWTjs2MBlcTIGpQDMnFo9LJnOu4S2wbfHc9/cOGVTnX0i+3UaghRWDwpyB+/i9Ioy2sidLW2/R0yVJTa4cyDn0ECFNe3W/l26hd/nXQOCi+BSiRiE1x0SZVJ4NIJjhKvIeJRc7iiFe6UTcN9StH2Ik940qgiZEO2yKFVVCWwkfsz9pFzuw+pxP7viAnELn5C3xU3NT7nSw0GEd1d6h5P9yk22PxxFGEXj3UL5Ygx6HGg== \ No newline at end of file diff --git a/Tuist/Signing/debug.p12.encrypted b/Tuist/Signing/debug.p12.encrypted new file mode 100644 index 0000000..df2043e --- /dev/null +++ b/Tuist/Signing/debug.p12.encrypted @@ -0,0 +1 @@ +5OXOPxe34sNNBC4hMy9pxQ==-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 \ No newline at end of file diff --git a/Tuist/Signing/iBox.Debug.mobileprovision b/Tuist/Signing/iBox.Debug.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..e40fd7b5973e6b284b500c70816b5cdfb5f43973 GIT binary patch literal 17472 zcmeHvdA#Ffx&NFqGt2_RunhZl7-4$7}%hK`P7mpse zbP=+}$IN9Lxn_&+#3fsNf%PX18pc>(?U;J2xnV834p}>Sa z^mr`GS|_==*2%4go6+=SI<2DoysYyw_br*xIIP|dLP1gZXbskTrk~8cY3Q=lg^n_c+U)8TUF~E# zYDI^v(`8AWjx@hePQb}<*q_4j`K5Vgv$?O49d)WuO6txvN`ae=7=rmG5Z?sm&!O0f ze)L3dxU}9g^=P_H8AIw;TAjxG8Zg@}J)NCb^=$H>v-9-6?oQ-_XX_U>moW=4y(%j; zB~4XkE3Qa}sd{EcnNs_z;Z6|=vjhVL!={?Ed1t!6Vm3YWI&N5k+3z~VhCJg zIE6y^P=JiqxL}{mX4_uJu1GaJMQHWOYF&?pErh^1GlEkD$_kvtX+d*fy)rnE~@LF1!&tRxQlax`x7MsKER8Di)NXtz_=cU={e9O{`twFSg7YVHuuj^90?qSRlP7@T~E{aB; zOw|-o%&`uegR*A&OV0L}E)`19udr1X^F4)XX+^ABEjOwLj73Kh5iJqHeSA&BQm7&c zh}LF#)}pzoaZ5rSd|rr9>0BMn)guJUa~3_UBSGQaniP%nq-fq?qTP0R-k1&VheGEZaxcfYTw_t8LvRm!@1FYOJylFGhBoeslmk=b- z;z%-)K?~)Gkmv_9rhrFdmQ^bY{#;s$S!C5|JH2?HH@pNd*fj-7>qW|lI9ZusCcCwY zku2A-W@aGvQI5~m!!5y)ds@5Ni-wD$)N%N-8E#q@ug7C@Pi4J)CuRA@OHSX8|0 zKgPFHG@sy#CN5z~bkdjTHFRDoOnOTdU(M%4v~-v)V}?p+!bT`;M2cMBETubDyP`3L zh@GkHT_IQLI2jizbLDXBBIBm(a8hq0te7lP$betV%H+k*QWciKPs= z$ver$P#=tk|Rl+r(OA)!v-u>Cpbu}ge*;F=jyZ=l4YV8 z#Y7#UkvAnV(ko(uR>pi9=zANmpf(>1KyP$4OH|9vx+X^>wi2sr#X`zaMAU%1)uP+y z7!Nv@0=)<~m>A!JcM#B%9uu7!2NzTHGT@Kwb@TC6xxqnQdAnQy4Ho@%CJN)!;M+>n z=$D%;w56yig_Myb-`5taj1AgFFSKF!o;%*{Qp2bf3w+z{gB*)ji(Ve;9M%W*bW5Ti zk!_!qvWiT?DiQ=I#Bhxk6Ic~dVua(4z2a58JIvd{aS-R>VK!t%hU0JGT+Bn@0E*hY zvMtt%xtPKuX@V%ykyNbRs(bVKR^Dq=3sK7v13Ds3Qihsmao?0YQXpR*i=zSiV;Y6$ z0RM&<@6Mw}lf!x#!20(+W9L1aoBx@$0Z+rbG+v35(K4zV5mq-lAx-zAWxFP*p?a#^ zj@x)H9@Ed%!Xu-?W zLS2*#RDv8dEZR*ti0to)IuN79j1~`SMX#7{Yw=bl$WoG+ zZkbiRWU+=ho{AN8DqagjYFVw*-*6}$^EZi#~qdukd(1t9UrFsFJ8y9DD$_h zAZ0z` z&36A@>v$|$;Eh4u(BxvN)zNiB==$R|sv4{7opB!T_fQ_sSwssD^i_X0Q_+=7qZ%e! zld2TW(PW!wQ2BrosdYI^?P#z9TK-0yGA+<&j7Jb(x$mQu?6}0SA){fZ5H1u}0%bB6 zOQ?;GK3UPzY_Q8(wTMV{%|<2EPLLs!@bUp)IMNnH#Gh%2y-AH61VXq~?cq_apRkQ` zgB$cnG}A<4NT=khO~!TBsUuY0(mPfsXAo_(f|_yG$a-1~UutJONNCckuoU9aCj%nZ zR}*qJqz`flecw^p%6~^@{_7RYVc|d{P>C^oA8 zc+#vmOfr$EF@><=$R0|FjQhHx+|-isRGRKpL{-Tky=H)lr=9U!C(+}xRisi2YaO=N zAf0i(rwbK2?e&g(_+|w`^$?cJhqGBB8z>D-b6m0M0PevYqtMFx#s^lrQSeDInJQ(4 zPzLL19jieJyyz(LesD6apmnA0vGZz1#L`kQrq?<)#hG9-sHKF*iuG;T?y9X&SmN+h zw%bfwL=q7RK|qwGF^+e0!EUrI+vo=z~~dW`NP2{e@#ooZgm=ptk4o~omI6tU#@ zG$JG$(ntaeCX6^L6w9@CG8Aocb+3d_Oeo$&%boy|wR_!acii6rAJ#wijfaRB(T+$}uF)M=Gxc#Z#tN}^ zCzUVDv9cGjnQASOZ55n>r<5X-;kv?4 z{Y0gg^mCL`G3y1%LJLK?XH~lKtS)BzOdD(;G^JMpSzQQr5UNRcTXHv3P>W`+-5w9* zDw#4-%+g_4=(Cd%=RdA$A&{CpV%qrrn)lKPvPJGa_;tCNk za!NIu()!7kx0>rOxO%WS)-Ba z`q267_^ii%nkArUeu8#M8C978=A@z<3y6j(4}99M72}Cki2=WN3g=|9#V~2qAxWys zx?Yq4<+!_cL#x&`qQtQ@c#*&(<9hAEQ#j}Kjo}ic#c5j8vMIL6(0UGMDI7qw5O-XU zJG@7Lrl43Va8hzmH_R39M>}+)2ujGAgrvw56dFJe+#=u@KS0;Xith_V0Rnus}v6ZexW2r zx>=Do%0myG0b4s5gB?8VLjX#Jmk<8Bmsw#VwelNS+f|e>#^>a{_H8 zaSOKd`8bbTb=HyXG{xGf8q-bX2&0%qkW@oJlDWFSh;dyuN)J-CQY}>@YN;q=vk{Y} z4Z<#aOKlm0wl(r~m#L9N@T@vSgd*w|44jpwXqzPw_xm7~;|5%gMR-aBk8&hJk(#em zi_}sS-(YLd{zkl-jtV}QgDOjvbT*f-rySg2F~-X}oVS!q>2Qy-u@D;(ctZhCaM?>3 za(&8!J>yYz>u(Swp(Y$E9c1KiKU_n#P>~B3&_EY8%j0AYshfQpXb zir^`U>f;fl?HEKjNUA}fzXD!shNLZv<-waP6?n4*@(i-&$dHb6z^atN3tnk~@6{5E z3+B<+mFCN#W|f3|p5UCiKPC7HE<5FE?@h~aZz#irNP#aAWV<&kOK`pSv+P;2;Ww0+ z0_+$tK@GVlyIyI`=#}g#@4f4dHcD97R&%&U5pFqXR}uZQ>>9{|JC7{cP(Y{iPBK>n zW{k674PsMMtidb`P@iG6N(H6|vVka2t~9L6ab;B!{mo>Pw~Jy4`T^E0Kr;IE4X8Q!9boQh2xqTV507vRQ6K zfGvQ!aso?(F34U2y!9!-sC*szTZKNblo-KWJ#%$`m{(@0=7PLcMMr$Vg0KwcvLie1 zCs+y9aux;Fa!&u=haFU%jf)G)Z~#ZqDaLZTTo{ibuIXq~ZiG=e25cXwQpp?dD+L^w zk8n5HF!Zulvp}}efSX7X`XXay*X?)NE4$2*mF6r_!t$WM)v6@=;2CHzupr<@cE`<< z9lQc+xqv-P>MfR9*hi#{b&c{Q2@8q^UdA}(GC8&cK7H52uW8*u#byvQpEPoK0$3(s z0BY$BFuJ%yG+ExXqC=*V0-2g&c(Y|Jj4XZ z;R<L@X<6*GE`B+=|;NVhmZ`royKxZGeOV; zN1@||!9Yr-WyKOA-Fn(D!8=W*uA<>|I+X^CDvMS;LZw@a>jk;lu12~UmJacvMuo+Q z#xkLTXsfP zghsfpkOakL@h(Hl4x24naeSKDC(s$0{%esA5UoHD@&VNFA_mfnG4vIzoXBOmUzaM59;FH^SkjUE!UYl&)91qLb&a65WX#QN1*7)-~8U zpd#*(eT_~hD#-n0FBEL!Q3U5xbS2VibR<$vWW|JEEk?^oI3!M{iLgTwVG7So$?P;s zPvig(r)=RJnEGVT@=ivItWTHP%w);i34{Xyk7V1~4oes3G2Fn^Q!TKUaBKlnUo1|} zG4;?RvvJ-^iI)F{3S*(o?8Tf*WQ9P`FAWM`y#nQ$sh&ln8OeXNj76}sFa2aGg zkhJ05hP6X^L+pihr>{g)RW|~l2+=rTbPgF`jS~ri5Aea3Pp=B~EE$hFoQ1ILhrjyY`yF5P7nsT=8$;UHP$nLm|8XI%YC zr0?vo*8NY`mDxxp+D_+a%=Mh6hMrTmHd}L z!kAP@!5Zv$ZAWc(kCG*FlBo1tyXkLRkBJiO0i%QsQAeyV47LR5!t{5Gj^PM{6D*ge zLzzscPjg9c5Y4B$g5=|3vGGhJJ|J64UP|OMb)wS@)dqY5m+^jI@>zW|P)}F5h(sbS zR3lnNGSU-OyKNAjjP9*xA<`z2ac!8a^8q4lV(nP3rY9mOVtk*8#tkNx2b+`AN`-2z4BsU;`V1muN{z71L`x_{#mq$5wPCMf z$PL)TlLS(>iJA4tm4~__rXWHEqHG!*U=E|rtUJJh^@~{Ek>Qi9Ewl|JPgueI=|D&> z=)DY=NSThnG5tY>@LANb&zYfZ09J*j;w&DT^-;h+l%=hm;RZux!8YJIMpJ^Rej_Co zzz{+KyMjm^Zwh)3WxPh1t#m_`yi$_W$sbnrn;))EI5QE(j_(5VmORmkWbD%4;_MhN29M@y$Mi#;qZ1|bz zM6h=$?*F~5YcWhAfi&U-TO`UMi{gs$B2!{;QJ@H%fk+}!)6}{Z#pnBt>J-?_vttcW zfH6FW%d;{EkvSwM45$Iv2{q0FzX{5^k&rpoFV^tM1^Hl~52I9`iYgSzXcmtcILwSNtrJ6I$$mZAWERepcK<2(PSCzc)Lj?C+Kw~mF^P? zIO9SNkzG(X7aH(6f@1OMdZr>80mmU?X$oJ4_ponaV3X_m#oYbMR8%U+8$*E9#RyI4 zP#Q}TQ+~6B&tapnaF3($F_soUmdNb5$lC3oVn?KOI4l^^ZcS_yxfB-3;%KRY1kl`M zE-z#{Nsv=153WtFfrL@rwnz(0dqW8?0(&g6k?|!#ltMV|GmGQ#mNqY1XT=VG5Wq8x zjm~5^vZ~7U*+AWHr{~7>PP-9lhNY0=2Gxslum@0Ib{L2*3j2fv|nKD(TG$NtRX9ocI83pI686^IJY| z`ewDJ+p4S0`I-LAh-zwgqAQv837GhnHP@|awf*Y?--Rij_&@_Qzcl~{p7}>A=s{cW z{P`mc{=a;LVP|JCd>EX+SVyVlo;I)Isq-7aUkuMEs0ti10Bx8RnK|f~0S-V4B!ptf z1YA+S55>JcDuf{@J+IJNlnGT(+2^ZZVYytELTX5rBqUHq{Ynt=ddoqtFQ~!=nXguJ z(=yex9E|4N$&i`pcz?6zL}6Y#c2d^PMh3*LSyk1sx(;VP7M@SZ=?yj4N`hw3R;@Py zUe(S+2GhbKE$jf@q)B&B1*KApJ60&89581N#;A<9-j*N~jmtW1l{^(lq z4P@2qDWj2H;nTgAVR`_9| z7+-$KE!VEP^Y>$uytV9fO zzx=`T7hV3{yH%7%Mi3g3NtO!?5S zKfdg=tN-cn%l~=JB5{*?^jCkf_3Uq4bkJK{&yi0IzWLQ3{cufd&)hNm&DBS4uWx*O z(F5T%FWnRcqAYOQ)#DqpSAOvqXFZ-B1n)6_cI9r{4!-m=UsFdHk1QJ5y7`yL<`c3D2Y z%gEBD%SJ{(^e_aOxkpCMJ#zZ2SxYwC^A4N2w}^K_(!o+ef{4eh;;<#hB1a=fUbFU^ zv2zcdehp5u%zJAp`#MNN4sl=DeaXH{)*QEpeEy+NEq(KakG|)B+}`Dnxqs;&f$Z)+ zUhQ^Z$>PyvXCbSnWnWfyIdRD-NdH1*07)2GwCUH`lNUXH`RIRM|B;P9{>j&`^Iu$u zerV!~v+jD=yzR#qKgKROQ@z``jr&H+yYbhP&WWS%Abj9%{qpOq$36N9IXD&|+t`BZ*c z@R?`xq4rTX{5)M1Pblnm;J(arCmj_q3)_ErntklWckR0Po}XX!yM2E>F!oB{ck>yO z{}#XX-N#0JFI?O_)U&H|`+c`y=cc}O@)aMernU3Z-@f|p+tD{y+{Ek<}Z|UUKet z-}%<|Q(rxF^KbVz|qU%(B;a zuitgtB?q3icI5@HbqY(rnoLj++Si}8{^pNAf8lP&eC)#q{PMg50+0OS!Tz?J-^4rI zn@dkQJMsC(7rC#$cJ$9adg@oy-5$F23hu&tPCqDlU+R0yzx((r%C5Kn^q`B*_iumj(uWw|eeV8!wpDNYIDPNOeznUe zuB`sb@yC9BpNF5n>H72U?kw@$I=JxdThEyWkl!Gi{~h!V^lu74mLiKm4Hsa@_>c7H zr~513eY1Yix=mkvE6Sd^{8WUR!3@BV5E4LqGxvZY$NpsuaTl)+NDd&$I=9}#mK=i| zg&c9s;ny5??jbwH5jXb^FtSr%TL2>?yC8e)vU2J?FTlv?UVjcpPJHyHD=zxxrDKP$ z_{wE(+;Ym{e+*2BV-VP?T)O z`^9y2LtcK;)kppDsVlEa{_2-M{N$}{^*0yXxb^et^Y`3mp_W?wPV*Ve=>OKKb@%^d)n7FoV4wx;vpfQ zQu?hoegHuo_rUk}umAkM?8L;I?05G0y%*bm@Y>O>^Vyd_o!t7;d#i6-e1ZDx%j=$2 zGoRc3x$}R9-te*9cAm!{zjg0J&`9*-r)~W0{jXnm#FEQizUlmpTZ~;kx9%4gke?}^ z>|6Ebm5-kA+q*mG9&p5U?|kwOz>#|ZN45@eWMp(cfGh>*{W}4OD?^wcLw$%h-~xyr z7N+p@?cb#he+@5QyyQzO4!h(hhek6mFMZ`y`(qO?2R<(*h2LCoz$c#jL&EsovK!YT zqc82h@$JltC(gugxZ)3weZO+mk@Y=)wDq1B4?6z-!!Enp+3gF_3r>D=-=O!A2UfE` zT%$ks@By9QeR%h$&OGh2uOGGeZsB6~!>e9X{73AQ*r#~NZJ&PY_g7v0Xy)$w3K{L< z<+qQ$^~g;pjJ4W#o-~47xQ%>t_5a!M#yE5Af!}-ghj-ky`!lB={NqP9+;QSp-dw%= zqDyzZL=xWZ`?Y0X*4U`_cafG+uMKoMf+cWwKYkfaagjRxg7t*1Kskj zdz_7*=RJS(ElA-vr6t&f)!QyU|PbKW)TwbrK}o*3fAmJtU`u>Qgo z8&vIm2r{?g?-W1g8!0=@uw}$GP7fJdvSnmB)VKsbi)O8Yr6b7Z*OB9AFlTgR-zfvc zeBU8?$psr(@*tb;i)2Zl(DYbX}}9j12JPie)hMIE2|%|)4r!azwr-) z_v+tU_M6kgXJ3#Vdm{9}E#LY~dS(5+@pp>XFJ19Z`)$had1&{EZ5JHzq3G79T1UR{ z@?+cDKU+=z{Fv{*))>6<>pS+_?}qJXto48YsHdJ;{p0$RpFi@5J>R_UcDMSMT$?4M%HZ=X+~!t=jVFb1!f8{2^OAS^2i?wca{$*$MfVpIv?U z?$6$B9+1A{nZTL%ohLkV{groN#GjsiYVztcuI0BKbnmB#BlkM~yQ>emlfCLx`Fn}8 z_RD&wI+v~E~;=5@=TE#Cd~vbTK1iCa&7_%jpIcOE(L_K#eD*dFm0HiVwYyuA$zU-G5n Gw*6n5AJ$p` literal 0 HcmV?d00001 diff --git a/Tuist/Signing/iBox.Release.mobileprovision b/Tuist/Signing/iBox.Release.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..3c12147f330e9c66680eb7204a3623b9c1523322 GIT binary patch literal 13200 zcmd6Od7RtSwSQ(Z*%MMoNPrMBBrJi+#In4Moo16PS(a_tmTh?ph02mF+mdXLH`#7k z5+Kk3O`$X|DSZ&gYg1ZEfv}VS1%9l7K9&G2OCC!}3$HYkB`t-=Bk#zbHH07Zk6+(! zJ|BO^y1L7`_nz}T-*fIYvcYos^@=A1Z2aKZKKt?wr^Onsb|BIjVsqQG_|)bl`FYoVbx;ua%6F@R1k_{t{|^k%thV( zj>T(MPhWX55p+e9A+oom<|@_R5QqC|SMTC}lL;%8RLNu_qC{`VPe-D?(1*!H1{U`& z&Q`0X6(*Ce>&tng)^ee!85Jw0P`Ox=%GIVHI_rl9%f+g=7>4QeK297c6>~y$_4H{g z6{)!zhNFo9uSqLS#v_zgs$~#%b;8vP-S?)84J+E4!;6iTrlB{ZE!CXBS7D;GC>5%? zOin6?%2Fl=RfqcG%VmCSr!0rLoK9N+!^ZYz8mVS9bCsobrvzUe6-tDM)hL2m`w?qD zYKxlD6*gpr&6ZkeYQGwiDWvk%OtGwePJoeV<${qhLyr_U%117*=ZuXU_ip8Qap_6| zwpU{K0xwJA$iNw1tw^TfRVJjmq#9e~f?a}zf@PB`BXx(TKW!z*pvGR+D>Z`#Y7DAFD)n~_$w*o<3Kc`Sg-%3xN>QBEDfF}C8y2;9tYtj@|wBF3@= zK~!Q8~rebI+-lz*ytVz4QYMOE*eB4MXMr!)G{d|i#<`I3AhfPl<7F%d4MQLCM%0>xz9R!qe?nMc(s z?aGep#}_3*K5}?&J}wr+*_L7pa5kKck{pB6op-YCPomjuTFa`iu4O)se14uZjnkjo zAJUCsK^Mk4FxX?u%I!174 zIiw>=1SM5BTWdJ`JfVn{r)i`W2xTZC6qV8BK)N*OEZFjWK{F59(K2O99w}2xglj@{ zP;r~$#eBmf6?i=#ZDj1EV0RRX=8)b@MdA#Krn!n(MoMzF##WLgjeEbz8k zS_&sZ$rg($Y0i^vCIuTR2&@y761Q_L(KqO(OM}D!My9f0Udc>C39&SRu^3*o(yk!k za$$K^Cos^FFcQUBj|ss$elCq}5Z{V1z6ynvY@_wXa#I zuHLsB~fQ}s7z;?W{Zf1 zo2eF~2LLCqu+`8@k;WqMozrER3>*4Iut~44n4+_FF`vRXoS{7?_z+{pgmrP@Rk?{* z%mxOipwj`Brkpj}6E5-zMoyx!rbww89}i?jz>Q=&+v(gt0XR5J7J+ga{TVW}+kFnVJa`ji0xW|$8RI3wYC0aPi5{lL5CY|L zRVa+*+&EyYJ6A1=p0F;oVC^liONZ^-__1SIz?353X-V`bbp}ti*Wb&MxJhRj1}l!~ zn;{q+X}>3AHjd-boP{R^w68RvF-jdXhiSEs4{Igopev6B+xo~la4h2>ag1@{R!k@L zq;GT|LD%&5I4+z$!aKl6kfHrQ*=hQvsKcEpiZpRbcVdCq&|?4IC za;2CxiDt%Z_tn!**+!I`VjgpHs1O%xQdm(^u402q*4^eHhuNaMYG>TBWEt@$YqE>> zuqE9WBSL0(-W1X#Pr1brV#uV?dM4$d?Q#%2w;a<_E{@E~Er-KWOSFOmnX)C1s*a+U zu$9Xuc2%2-@P^ADW(Y&9gdoHHq(K5Du^*UPCZ~=gHf@g|Oz6YbYV4NaD$;b21LPtU z-S83(qGfn{Rn96ho?;mi10=%WJ&r4sD>6t$=(L4kNe{+D8CE1^nWdN{O=5YBAuurx z*3mLNJha0Z3}IY=V;mO%Zx|>WUWhT&O$ARGk8x?FQ4%%Ig~{#;gEI`FsI52^sHdn{ z0IW8fLSss&4LC*8mQBYwhKRCFR&!eYs(~c2tblU5Ti59rd{1+oIxcj)2L{Vv2r|%2 z#XC$R3@juS76J^Qb$|dy&}IdkIiANP0#gmo?hOx(N5--Qc=UQYg6Gl}8DVmG$rv9P z21BS}H5oU1LEc&iy<$xU(_wz@7|SuXU^EtFIa2rNdN7>G>U_cr=%&`wO4vZTBeD@1 z(-WM>TTf|fCB=nHf+gJK<6dA!&`u581Paz77T}_0ubXj^#`;zOaWp`QDuZ(jhN>Y> z*Gb9aHU870rndJZYG!nwuBX{H(yMuB18l`MPIeeqg>kJ%nu8xeAQp>x!kyv z*Bt>psHWmJM6f`4wgP%gfp?-oSs2ExwVC1w%k;-p#i(mA&s2hDsMxr@>UcoSTbF=2 z`Zd)Bd#+QM9!+X7BpER`!SmEX_Le{H&cmLdDFcmLc$^@-hUXpeq@WWc%-65kRM8^> zv#plWnotwa2FRn7sBANQiiu3GdA8NFdM8* zDl5htNJmDl%CNczbO_2FRYumCq~^}^sMt(fV&Dyt7T7$RMpf{{2tr`ad@|ms2&h^} zYi{tGFjkafNYE?6g4ff90N8sBym2@Sb6|+L8#VMB?6TUaD=*_qjvZ?_D(2_H$JY97GRRO9c>J)pTQd1c9t_21kGs{Jd93adN5`2*2M&{ zB!e9R(>HX21e*qYLi{in0j*Sxd8aJ~V}k~)9_P`R&0z0*+zRgu#u5OXX|Ef2e=I{_ zjd4+dKUZXk@pDAdXjM%Qx&WMY&}T1Uu&pK!d{QO>Gv#U{)1;9~%&$fUj`Je0M9 z(eY&rB{ZlOmg>mEFywHQ=l0gq7FK2vQuar157Qzw#>E^14vBTu7q+4dW+5jOHV{$9! z9aM6qf>bYC%4KKS@AXx5!iZc)q7qIAI0xMNJQIX@>Mj|gjn2G5{TYJCFg?Z64U7(z zbb*a0vL!Kq=Tifc2}xsCEUeV5mH{tC3S7t}rR;ehrSXmd7v_uz&QypJ{n+?Gq-eo;pc0JW1(+qGILsu|ej|}Syr#b7Q3xbyjR;5Xy z#YB?2*NEI$)(^>zVV(Z6EX8OfFYCVHz9SHs`17L~3_Q!YVlhVdWPx);1)a&$&Gx57 zH{(WGi-s~1aL!n5OpoXB<`{X1G4ezu$Tp9!1h!n=! z#jvhGBrFgt*aoiEl$hpp7MhuGE6)d&Y&G7Bv1p1cdsQlz>Z>Snrsg-tF_U1`%4LcZ z>i(KzpoCEf77maZcTp?zF2NUx`)pE@N+V83d@zVRTQ1y5V4=3ohk;2N(MuHY5F%{` zceJA)u!wOq29#6*B4;_+sUtA^!9v5H##use0qn+dvjD_Uzh7FRAP^erdS-)k#91B!A-pYDBeId=;a23TE?~8>L zyj*bP8(|+NVD&n0)$0|z63nn}-h~v+GG0u&+_kvWEUCCDl(Q(2yezvz28W5XAPh7z zVna3zu_F{5X1|`2rtO%E9pSJ=-|Dc3W7CDC5AL)9?q&5_6wO=;1-A3?^n%o z0e^!y1o$)q_@Wva?Jy!k5;n-tlpj9yNcI~IC^$>%QVX|@84I#oc$J`FjVKi|N#nQ^ zWVxWs6Ry*g7qUZ;VT!YIDv`~n;X7||b&n#aG-s2hQfA1C4QIzo>4K51f_T=2Bk3kS z?2in6P(;W!K?WVNXe?k34cx4qy^{rq8zF<#65!*{kLL!w$thyCpxq%Pa-4g~62Af5msWCrXS zKoqRNbG5u1?blAEJ42CW)sVx{(=6(kU8?a|EQrAbabQWl4c}a%>JpA%HWFtaUrL62*iO zor4n>7t1w>#u4)sgX8K&*#@jq8uBibEAFBqm|MkQ-yr*l67bs&NIX(8u+9yh&Z!`{C=fP#JOvsRpZ0DfHzlT6$e2gQ9 zA6WmDWm=Hv>x=muK8}p(DmI#Fn|Ao$bSP+_YlcFsD=P`g$RXSCf!t6| zj)VitDzJ7qxEwu*8#);6^pKXSe1BOg70cC1KQB~s^^vUIw3XFzt$n%&!x=+%TEKbf z(7~)YeBQUbAXW8ZS%DMP87n5IRk{ghR#``JFQk2I%4g2 zA_y|}+1w}3wYX!02a^xEIqS5!b`Hl81@TywL$pv18)$O+(xree;DHRJ9*hJ%u zwcmc^T6`VWUg9;Qqk$t=8SRL#_dCYc`O+1yNJ6cgt2Wz8GQ6+G#7iS8ctk~LS1}Iz zm*?O({woY=+zuG-9~OS-Y<^VPh7@e{G``(=`>22UVMqPrln0LIg)E;dfH??KrPBWu zWFIrenPVj%vwb60Q!Oe|VQi%@SW#K3_E-6e(hnP7)JLZ^Y~o+8@m1L4{;#w$W5qEt z`(y7;kd0EV{Ka<_Y(sYy5XTCueT8k{u)7LJx^!Vh;iARzu%t?S1<+>vg^MT%J$ln( zc-o`LF^n6dOFp)T;WLR2R2h98NdVa1LROM`l^oomIBfWwCPj<>F)+9?R{$83%BwAQ zFwNnIA%NvLni!FBs3)^zL(^%y)bDhd)BRR6YVYTr1J-^gYULe*BjdD-V==A`-Dql{9Er}Sf6sPcs`!HZ0WZ?cxdgaU8VK&_w3);zb!scd*Jyu?;JSs#evh_UAyeE z!T0_$SMcw@|5?)|A#&l)V+OCheg5AbqSuzRcQ)7e-SOdr{Ku!k+^H)}>Rf2XB7nskz0Yqo;>&$v%0zvU=}?hn;iZzKMeC zBldHy?OPq$_LDa+*c)jK+*5gN+swO8yy}O)l)5K&P3YRO{tw9d-y<_&3l`4l>N?cZ zjZ8om8Ba@kjzi{MFt_;r4~|Qp_4?!QKXO1lZqMt_iQ%oi$lA$M`zCiynlz=W3set9 zkl|;fYvUX=sT z>dT=FS!gsks%Ku$+%qP)UVrralMep=TZe3Wo0C6@{!4uca+L9UwlRU8iQQ8!KxPl= zz93Fs(bEmuKi(KX6S^j>eJiqV!rm?2f7$uX)xUk^S3kCGPEcR(-+IB_pH+7KcJs4L z&-v1Bbr*YY(X#rj!PbiIPm!>FcW%p%^}VLt8tuHTpRU8xUNrgadB2F?`XqVnbkD2q zDYgY?Ph7A(d+jSP|5SZ=VCu!&*KXZ$jHC3mSst5s@%Lj>23~qO<|v)|(>H?I__D;z z6Xwyct~u3SN$mT>InAY;@18O7o;QB<*LiO>)MJ7V-g4gH@4UBt_H38+_nQkRnP#+Z zfACgxW8nUETQAB6r^TBDiZ(8-+SHE_q@8K&RVxIrgBk65hkALSso;~-m zk6!xE`*t?YK5gzf!XM8kvhOYB?|a~lV_#qU^F#dG-+I95oe8)>0B$TB!i}?pC-!>> zB6|*7DkMG5qDKsG&RCm=U4#wjnK5T!$B4fOFyuAQ z5!8$hSP*~-Kn&Dk1||r9ssA19`Z567L*~0?ufDKn<71!Rzwhk#PFnx&e54|rw*1vq ztyBK}`>TUaYIp6|A3m`6{p1ZlU-a4ZjVoX3|KXGmj#BPEu+_sfY%H~W3W zBh8%`ti0vY*Ds%W`bFP3{tuTNZ-4U5N9uRoau6%C2Pd6%q3;ImC+x4@Kkc<|o&5`G z=A*Z5WiP+y+y(vz1CLLAZ0`Ya#_j*H;ELeda~Ev(Y`JRPhtF(1@1=YH?f9d%@%Lcg z==#k%y>;#>&+L0Ha_FIbk6gX%&J^?ASsSVc&%ETnU!3VagFSR$ zzWSY0l}qm5l$(26(mu zZSwT?{aApJ?qj|PM^-$2)7C3~eO2$t(|+-T4{tr|xm zOL~6r&P|(EZ%`*+xBSh^Tt7^&v(7rW?dfIj?k;aUe#wtN{q7xrBliG~?C9V~SNB)| znFP@LPXZ7_hfo`8wjvh00U$PTOwOUle~JuWh8O#R|H*L-m5#NFIx<{Pu#7i~+9^&OjB zxa;bV{`RA5pAPMQFcFeBPrbeOqbF}#)>|yyxuy%b{4Uqiv;TF~hkf+Y6CVHUsXOjI z>ZP+!{Oyyg?pX1QgR_sCaMg@kPoB5D`ohXtucYVwe8=EbRD^r*mnLl2-~a2)(!c+4 zho3xekzWaI!M^iwH9g~N7h;!KHm$!EN&Gq0gI=E9wRz#IQst0*wsbH3V*NVHTOK7(yx7py0t!|i@3FzuK8GNq9{-5=F_xqpvBHKfgPbnx?b*;Z6-MlV&x8?HFsTb! z{{eF5Fy?f3&1(~o%I7Yf^9I-mya`$V&`9NOWc{5dtltH}OO7uHQZKOPYBpEt6-KW- z_okb@e4*J};^D4(FJGzDAal`c1e2v|r%eXhNXDnoYm5OwY#Qio1>TB$S?sM!Wepk> zM7Wz?5Oc=e^Ga_q(_5=Z%f<~w z`THAp9k~3OeIM%Ad{E!3Bf$q3U3}ri3%0GI20pm)nzi3u_WZ5iJLbh-AFN#S?p|^B zlg*&@#T!KIPBnIxoB|()*m_;al(jVQ{)~sPEI{&Pmh0J%4TN=##3?-F4ZL zuTwi-D4z2Bcb>hg^xACljnkiaUuztA>yG*Jf4c9y#kMC-ec`3qzg3>U;glsue{}s# zn=9+T`RIam(@a<0_IJYb-ZvfB9{bl-r^&sWEcuUSZFu_CcXpUQj^x*g4+s|hqZLz@ z#ol>&_Q^-Ryt{II@Q#=4=RbG}_tMU7ccb`!z4*f5wdY+QzH7mK-^Wim=FG=tFT9ia z(b>Y|z6<7uezxg_m-m1A%(N*3x72DUn>Tb{jBMy$-`&-Pod3VVG{(eiqd&XYzJ4Ea z+(-mBZK8R`$itK_!r+r3Y% z-NB2CO0V6CoH1I-YCaJ;Va!iHt{=meA#Os#qg7{{NyLRrpFFkmyOD`gz>tT(cXxMB zxByga^to#-GNtoFk}2cMmyXp$7y^uRf@U4~_3LXc-4Q$I-Yvn$>G|7kmS)U+DYyIj z^qfD<`_~tyOv096D}ETfS|Dx~jeDe?C*?;@ww7Wk(`V&0T zyjuVIrJIF0XU=Kta&I}bbkTEnZ9L-<^v3;Ee&3o`0^|o9)<00X@|zfc^3oeGS3Z7v z!HHJ=FX+xEvu~yy&wVg``vrS{xqQoH>2l;M$78oRzV*qT`&aL`xO>FM9=Opy_|1=} zT>72Dfmt6CkDUH`^v2lf_U61zzBiXITM|k0{pTX|FSmV?VE12l{lcH!a$Wwwr%zvD xf1WU3n7;kA?!ms$^B;a=&!uNXgQdTo(4ReV=fkVC$o}74N$hMEey1=C{|5>!Oq~D# literal 0 HcmV?d00001 diff --git a/Tuist/Signing/iBoxShareExtension.Debug.mobileprovision b/Tuist/Signing/iBoxShareExtension.Debug.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..5e6c2c4c9aad1c2814f9afb007510d88ef3c2293 GIT binary patch literal 16701 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 literal 0 HcmV?d00001 diff --git a/Tuist/Signing/iBoxShareExtension.Release.mobileprovision b/Tuist/Signing/iBoxShareExtension.Release.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..b9d88150a6c954b6195d5898089e64d2273da7ca GIT binary patch literal 12415 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 literal 0 HcmV?d00001 diff --git a/Tuist/Signing/release.cer.encrypted b/Tuist/Signing/release.cer.encrypted new file mode 100644 index 0000000..e0fbb52 --- /dev/null +++ b/Tuist/Signing/release.cer.encrypted @@ -0,0 +1 @@ +/iI32Po39nIz5A4SRjThfg==-oKHwtQwnz0SLBJKPqimkZiYB6LocREJzbdXO3b9ibQhPPj0DvP1WWjG+DPDqVvX6AN43+ab6IoyNcHZ4uGIzzFYaOemQ2qmiaHjgKXpkGNNjoxQVN5Ka1wJ6NiAqUICUPIuLjiz1GUWOyMAPUnSSP2dj6wG8PpfsjalWFoTwyBUQhXgSryqL72zGGl2qtJgV42PVF9VNkGPhGP3zSdaSXbmWKJI16ijL4UH4xqDs3yPo1aULNoXySS+kYLBSqSFUUUDkqPeYh13ajCtVJJ9kc+SneR4pE0K54jHFBC/Hgl+77nmdfzCiFqMqvZI9bki7AMdFvqBXjG1ENel5V/V3My9i3+7oxURYKrLjAGuIo+99ba9Ot8xwgHAI0b+xfnQ1ztdYBZzmgNuWGT2PCK4RQl+5Sw0VUtEvauvQa9yBecvBEIHb5xwHtzyto4LEqhydeV7z9UPP1grflDqE6t4KG4K4QDbvGOOFITjXT+KzE++OrA1f66nC/0LgYz+Jvsnu9sy8smQjfOKzOrTNw7dsqZ2SOr0rGLPVYjbAqiVFelkv5EcS+XT9PH5BRzc7IkbR0An1hC+ydRqyVkmDQZ3MKL2r0wFABZ3Gmnxg/Rt/3v+QeUdVDl7a/her2SXKsR1McXdNdJ3PffvjdgtOltWnoCHDsx1YTrGTBz5trRJb8T50I5KtFfZNDZ2H7nuqFwzCs/xfmR8t7EK+XqL/SOT5vNYQaZCZMiNJPOijku2qG6YZn1Fvrq3pYNtYqaodgxD4ce5C0Y2m8OcWlh6ExSZYPBL+G1ubK70qhzdsg1X3KXU9bztGXDucUfPFwuJ5LwrBGlmeVdc62FNK3JPeKa0kWRGBEL3z9RX16S6blX5UI1g29iR96w8xlS4iPLWyWAg6SyWiZePaL7m0XhYzletj6k+h07/ZMYwrLtU+FQAJXjdfx6zAoz244eckkTzaMnr/IANtj8VvvP1NaPRnQZlSniWbx4a4vgssWdKw6EK8A00xc9uIFSjfmrqoI/MwwdsNeryrfEztqIHAZ+IQei5UiIuiatrGIHLvJe15PfbwOebVHMgK8Q1zpSsDrWZOIGMV3QipXzPSBzj7xBJ/Jyn1Ch13omwTm4hLD3g11BFIanVXeSAJc2GPBY1dV+yayrKRA5xBe83s/iLgE8wSCYxuRwzCA8kNLOzXdz19xpUqiL4jVL2sp1suiygpgcI/gv5s9HK6Mx+n6Ox7n8W9WXjwS+s0UueDJcLuAaXV2awUcm2ER7yXxU6/OVKO/2IUMr/wUV5gu46ua8r+RUYtDcS6eUak6NunabQTn/14Cp4MXC0BdZoNzHBtwffdE1XET2wEE5dnFrxv3bF097TaWMDElYOVBks0aSK2E26rb0I4BELA0qrA7vUloDhX0cSgRP0r/S+/CWFHh/0wNGIs3Bjb2PhFB3Z//wHXNac69E9VktgEDd4f0pZWaFFW/v+MdMTYezHbKciRebnmVvzJmoHCtoWQZwVdIOegtwipq+qAwKPbvBFnomesh210KnouW6ttKZNhUchEywRpISRmW6l5zmh/ediymvzdCRJFBg8a5nINNXNbVA6Q8TCjLbaimdtgJQ4ydpHqf1BGDC6SF54lMAoV5VzbLVTd/XvEAPwOzk+Vo4IAKWJUDLL8hUIZlNzDF6PK4xa9BbA3uNaV/QjctfJn6FnaHeQrbKv4NWYFGOTs8S5OnCbRcvWkmeCOehOkStytZE0vCu6M0CeNOh7dNSXJjWtYex7j+eCPCdH4q9aUH4IETpZu1fhVkdlmsJsMwZSSU9gWZlE53aLNgebPQe2C2IQwCL3s1ww75qtSIwfuQCQrjgfTTtogm1g9qxyNi2xDeqgKK9kfHLvTaKgVq7KWrTKsSElEbMINsveicHhTVsC2m+YpeSYS/XsNiJxVgNTb1ADhb6Mb+QGS05/nGR9gaLc4o9LtJc0Pq4SFnHZM5G3JG/GvNV8= \ No newline at end of file diff --git a/Tuist/Signing/release.p12.encrypted b/Tuist/Signing/release.p12.encrypted new file mode 100644 index 0000000..d875ef4 --- /dev/null +++ b/Tuist/Signing/release.p12.encrypted @@ -0,0 +1 @@ +mAAi3BCoeYUJm5Kl56ye4g==-9rSwPh46VlUcG3oarUGvTzrwCuDxv6qidrecyIJgIc1wtnm4zG5DD3QHgGfnxQpqnxniVt8TS8VNMk0mzG6I4rmWWwG3XPolvFjeb3FWSpWBWsyvkhO+S0vGMLNp07UYK1n1WJ0vaeDoVVKekvt924q1W/kfjRFaofUaQi1dj2zOyUproDNi6bUDeXkbsooh8y6xFh4FJ/wFDdUF0wT1dm71BbROFmGlJKiKiH/foxVGxTlj1Fvx0Atc/+OTpG37MF94irLa0+MmIkAsyCViTWe0dctLc04yfpMNTT93TI/vTtqiawRLChTruDTveOiEjM3mVDvbgVR5SPDEHk3JctGBbu4KN2vCLcESqQorBHaPl9y7vwO7WWFVKP6qmo0pKv//F0sQoDKj17x1DP1EyvGpFmyVqFpGJBsee/CaH0bugnidc2dxDckHOyqv1YlOxJyhiAbS3QZUVopy//g+E6CsKJg21ONC1UA1Sjp2yQ5J9bQ7jLvzkqguj6IFAUiAJ46wu+kF1BNV6reOETjE/gImiKUAfp4HMwXPiepCcoP3WftSm2KowVWje4oW+dgK5ppcT9Rxa7w5yA4uSV4smIdKJT51Wo1Viex3tAXWkhf2lth3ASYXYc/AhoHR3jXuZyiqs00vaWJpVmQsqwsV0Kp6CD4/sy3td0JJhmtXqH11Dleye1PEi4JrnfYSiVKm78VTnoXx26Gm9y4U7Y2uwsWT8RLAa57r/VAekuEuA+j/s7qqTpTyLAvGG9Xee68pgGkbBlqf1KUZdD9PkF0OI0C11Tdwwo3by/wy3vaW56IyLB+MvXegRkVVtdzjGq8srtq2seESDk1ZVncbZUDZBHV116aC/UvFZz6PTiWONM8LkVq+VqLgYz1NEuX2fJTy1e0lG55OhCIjYsAzavqLdC+x9xH83QK02YqFAf2xpIeguSO07Edcp85tsMSQKNd3oBnn04313UryF54nkYM5K4mXZKkrg4+dBaVtyu1HfPkYXB/thXD/dm4+uiHoSrFAV/6L/TOCQrpXoGJm8wfyNIv9Galh0LMjFKVhhKTeF4/FZ5+fD6e2BzfDrZJbPAJpiezwHlvx1WfSKB6cY5LI3we3q1qlRfZ74fA/8Xp31q6F6LADbW8UYcRMKaO+bPsVetxggvs1GEjiemGe3m/I99Z3qMpYtP1zl0R2pA3a5puoKwLF0f+sSZGjsx++e0EGEzB4AwvF4ZdBGE5OAc7E++obrwuGCKjSCY9wjHAxyXY+kxaN/E9hFprDWp/FiMbh01ECpy051JdX5JS0ay0/gPaJDtR/upH/1dzERzYbH9bCvcxXAAOAV2FRWX01JMVqLeaN+B4+mhuy+4MbcEhbr4H9sHcWLrUXOJMFOYJ7mZqCX7cuY1zQhiGKQc1XPhoXnfxYoeX/2CZrT2dNcL2OIR6eCpd0Eqsy81cIzDcvHkqYTYm9QE+LeAIJzab9EkLIk/gB1s8GjY80SZPofWnFNdY2M0UPbttVzZmkzTq7lOib2O8gCb6Hx6SyZ6APfmDdWcJzc760jzn4BV3zy/0HDxQyxX9+Y95AsELXMF36grk/2LM42hP0rmsxVO7Zanf2orcM3cLxzX8yfNLO/y3Wy/d5v6EecAaV/EM/tbq7uCHgmHOXaXsCog2AiuEFSE/twlLQH+472UACpTs7dOMt1CxSbf43RSAeg6e4M4Y/fM8x/ufRzZ+Abj4i4fvqsnHdO2LXSjW3BWJTYXXihjDH5VOXWblw+KbPBhpHf3Vq9+0VtU8L6IoX/mvI+jif5NPrs8KibP3rUM0dbfY005xdV7VHWbPD3cN6OxI68c+JZjMMTGWosOrwNp9a5ERJ3WlkrIQtY4XCvCUjZ3xVThiO5JdwB8tijwRsiUkdmWJwJOPHz75ON4rQkPrcRl1zlrmgXGDF2EAw98gN5mKXVNMUmuxhHH9aRT/GPVvqPgzPG6h2IC9WQaWvb4ta7YYRu0k3sQuZhSAfxRTsCMg0rUo272xaZhrGVTMgdt9yj8gBsvrkVh87XOv7KDgksusC4QJjYDDgYR5KwkaxD2CVu90PJDqIFOg9+BkzksDH7Ls0zq8tVLQfBvbENnXy7VYwSvobxLtSimscXQbH6TcaJVaTI6W7UzzSOdV6DiDYan3NncFE/DacUP8Z1GNpsbPKUOlyCfEPBQWBKLuY+IdArT+kxbjwR74NMEgPVUcIO+50OHId3VMwIVzQ2DjY29t4HrXMpvN2HQK3tstvKstkIv/piHg0MGCSr/i9Enj6V/KSoJ/NzGulPlVXJG8n1R4pDgF3pQmJE09P87p418oLehCCanuojoRwQSkWGpNBHvjlceUNmXCQbxW0aCPKxn3TLj9aJLYYUIoWxNT6m+viNbCdaIeGwm6S/PLTrfePESuPMGc/EDmsTXkuQ65edhtxlKFlqTdhyGpkrNfK70fvo7DUhYZimWvIR2cjC5CA28PqqpCRFj6R4bQ1+dJTId0kbvDh1J7LYTIfXeOblt7J8v0lv0izUmHGMDLtZtf8IBCci9Dd+b4i68Mhtoi7suO/lHm6JeaB1UkyhhbUja7jh8q1tpkms7O6D/HfMhr63NLwjL6hKu6GW+pFO7mQr3pPIR94jHaAYIssddfEQgZmu7jxYeuf9eC9hkk9wJIzBZ+rDAjed2qevRygaA2NwSIRtoOLKnjRUd2fb8JttTYZ4gNMr+tOtWc0EekKP6m5SJaBZ31gNXSFMYrq9Xp5/3uj4MD/pY0600M330SitU7G4qZTzCmV8w8AuAX2a4YRXyPKLq+IVppwBbGhf20fjnaYB4njnMlOgHq5ImkBAt6IuVUZ5CCeHxOxkHqbzZQCWSZRCXR4G9MVszrv/gWio13XVcqQxNeI0zitWAoq5/MZXgRXEbiCVDQZ+Aa4EqjKNP3IOq7hraK1jPxpDo2JTprAqS6Lg7BURfFWixrdcbmYG6i3ZjpmXd12+Ob3zfEh07fVOo1AZCmQsVLBkC+mSgSMIk83fBRW2YrAhBjA8t1BXkKb9cJPZ7vZnPmohERagm3YVFOaauPXKc/OB2wkHLiqYgcLA4o6UK43WCK3ds09nHvqn2TgtjUh/hv9Th1HRvHWB78nJmPyuyq2czC1uvqeOwHiGMvTVaFOOMR8Tb27vyeULG/sVdoKIMKltUT0/H2kx2w7syjw4CvYeda77OBvqgAipAvkP+zOjmtnIi8chBqH7528gs/73Oa/Er3nT9UWfYLyMMrgNZsmU1S6xiYFM3gnb4u4PMDiOjUrAJsXfbh9jalBshdeh8R7+7j5et7xt+xV5pUh+r0rubQ5e0Cz+JyDdRR7VsJMQjrZ+vmPXYUQz3gYO8NO4I3nUl2W8zv3jDGcjU53edoWCu2zLdHCi0buhGdoYsl5Oys4aWZcqzY3tk1QLJDVKGju8APFmTjK7d7rVVSJC9hLaNegmD/60h0m7Sl6ZW4NvmntCl78XkXNss0k1aw8zQLC0MwTgxTOYEhghk+53BNTla4zTfA9ejQfxHLR8LBxHG/U3+yIp30D9zHry9c8Lcp5tN6oLGknIgEP5/ojIQhvMnUnJSDg3pYG2ewqfbqLmQrf7EVFdsXMqNCHFnheftZgzJP+soddfV31vYHGHgmgx9siHZ9GtGgtaBwGHmOiVlC2za2faVR1ZCF47hhBD5yLSmH7MyXcZQ84/LHgeUNiUmtU/22nGnyubVaEw68RR7cIH9nr2XonuAAwhhfrdlgYQLcSHm3/AGauKwPq+3eJCQQ9qUmOqzOnObsccCirAOgJsVAAtVrYZAAFd8W/KwGYRYIqhiLMzNEWIFe3NldRHPcjDV+PUI2Mw+he6ovCaSgp9CRwFNGK/PixGekyYhMK5M6yqAEW9IPxz1Fv4PIIL43sGJLm3UKcaAVxk8RQC4U7vBqE4/++J20VjQBBpd40AWO1VSmMTi4TwURvp1rsaqMaPCJvF+QKtH3nAe+ZLOZylE5M5D068u8kOXvvVv2Uj9FdlJdgrT053c+cv6u5foHlHVayLIuYROkLiNHNzRm2088VtvhKvviVL5LiiHqSL4RaLT/lTvwPOHLry8o0DYldHM1nmQRgCG9ZVXQNmbJgcaA8fXJ5g0jk1viwJo2tkgNTinjvz0iusFq51MrgdSsj/hZptzdSm1qtozdvDCikLiuEn3jEO1M8WXnxZGKYVOYksIbMlHIxdLSKgF5Py1N81pPDyZyzMXv6dfczuhiEjOWyPQ0jKBNm4YJ0Xbq8p4SD8SqjyrhJLWIL+hCV8okwkfJg+2GaJ0XtsIQYZE3248PdgRwnn9rS/iGmtJpyW9NoeAeR2AFiLI9B22L4l7zws0DVocvdV3sh \ No newline at end of file From f553bc4991e2ddc617bd12984db8776be5d0b9d4 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:24:10 +0900 Subject: [PATCH 345/370] feat: Makefile --- Makefile | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b6cc0ec --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +gen: + tuist clean + tuist fetch + tuist generate + +clean: + tuist clean + +fclean: clean + find . -name "*.xcodeproj" -exec rm -rf {} \; + find . -name "*.xcworkspace" -exec rm -rf {} \; + +re: fclean gen + +tf: + tuist signing decrypt + tuist fetch + tuist generate + + fastlane tf \ No newline at end of file From c715f8e1e678122e4b53e105648d0c23d808f9b0 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:41:44 +0900 Subject: [PATCH 346/370] feat: add auth ignore --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 6a56f19..70b7a12 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,12 @@ .LSOverride .env +# Auth +*.key +*.p8 +*.p12 +*.cer + # Icon must end with two Icon From c35108fa1c7ecf8283f79b9cbe2d68b748bb9e5e Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 18:53:32 +0900 Subject: [PATCH 347/370] fix: change make gen --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index b6cc0ec..e8ffb27 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ gen: - tuist clean tuist fetch tuist generate From 56c22a6535ab6b8afadf8d4ac82cb9b8f2c9089e Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:00:24 +0900 Subject: [PATCH 348/370] build: git action --- .github/workflows/Deployment.yml | 63 ++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 28f23d7..af697be 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -1,5 +1,5 @@ # Author by chanhihi -# Date 2024.03.03 +# Date 2024.04.26 name: Deployment @@ -17,14 +17,8 @@ jobs: env: XCODE_VERSION: "15.2.0" SWIFT_VERSION: "5.9.2" - XCODE_PROJECT: "iBox.xcodeproj" - XCODE_SCHEME: "iBox" - XCODE_ARCHIVE_PATH: "iBox.xcarchive" - XCODE_ARCHIVE_EXPORT_PATH: "./archive" - XCODE_EXPORT_PATH: "./artifacts" TUIST_VERSION: "3.36.2" - APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }} - + steps: - name: Checkout uses: actions/checkout@v3 @@ -37,20 +31,47 @@ jobs: with: swift-version: ${{ env.SWIFT_VERSION }} + - name: .env + run: + touch .env + echo "APP_STORE_CONNECT_API_KEY_KEY_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }}" >> .env + echo "APP_STORE_CONNECT_API_KEY_ISSUER_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}" >> .env + echo "APP_STORE_CONNECT_API_KEY_KEY=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}" >> .env + - name: Install Tuist - run: sudo curl -Ls https://install.tuist.io | bash + run: curl -Ls https://install.tuist.io|bash - - name: Generate Xcode project with Tuist - run: tuist local ${{ env.TUIST_VERSION }} && tuist generate + - name: Tuist Version + run: mise use tuist@${{ env.TUIST_VERSION }} - - name: Archive for iOS (Main App and Share Extension) - run: | - xcodebuild archive -project $XCODE_PROJECT -scheme $XCODE_SCHEME -archivePath "$XCODE_ARCHIVE_EXPORT_PATH"/"$XCODE_ARCHIVE_PATH" -sdk iphoneos BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO + - name: Install Fastlane + run: brew install fastlane - - name: Export IPA - run: | - xcodebuild -exportArchive -archivePath "$XCODE_ARCHIVE_EXPORT_PATH"/"$XCODE_ARCHIVE_PATH" -exportOptionsPlist ExportOptions.plist -exportPath "$XCODE_EXPORT_PATH" - + - uses: actions/setup-ruby@v1 + with: + ruby-version: 2.7 + + - name: Tuist clean + run: tuist clean + + - name: Tuist fetch + run: tuist fetch + + - name: Tuist Signing Decrypt + run: tuist signing decrypt + + - name: Set Keychain + run: fastlane set_keychain + env: + KEYCHAIN_NAME: ${{ secrets.KEYCHAIN_NAME }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + + - name: Generate Xcode project with Tuist + run: tuist generate + + - name: Fastlane run + run: fastlane tf + - name: Tagging id: tag_version uses: mathieudutour/github-tag-action@v6.1 @@ -64,9 +85,3 @@ jobs: config-name: Release-note.yml env: GITHUB_TOKEN: ${{ secrets.CHANHIHI }} - - - name: Upload IPA - uses: actions/upload-artifact@v2 - with: - name: Box42-${{ steps.tag_version.outputs.new_tag }} - path: ${{ env.XCODE_EXPORT_PATH }}/*.ipa From d4df6a3d10ce62847e731c5ebec83ee66253de07 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:01:36 +0900 Subject: [PATCH 349/370] docs: deploy gitaction --- .github/workflows/Deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index af697be..c0af9c8 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -12,7 +12,7 @@ on: jobs: build: - name: Deploy on macOS 12 - Archive / Release for iOS + name: Deploy on macOS latest - Release for iOS runs-on: macos-latest env: XCODE_VERSION: "15.2.0" From 177a8d1e04520413ae946409d128607ceb5f26b8 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:04:33 +0900 Subject: [PATCH 350/370] build: gitcation --- .github/workflows/Deployment.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 28f23d7..e270f30 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -37,6 +37,13 @@ jobs: with: swift-version: ${{ env.SWIFT_VERSION }} + - name: .env + run: + touch .env && + echo "APP_STORE_CONNECT_API_KEY_KEY_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }}" >> .env && + echo "APP_STORE_CONNECT_API_KEY_ISSUER_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}" >> .env && + echo "APP_STORE_CONNECT_API_KEY_KEY=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}" >> .env + - name: Install Tuist run: sudo curl -Ls https://install.tuist.io | bash From c3504ff1d426d5cce58a5b9ac38dad924f1b2270 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:16:44 +0900 Subject: [PATCH 351/370] build: gitcation --- .github/workflows/Deployment.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index d448f51..674e197 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -32,14 +32,18 @@ jobs: swift-version: ${{ env.SWIFT_VERSION }} - name: .env - run: - touch .env && - echo "APP_STORE_CONNECT_API_KEY_KEY_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }}" >> .env && - echo "APP_STORE_CONNECT_API_KEY_ISSUER_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}" >> .env && - echo "APP_STORE_CONNECT_API_KEY_KEY=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}" >> .env - + run: touch .env && + echo "APP_STORE_CONNECT_API_KEY_KEY_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }}" >> .env && + echo "APP_STORE_CONNECT_API_KEY_ISSUER_ID=${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}" >> .env && + echo "APP_STORE_CONNECT_API_KEY_KEY=${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}" >> .env + + - name: Setting Master Key + run: | + echo "$MASTER_KEY" > Tuist/master.key + - name: Install Tuist - run: curl -Ls https://install.tuist.io|bash + uses: jdx/mise-action@v2 + run: mise install tuist@${{ env.TUIIST_VERSION }} - name: Tuist Version run: mise use tuist@${{ env.TUIST_VERSION }} From 50573a56aade60a7d3340ddca8c97e123dc73ff1 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:19:32 +0900 Subject: [PATCH 352/370] build: mise --- .github/workflows/Deployment.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 674e197..44271fa 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -20,8 +20,9 @@ jobs: TUIST_VERSION: "3.36.2" steps: - - name: Checkout + - name: Checkout + Mise uses: actions/checkout@v3 + uses: jdx/mise-action@v2 - name: Set Xcode version run: sudo xcode-select -s '/Applications/Xcode_15.2.0.app/Contents/Developer' @@ -42,7 +43,6 @@ jobs: echo "$MASTER_KEY" > Tuist/master.key - name: Install Tuist - uses: jdx/mise-action@v2 run: mise install tuist@${{ env.TUIIST_VERSION }} - name: Tuist Version From 9c7e4addb25d58bac14346e3d279a854a1dc2513 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:22:37 +0900 Subject: [PATCH 353/370] build: mise --- .github/workflows/Deployment.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 44271fa..272adbf 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -20,9 +20,8 @@ jobs: TUIST_VERSION: "3.36.2" steps: - - name: Checkout + Mise + - name: Checkout uses: actions/checkout@v3 - uses: jdx/mise-action@v2 - name: Set Xcode version run: sudo xcode-select -s '/Applications/Xcode_15.2.0.app/Contents/Developer' @@ -41,7 +40,10 @@ jobs: - name: Setting Master Key run: | echo "$MASTER_KEY" > Tuist/master.key - + + - name: Mise + uses: jdx/mise-action@v2 + - name: Install Tuist run: mise install tuist@${{ env.TUIIST_VERSION }} From 75876944dd3931dc495a4edb6f3236fb0feaebf3 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:30:35 +0900 Subject: [PATCH 354/370] fix: fault letter --- .github/workflows/Deployment.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 272adbf..de655eb 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -45,10 +45,7 @@ jobs: uses: jdx/mise-action@v2 - name: Install Tuist - run: mise install tuist@${{ env.TUIIST_VERSION }} - - - name: Tuist Version - run: mise use tuist@${{ env.TUIST_VERSION }} + run: mise install tuist@${{ env.TUIST_VERSION }} - name: Install Fastlane run: brew install fastlane From bd7e32b79131d24a01567deb17e217ba6eef19a4 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:38:31 +0900 Subject: [PATCH 355/370] fix: ruby --- .github/workflows/Deployment.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index de655eb..efcb0c6 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -23,6 +23,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Set up Ruby 2.6 + uses: actions/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Set Xcode version run: sudo xcode-select -s '/Applications/Xcode_15.2.0.app/Contents/Developer' @@ -49,10 +54,6 @@ jobs: - name: Install Fastlane run: brew install fastlane - - - uses: actions/setup-ruby@v1 - with: - ruby-version: 2.7 - name: Tuist clean run: tuist clean From edc268943f239b1a3aad0b4c5cdca0a99f1ae147 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:42:17 +0900 Subject: [PATCH 356/370] fix: ruby offer --- .github/workflows/Deployment.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index efcb0c6..3bedcdd 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -24,9 +24,9 @@ jobs: uses: actions/checkout@v3 - name: Set up Ruby 2.6 - uses: actions/setup-ruby@v1 + uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6 + bundler-cache: true - name: Set Xcode version run: sudo xcode-select -s '/Applications/Xcode_15.2.0.app/Contents/Developer' From 357a4dec1217ec9384f208c97921be2c93ea1cdc Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:43:54 +0900 Subject: [PATCH 357/370] fix: ruby version --- .github/workflows/Deployment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 3bedcdd..949af3f 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -26,6 +26,7 @@ jobs: - name: Set up Ruby 2.6 uses: ruby/setup-ruby@v1 with: + ruby-version: 2.6.10 bundler-cache: true - name: Set Xcode version From 7dddf0ed750b1e507afc486df491c9be2f8a9a52 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 20:51:54 +0900 Subject: [PATCH 358/370] fix: tuist version --- .github/workflows/Deployment.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 949af3f..2bfed72 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -46,13 +46,16 @@ jobs: - name: Setting Master Key run: | echo "$MASTER_KEY" > Tuist/master.key - + - name: Mise uses: jdx/mise-action@v2 - name: Install Tuist run: mise install tuist@${{ env.TUIST_VERSION }} + - name: Tuist version + run: mise use -g tuist@${{ env.TUIST_VERSION }} + - name: Install Fastlane run: brew install fastlane From 0a4a725dd8fa8456539460b6847118faaaf51a2c Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 21:10:05 +0900 Subject: [PATCH 359/370] fix: separate constant --- .github/workflows/Deployment.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 2bfed72..d31f829 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -17,6 +17,7 @@ jobs: env: XCODE_VERSION: "15.2.0" SWIFT_VERSION: "5.9.2" + RUBY_VERSION: "2.6.10" TUIST_VERSION: "3.36.2" steps: @@ -26,7 +27,7 @@ jobs: - name: Set up Ruby 2.6 uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6.10 + ruby-version: RUBY_VERSION bundler-cache: true - name: Set Xcode version From e3545406dc7c5b094022d879dcf4d4da8bd73ba7 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 21:12:22 +0900 Subject: [PATCH 360/370] fix: env.ruby_version --- .github/workflows/Deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index d31f829..d994433 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -27,7 +27,7 @@ jobs: - name: Set up Ruby 2.6 uses: ruby/setup-ruby@v1 with: - ruby-version: RUBY_VERSION + ruby-version: ${{ env.RUBY_VERSION }} bundler-cache: true - name: Set Xcode version From da5200bbc84b4b3d7853f08d26fed2e2dfbe6316 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 21:20:05 +0900 Subject: [PATCH 361/370] fix: secrets key --- .github/workflows/Deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index d994433..688cb83 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -19,7 +19,7 @@ jobs: SWIFT_VERSION: "5.9.2" RUBY_VERSION: "2.6.10" TUIST_VERSION: "3.36.2" - + steps: - name: Checkout uses: actions/checkout@v3 From f32c88c3b2527903a4b4317dce3a4c1674bee727 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 21:24:44 +0900 Subject: [PATCH 362/370] fix: secrets.Master_KEY --- .github/workflows/Deployment.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/Deployment.yml b/.github/workflows/Deployment.yml index 688cb83..49762e0 100644 --- a/.github/workflows/Deployment.yml +++ b/.github/workflows/Deployment.yml @@ -47,6 +47,8 @@ jobs: - name: Setting Master Key run: | echo "$MASTER_KEY" > Tuist/master.key + env: + MASTER_KEY: ${{secrets.MASTER_KEY}} - name: Mise uses: jdx/mise-action@v2 From 96f0d02929b2df81897192f3b106ad1a940afeea Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 26 Apr 2024 21:45:33 +0900 Subject: [PATCH 363/370] =?UTF-8?q?fix:=20=EC=B6=9C=EC=8B=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20App=20Icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppIcon.appiconset/100.png | Bin 0 -> 3464 bytes .../AppIcon.appiconset/144.png | Bin 0 -> 5166 bytes .../AppIcon.appiconset/152.png | Bin 0 -> 5607 bytes .../AppIcon.appiconset/167.png | Bin 0 -> 5882 bytes .../Assets.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 622 bytes .../Assets.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 1715 bytes .../Assets.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 2444 bytes .../Assets.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 2622 bytes .../AppIcon.appiconset/Contents.json | 78 ++++++++++++++++++ .../Assets.xcassets/AppIcons/Contents.json | 6 -- .../AppIcons/playstore.imageset/playstore.png | Bin 28764 -> 0 bytes .../appstore.imageset/Contents.json | 21 +++++ .../appstore.imageset/appstore.png | Bin 0 -> 47451 bytes .../playstore.imageset/Contents.json | 0 .../playstore.imageset/playstore.png | Bin 0 -> 24441 bytes 15 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/100.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/144.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/152.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/167.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/20.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/50.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/72.png create mode 100644 iBox/Resources/Assets.xcassets/AppIcon.appiconset/76.png delete mode 100644 iBox/Resources/Assets.xcassets/AppIcons/Contents.json delete mode 100644 iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png create mode 100644 iBox/Resources/Assets.xcassets/appstore.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/appstore.imageset/appstore.png rename iBox/Resources/Assets.xcassets/{AppIcons => }/playstore.imageset/Contents.json (100%) create mode 100644 iBox/Resources/Assets.xcassets/playstore.imageset/playstore.png diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/100.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000000000000000000000000000000000000..7b88f3386b4ad78acb32239624fb50b55f10f865 GIT binary patch literal 3464 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/144.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000000000000000000000000000000000000..209db6645ce48d91b38637fe3504a472c9fa19c3 GIT binary patch literal 5166 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 agd|Uzf2j&moBVqK0%}THil5~zL;nYfjjK!m literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/152.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000000000000000000000000000000000000..1d499a1e648db7bb035f9964660a006312f6b5fd GIT binary patch literal 5607 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/20.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000000000000000000000000000000000000..24d309eaa30080c47f9f9d6c70a7cfb1ba9d605c GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?R5(w)ls#w^Q51#0nVn5`lU490Zq0K@d8Y4(hBuWY;g=`f>TqOu9g0h7s{uIiX-8eH(-rO0pe~}2Xw-{y~ z_nddmn{%I`lv4c1GO9Ne~3#g`-cNl17MHClPt7c zg4Im|$i9TJv#@IoB(}k_BSKhk&gBZVrO82X-a_UhxGSLbyZ}e~z?y>Ql@M)&WCtV` z1EmVJRW1ARWq5H9YU1EIva|CGtXfg%XdP+KoxKaWA?!gu|hw_$TTEN`5}7Uj@$ z1vowgx4I#g09V_MiB(&!rWA>@9D<=6t4{ti|Rcph}!h7Eh?AoLMRNYW|z`XK;1U<4zkCq~Cb z_bh3E9ml0-&R~~K=D#mgxNVf!nNOK|LW-}kYF%IRkyp9rH~7#8)X^}5?f?J)07*qo IM6N<$f(aQEF8}}l literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/50.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000000000000000000000000000000000000..edd2f937f7e77871b61b5ccf1b4f069ff0b7300a GIT binary patch literal 1715 zcmV;k22A;hP)Px*ZAnByRA@u(nQLs5RT#&AZMSY~w=p&bB5cf%VWI*Gj0EK}G#Ut(8H0gE)DMsd0#3#Fg-b-Eco~aE0*I(w0urZ$7+_hqrWrQPV( zw`E-n*-7?cJLf&;`9J^vb2(?0Kp+s{9vGHEApbKK2O0UF5yBuNgN($<1N|T^KVZ>+ zVzE-nnEY5{`S|uX{Q%^y&hNL6V+0}|6c)Tty%(|9; z3()^!1P>5P5{3J{4Pi>fRW3i z4tjHpXm_uW`&aE&a9>i=GX8#|3T}D9+XnMCLVh9myMnCv{b2i#v5SY{&<3!lL0Td_ zk*9AVK-}QSSMpN1JVLw$Wg8iYCXpV2SHA^3SHO~_Ja4zbsT!zh1)C2XS@6OqV0U&8 z5KkNIc?sOj;Il&R5GWW8ojwIvfTZNZNC6Tu!r2gA*3!M=ZiAM(pm!Sff~N*7b_FES z230qqstJ;kpuHI;6v6m~D)41U@Spz*D$Bt!1Uw#iAQQ$61+M|b1Ic+XyjU?J05V2H zQfkDi(mNxDo@>uR#YS+qDj*uRFd4}j!kVn>>eQv7+n^~k00{zKm#L=MFi!>n0jAHT zWWd~YFsknw)rYinHV&+Wy7Q1S1VrcBF!5etfbLd)dolbDf9p=MS{1vwlVQ;|Jrjnn zFA-uS0Q*Xy@sgrfSn6$r!`AamGi$m5w}Qxe#5h>;VK4!Nu_3awF8&DLZ&q42tNjMK5I*4MntSPu0Z2uy;?`tI>Zi1Z)1jyg{-_j*^o10OTV#O7u%P2 zpMLdoeO{I4Pws&u+tuAeid{U0H38b2;HlM6P^{!+ON@9@WJY8QF|><;%pBkYXr(RTp%+RM8aa z*i%%U(10|;{0%UpWB`DO2gML6R@0V2%QZN*Qvnmhylxnp1BIo^z@xiVo0E{NfJ+}% z_zI*AhhOB%d>-r$#o&MeNzGP1c*UTVe9^YVKAeY@e&zpu{Bg`+zVaK;+QT6QT5=GFn)u{|k04RK|$MU;jzTNro`B zb(WHvNN#1hs@T3RwPxo6sQ(j^)8N+i0Rp1Mh!6Z;Sh52idPZqk*f{$INTb)$0(0Jk znJ+6KM|Z#vTNGQ;KNT#7XWvl)UwH^VdsP9F7#lEY-3Fpxobsls++SY_iH=|kF0qg| zMJ2N8(>go)!-TgTMomz_s!jz1U4X?Mhy-lK=8*KO_1fTZDbGr0 zNwDH`U8d%qVa)-NGmIPKjcWLMt;+lT{SRT0V$Newv>7sUqIwcC4@3hK@(|HnrwUuR zo1i%kf~$;ct?`u@=aF%0YZ))lS6Vb>e) zSkZ45JCNwlit87HK;r7&7&aedBnGF&^^-wH;_BWQHos>W`4_5KJeZ@kpj-d|002ov JPDHLkV1n4V9RUCU literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/72.png b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000000000000000000000000000000000000..aac3de7adcd2a31cc20c63a6f4369cbdbf13d21d GIT binary patch literal 2444 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 literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index af727e0..4fdf882 100644 --- a/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/iBox/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -66,6 +66,84 @@ "scale" : "3x", "size" : "60x60" }, + { + "filename" : "20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "80.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "50.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "50x50" + }, + { + "filename" : "100.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "50x50" + }, + { + "filename" : "72.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "72x72" + }, + { + "filename" : "144.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "72x72" + }, + { + "filename" : "76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "152.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "167.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, { "filename" : "1024.png", "idiom" : "ios-marketing", diff --git a/iBox/Resources/Assets.xcassets/AppIcons/Contents.json b/iBox/Resources/Assets.xcassets/AppIcons/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/AppIcons/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png b/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/playstore.png deleted file mode 100644 index e78298741be6cc7f50c2b3eb8c579c036a860196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28764 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 GAN~))E&t2_ diff --git a/iBox/Resources/Assets.xcassets/appstore.imageset/Contents.json b/iBox/Resources/Assets.xcassets/appstore.imageset/Contents.json new file mode 100644 index 0000000..a0b3a22 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/appstore.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "appstore.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/appstore.imageset/appstore.png b/iBox/Resources/Assets.xcassets/appstore.imageset/appstore.png new file mode 100644 index 0000000000000000000000000000000000000000..a738dda605c9240e0359fa56c2ca1476477c49b9 GIT binary patch literal 47451 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 LbWZ1y literal 0 HcmV?d00001 diff --git a/iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json b/iBox/Resources/Assets.xcassets/playstore.imageset/Contents.json similarity index 100% rename from iBox/Resources/Assets.xcassets/AppIcons/playstore.imageset/Contents.json rename to iBox/Resources/Assets.xcassets/playstore.imageset/Contents.json diff --git a/iBox/Resources/Assets.xcassets/playstore.imageset/playstore.png b/iBox/Resources/Assets.xcassets/playstore.imageset/playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..77b84329bccadd806d247bc9ea5d3947558b2bca GIT binary patch literal 24441 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%0AAZ+^FR`v_crAA{9sA2 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 Date: Sat, 27 Apr 2024 00:13:14 +0900 Subject: [PATCH 364/370] =?UTF-8?q?docs:=20.gitignore=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 551a3f5..dfaea8b 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,5 @@ Derived/ ### Tuist managed dependencies ### Tuist/Dependencies + +.mise.toml From be319002b14a2eb05d558749ec4ea4f9d4e6212c Mon Sep 17 00:00:00 2001 From: JH713 Date: Sat, 27 Apr 2024 00:17:38 +0900 Subject: [PATCH 365/370] =?UTF-8?q?fix:=20web=20View=20=EC=95=88=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=83=88=20=EC=B0=BD=20=EC=9D=B4=EB=8F=99=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/Web/WebView.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 298a1d7..760425d 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -71,6 +71,7 @@ class WebView: UIView { private func setupProperty() { backgroundColor = .backgroundColor webView.navigationDelegate = self + webView.uiDelegate = self progressObserver = webView.observe(\.estimatedProgress, options: .new) { [weak self] webView, _ in self?.progressView.setProgress(Float(webView.estimatedProgress), animated: true) } @@ -221,3 +222,12 @@ extension WebView: UIGestureRecognizerDelegate { } } + +extension WebView: WKUIDelegate { + func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { + if navigationAction.targetFrame == nil { + webView.load(navigationAction.request) + } + return nil + } +} From 8742cef4ff12e850bdd2116103b56407ab91b3c4 Mon Sep 17 00:00:00 2001 From: JH713 Date: Mon, 29 Apr 2024 16:07:02 +0900 Subject: [PATCH 366/370] =?UTF-8?q?fix:=20load=20=ED=9B=84=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBox/Sources/BoxList/BoxListViewModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iBox/Sources/BoxList/BoxListViewModel.swift b/iBox/Sources/BoxList/BoxListViewModel.swift index d7bbcf0..adc72f7 100644 --- a/iBox/Sources/BoxList/BoxListViewModel.swift +++ b/iBox/Sources/BoxList/BoxListViewModel.swift @@ -56,6 +56,7 @@ class BoxListViewModel { let folders = CoreDataManager.shared.getFolders() boxList = folders.map{ BoxListSectionViewModel(folder: $0) } favoriteId = UserDefaultsManager.favoriteId + output.send(.sendBoxList(boxList: boxList)) case .viewWillAppear: output.send(.sendBoxList(boxList: boxList)) if !sectionsToReload.isEmpty { From c11904fb52298dc10eedec7663441bc6093d641d Mon Sep 17 00:00:00 2001 From: noeyiz Date: Mon, 29 Apr 2024 16:11:28 +0900 Subject: [PATCH 367/370] =?UTF-8?q?style:=20=EB=9F=B0=EC=B9=98=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=B0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LaunchIcon.imageset/Contents.json | 21 ++++++++++++++++++ .../LaunchIcon.imageset/LaunchIcon.png | Bin 0 -> 47803 bytes .../CustomLaunchScreenView.swift | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 iBox/Resources/Assets.xcassets/LaunchIcon.imageset/Contents.json create mode 100644 iBox/Resources/Assets.xcassets/LaunchIcon.imageset/LaunchIcon.png diff --git a/iBox/Resources/Assets.xcassets/LaunchIcon.imageset/Contents.json b/iBox/Resources/Assets.xcassets/LaunchIcon.imageset/Contents.json new file mode 100644 index 0000000..ed1ff73 --- /dev/null +++ b/iBox/Resources/Assets.xcassets/LaunchIcon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "LaunchIcon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iBox/Resources/Assets.xcassets/LaunchIcon.imageset/LaunchIcon.png b/iBox/Resources/Assets.xcassets/LaunchIcon.imageset/LaunchIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d17824a0719d77607194d4081b2d57819ccfaa10 GIT binary patch literal 47803 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

&iOAoHv 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 literal 0 HcmV?d00001 diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift index 92876d2..d24fcf1 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenView.swift @@ -28,7 +28,7 @@ class CustomLaunchScreenView: UIView { private func configureUI() { backgroundColor = .backgroundColor - logoImageView.image = UIImage(named: "playstore") + logoImageView.image = UIImage(named: "LaunchIcon") logoImageView.contentMode = .scaleAspectFit addSubview(logoImageView) From e02780e765e2b2ac3acd5672616eacd541a6accf Mon Sep 17 00:00:00 2001 From: JH713 Date: Mon, 29 Apr 2024 17:14:39 +0900 Subject: [PATCH 368/370] =?UTF-8?q?fix:=20=EB=B9=84=EB=8F=99=EA=B8=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomLaunchScreenViewController.swift | 5 +++-- iBox/Sources/Initializer/DefaultData.swift | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 1c63d5b..5129807 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -43,7 +43,9 @@ class CustomLaunchScreenViewController: UIViewController { .sink { [weak self] result in switch result { case .success, .maxRetryReached, .later: - self?.transitionToNextScreen() + DefaultData.insertDefaultDataIfNeeded() { + self?.transitionToNextScreen() + } print("App 정상 실행") case .urlError: print("URL 에러가 발생했습니다.") @@ -66,7 +68,6 @@ class CustomLaunchScreenViewController: UIViewController { case .internalInfoError: print("info error 수집") case .initial: - self?.startupFlow() print("init") } } diff --git a/iBox/Sources/Initializer/DefaultData.swift b/iBox/Sources/Initializer/DefaultData.swift index 4cc8522..b33ea54 100644 --- a/iBox/Sources/Initializer/DefaultData.swift +++ b/iBox/Sources/Initializer/DefaultData.swift @@ -21,6 +21,8 @@ class DefaultData { completion?() } } + } else { + completion?() } } From 8f91e1d19ec70338051d05969217cae471393f70 Mon Sep 17 00:00:00 2001 From: JH713 Date: Mon, 29 Apr 2024 17:17:55 +0900 Subject: [PATCH 369/370] =?UTF-8?q?chore:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomLaunchScreen/CustomLaunchScreenViewController.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift index 5129807..4110b61 100644 --- a/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift +++ b/iBox/Sources/CustomLaunchScreen/CustomLaunchScreenViewController.swift @@ -74,10 +74,6 @@ class CustomLaunchScreenViewController: UIViewController { .store(in: &cancellables) } - private func startupFlow() { - DefaultData.insertDefaultDataIfNeeded() - } - private func transitionToNextScreen() { guard let window = self.view.window else { return } From ecc66e0de6c23917214d8622b2ba5431fd2117bb Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 29 Apr 2024 17:18:30 +0900 Subject: [PATCH 370/370] fix: change displayname for 42Box --- Project.swift | 4 ++-- .../AccentColor.colorset/Contents.json | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 iBox/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Project.swift b/Project.swift index 7e20388..3fbb9ed 100644 --- a/Project.swift +++ b/Project.swift @@ -29,7 +29,7 @@ class iBoxFactory: ProjectFactory { private let appInfoPlist: [String: Plist.Value] = [ "ITSAppUsesNonExemptEncryption": false, - "CFBundleDisplayName": "iBox", + "CFBundleDisplayName": "42Box", "CFBundleName": "iBox", "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", @@ -58,7 +58,7 @@ class iBoxFactory: ProjectFactory { ] private let shareExtensionInfoPlist: [String: Plist.Value] = [ - "CFBundleDisplayName": "iBox.Share", + "CFBundleDisplayName": "42Box.Share", "CFBundleShortVersionString": "1.0.0", "CFBundleVersion": "1", "NSExtension": [ diff --git a/iBox/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/iBox/Resources/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/iBox/Resources/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -}

779f<;-rfJMH~-{P2;VK$M7l!~y>sW3wolS$oz-jL z+lhBCIgo&P|3N&?J~T6IRX;MZs5UmWc+kQB0sYRbE~Rup6!mad(HX66mV*LaF9J2a zZ|Qy?uL`a_!pzspzECtOs^&7sRvX~k^Wlum&bzf);??SKkvi;p_^4*h*WCLbwk7e` zTFh;j`ZChTV`DVJxzDSF4>muRvwj+~q;hv;c1=cHm2$~kSm1oS0AeVd0y36wfkn; z(Fo(~eE0noO~kyEq9Y3rnl)yfRJgZVlB`X+pM6U(xF-6hJH(ttHYpMLCLpDQ7szei zhm+G$c@-z;btBm@gx~L+Td{AntDpnfYfJbQKT^K`7TK|>I&DYo^w5lBIp>i?CC5nF e8C7w93E;tzT^i!`Ntb_pHtemPt*R{iPyZjuW}Dyu diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gam/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json deleted file mode 100644 index 63f7fcb..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gam_1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_1.imageset/gam_1.png deleted file mode 100644 index 0603779c58b5b9ee77f0b9e998628d94d2eabcdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7100 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json deleted file mode 100644 index fab5903..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gam_3.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_3.imageset/gam_3.png deleted file mode 100644 index f9053436536473775a96398ce4dc0891b4e58c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7291 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601<~tL_t(&f$f@Sbd=|nfS+%g zH0r&e-Wx&!0Rl+~36KHPF<=nExH~Z>E+p|LyL*y7XOqo3_BzBkjsF(V4|BKPUz?_Bg&jXYTjTeZINxZSO0HqR2m!2tNYwMZeyA#_x2V`m_5(%PIE)mrBmZn-4XZvd3;NVOPYb%wxt^N0E z(Dwpdk(;9^C@hca8qzK6REbdT^-E!GxF zOcin@5&;3w=|zUsYWfC8sBP+`wxxsG>uuqekZGHdJDVo{&db<?$4x!x;_Ih>R9hbz`0SyB9;Gck+p7npiNOKh1bMko*V4(= znie{G2MPCe<&`CISSU>lK0mBdv+YPW7s?timCJZ-X&jM(9;mfCYMVPry;4SFZ5>V?3ed$%9xU^mqT*hPjlI;Mws^77(X6mr>}@6}ozdF2fpJ%1H>|Bc$|0WNPREm^p4 zOh)qvz&p0@e5R;f{WotvUuCF|D`)a6scq>-tH0@W5$YY+OFWpzG^Jk(Q2L_NL|1+uSe|;i`Ob*_ze6#$xwF1K((B6i%GVSXb1k z-##Hc2x|)^$1j%AGdOaO-Z(oe-g-KLaSk>H*U{_s9Lp|dPevi42+QKevvfuTQX?;? zt9Ov9>+M`AYoMjBmMLy#Yhq%j?s4$&ekg#42HyAeo;6pRhqr}~4^^5g6&$@-%8=^b z>>(8dR?eKjg4l4R62kxutzG=(KswD`19&^xuxa%y?5!;f>gx1*_MOQi=UP4UqC==} z>7=o$a(GtAxMyZ9n7997?0+cW(?%fBAbR10xzH2fFjh;#kbTBZ`0i%>}Zq)q?;}LseY6`O89ak*)nU!a}RM9#@86=-#%YXB>y32&`R_)dVd%cbm0%|oNp6F1(A7Z=7N zlSvKg4-Aj+-tIG$U++LJm9S#w1Qx`EBN1-;j#{JRlf&ofX{gD6HF?2gTW6<#SeQHz z@ZPU?|L#hM@Z0&Zk?cB?KWg6s$RrXLM2E0q)+D47L(U90dir_i>r|RL`*F6h;Pn+V z@piR0sH@kDq+Tv%M_L|Qot`jHCpIjP$Hvm^9=*!O8+@|=G}B!b8<(wKvE`A0FP}Z_ zoL16u*~KToL#G!xQ&^3mXWSjEd2?j~t`61)*U{?q96DFX!Slr+z>4??7Q~DBzcej?uO$Z0`L54*V4Rp zUCN@wDI7RgL}%ZSK|L=gTb`ahi4ZSmOzx_bZcBN6D^pph*l~*K3zFC5JQDEckG}k3Q0cHf z)Ypx_pDVgkNsU@a5U?~eB`VN^q{)GJIN9EDZIxQf$A`{wvHUuwaw#u78O`+Zeh3CU zU*uL4KX5aO+gm8v_*A^nxBxe|%I2LX36KxGv;O60-ySn?&y7~e2VbA63=R+Tt!e3^ zux51KZe}89oV_(ooqdd`)F230n=6S6_aQ#Q4_7-YE|u2t@!@PVIz6#r-aNl>I;IM_ z!Qbp38sVdqObTjRkq82driJiS;v}Q4f1{_Lys`!w+I#4#E>C^?&F7QG3|wBAYrQSC zq-S12G%4qb=GY&z7H}x51f3`n;p@Vy%i@g&wqccq zFOFW|d`TTLnUwWOlR1%9K!S^I&67_j?;aEI|7`hU(};!hyMbOVq+}Iww`z#HBO8{- zV`pt{@Yx}inr(-(xKP%JLMq|;xs!>T6m-waxm&8PxAT_+nRN6GVQH%1%~c5md$}03 zEvLAKPmf(>NTop{5m+}Tip;z+LS>ylU;ENaAB+k3-48zhSM1&Y)6LPABRSXZd~PC_ z^2(wZqC>q$<;B}lRDGSl9?YU|NJW^JGq0~mz}!ePq0#F2^hg$2CG`Nz4EN^Q1u+KG z5ZnxG@9s*Yvbhtu*?X@}jO0>rHSXGupTE4}#jyduvt|3QC3fTf;Obz_v5RGhw-%os z;>k<*O(yP^p%FEk_nxJ=z6~og6E-Z3W4xc6L0wT4$t!E%uZOc3R%>yyv*h)aiMTr% z>!U@EUnpjGdI7pyTkJOQ(kW{vOU8JYS3mI9Mv# zxIEtIP)-y@E)>~b+5em;h2Cw-}c2D_1M2ZDbS0(8HE5WiyhCB z_z0s0wRQFJ=Y8qaxA)*=ZO+@tvvD;t^$x_<)||JK=NO$#==CBg83i1=P=Y9mx5hS+M$^!Z?pw{ot$#~E0O4j&9p>Xo(&Qk5 zJe^S7+RN8!TiComgZ}%P7jqLiYv)99^vp$)r;c--7(cspOu%JD1!kY0ygE2HaVkf$ zOPC)WLei8Fqk*cXxr0CLN~3p3MX-k>8<)ppYh^f!t2J77r{;1pw;V(W^K!<))`}|? zjSLQ}05Da^i3;>!&g4KGt9=@!?^ld;%J-Y~3d&4#D;INAK_ne`$@dmaQH=}rvm+>f`Q(VK=Z*ov+b+|iN z@%oAc+#GF2>GcebkX>BMH`yih8knB}xY=7VZ%QyHGA}XJMLuKY+BN4N2{_}_ap$ww z+OI@SndH7;`uI@+NT<_t{KB{M<)yJc83DB+tRwh$rYpkwcklb@}Q{6B8{>|hkaIwERw<@h`;r)FX42-A=ad+gk6*IBD zZ^(9A)EX_jPG9C!UL}Z-7~#*lc~db_7!GXReS>_MlF79O!<}A`yCcydo}`}7CEP)_ za{aT(4|D?Yz`$ou9Cym8?l@)P>>lyllhYA_zoncbzorGHLdL60Vwn`=W%S>@Tw2H0 zBNrG{X>hVO=U2(Ijh;J+qR63hSB;L8>@1Y5Oo-&nl~UZKgQ@f5BjG~Q49DNyku53b7#LAAEy$Bsmd1T&Gx7eOGhAzEM*VooP5$+lj_r&}MJ~Mvk!?e%7+Lv71HoPq%I>NMX zNX6CaW?o(tgTIH9L4BQG&*@90>`co;rxytrXUE2;X5wIDX;5FS)v+h-3MVd?bH8b3 zCUO=;htNMXLTPFF&{R*W=a;Qmw&!8&e`w(1yi1bv1y$>-diX3ZDwF^ZCxX0OjHaQM zjvoHJFP+AYKIBpfFU+6HjK~0^X{fxRjSmiF(sf@NvNkhiesnN>10xh&D<|Ahx^BVT zSvzf=T)yAq(%bU4Z9875>JdMf9yMM$cWS7?lR~Xl$M$16oV{9uh{zUms!BO9}*5CH&O=eDu2qJcZANE$}46D_AeDFNE zl}!kOz}(4!te!L3=-8&ctB=k5GHB@N!P?xE2|lg_dpT3v)WOyA8oVuZXM@LCuTNUI zr14SgeJt0OuI64;TqvsD)YPN?rKq&FojTr^P%jsXYnv&qZDn{w&4%SOzH<?e>80h|fP-OHYUsQXn7t_j%@=ed@mHnonSNq(M zUgqxTU`K$5Gwx0{c)8ePW}-kYmm(1aL{UT(L8Z|!Fr=ccxs#^OUMgyv=uMxihE zcQQ+vof!8Yj?Ux$e_c$wUouXgbg60Sp58U2S=z5=#*j|pBUPAUrZhomYI4V|M^qYy z)oMlt1`)I)SeVMHP0^)Tn@Urn$9v_5N6#?Y$d6UN_sga2Eltw)mKMv(s+!fUJ;RDV zjYOu`V*;XHA_y8sbF|LZN>xyB(3k$9;f8y_$0$EuAO4}skH9~4`4RYsF8_4E{|n)g V6akk)D#ri-002ovPDHLkV1mU0J01W4 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json deleted file mode 100644 index f8848bd..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gam_4.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png b/iBox/Resources/Assets.xcassets/42pack_icon/gam/gam_4.imageset/gam_4.png deleted file mode 100644 index 81225ecde3d89a94661f41f4b94a051b566c8e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6947 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601z)pL_t(&f$f@mbd=?t$3O4f zCo@TAGP&RH7a(_n+(AICR4J5d5f!zoo_cnrZuhjOTf6_XZuOjcY+bv%Zd(r)DxRX2 zw%#e1h!6;bm_TkMnVC$I$$gTUWbT*u-9G}UD1;>FY1j4p_w&y4`#jGx&+qd51WA(k z|0Ll{;4iqo1pcDyOW-fMK6hZ(*s#p$7}Ht1%&P{59r-R_SQV0FG8qzTxfF@fD*Wk* z25Uk2(qmCNT~Kd~`&Os1!Eu@`132A2LJ@K9#s~shrJT~7WWI58CB8t2BMlen>b8=n zla4ITN_b%H=FRpSv3J41Lwz>k=<(A#%oCCQGQEMd6$NzJ$2im8%akv`e126X2*gCG zDNKuJRcS88*~#d&8Uz8tkqE8UAr97_L*tpCEW>zr&C>GM6Ed?FWcY%CUwiG~Q)g_G z-z_f8*Jh`fIQ&r;{i9AI;@p2vE(n-nqA1NtW?f|g=?O;EY9+!a#z_(kI$Rw5pou}N z#aEiBedL?FcD%9>yXOsT?YJPEY3}^-IlK2q)nz5f<#G<6>txawnA?N`s1*wGQ%x)_ z%AmS96JvDLrJH+p`GX-29BHJZt%EX?^1dAp?wmLDyn$cc|LV@hfxvH;Rh4Q*N#gy6 zPW-{^dk>i)5Uo{Fnv=rPqD)G1lF@6`2*M}#b9T9X0p6%>qN}ytyE@14;8(V9eQiG9 z&kOie?U4=dHuWFLD=b8>)$n$GJO0r1VNKCmHdGc+Q<6opDHetN`n!2Gg~AcWoKuXs zJRGWT!#&X3y}meM{kl80%=sdlGjMxzL*hGiZHFS!$>kM=8N628geP!y_b32rg`9{a z5f&joEuQc1*nm!}nyXz`C=d)|85reEn~f&39l1=#mQ_o5x9&VCVb`zkTvzc}PI=Xw zT-Ka{f4gu0lkF4or*232+iYK%fIBPmu#d44KYg_#`wsEhhG8%l+o-P_kv zS&;sz3+Y;lh$7A@FU?(c&b0T?HQ<=}>nP=NHdN+OkdeqA-aAP}ob2oOe(TV zqgDO#yJvD2zfbBTlcSGCz&#;!FzC6HuwH zbSb_-i02L*qs=x#tWLvswy&coGvQOeFG&(kx0j2y5l&n%(`9$y_6Lxp>D^3-jiNj+ zm1QN_WT%=?EC0G^9kyX!dgCzFMrq5AhwgjxhJoA8H!1fYz0gonQdH*h`Z?3lN17>y zRZDUx%TFWO6oW!8zvlNx8@t$h=q%xg$i}KdcHLHkTsFNd5m98!>87!xms9OF`bS+e zm!Mi9Cnq_M6^pYe%TL1;tGntvfl!z|Z`I+lcGf<)ZT+UCocvk;%hv^d@umH%EK|aX zZ``ti7OS1bIjJnlNtua+uBY)SFF${+7PEbf_*gwZyl)eFjf(F6QR>@zxL_T`=?Nf8 z(oDp)C^M0@75NlqBwaNS`J@^JPlH$w+mKJ4FUYLPit421@Km?{2_2qX?G1%F0^oeh6-J~;IyNEC= zaC`GdhL?}EPdv131I1a%b2dN%++IJOwqa_UyXm%%;qp$0o^qK$oLaM^nkH2L_1$}KBi^9D zt^whQ$iS$R^JY6ITdWL@PZA7^2m(Z@m1M@pvb-dVioy&`#^?p@CQQ4ofl((77yCHd zVZ-YWv3*@RZy!FzJvHfhRX1<6EC~387x(UVspFsj=N%i-Y1LO9BLRV6h_2od8ajGu zGTWJO`w5HFpfOrCOR|$$Rhmm)T0HtF&4P9lz#j^?hH!fPL_`U-Le8#R zm-5c>MmDAL*lpju=fwp9Kl96dKTs#6J^hbgUx!M0rAr7$B8Ye?^^-@xwi=~k8aNmVV;dajben}{^B|)x&rBo~rB+guk-+lB z*(}OV!Jya9Deb$O{J}6i1EZX7?V-&!%&^lvQ$3Lh0`bvNROF|!Vo45}$#I0jBG2xB zpA7%V6OTOp$ny&V{`VL5JsF#l@zf(*R^#ynXtNGb*J7n>z=1aqLIRX>8Oa7c)kPUp z6=jf>Y?@h|`AQT;#wR_r+lKkDxf{#iIKE&Q31${FJITnhk}N6<(}|1GBfAvDOnLo0 z`^q8G{3B01`uM{O1AgY0dw-ygPkVZGSsn*JJkQ|x6v1!=iRnlvGtt1BvRq2@(x&6* z1@2}fBGNxH&bf>n0(r2q3*dv}k?jL%mVWpUtx>A=CL*HD99BsTvMSdDJ#o44L7*Jm)>$#R9qR6<*!`U_~_3gd%kGb%NBS_NpvDIl*6r{$p zsw|hHtR#&3sF`Csn=bZ_@X~?zxT`9)sAj{a&IJLtHl8uQTzheR*Vi_Xonl&0Nd~4P zE^i<}&wzvaHXF@mJB}&eOo}NJ1XAOoDa}n`by?o@f-2{?ptT=$aqQ>`cJI7RWlBlC zX5oHT;L$<5{8xXd4KH6-&BmJIc^Lqg(>@<9mg&pRGU&kV5An%46AgO4d)InW6ATL~ z|A?Z*p0`giYVA7wgWV6@GTYeeCJ)d2a_{qMQ_Akg@7^$L8u)RA!V!9h$7#IS$LTg3 zqb?6&aoVNGWdgBLYDzMbnDhm>U>!oORPgvbDh z(pg%PMQVb9j@}WTfBgdjp$IFNOjktaa+F0;!r^k$)Y(tp=mh!ciM)UKLsq40S8U#~ z&mE|xwP%RvC^g^NzJ`)(Bq@?4;R}W^_m9%h(MMBvKTeOI+iQv# zae46fcGd3OvUXE?e$kB;004fqXa7_EA>EUY-@TCpgB}U+2ZC7oM>*MIq0KhJ_>`CM zrQMXv1QKI)R2HPOd{H*(iC2G70H|&1X7BrF35FwVsxD;Ltu>CL*q>Z&s1`l=$%v{|WZ zv0@#XxFSH%C>7)-$FZy=i|XPmV)feVx|H!LFV7t~hGoD(T#Sw%-ggTrrWgXj5QC#m z>RPNcnFkn}n7ZN_M=6)FW#tm=BNOf|XU4K(TX7+W93qoOP~m70=FinEfh8VOxXqA2lBeH*_&+5`gJv0^c~$wulfSm?5k z;q>@t+}FpoBrAz!C0QJ*t*0VMy>;iV9eK8 zrJml+q6|{vW9NK}e^T}_7eC$i7be_3R0Le5wIUe_7h=I}-p z8>Qy!Ys+Xc+nKW4dTuFCU%6t_ZG&^2bKZ|>zuk9WXX|M2H@B>=)~>HAoOfmvj)*v1 zZkoIMX=v}IdvKgUC_Jb42C+H*bD@KJ(8TxX)%4j-PJ+ z$@xLwlN(o*vvFzhoRa%cIKrUA#ffG!P2F~eoNmJN=nhDTjpFuYCG-wYV6&L1NQt_4 z)4Jua8dEan1+d@;@mGF-@Fz`n&%e}ElxS~Vwg`h>`>8RaBr)ms(cM47hvzMH_Kz~@ zonLo=QZAz)HJ&x)c{E<^#bNLBmM5tnx$C}r_AkWl1p{}tw+biDwcTTJ1YR*FrLb*X z1(`{4$YcVdC^9rY$wwFaINfezz%hwGIJaYaSu#PusMoS;Nj8awXpWt0N9LaBTApY8 z;q6@G1vT>S^$+ojwx10 zRel;NrWo3LhOqSXQDl%G$xYHfuNTV%7%0h1LXd&QK8CrcpJa8|5wDd$vZ}J^ z&HRd`H{7W9nKq_bJ3G|JPBuK+H6H#(SdgzZ#2P8gNyQi)g;F8M7YGsvh6#m51Q{q5 zax_W>DutX-M8rPo#N0PT(Ca}b1dnGMHP797`^|3|lTvQDKkKqSpVq_H^NPAN7nV7_ z!Mg&;w@n7giU>*+YBg$=3b|Z{Btb-s5by^H1_P+XAhBwhB~HU15@K}+D@u#cWEcOP zw;of6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601uo=L_t(&f$f@UlvL%J$N%@< z+PAKK?R|l!p%GA&rUg`BfQW3z5fMe1iQ~j1qM12r=1k5pGbeG$NhZX^9HK@bxFG^+ z)NaEjAT21OjnGT=T1$8Bd)->@HXpjduyGQZ$?mpLj?qEWa$Wl@c0x1B5m=JiqOrY&1jdNn%ltUW5 zE?Z=<@K@8Gs{(xD$N}rguEAL`npqXg@^fj9EEB|1NM$leB@$2+2?#)*VUWu+$YnAR z^EoKRL~oIlcuy}E?VL4Z^5<3c)0pwLZCrs}-A>8h4z&DikQUY_Sh2%oHlWgOhF+rp z0MI!G*&G9g;{XAWNGM3fV#p+7a2$tVEQL;&4|F096~VSv>&3epX4XGjIr)a{c-c5E zz&)Mq)V`zNKH-hfPcssgVRB6wY0rNN^UTB4Mq|&H(VP<{xudAlcV8?3fn1Od}-&NKfOuic7W%KK6 z%1~_9;bhMs+FX7lGdXbl$j2uDP!tKhN{%TNHq~g)?iRQpgZZ(C`Ez==Vp_ z;qt>Bj3bfGg5h`+icgUQDy(|UpHYKTy*_w*x-xY}@xQHo=z(p8j5liF*5gM>r#rOm zSbt*8f`)0h{l*CpQPc&`u^fjaor5P3MW;J}4p#uaXcDn>797uGwCk)>$*^Q*Eh0%8 zZKpdh-AJxmxM==1oz*_7kwy*t%9gj*wujkQ7SFv&Hg8%D#G(sf&lfKU$mSSC5^3~! zL+JK~&@~W(Kb8cY8~JxgDU;x?S(6Y=Wzc!5jlOMyas9$&cWoby{i6bI{_vyupLIv~ z%$PO>OB?GUqR7$AbyjB<;J^td-rRQrydXfUl!9e>Wb*8g2VCM^l}v)=jZ@I$4I<-r z;ih7B$sH?Jc}6<-h=D&pc)+~>r27+%wd96%OJ+f>kd1VXi;Cw3?D+I+y!Y8jh$#w> zESn93Mu9GO0Nn#&IK3ex=o}c1yTJX88U>c$T91Rr+u`6Nd+uB~cafv2YD5{@h=E_( zy8XYLar|Q4(mBwp70{^_kcdSfNn+Hn0FcQs*!b?JIN37@y+(m&9$Es!aDu{eJW_NP zgW))O2EuT9f^hjGh|@Xb7!HCUV4}l_#;KKP+J6+2wYdAChaY@*+<;FW|6K9T;Z9Fo z-6UNilSf;>4|aVKsvQPYmzYs((m}11jmpJ+ktAMtYcKqf6za+?c=FymF8VzX1OW`o zA(o`!k0j9L4Z-ONVjvX9oT*jtM-s?-yTfZ&++nqpmS6FMFe2cWUjEDf`UK5?FPJ$A zukSsMWM(MECGcIARAJR)La7B+4kIjj4b%!LD3Sz0T-*b`c6#yRu0zN(9PXT5ht;=D z$0Z)UKrF{2o}!URXOL%kyt;Eg8qN6m^84<6X3W4x4(_*pe8Tg^?3tg@`2a z$g&2^sw*EE?Rm;EEVecsMWnC$n{`X)++?e$xa_}tMc~cbwy$W92)mxRe+evl4FG`S zcqB7f42I(9==Y=77lAhzM=YI1j$y$Kk4X^(WD*ffMM~5Z8&T~rq0DALky4J$O~-Jo z-3^0Afv4}A54*9bAYcGE-8+cQJ3hgUCefVL53M~sCg9&}+O|c|Sk`U0XZ}U^C@%&I{iiQhc($OHdTFmO2FBR9VJNl)Xfo5~j5Qa7T>1z{-5il;Jg`=jV^ z`_VfXhBuTzGMfi`UYL=KMJTuGP+Mw7mBWM*vkn@S91;;V;sp={0o$67!SC$o{lNow zRVlT)OF~^1xbt+Y>d(!s$p=?1z@&2Ph$cT@9M2<{XAzF4;POY&?G2*K8^T~DflQtQ zKRiE45Ri%~=+$yK3`Lk&YDT$L54%YRm0UX1G`NgDJK2qkeaPu4DiS*I=t_?VbQChkPR)s-~a#J10igBvk5CF8x}S!Ub3ek;Ftci<*|s^xN*bk`B2HF z1@Ey-Ne~3^yns|Dhr#gB0<`t{;0nYLNoBzdM}RYRvO*$)NvlGcMTdzcW>nY=Fb+q6 zP%MRCZ)?KrqTCOcue<-Hf`EVZhpkUBYSVMGr&PfoiKEJ4La9X$jY$$Fbwxy1Rx2>#3I=AYE(IlxMfl~wl%e&k_&D4mmfa-yMln9 zeR1ng#Rl6iEd~vmzvzURBB4{sVK)|`w#1B@5)&LIE#xu@D6+6Z;&KuM0l7SjR3-;c zFp3^;2%VlF+<_R9nf%!zgCa@Xd;1M&Y3)Wi8+`oxKYDm$LBP-be(TdBz3tgzvko5~ zZ9AunK@xzNqF_+VQDHM+Qn>|X76Xi06_oM|_t^5=9h&h9a( z7^Wg6%FH@UDzl>0s)I?ZhD7pRmNlO6JkJl;*)&*=!^^u5p%$SH>mDu8rC<8f*2lsk zE&Tl*~AjdF> zCTaM>adf(a==O%-3B{4lGGO`d%2R?MAfZTTtkQs4cUi%w~jIA%jRnjoJO% z`h0lpoo4*=bbIy81q-_i0zP@-xO&@xw#52X3s75j`NTsI1msx`u>=j5KZ3S?Kl*%O z41|-Q^9;E2wt!efK_wHT)T|pSGmFiz8@13VWe|@d%Q~aI$2)NN(PHH%Sf))ox>b(a?} z?mUbb7lfnW^1gJE>I0&oRlh|}4#71j{^P@GlCBrt20sIcl$Q*1_s z-2k0N38`3wlRX1?WA`4+w#gcn-M9MlF#)%=o{+w|zxB(hQ|qU!m^%#=NsM}b2>^B- zYQ@fjt&oT){9t(_X4aOT^9;-JNT##s9SFhc4Wi2vL@1s{jLw3&NCZ$y#jxu&SUL9w z9BS=Ctgq|9`W3e?uvJ!aV*&<%*EYZYKhCuDXaBll9(>_AEP4&>MlEC#@rasuEXQNx zj!$vC(+z`0iKp(Hk7CoMy@lrmWb+K-DH@(Y3{H0tot^;vu@q9-{8{(6XjNF=I0f(T z`vUVEq7BQ}tiELY9Tl*04YlrqT`=RG4q5RhY7L=$QB4TRC@8FK&WHO1(12S7%= z;Wc;OYBiNrj!zR00A76gjk{eb;+;F^-H7Hd+R-0~o$X>MWfIs78k88dsCF1pZXZf9 z&lDI=PY}<(z85)$#iE(DSi4|G!HI_efaiE*a(T3N4`6rmVaza6EAM@1?e3AhKVsni zZYQ<#la?l0W?XQ~luGP4_zeA`0sk-h}BBONKJ60{`VyCWk-&^#~&Uy zdwZs#Li^z2RV&{ajs2qr4i0*VkD3oW&>qE>`pFZakV){#7afSvqrZkh5(MND5%g*W zD(wc;IE<)rm|)gxAiYS1mCokz_TJ;@Zg*maMY86$d9&X(l$2iGOAR z^2#cCO^F$MPdL%RP#i~2^&w7YM}6RZz9^D_Rjb6Jo9iHz ziqU+e74mGnx3SjoYC9>~+tRus zOmmweyi8wRW=Eyn2$ti}?G3>dh$5OAK887`NEkYfk%&bwXcQ>3=uv6YgQ7^B?(@Oz z9)O9Uj~5q7f3aY}ocBy6~yR}TmJ zoK(w^FK-TKg;nt^w=$VytJ0hZltc=#SPYSf0t5jJ$Ae`U@cA6nBm)Ua?6YVjUm4}( z?uL1DTTFJxxZk_H>X%E?@hCy3Q)1_-Z%cjt(1K_xFU_+cNCJY01aH;JS*z9jx6;Zg ym#MTOe^rga_3OjezODmb>$(nnt?M5S`2PU`dwuc-maiND0000f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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%0Dy!50Qvv` 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 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json deleted file mode 100644 index 805e655..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gon_3.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png b/iBox/Resources/Assets.xcassets/42pack_icon/gon/gon_3.imageset/gon_3.png deleted file mode 100644 index c164bc09780d13625de5cf07b50b5f8d43af719f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6617 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 WnJWP&wGp5I0000f6 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%0Dy!50Qvv` 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 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gun/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json deleted file mode 100644 index 9620300..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gun_1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_1.imageset/gun_1.png deleted file mode 100644 index b8535dcd7e3154c1abff7f5f0deb72a9745eece0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6413 zcmV+o8S>_dP)f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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 bn*;uT!Mhgno8v}d00000NkvXXu0mjfX)-)< diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json deleted file mode 100644 index bbee06c..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "gun_2.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png b/iBox/Resources/Assets.xcassets/42pack_icon/gun/gun_2.imageset/gun_2.png deleted file mode 100644 index 852551390ada75cbc715da00c9c5464b09042095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5862 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601n-k%nk!)25f9gmbKbitj$(St>xZZRrAndwYn|KW*!Lj+I_0dckex?&iPjfYb}3E zLwp1LH6Pyqf8ED7z+dEdJ0*HW)rg$gqP--6oO??-WV-TSQWR z2X59^?#x#LY{xsL>3i)8>-FDY#(K&H!m&XFWC&yu2muJt<6tddK`1NSv_QC7ABk|` z3Yq)udqr}Y+26kHU*PdBrF+*tr6Ubz;14Jf$`c~v0Ay+FU^Ud!UU>j|gy6@HHcBFZ+)#Fm8)gaQU5lOR< znTLQ-@hk~?UP5pC1Hwr~q}3oZ4g|mqZNQFhLnId)5z4#MDLLaNLV5e_>^=jVzP0o9 z;CrvzvCdSPeHb$PNKF4*=$#*c4RC9(LuMQVh^Z$CBKR%8A?SM(tVKu{kz9<*IRcqd zj2`?SOti(Sta&3c`|v|#_ED|-;_u9X$9sexeETjv@a{E2r3h7eE;79i%mjYx!{{Ar z0Ezpz5iX89m7UmuxA`_~w1rRo5fT}mg_C~*xEbiaR}oHzm1)&KQe{h)&&=t4 z01nz8TWyBcFOuo?LKUBZNXp}rw`j+E@EdPKkFr8Dt+?}5iUM9}~GYBRWQk<2>=r|1lj?i2v) z@V4HEoft%@B;3kNQ3XGUAJ5iDcl{Z^eL2?nUvyFkL~;pE$(h*5Cd_CnDtF;ZReH|3 zd*}QNfc5sL@6rA5T&-p;6sqv=K_yT9N8_WrpT}>15^R777vj#jW-^}Rj3A1)^&a%V zdti6pkwj89Zpm4gktXa!uT@!xUZ~2>dwg&F-z#9f|_MsTy@n%L1+ye)TQM%sYgeG^H!xaCXG1MeVY$f{Z2oiB5b z`Ea@n(+0M~o1CEQ&rwVelG%q5bUcL!7va|b6cNfz0ML%N`(HN0n@@D-`~*Gl z7XG%CU@cDJ_i-yP0hJmL8MEtu@weQK^@qSo#jUywHS0J)#xc%P|ui9_Gc4SL((EfN-rXMI&`C_cM6R+WR%y0ujrQlXxgeo|Z zxO=VD1f9*U7+>ai3kEwhVPBL!UV)SqW!eX52D_jxE z+hZv@E#RQ}{~B*xfr+XY=Z6=Q8`DiRAo!{n6>u^Y$6*{g0|le%bX*m zQ*t&4`3V8KXBB?yqgWH5at_0ta}C1HNer<0HtcveNEf&CEL7>avD$iS3v|yb_-((# z2BW(>FJd{tj&*_=51h(N!y>s%?-Ov)_R!DG(8hmrYi~d#mwxGKc=#>L(7kH`fm3`6 z&g=_7#7Rhi9(Wsn>jPMS2;rvV)?SOsK7zR6V8#jBm*aQ62=4=DL?4a*pLuMbI7@*@Rg04S-)yT9O z+}i7Rf0&N;BUDbGrAoiL%09wfb1?ZjYY^e5zFrnNj z_OfXJo4&vPUC{abOHSFj5XwcS*Aw?s)lvMGhta)%1tD?D7UPtjl^~uCX5cOSt@mSt zQA8*UxB4n%PNI08z;9kg(7W~v@hsd7LRFU%biIgEdC?&VsH&}ny!7{CeVEePEX|;JD;BWmk z)*C>i%#Q8P2@}!)e$zeZT^}J3lWXjua*J%nZ@go&m9z-y5URYCpl=N-`^ZLBwxoV$ zz*~ONj@9KNlta+IzUP@d1V#@Eh;M zPV|9F#+`ius_0}Am7couS-g&?z<3C$Vwt-C4P-`ryHl~WVrIY%w`>DZDw6W?yIufm zk;#RGYOhD69}w3LJ%ZnKU#wvl4sQ7pRLPkMwJqJV3cu|?u)$a?9O`dOEDh=Cq_VOW zgut!%5xV~!R7QQfs<>okz(LbJ4c3p;iPQ@G?SG7EPC_EH4<$6`dT=x2+S<`Jye+@P zM%xjg9NgNUATtk605D3>_9%YOD+nwy>yTK^m@H+dT;mgIXtV>j@)C6KYEk%sFTX=1cf7X;sgTlkDBKJ)Au0qdSs=j)!Am#dVHR%xJwf+h0E@~$0k`V1m>54baxCdJ-G}ierJ<^&sQm9ImWF!Q zBBV>uvkIqt$q_R1uyr#6Hp7iYy7i$hS?~jbjun`RfzJ$uK!ghk9q_M+l*+hsSbrD( z*84Dn?}H5CR$h!MI4J>uM)$lFi)Za2lM5!Lp}BF_z-si4|3vq_j$38g30#?gFU?-$xH^{F1f6$y6tiXKTJ?nS#~x*VDJ9lo41?9fMet&gCx4!zZ>xa8)20yabI(}MQLA~N$3 zVaK~;ip3OaqD-xbbxA3+<4@-Aj0t+X*2fBriVI`XP`o0>8g$pQ_#ID!nLvaK2pw=U zBBkPU4*CQw4`Tgc6{$7j`veRSv^==pL|f;oS;tQn2UDpJ5|wuhZp~E*swyy% zjrfgsVJ3Q!NqM;SH%>MsahUxf{FY^y{kV3`>hcs3E=u@zrwt6?H{J7wi8e2Eicclj z{sLySgDF4lq*=Igu1?%P>#^90VehMxy40CCWlIv5p8c;AwEPz1MG$U!ENfef-?9vu zHSblo>Yt9E4#)I`_{jRO-}%A_Rx6b~AHU;CtUo-}l*rWb*!~=jpD^vj4*V^5VIrGj z@jT}mRPNElPkJ7~_CFA8e+H41k6U&wLGK!*n?0_|&Pf+36~S~k_Ufp`bUwQz=znvC z%%}q=jbQupSUts8BqUD3BHW6l;3R7EHpa5BH;7EDihbIjPe@-L!7zUFgUHN-F}ps* z>M^Tw7o4LCPkv^)410Z;7HnIwMi0DuyvjLJU?vETW=0&L#d0fRV`?0I$X3xqLBB@mW)!J?U|RZ7VRt4am%SA3FJq z<`XX7D}b3Fh_@{J$V4{Im6>ye2p17_ufmLV?sm+nG7iA4yB?90KpL9p#c#MBGqN>S zU{qg$%sqzB9+Jh5brEb|iJjPCWqRF*&g_fk&&2N;1KW{ip$Ff2RqtGPtPJHL^Nzs` zeT*J>8|#mJwt#eTicZ3*xHw_yX$IeqNkjfFWNHO&{m)|hnGG;Q8wj?qLGexw(Wxu<#ozsMZOKG7CY!#s>+M8ewGE;| zW*mr2DZ@+*U?Ll11%sPTsOB0(T21_kbQClA9vBZZ+=Pj?BAl=l$))eg{6)vfw7R%@ z^K{34y_jaA&6%eA#SiRQSCuuM5N;+itp>scfIx=x5vh~FLVbEU%?45IcsC~6f*tx8 z>-B@1X=G|egDgDpNSRy_-CsU_C07s4(1r{%`1S*MLuVL&X9~s>*7&hocq$1YQzqL? zjSWVzW&-J?V68DSoIi@2`LxPeaIMHVcw~=@?dAB&FPB=cUl2qJ&903f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` 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 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/lee/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json deleted file mode 100644 index 261284b..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "lee_1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_1.imageset/lee_1.png deleted file mode 100644 index 5cf5e9c019b5b9e73a5c58db74ec267e36b0073a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7149 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%0Dy!50Qvv` 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 diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json deleted file mode 100644 index 675fd62..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "lee_2.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_2.imageset/lee_2.png deleted file mode 100644 index 1c23c01c8f6e092ec6a4490c0288c1297a161f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7409 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01m?d01m?e$8V@)0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1601_cdL_t(&f$f@SU{vMO$N%SS z%kE~gNjAN2Nbey8l9+%Eks=6E1SE15x#AVYfQgilKtc)aT0ukwMWrYNK?Fo!1VR$h zd+!Npn_jk_J?H&EGvuHU;EUJ!xMyab`JFO5GtWaX41@nAA^rjWo6A4Ie|Px@`0p-{ z99Y}iO{lvRrhPT#69!uwqtu-pLY-2{B}kIy2@MznnYl`A?YP~<&HJLr*0KAM27^Zg z++C6*YDrIdcd)f}zPh`|nbzrew4MP+AOu$=0zq;>Yc-%L3VN*ujGh9=fDe)+v|>xk z7LmE>mo^bkCrO+lT2EL62E#7maTwY=fWsF61aV83(Nie-`g2q!p8!uJ#A6#b!`RL9 z#zh8{T7|y)S~RDopd&vA2Bs3m(8}_Jk3DYX&l( zK$v=Y!_>_KVjDYFeN9gnt|rE#v#bmzt}Y1Qv>jZLc$glo)1jxT9QEhVqPx5phL&dC zmO%k?9j7k*^+DntG4McbDbbR4abI&r)+;vKH)3d%ezPCt-+vFDP>A4| z)vy>nmeqfMLoHI{*FoLY4XfZ_ctyT~np4T>sVrtJ{C&@PE`DqBNaDV4;QpE-qT$!G zXWI))p0Nym3?!G2>Yq+R)6)Zz%Z2~4Hz9v^%8>8&rckOuTv;29&hiSFd3s=6>_!Nr zCamk!o%s>@pX~)h>ESr>X$1V|9q4sBR3(3p*7Ouu1$v*gpY;3`v9;rU0o*rm`FDH1 zY)Q{pY!Mtm03@n^JOQ0@5CC9cY>e?qyI^Q<&uZIKRe_YX(anBvg(5qRu?r9V#(CD_$VUcTll;|`mW+(k zh7N8JNKH|B;uv%TgSW0*298F^`VHU+42Ibz&L$543S3vdMn2#ZUA%*U5?9aVb^ zE=ET|spx=_gFQmy5+Js+y>*>ZDN(%tGxS!MGEUD-e8yqY?0ZgR_YB-!nk}q4exzHc zAqCc<;V3!y6*Rp)zzuVf%Yo;DNVw0N&;B|O4kBaQX0&BzLMk7Hh%MW}Gc+8&5W}E3 z^&&F1Z3C^-!SSgl5b)+oa0G%OYRc9Ym$gm`HBdf_sCCVXC93W6M-ooSsG z1$+0P_Uvg891g}rt%BY7Cx_oehJm6m4@LVvg1L{|37>zzH}jzZ_f;2)3-;~lmpXeB zdaV|<=gxuA>;K>du<#GW*wwM%OC-Y`Fbpb>|A6AJzXZwUB51`b*hWlXT}#!WK-z}& z=&h}W$ifm4TX#TYVacki9q2>xm;0bfSs1uTa=fZ_>pSOthsp&Nuq$k9qJue#)I|qbqNQB7Jigm5#)D&dz+73#ihF!!2 z1Vu%I25K43fiv-_kcA zpE8Zrr?#&T>6_vqb#ex13d+_R%KPOdQX>~Xm-*0x7qXHwP-ObgkG&e_J6mb>2eChmgX3rv2&7VsTeBW!zJ9De`s=Tkh=c74*oTK9Xw@2!yy34iO;IR5@Hwh}Oa?)a@LReJ z@~O{(V6E6xxU%j&bd{F^1OeO7aEPod&|8_W8@FzgfGak+E7YF?_tzHN=Dfe7$zjqg zlz)E&%C@#)I;I|;2#Jk{fr%-rkH+85BlnXJz|b`OURw(J)ENMVL#Vqtke(Qa?utqX zjHC$Px&uZI>#_5~JUK*FtRXsu&S)-O2r%Yks-B z+WEQJ$ltpMdiBt(PY?uLXU&G!;#Wa(IK%8|ibB?ot+;mOGDH>@2#enYiM<2sTCM3R z$lS3Flu8YYK!1e9Cfv1Rt4cnOqW$}BB~PAM4F7*GLv`{Yc)T!mwe^#8wvGt6Xm4VA zS4G=6>#ztEf4v{Hjv4~X5eN{vegn({Mzh*0+gfocW+hY|3P?w}B4F8@kUGh)S51E$ z3eYr)zW5YXKmG`UAmA0b2yU|%u;v8a-~ckVZo2V#UH^^b@!-F78S2iRf_;crrptmA z>@C<|0q1OsDNyw@zNT)TC_8!>jQ;lD5kU};Iy)nL(>CypjD{OC3>ts`KV*Nf6O4`m zNCG^O7)B0`ka_vQ%-0u2j&ca3#?b3DNLd?$o~lX+OiU0O8xND4Q;<8PtF#E|n>Ik* zeY>nBI2`yaeg!R8ufW(&lI!2d&k?bJ5FioizuvRtt4k7kX-{(NUO(uCh|}H#LD$ zs{w`qPb5OvhE0%p`>^^PY;MM-m?)?^JBI;#M=nNdW*Us`jq?27N(>wkaPg-J>0Q-| zan@lIP_+MZ&=hrJ0RoN_Cm~?j@;@mN-$(7aUm%c5Z*)-}Lv?5xdX)-ImoB34i@ne( zl`wI0LwI5mYum^$3>wa#L+-~P+=}C-kUSpzmMlg6`O~lscF%HKv?_Q+zzwJO@2ftW zvc!4XEadOq14^v{2!O-mBRG0BY(gJnFA;mYaQVGe=x=O-xxXLAy%!6fL^^x{hC#&- zM^W<40Wf+RZZFJ**USH6Z$Q*)Wc_zLno}<0&X{>(G5lV89n~ie!ENRy~qkd zsZ~ggTZhi#LhuYF2w59<*NUyLt`=z<*JH4)^;WXFDH2CVI8UB}=1XTVdc`VRv7LMK zh=8@-t=znil5|q{U?}qQ(VmwBf+S!!{_#I;+ls&5kBT3Tf+rFoV#_udySTCX@2#oC z<<-&94GzM@)fFMJ8)0C|eiIum{D!=b-Up>o4+SO&*oH?yC^N-CT?svQbpn?wF&$ZH z2>{ti(H%MsPbPJCL;3fIL2|eVT)qPKPdvq{ukP+f`o>svS60Bx#}A?LiQpQrS4=f0 zkD>6(FTgMiT%Vr-@5M{mhk6u+>|NW@c=5u}TAl#70t0w0T8!o^ze8dx?Ff7)(frSN z{<=N!4C7AaQU+#Fp(47#p+tyq0nSSvz+?uN~T&5+n)vy~$C3X!uONwFc7l4qp>%n82aRI11`!n)C+YLsi zgX5&h2zX;T2$H1%(P@$Y$p@(W^*k8*4}%ASfWTM^-&bBk2> z4_>P@%KdO>kFi@I;khsp9JZ$mptGbHY4Phosg!V^w-6o+UShA9C<<9SlW;BN61YMk z#zaNKIwXvJ?Y35=#jQhML;aB7NgfxYo|_K6N(FU$9pk(7O{v)4?N6WXJp%(k{s-$X zcUIJg2Su%ebd>9`>x^EH@}u9P^t*4t;qwu;J^^O_0j$213I#4lM?u-%28p91!r~I{ zI@D{;NJr-Otg2<)3i8VKdNpRuy>Q(7Aiglwu;SR^E`l%P z`7c`z!5t01wzmiAiR;l>S_UIW2SjYy3BD0~vC(wt_v>Y+P6zqqY4Csj4UjzEa8;T{ z!QS1d`T5lCI-UT8GBbECScImFzd>ls(~X+`ys5Eg$iOfM4+0DT^*?>RtnqUCZkg{` zxX)WSB*?Dfe57wqfTph>j!!*_z~!qzunh%tTIB8i2=(XBf#7fv92E`Q@e^1xxwgL# zDQlw9TU&Ge`y~Lrp#-k8=Rnzf4QfRltb+V!$Y;KG@?IJ4do!)zWp(FnaV;d55#%2EUsrM8AeFOKFrg0Pn`Lzv~((Iik&w|sW zDPZ&z(&E=ZQB({gJ6nXr-Mx!y`u!K=eE1>s8ZE5H24n1+IM$&aL+erU)d5r-I|_!T zA(YABJZ(BC4PL=}#NV{b-hD9v<*bDLb&MtT{8!%_j6o!X|t?azEUK z?&@kdKKVHOmaVvcw&M<=DGIsoC!yiOMUXr${9bzv@~P}wLh9}=q$k9qr@9hSM>(9H zor2z)D)d(7F&6$_Ii9aX-&2yhQ$`HjQpsP3=#*S8$sfYVqrx{CDH2wY? z+Ve6XFcL5lE3;Jl$De-D*e9atL1TTW2h;kha%FXAPhK5pZk4Nh)uhPM7BX*NNS$3E zGB-z8SuqCN+QBe1940&gp}7_GS`BoA15mcLqNlnV9fi42ceKJl!l#X0og3_*oHp9f z$@`%lNqi(n4;5MG<%;~Q1eKz5nzmnQq!~~W49x+_GXPg80?Flq6bL};C{W6NP|86N z1OY?Pd-R7(yIZ-+mU`Eo%KY5}O^wEy{z1N8t0x(T zCOLeb&Oj>Gimh!MjokuPi>#e01g2KhUwa+7{BwNx?=JrU|J~&u;J>^4&jJ5GG$}*@ ToP46E00000NkvXXu0mjfyx1e= diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json deleted file mode 100644 index 61c342c..0000000 --- a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "lee_4.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png b/iBox/Resources/Assets.xcassets/42pack_icon/lee/lee_4.imageset/lee_4.png deleted file mode 100644 index 68e6400c4ba03d025640b3910ad9ea06552fde9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7031 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%0Dy!50Qvv` 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%0Dy!50Qvv` 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 LNkvXXu0mjfhTnN6 diff --git a/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json b/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json deleted file mode 100644 index a0b3a22..0000000 --- a/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "appstore.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png b/iBox/Resources/Assets.xcassets/AppIcons/appstore.imageset/appstore.png deleted file mode 100644 index a738dda605c9240e0359fa56c2ca1476477c49b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47451 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 LbWZ1y diff --git a/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png b/iBox/Resources/Assets.xcassets/Logo/1024.imageset/1024 1.png deleted file mode 100644 index 83ffffa3bbea51c68799b95c215ef63a5b64a824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193380 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�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