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
2 changes: 1 addition & 1 deletion Box42/Menubar/MenubarViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Foundation
import AppKit

class MenubarViewController: NSViewController {
var popover = NSPopover()
var popover: NSPopover! = NSPopover()
var statusBarVM = StatusBarViewModel()
lazy var eventMonitor: EventMonitor = self.setupEventMonitor()
var boxWindowController: BoxWindowController?
Expand Down
2 changes: 1 addition & 1 deletion Box42/QuickSlot/Model/QuickSlotButtonModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import Foundation

// Model
struct QuickSlotButtonModel {
struct QuickSlotButtonModel: Codable {
let id: UUID
var title: String
var path: String?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ class QuickSlotButtonCollectionViewController: NSViewController {
func initializeCombine() {
viewModel.$buttons
.sink { [weak self] _ in
self?.quickSlotButtonCollectionView.reloadData()
DispatchQueue.main.async {
self?.quickSlotButtonCollectionView.reloadData()
}
}
.store(in: &cancellables)
}
Expand Down
3 changes: 2 additions & 1 deletion Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ class QuickSlotViewModel {
@Published var buttons: [QuickSlotButtonModel] = []

private init() {
let button1 = QuickSlotButtonModel(title: QuickSlotUI.title.clean,
let button1 = QuickSlotButtonModel(id: UUID(uuidString: "550e8400-e29b-41d4-a716-446655440000")!,
title: QuickSlotUI.title.clean,
path: Bundle.main.path(forResource: "cleanCache", ofType: "sh"))
let button2 = QuickSlotButtonModel(title: QuickSlotUI.title.preferences)
let button3 = QuickSlotButtonModel(title: QuickSlotUI.title.scripts)
Expand Down
3 changes: 1 addition & 2 deletions Box42/Resources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
WebViewManager.shared.getCookie()
API.getUserProfile(WebViewManager.shared.getCookieWebKit)
_ = QuickSlotViewModel.shared
API.getUserMeScripts(WebViewManager.shared.getCookieWebKit)
_ = ScriptViewModel.shared
_ = ScriptViewModel.shared // 초기화와 동시에
}

func applicationWillTerminate(_ aNotification: Notification) {
Expand Down
2 changes: 1 addition & 1 deletion Box42/Scripts/Controller/ScriptsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation

class ScriptsViewController: NSViewController {
var scriptsTableView: ScriptsTableView?
var viewModel: ScriptViewModel? = ScriptViewModel() {
var viewModel: ScriptViewModel? = ScriptViewModel.shared {
didSet {
scriptsTableView?.viewModel = viewModel
}
Expand Down
10 changes: 6 additions & 4 deletions Box42/Scripts/Model/Scripts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,19 @@ struct Scripts: Codable {
}

struct Script: Codable {
var id: UUID
var id: UUID?
var name: String
var description: String
var path: String
var savedId: Int
var savedId: Int?
var userUuid: String?

init(name: String, description: String, path: String, savedId: Int) {
self.id = UUID()
init(id: UUID = UUID(), name: String, description: String, path: String, savedId: Int, userUuid: String?) {
self.id = id
self.name = name
self.description = description
self.path = path
self.savedId = savedId
self.userUuid = userUuid
}
}
7 changes: 5 additions & 2 deletions Box42/Scripts/View/Table/ScriptsTableView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@ import Combine
class ScriptsTableView: NSTableView {
var viewModel: ScriptViewModel? {
didSet {
print("ViewModel has been set.")
setupBindings()
}
}

var cancellables: Set<AnyCancellable> = []

private func setupBindings() {
viewModel?.$scripts.sink(receiveValue: { [weak self] _ in
print("Setting up bindings...") // 디버깅 로그
viewModel?.$scripts.sink(receiveValue: { [weak self] newScripts in
print("Received new scripts: \(newScripts)") // 디버깅 로그
DispatchQueue.main.async {
self?.reloadData()
}
Expand Down
61 changes: 38 additions & 23 deletions Box42/Scripts/ViewModel/ScriptsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,33 @@ class ScriptViewModel: NSObject {

@Published var scripts: [Script] = []

override init() {
private override init() {
self.scripts = [
Script(name: "cleanCache",
description: "Cleaning cache",
path: Bundle.main.path(forResource: "cleanCache", ofType: "sh") ?? "", savedId: -1 ),
Script(name: "brewInGoinfre",
description: "Brew download in goinfre",
path: Bundle.main.path(forResource: "brewInGoinfre", ofType: "sh") ?? "", savedId: -1),
Script(name: "exportMacOSInfo",
description: "export setting MacOS Info",
path: Bundle.main.path(forResource: "exportMacOSInfo", ofType: "sh") ?? "", savedId: -1 ),
Script(name: "importMacOSInfo",
description: "import MacOS Info",
path: Bundle.main.path(forResource: "importMacOSInfo", ofType: "sh") ?? "", savedId: -1),
Script(name: "key Mapping",
description: "key Mapping",
path: Bundle.main.path(forResource: "keyMapping", ofType: "sh") ?? "", savedId: -1 ),
Script(name: "nodeInstall",
description: "node Install",
path: Bundle.main.path(forResource: "nodeInstall", ofType: "sh") ?? "", savedId: -1)
path: Bundle.main.path(forResource: "cleanCache", ofType: "sh") ?? "", savedId: -1 , userUuid: nil),
// Script(name: "brewInGoinfre",
// description: "Brew download in goinfre",
// path: Bundle.main.path(forResource: "brewInGoinfre", ofType: "sh") ?? "", savedId: -1, userUuid: nil),
// Script(name: "exportMacOSInfo",
// description: "export setting MacOS Info",
// path: Bundle.main.path(forResource: "exportMacOSInfo", ofType: "sh") ?? "", savedId: -1, userUuid: nil),
// Script(name: "importMacOSInfo",
// description: "import MacOS Info",
// path: Bundle.main.path(forResource: "importMacOSInfo", ofType: "sh") ?? "", savedId: -1, userUuid: nil),
// Script(name: "key Mapping",
// description: "key Mapping",
// path: Bundle.main.path(forResource: "keyMapping", ofType: "sh") ?? "", savedId: -1, userUuid: nil),
// Script(name: "nodeInstall",
// description: "node Install",
// path: Bundle.main.path(forResource: "nodeInstall", ofType: "sh") ?? "", savedId: -1, userUuid: nil)
]
API.initializeUserMeScripts(WebViewManager.shared.getCookieWebKit)
}

// Create
func addScript(name: String, description: String, path: String) {
let newScript = Script(name: name, description: description, path: path, savedId: -1)
func addScript(id: UUID = UUID(), name: String, description: String, path: String, savedId: Int, userUuid: String) {
let newScript = Script(id: UUID(), name: name, description: description, path: path, savedId: savedId, userUuid: userUuid)
scripts.append(newScript)
}

Expand All @@ -61,16 +62,30 @@ class ScriptViewModel: NSObject {

// Delete
func deleteScript(id: UUID) {
// delete 요청 보내야함 보내고 성공하면 지우기
scripts.removeAll(where: { $0.id == id })
QuickSlotViewModel.shared.removeButton(id)
if let script = scripts.first(where: { $0.id == id }) {
API.deleteUserMeScripts(WebViewManager.shared.getCookieWebKit, savedId: script.savedId!) { result in
switch result {
case .success(_):
self.scripts.removeAll(where: { $0.id == id })
QuickSlotViewModel.shared.removeButton(id)

case .failure(let error):
print("Failed to delete script: \(error)")
}
}
}
}

// 새로운 스크립트 배열로 교체하는 메서드
// 새로운 스크립트 배열로 교체하는 메소드
func replaceScripts(with newScripts: [Script]) {
self.scripts = newScripts
}

// VM class 시작시 최초 1회 실행되는 메소드
func setupScripts(with newScripts: [Script]) {
self.scripts += newScripts
}

// 스크립트안에서 해당하는 스크립트를 찾아서 quickslotVM에 추가
func quickSlotScript(id: UUID) {
if let index = scripts.firstIndex(where: { $0.id == id }) {
Expand Down
11 changes: 9 additions & 2 deletions Box42/Shared/API/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,17 @@ class API {
return
}

let jsonString = String(data: data, encoding: .utf8)
print("Received JSON string:\n\(jsonString ?? "")")

do {
if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
print("Received data:\n\(json)")
}

let decodedData = try JSONDecoder().decode(type, from: data)
completion(.success(decodedData))

} catch let jsonError {
completion(.failure(jsonError))
}
Expand All @@ -54,10 +62,9 @@ class API {
completion(.failure(NSError(domain: "InvalidStatusCode", code: httpResponse.statusCode, userInfo: nil)))
return
}

completion(.success(data))
}
task.resume()
}

}
18 changes: 17 additions & 1 deletion Box42/Shared/API/DeleteUserMeScript.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,20 @@
// Created by Chanhee Kim on 9/2/23.
//

import Foundation
import WebKit

extension API {
// MARK: - Scripts DELETE: https://api.42box.kr/user-service/users/me/scripts/{savedId}
static func deleteUserMeScripts(_ webView: WKWebView, savedId: Int, completion: @escaping (Result<Void, Error>) -> Void) {
let url = "https://api.42box.kr/user-service/users/me/scripts/\(savedId)"

deleteDataFromAPI(withURL: url) { (result: Result<Data?, Error>) in
switch result {
case .success(_):
completion(.success(()))
case .failure(let error):
completion(.failure(error))
}
}
}
}
26 changes: 24 additions & 2 deletions Box42/Shared/API/GetUserMeScripts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import WebKit

extension API {
// MARK: - Scripts GET: https://api.42box.site/user-service/users/me/scripts
// MARK: - Scripts GET: https://api.42box.kr/user-service/users/me/scripts
// result : scripts.shared 저장

static func getUserMeScripts(_ webView: WKWebView) {
Expand All @@ -18,7 +18,7 @@ extension API {
cookieStorage.setCookie(cookie)
}

fetchDataFromAPI(withURL: "https://api.42box.site/user-service/users/me/scripts", forType: [Script].self) { (result: Result<[Script], Error>) in
fetchDataFromAPI(withURL: "https://api.42box.kr/user-service/users/me/scripts", forType: [Script].self) { (result: Result<[Script], Error>) in
switch result {
case .success(let scripts):
print(">> MacOS Get :", scripts)
Expand All @@ -31,4 +31,26 @@ extension API {
}
}
}

static func initializeUserMeScripts(_ webView: WKWebView) {
webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
let cookieStorage = HTTPCookieStorage.shared
for cookie in cookies {
cookieStorage.setCookie(cookie)
}

fetchDataFromAPI(withURL: "https://api.42box.kr/user-service/users/me/scripts", forType: [Script].self) { (result: Result<[Script], Error>) in
switch result {
case .success(let scripts):
print(">> MacOS Get :", scripts)
DispatchQueue.main.async {
ScriptViewModel.shared.setupScripts(with: scripts)
}
case .failure(let error):
print("Error: \(error)")
}
}
}
}

}
41 changes: 2 additions & 39 deletions Box42/Shared/API/GetUserProfile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import WebKit

extension API {
// MARK: - 유저 정보 (Back) GET: https://api.42box.site/user-service/users/me
// MARK: - 유저 정보 (Back) GET: https://api.42box.kr/user-service/users/me
// result : 성공 UserProfile.shared 저장

static func getUserProfile(_ webView: WKWebView) {
Expand All @@ -18,7 +18,7 @@ extension API {
cookieStorage.setCookie(cookie)
}

fetchDataFromAPI(withURL: "https://api.42box.site/user-service/users/me", forType: UserProfile.self) { (result: Result<UserProfile, Error>) in
fetchDataFromAPI(withURL: "https://api.42box.kr/user-service/users/me", forType: UserProfile.self) { (result: Result<UserProfile, Error>) in
switch result {
case .success(let userProfile):
print(">> MacOS Get :", userProfile)
Expand All @@ -30,40 +30,3 @@ extension API {
}
}
}

//static func getUserProfile(_ webView: WKWebView) {
// webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
// let cookieStorage = HTTPCookieStorage.shared
//
// for cookie in cookies {
//// print("\(cookie.name) = \(cookie.value)")
// cookieStorage.setCookie(cookie)
// }
//
// var request = URLRequest(url: URL(string: "https://api.42box.site/user-service/users/me")!)
// request.httpShouldHandleCookies = true
// let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// if let error = error {
// print("Error: \(error)")
// return
// }
//
// guard let data = data else {
// print("No data received.")
// return
// }
//
// do {
// let userProfile = try JSONDecoder().decode(UserProfile.self, from: data)
//
// print(">> MacOS Get :", userProfile )
// UserManager.shared.updateUserProfile(newProfile: userProfile)
//
// } catch let jsonError {
// print("JSON Parsing Error: \(jsonError)")
// }
// }
// task.resume()
// }
//}
//
7 changes: 6 additions & 1 deletion Box42/Shared/User/UserProfile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// Created by Chanhee Kim on 8/28/23.
//

import AppKit

struct UserProfile: Codable {
let uuid: String
let nickname: String
Expand All @@ -14,6 +16,7 @@ struct UserProfile: Codable {
let statusMessage: String
let profileImageUrl: String
let profileImagePath: String
let quickSlotList: [QuickSlotButtonModel]
}

struct URLItem: Codable {
Expand Down Expand Up @@ -42,7 +45,9 @@ extension UserProfile {
URLItem(name: "42gg", url: "https://42gg.kr/")],
statusMessage: "hello 42Box!",
profileImageUrl: "https://42box.kr/user_profile_image/a52671f9-fca9-43ad-b0c0-1c5360831cf2.png",
profileImagePath: "user_profile_image/a52671f9-fca9-43ad-b0c0-1c5360831cf2.png"
profileImagePath: "user_profile_image/a52671f9-fca9-43ad-b0c0-1c5360831cf2.png",
quickSlotList: [ QuickSlotButtonModel(id: UUID(uuidString: "550e8400-e29b-41d4-a716-446655440000")!, title: "cleanCache", path: Bundle.main.path(forResource: "cleanCache", ofType: "sh")),
]
)
}
}
5 changes: 3 additions & 2 deletions Box42/WebView/Model/WebViewUI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import Foundation

enum WebViewUI {
enum transfer {
static let download = "download"
static let downloadScript = "downloadScript"
static let executeScript = "executeScript"
static let deleteScript = "deleteScript"
static let icon = "icon"
static let userProfile = "userProfile"
static let script = "script"
}
}
Loading