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
242 changes: 235 additions & 7 deletions AsyncSwift.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

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

4 changes: 4 additions & 0 deletions AsyncSwift/AsyncSwift.entitlements
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@
<array>
<string>applinks:asyncswift.info</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.kim.AsyncSwift</string>
</array>
</dict>
</plist>
26 changes: 11 additions & 15 deletions AsyncSwift/Observed/EventDetailView+Observed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,27 @@ import EventKit
import SwiftUI

extension EventDetailView {

final class Observed: ObservableObject {

init(event: Event) {
self.event = event
}

@Published var event: Event
let event: Event
@Published var isShowingSheet = false
@Published var isShowingAddEventConfirmationAlert = false
@Published var isShowingAddEventSuccessAlert = false
@Published var isShowingAddEventFailureAlert = false

func additionConfirmed() {
addEventOnCalendar { isSuccess in
DispatchQueue.main.async { [weak self] in
if let self = self {
switch isSuccess {
case true:
self.isShowingAddEventSuccessAlert = true
case false:
self.isShowingAddEventFailureAlert = true
}
addEventOnCalendar { [weak self] isSuccess in
DispatchQueue.main.async {
switch isSuccess {
case true:
self?.isShowingAddEventSuccessAlert = true
case false:
self?.isShowingAddEventFailureAlert = true
}
}
}
Expand All @@ -39,11 +38,8 @@ extension EventDetailView {
func addEventOnCalendar(completion: @escaping ((Bool) -> Void) ) {
let eventStore = EKEventStore()

eventStore.requestAccess(to: .event) { (granted, error) in
if let error = error {
print("failed to save event with error : \(error) or access not granted")
return
}
eventStore.requestAccess(to: .event) { [weak self] (granted, error) in
guard let self, error == nil else { return }
let event = EKEvent(eventStore: eventStore)
let formatter = DateFormatter.calendarFormatter
event.title = self.event.title
Expand Down
47 changes: 18 additions & 29 deletions AsyncSwift/Observed/EventView+Observed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,31 @@
//

import SwiftUI
import Combine

final class EventViewObserved: ObservableObject {

@Published var event = Event()
@Published var eventStatus: EventStatus = .upcoming
@Published var isLoading = true
let onLoadingCells = Array(repeating: [0], count: 6)

init() {
self.fetchJson {
self.calculateEventStatus()
self.isLoading = false
}
}

func fetchJson(completion: @escaping () -> Void) {
guard let url = URL(string: "https://async-swift.github.io/jsonstorage/asyncswift.json") else { return }
let request = URLRequest(url: url)
let dataTask = URLSession.shared.dataTask(with: request) { data, response, _ in
guard
let response = response as? HTTPURLResponse,
response.statusCode == 200,
let data = data
else { return }
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
do {
let decodedData = try JSONDecoder().decode(Event.self, from: data)
self.event = decodedData
completion()
} catch let error {
print("❌ \(error.localizedDescription)")
}
}
}
dataTask.resume()
var cancellable = Set<AnyCancellable>()

func getEventData() {
let urlString = "https://async-swift.github.io/jsonstorage/asyncswift.json"
let url = URL(string: urlString)!
URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: Event.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.sink { _ in

} receiveValue: { [weak self] event in
self?.event = event
self?.calculateEventStatus()
self?.isLoading = false
}
.store(in: &cancellable)
}

func calculateEventStatus() {
Expand Down
20 changes: 0 additions & 20 deletions AsyncSwift/Observed/SessionView+Observed.swift

This file was deleted.

57 changes: 31 additions & 26 deletions AsyncSwift/Observed/StampView+Observed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
//

import SwiftUI
import Combine

extension StampView {
@MainActor final class Observed: ObservableObject {
final class Observed: ObservableObject {
@Published var cards: [Card] = []
@Published var events = [String]()
@Published var currentIndex = 0
@Published var isLoading = true
private let keyChainManager = KeyChainManager()
private let cardInterval: CGFloat = (UIScreen.main.bounds.width - 32) * 56 / 358
private let cardSize: CGFloat = UIScreen.main.bounds.width - 32
private var cancenllable = Set<AnyCancellable>()

init() {
fetchStampsImages()
Expand All @@ -30,38 +32,41 @@ extension StampView {

/// Storage에 저장되어 있는 Stamp Image를 가져오는 함수이다.
/// -
private func fetchStampsImages(){
private func fetchStampsImages() {

let events = getEvents()

guard !events.isEmpty else {
isLoading = false
return
}

guard !events.isEmpty else { return isLoading = false }

events.enumerated().forEach { [weak self] in
guard let self else { return }
let event = $0.element
let index = $0.offset
Task { @MainActor () -> Void in
guard let cardImageURL = URL(string: "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/Images/Stamp/" + event + "/stamp.png")
else { return }

let cardImageRequest = URLRequest(url: cardImageURL)
let (cardImageData, cardImageResponse) = try await URLSession.shared.data(for: cardImageRequest)
guard let httpsResponse = cardImageResponse as? HTTPURLResponse, httpsResponse.statusCode == 200 else { return }

guard let cardUIImage = UIImage(data: cardImageData) else { return }

let card = Card(
originalPosition: self.cardInterval * CGFloat(index),
image: Image(uiImage: cardUIImage),
event: event
)
self.cards.append(card)
if index == events.count - 1 {
self.isLoading = false
let urlString = "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/Images/Stamp/" + event + "/stamp.png"
let url = URL(string: urlString)!

URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.tryMap {
guard let image = UIImage(data: $0) else {
throw URLError(.badURL)
}
return Card(
originalPosition: self.cardInterval * CGFloat(index),
image: Image(uiImage: image),
event: event
)
}
}
.receive(on: RunLoop.main)
.sink(receiveCompletion: { _ in

}, receiveValue: { [weak self] card in
self?.cards.append(card)
if index == events.count - 1 {
self?.isLoading = false
}
})
.store(in: &cancenllable)
}
}

Expand Down
42 changes: 15 additions & 27 deletions AsyncSwift/Observed/TicketingView+Observed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import Foundation
extension TicketingView {
final class Observed: ObservableObject {
@Published var ticketing: Ticketing?

@Published var isActivatedWebViewNavigationLink = false
var cancellable = Set<AnyCancellable>()

var hasAvailableTicket: Bool {
let currentDate = Date()
Expand All @@ -22,32 +22,20 @@ extension TicketingView {
var isTicketingLinkDisabled: Bool {
ticketing?.currentTicket?.ticketingURL == nil && !hasAvailableTicket
}

func onAppear() {
guard
let url = URL(string: "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/ticketing.json")
else { return }


let request = URLRequest(url: url)
let dataTask = URLSession.shared.dataTask(with: request) { data, response, _ in
guard
let response = response as? HTTPURLResponse,
response.statusCode == 200,
let data = data
else { return }

DispatchQueue.main.async { [weak self] in
do {
let ticketing = try JSONDecoder().decode(Ticketing.self, from: data)
self?.ticketing = ticketing
} catch {
self?.ticketing = nil
}
}
}

dataTask.resume()

func getTicketingData() {
let urlString = "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/ticketing.json"
let url = URL(string: urlString)!
URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: Ticketing.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.sink { _ in

} receiveValue: { [weak self] event in
self?.ticketing = event
}
.store(in: &cancellable)
}

func didTappedTicketingButton() {
Expand Down
1 change: 1 addition & 0 deletions AsyncSwift/Views/EventView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ struct EventView: View {
}
}
.navigationTitle(Tab.event.title)
.onAppear { observed.getEventData() }
}
}
}
Expand Down
Loading