157 lines
4.9 KiB
Swift
157 lines
4.9 KiB
Swift
//
|
|
// LiveUser.swift
|
|
// Mixonomer
|
|
//
|
|
// Created by Andy Pack on 19/02/2020.
|
|
// Copyright © 2020 Sarsoo. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Alamofire
|
|
import SwiftyJSON
|
|
|
|
class LiveUser: ObservableObject {
|
|
|
|
@Published var playlists: [Playlist]
|
|
@Published var tags: [Tag]
|
|
@Published var username: String
|
|
|
|
@Published var loggedIn: Bool {
|
|
didSet {
|
|
UserDefaults.standard.set(loggedIn, forKey: "loggedIn")
|
|
}
|
|
}
|
|
|
|
@Published var isRefreshingPlaylists = false
|
|
@Published var isRefreshingTags = false
|
|
|
|
init(playlists: [Playlist], tags: [Tag], username: String, loggedIn: Bool) {
|
|
self.playlists = playlists
|
|
self.tags = tags
|
|
self.username = username
|
|
self.loggedIn = loggedIn
|
|
}
|
|
|
|
func updatePlaylist(playlistIn: Playlist) {
|
|
guard let index = self.playlists.firstIndex(of: playlistIn) else {
|
|
fatalError("\(playlistIn) not found")
|
|
}
|
|
self.playlists[index] = playlistIn
|
|
}
|
|
|
|
func refreshPlaylists() {
|
|
self.isRefreshingPlaylists = true
|
|
|
|
let api = PlaylistApi.getPlaylists
|
|
RequestBuilder.buildRequest(apiRequest: api).responseJSON{ response in
|
|
|
|
self.checkNetworkResponse(response: response)
|
|
|
|
switch response.response?.statusCode {
|
|
case 200, 201:
|
|
|
|
guard let data = response.data else {
|
|
fatalError("error getting playlists")
|
|
}
|
|
|
|
guard let json = try? JSON(data: data) else {
|
|
fatalError("error parsing reponse")
|
|
}
|
|
|
|
let playlists = json["playlists"].arrayValue
|
|
|
|
// update state
|
|
self.playlists = PlaylistApi.fromJSON(playlist: playlists).sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
|
|
|
|
self.isRefreshingPlaylists = false
|
|
|
|
let encoder = JSONEncoder()
|
|
do {
|
|
UserDefaults.standard.set(String(data: try encoder.encode(playlists), encoding: .utf8), forKey: "playlists")
|
|
} catch {
|
|
print("error encoding playlists: \(error)")
|
|
}
|
|
|
|
case _:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func refreshTags() {
|
|
self.isRefreshingTags = true
|
|
|
|
let api = TagApi.getTags
|
|
RequestBuilder.buildRequest(apiRequest: api).responseJSON{ response in
|
|
|
|
self.checkNetworkResponse(response: response)
|
|
|
|
switch response.response?.statusCode {
|
|
case 200, 201:
|
|
|
|
guard let data = response.data else {
|
|
fatalError("error getting tags")
|
|
}
|
|
|
|
guard let json = try? JSON(data: data) else {
|
|
fatalError("error parsing reponse")
|
|
}
|
|
|
|
let tags = json["tags"].arrayValue
|
|
|
|
// update state
|
|
self.tags = TagApi.fromJSON(tag: tags).sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
|
|
|
|
self.isRefreshingTags = false
|
|
|
|
let encoder = JSONEncoder()
|
|
do {
|
|
UserDefaults.standard.set(String(data: try encoder.encode(tags), encoding: .utf8), forKey: "tags")
|
|
} catch {
|
|
print("error encoding tags: \(error)")
|
|
}
|
|
|
|
case _:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func checkNetworkResponse(response: AFDataResponse<Any>) {
|
|
|
|
switch response.response?.statusCode {
|
|
case 401:
|
|
self.loggedIn = false
|
|
case _:
|
|
print("error making request")
|
|
}
|
|
}
|
|
|
|
func loadUserDefaults() -> LiveUser {
|
|
let defaults = UserDefaults.standard
|
|
let decoder = JSONDecoder()
|
|
|
|
let _strPlaylists = defaults.string(forKey: "playlists")
|
|
let _strTags = defaults.string(forKey: "tags")
|
|
loggedIn = defaults.bool(forKey: "loggedIn")
|
|
|
|
do {
|
|
if let _strPlaylists = _strPlaylists {
|
|
if _strPlaylists.count > 0 {
|
|
self.playlists = (try decoder.decode([Playlist].self, from: _strPlaylists.data(using: .utf8)!)).sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
|
|
}
|
|
}
|
|
|
|
if let _strTags = _strTags {
|
|
if _strTags.count > 0 {
|
|
self.tags = (try decoder.decode([Tag].self, from: _strTags.data(using: .utf8)!)).sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
|
|
}
|
|
}
|
|
} catch {
|
|
print("error decoding: \(error)")
|
|
}
|
|
|
|
return self
|
|
}
|
|
}
|