diff --git a/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json b/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json b/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/CoinWidgetExtension/Assets.xcassets/Contents.json b/CoinWidgetExtension/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/CoinWidgetExtension/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json b/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/CoinWidgetExtension/CoinWidgetExtension.entitlements b/CoinWidgetExtension/CoinWidgetExtension.entitlements
new file mode 100644
index 0000000..0b4100d
--- /dev/null
+++ b/CoinWidgetExtension/CoinWidgetExtension.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.application-groups
+
+ group.com.adesso.SampleAppSwiftUI
+
+
+
diff --git a/CoinWidgetExtension/CoinWidgetExtension.swift b/CoinWidgetExtension/CoinWidgetExtension.swift
new file mode 100644
index 0000000..c718b63
--- /dev/null
+++ b/CoinWidgetExtension/CoinWidgetExtension.swift
@@ -0,0 +1,106 @@
+//
+// CoinWidgetExtension.swift
+// CoinWidgetExtension
+//
+// Created by Sahin, Meryem on 11.08.2023.
+//
+
+import WidgetKit
+import SwiftUI
+
+struct Provider: TimelineProvider {
+ @AppStorage("favoriteCoins", store: UserDefaults(suiteName: "group.com.adesso.SampleAppSwiftUI")) var favoriteCoins: [CoinData] = []
+
+ func placeholder(in context: Context) -> SimpleEntry {
+ SimpleEntry(favoriteCoins: favoriteCoins)
+ }
+
+ func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
+ let entry = SimpleEntry(favoriteCoins: favoriteCoins)
+ completion(entry)
+ }
+
+ func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) {
+ let timeline = Timeline(entries: [SimpleEntry(favoriteCoins: favoriteCoins)], policy: .atEnd)
+ completion(timeline)
+ }
+}
+
+struct SimpleEntry: TimelineEntry {
+ let date = Date()
+ var favoriteCoins: [CoinData]
+}
+
+struct CoinWidgetExtensionEntryView: View {
+ @Environment(\.widgetFamily) var widgetFamily
+ var entry: Provider.Entry
+
+ @ViewBuilder
+ var emptyView: some View {
+ Text("There are no favorite coins")
+ }
+
+ @ViewBuilder
+ var coinsView: some View {
+ VStack {
+ ForEach(entry.favoriteCoins) { val in
+ HStack {
+ Text(val.coinInfo?.title ?? "")
+ }
+ }
+ }
+ }
+
+ var body: some View {
+ switch widgetFamily {
+ case .systemSmall:
+ entry.favoriteCoins.isEmpty ? AnyView(emptyView) : AnyView(coinsView)
+ case .systemMedium:
+ entry.favoriteCoins.isEmpty ? AnyView(emptyView) : AnyView(coinsView)
+ default:
+ Text(entry.date, style: .time)
+ }
+ }
+}
+
+struct CoinWidgetExtension: Widget {
+ let kind: String = "CoinWidgetExtension"
+
+ var body: some WidgetConfiguration {
+ StaticConfiguration(kind: kind, provider: Provider()) { entry in
+ CoinWidgetExtensionEntryView(entry: entry)
+ }
+ .configurationDisplayName("My Widget")
+ .description("This is an example widget.")
+ .supportedFamilies([.systemSmall, .systemMedium])
+ }
+}
+
+struct CoinWidgetExtension_Previews: PreviewProvider {
+ static var previews: some View {
+
+ CoinWidgetExtensionEntryView(entry: SimpleEntry(favoriteCoins: [])).previewContext(WidgetPreviewContext(family: .systemSmall))
+ CoinWidgetExtensionEntryView(entry: SimpleEntry(favoriteCoins: [])).previewContext(WidgetPreviewContext(family: .systemMedium))
+
+ }
+}
+
+extension Array: RawRepresentable where Element: Codable {
+public init?(rawValue: String) {
+ guard let data = rawValue.data(using: .utf8),
+ let result = try? JSONDecoder().decode([Element].self, from: data)
+ else {
+ return nil
+ }
+ self = result
+}
+
+public var rawValue: String {
+ guard let data = try? JSONEncoder().encode(self),
+ let result = String(data: data, encoding: .utf8)
+ else {
+ return "[]"
+ }
+ return result
+ }
+}
diff --git a/CoinWidgetExtension/CoinWidgetExtensionBundle.swift b/CoinWidgetExtension/CoinWidgetExtensionBundle.swift
new file mode 100644
index 0000000..be00867
--- /dev/null
+++ b/CoinWidgetExtension/CoinWidgetExtensionBundle.swift
@@ -0,0 +1,16 @@
+//
+// CoinWidgetExtensionBundle.swift
+// CoinWidgetExtension
+//
+// Created by Sahin, Meryem on 11.08.2023.
+//
+
+import WidgetKit
+import SwiftUI
+
+@main
+struct CoinWidgetExtensionBundle: WidgetBundle {
+ var body: some Widget {
+ CoinWidgetExtension()
+ }
+}
diff --git a/CoinWidgetExtension/Info.plist b/CoinWidgetExtension/Info.plist
new file mode 100644
index 0000000..3da3ca4
--- /dev/null
+++ b/CoinWidgetExtension/Info.plist
@@ -0,0 +1,21 @@
+
+
+
+
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.widgetkit-extension
+
+
+
diff --git a/SampleAppSwiftUI/SampleAppSwiftUI.entitlements b/SampleAppSwiftUI/SampleAppSwiftUI.entitlements
new file mode 100644
index 0000000..0b4100d
--- /dev/null
+++ b/SampleAppSwiftUI/SampleAppSwiftUI.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.application-groups
+
+ group.com.adesso.SampleAppSwiftUI
+
+
+
diff --git a/SampleAppSwiftUI/Utility/Managers/StorageManager.swift b/SampleAppSwiftUI/Utility/Managers/StorageManager.swift
index 06ca8d0..64f4127 100644
--- a/SampleAppSwiftUI/Utility/Managers/StorageManager.swift
+++ b/SampleAppSwiftUI/Utility/Managers/StorageManager.swift
@@ -6,6 +6,7 @@
//
import SwiftUI
+import WidgetKit
final class StorageManager {
diff --git a/project.yml b/project.yml
index 9c326de..b7524cb 100644
--- a/project.yml
+++ b/project.yml
@@ -44,6 +44,7 @@ targets:
- package: Pulse
product: Pulse
product: PulseUI
+ - target: CoinWidgetExtension
configFiles:
Development: SampleAppSwiftUI/Configs/Development.xcconfig
Production: SampleAppSwiftUI/Configs/Production.xcconfig
@@ -81,4 +82,17 @@ targets:
platform: iOS
sources:
- path: SampleAppSwiftUIUITests
+ CoinWidgetExtension:
+ type: app-extension
+ platform: iOS
+ sources:
+ - path: CoinWidgetExtension
+ settings:
+ PRODUCT_BUNDLE_IDENTIFIER: com.adesso.SampleAppSwiftUI.development.CoinWidgetExtension
+ INFOPLIST_FILE: CoinWidgetExtension/Info.plist
+ dependencies:
+ - framework: SwiftUI.framework
+ implicit: true
+ - framework: WidgetKit.framework
+ implicit: true
parallelizeBuild: true