@lodev09/react-native-true-sheet 2.0.5 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +36 -8
  2. package/RNTrueSheet.podspec +20 -0
  3. package/android/build.gradle +26 -14
  4. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +108 -0
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +21 -0
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +46 -0
  7. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +21 -0
  8. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +47 -0
  9. package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +21 -0
  10. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +165 -0
  11. package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +36 -4
  12. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +257 -299
  13. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +855 -0
  14. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +104 -82
  15. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +26 -0
  16. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +20 -0
  17. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +26 -0
  18. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +26 -0
  19. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +26 -0
  20. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +26 -0
  21. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +20 -0
  22. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +32 -0
  23. package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +27 -0
  24. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +20 -0
  25. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +26 -0
  26. package/android/src/main/java/com/lodev09/truesheet/{core/Utils.kt → utils/ScreenUtils.kt} +47 -17
  27. package/android/src/main/res/values/styles.xml +8 -0
  28. package/ios/TrueSheetComponentDescriptor.h +24 -0
  29. package/ios/TrueSheetContainerView.h +47 -0
  30. package/ios/TrueSheetContainerView.mm +117 -0
  31. package/ios/TrueSheetContentView.h +37 -0
  32. package/ios/TrueSheetContentView.mm +114 -0
  33. package/ios/TrueSheetFooterView.h +27 -0
  34. package/ios/TrueSheetFooterView.mm +101 -0
  35. package/ios/TrueSheetModule.h +44 -0
  36. package/ios/TrueSheetModule.mm +133 -0
  37. package/ios/TrueSheetView.h +53 -0
  38. package/ios/TrueSheetView.mm +433 -0
  39. package/ios/TrueSheetViewController.h +53 -0
  40. package/ios/TrueSheetViewController.mm +649 -0
  41. package/ios/events/OnDetentChangeEvent.h +28 -0
  42. package/ios/events/OnDetentChangeEvent.mm +30 -0
  43. package/ios/events/OnDidDismissEvent.h +26 -0
  44. package/ios/events/OnDidDismissEvent.mm +25 -0
  45. package/ios/events/OnDidPresentEvent.h +28 -0
  46. package/ios/events/OnDidPresentEvent.mm +30 -0
  47. package/ios/events/OnDragBeginEvent.h +28 -0
  48. package/ios/events/OnDragBeginEvent.mm +30 -0
  49. package/ios/events/OnDragChangeEvent.h +28 -0
  50. package/ios/events/OnDragChangeEvent.mm +30 -0
  51. package/ios/events/OnDragEndEvent.h +28 -0
  52. package/ios/events/OnDragEndEvent.mm +30 -0
  53. package/ios/events/OnMountEvent.h +26 -0
  54. package/ios/events/OnMountEvent.mm +25 -0
  55. package/ios/events/OnPositionChangeEvent.h +29 -0
  56. package/ios/events/OnPositionChangeEvent.mm +32 -0
  57. package/ios/events/OnSizeChangeEvent.h +28 -0
  58. package/ios/events/OnSizeChangeEvent.mm +30 -0
  59. package/ios/events/OnWillDismissEvent.h +26 -0
  60. package/ios/events/OnWillDismissEvent.mm +25 -0
  61. package/ios/events/OnWillPresentEvent.h +28 -0
  62. package/ios/events/OnWillPresentEvent.mm +30 -0
  63. package/ios/utils/GestureUtil.h +25 -0
  64. package/ios/utils/GestureUtil.mm +26 -0
  65. package/ios/utils/LayoutUtil.h +44 -0
  66. package/ios/utils/LayoutUtil.mm +50 -0
  67. package/ios/utils/WindowUtil.h +27 -0
  68. package/ios/utils/WindowUtil.mm +42 -0
  69. package/lib/module/TrueSheet.js +231 -135
  70. package/lib/module/TrueSheet.js.map +1 -1
  71. package/lib/module/TrueSheetGrabber.js +16 -14
  72. package/lib/module/TrueSheetGrabber.js.map +1 -1
  73. package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +8 -0
  74. package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +8 -0
  75. package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +8 -0
  76. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +63 -0
  77. package/lib/module/index.js +1 -0
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/reanimated/ReanimatedTrueSheet.js +87 -0
  80. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -0
  81. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +72 -0
  82. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -0
  83. package/lib/module/reanimated/index.js +6 -0
  84. package/lib/module/reanimated/index.js.map +1 -0
  85. package/lib/module/reanimated/useReanimatedPositionChangeHandler.js +19 -0
  86. package/lib/module/reanimated/useReanimatedPositionChangeHandler.js.map +1 -0
  87. package/lib/module/specs/NativeTrueSheetModule.js +12 -0
  88. package/lib/module/specs/NativeTrueSheetModule.js.map +1 -0
  89. package/lib/typescript/package.json +1 -0
  90. package/lib/typescript/src/TrueSheet.d.ts +79 -0
  91. package/lib/typescript/src/TrueSheet.d.ts.map +1 -0
  92. package/lib/typescript/src/TrueSheet.types.d.ts +260 -0
  93. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -0
  94. package/lib/typescript/{commonjs/src → src}/TrueSheetGrabber.d.ts +1 -1
  95. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +1 -0
  96. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts +6 -0
  97. package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -0
  98. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts +6 -0
  99. package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -0
  100. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +6 -0
  101. package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -0
  102. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +44 -0
  103. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -0
  104. package/lib/typescript/{commonjs/src → src}/index.d.ts +1 -0
  105. package/lib/typescript/src/index.d.ts.map +1 -0
  106. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts +43 -0
  107. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -0
  108. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +57 -0
  109. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -0
  110. package/lib/typescript/src/reanimated/index.d.ts +4 -0
  111. package/lib/typescript/src/reanimated/index.d.ts.map +1 -0
  112. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.d.ts +6 -0
  113. package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.d.ts.map +1 -0
  114. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +34 -0
  115. package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -0
  116. package/package.json +104 -75
  117. package/react-native.config.js +17 -0
  118. package/src/TrueSheet.tsx +285 -188
  119. package/src/TrueSheet.types.ts +119 -106
  120. package/src/TrueSheetGrabber.tsx +29 -28
  121. package/src/__mocks__/index.js +60 -12
  122. package/src/fabric/TrueSheetContainerViewNativeComponent.ts +8 -0
  123. package/src/fabric/TrueSheetContentViewNativeComponent.ts +8 -0
  124. package/src/fabric/TrueSheetFooterViewNativeComponent.ts +8 -0
  125. package/src/fabric/TrueSheetViewNativeComponent.ts +63 -0
  126. package/src/index.ts +4 -3
  127. package/src/reanimated/ReanimatedTrueSheet.tsx +95 -0
  128. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +92 -0
  129. package/src/reanimated/index.ts +3 -0
  130. package/src/reanimated/useReanimatedPositionChangeHandler.ts +26 -0
  131. package/src/specs/NativeTrueSheetModule.ts +38 -0
  132. package/TrueSheet.podspec +0 -49
  133. package/android/src/main/java/com/lodev09/truesheet/TrueSheetDialog.kt +0 -400
  134. package/android/src/main/java/com/lodev09/truesheet/TrueSheetEvent.kt +0 -22
  135. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewModule.kt +0 -63
  136. package/android/src/main/java/com/lodev09/truesheet/core/KeyboardManager.kt +0 -58
  137. package/android/src/main/java/com/lodev09/truesheet/core/RootSheetView.kt +0 -102
  138. package/ios/Extensions/UIBlurEffect+withTint.swift +0 -62
  139. package/ios/Extensions/UIView+pinTo.swift +0 -74
  140. package/ios/Extensions/UIViewController+detentForSize.swift +0 -134
  141. package/ios/TrueSheet-Bridging-Header.h +0 -14
  142. package/ios/TrueSheetEvent.swift +0 -48
  143. package/ios/TrueSheetView.swift +0 -461
  144. package/ios/TrueSheetViewController.swift +0 -275
  145. package/ios/TrueSheetViewManager.m +0 -53
  146. package/ios/TrueSheetViewManager.swift +0 -48
  147. package/ios/Utils/Logger.swift +0 -39
  148. package/ios/Utils/Promise.swift +0 -25
  149. package/lib/commonjs/TrueSheet.js +0 -258
  150. package/lib/commonjs/TrueSheet.js.map +0 -1
  151. package/lib/commonjs/TrueSheet.types.js +0 -6
  152. package/lib/commonjs/TrueSheet.types.js.map +0 -1
  153. package/lib/commonjs/TrueSheetFooter.js +0 -19
  154. package/lib/commonjs/TrueSheetFooter.js.map +0 -1
  155. package/lib/commonjs/TrueSheetGrabber.js +0 -54
  156. package/lib/commonjs/TrueSheetGrabber.js.map +0 -1
  157. package/lib/commonjs/TrueSheetModule.js +0 -19
  158. package/lib/commonjs/TrueSheetModule.js.map +0 -1
  159. package/lib/commonjs/__mocks__/index.js +0 -52
  160. package/lib/commonjs/__mocks__/index.js.map +0 -1
  161. package/lib/commonjs/index.js +0 -39
  162. package/lib/commonjs/index.js.map +0 -1
  163. package/lib/module/TrueSheetFooter.js +0 -14
  164. package/lib/module/TrueSheetFooter.js.map +0 -1
  165. package/lib/module/TrueSheetModule.js +0 -15
  166. package/lib/module/TrueSheetModule.js.map +0 -1
  167. package/lib/module/__mocks__/index.js +0 -21
  168. package/lib/module/__mocks__/index.js.map +0 -1
  169. package/lib/typescript/commonjs/package.json +0 -1
  170. package/lib/typescript/commonjs/src/TrueSheet.d.ts +0 -70
  171. package/lib/typescript/commonjs/src/TrueSheet.d.ts.map +0 -1
  172. package/lib/typescript/commonjs/src/TrueSheet.types.d.ts +0 -241
  173. package/lib/typescript/commonjs/src/TrueSheet.types.d.ts.map +0 -1
  174. package/lib/typescript/commonjs/src/TrueSheetFooter.d.ts +0 -7
  175. package/lib/typescript/commonjs/src/TrueSheetFooter.d.ts.map +0 -1
  176. package/lib/typescript/commonjs/src/TrueSheetGrabber.d.ts.map +0 -1
  177. package/lib/typescript/commonjs/src/TrueSheetModule.d.ts +0 -2
  178. package/lib/typescript/commonjs/src/TrueSheetModule.d.ts.map +0 -1
  179. package/lib/typescript/commonjs/src/index.d.ts.map +0 -1
  180. package/lib/typescript/module/src/TrueSheet.d.ts +0 -70
  181. package/lib/typescript/module/src/TrueSheet.d.ts.map +0 -1
  182. package/lib/typescript/module/src/TrueSheet.types.d.ts +0 -241
  183. package/lib/typescript/module/src/TrueSheet.types.d.ts.map +0 -1
  184. package/lib/typescript/module/src/TrueSheetFooter.d.ts +0 -7
  185. package/lib/typescript/module/src/TrueSheetFooter.d.ts.map +0 -1
  186. package/lib/typescript/module/src/TrueSheetGrabber.d.ts +0 -39
  187. package/lib/typescript/module/src/TrueSheetGrabber.d.ts.map +0 -1
  188. package/lib/typescript/module/src/TrueSheetModule.d.ts +0 -2
  189. package/lib/typescript/module/src/TrueSheetModule.d.ts.map +0 -1
  190. package/lib/typescript/module/src/index.d.ts +0 -4
  191. package/lib/typescript/module/src/index.d.ts.map +0 -1
  192. package/src/TrueSheetFooter.tsx +0 -17
  193. package/src/TrueSheetModule.ts +0 -19
  194. /package/lib/{typescript/module → module}/package.json +0 -0
