one 2.0.0-beta.103.1 → 2.0.0-beta.105.1

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 (331) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/AndroidManifest.xml +7 -0
  3. package/android/src/main/java/com/margelo/nitro/one/HybridOneAppleAuth.kt +19 -0
  4. package/android/src/main/java/com/margelo/nitro/one/HybridOneBrowser.kt +156 -20
  5. package/android/src/main/java/com/margelo/nitro/one/HybridOneSpeech.kt +270 -0
  6. package/android/src/main/java/com/margelo/nitro/one/OneNativeError.kt +6 -3
  7. package/dist/cjs/one.cjs +2 -0
  8. package/dist/cjs/one.native.cjs +2 -0
  9. package/dist/cjs/one.native.js +2 -0
  10. package/dist/cjs/one.native.js.map +1 -1
  11. package/dist/cjs/platform/Tabs.native.cjs +1 -0
  12. package/dist/cjs/platform/Tabs.native.js +1 -0
  13. package/dist/cjs/platform/Tabs.native.js.map +1 -1
  14. package/dist/cjs/platform/auth/index.cjs +29 -0
  15. package/dist/cjs/platform/auth/index.native.cjs +73 -0
  16. package/dist/cjs/platform/auth/index.native.js +75 -0
  17. package/dist/cjs/platform/auth/index.native.js.map +1 -0
  18. package/dist/cjs/platform/auth/types.cjs +16 -0
  19. package/dist/cjs/platform/auth/types.native.cjs +18 -0
  20. package/dist/cjs/platform/auth/types.native.js +20 -0
  21. package/dist/cjs/platform/auth/types.native.js.map +1 -0
  22. package/dist/cjs/platform/browser/index.cjs +9 -1
  23. package/dist/cjs/platform/browser/index.native.cjs +15 -18
  24. package/dist/cjs/platform/browser/index.native.js +15 -18
  25. package/dist/cjs/platform/browser/index.native.js.map +1 -1
  26. package/dist/cjs/platform/browser/validate.cjs +9 -0
  27. package/dist/cjs/platform/browser/validate.native.cjs +9 -0
  28. package/dist/cjs/platform/browser/validate.native.js +9 -0
  29. package/dist/cjs/platform/browser/validate.native.js.map +1 -1
  30. package/dist/cjs/platform/extras.cjs +4 -0
  31. package/dist/cjs/platform/extras.native.cjs +4 -0
  32. package/dist/cjs/platform/extras.native.js +4 -0
  33. package/dist/cjs/platform/extras.native.js.map +1 -1
  34. package/dist/cjs/platform/generated/Controls.native.cjs +6 -3
  35. package/dist/cjs/platform/generated/Controls.native.js +6 -3
  36. package/dist/cjs/platform/generated/Controls.native.js.map +1 -1
  37. package/dist/cjs/platform/nativeError.cjs +4 -5
  38. package/dist/cjs/platform/nativeError.native.cjs +4 -5
  39. package/dist/cjs/platform/nativeError.native.js +4 -5
  40. package/dist/cjs/platform/nativeError.native.js.map +1 -1
  41. package/dist/cjs/platform/specs/OneAppleAuth.nitro.cjs +16 -0
  42. package/dist/cjs/platform/specs/OneAppleAuth.nitro.native.cjs +18 -0
  43. package/dist/cjs/platform/specs/OneAppleAuth.nitro.native.js +20 -0
  44. package/dist/cjs/platform/specs/OneAppleAuth.nitro.native.js.map +1 -0
  45. package/dist/cjs/platform/specs/OneNativeImageNativeComponent.cjs +1 -0
  46. package/dist/cjs/platform/specs/OneNativeImageNativeComponent.native.cjs +1 -0
  47. package/dist/cjs/platform/specs/OneNativeImageNativeComponent.native.js +1 -0
  48. package/dist/cjs/platform/specs/OneNativeImageNativeComponent.native.js.map +2 -2
  49. package/dist/cjs/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.cjs +1 -0
  50. package/dist/cjs/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.native.cjs +1 -0
  51. package/dist/cjs/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.native.js +1 -0
  52. package/dist/cjs/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.native.js.map +2 -2
  53. package/dist/cjs/platform/specs/OneSpeech.nitro.cjs +16 -0
  54. package/dist/cjs/platform/specs/OneSpeech.nitro.native.cjs +18 -0
  55. package/dist/cjs/platform/specs/OneSpeech.nitro.native.js +20 -0
  56. package/dist/cjs/platform/specs/OneSpeech.nitro.native.js.map +1 -0
  57. package/dist/cjs/platform/speech/index.cjs +36 -0
  58. package/dist/cjs/platform/speech/index.native.cjs +60 -0
  59. package/dist/cjs/platform/speech/index.native.js +62 -0
  60. package/dist/cjs/platform/speech/index.native.js.map +1 -0
  61. package/dist/cjs/platform/speech/types.cjs +16 -0
  62. package/dist/cjs/platform/speech/types.native.cjs +18 -0
  63. package/dist/cjs/platform/speech/types.native.js +20 -0
  64. package/dist/cjs/platform/speech/types.native.js.map +1 -0
  65. package/dist/cjs/safe-area-context/SafeAreaContext.cjs +15 -1
  66. package/dist/cjs/safe-area-context/SafeAreaContext.native.cjs +15 -1
  67. package/dist/cjs/safe-area-context/SafeAreaContext.native.js +15 -1
  68. package/dist/cjs/safe-area-context/SafeAreaContext.native.js.map +1 -1
  69. package/dist/cjs/safe-area-context/tamaguiSafeArea.cjs +24 -0
  70. package/dist/cjs/safe-area-context/tamaguiSafeArea.native.cjs +50 -0
  71. package/dist/cjs/safe-area-context/tamaguiSafeArea.native.js +52 -0
  72. package/dist/cjs/safe-area-context/tamaguiSafeArea.native.js.map +1 -0
  73. package/dist/cjs/utils/absorbedPackages.cjs +12 -3
  74. package/dist/cjs/utils/absorbedPackages.native.cjs +15 -3
  75. package/dist/cjs/utils/absorbedPackages.native.js +15 -3
  76. package/dist/cjs/utils/absorbedPackages.native.js.map +1 -1
  77. package/dist/esm/one.mjs +3 -1
  78. package/dist/esm/one.mjs.map +1 -1
  79. package/dist/esm/one.native.js +3 -1
  80. package/dist/esm/one.native.js.map +1 -1
  81. package/dist/esm/platform/Tabs.native.js +1 -0
  82. package/dist/esm/platform/Tabs.native.js.map +1 -1
  83. package/dist/esm/platform/auth/index.mjs +9 -0
  84. package/dist/esm/platform/auth/index.mjs.map +1 -0
  85. package/dist/esm/platform/auth/index.native.js +52 -0
  86. package/dist/esm/platform/auth/index.native.js.map +1 -0
  87. package/dist/esm/platform/auth/types.mjs +0 -0
  88. package/dist/esm/platform/auth/types.native.js +0 -0
  89. package/dist/esm/platform/browser/index.mjs +9 -1
  90. package/dist/esm/platform/browser/index.mjs.map +1 -1
  91. package/dist/esm/platform/browser/index.native.js +15 -18
  92. package/dist/esm/platform/browser/index.native.js.map +1 -1
  93. package/dist/esm/platform/browser/validate.mjs +9 -0
  94. package/dist/esm/platform/browser/validate.mjs.map +1 -1
  95. package/dist/esm/platform/browser/validate.native.js +9 -0
  96. package/dist/esm/platform/browser/validate.native.js.map +1 -1
  97. package/dist/esm/platform/extras.mjs +3 -1
  98. package/dist/esm/platform/extras.native.js +3 -1
  99. package/dist/esm/platform/generated/Controls.native.js +6 -3
  100. package/dist/esm/platform/generated/Controls.native.js.map +1 -1
  101. package/dist/esm/platform/nativeError.mjs +4 -5
  102. package/dist/esm/platform/nativeError.mjs.map +1 -1
  103. package/dist/esm/platform/nativeError.native.js +4 -5
  104. package/dist/esm/platform/nativeError.native.js.map +1 -1
  105. package/dist/esm/platform/specs/OneAppleAuth.nitro.mjs +0 -0
  106. package/dist/esm/platform/specs/OneAppleAuth.nitro.native.js +0 -0
  107. package/dist/esm/platform/specs/OneNativeImageNativeComponent.mjs +1 -0
  108. package/dist/esm/platform/specs/OneNativeImageNativeComponent.mjs.map +2 -2
  109. package/dist/esm/platform/specs/OneNativeImageNativeComponent.native.js +1 -0
  110. package/dist/esm/platform/specs/OneNativeImageNativeComponent.native.js.map +2 -2
  111. package/dist/esm/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.mjs +1 -0
  112. package/dist/esm/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.mjs.map +2 -2
  113. package/dist/esm/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.native.js +1 -0
  114. package/dist/esm/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.native.js.map +2 -2
  115. package/dist/esm/platform/specs/OneSpeech.nitro.mjs +0 -0
  116. package/dist/esm/platform/specs/OneSpeech.nitro.native.js +0 -0
  117. package/dist/esm/platform/speech/index.mjs +16 -0
  118. package/dist/esm/platform/speech/index.mjs.map +1 -0
  119. package/dist/esm/platform/speech/index.native.js +39 -0
  120. package/dist/esm/platform/speech/index.native.js.map +1 -0
  121. package/dist/esm/platform/speech/types.mjs +0 -0
  122. package/dist/esm/platform/speech/types.native.js +0 -0
  123. package/dist/esm/safe-area-context/SafeAreaContext.mjs +15 -1
  124. package/dist/esm/safe-area-context/SafeAreaContext.mjs.map +1 -1
  125. package/dist/esm/safe-area-context/SafeAreaContext.native.js +15 -1
  126. package/dist/esm/safe-area-context/SafeAreaContext.native.js.map +1 -1
  127. package/dist/esm/safe-area-context/tamaguiSafeArea.mjs +4 -0
  128. package/dist/esm/safe-area-context/tamaguiSafeArea.mjs.map +1 -0
  129. package/dist/esm/safe-area-context/tamaguiSafeArea.native.js +28 -0
  130. package/dist/esm/safe-area-context/tamaguiSafeArea.native.js.map +1 -0
  131. package/dist/esm/utils/absorbedPackages.mjs +9 -3
  132. package/dist/esm/utils/absorbedPackages.mjs.map +1 -1
  133. package/dist/esm/utils/absorbedPackages.native.js +12 -3
  134. package/dist/esm/utils/absorbedPackages.native.js.map +1 -1
  135. package/ios/Generated/OneNativeImageComponentView.mm +1 -1
  136. package/ios/Generated/OneNativeImageView.swift +6 -2
  137. package/ios/Generated/OneNativeSignInWithAppleButtonComponentView.mm +1 -1
  138. package/ios/Generated/OneNativeSignInWithAppleButtonView.swift +13 -2
  139. package/ios/Nitro/HybridOneAppleAuth.swift +159 -0
  140. package/ios/Nitro/HybridOneBrowser.swift +41 -3
  141. package/ios/Nitro/HybridOneSpeech.swift +275 -0
  142. package/ios/OneNativeRemoteImage.swift +51 -0
  143. package/ios/OneNativeTabsView.swift +23 -4
  144. package/nitrogen/generated/android/One+autolinking.cmake +4 -0
  145. package/nitrogen/generated/android/OneOnLoad.cpp +34 -0
  146. package/nitrogen/generated/android/c++/JAppleAuthCredential.hpp +86 -0
  147. package/nitrogen/generated/android/c++/JAppleAuthFullName.hpp +78 -0
  148. package/nitrogen/generated/android/c++/JAppleAuthResult.hpp +70 -0
  149. package/nitrogen/generated/android/c++/JAppleAuthResultType.hpp +58 -0
  150. package/nitrogen/generated/android/c++/JAppleAuthScope.hpp +58 -0
  151. package/nitrogen/generated/android/c++/JAppleAuthSignInOptions.hpp +87 -0
  152. package/nitrogen/generated/android/c++/JAppleCredentialState.hpp +64 -0
  153. package/nitrogen/generated/android/c++/JAppleRealUserStatus.hpp +61 -0
  154. package/nitrogen/generated/android/c++/JBrowserAuthResultType.hpp +3 -3
  155. package/nitrogen/generated/android/c++/JBrowserColorScheme.hpp +61 -0
  156. package/nitrogen/generated/android/c++/JBrowserNativeOptions.hpp +13 -3
  157. package/nitrogen/generated/android/c++/JFunc_void_SpeechEvent.hpp +83 -0
  158. package/nitrogen/generated/android/c++/JHybridOneAppleAuthSpec.cpp +120 -0
  159. package/nitrogen/generated/android/c++/JHybridOneAppleAuthSpec.hpp +65 -0
  160. package/nitrogen/generated/android/c++/JHybridOneBrowserSpec.cpp +36 -0
  161. package/nitrogen/generated/android/c++/JHybridOneBrowserSpec.hpp +2 -0
  162. package/nitrogen/generated/android/c++/JHybridOneSpeechSpec.cpp +126 -0
  163. package/nitrogen/generated/android/c++/JHybridOneSpeechSpec.hpp +68 -0
  164. package/nitrogen/generated/android/c++/JSpeechErrorCode.hpp +76 -0
  165. package/nitrogen/generated/android/c++/JSpeechEvent.hpp +74 -0
  166. package/nitrogen/generated/android/c++/JSpeechEventType.hpp +64 -0
  167. package/nitrogen/generated/android/c++/JSpeechPermissionResponse.hpp +71 -0
  168. package/nitrogen/generated/android/c++/JSpeechPermissionStatus.hpp +61 -0
  169. package/nitrogen/generated/android/c++/JSpeechStartOptions.hpp +58 -0
  170. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthCredential.kt +81 -0
  171. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthFullName.kt +76 -0
  172. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthResult.kt +56 -0
  173. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthResultType.kt +23 -0
  174. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthScope.kt +23 -0
  175. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleAuthSignInOptions.kt +61 -0
  176. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleCredentialState.kt +25 -0
  177. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AppleRealUserStatus.kt +24 -0
  178. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/BrowserAuthResultType.kt +5 -5
  179. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/BrowserColorScheme.kt +24 -0
  180. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/BrowserNativeOptions.kt +14 -4
  181. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/Func_void_SpeechEvent.kt +78 -0
  182. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneAppleAuthSpec.kt +65 -0
  183. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneBrowserSpec.kt +8 -0
  184. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneSpeechSpec.kt +82 -0
  185. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechErrorCode.kt +29 -0
  186. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechEvent.kt +66 -0
  187. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechEventType.kt +25 -0
  188. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechPermissionResponse.kt +66 -0
  189. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechPermissionStatus.kt +24 -0
  190. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SpeechStartOptions.kt +51 -0
  191. package/nitrogen/generated/ios/One-Swift-Cxx-Bridge.cpp +74 -8
  192. package/nitrogen/generated/ios/One-Swift-Cxx-Bridge.hpp +362 -52
  193. package/nitrogen/generated/ios/One-Swift-Cxx-Umbrella.hpp +55 -0
  194. package/nitrogen/generated/ios/OneAutolinking.mm +16 -0
  195. package/nitrogen/generated/ios/OneAutolinking.swift +24 -0
  196. package/nitrogen/generated/ios/c++/HybridOneAppleAuthSpecSwift.cpp +11 -0
  197. package/nitrogen/generated/ios/c++/HybridOneAppleAuthSpecSwift.hpp +124 -0
  198. package/nitrogen/generated/ios/c++/HybridOneBrowserSpecSwift.hpp +19 -0
  199. package/nitrogen/generated/ios/c++/HybridOneSpeechSpecSwift.cpp +11 -0
  200. package/nitrogen/generated/ios/c++/HybridOneSpeechSpecSwift.hpp +136 -0
  201. package/nitrogen/generated/ios/swift/AppleAuthCredential.swift +117 -0
  202. package/nitrogen/generated/ios/swift/AppleAuthFullName.swift +132 -0
  203. package/nitrogen/generated/ios/swift/AppleAuthResult.swift +40 -0
  204. package/nitrogen/generated/ios/swift/AppleAuthResultType.swift +40 -0
  205. package/nitrogen/generated/ios/swift/AppleAuthScope.swift +40 -0
  206. package/nitrogen/generated/ios/swift/AppleAuthSignInOptions.swift +84 -0
  207. package/nitrogen/generated/ios/swift/AppleCredentialState.swift +48 -0
  208. package/nitrogen/generated/ios/swift/AppleRealUserStatus.swift +44 -0
  209. package/nitrogen/generated/ios/swift/BrowserAuthResultType.swift +4 -4
  210. package/nitrogen/generated/ios/swift/BrowserColorScheme.swift +44 -0
  211. package/nitrogen/generated/ios/swift/BrowserNativeOptions.swift +30 -1
  212. package/nitrogen/generated/ios/swift/Func_void_AppleAuthResult.swift +46 -0
  213. package/nitrogen/generated/ios/swift/Func_void_AppleCredentialState.swift +46 -0
  214. package/nitrogen/generated/ios/swift/Func_void_SpeechEvent.swift +46 -0
  215. package/nitrogen/generated/ios/swift/Func_void_SpeechPermissionResponse.swift +46 -0
  216. package/nitrogen/generated/ios/swift/HybridOneAppleAuthSpec.swift +57 -0
  217. package/nitrogen/generated/ios/swift/HybridOneAppleAuthSpec_cxx.swift +176 -0
  218. package/nitrogen/generated/ios/swift/HybridOneBrowserSpec.swift +2 -0
  219. package/nitrogen/generated/ios/swift/HybridOneBrowserSpec_cxx.swift +52 -0
  220. package/nitrogen/generated/ios/swift/HybridOneSpeechSpec.swift +60 -0
  221. package/nitrogen/generated/ios/swift/HybridOneSpeechSpec_cxx.swift +214 -0
  222. package/nitrogen/generated/ios/swift/SpeechErrorCode.swift +64 -0
  223. package/nitrogen/generated/ios/swift/SpeechEvent.swift +63 -0
  224. package/nitrogen/generated/ios/swift/SpeechEventType.swift +48 -0
  225. package/nitrogen/generated/ios/swift/SpeechPermissionResponse.swift +57 -0
  226. package/nitrogen/generated/ios/swift/SpeechPermissionStatus.swift +44 -0
  227. package/nitrogen/generated/ios/swift/SpeechStartOptions.swift +42 -0
  228. package/nitrogen/generated/shared/c++/AppleAuthCredential.hpp +113 -0
  229. package/nitrogen/generated/shared/c++/AppleAuthFullName.hpp +104 -0
  230. package/nitrogen/generated/shared/c++/AppleAuthResult.hpp +92 -0
  231. package/nitrogen/generated/shared/c++/AppleAuthResultType.hpp +76 -0
  232. package/nitrogen/generated/shared/c++/AppleAuthScope.hpp +76 -0
  233. package/nitrogen/generated/shared/c++/AppleAuthSignInOptions.hpp +95 -0
  234. package/nitrogen/generated/shared/c++/AppleCredentialState.hpp +84 -0
  235. package/nitrogen/generated/shared/c++/AppleRealUserStatus.hpp +80 -0
  236. package/nitrogen/generated/shared/c++/BrowserAuthResultType.hpp +8 -8
  237. package/nitrogen/generated/shared/c++/BrowserColorScheme.hpp +80 -0
  238. package/nitrogen/generated/shared/c++/BrowserNativeOptions.hpp +13 -2
  239. package/nitrogen/generated/shared/c++/HybridOneAppleAuthSpec.cpp +23 -0
  240. package/nitrogen/generated/shared/c++/HybridOneAppleAuthSpec.hpp +73 -0
  241. package/nitrogen/generated/shared/c++/HybridOneBrowserSpec.cpp +2 -0
  242. package/nitrogen/generated/shared/c++/HybridOneBrowserSpec.hpp +2 -0
  243. package/nitrogen/generated/shared/c++/HybridOneSpeechSpec.cpp +26 -0
  244. package/nitrogen/generated/shared/c++/HybridOneSpeechSpec.hpp +76 -0
  245. package/nitrogen/generated/shared/c++/SpeechErrorCode.hpp +100 -0
  246. package/nitrogen/generated/shared/c++/SpeechEvent.hpp +101 -0
  247. package/nitrogen/generated/shared/c++/SpeechEventType.hpp +84 -0
  248. package/nitrogen/generated/shared/c++/SpeechPermissionResponse.hpp +97 -0
  249. package/nitrogen/generated/shared/c++/SpeechPermissionStatus.hpp +80 -0
  250. package/nitrogen/generated/shared/c++/SpeechStartOptions.hpp +84 -0
  251. package/package.json +10 -10
  252. package/react-native-config.cjs +24 -4
  253. package/schema.json +6 -0
  254. package/src/native/packedClosure.test.ts +7 -0
  255. package/src/nativeCoverage.test.ts +193 -0
  256. package/src/one.ts +6 -0
  257. package/src/platform/README.md +79 -2
  258. package/src/platform/Tabs.native.tsx +2 -0
  259. package/src/platform/auth/index.native.ts +61 -0
  260. package/src/platform/auth/index.ts +16 -0
  261. package/src/platform/auth/types.ts +49 -0
  262. package/src/platform/browser/index.native.ts +26 -26
  263. package/src/platform/browser/index.ts +16 -1
  264. package/src/platform/browser/types.ts +5 -0
  265. package/src/platform/browser/validate.ts +12 -0
  266. package/src/platform/extras.ts +21 -0
  267. package/src/platform/generated/Controls.native.tsx +12 -2
  268. package/src/platform/generated/controlTypes.ts +2 -0
  269. package/src/platform/nativeError.ts +7 -7
  270. package/src/platform/specs/OneAppleAuth.nitro.ts +49 -0
  271. package/src/platform/specs/OneBrowser.nitro.ts +6 -1
  272. package/src/platform/specs/OneNativeImageNativeComponent.ts +1 -0
  273. package/src/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.ts +1 -0
  274. package/src/platform/specs/OneSpeech.nitro.ts +14 -0
  275. package/src/platform/speech/index.native.ts +50 -0
  276. package/src/platform/speech/index.ts +25 -0
  277. package/src/platform/speech/types.ts +46 -0
  278. package/src/platform/types.ts +4 -1
  279. package/src/safe-area-context/SafeAreaContext.tsx +12 -1
  280. package/src/safe-area-context/tamaguiSafeArea.native.ts +56 -0
  281. package/src/safe-area-context/tamaguiSafeArea.ts +8 -0
  282. package/src/utils/absorbedPackages.ts +16 -5
  283. package/types/one.d.ts +3 -1
  284. package/types/one.d.ts.map +1 -1
  285. package/types/platform/Tabs.native.d.ts.map +1 -1
  286. package/types/platform/auth/index.d.ts +6 -0
  287. package/types/platform/auth/index.d.ts.map +1 -0
  288. package/types/platform/auth/index.native.d.ts +6 -0
  289. package/types/platform/auth/index.native.d.ts.map +1 -0
  290. package/types/platform/auth/types.d.ts +37 -0
  291. package/types/platform/auth/types.d.ts.map +1 -0
  292. package/types/platform/browser/index.d.ts +4 -0
  293. package/types/platform/browser/index.d.ts.map +1 -1
  294. package/types/platform/browser/index.native.d.ts +4 -0
  295. package/types/platform/browser/index.native.d.ts.map +1 -1
  296. package/types/platform/browser/types.d.ts +3 -0
  297. package/types/platform/browser/types.d.ts.map +1 -1
  298. package/types/platform/browser/validate.d.ts.map +1 -1
  299. package/types/platform/extras.d.ts +4 -0
  300. package/types/platform/extras.d.ts.map +1 -1
  301. package/types/platform/generated/Controls.native.d.ts +2 -2
  302. package/types/platform/generated/Controls.native.d.ts.map +1 -1
  303. package/types/platform/generated/controlTypes.d.ts +2 -0
  304. package/types/platform/generated/controlTypes.d.ts.map +1 -1
  305. package/types/platform/index.native.d.ts +2 -2
  306. package/types/platform/nativeError.d.ts.map +1 -1
  307. package/types/platform/specs/OneAppleAuth.nitro.d.ts +40 -0
  308. package/types/platform/specs/OneAppleAuth.nitro.d.ts.map +1 -0
  309. package/types/platform/specs/OneBrowser.nitro.d.ts +5 -1
  310. package/types/platform/specs/OneBrowser.nitro.d.ts.map +1 -1
  311. package/types/platform/specs/OneNativeImageNativeComponent.d.ts +1 -0
  312. package/types/platform/specs/OneNativeImageNativeComponent.d.ts.map +1 -1
  313. package/types/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.d.ts +1 -0
  314. package/types/platform/specs/OneNativeSignInWithAppleButtonNativeComponent.d.ts.map +1 -1
  315. package/types/platform/specs/OneSpeech.nitro.d.ts +14 -0
  316. package/types/platform/specs/OneSpeech.nitro.d.ts.map +1 -0
  317. package/types/platform/speech/index.d.ts +9 -0
  318. package/types/platform/speech/index.d.ts.map +1 -0
  319. package/types/platform/speech/index.native.d.ts +10 -0
  320. package/types/platform/speech/index.native.d.ts.map +1 -0
  321. package/types/platform/speech/types.d.ts +23 -0
  322. package/types/platform/speech/types.d.ts.map +1 -0
  323. package/types/platform/types.d.ts +2 -1
  324. package/types/platform/types.d.ts.map +1 -1
  325. package/types/safe-area-context/SafeAreaContext.d.ts.map +1 -1
  326. package/types/safe-area-context/tamaguiSafeArea.d.ts +6 -0
  327. package/types/safe-area-context/tamaguiSafeArea.d.ts.map +1 -0
  328. package/types/safe-area-context/tamaguiSafeArea.native.d.ts +6 -0
  329. package/types/safe-area-context/tamaguiSafeArea.native.d.ts.map +1 -0
  330. package/types/utils/absorbedPackages.d.ts +1 -0
  331. package/types/utils/absorbedPackages.d.ts.map +1 -1
