1 // Copyright 2022-present 650 Industries. All rights reserved.
2 
3 import ExpoModulesCore
4 import SDWebImage
5 import SDWebImageWebPCoder
6 import SDWebImageAVIFCoder
7 import SDWebImageSVGCoder
8 
9 public final class ImageModule: Module {
10   lazy var prefetcher = SDWebImagePrefetcher.shared
11 
12   public func definition() -> ModuleDefinition {
13     Name("ExpoImage")
14 
15     OnCreate {
16       ImageModule.registerCoders()
17     }
18 
19     View(ImageView.self) {
20       Events(
21         "onLoadStart",
22         "onProgress",
23         "onError",
24         "onLoad"
25       )
26 
27       Prop("source") { (view, sourceSet: Either<ImageSource, [ImageSource]>) in
28         if let source: ImageSource = sourceSet.get() {
29           view.sources = [source]
30         }
31         if let sources: [ImageSource] = sourceSet.get() {
32           view.sources = sources
33         }
34       }
35 
36       Prop("resizeMode") { (view, resizeMode: ImageResizeMode) in
37         view.resizeMode = resizeMode
38       }
39 
40       Prop("transition") { (view, transition: ImageTransition?) in
41         view.transition = transition
42       }
43 
44       Prop("blurRadius") { (view, blurRadius: Double?) in
45         view.blurRadius = blurRadius ?? .zero
46       }
47 
48       Prop("tintColor") { (view, tintColor: UIColor?) in
49         view.imageTintColor = tintColor ?? .clear
50       }
51 
52       OnViewDidUpdateProps { view in
53         view.reload()
54       }
55     }
56 
57     Function("clearMemoryCache") {
58       SDImageCache.shared.clearMemory()
59     }
60 
61     Function("clearDiskCache") {
62       SDImageCache.shared.clearDisk()
63     }
64   }
65 
66   static func registerCoders() {
67     SDImageCodersManager.shared.addCoder(SDImageWebPCoder.shared)
68     SDImageCodersManager.shared.addCoder(SDImageAVIFCoder.shared)
69     SDImageCodersManager.shared.addCoder(SDImageSVGCoder.shared)
70     SDImageCodersManager.shared.addCoder(SDImageHEICCoder.shared)
71   }
72 }
73