diff --git a/shop2.xcodeproj/project.pbxproj b/shop2.xcodeproj/project.pbxproj index 22d44492660bd6371c3f4c20a24fde3507a40829..1267f61371303b034c032fbbf3a68852096c59d0 100644 --- a/shop2.xcodeproj/project.pbxproj +++ b/shop2.xcodeproj/project.pbxproj @@ -69,7 +69,6 @@ 618005D82C770F4000E07B3E /* Model */, 615AC3F42C764237009924FB /* AppDelegate.swift */, 615AC3F62C764237009924FB /* SceneDelegate.swift */, - 615AC3F82C764237009924FB /* ViewController.swift */, 615AC3FD2C764238009924FB /* Assets.xcassets */, 615AC3FF2C764238009924FB /* LaunchScreen.storyboard */, 615AC4022C764238009924FB /* Info.plist */, @@ -96,6 +95,7 @@ 618005DB2C770F6500E07B3E /* Controller */ = { isa = PBXGroup; children = ( + 615AC3F82C764237009924FB /* ViewController.swift */, 615AC4102C7663AD009924FB /* CustomTableViewCell.swift */, 618005D62C76ED5B00E07B3E /* SecondViewController.swift */, 618005DC2C770F7400E07B3E /* API */, diff --git a/shop2/Controller/API/productAPI.swift b/shop2/Controller/API/productAPI.swift index bdf2296d162327528725f16a4f34673a23fd7798..186703e399de0b40723ff7a6a0649904d2a1dba8 100644 --- a/shop2/Controller/API/productAPI.swift +++ b/shop2/Controller/API/productAPI.swift @@ -21,4 +21,18 @@ class productController{ return [] } } + + func fetchOneProductDetails(id : String) async throws -> productDetails? { + let urlString = "https://fakestoreapi.com/products/\(id)" + guard let url = URL(string:urlString) else { return nil } // to check that url must have value + + do{ + let (data , _) = try await URLSession.shared.data(from: url) + let productList = try JSONDecoder().decode(productDetails.self, from: data) + return productList + }catch{ + print("DEBUG: Error \(error.localizedDescription)") + return nil + } + } } diff --git a/shop2/Controller/SecondViewController.swift b/shop2/Controller/SecondViewController.swift index 8ce00653630265f357adc700cd46629ec2cad794..f7a37aedda47675f8f18d28020ecc726b96e1381 100644 --- a/shop2/Controller/SecondViewController.swift +++ b/shop2/Controller/SecondViewController.swift @@ -12,35 +12,49 @@ class SecondViewController: UIViewController { @IBOutlet weak var productName : UILabel! @IBOutlet weak var productPrice : UILabel! @IBOutlet weak var productImage : UIImageView! - - var img : UIImage? { - didSet { - productImage.image = img - } - } - var lblName = "" - var lblPrice = "" + + var productDetail : productDetails? + var id = "" + override func viewDidLoad() { super.viewDidLoad() - productName.text = lblName - productPrice.text = lblPrice + Task { + do { + try await fetchProduct() + } catch { + print("Failed to fetch products: \(error)") + } + } - - // Do any additional setup after loading the view. } + func fetchProduct() async throws { + do { + self.productDetail = try await productController().fetchOneProductDetails(id: id) + productName.text = productDetail?.title + productPrice.text = String(format: "$%.2f", productDetail!.price) + + if let imageUrl = URL(string: productDetail!.image) { + ViewController().loadImage(from: imageUrl) { image in + DispatchQueue.main.async { + self.productImage.image = image + + } + } + } + + - /* - // MARK: - Navigation + } catch { + print("Error fetching products: \(error)") + } + } + + + - // 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/shop2/ViewController.swift b/shop2/Controller/ViewController.swift similarity index 84% rename from shop2/ViewController.swift rename to shop2/Controller/ViewController.swift index 974b37592db0b74efc997201997061af23c6f9f1..3db15d4098d0a5a76fb140c2f1a4f0b4906ca7d2 100644 --- a/shop2/ViewController.swift +++ b/shop2/Controller/ViewController.swift @@ -43,7 +43,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } } - private func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) { + func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) { let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error fetching image: \(error)") @@ -66,18 +66,8 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let vc = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController{ let product = productList[indexPath.row] - vc.lblName = product.title - vc.lblPrice = String(format: "$%.2f", product.price) - - if let imageUrl = URL(string: product.image) { - loadImage(from: imageUrl) { image in - DispatchQueue.main.async { - vc.img = image - print("DEBUG: image link \(product.image)") - print("DEBUG: UIImage \(image)") - } - } - } + vc.id = String(product.id) + self .navigationController?.pushViewController(vc, animated: true) }