Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 38 additions & 0 deletions ONMIR/Assets.xcassets/ButtonBackground.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
38 changes: 38 additions & 0 deletions ONMIR/Assets.xcassets/ButtonText.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFE"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
113 changes: 113 additions & 0 deletions ONMIR/Feature/Home/Components/BookListSectionRowView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import SnapKit
import UIKit

final class BookListSectionRowView: UIControl {
private let bookListStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 12
stackView.alignment = .leading
stackView.distribution = .fill
return stackView
}()

private let listContentStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 12
stackView.alignment = .center
stackView.distribution = .fill
return stackView
}()

private let divider1 = DividerView()
private let divider2 = DividerView()

private let listIcon: UIImageView = {
let imageview = UIImageView()
imageview.contentMode = .scaleAspectFit
imageview.backgroundColor = .clear
imageview.image = UIImage(systemName: "list.bullet")
imageview.tintColor = .label
return imageview
}()

private let listTitleLabel: UILabel = {
let label = UILabel()
label.text = "All"
label.font = .systemFont(ofSize: 16)
return label
}()

private let chevronRightIcon: UIImageView = {
let imageview = UIImageView()
imageview.contentMode = .scaleAspectFit
imageview.backgroundColor = .clear
imageview.image = UIImage(systemName: "chevron.right")
imageview.tintColor = UIColor.quaternaryLabel
return imageview
}()

init(title: String) {
super.init(frame: .zero)
self.listTitleLabel.text = title

setupView()
setupLayout()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
if bounds.contains(location) {
sendActions(for: .touchUpInside)
}
}

private func setupView() {
self.backgroundColor = .clear

isUserInteractionEnabled = true

listContentStackView.addArrangedSubview(listIcon)
listContentStackView.addArrangedSubview(listTitleLabel)
listContentStackView.addArrangedSubview(chevronRightIcon)

bookListStackView.addArrangedSubview(divider1)
bookListStackView.addArrangedSubview(listContentStackView)
bookListStackView.addArrangedSubview(divider2)

addSubview(bookListStackView)
}

private func setupLayout() {
bookListStackView.snp.makeConstraints { make in
make.top.leading.trailing.bottom.equalToSuperview()
}

listContentStackView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
}

listIcon.snp.makeConstraints { make in
make.width.height.equalTo(24)
}

chevronRightIcon.snp.makeConstraints { make in
make.width.equalTo(12)
make.height.equalTo(17)
}

divider1.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
}

divider2.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
}
}
}
17 changes: 17 additions & 0 deletions ONMIR/Feature/Home/Components/DividerView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import UIKit

final class DividerView: UIView {
init(height: CGFloat = 1.0, color: UIColor = UIColor.quaternaryLabel) {
super.init(frame: .zero)

self.backgroundColor = color
self.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
self.heightAnchor.constraint(equalToConstant: height)
])
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
73 changes: 73 additions & 0 deletions ONMIR/Feature/Home/Components/ReadingBookCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import Nuke
import SnapKit
import UIKit

extension HomeViewController {
final class ReadingBookCell: UICollectionViewCell {
static let id: String = "ReadingBookCell"
private let coverImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()

private let readingProgressLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 27, weight: .bold)
return label
}()

private var imageDownloadTask: Task<Void, Never>?

override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func prepareForReuse() {
super.prepareForReuse()
imageDownloadTask?.cancel()
}

private func setupUI() {
self.backgroundColor = .clear
contentView.backgroundColor = .clear

contentView.addSubview(coverImageView)
contentView.addSubview(readingProgressLabel)

coverImageView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.height.equalTo(392)
}

readingProgressLabel.snp.makeConstraints { make in
make.top.equalTo(coverImageView.snp.bottom).offset(8)
make.leading.equalToSuperview()
}
}

func prepare(imageURL: URL?, currentPage: Int, totalPage: Int) {
let percentage = Int(Double(currentPage) / Double(totalPage) * 100)
self.readingProgressLabel.text = "\(percentage)%"

if let thumbnailURL = imageURL {
imageDownloadTask = Task {
do {
let image = try await ImagePipeline.shared.image(for: thumbnailURL)
if !Task.isCancelled {
self.coverImageView.image = image
}
} catch {
Logger.error(error)
}
}
}
}
}
}
Loading