Skip to content

Commit

Permalink
Merge branch 'yurim' into feat/#64-homeConnctNetwork
Browse files Browse the repository at this point in the history
  • Loading branch information
HEHEEUN committed Nov 28, 2024
2 parents 9960bca + 2bf3806 commit 558dbb6
Show file tree
Hide file tree
Showing 9 changed files with 409 additions and 166 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@ import Foundation
struct GalleryResponse: Codable {
let status: Int?
let message: String?
let data: GalleryDataObject?
let data: GalleryData?
}

// MARK: - GalleryDataObject
// MARK: - GalleryData

struct GalleryDataObject: Codable {
struct GalleryData: Codable {
let photoList: [GalleryPhotoList]?
}

// MARK: - GalleryPhotoList

struct GalleryPhotoList: Codable {
let photoID: Int?
let photoURL, createdAt: String?
let photoId: Int?
let photoUrl, createdAt: String?
}
96 changes: 89 additions & 7 deletions saftyReport/saftyReport/Network/NetworkManager.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,90 @@
//
// NetworkManager.swift
// saftyReport
//
// Created by 이지훈 on 11/18/24.
//

import Foundation
import Alamofire

class NetworkManager {

func photoAPI(compleation: @escaping (Result<[GalleryPhotoList], NetworkError>) -> Void) {
guard let baseURL = Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as? String else {
print("[Error] BASE_URL is missing in Info.plist")
compleation(.failure(.unknownError))
return
}

let url = "\(baseURL)/api/v1/report/photo"

let headers: HTTPHeaders = ["userId": "1"]

AF.request(url, method: .get, headers: headers)
.validate()
.response { [weak self] response in
guard let statusCode = response.response?.statusCode,
let data = response.data,
let self = self
else {
print("[Error] Response or Data is nil")
compleation(.failure(.unknownError))
return
}


switch response.result {
case .success:
let photoList = self.decodePhoto(data: data)
compleation(.success(photoList))
case .failure(let error):
print("[Error] Request Failed: \(error.localizedDescription)")
let error = self.handleStatusCode(statusCode, data: data)
compleation(.failure(error))
}
}
}

func decodePhoto(data: Data) -> [GalleryPhotoList] {
do {
let response = try JSONDecoder().decode(GalleryResponse.self, from: data)
return response.data?.photoList ?? []
} catch {
print("[Decode Error] Failed to Decode GalleryResponse: \(error)")
return []
}
}
}

extension NetworkManager {
func decodeError(data: Data) -> String {
do {
let failResponse = try JSONDecoder().decode(FailResponse.self, from: data)
print("[Decode Error Response] Status: \(failResponse.status?.description ?? "Unknown")")
return failResponse.status?.description ?? ""
} catch {
print("[Decode Error] Failed to Decode Error Response: \(error)")
return ""
}
}

func handleStatusCode(_ statusCode: Int, data: Data) -> NetworkError {
let errorCode = decodeError(data: data)
print("[Handle Status Code] Status Code: \(statusCode), Error Code: \(errorCode)")

switch (statusCode, errorCode) {
case (400, "00"):
print("[Error] Invalid Request (400, 00)")
return .invalidRequest
case (400, "01"):
print("[Error] Expression Error (400, 01)")
return .expressionError
case (404, ""):
print("[Error] Invalid URL (404)")
return .invalidURL
case (409, "00"):
print("[Error] Duplicate Error (409, 00)")
return .duplicateError
case (500, ""):
print("[Error] Server Error (500)")
return .serverError
default:
print("[Error] Unknown Error")
return .unknownError
}
}
}
22 changes: 22 additions & 0 deletions saftyReport/saftyReport/Resource/Extension/UIImageView+.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// UIImageView+.swift
// saftyReport
//
// Created by OneTen on 11/28/24.
//

import UIKit

extension UIImageView {
func load(url: URL) {
DispatchQueue.global().async { [weak self] in
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self?.image = image
}
}
}
}
}
}
20 changes: 17 additions & 3 deletions saftyReport/saftyReport/Source/Gallery/Cell/ContentsCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import UIKit

import SnapKit
import Then
import Kingfisher

