diff --git a/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift b/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift index 6e7477b8..65ca22a6 100644 --- a/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift +++ b/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift @@ -10,7 +10,7 @@ import UIKit import EATSSUDesign import FirebaseAnalytics -import GoogleMobileAds +//import GoogleMobileAds import Moya import SnapKit diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ChartComponentView.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ChartComponentView.swift new file mode 100644 index 00000000..75ebb408 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ChartComponentView.swift @@ -0,0 +1,68 @@ +// +// ChartComponentView.swift +// EATSSU +// +// Created by 최지우 on 2/18/25. +// + +import UIKit + +import EATSSUDesign +import SnapKit + +final class ChartComponentView: BaseUIView { + + private lazy var chartBarView = UIView() + + private let pointLabel: UILabel = { + let label = UILabel() + label.text = "5점" + label.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 12) + return label + }() + + public var chartBarBackgroundView: UIView = { + let view = UIView() + view.backgroundColor = EATSSUDesignAsset.Color.GrayScale.gray200.color + view.layer.cornerRadius = 5 + return view + }() + + public var chartBarforegroundView: UIView = { + let view = UIView() + view.backgroundColor = EATSSUDesignAsset.Color.Main.primary.color + view.layer.cornerRadius = 5 + return view + }() + + private lazy var chartComponentStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [pointLabel, chartBarView]) + stackView.axis = .horizontal + stackView.spacing = 9 + return stackView + }() + + override func configureUI() { + chartBarView.addSubviews(chartBarBackgroundView, + chartBarforegroundView) + addSubviews(chartComponentStackView) + } + + override func setLayout() { + chartBarView.snp.makeConstraints { make in + make.width.equalTo(115.adjusted) + make.height.equalTo(10.adjusted) + } + chartBarforegroundView.snp.makeConstraints { make in + make.width.equalTo(80.adjusted) + make.height.equalTo(10.adjusted) + make.top.leading.equalToSuperview() + } + chartBarBackgroundView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + chartComponentStackView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipCollectionViewCell.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipCollectionViewCell.swift new file mode 100644 index 00000000..48a2e164 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipCollectionViewCell.swift @@ -0,0 +1,106 @@ +// +// MenuChipCollectionViewCell.swift +// EATSSU-DEV +// +// Created by 최지우 on 2/2/25. +// + +import UIKit +import SnapKit + +import EATSSUDesign + +final class MenuChipCollectionViewCell: UICollectionViewCell { + static let id = "MenuChipCollectionViewCell" + + private let menuChipView: UIView = { + let view = UIView() + view.backgroundColor = EATSSUDesignAsset.Color.Main.secondary.color + view.layer.cornerRadius = 10 + view.layer.borderColor = EATSSUDesignAsset.Color.Main.primary.color.cgColor + view.layer.borderWidth = 0.5 + view.backgroundColor = .purple + return view + }() + + private let thumbsupImageView: UIImageView = { + let imageView = UIImageView(image: EATSSUDesignAsset.Images.filledThumbUp.image) + imageView.contentMode = .scaleAspectFit + return imageView + }() + + private let menuLabel: UILabel = { + let label = UILabel() + label.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 10) + label.textColor = EATSSUDesignAsset.Color.Main.primary.color + label.text = "김치볶음바바바밥" + return label + }() + + lazy var menuChipStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [thumbsupImageView, menuLabel]) + stackView.axis = .horizontal + stackView.spacing = 1 + stackView.alignment = .center + stackView.backgroundColor = .green + return stackView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + configureUI() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func configureUI() { + addSubview(menuChipView) + menuChipView.addSubviews(menuChipStackView) + } + + private func setLayout() { + thumbsupImageView.snp.makeConstraints { make in + make.width.height.equalTo(12) + } + menuLabel.snp.makeConstraints { make in + make.height.greaterThanOrEqualTo(12) + } + menuChipStackView.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(5) + make.height.greaterThanOrEqualTo(12) + } + } + + override func prepareForReuse() { + super.prepareForReuse() + self.prepare(name: nil) + } + + func prepare(name: String?) { + self.menuLabel.text = name + setupDynamicLayout() + } + + private func setupDynamicLayout() { + menuLabel.sizeToFit() + let viewSize = menuLabel.intrinsicContentSize + let width = viewSize.width + 30 + let height = viewSize.height + 48 + + menuChipView.snp.remakeConstraints { make in + make.width.equalTo(width) + make.height.equalTo(height) + } + + menuChipStackView.snp.remakeConstraints { make in + make.width.equalTo(width) + make.height.equalTo(height) + } + + layoutIfNeeded() + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipHorizontalScrollView.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipHorizontalScrollView.swift new file mode 100644 index 00000000..d7ffbb2b --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/MenuChipHorizontalScrollView.swift @@ -0,0 +1,84 @@ +// +// MenuChipHorizontalScrollView.swift +// EATSSU-DEV +// +// Created by 최지우 on 1/30/25. +// + +import UIKit + +import EATSSUDesign + +class MenuChipHorizontalScrollView: BaseUIView { + + // MARK: - Properties + var menuDataSource: [String]? { + didSet { bind() } + } + + lazy var horizontalScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.showsHorizontalScrollIndicator = false + return scrollView + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.spacing = 4 + return stackView + }() + + override func configureUI() { + horizontalScrollView.addSubview(stackView) + addSubview(horizontalScrollView) + } + + override func setLayout() { + stackView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + horizontalScrollView.snp.makeConstraints { make in + make.center.width.equalToSuperview() + make.height.equalTo(stackView) + make.trailing.equalToSuperview() + } + } + + private func bind() { + menuDataSource?.forEach { menuData in + let button = createButton(menuData) + stackView.addArrangedSubview(button) + debugPrint(menuData) + } + } + + private func createButton(_ title: String) -> UIButton { + var config = UIButton.Configuration.borderedTinted() + config = configureButton(config, title) + return UIButton(configuration: config) + } + + private func configureButton(_ config: UIButton.Configuration, _ title: String) -> UIButton.Configuration { + var config = config + + let attributedString = AttributedString( + title, + attributes: AttributeContainer([ + .font: EATSSUDesignFontFamily.Pretendard.medium.font(size: 10), + .foregroundColor: EATSSUDesignAsset.Color.Main.primary.color])) + config.attributedTitle = attributedString + + config.baseBackgroundColor = EATSSUDesignAsset.Color.Main.secondary.color + config.background.strokeColor = EATSSUDesignAsset.Color.Main.primary.color + config.background.strokeWidth = 0.5 + + config.image = EATSSUDesignAsset.Images.filledThumbUp.image + config.imagePadding = 1 + config.cornerStyle = .capsule + config.contentInsets = NSDirectionalEdgeInsets(top: 5, leading: 6, bottom: 5, trailing: 6) + + return config + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReactionView.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReactionView.swift new file mode 100644 index 00000000..24d7f3b2 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReactionView.swift @@ -0,0 +1,48 @@ +// +// ReactionView.swift +// EATSSU +// +// Created by 최지우 on 2/11/25. +// + +import UIKit + +import EATSSUDesign +import SnapKit + +final class ReactionView: BaseUIView { + + // MARK: - UI Components + + private let likeImageView: UIImageView = { + let imageView = UIImageView(image: EATSSUDesignAsset.Images.like.image) + imageView.contentMode = .scaleAspectFit + return imageView + }() + + private let likeCountLabel: UILabel = { + let label = UILabel() + label.text = "3" + label.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 12) + return label + }() + + lazy var stackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [likeImageView, likeCountLabel]) + stackView.axis = .horizontal + stackView.spacing = 3 + return stackView + }() + + // MARK: - Functions + + override func configureUI() { + addSubview(stackView) + } + + override func setLayout() { + stackView.snp.makeConstraints { make in + make.height.equalTo(20) + } + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewCell.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewCell.swift new file mode 100644 index 00000000..4203706c --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewCell.swift @@ -0,0 +1,248 @@ +// +// ReviewListTableViewCell.swift +// EATSSU-DEV +// +// Created by 최지우 on 2/1/25. +// + +import UIKit + +import SnapKit +import EATSSUDesign + +final class ReviewListTableViewCell: BaseTableViewCell { + static let id = "ReviewListTableViewCell" + private var menuChipList = [String]() + + // MARK: - Properties + + var handler: (() -> Void)? + var reviewId: Int = .init() + var menuName: String = .init() + + // MARK: - UI Components + + lazy var starRatingView = StarRatingView() + lazy var reactionView = ReactionView() + + private var dateLabel: UILabel = { + let label = UILabel() + label.text = "2023.03.03" + label.font = .caption3 + label.textColor = EATSSUDesignAsset.Color.GrayScale.gray400.color + return label + }() + + private var userNameLabel: UILabel = { + let label = UILabel() + label.text = "hellosoongsil1234" + label.font = .caption1 + return label + }() + + private var nickNameLabel: UILabel = { + let label = UILabel() + label.text = "깐깐슈" + label.font = .caption3 + label.textColor = EATSSUDesignAsset.Color.GrayScale.gray600.color + return label + }() + + private let userProfileImageView: UIImageView = { + let imageView = UIImageView(image: EATSSUDesignAsset.Images.profile.image) + return imageView + }() + + private var sideButton: BaseButton = { + let button = BaseButton() + button.setTitleColor(EATSSUDesignAsset.Color.GrayScale.gray400.color, for: .normal) + button.titleLabel?.font = .caption2 + button.setTitle("신고", for: .normal) +// button.setImage(EATSSUDesignAsset.Images.icInfo.image, for: .normal) + button.configuration?.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 15) + return button + }() + + var reviewTextLabel: UILabel = { + let label = UILabel() + label.font = EATSSUDesignFontFamily.Pretendard.regular.font(size: 14) + label.text = "여기 계란국 맛집임... 김치볶음밥에 계란후라이 없어서 아쉽 다음에 또 먹어야지dddddfdfdfdfdfdfddfdfdfddfdfdfdfddfddfdfd여기 계란국 맛집임... 김치볶음밥에 계란후라이 없어서 아쉽 다음에 또 먹어야지dddddfdfdfdfdfdfddfdfdfddfdfdfdfddfddfdfd" + label.numberOfLines = 0 + return label + }() + + var foodImageView: UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleAspectFit + imageView.isHidden = true + return imageView + }() + + /// 이름 + 닉네임 + lazy var nameMenuStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [userNameLabel, nickNameLabel]) + stackView.axis = .horizontal + stackView.spacing = 8.adjusted + stackView.alignment = .center + return stackView + }() + + /// (이름 + 닉네임) + 별점 + lazy var infoStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [nameMenuStackView, starRatingView]) + stackView.axis = .vertical + stackView.spacing = 4.adjusted + stackView.alignment = .leading + return stackView + }() + + /// 프로필 + (이름 + 닉네임 + 별점) + lazy var profileStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [userProfileImageView, infoStackView]) + stackView.axis = .horizontal + stackView.spacing = 8.adjusted + stackView.alignment = .leading + stackView.backgroundColor = .purple + return stackView + }() + + /// 작성일 + 사이드버튼 + lazy var dateReportStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [sideButton, dateLabel]) + stackView.axis = .vertical + stackView.spacing = 8.adjusted + stackView.alignment = .trailing + stackView.backgroundColor = .brown + return stackView + }() + + /// profileStackView + dateReportStackView + lazy var topStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [profileStackView, dateReportStackView]) + stackView.axis = .horizontal + stackView.alignment = .fill + stackView.distribution = .fill + stackView.backgroundColor = .yellow + return stackView + }() + + /// 리뷰 텍스트 + 리뷰 이미지 + lazy var contentStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [reviewTextLabel, foodImageView]) + stackView.axis = .vertical + stackView.spacing = 8.adjusted + stackView.alignment = .leading + stackView.backgroundColor = .primary + return stackView + }() + + /// 추천 메뉴칩 + private lazy var menuChipCollectionView: UICollectionView = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + // MARK: - TODO + layout.minimumLineSpacing = 4 +// layout.minimumInteritemSpacing = 60 + let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) + cv.dataSource = self + cv.backgroundColor = .red + cv.showsHorizontalScrollIndicator = false + return cv + }() + + /// 전체 cell + lazy var cellStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [ + topStackView, + menuChipCollectionView, + contentStackView, + reactionView, + dividerView] + ) + stackView.axis = .vertical + stackView.spacing = 8 + stackView.alignment = .fill + stackView.distribution = .fill + return stackView + }() + + private let dividerView: UIView = { + let view = UIView() + view.backgroundColor = EATSSUDesignAsset.Color.GrayScale.gray200.color + return view + }() + + // MARK: - Functions + + private func setCollectionView() { + menuChipCollectionView.register(MenuChipCollectionViewCell.self, + forCellWithReuseIdentifier: MenuChipCollectionViewCell.id) + } + + override func configureUI() { + setCollectionView() + contentView.addSubviews(cellStackView) + starRatingView.rating = 4 + } + + override func setLayout() { + cellStackView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + menuChipCollectionView.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview() + make.height.equalTo(22) + } + contentStackView.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview() + } + foodImageView.snp.makeConstraints { make in + make.height.width.equalTo(358) + } + sideButton.snp.makeConstraints { make in + make.height.equalTo(12.adjusted) + } + reactionView.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview() + make.height.equalTo(20) + } + dividerView.snp.makeConstraints { make in + make.height.equalTo(1) + } + } + + override func prepareForReuse() { + super.prepareForReuse() + self.prepare(review: nil, menuChipList: []) + + sideButton.setTitle("", for: .normal) + sideButton.setImage(UIImage(), for: .normal) + foodImageView.image = UIImage() + foodImageView.isHidden = true + } + + func prepare(review: String?, menuChipList: [String]) { + self.userNameLabel.text = review + self.menuChipList = menuChipList + self.menuChipCollectionView.reloadData() + } + + @objc + func touchedSideButtonEvent() { + handler?() + } + +} + +extension ReviewListTableViewCell: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return menuChipList.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MenuChipCollectionViewCell.id, for: indexPath) as! MenuChipCollectionViewCell + let menuName = self.menuChipList[indexPath.item] + cell.prepare(name: menuName) + return cell + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewHeader.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewHeader.swift new file mode 100644 index 00000000..a44c4c16 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewListTableViewHeader.swift @@ -0,0 +1,66 @@ +// +// ReviewListTableViewHeader.swift +// EATSSU-DEV +// +// Created by 최지우 on 2/2/25. +// + +import UIKit +import SnapKit + +import EATSSUDesign + +final class ReviewListTableViewHeader: UITableViewHeaderFooterView { + static let id = "ReviewListTableViewHeader" + + private let titleLabel: UILabel = { + let label = UILabel() + label.text = "리뷰" + label.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 18) + return label + }() + + private let reviewImageThumbnailView: UIView = { + let view = UIView() + view.backgroundColor = .blue + return view + }() + + private let reviewThumbnailImageView: UIImageView = { + let imageView = UIImageView(image: EATSSUDesignAsset.Images.reviewPhotoDummy.image) + return imageView + }() + + override init(reuseIdentifier: String?) { + super.init(reuseIdentifier: reuseIdentifier) + + configureUI() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func configureUI() { + reviewImageThumbnailView.addSubview(reviewThumbnailImageView) + addSubviews(titleLabel, + reviewImageThumbnailView) + + } + + private func setLayout() { + titleLabel.snp.makeConstraints { + $0.left.top.right.equalToSuperview() + } + reviewImageThumbnailView.snp.makeConstraints { + $0.left.right.bottom.equalToSuperview() + $0.top.equalTo(titleLabel.snp.bottom) + $0.height.equalTo(90) + } + reviewThumbnailImageView.snp.makeConstraints { make in + make.verticalEdges.equalToSuperview().inset(12) + make.width.equalTo(reviewThumbnailImageView.snp.height) + } + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewSummaryView.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewSummaryView.swift new file mode 100644 index 00000000..d1b6e782 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/ReviewSummaryView.swift @@ -0,0 +1,150 @@ +// +// ReviewSummaryView.swift +// EATSSU +// +// Created by 최지우 on 2/18/25. +// + +import UIKit + +import SnapKit +import EATSSUDesign + +final class ReviewSummaryView: BaseUIView { + + // MARK: - UI Components + + private var menuLabel: UILabel = { + let label = UILabel() + label.text = "고구마치즈돈까스+막국수+미니밥+단무지+요구르트고구마치즈돈까스+막국수+미니밥+단무지+요구르트고구마치즈돈까스+막국수+미니밥+단무지" + label.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 18) + label.numberOfLines = 0 + return label + }() + + // MARK: 좌측 + + private var starSummaryView = StarSummaryView() + private let thumbupCountView = ThumbsCountView(thumbType: .up) + private let thumbdownpCountView = ThumbsCountView(thumbType: .down) + + private lazy var thumbCountStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [thumbupCountView, thumbdownpCountView]) + stackView.axis = .horizontal + stackView.spacing = 14 + stackView.backgroundColor = .purple + return stackView + }() + + private lazy var ratingSummaryStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [starSummaryView, thumbCountStackView]) + stackView.axis = .vertical + stackView.alignment = .center + stackView.spacing = 15 + stackView.backgroundColor = .gray300 + return stackView + }() + + // MARK: 우측 + + private let totalReviewTitleLabel: UILabel = { + let label = UILabel() + label.text = "총 리뷰 수" + label.font = .caption2 + label.backgroundColor = .red +// label.setContentHuggingPriority(.defaultHigh, for: .horizontal) + return label + }() + + private let totalReviewCountLabel: UILabel = { + let label = UILabel() + label.text = "15" + label.font = .caption1 + label.textColor = EATSSUDesignAsset.Color.Main.primary.color + label.backgroundColor = .purple + return label + }() + + private lazy var totalReviewStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [totalReviewTitleLabel, totalReviewCountLabel]) + stackView.axis = .horizontal + stackView.spacing = 4 + stackView.backgroundColor = .blue + return stackView + }() + + private let oneChartComponentView = ChartComponentView() + private let twoChartComponentView = ChartComponentView() + private let threeChartComponentView = ChartComponentView() + private let fourChartComponentView = ChartComponentView() + private let fiveChartComponentView = ChartComponentView() + + private lazy var yAxisStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [oneChartComponentView, + twoChartComponentView, + threeChartComponentView, + fourChartComponentView, + fiveChartComponentView]) + stackView.axis = .vertical + stackView.spacing = 8 + stackView.backgroundColor = .yellow + return stackView + }() + + private lazy var reviewDistributionStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [totalReviewStackView, yAxisStackView]) + stackView.axis = .vertical + stackView.spacing = 5 + return stackView + }() + + // MARK: - 좌측 + 우측 + + private lazy var ratingAndDistributionStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [ratingSummaryStackView, + reviewDistributionStackView]) + stackView.axis = .horizontal + stackView.backgroundColor = .brown + return stackView + }() + + // MARK: - total + + private lazy var reviewSummaryStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [menuLabel, ratingAndDistributionStackView]) + stackView.axis = .vertical + stackView.spacing = 15 + stackView.alignment = .center + stackView.backgroundColor = .orange + return stackView + }() + + // MARK: - Functions + + override func configureUI() { + addSubviews(reviewSummaryStackView) + } + + override func setLayout() { + reviewSummaryStackView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.horizontalEdges.equalToSuperview().inset(20.adjusted) + make.bottom.equalToSuperview() + } +// starSummaryView.snp.makeConstraints { make in +// make.height.equalToSuperview().dividedBy(2.3) +// } +// reviewDistributionStackView.snp.makeConstraints { make in +// make.verticalEdges.equalToSuperview() +// } +// totalReviewStackView.snp.makeConstraints { make in +// make.top.horizontalEdges.equalToSuperview() +// make.height.equalTo(18) +// } +// yAxisStackView.snp.makeConstraints { make in +// make.top.equalTo(totalReviewStackView.snp.bottom) +// make.height.equalTo(90) +// make.bottom.horizontalEdges.equalToSuperview() +// } + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/StarRatingView.swift b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/StarRatingView.swift new file mode 100644 index 00000000..3bbf714a --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/MainReviewView/Component/StarRatingView.swift @@ -0,0 +1,69 @@ +// +// StarRatingView.swift +// EATSSU +// +// Created by 최지우 on 2/20/25. +// + +import UIKit + +import SnapKit +import EATSSUDesign + +final class StarRatingView: BaseUIView { + + // MARK: - Properties + + private let maxStars = 5 + + public var rating: Int = 0 { + didSet { + updateStarImages() + } + } + + // MARK: - UI Components + + private var starImageViews: [UIImageView] = [] + + // MARK: - Functions + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + private func setupView() { + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.spacing = 2 + stackView.alignment = .center + stackView.distribution = .fillEqually + addSubview(stackView) + + stackView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + for _ in 0.. Int { + self.dataSource.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: ReviewListTableViewCell.id, + for: indexPath) as! ReviewListTableViewCell +// let row = self.dataSource[indexPath.row] + cell.selectionStyle = .none + cell.prepare(review: "name: Jay", menuChipList: dataSource) + return cell + } +} + +extension MainReviewViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: ReviewListTableViewHeader.id) as! ReviewListTableViewHeader + return cell + } +} diff --git a/EATSSU/App/Sources/Presentation/Review/View/SeeReview/RateNumberView.swift b/EATSSU/App/Sources/Presentation/Review/View/SeeReview/RateNumberView.swift index 17246bf5..281b9fb5 100644 --- a/EATSSU/App/Sources/Presentation/Review/View/SeeReview/RateNumberView.swift +++ b/EATSSU/App/Sources/Presentation/Review/View/SeeReview/RateNumberView.swift @@ -1,8 +1,8 @@ // // RateNumberView.swift -// EatSSU-iOS +// EATSSU // -// Created by 박윤빈 on 2023/06/29. +// Created by 최지우 on 2/19/25. // import UIKit @@ -12,6 +12,8 @@ import EATSSUDesign import SnapKit import Then +// TODO: - 추후 제거(StarRatingView으로 리팩됨) + final class RateNumberView: BaseUIView { // MARK: - UI Components diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift index 1b089af1..b9104409 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift @@ -37,6 +37,7 @@ final class ReportViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() + // FIXME: super.viewDidLoad 메서드 내/아래 메서드에서 동일한 메서드 호출 발생 configureUI() setLayout() setScrollViewSetting() @@ -50,7 +51,7 @@ final class ReportViewController: BaseViewController { removeKeyboardNotifications() } - // MARK: - Methods + // MARK: - Functions override func configureUI() { view.addSubview(scrollView) @@ -63,10 +64,13 @@ final class ReportViewController: BaseViewController { make.edges.equalTo(scrollView.contentLayoutGuide) make.width.equalTo(scrollView.frameLayoutGuide) + // FIXME: dynamic height 적용 + // make.bottom.equalTo(scrollView.contentLayoutGuide) make.height.equalTo(800) } } + // FIXME: - 제거 필요 override func setLayout() { super.setLayout() } diff --git a/EATSSU/App/Sources/Presentation/Review/WritingReviewModalViewController.swift b/EATSSU/App/Sources/Presentation/Review/WritingReviewModalViewController.swift new file mode 100644 index 00000000..3217c473 --- /dev/null +++ b/EATSSU/App/Sources/Presentation/Review/WritingReviewModalViewController.swift @@ -0,0 +1,334 @@ +// +// WritingReviewModalViewController.swift +// EATSSU-DEV +// +// Created by 최지우 on 2/2/25. +// + +import UIKit + +import EATSSUDesign + +final class WritingReviewModalViewController: BaseViewController { + + // MARK: - Properties + + // View Properties +// private let writingReviewModalView = WritingReviewModalView() + + private var userPickedImage: UIImage? + + // MARK: - UI Components + + // FIXME: - Menu Feedback View TEST + let menus = ["고구마치즈돈까스", "막국수", "단무지", "요구르트", "파전", "설렁탕"] + + + private var rateView = RateView() + private let imagePickerController = UIImagePickerController() + public let completeReviewButton = ESButton(size: .big, title: "완료하기") + + private var titleLabel: UILabel = { + let label = UILabel() + label.text = "리뷰 남기기" + label.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 16) + return label + }() + + private var questionLabel: UILabel = { + let label = UILabel() + label.text = "오늘 식사는 어떠셨나요" + label.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 16) + return label + }() + + private let userReviewTextView: UITextView = { + let textView = UITextView() + textView.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 14) + textView.layer.cornerRadius = 12.adjusted + textView.backgroundColor = EATSSUDesignAsset.Color.GrayScale.gray100.color + textView.layer.borderWidth = 1.adjusted + textView.layer.borderColor = EATSSUDesignAsset.Color.GrayScale.gray200.color.cgColor + textView.textContainerInset = UIEdgeInsets(top: 12.0.adjusted, + left: 12.0.adjusted, + bottom: 12.0.adjusted, + right: 12.0.adjusted) + textView.text = "메뉴에 대한 상세한 리뷰를 작성해주세요" + textView.textColor = EATSSUDesignAsset.Color.GrayScale.gray400.color + return textView + }() + + private lazy var userReviewImageView: UIImageView = { + let imageView = UIImageView() + imageView.layer.cornerRadius = 10 + imageView.clipsToBounds = true + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTappedimageView)) + imageView.isUserInteractionEnabled = true + imageView.addGestureRecognizer(tapGesture) + return imageView + }() + + private lazy var selectImageButton: UIButton = { + let button = UIButton() + button.setImage(EATSSUDesignAsset.Images.photoUpload.image, for: .normal) + button.addTarget(self, action: #selector(didSelectedImage), for: .touchUpInside) + return button + }() + + private let deleteMethodLabel: UILabel = { + let label = UILabel() + label.text = "이미지 클릭 시, 삭제됩니다" + label.font = .caption3 + label.textColor = EATSSUDesignAsset.Color.GrayScale.gray500.color + return label + }() + + private let maximumWordLabel: UILabel = { + let label = UILabel() + label.text = "0 / 300" + label.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 10) + label.textColor = EATSSUDesignAsset.Color.GrayScale.gray400.color + return label + }() + +// private var nextButton: UIButton = { +// var config = UIButton.Configuration.plain() +// var container = AttributeContainer() +// container.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 16) +// container.foregroundColor = EATSSUDesignAsset.Color.Main.primary.color +// config.attributedTitle = AttributedString("완료하기", attributes: container) +// config.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0) +// let button = UIButton(configuration: config) +// return button +// }() + +// lazy var sv: UIStackView = { +// let mf = MenuFeedbackView() +// mf.configure(with: "떡국") +// let sv = UIStackView(arrangedSubviews: [mf]) +// sv.axis = .vertical +// return sv +// }() + + let sv: MenuFeedbackView = { + let a = MenuFeedbackView() + a.configure(with: "고구마치즈돈까스") + return a + }() + + override func viewDidLoad() { + super.viewDidLoad() + + setDelegate() + + + +// for menu in menus { +// let menuView = MenuFeedbackView() +// menuView.configure(with: menu) +// sv.addSubview(menuView) +// } + } + + override func viewWillAppear(_: Bool) { + addKeyboardNotifications() + } + + override func viewWillDisappear(_: Bool) { + removeKeyboardNotifications() + } + + // MARK: - Functions + + override func configureUI() { + dismissKeyboard() + view.addSubviews( + titleLabel, + questionLabel, + rateView, + sv, + maximumWordLabel, + selectImageButton, + userReviewImageView, + userReviewTextView, + deleteMethodLabel, + completeReviewButton) + } + + override func setLayout() { + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(20) + make.centerX.equalToSuperview() + } + + questionLabel.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(30) + make.centerX.equalToSuperview() + } + + rateView.snp.makeConstraints { make in + make.top.equalTo(questionLabel.snp.bottom).offset(35) + make.centerX.equalToSuperview() + make.height.equalTo(24) + } + + sv.snp.makeConstraints { make in + make.top.equalTo(rateView.snp.bottom).offset(40) + make.horizontalEdges.equalToSuperview().inset(48) + make.height.equalTo(28) + } + + userReviewTextView.snp.makeConstraints { make in + make.top.equalTo(sv.snp.bottom).offset(40) + make.leading.equalToSuperview().offset(16) + make.trailing.equalToSuperview().offset(-16) + make.height.equalTo(181) + } + + maximumWordLabel.snp.makeConstraints { make in + make.top.equalTo(userReviewTextView.snp.bottom).offset(7) + make.trailing.equalTo(userReviewTextView) + } + + selectImageButton.snp.makeConstraints { + $0.top.equalTo(maximumWordLabel.snp.bottom).offset(15) + $0.leading.equalToSuperview().offset(15) + $0.width.equalTo(60) + $0.height.equalTo(60) + } + + userReviewImageView.snp.makeConstraints { + $0.top.equalTo(maximumWordLabel.snp.bottom).offset(15) + $0.leading.equalTo(selectImageButton.snp.trailing).offset(13) + $0.width.height.equalTo(60) + } + + deleteMethodLabel.snp.makeConstraints { + $0.top.equalTo(selectImageButton.snp.bottom).offset(7) + $0.leading.equalTo(selectImageButton) + } + + completeReviewButton.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview().inset(24) + make.bottom.equalToSuperview().inset(40) + } + } + + override func setButtonEvent() { + completeReviewButton.addTarget(self, action: #selector(tappedNextButton), for: .touchUpInside) + } + + @objc + func didSelectedImage() { + present(imagePickerController, animated: true, completion: nil) + } + + @objc + func didTappedimageView() { + userReviewImageView.image = nil + userPickedImage = nil + } + + @objc + func tappedNextButton() { + + } + + func setDelegate() { + imagePickerController.delegate = self + imagePickerController.sourceType = .photoLibrary + imagePickerController.allowsEditing = false + } + +// private func prepareForNextReview() { +// let setRateVC = SetRateViewController() +// setRateVC.dataBind(list: selectedList, +// idList: selectedIDList, +// reviewList: reviewList, +// currentPage: currentPage + 1) +// navigationController?.pushViewController(setRateVC, animated: true) +// } + +} + +// MARK: - UIImagePickerControllerDelegate + +extension WritingReviewModalViewController: UIImagePickerControllerDelegate { + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { + if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { + userReviewImageView.image = image + userPickedImage = image + } + picker.dismiss(animated: true, completion: nil) + } +} + +// MARK: - UINavigationControllerDelegate + +extension WritingReviewModalViewController: UINavigationControllerDelegate { +// func navigationController(_: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { +// if viewController == self { +// // Pop 되기 직전의 로직을 여기서 실행 +// print("Back button pressed, will pop the current view controller") +// } +// } + + // 키보드가 나타났다는 알림을 받으면 실행할 메서드 + @objc + func keyboardWillShow(_ noti: NSNotification) { + // 키보드의 높이만큼 화면을 올려준다. + if let keyboardFrame: NSValue = noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue { + let keyboardRectangle = keyboardFrame.cgRectValue + UIView.animate( + withDuration: 0.3, + animations: { + self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardRectangle.height) + self.navigationController?.isNavigationBarHidden = true + } + ) + } + } + + // 키보드가 사라졌다는 알림을 받으면 실행할 메서드 + @objc + func keyboardWillHide(_: NSNotification) { + view.transform = .identity + navigationController?.isNavigationBarHidden = false + } + + // 노티피케이션을 추가하는 메서드 + func addKeyboardNotifications() { + // 키보드가 나타날 때 앱에게 알리는 메서드 추가 + NotificationCenter.default.addObserver(self, + selector: #selector(keyboardWillShow(_:)), + name: UIResponder.keyboardWillShowNotification, + object: nil) + // 키보드가 사라질 때 앱에게 알리는 메서드 추가 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), + name: UIResponder.keyboardWillHideNotification, + object: nil) + } + + // 노티피케이션을 제거하는 메서드 + func removeKeyboardNotifications() { + // 키보드가 나타날 때 앱에게 알리는 메서드 제거 + NotificationCenter.default.removeObserver(self, + name: UIResponder.keyboardWillShowNotification, + object: nil) + // 키보드가 사라질 때 앱에게 알리는 메서드 제거 + NotificationCenter.default.removeObserver(self, + name: UIResponder.keyboardWillHideNotification, + object: nil) + } +} + +#if DEBUG +import SwiftUI + +struct aPreview: PreviewProvider { + static var previews: some View { + WritingReviewModalViewController().toPreview() + } +} +#endif diff --git a/EATSSU/App/Sources/Utility/Application/AppDelegate.swift b/EATSSU/App/Sources/Utility/Application/AppDelegate.swift index ce0c6f06..4b3e1ba8 100644 --- a/EATSSU/App/Sources/Utility/Application/AppDelegate.swift +++ b/EATSSU/App/Sources/Utility/Application/AppDelegate.swift @@ -9,7 +9,7 @@ import AuthenticationServices import UIKit import Firebase -import GoogleMobileAds +//import GoogleMobileAds import KakaoSDKCommon @main @@ -17,7 +17,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // MARK: - UIApplicationDelegate Methods func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - configureGoogleMobileAds() +// configureGoogleMobileAds() setupNotificationPermissions() startNetworkMonitoring() configureFirebase() @@ -41,9 +41,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // MARK: - Private Methods /// Google Mobile Ads SDK를 초기화합니다. - private func configureGoogleMobileAds() { - GADMobileAds.sharedInstance().start(completionHandler: nil) - } +// private func configureGoogleMobileAds() { +// GADMobileAds.sharedInstance().start(completionHandler: nil) +// } /// 푸시 알림 권한을 요청하고 설정을 처리합니다. private func setupNotificationPermissions() { diff --git a/EATSSU/Project.swift b/EATSSU/Project.swift index cc5f6d62..67ada4dc 100644 --- a/EATSSU/Project.swift +++ b/EATSSU/Project.swift @@ -4,7 +4,7 @@ let appInfoPlist: InfoPlist = .extendingDefault(with: [ "UILaunchStoryboardName": "LaunchScreen", "BASE_URL": "https://$(BASE_URL)", "KAKAO API KEY": "$(KAKAO_API_KEY)", - "GADApplicationIdentifier": "$(GADApplicationIdentifier)", +// "GADApplicationIdentifier": "$(GADApplicationIdentifier)", "CFBundleURLTypes": [ [ "CFBundleTypeRole": "Editor", @@ -101,7 +101,7 @@ let project = Project( .external(name: "KakaoSDKUser"), .external(name: "KakaoSDKCommon"), .external(name: "KakaoSDKTalk"), - .external(name: "GoogleMobileAds"), +// .external(name: "GoogleMobileAds"), // EATSSU 내장 라이브러리 .project(target: "EATSSUDesign", path: .relativeToRoot("../EATSSUDesign"), condition: .none), diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-down.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbDown.imageset/Contents.json similarity index 100% rename from EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-down.imageset/Contents.json rename to EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbDown.imageset/Contents.json diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-down.imageset/thumb-down.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbDown.imageset/thumb-down.svg similarity index 100% rename from EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-down.imageset/thumb-down.svg rename to EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbDown.imageset/thumb-down.svg diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-up.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbUp.imageset/Contents.json similarity index 100% rename from EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-up.imageset/Contents.json rename to EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbUp.imageset/Contents.json diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-up.imageset/thumb-up.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbUp.imageset/thumb-up.svg similarity index 100% rename from EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/thumb-up.imageset/thumb-up.svg rename to EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/filledThumbUp.imageset/thumb-up.svg diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/Contents.json new file mode 100644 index 00000000..82381c03 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "like.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/like.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/like.svg new file mode 100644 index 00000000..6654810f --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/like.imageset/like.svg @@ -0,0 +1,3 @@ + + + diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/Contents.json new file mode 100644 index 00000000..98f4cc67 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "photoUpload.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/photoUpload.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/photoUpload.svg new file mode 100644 index 00000000..1c80a011 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/photoUpload.imageset/photoUpload.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/Contents.json new file mode 100644 index 00000000..a9c77015 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "unfilledThumbDown.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/unfilledThumbDown.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/unfilledThumbDown.svg new file mode 100644 index 00000000..8336cee5 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbDown.imageset/unfilledThumbDown.svg @@ -0,0 +1,4 @@ + + + + diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/Contents.json new file mode 100644 index 00000000..e8062fe4 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "unfilledThumbUp.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/unfilledThumbUp.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/unfilledThumbUp.svg new file mode 100644 index 00000000..042ae95a --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unfilledThumbUp.imageset/unfilledThumbUp.svg @@ -0,0 +1,4 @@ + + + + diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/Contents.json b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/Contents.json new file mode 100644 index 00000000..a33af8a4 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "unlike.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/unlike.svg b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/unlike.svg new file mode 100644 index 00000000..e20bfc29 --- /dev/null +++ b/EATSSUDesign/EATSSUDesign/Resources/Images.xcassets/unlike.imageset/unlike.svg @@ -0,0 +1,3 @@ + + +