@@ -129,7 +129,7 @@ def kotlinVersion = safeExtGet("kotlinVersion", "2.1.20")
129
129
 
130
130
  dependencies {
131
131
  implementation "com.facebook.react:react-android"
132
- implementation "androidx.browser:browser:1.8.0"
132
+ implementation "androidx.browser:browser:1.9.0"
133
133
  implementation "com.google.android.material:material:1.13.0"
134
134
  implementation "androidx.activity:activity:1.9.3"
135
135
  implementation "androidx.core:core:1.13.1"
@@ -2,6 +2,13 @@
2
2
  <!-- normal install-time permission, merged into the app manifest;
3
3
  the api-conventions section 6 exception for install-time permissions -->
4
4
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
5
+ <!-- android 11 package visibility: Browser finds the Custom Tabs browser
6
+ through this service action -->
7
+ <queries>
8
+ <intent>
9
+ <action android:name="android.support.customtabs.action.CustomTabsService" />
10
+ </intent>
11
+ </queries>
5
12
  <!-- camera captures write into the app cache through this provider; the
6
13
  manifest merger carries it into the app, with the app's own id. -->
7
14
  <application>
@@ -0,0 +1,19 @@
1
+ package com.margelo.nitro.one
2
+
3
+ import com.margelo.nitro.core.Promise
4
+
5
+ // android has no native sign in with apple, so it answers the way the web entry
6
+ // does: unavailable, and every request rejects without a code.
7
+ class HybridOneAppleAuth : HybridOneAppleAuthSpec() {
8
+ override fun isAvailable(): Boolean {
9
+ return false
10
+ }
11
+
12
+ override fun signIn(options: AppleAuthSignInOptions): Promise<AppleAuthResult> {
13
+ return Promise.rejected(OneNativeError("Auth.Apple.signIn needs an iOS build"))
14
+ }
15
+
16
+ override fun getCredentialState(user: String): Promise<AppleCredentialState> {
17
+ return Promise.rejected(OneNativeError("Auth.Apple.getCredentialState needs an iOS build"))
18
+ }
19
+ }
@@ -1,30 +1,45 @@
1
1
  package com.margelo.nitro.one
2
2
 
3
3
  import android.app.Activity
4
+ import android.content.ComponentName
5
+ import android.content.Context
4
6
  import android.content.Intent
5
7
  import android.graphics.Color
6
8
  import android.net.Uri
9
+ import androidx.browser.auth.AuthTabColorSchemeParams
10
+ import androidx.browser.auth.AuthTabIntent
7
11
  import androidx.browser.customtabs.CustomTabColorSchemeParams
12
+ import androidx.browser.customtabs.CustomTabsClient
8
13
  import androidx.browser.customtabs.CustomTabsIntent
14
+ import androidx.browser.customtabs.CustomTabsServiceConnection
15
+ import androidx.browser.customtabs.CustomTabsSession
9
16
  import com.facebook.react.bridge.ActivityEventListener
10
17
  import com.facebook.react.bridge.LifecycleEventListener
11
18
  import com.margelo.nitro.NitroModules
12
19
  import com.margelo.nitro.core.Promise
13
20
 
14
- // in-app browser matching expo-web-browser's result shapes: pages and auth
15
- // both open in Custom Tabs; an app redirect back completes the auth session.
16
- // calls arrive on the js thread and lifecycle callbacks on the ui thread, so
17
- // the pending session is only read or replaced under the lock.
21
+ // in-app browser matching expo-web-browser's result shapes:
22
+ // plain pages in Custom Tabs, auth in modern androidx.browser AuthTabIntent
23
+ // (with graceful fallback to Custom Tabs on older browsers).
24
+ // supports warmup, mayLaunchUrl, and dark appearance color scheme params.
18
25
  class HybridOneBrowser : HybridOneBrowserSpec(), ActivityEventListener, LifecycleEventListener {
19
26
  private val lock = Any()
20
27
  private var authPromise: Promise<BrowserAuthResult>? = null
21
28
  private var authScheme: String? = null
22
29
 
30
+ private var customTabsClient: CustomTabsClient? = null
31
+ private var customTabsSession: CustomTabsSession? = null
32
+
33
+ companion object {
34
+ private const val AUTH_TAB_REQUEST_CODE = 4281
35
+ }
36
+
23
37
  init {
24
38
  NitroModules.applicationContext?.let {
25
39
  it.addActivityEventListener(this)
26
40
  it.addLifecycleEventListener(this)
27
41
  }
42
+ ensureClient(null)
28
43
  }
29
44
 
30
45
  override fun dispose() {
@@ -79,10 +94,12 @@ class HybridOneBrowser : HybridOneBrowserSpec(), ActivityEventListener, Lifecycl
79
94
  try {
80
95
  authScheme = redirectUrl?.let { Uri.parse(it)?.scheme }
81
96
  authPromise = promise
82
- launchCustomTab(activity, url, options)
83
- // the promise settles on redirect (onNewIntent), on
84
- // programmatic dismiss, or when the user returns without one
85
- // (onHostResume).
97
+ launchAuthTab(activity, url, redirectUrl, options)
98
+ // the promise settles on:
99
+ // 1. onActivityResult when AuthTab completes with direct result
100
+ // 2. onNewIntent when fallback CustomTab redirects back
101
+ // 3. onHostResume when user closes tab without redirect
102
+ // 4. dismissAuthSession
86
103
  } catch (e: Exception) {
87
104
  authPromise = null
88
105
  authScheme = null
@@ -93,11 +110,25 @@ class HybridOneBrowser : HybridOneBrowserSpec(), ActivityEventListener, Lifecycl
93
110
  }
94
111
 
95
112
  override fun dismissAuthSession() {
96
- // the tab itself stays open, like dismiss; the pending session
97
- // settles as dismiss on both platforms.
98
113
  takeAuth()?.resolve(result(BrowserAuthResultType.DISMISS))
99
114
  }
100
115
 
116
+ override fun warmup(browserPackage: String?): Promise<Boolean> {
117
+ val promise = Promise<Boolean>()
118
+ ensureClient(browserPackage) { client -> promise.resolve(client?.warmup(0L) ?: false) }
119
+ return promise
120
+ }
121
+
122
+ override fun mayLaunchUrl(url: String, browserPackage: String?): Promise<Boolean> {
123
+ val promise = Promise<Boolean>()
124
+ ensureClient(browserPackage) { client ->
125
+ val session = customTabsSession ?: client?.newSession(null)
126
+ customTabsSession = session
127
+ promise.resolve(session?.mayLaunchUrl(Uri.parse(url), null, null) ?: false)
128
+ }
129
+ return promise
130
+ }
131
+
101
132
  override fun onNewIntent(intent: Intent) {
102
133
  val data = intent.data ?: return
103
134
  val pending = synchronized(lock) {
@@ -117,11 +148,29 @@ class HybridOneBrowser : HybridOneBrowserSpec(), ActivityEventListener, Lifecycl
117
148
  resultCode: Int,
118
149
  data: Intent?
119
150
  ) {
151
+ if (requestCode == AUTH_TAB_REQUEST_CODE) {
152
+ val pending = synchronized(lock) {
153
+ val p = authPromise ?: return
154
+ authPromise = null
155
+ authScheme = null
156
+ p
157
+ }
158
+ if (resultCode == Activity.RESULT_OK) {
159
+ val resultUri = data?.data?.toString()
160
+ if (resultUri != null) {
161
+ pending.resolve(result(BrowserAuthResultType.SUCCESS, resultUri))
162
+ } else {
163
+ pending.resolve(result(BrowserAuthResultType.CANCEL))
164
+ }
165
+ } else {
166
+ pending.resolve(result(BrowserAuthResultType.CANCEL))
167
+ }
168
+ }
120
169
  }
121
170
 
122
171
  override fun onHostResume() {
123
- // onNewIntent runs before onHostResume for a redirect, so a pending
124
- // promise here means the user closed the tab without redirecting.
172
+ // onActivityResult and onNewIntent run before onHostResume,
173
+ // so a pending promise here means the user closed the tab without redirecting.
125
174
  takeAuth()?.resolve(result(BrowserAuthResultType.CANCEL))
126
175
  }
127
176
 
@@ -139,23 +188,110 @@ class HybridOneBrowser : HybridOneBrowserSpec(), ActivityEventListener, Lifecycl
139
188
  pending
140
189
  }
141
190
 
191
+ // calls onReady exactly once: with the bound client, or with null when no
192
+ // installed browser offers the Custom Tabs service or binding it fails
193
+ private fun ensureClient(browserPackage: String?, onReady: (CustomTabsClient?) -> Unit = {}) {
194
+ customTabsClient?.let { return onReady(it) }
195
+ val context = NitroModules.applicationContext ?: return onReady(null)
196
+ val targetPackage = browserPackage ?: CustomTabsClient.getPackageName(context, null)
197
+ ?: return onReady(null)
198
+ val connection = object : CustomTabsServiceConnection() {
199
+ override fun onCustomTabsServiceConnected(name: ComponentName, connectedClient: CustomTabsClient) {
200
+ customTabsClient = connectedClient
201
+ customTabsSession = connectedClient.newSession(null)
202
+ onReady(connectedClient)
203
+ }
204
+ override fun onServiceDisconnected(name: ComponentName) {
205
+ customTabsClient = null
206
+ customTabsSession = null
207
+ }
208
+ }
209
+ if (!CustomTabsClient.bindCustomTabsService(context, targetPackage, connection)) onReady(null)
210
+ }
211
+
142
212
  private fun launchCustomTab(activity: Activity, url: String, options: BrowserNativeOptions) {
143
- val builder = CustomTabsIntent.Builder()
213
+ val session = customTabsSession
214
+ val builder = if (session != null) CustomTabsIntent.Builder(session) else CustomTabsIntent.Builder()
144
215
  if (options.showTitle == true) {
145
216
  builder.setShowTitle(true)
146
217
  }
147
- options.toolbarColor?.let { raw ->
148
- colorForHex(raw)?.let { toolbar ->
149
- builder.setDefaultColorSchemeParams(
150
- CustomTabColorSchemeParams.Builder().setToolbarColor(toolbar).build()
151
- )
152
- }
153
- }
218
+ applyColorScheme(builder, options)
154
219
  val customTabs = builder.build()
155
220
  options.browserPackage?.let { customTabs.intent.setPackage(it) }
156
221
  customTabs.launchUrl(activity, Uri.parse(url))
157
222
  }
158
223
 
224
+ private fun launchAuthTab(
225
+ activity: Activity,
226
+ url: String,
227
+ redirectUrl: String?,
228
+ options: BrowserNativeOptions
229
+ ) {
230
+ val authBuilder = AuthTabIntent.Builder()
231
+ if (options.preferEphemeralSession == true) {
232
+ authBuilder.setEphemeralBrowsingEnabled(true)
233
+ }
234
+ when (options.colorScheme) {
235
+ BrowserColorScheme.DARK -> authBuilder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_DARK)
236
+ BrowserColorScheme.LIGHT -> authBuilder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_LIGHT)
237
+ BrowserColorScheme.SYSTEM, null -> authBuilder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_SYSTEM)
238
+ }
239
+ val defaultParams = AuthTabColorSchemeParams.Builder()
240
+ options.toolbarColor?.let { raw ->
241
+ colorForHex(raw)?.let { defaultParams.setToolbarColor(it) }
242
+ }
243
+ authBuilder.setDefaultColorSchemeParams(defaultParams.build())
244
+
245
+ val authTabIntent = authBuilder.build()
246
+ val intent = authTabIntent.intent
247
+ intent.data = Uri.parse(url)
248
+ options.browserPackage?.let { intent.setPackage(it) }
249
+
250
+ if (redirectUrl != null) {
251
+ val redirectUri = Uri.parse(redirectUrl)
252
+ val scheme = redirectUri.scheme?.lowercase()
253
+ if (scheme == "https" || scheme == "http") {
254
+ val host = redirectUri.host
255
+ val path = redirectUri.path ?: "/"
256
+ if (host != null) {
257
+ intent.putExtra(AuthTabIntent.EXTRA_HTTPS_REDIRECT_HOST, host)
258
+ intent.putExtra(AuthTabIntent.EXTRA_HTTPS_REDIRECT_PATH, path)
259
+ }
260
+ } else if (scheme != null && scheme.isNotEmpty()) {
261
+ intent.putExtra(AuthTabIntent.EXTRA_REDIRECT_SCHEME, scheme)
262
+ }
263
+ }
264
+
265
+ activity.startActivityForResult(intent, AUTH_TAB_REQUEST_CODE)
266
+ }
267
+
268
+ private fun applyColorScheme(builder: CustomTabsIntent.Builder, options: BrowserNativeOptions) {
269
+ when (options.colorScheme) {
270
+ BrowserColorScheme.DARK -> builder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_DARK)
271
+ BrowserColorScheme.LIGHT -> builder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_LIGHT)
272
+ BrowserColorScheme.SYSTEM, null -> builder.setColorScheme(CustomTabsIntent.COLOR_SCHEME_SYSTEM)
273
+ }
274
+ val defaultParams = CustomTabColorSchemeParams.Builder()
275
+ options.toolbarColor?.let { raw ->
276
+ colorForHex(raw)?.let { defaultParams.setToolbarColor(it) }
277
+ }
278
+ options.secondaryToolbarColor?.let { raw ->
279
+ colorForHex(raw)?.let { defaultParams.setSecondaryToolbarColor(it) }
280
+ }
281
+ builder.setDefaultColorSchemeParams(defaultParams.build())
282
+
283
+ if (options.colorScheme == BrowserColorScheme.DARK || options.colorScheme == BrowserColorScheme.SYSTEM) {
284
+ val darkParams = CustomTabColorSchemeParams.Builder()
285
+ options.toolbarColor?.let { raw ->
286
+ colorForHex(raw)?.let { darkParams.setToolbarColor(it) }
287
+ }
288
+ options.secondaryToolbarColor?.let { raw ->
289
+ colorForHex(raw)?.let { darkParams.setSecondaryToolbarColor(it) }
290
+ }
291
+ builder.setColorSchemeParams(CustomTabsIntent.COLOR_SCHEME_DARK, darkParams.build())
292
+ }
293
+ }
294
+
159
295
  private fun colorForHex(value: String): Int? {
160
296
  return try {
161
297
  Color.parseColor(value)
@@ -0,0 +1,270 @@
1
+ package com.margelo.nitro.one
2
+
3
+ import android.Manifest
4
+ import android.app.Activity
5
+ import android.content.Intent
6
+ import android.content.pm.PackageManager
7
+ import android.os.Build
8
+ import android.os.Bundle
9
+ import android.os.Handler
10
+ import android.os.Looper
11
+ import android.speech.RecognitionListener
12
+ import android.speech.RecognizerIntent
13
+ import android.speech.SpeechRecognizer
14
+ import androidx.core.app.ActivityCompat
15
+ import androidx.core.content.ContextCompat
16
+ import com.facebook.react.bridge.ReactApplicationContext
17
+ import com.facebook.react.modules.core.PermissionAwareActivity
18
+ import com.facebook.react.modules.core.PermissionListener
19
+ import com.margelo.nitro.NitroModules
20
+ import com.margelo.nitro.core.Promise
21
+
22
+ // dictation behind One.Speech: the system SpeechRecognizer with partial
23
+ // results, one utterance per session, ending on the recognizer's own
24
+ // end-of-speech detection or on stop. needs RECORD_AUDIO, which one prebuild
25
+ // writes from native.app speech. SpeechRecognizer must be driven from the
26
+ // main thread, so every call hops there and all session state lives on it.
27
+ // the system shares one recognition service connection per app, and
28
+ // destroying any recognizer drops it under whichever session runs next, so
29
+ // recognizers are destroyed only on dispose. a session that ends on its own
30
+ // leaves its recognizer for the next one. cancelling a live session makes the
31
+ // service report the cancellation late, through the recognizer's single
32
+ // listener binder, so a cancelled recognizer is retired and never reused.
33
+ class HybridOneSpeech : HybridOneSpeechSpec(), PermissionListener {
34
+ private class Session(val onEvent: (SpeechEvent) -> Unit) {
35
+ var transcript = ""
36
+ }
37
+
38
+ private val main = Handler(Looper.getMainLooper())
39
+ private var recognizer: SpeechRecognizer? = null
40
+ private val retired = mutableListOf<SpeechRecognizer>()
41
+ private var session: Session? = null
42
+ private var pendingPermission: Promise<SpeechPermissionResponse>? = null
43
+
44
+ private val context: ReactApplicationContext
45
+ get() = NitroModules.applicationContext
46
+ ?: throw IllegalStateException("Speech: the react context is not ready")
47
+
48
+ override fun isAvailable(): Boolean = SpeechRecognizer.isRecognitionAvailable(context)
49
+
50
+ override fun getPermissions(): Promise<SpeechPermissionResponse> =
51
+ Promise.resolved(permissionResponse())
52
+
53
+ override fun requestPermissions(): Promise<SpeechPermissionResponse> {
54
+ if (!isMicrophoneDeclared()) {
55
+ return Promise.rejected(
56
+ OneNativeError(
57
+ E_FAILED,
58
+ "Speech.requestPermissions: dictation needs the RECORD_AUDIO permission: " +
59
+ "set native.app speech and rerun one prebuild"
60
+ )
61
+ )
62
+ }
63
+ if (isGranted()) return Promise.resolved(permissionResponse())
64
+ val aware = context.currentActivity as? PermissionAwareActivity
65
+ ?: return Promise.rejected(
66
+ OneNativeError(E_FAILED, "Speech.requestPermissions: found no activity to prompt from")
67
+ )
68
+ val promise = Promise<SpeechPermissionResponse>()
69
+ synchronized(this) {
70
+ if (pendingPermission != null) {
71
+ return Promise.rejected(
72
+ OneNativeError(E_FAILED, "Speech.requestPermissions: another request is already in flight")
73
+ )
74
+ }
75
+ pendingPermission = promise
76
+ }
77
+ context.getSharedPreferences(PREFS, Activity.MODE_PRIVATE)
78
+ .edit()
79
+ .putBoolean(ASKED_KEY, true)
80
+ .apply()
81
+ aware.requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), REQUEST_PERMISSION, this)
82
+ return promise
83
+ }
84
+
85
+ override fun onRequestPermissionsResult(
86
+ requestCode: Int,
87
+ permissions: Array<String>,
88
+ grantResults: IntArray
89
+ ): Boolean {
90
+ if (requestCode != REQUEST_PERMISSION) return false
91
+ val pending = synchronized(this) {
92
+ val pending = pendingPermission
93
+ pendingPermission = null
94
+ pending
95
+ }
96
+ pending?.resolve(permissionResponse())
97
+ return true
98
+ }
99
+
100
+ override fun dispose() {
101
+ main.post {
102
+ session = null
103
+ retire()
104
+ retired.forEach { it.destroy() }
105
+ retired.clear()
106
+ }
107
+ super.dispose()
108
+ }
109
+
110
+ override fun start(options: SpeechStartOptions, onEvent: (SpeechEvent) -> Unit) {
111
+ main.post { begin(options, onEvent) }
112
+ }
113
+
114
+ override fun stop() {
115
+ // the recognizer answers with its final result, which ends the session
116
+ main.post { if (session != null) recognizer?.stopListening() }
117
+ }
118
+
119
+ override fun abort() {
120
+ main.post {
121
+ if (session == null) return@post
122
+ session = null
123
+ retire()
124
+ }
125
+ }
126
+
127
+ private fun begin(options: SpeechStartOptions, onEvent: (SpeechEvent) -> Unit) {
128
+ if (session != null) retire()
129
+ val current = Session(onEvent)
130
+ session = current
131
+ if (!SpeechRecognizer.isRecognitionAvailable(context)) {
132
+ fail(SpeechErrorCode.SERVICE_NOT_ALLOWED, "Speech recognition is unavailable on this device.")
133
+ return
134
+ }
135
+ if (!isGranted()) {
136
+ fail(SpeechErrorCode.NOT_ALLOWED, "Dictation needs microphone permission.")
137
+ return
138
+ }
139
+ val active = recognizer
140
+ ?: SpeechRecognizer.createSpeechRecognizer(context).also { recognizer = it }
141
+ active.setRecognitionListener(object : RecognitionListener {
142
+ override fun onReadyForSpeech(params: Bundle?) {
143
+ if (session !== current) return
144
+ current.onEvent(SpeechEvent(SpeechEventType.START, "", null, null))
145
+ }
146
+
147
+ override fun onPartialResults(partialResults: Bundle?) {
148
+ if (session !== current) return
149
+ val text = best(partialResults) ?: return
150
+ if (text == current.transcript) return
151
+ current.transcript = text
152
+ current.onEvent(SpeechEvent(SpeechEventType.TRANSCRIPT, text, null, null))
153
+ }
154
+
155
+ override fun onResults(results: Bundle?) {
156
+ if (session !== current) return
157
+ val text = best(results)
158
+ if (text != null && text != current.transcript) {
159
+ current.transcript = text
160
+ current.onEvent(SpeechEvent(SpeechEventType.TRANSCRIPT, text, null, null))
161
+ }
162
+ finish()
163
+ }
164
+
165
+ override fun onError(error: Int) {
166
+ if (session !== current) return
167
+ when (error) {
168
+ // nothing heard ends the session with what it has
169
+ SpeechRecognizer.ERROR_NO_MATCH, SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> finish()
170
+ SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS ->
171
+ fail(SpeechErrorCode.NOT_ALLOWED, "Dictation needs microphone permission.")
172
+ SpeechRecognizer.ERROR_NETWORK,
173
+ SpeechRecognizer.ERROR_NETWORK_TIMEOUT,
174
+ SpeechRecognizer.ERROR_SERVER,
175
+ SpeechRecognizer.ERROR_SERVER_DISCONNECTED ->
176
+ fail(SpeechErrorCode.NETWORK, "The speech service could not be reached.")
177
+ SpeechRecognizer.ERROR_AUDIO ->
178
+ fail(SpeechErrorCode.AUDIO_CAPTURE, "Audio recording failed.")
179
+ SpeechRecognizer.ERROR_RECOGNIZER_BUSY, SpeechRecognizer.ERROR_TOO_MANY_REQUESTS ->
180
+ fail(SpeechErrorCode.BUSY, "The speech service is busy.")
181
+ SpeechRecognizer.ERROR_LANGUAGE_NOT_SUPPORTED, SpeechRecognizer.ERROR_LANGUAGE_UNAVAILABLE ->
182
+ fail(SpeechErrorCode.LANGUAGE_NOT_SUPPORTED, "Speech recognition does not support this language.")
183
+ else -> fail(SpeechErrorCode.UNKNOWN, "Speech recognition failed with code $error.")
184
+ }
185
+ }
186
+
187
+ override fun onBeginningOfSpeech() {}
188
+ override fun onRmsChanged(rmsdB: Float) {}
189
+ override fun onBufferReceived(buffer: ByteArray?) {}
190
+ override fun onEndOfSpeech() {}
191
+ override fun onEvent(eventType: Int, params: Bundle?) {}
192
+ })
193
+ val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
194
+ putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
195
+ putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
196
+ putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
197
+ putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.packageName)
198
+ options.lang?.let { putExtra(RecognizerIntent.EXTRA_LANGUAGE, it) }
199
+ }
200
+ active.startListening(intent)
201
+ }
202
+
203
+ private fun retire() {
204
+ val live = recognizer ?: return
205
+ recognizer = null
206
+ live.cancel()
207
+ retired += live
208
+ }
209
+
210
+ private fun best(results: Bundle?): String? =
211
+ results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)?.firstOrNull()
212
+
213
+ private fun finish() {
214
+ val current = session ?: return
215
+ session = null
216
+ current.onEvent(SpeechEvent(SpeechEventType.END, current.transcript, null, null))
217
+ }
218
+
219
+ private fun fail(code: SpeechErrorCode, message: String) {
220
+ val current = session ?: return
221
+ session = null
222
+ current.onEvent(SpeechEvent(SpeechEventType.ERROR, current.transcript, code, message))
223
+ }
224
+
225
+ private fun isGranted(): Boolean =
226
+ ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) ==
227
+ PackageManager.PERMISSION_GRANTED
228
+
229
+ // granted, or denied with rationale: both are known states. otherwise
230
+ // the asked flag separates the undetermined first run from a permanent
231
+ // denial, which the platform reports identically.
232
+ private fun permissionResponse(): SpeechPermissionResponse {
233
+ if (isGranted()) {
234
+ return SpeechPermissionResponse(SpeechPermissionStatus.GRANTED, true, true, false)
235
+ }
236
+ val activity = context.currentActivity
237
+ if (
238
+ activity != null &&
239
+ ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.RECORD_AUDIO)
240
+ ) {
241
+ return SpeechPermissionResponse(SpeechPermissionStatus.DENIED, false, true, false)
242
+ }
243
+ val asked = context.getSharedPreferences(PREFS, Activity.MODE_PRIVATE).getBoolean(ASKED_KEY, false)
244
+ return if (asked) {
245
+ SpeechPermissionResponse(SpeechPermissionStatus.DENIED, false, false, false)
246
+ } else {
247
+ SpeechPermissionResponse(SpeechPermissionStatus.UNDETERMINED, false, true, false)
248
+ }
249
+ }
250
+
251
+ private fun isMicrophoneDeclared(): Boolean {
252
+ val info = if (Build.VERSION.SDK_INT >= 33) {
253
+ context.packageManager.getPackageInfo(
254
+ context.packageName,
255
+ PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS.toLong())
256
+ )
257
+ } else {
258
+ @Suppress("DEPRECATION")
259
+ context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)
260
+ }
261
+ return info.requestedPermissions?.contains(Manifest.permission.RECORD_AUDIO) == true
262
+ }
263
+
264
+ companion object {
265
+ private const val E_FAILED = "E_SPEECH_FAILED"
266
+ private const val PREFS = "one-native-speech"
267
+ private const val ASKED_KEY = "microphone-asked"
268
+ private const val REQUEST_PERMISSION = 0x1C01
269
+ }
270
+ }
@@ -1,9 +1,12 @@
1
1
  package com.margelo.nitro.one
