diff --git a/TellTimeWidget/TellTimeWidget.swift b/TellTimeWidget/TellTimeWidget.swift index 9d15737..472ecc2 100644 --- a/TellTimeWidget/TellTimeWidget.swift +++ b/TellTimeWidget/TellTimeWidget.swift @@ -91,7 +91,9 @@ struct TellTimeWidgetView: View { } private var smallView: some View { - Text(time).padding() + VStack { + Text(time).padding() + } } @ViewBuilder @@ -99,13 +101,25 @@ struct TellTimeWidgetView: View { if design == .lewis { HStack { clock - digital - }.padding() + VStack { + digital + } + } + .padding() + .widgetURL(url()) } else { HStack { clock - Text(time) - }.padding() + VStack { + Text(time) + Spacer() + Link(destination: url(speak: true)) { + speakButton + } + } + } + .padding() + .widgetURL(url()) } } @@ -113,9 +127,18 @@ struct TellTimeWidgetView: View { VStack { clock Spacer() - Text(time) + HStack { + Spacer() + Text(time) + Spacer() + Link(destination: url(speak: true)) { + speakButton + } + } Spacer() - }.padding() + } + .padding() + .widgetURL(url()) } private var formattedTime: String { @@ -165,6 +188,27 @@ struct TellTimeWidgetView: View { } } } + + private var speakButton: some View { + Image(systemName: "speaker.2") + .foregroundColor(.white) + .padding() + .cornerRadius(8) + .background(Color.red.cornerRadius(8)) + } + + private func url(speak: Bool = false) -> URL { + var urlComponents = URLComponents() + urlComponents.host = "renaud.jenny.telltime" + urlComponents.queryItems = [ + URLQueryItem(name: "clockStyle", value: "\(design.clockStyle.id)"), + URLQueryItem(name: "speak", value: "\(speak)") + ] + guard let url = urlComponents.url else { + fatalError("Cannot build the URL from the Widget") + } + return url + } } @main @@ -184,6 +228,19 @@ struct TellTimeWidget: Widget { } } +extension Design { + var clockStyle: ClockStyle { + switch self { + case .unknown: return .classic + case .classic: return .classic + case .artNouveau: return .artNouveau + case .drawing: return .drawing + case .steampunk: return .steampunk + case .lewis: return .classic + } + } +} + struct TellTimeWidget_Previews: PreviewProvider { static var previews: some View { Group { diff --git a/telltime/App/TellTimeUKApp.swift b/telltime/App/TellTimeUKApp.swift index 66f952e..ad2f09a 100644 --- a/telltime/App/TellTimeUKApp.swift +++ b/telltime/App/TellTimeUKApp.swift @@ -1,5 +1,6 @@ import SwiftUI import SwiftTTSCombine +import SwiftClockUI @main struct TellTimeUKApp: SwiftUI.App { @@ -22,7 +23,24 @@ struct TellTimeUKApp: SwiftUI.App { var body: some Scene { WindowGroup { - TellTimeView().environmentObject(store) + TellTimeView() + .environmentObject(store) + .onOpenURL(perform: { url in + store.send(.changeDate(Date())) + guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { + return + } + guard + let clockStyleValue = urlComponents.queryItems?.first(where: { $0.name == "clockStyle" })?.value, + let clockStyle = ClockStyle.allCases.first(where: { String($0.id) == clockStyleValue }) + else { + return + } + store.send(.configuration(.changeClockStyle(clockStyle))) + if urlComponents.queryItems?.first(where: { $0.name == "speak" })?.value == "true" { + store.send(.tts(.tellTime(Date()))) + } + }) } } }