aboutsummaryrefslogtreecommitdiff
path: root/HoloBar/HoloBarApp.swift
blob: 3fadf0c041322d40f4163871b702c4303291a710 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import SwiftUI

#Preview { ContentView().environmentObject(CharacterFetcher()) }

@main
struct HoloBarApp: App {
    @StateObject private var fetcher = CharacterFetcher()
    @State private var showAvatars = false

    var body: some Scene {
        Window("HoloBar", id: "main") {
            ContentView().environmentObject(fetcher)
        }

        MenuBarExtra {
            VStack {
                if fetcher.characters.isEmpty {
                    Text("Loading …")
                } else {
                    ForEach(fetcher.characters) { character in
                        Button(action: {
                            NSWorkspace.shared.open(character.profileURL)
                        }) {
                            HStack {
                                if showAvatars {
                                    AsyncImage(url: character.avatarURL) { phase in
                                        if let image = phase.image {
                                            image
                                                .resizable()
                                                .scaledToFill()
                                        } else if phase.error != nil {
                                            Image(systemName: "person.crop.circle.badge.exclamationmark")
                                                .resizable()
                                                .scaledToFit()
                                                .foregroundStyle(.gray)
                                        } else {
                                            Image(systemName: "person.crop.circle")
                                                .resizable()
                                                .scaledToFit()
                                                .foregroundStyle(.gray)
                                        }
                                    }
                                }

                                Text(character.name)
                            }
                        }
                    }
                }

                Divider()

                #if DEBUG
                    Button("Simulate Day Change") {
                        NotificationCenter.default.post(name: .NSCalendarDayChanged, object: nil)
                    }
                #endif

                Button("Show UI") {
                    for window in NSApp.windows {
                        if window.identifier?.rawValue == "main" {
                            window.makeKeyAndOrderFront(nil)

                            return
                        }
                    }
                }

                Button("\(showAvatars ? "Hide" : "Show") Avatars") {
                    showAvatars.toggle()
                }

                Button("Refresh", action: fetcher.refreshCharactersForToday)
                Button("Quit", action: { NSApplication.shared.terminate(nil) })
            }
            .onReceive(NotificationCenter.default.publisher(for: .NSCalendarDayChanged)) { _ in
                fetcher.refreshCharactersForToday()
            }
        } label: {
            Text("HL")
        }
    }
}