Commit 066905ce by Dmitriy Stepanets

Working on widget UI

parent 8e8117b3
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<key>OneWeatherWidgetExtension.xcscheme_^#shared#^_</key> <key>OneWeatherWidgetExtension.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>58</integer> <integer>55</integer>
</dict> </dict>
<key>PG (Playground) 1.xcscheme</key> <key>PG (Playground) 1.xcscheme</key>
<dict> <dict>
......
...@@ -7,61 +7,109 @@ ...@@ -7,61 +7,109 @@
import WidgetKit import WidgetKit
import SwiftUI import SwiftUI
import OneWeatherCore
private let cupertinoLocation = Location(deviceLocation: false,
countryName: "USA",
region: "US",
cityName: "Cupertino",
timeZone: TimeZone.current,
today: .init(lastTimeUpdated: Date(),
date: Date(),
timeZone: TimeZone.current,
weekDay: .monday,
type: .partlyCloudy,
isDay: true,
minTemp: .init(value: 89, unit: .fahrenheit),
maxTemp: .init(value: 97, unit: .fahrenheit),
temp: .init(value: 96, unit: .fahrenheit)),
daily: [],
hourly: [],
dayTimeForecast: [])
struct WeatherEntry: TimelineEntry {
let date = Date()
let currentWeather: CurrentWeather
}
struct Provider: TimelineProvider { struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry { typealias Entry = WeatherEntry
SimpleEntry(date: Date())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { func placeholder(in context: Context) -> WeatherEntry {
let entry = SimpleEntry(date: Date()) return WeatherEntry(currentWeather: cupertinoLocation.today!)
completion(entry)
} }
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
var entries: [SimpleEntry] = [] guard let cupertinoWeather = cupertinoLocation.today else { return }
let entry = WeatherEntry(currentWeather: cupertinoWeather)
// Generate a timeline consisting of five entries an hour apart, starting from the current date. completion(entry)
let currentDate = Date()
for hourOffset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
let entry = SimpleEntry(date: entryDate)
entries.append(entry)
} }
let timeline = Timeline(entries: entries, policy: .atEnd) func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> Void) {
guard let cupertinoWeather = cupertinoLocation.today else { return }
let entry = WeatherEntry(currentWeather: cupertinoWeather)
let timeline = Timeline(entries: [entry], policy: .never)
completion(timeline) completion(timeline)
} }
} }
struct SimpleEntry: TimelineEntry { struct PlaceholderView: View {
let date: Date var body: some View {
Text("Widget Placeholder View")
}
} }
struct OneWeatherWidgetEntryView : View { struct WidgetEntryView: View {
var entry: Provider.Entry let entry: Provider.Entry
var body: some View { var body: some View {
Text(entry.date, style: .time) GeometryReader { geometry in
VStack {
HStack {
Text("New York")
.font(.system(size: 12))
.padding(.init(top: 12, leading: 10, bottom: 0, trailing: 0))
Spacer()
}
HStack {
VStack(alignment: .leading, spacing: 0){
Text("96°")
.font(.system(size: 32))
.padding(.leading, 10)
.padding(.top, 10)
Text("Partly Cloudy Cloudy")
.font(.system(size: 12))
.padding(.top, 2)
.padding(.leading, 10)
.frame(width: geometry.size.width * 0.6, alignment: .leading)
Text("H 97° L 89°")
.font(.system(size: 12))
.padding(.leading, 10)
.padding(.top, 20)
}
.background(Color.yellow)
}
}
}
} }
} }
@main @main
struct OneWeatherWidget: Widget { struct OneWeatherWidget: Widget {
let kind: String = "OneWeatherWidget" private let kind = "OneWeater_Widget"
var body: some WidgetConfiguration { var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in StaticConfiguration(kind: kind, provider: Provider()) { entry in
OneWeatherWidgetEntryView(entry: entry) WidgetEntryView(entry: entry)
} }
.configurationDisplayName("My Widget") .supportedFamilies([.systemSmall])
.description("This is an example widget.")
} }
} }
struct OneWeatherWidget_Previews: PreviewProvider { struct OneWeatherWidget_Preview: PreviewProvider {
static var previews: some View { static var previews: some View {
OneWeatherWidgetEntryView(entry: SimpleEntry(date: Date())) WidgetEntryView(entry: WeatherEntry(currentWeather: cupertinoLocation.today!))
.previewContext(WidgetPreviewContext(family: .systemSmall)) .previewContext(WidgetPreviewContext(family: .systemSmall))
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment