Commit 066905ce by Dmitriy Stepanets

Working on widget UI

parent 8e8117b3
......@@ -17,7 +17,7 @@
<key>OneWeatherWidgetExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>58</integer>
<integer>55</integer>
</dict>
<key>PG (Playground) 1.xcscheme</key>
<dict>
......
......@@ -7,61 +7,109 @@
import WidgetKit
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 {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date())
typealias Entry = WeatherEntry
func placeholder(in context: Context) -> WeatherEntry {
return WeatherEntry(currentWeather: cupertinoLocation.today!)
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
guard let cupertinoWeather = cupertinoLocation.today else { return }
let entry = WeatherEntry(currentWeather: cupertinoWeather)
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
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)
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
struct PlaceholderView: View {
var body: some View {
Text("Widget Placeholder View")
}
}
struct OneWeatherWidgetEntryView : View {
var entry: Provider.Entry
struct WidgetEntryView: View {
let entry: Provider.Entry
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
struct OneWeatherWidget: Widget {
let kind: String = "OneWeatherWidget"
private let kind = "OneWeater_Widget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
OneWeatherWidgetEntryView(entry: entry)
WidgetEntryView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
.supportedFamilies([.systemSmall])
}
}
struct OneWeatherWidget_Previews: PreviewProvider {
struct OneWeatherWidget_Preview: PreviewProvider {
static var previews: some View {
OneWeatherWidgetEntryView(entry: SimpleEntry(date: Date()))
WidgetEntryView(entry: WeatherEntry(currentWeather: cupertinoLocation.today!))
.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