class ContentsCell: UICollectionViewCell {
var isChecked = false
Expand All @@ -23,13 +24,13 @@ class ContentsCell: UICollectionViewCell {
lazy var checkbox = UIButton().then {
$0.clipsToBounds = true
$0.contentMode = .scaleAspectFill
$0.setImage(isChecked ? .icnCheckboxISquareSelectedWhite24Px : .icnCheckboxISquareUnselectedWhite24Px, for: .normal)
$0.setImage(.icnCheckboxISquareUnselectedWhite24Px, for: .normal)
$0.addTarget(self, action: #selector(checkboxTapped), for: .touchUpInside)
}

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

setUI()
setLayout()
}
Expand Down Expand Up @@ -63,5 +64,18 @@ class ContentsCell: UICollectionViewCell {
checkbox.setImage(.icnCheckboxISquareUnselectedWhite24Px, for: .normal)
}
}


func configure(item: GalleryPhotoList, isChecked: Bool = false){
if let imageURL = URL(string: item.photoUrl ?? "") {
imageView.kf.setImage(with: imageURL)
}

self.isChecked = isChecked
self.checkbox.setImage(
isChecked ? .icnCheckboxISquareSelectedWhite24Px : .icnCheckboxISquareUnselectedWhite24Px,
for: .normal
)

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,23 @@ import Then
class GalleryDetailViewController: UIViewController {
var checkboxHandler: ((Bool, IndexPath) -> ())?
var indexPath: IndexPath!

var isChecked = false

private var baseView = UIView().then {
$0.backgroundColor = .gray1
}

private var imageView = UIImageView().then {
$0.contentMode = .scaleAspectFit
// $0.image = .test
$0.backgroundColor = .gray // 이미지 넣으면 지울 코드
$0.contentMode = .scaleToFill
}

private lazy var checkbox = UIButton().then {
$0.contentMode = .scaleAspectFit
$0.setBackgroundImage(.icnCheckboxISquareUnselectedWhite24Px, for: .normal)
$0.addTarget(self, action: #selector(checkboxTapped), for: .touchUpInside)
}

private var timeStackView = UIStackView().then {
$0.layer.cornerRadius = 5
$0.layer.borderWidth = 1
Expand All @@ -40,7 +38,7 @@ class GalleryDetailViewController: UIViewController {
}

private var createdAtLabel = UILabel().then {
$0.attributedText = .styled(text: "촬영일시", style: .caption1)
$0.attributedText = .styled(text: "촬영일시 :", style: .caption1)
$0.font = .systemFont(ofSize: 12, weight: .bold)
$0.textColor = .gray13
}
Expand All @@ -66,6 +64,7 @@ class GalleryDetailViewController: UIViewController {

setUI()
setLayout()
setupNavigationBar()
}

override func viewWillAppear(_ animated: Bool) {
Expand All @@ -75,6 +74,7 @@ class GalleryDetailViewController: UIViewController {
isChecked ? .icnCheckboxISquareSelectedWhite24Px : .icnCheckboxISquareUnselectedWhite24Px,
for: .normal
)
tabBarController?.tabBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
Expand Down Expand Up @@ -115,10 +115,11 @@ class GalleryDetailViewController: UIViewController {

createdAtLabel.snp.makeConstraints {
$0.leading.equalToSuperview().inset(8)
$0.width.equalTo(50)
}

dateTimeLabel.snp.makeConstraints {
$0.leading.equalTo(createdAtLabel.snp.trailing).offset(20)
$0.leading.equalTo(createdAtLabel.snp.trailing).offset(10)
}

logoLabel.snp.makeConstraints {
Expand All @@ -130,6 +131,30 @@ class GalleryDetailViewController: UIViewController {

}

func configure(item: GalleryPhotoList){

if let imageURL = URL(string: item.photoUrl ?? "") {
imageView.kf.setImage(with: imageURL)

print("[갤러리 디테일뷰]")
print("[URL] \(imageURL)")
print("[ID] \(item.photoId!)")
print("[CreatedAt] \(item.createdAt!)")
}

let dateTime = formatDateTime(item.createdAt ?? "")
dateTimeLabel.text = dateTime

}

private func setupNavigationBar() {
let customNavigationItem = CustomNavigationItem()
customNavigationItem.setUpNavigationBar(for: .back)
navigationItem.backBarButtonItem = customNavigationItem.backBarButtonItem
navigationItem.backBarButtonItem?.tintColor = .gray1
navigationItem.title = "상세 보기"
}

@objc private func checkboxTapped() {
isChecked.toggle()

Expand All @@ -141,3 +166,21 @@ class GalleryDetailViewController: UIViewController {
}

}

extension GalleryDetailViewController {
private func formatDateTime(_ dateTime: String) -> String {
let inputFormatter = DateFormatter()
inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" // 서버에서 받은 날짜 형식

let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // 원하는 출력 형식

// 입력 문자열을 Date로 변환한 후, 다시 문자열로 변환
if let date = inputFormatter.date(from: dateTime) {
return outputFormatter.string(from: date)
} else {
print("[Error] Invalid date format: \(dateTime)")
return dateTime // 변환 실패 시 원본 문자열 반환
}
}
}
26 changes: 0 additions & 26 deletions saftyReport/saftyReport/Source/Gallery/GalleryItem.swift

This file was deleted.

Loading

0 comments on commit 558dbb6

Please sign in to comment.