Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
df9a899
[#16] fix : 머지 컨플릭 해결
Nov 30, 2023
e0ff791
[#16] feat : 버튼 기능 추가
Dec 1, 2023
e0d0f95
[#16] feat : 버튼 정렬 및 페이징 구현
Dec 18, 2023
16f2b4c
[#47] feat : 퀴즈 홈 뷰 UI 및 모델 생성
Jan 4, 2024
f35beb3
[#35] feat : API 연결
Jan 29, 2024
b75f3b8
[#52] feat : API Connect and UI Edit
Feb 5, 2024
4c10be6
Merge pull request #53 from codingBottle/Feat/user-mypage
0420yun Feb 5, 2024
aead8fe
[#16] fix : conflict fix
Nov 30, 2023
564e623
[#16] feat : 버튼 기능 추가
Dec 1, 2023
2aed9c2
[#16] fix : conflict fix
Dec 18, 2023
5ae8d15
[Merge] commit merge
Feb 5, 2024
9e45f4a
[#16] feat : UI
Feb 5, 2024
c5cd3f4
Merge pull request #40 from codingBottle/Feat/quiz-categoryButton
0420yun Feb 5, 2024
ea15bcc
[#54] fix : Conflict Solved
Feb 5, 2024
0dc46c2
[#54] feat : Add myPage and weather, categoryButton
Feb 8, 2024
e19f25c
Merge pull request #56 from codingBottle/Feat/mainView
0420yun Feb 8, 2024
27c25e8
conflict 해결
Surviveyeomi Feb 9, 2024
ae4a6e3
[#58] feat : Banner and Searh Bar
Surviveyeomi Feb 11, 2024
4cabd58
[#60] fix : fix for searchButtonTapped
Surviveyeomi Feb 12, 2024
51c54b7
[#62] feat : CategoryPage UI and API
Surviveyeomi Feb 12, 2024
137bae9
Merge pull request #61 from codingBottle/feat/banner-search
Surviveyeomi Feb 13, 2024
0233be1
Merge pull request #63 from codingBottle/feat/category-datapage
Surviveyeomi Feb 13, 2024
325ef4c
xcodeproj resolved
Feb 18, 2024
df8398d
UI 수정
Feb 8, 2024
daf9774
[#55] feat : Connect CategoryPageView
Feb 18, 2024
2cf7f06
Merge pull request #64 from codingBottle/Feat/main-categoryButton
0420yun Feb 18, 2024
b8da12e
[#47] feat : QuizHomeView UI & Add Model & Fix Conflict
Jan 4, 2024
88fc510
[#35] feat : Connect API & Fix Conflict
Jan 29, 2024
9441451
[#35] feat : Connect API & Edit UI & Fix Conflict
Feb 18, 2024
bbf798f
Fix Conflict
Feb 18, 2024
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
179 changes: 145 additions & 34 deletions Helfy.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

This file was deleted.

7 changes: 7 additions & 0 deletions Helfy.xcodeproj/xcshareddata/xcschemes/Helfy.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@
ReferencedContainer = "container:Helfy.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
<AdditionalOption
key = "NSZombieEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
Expand Down
79 changes: 79 additions & 0 deletions Helfy/APIHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
//
// APIHandler.swift
// Helfy
//
// Created by 윤성은 on 1/3/24.
//

import Foundation

class APIHandler {

let token = UserDefaults.standard.string(forKey: "GoogleToken") ?? ""

func getQuizHomeData(completion: @escaping (QuizHomeModel) -> ()) {
guard let url = URL(string: "https://helfy-server.duckdns.org/api/v1/quiz/users") else {
return
}

print("token 값 : \(self.token)")

var requestURL = URLRequest(url: url)
requestURL.setValue("Bearer \(self.token)", forHTTPHeaderField: "Authorization")
print(requestURL,"requestURL")

// 2. 데이터를 받아오기 위한 URLSession의 dataTask를 생성
URLSession.shared.dataTask(with: requestURL) { data, response, error in
// 3. 에러 처리, 데이터 및 리스폰스 확인, 디코딩 등등 출동
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}

if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 200 {
do {
let quizHomeParsedData = try JSONDecoder().decode(QuizHomeModel.self, from: data)
completion(quizHomeParsedData)
} catch {
print(error.localizedDescription)
}
} else {
if let response = response as? HTTPURLResponse { print("Status code: \(response.statusCode)") }
}
}.resume()
}

func getQuizData(type: String, completion: @escaping (Quiz) -> ()) {
guard let url = URL(string: "https://helfy-server.duckdns.org/api/v1/quiz?type=\(type)") else { return }

print("token 값 : \(self.token)")

var requestURL = URLRequest(url: url)
requestURL.setValue("Bearer \(self.token)", forHTTPHeaderField: "Authorization")
print(requestURL,"requestURL")


// 2. 데이터를 받아오기 위한 URLSession의 dataTask를 생성
URLSession.shared.dataTask(with: requestURL) { data, response, error in
// 3. 에러 처리, 데이터 및 리스폰스 확인, 디코딩 등등 출동
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}

if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 200 {
do {
let quizParsedData = try JSONDecoder().decode(Quiz.self, from: data)
completion(quizParsedData)

print("quizParsedData: \(quizParsedData)")
print("❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥")
} catch {
print(error.localizedDescription)
}
} else {
if let response = response as? HTTPURLResponse { print("Status code: \(response.statusCode)") }
}
}.resume()
}
}
47 changes: 47 additions & 0 deletions Helfy/APIHandler/CategoryAPIHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//
// File.swift
// Helfy
//
// Created by 윤성은 on 2/18/24.
//

import Foundation

class CategoryAPIHandler {

let token = UserDefaults.standard.string(forKey: "GoogleToken") ?? ""

func getCategoryData(completion: @escaping (CategoryModel) -> ()) {
print("getCategoryData called")

guard let url = URL(string: "https://helfy-server.duckdns.org/api/v1/categories") else {
return
}

print("token 값 : \(self.token)")

var requestURL = URLRequest(url: url)
requestURL.setValue("Bearer \(self.token)", forHTTPHeaderField: "Authorization")
print(requestURL,"requestURL")

// 2. 데이터를 받아오기 위한 URLSession의 dataTask를 생성
URLSession.shared.dataTask(with: requestURL) { data, response, error in
// 3. 에러 처리, 데이터 및 리스폰스 확인, 디코딩 등등 출동
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}

if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 200 {
do {
let categoryParsedData = try JSONDecoder().decode(CategoryModel.self, from: data)
completion(categoryParsedData)
} catch {
print(error.localizedDescription)
}
} else {
if let response = response as? HTTPURLResponse { print("Status code: \(response.statusCode)") }
}
}.resume()
}
}
42 changes: 42 additions & 0 deletions Helfy/APIHandler/CategoryPageAPIHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//
// CategoryPageAPIHandler.swift
// Helfy
//
// Created by YEOMI on 2/12/24.
//

import Foundation

class APIHandler {
func getCategoryPageData(category: String,completion: @escaping (CategoryPageModel) -> ()) {
//let key = "발급받은 API키"

// 1. 사전준비 단계에서 발급받은 key를 활용하여 requestURL 생성
guard let url = URL(string: "https://helfy-server.duckdns.org/api/v1/information?category=\(category)") else {
print("유효하지 않은 url입니다.")
return
}
var requestURL = URLRequest(url: url)
requestURL.httpMethod = "GET"

// 2. 데이터를 받아오기 위한 URLSession의 dataTask를 생성
URLSession.shared.dataTask(with: requestURL) { data, response, error in
// 3. 에러 처리, 데이터 및 리스폰스 확인, 디코딩 등등 출
guard error == nil else {
print(error?.localizedDescription)
return
}

if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 200 {
do {
//가공
let parsedData = try JSONDecoder().decode(CategoryPageModel.self, from: data)
completion(parsedData)
} catch {
print("Error decoding data: \(error.localizedDescription)")
}

}
}.resume()
}
}
55 changes: 55 additions & 0 deletions Helfy/APIHandler/ImageLoader.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
//
// ImageLoader.swift
// Helfy
//
// Created by YEOMI on 2/12/24.
//

import Foundation
import UIKit

class ImageLoader {
private static let imageCache = NSCache<NSString, UIImage>()

static func loadImage(url: String, completion: @escaping (UIImage?) -> Void) {
// url이 비어있다면 nil처리
if url.isEmpty {
completion(nil)
return
}

// URL 형식으로 변환
let realURL = URL(string: url)!

// 캐시에 있다면 바로 반환
if let image = imageCache.object(forKey: realURL.lastPathComponent as NSString) {
print("캐시에 존재 😎")
// UI는 메인 쓰레드에서 진행
DispatchQueue.main.async {
completion(image)
}
return
}

// 캐시에 없다면
DispatchQueue.global(qos: .background).async {
print("캐시에 없음 🥲")
// 데이터 타입 변환
if let data = try? Data(contentsOf: realURL) {
// 이미지 변환
let image = UIImage(data: data)!
// cache에 추가
self.imageCache.setObject(image, forKey: realURL.lastPathComponent as NSString)
// UI는 메인 쓰레드에서 진행
DispatchQueue.main.async {
completion(image)
}
} else {
DispatchQueue.main.async {
completion(nil)
}
}
}

}
}
Loading