@rownd/react-native 0.1.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/android/build.gradle +59 -0
  4. package/android/src/main/AndroidManifest.xml +4 -0
  5. package/android/src/main/java/com/reactnative/ReactNativePackage.java +22 -0
  6. package/android/src/main/java/com/reactnative/ReactNativeViewManager.java +31 -0
  7. package/ios/ReactNative.xcodeproj/project.pbxproj +282 -0
  8. package/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
  9. package/ios/ReactNativeViewManager.m +34 -0
  10. package/lib/commonjs/assets/images/checkmark--filled.svg +12 -0
  11. package/lib/commonjs/assets/images/email-verify-waiting.svg +36 -0
  12. package/lib/commonjs/assets/images/phone-verify-waiting.svg +26 -0
  13. package/lib/commonjs/components/AuthenticatedComponent.js +35 -0
  14. package/lib/commonjs/components/AuthenticatedComponent.js.map +1 -0
  15. package/lib/commonjs/components/AutoSigninDialog.js +119 -0
  16. package/lib/commonjs/components/AutoSigninDialog.js.map +1 -0
  17. package/lib/commonjs/components/DefaultContext.js +269 -0
  18. package/lib/commonjs/components/DefaultContext.js.map +1 -0
  19. package/lib/commonjs/components/GlobalContext.js +340 -0
  20. package/lib/commonjs/components/GlobalContext.js.map +1 -0
  21. package/lib/commonjs/components/RowndComponents.js +29 -0
  22. package/lib/commonjs/components/RowndComponents.js.map +1 -0
  23. package/lib/commonjs/components/RowndProvider.js +55 -0
  24. package/lib/commonjs/components/RowndProvider.js.map +1 -0
  25. package/lib/commonjs/components/SignIn.js +622 -0
  26. package/lib/commonjs/components/SignIn.js.map +1 -0
  27. package/lib/commonjs/data/actions.js +26 -0
  28. package/lib/commonjs/data/actions.js.map +1 -0
  29. package/lib/commonjs/hooks/api.js +157 -0
  30. package/lib/commonjs/hooks/api.js.map +1 -0
  31. package/lib/commonjs/hooks/debounce.js +38 -0
  32. package/lib/commonjs/hooks/debounce.js.map +1 -0
  33. package/lib/commonjs/hooks/fingerprint.js +176 -0
  34. package/lib/commonjs/hooks/fingerprint.js.map +1 -0
  35. package/lib/commonjs/hooks/index.js +48 -0
  36. package/lib/commonjs/hooks/index.js.map +1 -0
  37. package/lib/commonjs/hooks/interval.js +31 -0
  38. package/lib/commonjs/hooks/interval.js.map +1 -0
  39. package/lib/commonjs/hooks/nav.js +39 -0
  40. package/lib/commonjs/hooks/nav.js.map +1 -0
  41. package/lib/commonjs/hooks/rownd.js +163 -0
  42. package/lib/commonjs/hooks/rownd.js.map +1 -0
  43. package/lib/commonjs/index.js +32 -0
  44. package/lib/commonjs/index.js.map +1 -0
  45. package/lib/commonjs/index.tsx.bak +26 -0
  46. package/lib/commonjs/types.js +2 -0
  47. package/lib/commonjs/types.js.map +1 -0
  48. package/lib/commonjs/utils/config.js +28 -0
  49. package/lib/commonjs/utils/config.js.map +1 -0
  50. package/lib/commonjs/utils/events.js +57 -0
  51. package/lib/commonjs/utils/events.js.map +1 -0
  52. package/lib/commonjs/utils/form.js +46 -0
  53. package/lib/commonjs/utils/form.js.map +1 -0
  54. package/lib/commonjs/utils/queue.js +117 -0
  55. package/lib/commonjs/utils/queue.js.map +1 -0
  56. package/lib/commonjs/utils/storage.js +15 -0
  57. package/lib/commonjs/utils/storage.js.map +1 -0
  58. package/lib/commonjs/utils/tailwind.js +17 -0
  59. package/lib/commonjs/utils/tailwind.js.map +1 -0
  60. package/lib/commonjs/utils/tokens.js +35 -0
  61. package/lib/commonjs/utils/tokens.js.map +1 -0
  62. package/lib/commonjs/utils/user-data.js +21 -0
  63. package/lib/commonjs/utils/user-data.js.map +1 -0
  64. package/lib/module/assets/images/checkmark--filled.svg +12 -0
  65. package/lib/module/assets/images/email-verify-waiting.svg +36 -0
  66. package/lib/module/assets/images/phone-verify-waiting.svg +26 -0
  67. package/lib/module/components/AuthenticatedComponent.js +24 -0
  68. package/lib/module/components/AuthenticatedComponent.js.map +1 -0
  69. package/lib/module/components/AutoSigninDialog.js +100 -0
  70. package/lib/module/components/AutoSigninDialog.js.map +1 -0
  71. package/lib/module/components/DefaultContext.js +244 -0
  72. package/lib/module/components/DefaultContext.js.map +1 -0
  73. package/lib/module/components/GlobalContext.js +318 -0
  74. package/lib/module/components/GlobalContext.js.map +1 -0
  75. package/lib/module/components/RowndComponents.js +14 -0
  76. package/lib/module/components/RowndComponents.js.map +1 -0
  77. package/lib/module/components/RowndProvider.js +39 -0
  78. package/lib/module/components/RowndProvider.js.map +1 -0
  79. package/lib/module/components/SignIn.js +593 -0
  80. package/lib/module/components/SignIn.js.map +1 -0
  81. package/lib/module/data/actions.js +19 -0
  82. package/lib/module/data/actions.js.map +1 -0
  83. package/lib/module/hooks/api.js +138 -0
  84. package/lib/module/hooks/api.js.map +1 -0
  85. package/lib/module/hooks/debounce.js +29 -0
  86. package/lib/module/hooks/debounce.js.map +1 -0
  87. package/lib/module/hooks/fingerprint.js +157 -0
  88. package/lib/module/hooks/fingerprint.js.map +1 -0
  89. package/lib/module/hooks/index.js +7 -0
  90. package/lib/module/hooks/index.js.map +1 -0
  91. package/lib/module/hooks/interval.js +23 -0
  92. package/lib/module/hooks/interval.js.map +1 -0
  93. package/lib/module/hooks/nav.js +30 -0
  94. package/lib/module/hooks/nav.js.map +1 -0
  95. package/lib/module/hooks/rownd.js +148 -0
  96. package/lib/module/hooks/rownd.js.map +1 -0
  97. package/lib/module/index.js +6 -0
  98. package/lib/module/index.js.map +1 -0
  99. package/lib/module/index.tsx.bak +26 -0
  100. package/lib/module/types.js +2 -0
  101. package/lib/module/types.js.map +1 -0
  102. package/lib/module/utils/config.js +17 -0
  103. package/lib/module/utils/config.js.map +1 -0
  104. package/lib/module/utils/events.js +45 -0
  105. package/lib/module/utils/events.js.map +1 -0
  106. package/lib/module/utils/form.js +34 -0
  107. package/lib/module/utils/form.js.map +1 -0
  108. package/lib/module/utils/queue.js +109 -0
  109. package/lib/module/utils/queue.js.map +1 -0
  110. package/lib/module/utils/storage.js +6 -0
  111. package/lib/module/utils/storage.js.map +1 -0
  112. package/lib/module/utils/tailwind.js +5 -0
  113. package/lib/module/utils/tailwind.js.map +1 -0
  114. package/lib/module/utils/tokens.js +24 -0
  115. package/lib/module/utils/tokens.js.map +1 -0
  116. package/lib/module/utils/user-data.js +14 -0
  117. package/lib/module/utils/user-data.js.map +1 -0
  118. package/lib/typescript/example2/App.d.ts +11 -0
  119. package/lib/typescript/src/components/AuthenticatedComponent.d.ts +7 -0
  120. package/lib/typescript/src/components/AutoSigninDialog.d.ts +1 -0
  121. package/lib/typescript/src/components/DefaultContext.d.ts +12 -0
  122. package/lib/typescript/src/components/GlobalContext.d.ts +111 -0
  123. package/lib/typescript/src/components/RowndComponents.d.ts +1 -0
  124. package/lib/typescript/src/components/RowndProvider.d.ts +8 -0
  125. package/lib/typescript/src/components/SignIn.d.ts +1 -0
  126. package/lib/typescript/src/data/actions.d.ts +20 -0
  127. package/lib/typescript/src/hooks/api.d.ts +12 -0
  128. package/lib/typescript/src/hooks/debounce.d.ts +5 -0
  129. package/lib/typescript/src/hooks/fingerprint.d.ts +12 -0
  130. package/lib/typescript/src/hooks/index.d.ts +6 -0
  131. package/lib/typescript/src/hooks/interval.d.ts +2 -0
  132. package/lib/typescript/src/hooks/nav.d.ts +6 -0
  133. package/lib/typescript/src/hooks/rownd.d.ts +37 -0
  134. package/lib/typescript/src/index.d.ts +4 -0
  135. package/lib/typescript/src/types.d.ts +26 -0
  136. package/lib/typescript/src/utils/config.d.ts +18 -0
  137. package/lib/typescript/src/utils/events.d.ts +22 -0
  138. package/lib/typescript/src/utils/form.d.ts +17 -0
  139. package/lib/typescript/src/utils/queue.d.ts +21 -0
  140. package/lib/typescript/src/utils/storage.d.ts +3 -0
  141. package/lib/typescript/src/utils/tailwind.d.ts +2 -0
  142. package/lib/typescript/src/utils/tokens.d.ts +4 -0
  143. package/lib/typescript/src/utils/user-data.d.ts +3 -0
  144. package/lib/typescript/tailwind.config.d.ts +10 -0
  145. package/package.json +177 -0
  146. package/react-native.podspec +19 -0
  147. package/src/assets/images/checkmark--filled.svg +12 -0
  148. package/src/assets/images/email-verify-waiting.svg +36 -0
  149. package/src/assets/images/phone-verify-waiting.svg +26 -0
  150. package/src/components/AuthenticatedComponent.tsx +30 -0
  151. package/src/components/AutoSigninDialog.tsx +125 -0
  152. package/src/components/DefaultContext.tsx +278 -0
  153. package/src/components/GlobalContext.tsx +485 -0
  154. package/src/components/RowndComponents.tsx +21 -0
  155. package/src/components/RowndProvider.tsx +56 -0
  156. package/src/components/SignIn.tsx +770 -0
  157. package/src/data/actions.ts +21 -0
  158. package/src/hooks/api.ts +163 -0
  159. package/src/hooks/debounce.ts +36 -0
  160. package/src/hooks/fingerprint.ts +217 -0
  161. package/src/hooks/index.ts +7 -0
  162. package/src/hooks/interval.ts +25 -0
  163. package/src/hooks/nav.tsx +29 -0
  164. package/src/hooks/rownd.ts +184 -0
  165. package/src/index.tsx +6 -0
  166. package/src/index.tsx.bak +26 -0
  167. package/src/types.ts +27 -0
  168. package/src/utils/config.ts +36 -0
  169. package/src/utils/events.ts +54 -0
  170. package/src/utils/form.tsx +64 -0
  171. package/src/utils/queue.ts +75 -0
  172. package/src/utils/storage.ts +7 -0
  173. package/src/utils/tailwind.ts +6 -0
  174. package/src/utils/tokens.ts +26 -0
  175. package/src/utils/user-data.ts +15 -0
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="79px" height="68px" viewBox="0 0 79 68" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>Group</title>
4
+ <defs>
5
+ <rect id="path-1" x="9.69736842" y="6.17105263" width="53.7763158" height="45.8421053" rx="8"></rect>
6
+ <filter x="-27.0%" y="-20.7%" width="153.9%" height="163.3%" filterUnits="objectBoundingBox" id="filter-2">
7
+ <feOffset dx="0" dy="5" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
8
+ <feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
9
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
10
+ </filter>
11
+ <path d="M1.49198314,22.8826009 L27.3602885,37.5009111 C33.5004408,40.9707422 41.014234,40.9500831 47.1352131,37.4465401 L72.5558685,22.8961951 C73.0351888,22.6218404 73.6461631,22.7879979 73.9205178,23.2673182 C74.007089,23.4185653 74.0526316,23.5898106 74.0526316,23.7640813 L74.0526316,63 C74.0526316,65.209139 72.2617706,67 70.0526316,67 L4,67 C1.790861,67 2.705415e-16,65.209139 0,63 L0,23.7532056 C8.43762138e-16,23.2009209 0.44771525,22.7532056 1,22.7532056 C1.17240673,22.7532056 1.34188502,22.7977797 1.49198314,22.8826009 Z" id="path-3"></path>
12
+ <filter x="-4.7%" y="-8.4%" width="109.5%" height="114.0%" filterUnits="objectBoundingBox" id="filter-4">
13
+ <feOffset dx="0" dy="-1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
14
+ <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
15
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
16
+ </filter>
17
+ </defs>
18
+ <g id="V2-post--feedback" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
19
+ <g id="xlg-1312px-16-column-copy-96" transform="translate(-616.000000, -265.000000)">
20
+ <g id="Group" transform="translate(618.000000, 265.000000)">
21
+ <path d="M1.1333848,21.7417845 L33.0948714,2.49908682 C35.6464021,0.96291506 38.8400625,0.97130271 41.383489,2.52085558 L72.9358668,21.743773 C73.4075139,22.0311185 73.5569199,22.6464036 73.2695744,23.1180507 C73.2235298,23.1936281 73.1676563,23.2627588 73.1034181,23.3236315 L37.2457723,57.3026316 L37.2457723,57.3026316 L0.965647178,23.3284209 C0.562522036,22.9509179 0.54175124,22.3180937 0.919254307,21.9149685 C0.982302388,21.8476412 1.0543624,21.7893607 1.1333848,21.7417845 Z" id="Path-28" fill="#545454"></path>
22
+ <g id="Rectangle">
23
+ <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
24
+ <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
25
+ </g>
26
+ <rect id="Rectangle" fill-opacity="0.4" fill="#D8D8D8" x="18.5131579" y="19.3947368" width="36.1447368" height="3.52631579"></rect>
27
+ <rect id="Rectangle-Copy" fill-opacity="0.4" fill="#D8D8D8" x="18.5131579" y="27.3289474" width="36.1447368" height="26.4473684"></rect>
28
+ <g id="Rectangle">
29
+ <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
30
+ <use fill="#646464" fill-rule="evenodd" xlink:href="#path-3"></use>
31
+ </g>
32
+ <path d="M23.2845382,51.744338 L1.76315789,67 L1.76315789,67 L71.4078947,67 L49.8865144,51.744338 C41.9186006,46.0961966 31.252452,46.0961966 23.2845382,51.744338 Z" id="Path-29" fill="#545454"></path>
33
+ </g>
34
+ </g>
35
+ </g>
36
+ </svg>
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="62px" height="100px" viewBox="0 0 62 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>unverified-phone</title>
4
+ <defs>
5
+ <rect id="path-1" x="0" y="0" width="58" height="96" rx="8"></rect>
6
+ <filter x="-5.2%" y="-3.1%" width="110.3%" height="106.2%" filterUnits="objectBoundingBox" id="filter-2">
7
+ <feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
8
+ <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
9
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
10
+ </filter>
11
+ </defs>
12
+ <g id="SMS-verify-from-web-stay-on-web-(BR)" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="xlg-1312px-16-column-copy-51" transform="translate(-625.000000, -259.000000)">
14
+ <g id="unverified-phone" transform="translate(627.000000, 261.000000)">
15
+ <g id="Rectangle">
16
+ <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
17
+ <use fill="#444444" fill-rule="evenodd" xlink:href="#path-1"></use>
18
+ </g>
19
+ <circle id="Oval" fill="#000000" cx="29" cy="89" r="5"></circle>
20
+ <rect id="Rectangle" fill="#FFFFFF" x="5" y="11" width="48" height="71" rx="2"></rect>
21
+ <rect id="Rectangle" fill-opacity="0.4" fill="#D8D8D8" x="10" y="20" width="38" height="5"></rect>
22
+ <rect id="Rectangle-Copy" fill-opacity="0.4" fill="#D8D8D8" x="10" y="31" width="38" height="36"></rect>
23
+ </g>
24
+ </g>
25
+ </g>
26
+ </svg>
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
11
+
12
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
+
14
+ const {
15
+ useRownd
16
+ } = require('../hooks/rownd');
17
+
18
+ function _default(_ref) {
19
+ let {
20
+ shouldRequestSignIn,
21
+ renderContentWhenUnauthenticated,
22
+ children
23
+ } = _ref;
24
+ const {
25
+ is_authenticated,
26
+ requestSignIn
27
+ } = useRownd();
28
+ (0, _react.useEffect)(() => {
29
+ if (shouldRequestSignIn && !is_authenticated) {
30
+ requestSignIn();
31
+ }
32
+ }, [is_authenticated, requestSignIn, shouldRequestSignIn]);
33
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (is_authenticated || renderContentWhenUnauthenticated) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children));
34
+ }
35
+ //# sourceMappingURL=AuthenticatedComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useRownd","require","shouldRequestSignIn","renderContentWhenUnauthenticated","children","is_authenticated","requestSignIn","useEffect"],"sources":["AuthenticatedComponent.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\n\nconst { useRownd } = require('../hooks/rownd');\n\ninterface IAuthenticatedComponentProps {\n shouldRequestSignIn?: boolean;\n renderContentWhenUnauthenticated?: boolean;\n}\n\nexport default function ({\n shouldRequestSignIn,\n renderContentWhenUnauthenticated,\n children,\n}: React.PropsWithChildren<IAuthenticatedComponentProps>) {\n const { is_authenticated, requestSignIn } = useRownd();\n\n useEffect(() => {\n if (shouldRequestSignIn && !is_authenticated) {\n requestSignIn();\n }\n }, [is_authenticated, requestSignIn, shouldRequestSignIn]);\n\n return (\n <>\n {(is_authenticated || renderContentWhenUnauthenticated) && (\n <>{children}</>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;AAAA;;;;;;AAEA,MAAM;EAAEA;AAAF,IAAeC,OAAO,CAAC,gBAAD,CAA5B;;AAOe,wBAI2C;EAAA,IAJjC;IACvBC,mBADuB;IAEvBC,gCAFuB;IAGvBC;EAHuB,CAIiC;EACxD,MAAM;IAAEC,gBAAF;IAAoBC;EAApB,IAAsCN,QAAQ,EAApD;EAEA,IAAAO,gBAAA,EAAU,MAAM;IACd,IAAIL,mBAAmB,IAAI,CAACG,gBAA5B,EAA8C;MAC5CC,aAAa;IACd;EACF,CAJD,EAIG,CAACD,gBAAD,EAAmBC,aAAnB,EAAkCJ,mBAAlC,CAJH;EAMA,oBACE,4DACG,CAACG,gBAAgB,IAAIF,gCAArB,kBACC,4DAAGC,QAAH,CAFJ,CADF;AAOD"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AutoSigninDialog = AutoSigninDialog;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _reactNative = require("react-native");
11
+
12
+ var _bottomSheet = require("@gorhom/bottom-sheet");
13
+
14
+ var _usehooksTs = require("usehooks-ts");
15
+
16
+ var _vectorIcons = require("@expo/vector-icons");
17
+
18
+ var _hooks = require("../hooks");
19
+
20
+ var _GlobalContext = require("./GlobalContext");
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
+
26
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
27
+
28
+ function AutoSigninDialog() {
29
+ const navTo = (0, _hooks.useNav)();
30
+ const {
31
+ state
32
+ } = (0, _GlobalContext.useGlobalContext)(); // Let the user know they're auto signing-in, then close when done
33
+
34
+ (0, _usehooksTs.useTimeout)(() => {
35
+ if (state.nav.options.type === 'error') {
36
+ return;
37
+ }
38
+
39
+ handleClose();
40
+ }, 3000);
41
+ const bottomSheetModalRef = (0, _react.useRef)(null);
42
+ (0, _react.useEffect)(() => {
43
+ if (bottomSheetModalRef.current) {
44
+ bottomSheetModalRef.current.present();
45
+ }
46
+ }, []);
47
+ const handleClose = (0, _react.useCallback)(() => {
48
+ setTimeout(() => {
49
+ navTo({
50
+ hide: true
51
+ });
52
+ }, 150);
53
+ }, [navTo]);
54
+ const snapPoints = (0, _react.useMemo)(() => ['30%', '60%'], []);
55
+ const renderBackdrop = (0, _react.useCallback)(props => /*#__PURE__*/_react.default.createElement(_bottomSheet.BottomSheetBackdrop, _extends({}, props, {
56
+ pressBehavior: "none"
57
+ })), []);
58
+ return /*#__PURE__*/_react.default.createElement(_bottomSheet.BottomSheetModal, {
59
+ snapPoints: snapPoints,
60
+ index: 0,
61
+ backdropComponent: renderBackdrop,
62
+ keyboardBehavior: "fillParent",
63
+ android_keyboardInputMode: "adjustResize",
64
+ enablePanDownToClose: state.nav.options.type === 'error',
65
+ onDismiss: handleClose,
66
+ style: styles.bottomSheet,
67
+ ref: bottomSheetModalRef
68
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
69
+ style: styles.innerContainer
70
+ }, state.nav.options.type === 'error' && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_vectorIcons.MaterialIcons, {
71
+ name: "error",
72
+ size: 24,
73
+ color: "#DA1E28",
74
+ style: styles.errorIcon
75
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
76
+ style: styles.errorMessage
77
+ }, state.nav.options.message || 'An error occurred. Please try again.')), state.nav.options.type === 'sign-in' && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
78
+ size: "large",
79
+ color: "#5b0ae0"
80
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
81
+ style: styles.signInMessage
82
+ }, "Automatically signing you in. Just a sec..."))));
83
+ }
84
+
85
+ const styles = _reactNative.StyleSheet.create({
86
+ modal: {// flex: 1,
87
+ },
88
+ bottomSheet: {
89
+ shadowColor: '#000',
90
+ shadowOffset: {
91
+ width: 0,
92
+ height: 12
93
+ },
94
+ shadowOpacity: 0.58,
95
+ shadowRadius: 16.0,
96
+ elevation: 24
97
+ },
98
+ innerContainer: {
99
+ borderRadius: 20,
100
+ borderColor: 'transparent',
101
+ borderWidth: 0,
102
+ padding: 25,
103
+ textAlign: 'center'
104
+ },
105
+ signInMessage: {
106
+ textAlign: 'center',
107
+ fontSize: 24,
108
+ padding: 20
109
+ },
110
+ errorMessage: {
111
+ textAlign: 'center',
112
+ fontSize: 24,
113
+ padding: 20
114
+ },
115
+ errorIcon: {
116
+ textAlign: 'center'
117
+ }
118
+ });
119
+ //# sourceMappingURL=AutoSigninDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AutoSigninDialog","navTo","useNav","state","useGlobalContext","useTimeout","nav","options","type","handleClose","bottomSheetModalRef","useRef","useEffect","current","present","useCallback","setTimeout","hide","snapPoints","useMemo","renderBackdrop","props","styles","bottomSheet","innerContainer","errorIcon","errorMessage","message","signInMessage","StyleSheet","create","modal","shadowColor","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","borderRadius","borderColor","borderWidth","padding","textAlign","fontSize"],"sources":["AutoSigninDialog.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from 'react';\nimport { View, Text, StyleSheet, ActivityIndicator } from 'react-native';\nimport {\n BottomSheetBackdrop,\n BottomSheetBackdropProps,\n BottomSheetModal,\n} from '@gorhom/bottom-sheet';\nimport { useTimeout } from 'usehooks-ts';\nimport { MaterialIcons } from '@expo/vector-icons';\n\nimport { useNav } from '../hooks';\nimport { useGlobalContext } from './GlobalContext';\n\nexport function AutoSigninDialog() {\n const navTo = useNav();\n const { state } = useGlobalContext();\n\n // Let the user know they're auto signing-in, then close when done\n useTimeout(() => {\n if (state.nav.options.type === 'error') {\n return;\n }\n\n handleClose();\n }, 3000);\n\n const bottomSheetModalRef = useRef<BottomSheetModal>(null);\n useEffect(() => {\n if (bottomSheetModalRef.current) {\n bottomSheetModalRef.current.present();\n }\n }, []);\n\n const handleClose = useCallback(() => {\n setTimeout(() => {\n navTo({ hide: true });\n }, 150);\n }, [navTo]);\n\n const snapPoints = useMemo(() => ['30%', '60%'], []);\n\n const renderBackdrop = useCallback(\n (props: BottomSheetBackdropProps) => (\n <BottomSheetBackdrop {...props} pressBehavior=\"none\" />\n ),\n []\n );\n\n return (\n <BottomSheetModal\n snapPoints={snapPoints}\n index={0}\n backdropComponent={renderBackdrop}\n keyboardBehavior=\"fillParent\"\n android_keyboardInputMode=\"adjustResize\"\n enablePanDownToClose={state.nav.options.type === 'error'}\n onDismiss={handleClose}\n style={styles.bottomSheet}\n ref={bottomSheetModalRef}\n >\n <View style={styles.innerContainer}>\n {state.nav.options.type === 'error' && (\n <>\n <MaterialIcons\n name=\"error\"\n size={24}\n color=\"#DA1E28\"\n style={styles.errorIcon}\n />\n <Text style={styles.errorMessage}>\n {state.nav.options.message ||\n 'An error occurred. Please try again.'}\n </Text>\n </>\n )}\n\n {state.nav.options.type === 'sign-in' && (\n <>\n <ActivityIndicator size=\"large\" color=\"#5b0ae0\" />\n <Text style={styles.signInMessage}>\n Automatically signing you in. Just a sec...\n </Text>\n </>\n )}\n </View>\n </BottomSheetModal>\n );\n}\n\nconst styles = StyleSheet.create({\n modal: {\n // flex: 1,\n },\n bottomSheet: {\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 12,\n },\n shadowOpacity: 0.58,\n shadowRadius: 16.0,\n\n elevation: 24,\n },\n innerContainer: {\n borderRadius: 20,\n borderColor: 'transparent',\n borderWidth: 0,\n padding: 25,\n textAlign: 'center',\n },\n signInMessage: {\n textAlign: 'center',\n fontSize: 24,\n padding: 20,\n },\n errorMessage: {\n textAlign: 'center',\n fontSize: 24,\n padding: 20,\n },\n errorIcon: {\n textAlign: 'center',\n },\n});\n"],"mappings":"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"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DefaultContext = DefaultContext;
7
+
8
+ var _react = require("react");
9
+
10
+ var _isEqual = _interopRequireDefault(require("lodash-es/isEqual"));
11
+
12
+ var _hooks = require("../hooks");
13
+
14
+ var _api = require("../hooks/api");
15
+
16
+ var _GlobalContext = require("./GlobalContext");
17
+
18
+ var _actions = require("../data/actions");
19
+
20
+ var _ky = _interopRequireDefault(require("ky"));
21
+
22
+ var Clipboard = _interopRequireWildcard(require("expo-clipboard"));
23
+
24
+ var _reactNativeBase = _interopRequireDefault(require("react-native-base64"));
25
+
26
+ var _reactNative = require("react-native");
27
+
28
+ var _events = require("../utils/events");
29
+
30
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
+
32
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
+
34
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
+
36
+ function DefaultContext(_ref) {
37
+ let {
38
+ config
39
+ } = _ref;
40
+ const {
41
+ state,
42
+ dispatch
43
+ } = (0, _GlobalContext.useGlobalContext)();
44
+ const {
45
+ client: api
46
+ } = (0, _hooks.useApi)();
47
+ (0, _hooks.useDeviceFingerprint)(); // Fetch app schema and config
48
+
49
+ (0, _react.useEffect)(() => {
50
+ (async () => {
51
+ try {
52
+ var _resp$app;
53
+
54
+ const resp = await api.get('hub/app-config', {
55
+ headers: {
56
+ 'x-rownd-app-key': config.appKey
57
+ }
58
+ }).json();
59
+
60
+ if (resp !== null && resp !== void 0 && (_resp$app = resp.app) !== null && _resp$app !== void 0 && _resp$app.icon) {
61
+ const iconMeta = await _ky.default.head(resp.app.icon);
62
+ resp.app.icon_content_type = iconMeta.headers.get('content-type');
63
+ }
64
+
65
+ dispatch({
66
+ type: _actions.ActionType.SET_APP_CONFIG,
67
+ payload: resp.app
68
+ });
69
+ } catch (err) {
70
+ console.error('Failed to fetch app config:', err);
71
+ }
72
+ })();
73
+ }, [api, config.appKey, dispatch]);
74
+ /**
75
+ * If not signed in, check the clipboard for an init hash or auth link we can use to auto-auth the user
76
+ */
77
+
78
+ (0, _react.useEffect)(() => {
79
+ if (state.auth.access_token || !state.app.id) {
80
+ return;
81
+ }
82
+
83
+ (async () => {
84
+ try {
85
+ let authData = null;
86
+ let authLink = (await _reactNative.Linking.getInitialURL()) || (await Clipboard.getStringAsync());
87
+
88
+ if (authLink.includes('rownd.link')) {
89
+ dispatch({
90
+ type: _actions.ActionType.CHANGE_ROUTE,
91
+ payload: {
92
+ route: '/account/auto-signin',
93
+ opts: {
94
+ type: 'sign-in'
95
+ }
96
+ }
97
+ });
98
+ authData = await _ky.default.get(authLink, {
99
+ headers: {
100
+ 'User-Agent': _api.DEFAULT_USER_AGENT
101
+ }
102
+ }).json();
103
+ } else if (authLink.startsWith('rph_init=')) {
104
+ const authStr = authLink.split('rph_init=')[1];
105
+ authData = JSON.parse(_reactNativeBase.default.decode(authStr));
106
+ } else {
107
+ return;
108
+ } // Clear the clipboard value so we don't leak any creds
109
+
110
+
111
+ await Clipboard.setStringAsync('');
112
+ dispatch({
113
+ type: _actions.ActionType.LOGIN_SUCCESS,
114
+ payload: authData
115
+ });
116
+ } catch (err) {
117
+ console.error('We found an auth link or string, but failed to authenticate with it because:', err);
118
+ }
119
+ })();
120
+ }, [state.auth.access_token, state.app.id, dispatch]);
121
+ const retrieveUserInfo = (0, _react.useCallback)(() => {
122
+ if (!state.auth.access_token || !state.app.id) {
123
+ return;
124
+ }
125
+
126
+ (async () => {
127
+ const userInfo = await api.get(`me/applications/${state.app.id}/data`, {
128
+ headers: {
129
+ Authorization: `Bearer ${state.auth.access_token}`
130
+ }
131
+ }).json();
132
+ dispatch({
133
+ type: _actions.ActionType.LOAD_USER,
134
+ payload: userInfo
135
+ });
136
+ dispatch({
137
+ type: _actions.ActionType.UPDATE_LOCAL_ACLS,
138
+ payload: userInfo.redacted.reduce((acc, field) => {
139
+ acc[field] = {
140
+ shared: false
141
+ };
142
+ return acc;
143
+ }, {})
144
+ });
145
+ })();
146
+ }, [api, dispatch, state.app.id, state.auth.access_token]);
147
+ const retrieveAcls = (0, _react.useCallback)(() => {
148
+ if (!state.app.id || !state.auth.access_token) {
149
+ return;
150
+ }
151
+
152
+ (async () => {
153
+ try {
154
+ const appUserAcls = await api.get(`me/applications/${state.app.id}/acls`, {
155
+ headers: {
156
+ Authorization: `Bearer ${state.auth.access_token}`
157
+ }
158
+ }).json();
159
+ dispatch({
160
+ type: _actions.ActionType.UPDATE_LOCAL_ACLS,
161
+ payload: appUserAcls.acls
162
+ });
163
+ } catch (err) {
164
+ if (err instanceof Error) {
165
+ // const unsharedAcls = reduceSchemaToUnsharedAcls();
166
+ dispatch({
167
+ type: _actions.ActionType.UPDATE_LOCAL_ACLS,
168
+ payload: {}
169
+ });
170
+ }
171
+ }
172
+ })();
173
+ }, [api, dispatch, state.app.id, state.auth.access_token]);
174
+ (0, _react.useEffect)(retrieveUserInfo, [retrieveUserInfo]);
175
+ (0, _react.useEffect)(retrieveAcls, [retrieveAcls]);
176
+ (0, _react.useEffect)(() => {
177
+ if (!state.user.needs_refresh) {
178
+ return;
179
+ }
180
+
181
+ retrieveUserInfo();
182
+ dispatch({
183
+ type: _actions.ActionType.SET_REFRESH_USER_DATA,
184
+ payload: {
185
+ needs_refresh: false
186
+ }
187
+ });
188
+ }, [dispatch, retrieveUserInfo, state.user.needs_refresh]);
189
+ const saveAclsDebounced = (0, _hooks.useDebounce)(saveAcls, 2000); // 2s
190
+
191
+ async function saveAcls() {
192
+ if (state.app.id && state.local_acls) {
193
+ await api.put(`me/applications/${state.app.id}/acls`, {
194
+ headers: {
195
+ Authorization: `Bearer ${state.auth.access_token}`
196
+ },
197
+ json: {
198
+ acls: state.local_acls
199
+ }
200
+ }).json();
201
+ }
202
+ }
203
+
204
+ const localAclsRef = (0, _react.useRef)(state.local_acls);
205
+ (0, _react.useEffect)(() => {
206
+ // Don't save acls if they were just loaded for the first time or they haven't changed
207
+ if (!localAclsRef.current || (0, _isEqual.default)(localAclsRef.current, state.local_acls)) {
208
+ return;
209
+ }
210
+
211
+ saveAclsDebounced();
212
+ }, [saveAclsDebounced, state.local_acls]);
213
+ const saveUserDataDebounced = (0, _hooks.useDebounce)(saveUserData, 2000); // 2s
214
+ // Save user data in the application state to the API server
215
+
216
+ async function saveUserData() {
217
+ if (state.app.id && state.user.data && state.auth.access_token) {
218
+ dispatch({
219
+ type: _actions.ActionType.SET_IS_SAVING_USER_DATA,
220
+ payload: {
221
+ saving: true
222
+ }
223
+ });
224
+ const eventDetails = {};
225
+
226
+ try {
227
+ eventDetails.data = await api.put(`me/applications/${state.app.id}/data`, {
228
+ headers: {
229
+ Authorization: `Bearer ${state.auth.access_token}`
230
+ },
231
+ json: {
232
+ data: state.user.data
233
+ }
234
+ }).json();
235
+ } catch (err) {
236
+ eventDetails.error = err; // Get the latest user info from Rownd. Something was probably bad
237
+ // with the data we just tried to save.
238
+ // This is a bit hacky. We should be able to reset the state without
239
+ // calling rownd again by rolling back to a previously good state...
240
+
241
+ retrieveUserInfo(); // TODO: Set some error state
242
+ } finally {
243
+ _events.events.dispatch(_events.EventType.USER_DATA_SAVED, eventDetails);
244
+
245
+ dispatch({
246
+ type: _actions.ActionType.SET_IS_SAVING_USER_DATA,
247
+ payload: {
248
+ saving: false
249
+ }
250
+ });
251
+ }
252
+ }
253
+ }
254
+
255
+ const userDataRef = (0, _react.useRef)(state.user.data);
256
+ (0, _react.useEffect)(() => {
257
+ var _state$user$data;
258
+
259
+ // Don't update the user data in the API server if the email is unknown or the data hasn't changed
260
+ if (!((_state$user$data = state.user.data) !== null && _state$user$data !== void 0 && _state$user$data.email) && !state.user.data.phone_number || (0, _isEqual.default)(userDataRef.current, state.user.data)) {
261
+ return;
262
+ }
263
+
264
+ saveUserDataDebounced();
265
+ userDataRef.current = state.user.data;
266
+ }, [dispatch, saveUserDataDebounced, state.user.data]);
267
+ return null;
268
+ }
269
+ //# sourceMappingURL=DefaultContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DefaultContext","config","state","dispatch","useGlobalContext","client","api","useApi","useDeviceFingerprint","useEffect","resp","get","headers","appKey","json","app","icon","iconMeta","ky","head","icon_content_type","type","ActionType","SET_APP_CONFIG","payload","err","console","error","auth","access_token","id","authData","authLink","Linking","getInitialURL","Clipboard","getStringAsync","includes","CHANGE_ROUTE","route","opts","DEFAULT_USER_AGENT","startsWith","authStr","split","JSON","parse","base64","decode","setStringAsync","LOGIN_SUCCESS","retrieveUserInfo","useCallback","userInfo","Authorization","LOAD_USER","UPDATE_LOCAL_ACLS","redacted","reduce","acc","field","shared","retrieveAcls","appUserAcls","acls","Error","user","needs_refresh","SET_REFRESH_USER_DATA","saveAclsDebounced","useDebounce","saveAcls","local_acls","put","localAclsRef","useRef","current","isEqual","saveUserDataDebounced","saveUserData","data","SET_IS_SAVING_USER_DATA","saving","eventDetails","events","EventType","USER_DATA_SAVED","userDataRef","email","phone_number"],"sources":["DefaultContext.tsx"],"sourcesContent":["import { useEffect, useCallback, useRef } from 'react';\nimport isEqual from 'lodash-es/isEqual';\nimport { useDebounce, useApi, useDeviceFingerprint } from '../hooks';\nimport { DEFAULT_USER_AGENT } from '../hooks/api';\nimport type { IConfig } from '../utils/config';\nimport { useGlobalContext } from './GlobalContext';\nimport { ActionType } from '../data/actions';\nimport ky from 'ky';\nimport * as Clipboard from 'expo-clipboard';\nimport base64 from 'react-native-base64';\nimport { Linking } from 'react-native';\nimport { events, EventType } from '../utils/events';\n\nexport type UserInfoResp = {\n data: {\n [key: string]: any;\n };\n redacted: string[];\n};\n\ninterface UserAclsResponse {\n acls: Record<string, { shared: boolean }>;\n}\n\ntype DefaultContextProps = {\n config: IConfig;\n};\n\nexport function DefaultContext({ config }: DefaultContextProps) {\n const { state, dispatch } = useGlobalContext();\n const { client: api } = useApi();\n useDeviceFingerprint();\n\n // Fetch app schema and config\n useEffect(() => {\n (async () => {\n try {\n const resp: any = await api\n .get('hub/app-config', {\n headers: {\n 'x-rownd-app-key': config.appKey,\n },\n })\n .json();\n\n if (resp?.app?.icon) {\n const iconMeta = await ky.head(resp.app.icon);\n resp.app.icon_content_type = iconMeta.headers.get('content-type');\n }\n\n dispatch({\n type: ActionType.SET_APP_CONFIG,\n payload: resp.app,\n });\n } catch (err) {\n console.error('Failed to fetch app config:', err);\n }\n })();\n }, [api, config.appKey, dispatch]);\n\n /**\n * If not signed in, check the clipboard for an init hash or auth link we can use to auto-auth the user\n */\n useEffect(() => {\n if (state.auth.access_token || !state.app.id) {\n return;\n }\n\n (async () => {\n try {\n let authData = null;\n\n let authLink =\n (await Linking.getInitialURL()) || (await Clipboard.getStringAsync());\n if (authLink.includes('rownd.link')) {\n dispatch({\n type: ActionType.CHANGE_ROUTE,\n payload: {\n route: '/account/auto-signin',\n opts: {\n type: 'sign-in',\n },\n },\n });\n\n authData = await ky\n .get(authLink, {\n headers: {\n 'User-Agent': DEFAULT_USER_AGENT,\n },\n })\n .json();\n } else if (authLink.startsWith('rph_init=')) {\n const authStr = authLink.split('rph_init=')[1];\n authData = JSON.parse(base64.decode(authStr));\n } else {\n return;\n }\n\n // Clear the clipboard value so we don't leak any creds\n await Clipboard.setStringAsync('');\n\n dispatch({\n type: ActionType.LOGIN_SUCCESS,\n payload: authData,\n });\n } catch (err) {\n console.error(\n 'We found an auth link or string, but failed to authenticate with it because:',\n err\n );\n }\n })();\n }, [state.auth.access_token, state.app.id, dispatch]);\n\n const retrieveUserInfo = useCallback(() => {\n if (!state.auth.access_token || !state.app.id) {\n return;\n }\n\n (async () => {\n const userInfo: UserInfoResp = await api\n .get(`me/applications/${state.app.id}/data`, {\n headers: {\n Authorization: `Bearer ${state.auth.access_token}`,\n },\n })\n .json();\n dispatch({\n type: ActionType.LOAD_USER,\n payload: userInfo,\n });\n\n dispatch({\n type: ActionType.UPDATE_LOCAL_ACLS,\n payload: userInfo.redacted.reduce(\n (acc: Record<string, any>, field: string) => {\n acc[field] = { shared: false };\n return acc;\n },\n {}\n ),\n });\n })();\n }, [api, dispatch, state.app.id, state.auth.access_token]);\n\n const retrieveAcls = useCallback(() => {\n if (!state.app.id || !state.auth.access_token) {\n return;\n }\n\n (async () => {\n try {\n const appUserAcls: UserAclsResponse = await api\n .get(`me/applications/${state.app.id}/acls`, {\n headers: {\n Authorization: `Bearer ${state.auth.access_token}`,\n },\n })\n .json();\n dispatch({\n type: ActionType.UPDATE_LOCAL_ACLS,\n payload: appUserAcls.acls,\n });\n } catch (err) {\n if (err instanceof Error) {\n // const unsharedAcls = reduceSchemaToUnsharedAcls();\n dispatch({\n type: ActionType.UPDATE_LOCAL_ACLS,\n payload: {},\n });\n }\n }\n })();\n }, [api, dispatch, state.app.id, state.auth.access_token]);\n\n useEffect(retrieveUserInfo, [retrieveUserInfo]);\n useEffect(retrieveAcls, [retrieveAcls]);\n\n useEffect(() => {\n if (!state.user.needs_refresh) {\n return;\n }\n retrieveUserInfo();\n dispatch({\n type: ActionType.SET_REFRESH_USER_DATA,\n payload: { needs_refresh: false },\n });\n }, [dispatch, retrieveUserInfo, state.user.needs_refresh]);\n\n const saveAclsDebounced = useDebounce(saveAcls, 2000); // 2s\n\n async function saveAcls() {\n if (state.app.id && state.local_acls) {\n await api\n .put(`me/applications/${state.app.id}/acls`, {\n headers: {\n Authorization: `Bearer ${state.auth.access_token}`,\n },\n json: {\n acls: state.local_acls,\n },\n })\n .json();\n }\n }\n\n const localAclsRef = useRef(state.local_acls);\n useEffect(() => {\n // Don't save acls if they were just loaded for the first time or they haven't changed\n if (\n !localAclsRef.current ||\n isEqual(localAclsRef.current, state.local_acls)\n ) {\n return;\n }\n saveAclsDebounced();\n }, [saveAclsDebounced, state.local_acls]);\n\n const saveUserDataDebounced = useDebounce(saveUserData, 2000); // 2s\n\n // Save user data in the application state to the API server\n async function saveUserData() {\n if (state.app.id && state.user.data && state.auth.access_token) {\n dispatch({\n type: ActionType.SET_IS_SAVING_USER_DATA,\n payload: {\n saving: true,\n },\n });\n\n const eventDetails: Record<string, any> = {};\n try {\n eventDetails.data = await api\n .put(`me/applications/${state.app.id}/data`, {\n headers: {\n Authorization: `Bearer ${state.auth.access_token}`,\n },\n json: {\n data: state.user.data,\n },\n })\n .json();\n } catch (err) {\n eventDetails.error = err;\n // Get the latest user info from Rownd. Something was probably bad\n // with the data we just tried to save.\n // This is a bit hacky. We should be able to reset the state without\n // calling rownd again by rolling back to a previously good state...\n retrieveUserInfo();\n // TODO: Set some error state\n } finally {\n events.dispatch(EventType.USER_DATA_SAVED, eventDetails);\n dispatch({\n type: ActionType.SET_IS_SAVING_USER_DATA,\n payload: {\n saving: false,\n },\n });\n }\n }\n }\n\n const userDataRef = useRef(state.user.data);\n useEffect(() => {\n // Don't update the user data in the API server if the email is unknown or the data hasn't changed\n if (\n (!state.user.data?.email && !state.user.data.phone_number) ||\n isEqual(userDataRef.current, state.user.data)\n ) {\n return;\n }\n saveUserDataDebounced();\n userDataRef.current = state.user.data;\n }, [dispatch, saveUserDataDebounced, state.user.data]);\n\n return null;\n}\n"],"mappings":"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"}