@@ -1,275 +0,0 @@
1
- //
2
- // Created by Jovanni Lo (@lodev09)
3
- // Copyright (c) 2024-present. All rights reserved.
4
- //
5
- // This source code is licensed under the MIT license found in the
6
- // LICENSE file in the root directory of this source tree.
7
- //
8
-
9
- // MARK: - SizeInfo
10
-
11
- struct SizeInfo {
12
- var index: Int
13
- var value: CGFloat
14
- }
15
-
16
- // MARK: - TrueSheetViewControllerDelegate
17
-
18
- protocol TrueSheetViewControllerDelegate: AnyObject {
19
- func viewControllerDidChangeWidth(_ width: CGFloat)
20
- func viewControllerDidDismiss()
21
- func viewControllerDidChangeSize(_ sizeInfo: SizeInfo?)
22
- func viewControllerWillAppear()
23
- func viewControllerKeyboardWillShow(_ keyboardHeight: CGFloat)
24
- func viewControllerKeyboardWillHide()
25
- func viewControllerDidDrag(_ state: UIPanGestureRecognizer.State, _ height: CGFloat)
26
- }
27
-
28
- // MARK: - TrueSheetViewController
29
-
30
- class TrueSheetViewController: UIViewController, UISheetPresentationControllerDelegate {
31
- // MARK: - Properties
32
-
33
- weak var delegate: TrueSheetViewControllerDelegate?
34
-
35
- /// The bottomInset of the sheet.
36
- /// We will be excluding these on height calculation for conistency with scrollable content.
37
- private var bottomInset: CGFloat
38
- private var backgroundView: UIVisualEffectView
39
-
40
- var lastViewWidth: CGFloat = 0
41
- var detentValues: [String: SizeInfo] = [:]
42
-
43
- var sizes: [Any] = ["medium", "large"]
44
-
45
- var maxHeight: CGFloat?
46
- var contentHeight: CGFloat = 0
47
- var footerHeight: CGFloat = 0
48
-
49
- var backgroundColor: UIColor?
50
- var blurEffect: UIBlurEffect?
51
-
52
- var cornerRadius: CGFloat?
53
- var grabber = true
54
- var dimmed = true
55
- var dimmedIndex: Int? = 0
56
-
57
- var currentSizeInfo: SizeInfo? {
58
- guard #available(iOS 15.0, *), let sheet = sheetPresentationController,
59
- let rawValue = sheet.selectedDetentIdentifier?.rawValue else {
60
- return nil
61
- }
62
-
63
- return detentValues[rawValue]
64
- }
65
-
66
- // MARK: - Setup
67
-
68
- init() {
69
- backgroundView = UIVisualEffectView()
70
-
71
- let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow })
72
- bottomInset = window?.safeAreaInsets.bottom ?? 0
73
-
74
- super.init(nibName: nil, bundle: nil)
75
-
76
- backgroundView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
77
- backgroundView.frame = view.bounds
78
-
79
- view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
80
- view.insertSubview(backgroundView, at: 0)
81
- }
82
-
83
- deinit {
84
- NotificationCenter.default.removeObserver(self)
85
- }
86
-
87
- @available(*, unavailable)
88
- required init?(coder _: NSCoder) {
89
- fatalError("init(coder:) has not been implemented")
90
- }
91
-
92
- @available(iOS 15.0, *)
93
- func sheetPresentationControllerDidChangeSelectedDetentIdentifier(_ sheet: UISheetPresentationController) {
94
- if let rawValue = sheet.selectedDetentIdentifier?.rawValue,
95
- let sizeInfo = detentValues[rawValue] {
96
- delegate?.viewControllerDidChangeSize(sizeInfo)
97
- }
98
- }
99
-
100
- override func viewDidLoad() {
101
- super.viewDidLoad()
102
-
103
- NotificationCenter.default.addObserver(
104
- self, selector: #selector(keyboardWillShow(_:)),
105
- name: UIResponder.keyboardWillShowNotification,
106
- object: nil
107
- )
108
-
109
- NotificationCenter.default.addObserver(
110
- self, selector: #selector(keyboardWillHide(_:)),
111
- name: UIResponder.keyboardWillHideNotification,
112
- object: nil
113
- )
114
- }
115
-
116
- @objc
117
- func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
118
- guard let view = gesture.view else { return }
119
-
120
- // Calculate visible height
121
- let screenHeight = UIScreen.main.bounds.height
122
- let sheetY = view.frame.origin.y
123
- let height = screenHeight - bottomInset - sheetY
124
-
125
- delegate?.viewControllerDidDrag(gesture.state, height)
126
- }
127
-
128
- @objc
129
- private func keyboardWillShow(_ notification: Notification) {
130
- guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
131
- return
132
- }
133
-
134
- delegate?.viewControllerKeyboardWillShow(keyboardSize.height)
135
- }
136
-
137
- @objc
138
- private func keyboardWillHide(_: Notification) {
139
- delegate?.viewControllerKeyboardWillHide()
140
- }
141
-
142
- override func viewWillAppear(_ animated: Bool) {
143
- super.viewWillAppear(animated)
144
- delegate?.viewControllerWillAppear()
145
- }
146
-
147
- override func viewDidDisappear(_ animated: Bool) {
148
- super.viewDidDisappear(animated)
149
- delegate?.viewControllerDidDismiss()
150
- }
151
-
152
- /// This is called multiple times while sheet is being dragged.
153
- /// let's try to minimize size update by comparing last known width
154
- override func viewDidLayoutSubviews() {
155
- super.viewDidLayoutSubviews()
156
-
157
- if lastViewWidth != view.frame.width {
158
- delegate?.viewControllerDidChangeWidth(view.bounds.width)
159
- lastViewWidth = view.frame.width
160
- }
161
- }
162
-
163
- /// Setup background. Supports color or blur effect.
164
- /// Can only use one or the other.
165
- func setupBackground() {
166
- if let blurEffect {
167
- backgroundView.effect = blurEffect
168
- backgroundView.backgroundColor = nil
169
- } else {
170
- backgroundView.backgroundColor = backgroundColor
171
- backgroundView.effect = nil
172
- }
173
- }
174
-
175
- /// Setup dimmed sheet.
176
- /// `dimmedIndex` will further customize the dimming behavior.
177
- @available(iOS 15.0, *)
178
- func setupDimmedBackground() {
179
- guard let sheet = sheetPresentationController else {
180
- return
181
- }
182
-
183
- if dimmed, dimmedIndex == 0 {
184
- sheet.largestUndimmedDetentIdentifier = nil
185
- } else {
186
- sheet.largestUndimmedDetentIdentifier = .large
187
-
188
- if #available(iOS 16.0, *) {
189
- if dimmed, let dimmedIndex, sheet.detents.indices.contains(dimmedIndex - 1) {
190
- sheet.largestUndimmedDetentIdentifier = sheet.detents[dimmedIndex - 1].identifier
191
- } else if let lastIdentifier = sheet.detents.last?.identifier {
192
- sheet.largestUndimmedDetentIdentifier = lastIdentifier
193
- }
194
- }
195
- }
196
- }
197
-
198
- /// Setup sheet detents by sizes.
199
- @available(iOS 15.0, *)
200
- func setupSizes() {
201
- guard let sheet = sheetPresentationController else {
202
- return
203
- }
204
-
205
- // Configure detents
206
- detentValues = [:]
207
- var detents: [UISheetPresentationController.Detent] = []
208
-
209
- for (index, size) in sizes.enumerated() {
210
- // Exclude bottom safe area for consistency with a Scrollable content
211
- let adjustedContentHeight = contentHeight - bottomInset
212
- let detent = detentFor(size, with: adjustedContentHeight + footerHeight, with: maxHeight) { id, value in
213
- self.detentValues[id] = SizeInfo(index: index, value: value)
214
- }
215
-
216
- detents.append(detent)
217
- }
218
-
219
- sheet.detents = detents
220
- }
221
-
222
- /// Get the detent identifier for a given index
223
- @available(iOS 15.0, *)
224
- func detentIdentifierForIndex(_ index: Int) -> UISheetPresentationController.Detent.Identifier {
225
- guard let sheet = sheetPresentationController else {
226
- return .medium
227
- }
228
-
229
- var identifier = UISheetPresentationController.Detent.Identifier.medium
230
- if sheet.detents.indices.contains(index) {
231
- let detent = sheet.detents[index]
232
- if #available(iOS 16.0, *) {
233
- identifier = detent.identifier
234
- } else if detent == .large() {
235
- identifier = .large
236
- }
237
- }
238
-
239
- return identifier
240
- }
241
-
242
- /// Observe while the sheet is being dragged.
243
- @available(iOS 15.0, *)
244
- func observeDrag() {
245
- guard let sheet = sheetPresentationController,
246
- let presentedView = sheet.presentedView else {
247
- return
248
- }
249
-
250
- for recognizer in presentedView.gestureRecognizers ?? [] {
251
- if let panGesture = recognizer as? UIPanGestureRecognizer {
252
- panGesture.addTarget(self, action: #selector(handlePanGesture(_:)))
253
- }
254
- }
255
- }
256
-
257
- /// Prepares the view controller for sheet presentation
258
- func prepareForPresentation(at index: Int = 0, _ completion: (() -> Void)?) {
259
- guard #available(iOS 15.0, *), let sheet = sheetPresentationController else {
260
- completion?()
261
- return
262
- }
263
-
264
- setupSizes()
265
- setupDimmedBackground()
266
-
267
- sheet.delegate = self
268
- sheet.prefersEdgeAttachedInCompactHeight = true
269
- sheet.prefersGrabberVisible = grabber
270
- sheet.preferredCornerRadius = cornerRadius
271
- sheet.selectedDetentIdentifier = detentIdentifierForIndex(index)
272
-
273
- completion?()
274
- }
275
- }
@@ -1,53 +0,0 @@
1
- //
2
- // Created by Jovanni Lo (@lodev09)
3
- // Copyright (c) 2024-present. All rights reserved.
4
- //
5
- // This source code is licensed under the MIT license found in the
6
- // LICENSE file in the root directory of this source tree.
7
- //
8
-
9
- #import <React/RCTViewManager.h>
10
-
11
- @interface RCT_EXTERN_REMAP_MODULE (TrueSheetView, TrueSheetViewManager, RCTViewManager)
12
-
13
- // Module Functions
14
-
15
- /// Presents the sheet controller
16
- RCT_EXTERN_METHOD(present:(nonnull NSNumber*)tag
17
- index:(int)index
18
- resolve:(RCTPromiseResolveBlock)resolve
19
- reject:(RCTPromiseRejectBlock)reject)
20
-
21
- RCT_EXTERN_METHOD(dismiss:(nonnull NSNumber*)tag
22
- resolve:(RCTPromiseResolveBlock)resolve
23
- reject:(RCTPromiseRejectBlock)reject)
24
-
25
- // Events
26
- RCT_EXPORT_VIEW_PROPERTY(onMount, RCTDirectEventBlock)
27
- RCT_EXPORT_VIEW_PROPERTY(onPresent, RCTDirectEventBlock)
28
- RCT_EXPORT_VIEW_PROPERTY(onDismiss, RCTDirectEventBlock)
29
- RCT_EXPORT_VIEW_PROPERTY(onSizeChange, RCTDirectEventBlock)
30
- RCT_EXPORT_VIEW_PROPERTY(onDragBegin, RCTDirectEventBlock)
31
- RCT_EXPORT_VIEW_PROPERTY(onDragChange, RCTDirectEventBlock)
32
- RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTDirectEventBlock)
33
- RCT_EXPORT_VIEW_PROPERTY(onContainerSizeChange, RCTDirectEventBlock)
34
-
35
- // Properties
36
- RCT_EXPORT_VIEW_PROPERTY(scrollableHandle, NSNumber)
37
- RCT_EXPORT_VIEW_PROPERTY(maxHeight, NSNumber)
38
- RCT_EXPORT_VIEW_PROPERTY(sizes, NSArray)
39
- RCT_EXPORT_VIEW_PROPERTY(blurTint, NSString)
40
- RCT_EXPORT_VIEW_PROPERTY(background, NSNumber)
41
- RCT_EXPORT_VIEW_PROPERTY(cornerRadius, NSNumber)
42
- RCT_EXPORT_VIEW_PROPERTY(grabber, BOOL)
43
- RCT_EXPORT_VIEW_PROPERTY(dismissible, BOOL)
44
- RCT_EXPORT_VIEW_PROPERTY(dimmed, BOOL)
45
- RCT_EXPORT_VIEW_PROPERTY(dimmedIndex, NSNumber)
46
- RCT_EXPORT_VIEW_PROPERTY(initialIndex, NSNumber)
47
- RCT_EXPORT_VIEW_PROPERTY(initialIndexAnimated, BOOL)
48
-
49
- // Internal properties
50
- RCT_EXPORT_VIEW_PROPERTY(contentHeight, NSNumber)
51
- RCT_EXPORT_VIEW_PROPERTY(footerHeight, NSNumber)
52
-
53
- @end
@@ -1,48 +0,0 @@
1
- //
2
- // Created by Jovanni Lo (@lodev09)
3
- // Copyright (c) 2024-present. All rights reserved.
4
- //
5
- // This source code is licensed under the MIT license found in the
6
- // LICENSE file in the root directory of this source tree.
7
- //
8
-
9
- @objc(TrueSheetViewManager)
10
- class TrueSheetViewManager: RCTViewManager {
11
- // MARK: - properties
12
-
13
- override var methodQueue: DispatchQueue! {
14
- return DispatchQueue.main
15
- }
16
-
17
- override static func requiresMainQueueSetup() -> Bool {
18
- return true
19
- }
20
-
21
- override func view() -> UIView? {
22
- return TrueSheetView(with: bridge)
23
- }
24
-
25
- // MARK: - Private
26
-
27
- private func getTrueSheetView(_ tag: NSNumber) -> TrueSheetView? {
28
- guard let uiManager = bridge?.uiManager else { return nil }
29
- guard let viewForTag = uiManager.view(forReactTag: tag) else { return nil }
30
- // swiftlint:disable force_cast
31
- return viewForTag as! TrueSheetView
32
- // swiftlint:enable force_cast
33
- }
34
-
35
- // MARK: - React Functions
36
-
37
- @objc
38
- func present(_ tag: NSNumber, index: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
39
- let trueSheetView = getTrueSheetView(tag)
40
- trueSheetView?.present(at: index, promise: Promise(resolver: resolve, rejecter: reject))
41
- }
42
-
43
- @objc
44
- func dismiss(_ tag: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
45
- let trueSheetView = getTrueSheetView(tag)
46
- trueSheetView?.dismiss(promise: Promise(resolver: resolve, rejecter: reject))
47
- }
48
- }
@@ -1,39 +0,0 @@
1
- //
2
- // Created by Jovanni Lo (@lodev09)
3
- // Copyright (c) 2024-present. All rights reserved.
4
- //
5
- // This source code is licensed under the MIT license found in the
6
- // LICENSE file in the root directory of this source tree.
7
- //
8
-
9
- import Foundation
10
-
11
- // MARK: - Logger
12
-
13
- enum Logger {
14
- /**
15
- Log a message to the console in the format of `TrueSheet.[caller-function-name]: [message]`
16
-
17
- @discussion
18
- If the global ConsoleLogFunction is set, this function also logs to the JavaScript console (console.log, console.trace, console.warn or console.error)
19
- This function also always logs to [RCTDefaultLogFunction].
20
- In non-DEBUG builds, this function is no-op.
21
- */
22
- static func log(level: RCTLogLevel, _ message: String) {
23
- #if DEBUG
24
- RCTDefaultLogFunction(level, RCTLogSource.javaScript, nil, nil, "TrueSheet: \(message)")
25
- #endif
26
- }
27
-
28
- static func info(_ message: String) {
29
- log(level: .info, message)
30
- }
31
-
32
- static func warning(_ message: String) {
33
- log(level: .warning, message)
34
- }
35
-
36
- static func error(_ message: String) {
37
- log(level: .error, message)
38
- }
39
- }
@@ -1,25 +0,0 @@
1
- //
2
- // Created by Jovanni Lo (@lodev09)
3
- // Copyright (c) 2024-present. All rights reserved.
4
- //
5
- // This source code is licensed under the MIT license found in the
6
- // LICENSE file in the root directory of this source tree.
7
- //
8
-
9
- class Promise {
10
- private let resolver: RCTPromiseResolveBlock
11
- private let rejecter: RCTPromiseRejectBlock
12
-
13
- init(resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
14
- self.resolver = resolver
15
- self.rejecter = rejecter
16
- }
17
-
18
- func reject(message: String) {
19
- rejecter("Error", message, nil)
20
- }
21
-
22
- func resolve(_ value: Any?) {
23
- resolver(value)
24
- }
25
- }
@@ -1,258 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.TrueSheet = void 0;
7
- var _react = require("react");
8
- var _reactNative = require("react-native");
9
- var _TrueSheetModule = require("./TrueSheetModule.js");
10
- var _TrueSheetGrabber = require("./TrueSheetGrabber.js");
11
- var _TrueSheetFooter = require("./TrueSheetFooter.js");
12
- var _jsxRuntime = require("react/jsx-runtime");
13
- const NATIVE_COMPONENT_NAME = 'TrueSheetView';
14
- const LINKING_ERROR = `The package '@lodev09/react-native-true-sheet' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
15
- ios: "- You have run 'pod install'\n",
16
- default: ''
17
- }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
18
- const TrueSheetNativeView = (0, _reactNative.requireNativeComponent)(NATIVE_COMPONENT_NAME);
19
- if (!TrueSheetNativeView) {
20
- throw new Error(LINKING_ERROR);
21
- }
22
- class TrueSheet extends _react.PureComponent {
23
- displayName = 'TrueSheet';
24
- /**
25
- * Map of sheet names against their handle.
26
- */
27
- static handles = {};
28
- constructor(props) {
29
- super(props);
30
- this.ref = /*#__PURE__*/(0, _react.createRef)();
31
- this.onMount = this.onMount.bind(this);
32
- this.onDismiss = this.onDismiss.bind(this);
33
- this.onPresent = this.onPresent.bind(this);
34
- this.onSizeChange = this.onSizeChange.bind(this);
35
- this.onDragBegin = this.onDragBegin.bind(this);
36
- this.onDragChange = this.onDragChange.bind(this);
37
- this.onDragEnd = this.onDragEnd.bind(this);
38
- this.onContentLayout = this.onContentLayout.bind(this);
39
- this.onFooterLayout = this.onFooterLayout.bind(this);
40
- this.onContainerSizeChange = this.onContainerSizeChange.bind(this);
41
- this.state = {
42
- containerWidth: undefined,
43
- containerHeight: undefined,
44
- contentHeight: undefined,
45
- footerHeight: undefined,
46
- scrollableHandle: null
47
- };
48
- }
49
- static getHandle(name) {
50
- const handle = TrueSheet.handles[name];
51
- if (!handle) {
52
- console.warn(`Could not get native view tag from "${name}". Check your name prop.`);
53
- return;
54
- }
55
- return handle;
56
- }
57
-
58
- /**
59
- * Present the sheet by given `name`.
60
- * See `name` prop.
61
- */
62
- static async present(name, index = 0) {
63
- const handle = TrueSheet.getHandle(name);
64
- if (!handle) return;
65
- await _TrueSheetModule.TrueSheetModule.present(handle, index);
66
- }
67
-
68
- /**
69
- * Dismiss the sheet by given `name`.
70
- * See `name` prop.
71
- */
72
- static async dismiss(name) {
73
- const handle = TrueSheet.getHandle(name);
74
- if (!handle) return;
75
- await _TrueSheetModule.TrueSheetModule.dismiss(handle);
76
- }
77
-
78
- /**
79
- * Resize the sheet by given `name`.
80
- * See `name` prop.
81
- */
82
- static async resize(name, index) {
83
- await TrueSheet.present(name, index);
84
- }
85
- get handle() {
86
- const nodeHandle = (0, _reactNative.findNodeHandle)(this.ref.current);
87
- if (nodeHandle == null || nodeHandle === -1) {
88
- throw new Error('Could not get native view tag');
89
- }
90
- return nodeHandle;
91
- }
92
- updateState() {
93
- const scrollableHandle = this.props.scrollRef?.current ? (0, _reactNative.findNodeHandle)(this.props.scrollRef.current) : null;
94
- if (this.props.name) {
95
- TrueSheet.handles[this.props.name] = this.handle;
96
- }
97
- this.setState({
98
- scrollableHandle
99
- });
100
- }
101
- onSizeChange(event) {
102
- this.props.onSizeChange?.(event);
103
- }
104
- onContainerSizeChange(event) {
105
- this.setState({
106
- containerWidth: event.nativeEvent.width,
107
- containerHeight: event.nativeEvent.height
108
- });
109
- }
110
- onPresent(event) {
111
- this.props.onPresent?.(event);
112
- }
113
- onFooterLayout(event) {
114
- this.setState({
115
- footerHeight: event.nativeEvent.layout.height
116
- });
117
- }
118
- onContentLayout(event) {
119
- this.setState({
120
- contentHeight: event.nativeEvent.layout.height
121
- });
122
- }
123
- onDismiss() {
124
- this.props.onDismiss?.();
125
- }
126
- onMount() {
127
- this.props.onMount?.();
128
- }
129
- onDragBegin(event) {
130
- this.props.onDragBegin?.(event);
131
- }
132
- onDragChange(event) {
133
- this.props.onDragChange?.(event);
134
- }
135
- onDragEnd(event) {
136
- this.props.onDragEnd?.(event);
137
- }
138
-
139
- /**
140
- * Present the sheet. Optionally accepts a size `index`.
141
- * See `sizes` prop
142
- */
143
- async present(index = 0) {
144
- await _TrueSheetModule.TrueSheetModule.present(this.handle, index);
145
- }
146
-
147
- /**
148
- * Resizes the Sheet programmatically by `index`.
149
- * This is an alias of the `present(index)` method.
150
- */
151
- async resize(index) {
152
- await this.present(index);
153
- }
154
-
155
- /**
156
- * Dismisses the Sheet
157
- */
158
- async dismiss() {
159
- await _TrueSheetModule.TrueSheetModule.dismiss(this.handle);
160
- }
161
- componentDidMount() {
162
- if (this.props.sizes && this.props.sizes.length > 3) {
163
- console.warn('TrueSheet only supports a maximum of 3 sizes; collapsed, half-expanded and expanded. Check your `sizes` prop.');
164
- }
165
- this.updateState();
166
- }
167
- componentDidUpdate() {
168
- this.updateState();
169
- }
170
- render() {
171
- const {
172
- sizes = ['medium', 'large'],
173
- backgroundColor = 'white',
174
- dismissible = true,
175
- grabber = true,
176
- dimmed = true,
177
- initialIndexAnimated = true,
178
- edgeToEdge = false,
179
- keyboardMode = 'resize',
180
- initialIndex,
181
- dimmedIndex,
182
- grabberProps,
183
- blurTint,
184
- cornerRadius,
185
- maxHeight,
186
- FooterComponent,
187
- style,
188
- contentContainerStyle,
189
- children,
190
- ...rest
191
- } = this.props;
192
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(TrueSheetNativeView, {
193
- ref: this.ref,
194
- style: $nativeSheet,
195
- scrollableHandle: this.state.scrollableHandle,
196
- sizes: sizes,
197
- blurTint: blurTint,
198
- background: (0, _reactNative.processColor)(backgroundColor),
199
- cornerRadius: cornerRadius,
200
- contentHeight: this.state.contentHeight,
201
- footerHeight: this.state.footerHeight,
202
- grabber: grabber,
203
- dimmed: dimmed,
204
- dimmedIndex: dimmedIndex,
205
- edgeToEdge: edgeToEdge,
206
- initialIndex: initialIndex,
207
- initialIndexAnimated: initialIndexAnimated,
208
- keyboardMode: keyboardMode,
209
- dismissible: dismissible,
210
- maxHeight: maxHeight,
211
- onMount: this.onMount,
212
- onPresent: this.onPresent,
213
- onDismiss: this.onDismiss,
214
- onSizeChange: this.onSizeChange,
215
- onDragBegin: this.onDragBegin,
216
- onDragChange: this.onDragChange,
217
- onDragEnd: this.onDragEnd,
218
- onContainerSizeChange: this.onContainerSizeChange,
219
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
220
- collapsable: false,
221
- style: [{
222
- overflow: _reactNative.Platform.select({
223
- ios: undefined,
224
- android: 'hidden'
225
- }),
226
- // Update the width on JS side.
227
- // New Arch interop does not support updating it in native :/
228
- width: this.state.containerWidth,
229
- height: this.state.containerHeight
230
- }, style],
231
- ...rest,
232
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
233
- collapsable: false,
234
- onLayout: this.onContentLayout,
235
- style: contentContainerStyle,
236
- children: children
237
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
238
- collapsable: false,
239
- onLayout: this.onFooterLayout,
240
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TrueSheetFooter.TrueSheetFooter, {
241
- Component: FooterComponent
242
- })
243
- }), _reactNative.Platform.OS === 'android' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TrueSheetGrabber.TrueSheetGrabber, {
244
- visible: grabber,
245
- ...grabberProps
246
- })]
247
- })
248
- });
249
- }
250
- }
251
- exports.TrueSheet = TrueSheet;
252
- const $nativeSheet = {
253
- position: 'absolute',
254
- width: '100%',
255
- left: -9999,
256
- zIndex: -9999
257
- };
258
- //# sourceMappingURL=TrueSheet.js.map