diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index 6ef337a..aefc71c 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -68,11 +68,16 @@ DE6332F22A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */; }; DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA502A82580400713683 /* MenubarViewModel.swift */; }; DE77BA562A82637900713683 /* StateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA552A82637900713683 /* StateManager.swift */; }; + DE7886012A9C71BE00FE21DD /* IconsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886002A9C71BE00FE21DD /* IconsViewController.swift */; }; + DE7886042A9C71CB00FE21DD /* IconsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886032A9C71CB00FE21DD /* IconsView.swift */; }; + DE78860C2A9C770300FE21DD /* IconsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78860B2A9C770300FE21DD /* IconsViewModel.swift */; }; + DE7886102A9C773300FE21DD /* IconsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78860F2A9C773300FE21DD /* IconsModel.swift */; }; + DE7886172A9CCB3B00FE21DD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886162A9CCB3B00FE21DD /* UserProfile.swift */; }; + DE78861C2A9CE7D700FE21DD /* IconChanged+WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */; }; DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */; }; DE7F9D462A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */; }; DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */; }; DE874F542A591F1400FC3B77 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F532A591F1400FC3B77 /* PreferencesView.swift */; }; - DE874F572A591F2500FC3B77 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F562A591F2500FC3B77 /* Icon.swift */; }; DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F5E2A5935CC00FC3B77 /* String.swift */; }; DE97CA692A9A6364001073DE /* PixelConversion+CGFloat.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA682A9A6364001073DE /* PixelConversion+CGFloat.swift */; }; DE97CA792A9A6F6A001073DE /* QuickSlotHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */; }; @@ -155,12 +160,17 @@ DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotScriptsLogicController.swift; sourceTree = ""; }; DE77BA502A82580400713683 /* MenubarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarViewModel.swift; sourceTree = ""; }; DE77BA552A82637900713683 /* StateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateManager.swift; sourceTree = ""; }; + DE7886002A9C71BE00FE21DD /* IconsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsViewController.swift; sourceTree = ""; }; + DE7886032A9C71CB00FE21DD /* IconsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsView.swift; sourceTree = ""; }; + DE78860B2A9C770300FE21DD /* IconsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsViewModel.swift; sourceTree = ""; }; + DE78860F2A9C773300FE21DD /* IconsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsModel.swift; sourceTree = ""; }; + DE7886162A9CCB3B00FE21DD /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = ""; }; + DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IconChanged+WebView.swift"; sourceTree = ""; }; DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; DE7F9D432A9B7A4700F8ACAE /* QuickSlotButtonViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonViewItem.swift; sourceTree = ""; }; DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QuickSlotButtonViewItem.xib; sourceTree = ""; }; DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hotkey.swift; sourceTree = ""; }; DE874F532A591F1400FC3B77 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; - DE874F562A591F2500FC3B77 /* Icon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; DE874F5E2A5935CC00FC3B77 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; DE97CA682A9A6364001073DE /* PixelConversion+CGFloat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelConversion+CGFloat.swift"; sourceTree = ""; }; DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewModel.swift; sourceTree = ""; }; @@ -213,6 +223,7 @@ DE018BB12A5099F900FF0AA3 /* Box42 */ = { isa = PBXGroup; children = ( + DE7885FF2A9C717E00FE21DD /* Icon */, DE77BA542A82636500713683 /* Shared */, DEF749302A85655E00D987C8 /* Extensions */, DE018C0E2A509C0C00FF0AA3 /* Menubar */, @@ -245,7 +256,7 @@ DE018C082A509BB500FF0AA3 /* WebView */ = { isa = PBXGroup; children = ( - DE018C0B2A509BC100FF0AA3 /* URL */, + DE7886152A9CCB2B00FE21DD /* Model */, DE0A91662A8E6CA700D1D6F1 /* WebViewManager.swift */, DE018BE92A509B2100FF0AA3 /* WebViewModel.swift */, DE018BE62A509B1E00FF0AA3 /* WebViewController.swift */, @@ -254,14 +265,6 @@ path = WebView; sourceTree = ""; }; - DE018C0B2A509BC100FF0AA3 /* URL */ = { - isa = PBXGroup; - children = ( - DE018BEC2A509B2600FF0AA3 /* URLModel.swift */, - ); - path = URL; - sourceTree = ""; - }; DE018C0C2A509BDF00FF0AA3 /* Resources */ = { isa = PBXGroup; children = ( @@ -299,7 +302,7 @@ isa = PBXGroup; children = ( DE0A919E2A8FA15300D1D6F1 /* View */, - DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */, + DE7885FD2A9C60C300FE21DD /* Controller */, ); path = Toolbar; sourceTree = ""; @@ -307,10 +310,9 @@ DE0A919E2A8FA15300D1D6F1 /* View */ = { isa = PBXGroup; children = ( + DE7886122A9C944900FE21DD /* DisplayURL */, DE0A91A62A8FC66600D1D6F1 /* SideBarLeading.swift */, DE0A91822A8F889000D1D6F1 /* GoHomePageViaToolbar().swift */, - DE3FF3A22A97D2A6009C88EF /* DisplayURLTextfield.swift */, - DE0A918F2A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift */, DE0A918C2A8F88BC00D1D6F1 /* GoBackInToolbar.swift */, DE0A91892A8F88A900D1D6F1 /* GoForwardInToolbar.swift */, DE0A91852A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift */, @@ -401,6 +403,65 @@ path = Shared; sourceTree = ""; }; + DE7885FD2A9C60C300FE21DD /* Controller */ = { + isa = PBXGroup; + children = ( + DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + DE7885FF2A9C717E00FE21DD /* Icon */ = { + isa = PBXGroup; + children = ( + DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */, + ); + path = Icon; + sourceTree = ""; + }; + DE7886082A9C741700FE21DD /* View */ = { + isa = PBXGroup; + children = ( + DE7886002A9C71BE00FE21DD /* IconsViewController.swift */, + DE7886032A9C71CB00FE21DD /* IconsView.swift */, + ); + path = View; + sourceTree = ""; + }; + DE78860A2A9C76F600FE21DD /* ViewModel */ = { + isa = PBXGroup; + children = ( + DE78860B2A9C770300FE21DD /* IconsViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + DE78860E2A9C771A00FE21DD /* Model */ = { + isa = PBXGroup; + children = ( + DE78860F2A9C773300FE21DD /* IconsModel.swift */, + ); + path = Model; + sourceTree = ""; + }; + DE7886122A9C944900FE21DD /* DisplayURL */ = { + isa = PBXGroup; + children = ( + DE3FF3A22A97D2A6009C88EF /* DisplayURLTextfield.swift */, + DE0A918F2A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift */, + ); + path = DisplayURL; + sourceTree = ""; + }; + DE7886152A9CCB2B00FE21DD /* Model */ = { + isa = PBXGroup; + children = ( + DE7886162A9CCB3B00FE21DD /* UserProfile.swift */, + DE018BEC2A509B2600FF0AA3 /* URLModel.swift */, + ); + path = Model; + sourceTree = ""; + }; DE7F9D482A9B7A4E00F8ACAE /* Vertical Item */ = { isa = PBXGroup; children = ( @@ -415,7 +476,6 @@ children = ( DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */, DE874F532A591F1400FC3B77 /* PreferencesView.swift */, - DE874F562A591F2500FC3B77 /* Icon.swift */, DE2AD3282A824EEB00002D51 /* Accessibility.swift */, DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */, ); @@ -481,6 +541,9 @@ DEB862D22A8511D600278FCD /* Scripts */ = { isa = PBXGroup; children = ( + DE78860E2A9C771A00FE21DD /* Model */, + DE78860A2A9C76F600FE21DD /* ViewModel */, + DE7886082A9C741700FE21DD /* View */, DEB862DB2A85347400278FCD /* Scripts.swift */, DE0A917A2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift */, ); @@ -635,9 +698,11 @@ DE4408082A9240300091937A /* BoxFunctionButtonView.swift in Sources */, DE3FF3742A978AB8009C88EF /* WindowMaximizeButton.swift in Sources */, DE3FF3A32A97D2A6009C88EF /* DisplayURLTextfield.swift in Sources */, + DE7886042A9C71CB00FE21DD /* IconsView.swift in Sources */, DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */, DE77BA562A82637900713683 /* StateManager.swift in Sources */, DE1F1A1C2A8B50C500A88DD8 /* BoxBaseContainerViewController.swift in Sources */, + DE78861C2A9CE7D700FE21DD /* IconChanged+WebView.swift in Sources */, DEE0FA962A9A554F00085A65 /* FunctionButtonUI.swift in Sources */, DE018BE72A509B1E00FF0AA3 /* WebViewController.swift in Sources */, DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */, @@ -646,6 +711,7 @@ DE6332E82A9BBEF800DCFAF6 /* NotifConst.swift in Sources */, DEF749322A85657600D987C8 /* NSScreen.swift in Sources */, DE018BF02A509B2F00FF0AA3 /* MenubarViewController.swift in Sources */, + DE7886102A9C773300FE21DD /* IconsModel.swift in Sources */, DE6332E42A9BB8F800DCFAF6 /* QuickSlotButtonCollectionViewController.swift in Sources */, DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */, DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */, @@ -657,7 +723,9 @@ DE0A91832A8F889000D1D6F1 /* GoHomePageViaToolbar().swift in Sources */, DE6332F22A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift in Sources */, DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */, + DE78860C2A9C770300FE21DD /* IconsViewModel.swift in Sources */, DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */, + DE7886172A9CCB3B00FE21DD /* UserProfile.swift in Sources */, DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */, DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */, DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */, @@ -689,7 +757,7 @@ DE24E6382A8FE10400E29F5D /* BoxBaseSplitView.swift in Sources */, DE44081D2A928F760091937A /* Divider.swift in Sources */, DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */, - DE874F572A591F2500FC3B77 /* Icon.swift in Sources */, + DE7886012A9C71BE00FE21DD /* IconsViewController.swift in Sources */, DE1F1A2E2A8BCC9800A88DD8 /* Storage.swift in Sources */, DE0A91782A8F014F00D1D6F1 /* WebView.swift in Sources */, DE3FF36B2A978A57009C88EF /* WindowButtonViewController.swift in Sources */, diff --git a/Box42/Icon/IconChanged+WebView.swift b/Box42/Icon/IconChanged+WebView.swift new file mode 100644 index 0000000..c3c5c7d --- /dev/null +++ b/Box42/Icon/IconChanged+WebView.swift @@ -0,0 +1,27 @@ +// +// IconChangedByWebView.swift +// Box42 +// +// Created by Chanhee Kim on 8/28/23. +// + +import WebKit + +// MARK: - WKWebView의 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)로 Icon을 제어합니다. +extension DisplayURLInToolbar { + func IconChangedByWebView(_ webView: WKWebView) { + if webView === WebViewManager.shared.hostingWebView { + var validate = webView.url?.description.split(separator: "/").map{String($0)} + if validate?.count ?? 0 < 2 { return } + let endpoint = validate?.popLast() + let delimiter = validate?.popLast() + if delimiter != "board" { return } + + icon.menubarStopRunning() + icon.buttonImageChange(endpoint ?? "fox") + icon.menubarStartRunning() + + print("Icon changed", endpoint) + } + } +} diff --git a/Box42/Menubar/MenubarModel.swift b/Box42/Menubar/MenubarModel.swift index 24a9a73..b3a612f 100644 --- a/Box42/Menubar/MenubarModel.swift +++ b/Box42/Menubar/MenubarModel.swift @@ -16,7 +16,8 @@ class StatusBar { var isRunning: Bool var interval: Double var alertCount: Int - + var version: Int + init() { self.statusItem = NSStatusItem() self.frames = [NSImage]() @@ -24,5 +25,6 @@ class StatusBar { self.isRunning = false self.interval = 1.0 self.alertCount = 0 + self.version = 0 } } diff --git a/Box42/Menubar/MenubarViewModel.swift b/Box42/Menubar/MenubarViewModel.swift index 9946f07..80e21ea 100644 --- a/Box42/Menubar/MenubarViewModel.swift +++ b/Box42/Menubar/MenubarViewModel.swift @@ -11,6 +11,7 @@ class StatusBarViewModel { let cpu: CPU let statusBar: StatusBar private var currentAnimationWorkItem: DispatchWorkItem? + private let scheduleQueue = DispatchQueue(label: "animation.scheduleQueue") init () { self.statusBar = StatusBar.shared @@ -23,7 +24,13 @@ class StatusBarViewModel { func changeStatusBarIcon(_ imgName: String) { statusBar.frames.removeAll() - + currentAnimationWorkItem?.cancel() + if statusBar.version == Int.max { + statusBar.version = 0 + } else { + statusBar.version += 1 + } + switch imgName { case "cat": for i in (0...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "cat_page\(i)"))} case "gon": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "gon_\(i)"))} @@ -52,25 +59,34 @@ class StatusBarViewModel { self.animate() } } - - func scheduleAnimation() { - currentAnimationWorkItem?.cancel() - let workItem = DispatchWorkItem { [weak self] in - self?.statusBar.statusItem.button?.image = self?.statusBar.frames[self?.statusBar.cnt ?? 0] - self?.statusBar.cnt = ((self?.statusBar.cnt)! + 1) % (self?.statusBar.frames.count ?? 1) + func scheduleAnimation() { + scheduleQueue.sync { + currentAnimationWorkItem?.cancel() - if self?.statusBar.isRunning ?? false { - self?.scheduleAnimation() + let currentVersion = statusBar.version + + let workItem = DispatchWorkItem { [weak self] in + guard self?.statusBar.version == currentVersion else { return } + + self?.statusBar.statusItem.button?.image = self?.statusBar.frames[self?.statusBar.cnt ?? 0] + + if let cnt = self?.statusBar.cnt, let framesCount = self?.statusBar.frames.count { + self?.statusBar.cnt = (cnt + 1) % framesCount + } + + if self?.statusBar.isRunning ?? false { + self?.scheduleAnimation() + } } + + currentAnimationWorkItem = workItem + DispatchQueue.main.asyncAfter(deadline: .now() + statusBar.interval, execute: workItem) } - - currentAnimationWorkItem = workItem - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + statusBar.interval, execute: workItem) } - + func stopRunning() { - statusBar.isRunning = cpu.StopCPU() + statusBar.isRunning = cpu.stopCPU() currentAnimationWorkItem?.cancel() statusBar.cnt = 0 } diff --git a/Box42/Preferences/Icon.swift b/Box42/Preferences/Icon.swift deleted file mode 100644 index d256436..0000000 --- a/Box42/Preferences/Icon.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// Icon.swift -// Box42 -// -// Created by Chanhee Kim on 7/8/23. -// - -struct iconModel { - var icon: [String] = [ - "Cat", - "gam", - "gon", - "gun", - "lee", - "Box", - "box_oc", - "42" - ] -} diff --git a/Box42/Resources/AppDelegate.swift b/Box42/Resources/AppDelegate.swift index 65fb651..51ad56f 100644 --- a/Box42/Resources/AppDelegate.swift +++ b/Box42/Resources/AppDelegate.swift @@ -23,6 +23,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // storage.storageTimerEvent() _ = ScriptsLogicController.shared + _ = WebViewManager.shared } diff --git a/Box42/Shared/Constants.swift b/Box42/Shared/Constants.swift index e0af4fc..ffc3f1f 100644 --- a/Box42/Shared/Constants.swift +++ b/Box42/Shared/Constants.swift @@ -8,8 +8,8 @@ enum Constants { enum url { static let initialName = "home" -// static let initialPage = "https://42box.kr" - static let initialPage = "https://profile.intra.42.fr/" + static let initialPage = "https://42box.kr" +// static let initialPage = "https://profile.intra.42.fr/" } enum UI { diff --git a/Box42/System/CPU.swift b/Box42/System/CPU.swift index 9f70003..f11c010 100644 --- a/Box42/System/CPU.swift +++ b/Box42/System/CPU.swift @@ -58,7 +58,7 @@ class CPU { return true } - func StopCPU() -> Bool { + func stopCPU() -> Bool { self.cpuTimer?.invalidate() return false } diff --git a/Box42/Toolbar/ToolbarViewController.swift b/Box42/Toolbar/Controller/ToolbarViewController.swift similarity index 100% rename from Box42/Toolbar/ToolbarViewController.swift rename to Box42/Toolbar/Controller/ToolbarViewController.swift diff --git a/Box42/Toolbar/View/DisplayURLInToolbar.swift b/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift similarity index 92% rename from Box42/Toolbar/View/DisplayURLInToolbar.swift rename to Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift index 59ff65b..1ec54a0 100644 --- a/Box42/Toolbar/View/DisplayURLInToolbar.swift +++ b/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift @@ -12,6 +12,7 @@ import SnapKit class DisplayURLInToolbar: NSView { var URLTextfield: DisplayURLTextfield = DisplayURLTextfield() var originalString: String = "" + var icon = MenubarViewController() override init(frame frameRect: NSRect) { super.init(frame: .zero) @@ -87,6 +88,7 @@ extension DisplayURLInToolbar: WKNavigationDelegate { if showURLString.count > 1 { URLTextfield.stringValue = (showURLString[1] ?? "") } + print(originalString) } } } @@ -95,5 +97,10 @@ extension DisplayURLInToolbar { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("Navigation finished") updateURL() + if originalString == "https://42box.kr/auth" || originalString == "https://42box.kr/" { + WebViewManager.shared.getCookie() + } + + IconChangedByWebView(webView) } } diff --git a/Box42/Toolbar/View/DisplayURLTextfield.swift b/Box42/Toolbar/View/DisplayURL/DisplayURLTextfield.swift similarity index 100% rename from Box42/Toolbar/View/DisplayURLTextfield.swift rename to Box42/Toolbar/View/DisplayURL/DisplayURLTextfield.swift diff --git a/Box42/WebView/Model/URLModel.swift b/Box42/WebView/Model/URLModel.swift new file mode 100644 index 0000000..4dee7c6 --- /dev/null +++ b/Box42/WebView/Model/URLModel.swift @@ -0,0 +1,42 @@ +// +// URLModel.swift +// Box42 +// +// Created by Chan on 2023/03/16. +// + +import Foundation + +typealias nameUrl = (name: String, url: String) + +struct URLModel { + var id: UUID + var name: String + var url: String + + init(name: String, url: String) { + self.id = UUID() + self.name = name + self.url = url + } +} + +struct URLModels { + var info: [URLModel] + + // Network logic api call 날려서 받아올 것. + let URLstring: [nameUrl] = [ + ("home", "https://42box.kr/"), + ("23Coaltheme", "https://42box.github.io/front-end/"), + ("Box 42", "https://42box.github.io/front-end/#/box"), + ("Intra 42", "https://intra.42.fr"), + ("Jiphyeonjeon", "https://42library.kr"), + ("42STAT", "https://stat.42seoul.kr/home"), + ("24Hane", "https://24hoursarenotenough.42seoul.kr"), + ("80kCoding", "https://80000coding.oopy.io"), + ("where42", "https://www.where42.kr"), + ("cabi", "https://cabi.42seoul.io/"), + ("42gg", "https://42gg.kr/"), + ("textart", "https://textart.sh/"), + ] +} diff --git a/Box42/WebView/Model/UserProfile.swift b/Box42/WebView/Model/UserProfile.swift new file mode 100644 index 0000000..582cf44 --- /dev/null +++ b/Box42/WebView/Model/UserProfile.swift @@ -0,0 +1,22 @@ +// +// UserProfile.swift +// Box42 +// +// Created by Chanhee Kim on 8/28/23. +// + +struct UserProfile: Codable { + let theme: Int + let uuid: String + let icon: String + let nickname: String + let profileImageUrl: String + let urlList: [URLItem] + let profileImagePath: String + let statusMessage: String +} + +struct URLItem: Codable { + let name: String + let url: String +} diff --git a/Box42/WebView/URL/URLModel.swift b/Box42/WebView/URL/URLModel.swift deleted file mode 100644 index a7a0ff6..0000000 --- a/Box42/WebView/URL/URLModel.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// URLModel.swift -// Box42 -// -// Created by Chan on 2023/03/16. -// - -import Foundation - -typealias nameUrl = (name: String, url: String) - -struct URLModel { - var id: UUID - var name: String - var url: String - - init(name: String, url: String) { - self.id = UUID() - self.name = name - self.url = url - } -} - -struct UserDataA: Codable { - var uuid: String - var nickname: String - var theme: Int - var icon: String - var urlList: [_URLModel] - var profileImage: String -} - -struct _URLModel: Codable { - var name: String - var url: String -} - -struct URLModels { - var info: [URLModel] - let strData = """ - { - \"uuid\":\"8a8b9d71-3c10-4cbc-8b3a-ae1b5c215f40\", - \"nickname\":\"sechung\", - \"theme\":0, - \"icon\":\"fox\", - \"urlList\":[ - {\"name\":\"home\",\"url\":\"https://42box.kr/\"}, - {\"name\":\"23Coaltheme\",\"url\":\"https://42box.github.io/front-end/\"}, - {\"name\":\"loopback\",\"url\":\"http://127.0.0.1:3000/\"}, - {\"name\":\"Box42\",\"url\":\"https://42box.github.io/front-end/#/box\"}, - {\"name\":\"Intra 42\",\"url\":\"https://intra.42.fr\"}, - {\"name\":\"Jiphyeonjeon\",\"url\":\"https://42library.kr\"}, - {\"name\":\"42STAT\",\"url\":\"https://stat.42seoul.kr/home\"}, - {\"name\":\"24Hane\",\"url\":\"https://24hoursarenotenough.42seoul.kr\"}, - {\"name\":\"80kCoding\",\"url\":\"https://80000coding.oopy.io\"}, - {\"name\":\"where42\",\"url\":\"https://www.where42.kr\"}, - {\"name\":\"cabi\",\"url\":\"https://cabi.42seoul.io/\"}, - {\"name\":\"42gg\",\"url\":\"https://42gg.kr/\"} - ], - \"profileImage\":\"dummy-images.png\" - } - """ - // Network logic api call 날려서 받아올 것. - let URLstring: [nameUrl] = [ - ("home", "https://42box.kr/"), - ("23Coaltheme", "https://42box.github.io/front-end/"), - ("Box 42", "https://42box.github.io/front-end/#/box"), - ("Intra 42", "https://intra.42.fr"), - ("Jiphyeonjeon", "https://42library.kr"), - ("42STAT", "https://stat.42seoul.kr/home"), - ("24Hane", "https://24hoursarenotenough.42seoul.kr"), - ("80kCoding", "https://80000coding.oopy.io"), - ("where42", "https://www.where42.kr"), - ("cabi", "https://cabi.42seoul.io/"), - ("42gg", "https://42gg.kr/"), - ("textart", "https://textart.sh/"), - ] - - -// let a = URLModel(name: "name", url: "url") -// var m = URLModels(info: [a]) -// var strData = m.strData -// var dicData : Dictionary = [String: String]() -// do { -// dicData = try JSONSerialization.jsonObject(with: Data(strData.utf8), options: []) as! Dictionary -// } catch { -// print(error.localizedDescription) -// } -// print(dicData["home"]) -// print(dicData) -// -// -// let jsonData = Data(strData.utf8) -// do { -// let userData = try JSONDecoder().decode(UserDataA.self, from: jsonData) -// for urlModel in userData.urlList { -// print(urlModel.name, urlModel.url) -// } -// -// -// if let homeURLModel = userData.urlList.first(where: { $0.name == "home" }) { -// print(homeURLModel.url) -// } -// } catch { -// print(error.localizedDescription) -// } -} diff --git a/Box42/WebView/WebViewManager.swift b/Box42/WebView/WebViewManager.swift index bdf0fe1..c1d1dd2 100644 --- a/Box42/WebView/WebViewManager.swift +++ b/Box42/WebView/WebViewManager.swift @@ -9,15 +9,116 @@ import WebKit typealias WebViewMapping = [String : WKWebView] -class WebViewManager { +class WebViewManager: NSObject { static let shared = WebViewManager() - + + var icon = MenubarViewController() + + private var _getCookieWebKit: WKWebView? + var hostingname: String? - var hostingWebView: WKWebView? - + var hostingWebView: WKWebView? { + didSet { + hostingWebView?.navigationDelegate = self + print("didSet") + } + } + var list: WebViewMapping! - private init() { + private override init() { + super.init() + list = [:] + + let webConfiguration = WKWebViewConfiguration() + _getCookieWebKit = WKWebView(frame: .zero, configuration: webConfiguration) + _getCookieWebKit?.navigationDelegate = self + _getCookieWebKit?.isHidden = true + } + + func getCookie() { + if let url = URL(string: "https://api.42box.site") { + let request = URLRequest(url: url) + _getCookieWebKit?.load(request) + } + } +} + +extension WebViewManager: WKNavigationDelegate { + // WKNavigationDelegate methods + func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { + print("Did start navigation") + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + if webView === _getCookieWebKit { + 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(userProfile) + + DispatchQueue.main.sync { + self.icon.menubarStopRunning() + self.icon.buttonImageChange(userProfile.icon) + self.icon.menubarStartRunning() + } + + } catch let jsonError { + print("JSON Parsing Error: \(jsonError)") + } + } + task.resume() + } + } + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + print("Did fail navigation with error: \(error.localizedDescription)") + } + + func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) { + print("Did receive server redirect") + } + + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + if let url = navigationAction.request.url, url.absoluteString.contains("https://api.42box.site/user-service/users/me") { + // Handle your own request here and get the response + print(url) + } + decisionHandler(.allow) + } +} + +extension WebViewManager: WKScriptMessageHandler { + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + if message.name == "didFinishLoading", let messageBody = message.body as? String { + print("Received message from JS: \(messageBody)") + if let url = URL(string: "https://naver.com") { + let request = URLRequest(url: url) + hostingWebView?.load(request) + } + } } }