2
2
 
3
3
  // nitro hands js the printed stack trace of a rejected throwable as the error
4
- // message. this one prints as exactly "<code>: <message>", with no class name
5
- // or frames, and the js entries split the stable code back out.
6
- class OneNativeError(code: String, message: String) : Exception("$code: $message") {
4
+ // message. this one prints as exactly its message, with no class name or
5
+ // frames: "<code>: <message>" for a failure, whose stable code the js entries
6
+ // split back out, or the bare message for a call the platform cannot answer.
7
+ class OneNativeError(message: String) : Exception(message) {
8
+ constructor(code: String, message: String) : this("$code: $message")
9
+
7
10
  override fun fillInStackTrace(): Throwable = this
8
11
 
9
12
  override fun toString(): String = message ?: ""
package/dist/cjs/one.cjs CHANGED
@@ -81,9 +81,11 @@ const One = Object.freeze({
81
81
  Clipboard: import_platform.Clipboard,
82
82
  Haptics: import_platform.Haptics,
83
83
  Network: import_platform.Network,
84
+ Auth: import_platform.Auth,
84
85
  Browser: import_platform.Browser,
85
86
  ImagePicker: import_platform.ImagePicker,
86
87
  DocumentPicker: import_platform.DocumentPicker,
87
88
  SecureStore: import_platform.SecureStore,
89
+ Speech: import_platform.Speech,
88
90
  useNetworkState: import_platform.useNetworkState
89
91
  });
@@ -84,9 +84,11 @@ var One = Object.freeze({
84
84
  Clipboard: import_platform.Clipboard,
85
85
  Haptics: import_platform.Haptics,
86
86
  Network: import_platform.Network,
87
+ Auth: import_platform.Auth,
87
88
  Browser: import_platform.Browser,
88
89
  ImagePicker: import_platform.ImagePicker,
89
90
  DocumentPicker: import_platform.DocumentPicker,
90
91
  SecureStore: import_platform.SecureStore,
92
+ Speech: import_platform.Speech,
91
93
  useNetworkState: import_platform.useNetworkState
92
94
  });
@@ -84,10 +84,12 @@ var One = Object.freeze({
84
84
  Clipboard: import_platform.Clipboard,
85
85
  Haptics: import_platform.Haptics,
86
86
  Network: import_platform.Network,
87
+ Auth: import_platform.Auth,
87
88
  Browser: import_platform.Browser,
88
89
  ImagePicker: import_platform.ImagePicker,
89
90
  DocumentPicker: import_platform.DocumentPicker,
90
91
  SecureStore: import_platform.SecureStore,
92
+ Speech: import_platform.Speech,
91
93
  useNetworkState: import_platform.useNetworkState
92
94
  });
93
95
 
@@ -1 +1 @@
1
- {"version":3,"file":"one.native.js","names":[],"sources":["cjs/one.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar one_exports = {};\n__export(one_exports, {\n One: () => One\n});\nmodule.exports = __toCommonJS(one_exports);\nvar import_platform = require(\"./platform\");\nvar import_safe_area_context = require(\"./safe-area-context\");\nfunction currentPlatform() {\n var _Reflect_get;\n var defined = (_Reflect_get = Reflect.get(globalThis, \"__ONE_PLATFORM__\")) !== null && _Reflect_get !== void 0 ? _Reflect_get : typeof process !== \"undefined\" ? process.env.ONE_PLATFORM : void 0;\n return defined === \"ios\" || defined === \"android\" || defined === \"rnx\" ? defined : \"web\";\n}\nvar iOS = Object.freeze({\n ...import_platform.Swift,\n Widgets: import_platform.Widgets,\n LiveActivities: import_platform.LiveActivities,\n WidgetUI: import_platform.WidgetUI,\n Color: import_platform.Color.ios,\n MenuAction: import_platform.MenuAction,\n SplitView: import_platform.SplitView,\n ToolbarHost: import_platform.ToolbarHost,\n BarButtonItem: import_platform.ToolbarItem,\n ZoomTransitionAlignmentRectDetector: import_platform.ZoomTransitionAlignmentRectDetector,\n ZoomTransitionEnabler: import_platform.ZoomTransitionEnabler,\n ZoomTransitionSource: import_platform.ZoomTransitionSource\n});\nvar Android = Object.freeze({\n ...import_platform.Compose,\n Color: import_platform.Color.android,\n Menu: import_platform.Menu,\n ContextMenu: import_platform.ContextMenu\n});\nvar SafeArea = Object.freeze({\n Provider: import_safe_area_context.SafeAreaProvider,\n View: import_safe_area_context.SafeAreaView,\n initialMetrics: import_safe_area_context.initialWindowMetrics,\n useFrame: import_safe_area_context.useSafeAreaFrame,\n useInsets: import_safe_area_context.useSafeAreaInsets\n});\nvar UI = Object.freeze({\n ...import_platform.UI,\n Fonts: import_platform.Fonts,\n SafeArea,\n TextInput: import_platform.TextInput,\n useFonts: import_platform.useFonts,\n useNativeState: import_platform.useNativeState,\n useSizeClass: import_platform.useSizeClass,\n getSizeClass: import_platform.getSizeClass,\n useHinge: import_platform.useHinge,\n getHinge: import_platform.getHinge,\n onHingeChange: import_platform.onHingeChange,\n ReservedRegions: import_platform.ReservedRegions\n});\nvar One = Object.freeze({\n get platform() {\n return currentPlatform();\n },\n AppInfo: import_platform.AppInfo,\n Database: import_platform.Database,\n iOS,\n Android,\n UI,\n Notifications: import_platform.Notifications,\n Clipboard: import_platform.Clipboard,\n Haptics: import_platform.Haptics,\n Network: import_platform.Network,\n Browser: import_platform.Browser,\n ImagePicker: import_platform.ImagePicker,\n DocumentPicker: import_platform.DocumentPicker,\n SecureStore: import_platform.SecureStore,\n useNetworkState: import_platform.useNetworkState\n});\n//# sourceMappingURL=one.js.map\n"],"mappings":";;;AACA,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,cAAc,CAAC;AACnB,SAAS,aAAa,EACpB,WAAW,IACb,CAAC;AACD,OAAO,UAAU,aAAa,WAAW;AACzC,IAAI,kBAAkB,QAAQ,4BAAY;AAC1C,IAAI,2BAA2B,QAAQ,qCAAqB;AAC5D,SAAS,kBAAkB;CACzB,IAAI;CACJ,IAAI,WAAW,eAAe,QAAQ,IAAI,YAAY,kBAAkB,OAAO,QAAQ,iBAAiB,KAAK,IAAI,eAAe,OAAO,YAAY,cAAc,QAAQ,IAAI,eAAe,KAAK;CACjM,OAAO,YAAY,SAAS,YAAY,aAAa,YAAY,QAAQ,UAAU;AACrF;AACA,IAAI,MAAM,OAAO,OAAO;CACtB,GAAG,gBAAgB;CACnB,SAAS,gBAAgB;CACzB,gBAAgB,gBAAgB;CAChC,UAAU,gBAAgB;CAC1B,OAAO,gBAAgB,MAAM;CAC7B,YAAY,gBAAgB;CAC5B,WAAW,gBAAgB;CAC3B,aAAa,gBAAgB;CAC7B,eAAe,gBAAgB;CAC/B,qCAAqC,gBAAgB;CACrD,uBAAuB,gBAAgB;CACvC,sBAAsB,gBAAgB;AACxC,CAAC;AACD,IAAI,UAAU,OAAO,OAAO;CAC1B,GAAG,gBAAgB;CACnB,OAAO,gBAAgB,MAAM;CAC7B,MAAM,gBAAgB;CACtB,aAAa,gBAAgB;AAC/B,CAAC;AACD,IAAI,WAAW,OAAO,OAAO;CAC3B,UAAU,yBAAyB;CACnC,MAAM,yBAAyB;CAC/B,gBAAgB,yBAAyB;CACzC,UAAU,yBAAyB;CACnC,WAAW,yBAAyB;AACtC,CAAC;AACD,IAAI,KAAK,OAAO,OAAO;CACrB,GAAG,gBAAgB;CACnB,OAAO,gBAAgB;CACvB;CACA,WAAW,gBAAgB;CAC3B,UAAU,gBAAgB;CAC1B,gBAAgB,gBAAgB;CAChC,cAAc,gBAAgB;CAC9B,cAAc,gBAAgB;CAC9B,UAAU,gBAAgB;CAC1B,UAAU,gBAAgB;CAC1B,eAAe,gBAAgB;CAC/B,iBAAiB,gBAAgB;AACnC,CAAC;AACD,IAAI,MAAM,OAAO,OAAO;CACtB,IAAI,WAAW;EACb,OAAO,gBAAgB;CACzB;CACA,SAAS,gBAAgB;CACzB,UAAU,gBAAgB;CAC1B;CACA;CACA;CACA,eAAe,gBAAgB;CAC/B,WAAW,gBAAgB;CAC3B,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,aAAa,gBAAgB;CAC7B,gBAAgB,gBAAgB;CAChC,aAAa,gBAAgB;CAC7B,iBAAiB,gBAAgB;AACnC,CAAC"}
1
+ {"version":3,"file":"one.native.js","names":[],"sources":["cjs/one.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar one_exports = {};\n__export(one_exports, {\n One: () => One\n});\nmodule.exports = __toCommonJS(one_exports);\nvar import_platform = require(\"./platform\");\nvar import_safe_area_context = require(\"./safe-area-context\");\nfunction currentPlatform() {\n var _Reflect_get;\n var defined = (_Reflect_get = Reflect.get(globalThis, \"__ONE_PLATFORM__\")) !== null && _Reflect_get !== void 0 ? _Reflect_get : typeof process !== \"undefined\" ? process.env.ONE_PLATFORM : void 0;\n return defined === \"ios\" || defined === \"android\" || defined === \"rnx\" ? defined : \"web\";\n}\nvar iOS = Object.freeze({\n ...import_platform.Swift,\n Widgets: import_platform.Widgets,\n LiveActivities: import_platform.LiveActivities,\n WidgetUI: import_platform.WidgetUI,\n Color: import_platform.Color.ios,\n MenuAction: import_platform.MenuAction,\n SplitView: import_platform.SplitView,\n ToolbarHost: import_platform.ToolbarHost,\n BarButtonItem: import_platform.ToolbarItem,\n ZoomTransitionAlignmentRectDetector: import_platform.ZoomTransitionAlignmentRectDetector,\n ZoomTransitionEnabler: import_platform.ZoomTransitionEnabler,\n ZoomTransitionSource: import_platform.ZoomTransitionSource\n});\nvar Android = Object.freeze({\n ...import_platform.Compose,\n Color: import_platform.Color.android,\n Menu: import_platform.Menu,\n ContextMenu: import_platform.ContextMenu\n});\nvar SafeArea = Object.freeze({\n Provider: import_safe_area_context.SafeAreaProvider,\n View: import_safe_area_context.SafeAreaView,\n initialMetrics: import_safe_area_context.initialWindowMetrics,\n useFrame: import_safe_area_context.useSafeAreaFrame,\n useInsets: import_safe_area_context.useSafeAreaInsets\n});\nvar UI = Object.freeze({\n ...import_platform.UI,\n Fonts: import_platform.Fonts,\n SafeArea,\n TextInput: import_platform.TextInput,\n useFonts: import_platform.useFonts,\n useNativeState: import_platform.useNativeState,\n useSizeClass: import_platform.useSizeClass,\n getSizeClass: import_platform.getSizeClass,\n useHinge: import_platform.useHinge,\n getHinge: import_platform.getHinge,\n onHingeChange: import_platform.onHingeChange,\n ReservedRegions: import_platform.ReservedRegions\n});\nvar One = Object.freeze({\n get platform() {\n return currentPlatform();\n },\n AppInfo: import_platform.AppInfo,\n Database: import_platform.Database,\n iOS,\n Android,\n UI,\n Notifications: import_platform.Notifications,\n Clipboard: import_platform.Clipboard,\n Haptics: import_platform.Haptics,\n Network: import_platform.Network,\n Auth: import_platform.Auth,\n Browser: import_platform.Browser,\n ImagePicker: import_platform.ImagePicker,\n DocumentPicker: import_platform.DocumentPicker,\n SecureStore: import_platform.SecureStore,\n Speech: import_platform.Speech,\n useNetworkState: import_platform.useNetworkState\n});\n//# sourceMappingURL=one.js.map\n"],"mappings":";;;AACA,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,cAAc,CAAC;AACnB,SAAS,aAAa,EACpB,WAAW,IACb,CAAC;AACD,OAAO,UAAU,aAAa,WAAW;AACzC,IAAI,kBAAkB,QAAQ,4BAAY;AAC1C,IAAI,2BAA2B,QAAQ,qCAAqB;AAC5D,SAAS,kBAAkB;CACzB,IAAI;CACJ,IAAI,WAAW,eAAe,QAAQ,IAAI,YAAY,kBAAkB,OAAO,QAAQ,iBAAiB,KAAK,IAAI,eAAe,OAAO,YAAY,cAAc,QAAQ,IAAI,eAAe,KAAK;CACjM,OAAO,YAAY,SAAS,YAAY,aAAa,YAAY,QAAQ,UAAU;AACrF;AACA,IAAI,MAAM,OAAO,OAAO;CACtB,GAAG,gBAAgB;CACnB,SAAS,gBAAgB;CACzB,gBAAgB,gBAAgB;CAChC,UAAU,gBAAgB;CAC1B,OAAO,gBAAgB,MAAM;CAC7B,YAAY,gBAAgB;CAC5B,WAAW,gBAAgB;CAC3B,aAAa,gBAAgB;CAC7B,eAAe,gBAAgB;CAC/B,qCAAqC,gBAAgB;CACrD,uBAAuB,gBAAgB;CACvC,sBAAsB,gBAAgB;AACxC,CAAC;AACD,IAAI,UAAU,OAAO,OAAO;CAC1B,GAAG,gBAAgB;CACnB,OAAO,gBAAgB,MAAM;CAC7B,MAAM,gBAAgB;CACtB,aAAa,gBAAgB;AAC/B,CAAC;AACD,IAAI,WAAW,OAAO,OAAO;CAC3B,UAAU,yBAAyB;CACnC,MAAM,yBAAyB;CAC/B,gBAAgB,yBAAyB;CACzC,UAAU,yBAAyB;CACnC,WAAW,yBAAyB;AACtC,CAAC;AACD,IAAI,KAAK,OAAO,OAAO;CACrB,GAAG,gBAAgB;CACnB,OAAO,gBAAgB;CACvB;CACA,WAAW,gBAAgB;CAC3B,UAAU,gBAAgB;CAC1B,gBAAgB,gBAAgB;CAChC,cAAc,gBAAgB;CAC9B,cAAc,gBAAgB;CAC9B,UAAU,gBAAgB;CAC1B,UAAU,gBAAgB;CAC1B,eAAe,gBAAgB;CAC/B,iBAAiB,gBAAgB;AACnC,CAAC;AACD,IAAI,MAAM,OAAO,OAAO;CACtB,IAAI,WAAW;EACb,OAAO,gBAAgB;CACzB;CACA,SAAS,gBAAgB;CACzB,UAAU,gBAAgB;CAC1B;CACA;CACA;CACA,eAAe,gBAAgB;CAC/B,WAAW,gBAAgB;CAC3B,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,MAAM,gBAAgB;CACtB,SAAS,gBAAgB;CACzB,aAAa,gBAAgB;CAC7B,gBAAgB,gBAAgB;CAChC,aAAa,gBAAgB;CAC7B,QAAQ,gBAAgB;CACxB,iBAAiB,gBAAgB;AACnC,CAAC"}
@@ -101,6 +101,7 @@ function tabContentModifiers(owner, props, iosVersion) {
101
101
  if (props.defaultSectionExpansion) (0, import_swiftui.assertSwiftUIValue)("TabSectionExpansion", props.defaultSectionExpansion, iosVersion);
102
102
  return JSON.stringify({
103
103
  image: props.image,
104
+ labelStyle: props.labelStyle,
104
105
  section: props.section,
105
106
  disabled: props.disabled,
106
107
  hidden: props.hidden,
@@ -101,6 +101,7 @@ function tabContentModifiers(owner, props, iosVersion) {
101
101
  if (props.defaultSectionExpansion) (0, import_swiftui.assertSwiftUIValue)("TabSectionExpansion", props.defaultSectionExpansion, iosVersion);
102
102
  return JSON.stringify({
103
103
  image: props.image,
104
+ labelStyle: props.labelStyle,
104
105
  section: props.section,
105
106
  disabled: props.disabled,
106
107
  hidden: props.hidden,