Skip to content

Instantly share code, notes, and snippets.

@sturdysturge
Created July 19, 2020 21:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sturdysturge/356cd911d924396386b0d269aeef7dca to your computer and use it in GitHub Desktop.
Save sturdysturge/356cd911d924396386b0d269aeef7dca to your computer and use it in GitHub Desktop.
RevDoc PreviewContext 3
import WidgetKit
import SwiftUI
extension Date {
var timeString: String {
let hour = Calendar.current.component(.hour, from: self)
let minutes = Calendar.current.component(.minute, from: self)
return "\(hour):\(minutes < 10 ? "0\(minutes)" : "\(minutes)")"
}
}
struct TextProvider: TimelineProvider {
public func snapshot(with context: Context, completion: @escaping (DataEntry) -> ()) {}
public func timeline(with context: Context, completion: @escaping (Timeline<Entry>) -> ()) {}
}
struct DataEntry: TimelineEntry {
public let date = Date()
public let text : String
}
struct DataWidgetEntryView : View {
@Environment(\.widgetFamily) var family
static let smallEntry = TextProvider.Entry(text: "Small size")
static let mediumEntry = TextProvider.Entry(text: "Medium size")
static let largeEntry = TextProvider.Entry(text: "Large size")
static let defaultEntry = TextProvider.Entry(text: "Default")
var backgroundColor: Color {
switch family {
case .systemSmall: return .red
case .systemMedium: return .green
case .systemLarge: return .blue
default: return .orange
}
}
var entry: DataEntry {
switch family {
case .systemSmall: return Self.smallEntry
case .systemMedium: return Self.mediumEntry
case .systemLarge: return Self.largeEntry
default: return Self.defaultEntry
}
}
var body: some View {
WidgetTextView(entry: entry)
.background(backgroundColor)
}
}
struct WidgetTextView: View {
let entry: DataEntry
var body: some View {
Text("\(entry.date.timeString)\n\(entry.text)")
.font(.largeTitle)
.fontWeight(.bold)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.multilineTextAlignment(.center)
}
}
struct DataWidget: Widget {
public var body: some WidgetConfiguration {
StaticConfiguration(kind: "DataWidget", provider: TextProvider(), placeholder: Text("Placeholder View")) { entry in DataWidgetEntryView()
}
.configurationDisplayName("Data Widget")
.description("This is a widget")
}
}
@main
struct MyWidgetBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
DataWidget()
}
}
struct DataWidget_Previews: PreviewProvider {
static var previews: some View {
DataWidgetEntryView()
.previewContext(WidgetPreviewContext(family: .systemSmall))
DataWidgetEntryView()
.previewContext(WidgetPreviewContext(family: .systemMedium))
DataWidgetEntryView()
.previewContext(WidgetPreviewContext(family: .systemLarge))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment