# MystBin ! - widget.swift struct Provider: TimelineProvider { func placeholder(in context: Context) -> SpeciesEntry { SpeciesEntry(date: Date(), species: Species.sample) } func getSnapshot(in context: Context, completion: @escaping (SpeciesEntry) -> ()) { let entry = SpeciesEntry(date: Date(), species: Species.sample) completion(entry) } @MainActor func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { guard let container = try? ModelContainer(for: Species.self, Family.self) else { let entry = SpeciesEntry(date: Date(), species: nil) let timeline = Timeline(entries: [entry], policy: .after(Date().addingTimeInterval(60 * 5))) completion(timeline) return } let descriptor = FetchDescriptor() let speciesList = (try? container.mainContext.fetch(descriptor)) ?? [] let randomSpecies = speciesList.randomElement() let entry = SpeciesEntry(date: Date(), species: randomSpecies) let timeline = Timeline(entries: [entry], policy: .after(Date().addingTimeInterval(60 * 5))) completion(timeline) } } struct SpeciesEntry: TimelineEntry { var date: Date let species: Species? } struct Okla_WidgetsEntryView : View { var entry: Provider.Entry var body: some View { HStack(alignment: .top) { if let species = entry.species { Image(species.imageName) .resizable() .aspectRatio(contentMode: .fit) .clipShape(RoundedRectangle(cornerRadius: 8)) VStack(alignment: .leading) { Text(species.scientificName) .bold() Text("\"\(species.commonName)\"") .italic() .opacity(0.6) } } else { Text("Unable to get species information.") } } } } struct Okla_Widgets: Widget { let kind: String = "Random_Species_Widget" var body: some WidgetConfiguration { let provider = Provider() return StaticConfiguration(kind: kind, provider: provider) { entry in Okla_WidgetsEntryView(entry: entry) .containerBackground(.fill.tertiary, for: .widget) .modelContainer(for: [Species.self, Family.self]) } .configurationDisplayName("Random Species") .description("Show a random Occlupanid species.") .supportedFamilies([.systemSmall, .systemMedium]) } } #Preview(as: .systemMedium) { Okla_Widgets() } timeline: { SpeciesEntry(date: .now, species: Species.sample) }