@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,26 @@
1
+ import {
2
+ requireNativeComponent,
3
+ UIManager,
4
+ Platform,
5
+ ViewStyle,
6
+ } from 'react-native';
7
+
8
+ const LINKING_ERROR =
9
+ `The package '@rownd/react-native' doesn't seem to be linked. Make sure: \n\n` +
10
+ Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
11
+ '- You rebuilt the app after installing the package\n' +
12
+ '- You are not using Expo managed workflow\n';
13
+
14
+ type ReactNativeProps = {
15
+ color: string;
16
+ style: ViewStyle;
17
+ };
18
+
19
+ const ComponentName = 'ReactNativeView';
20
+
21
+ export const ReactNativeView =
22
+ UIManager.getViewManagerConfig(ComponentName) != null
23
+ ? requireNativeComponent<ReactNativeProps>(ComponentName)
24
+ : () => {
25
+ throw new Error(LINKING_ERROR);
26
+ };
package/src/types.ts ADDED
@@ -0,0 +1,27 @@
1
+ export type TRowndContext = {
2
+ requestSignIn: Function;
3
+ signOut: Function;
4
+ getAccessToken: Function;
5
+ is_authenticated: boolean;
6
+ is_initializing: boolean;
7
+ access_token: string | null;
8
+ auth: AuthContext;
9
+ user: UserContext;
10
+ };
11
+
12
+ type AuthContext = {
13
+ access_token: string | null;
14
+ app_id?: string;
15
+ is_authenticated: boolean;
16
+ is_verified_user?: boolean;
17
+ };
18
+
19
+ type UserContext = {
20
+ data: {
21
+ id?: string;
22
+ email?: string | null;
23
+ phone?: string | null;
24
+ [key: string]: any;
25
+ };
26
+ redacted_fields: string[];
27
+ };
@@ -0,0 +1,36 @@
1
+ import pickBy from 'lodash-es/pickBy';
2
+
3
+ export interface IConfig {
4
+ baseUrl: string;
5
+ apiUrl: string;
6
+ pdcBaseUrl: string;
7
+ appKey: string;
8
+ postLoginUrl: null | string;
9
+ postRegistrationUrl: null | string;
10
+ locationHash: null | string;
11
+ postAuthenticationApi: null | PostAuthApiSpec;
12
+ }
13
+
14
+ const config: IConfig = {
15
+ baseUrl: 'https://hub.rownd.io',
16
+ apiUrl: 'https://api.rownd.io',
17
+ pdcBaseUrl: 'https://mydata.rownd.io',
18
+ appKey: '',
19
+ postLoginUrl: null,
20
+ postRegistrationUrl: null,
21
+ locationHash: null,
22
+ postAuthenticationApi: null,
23
+ };
24
+
25
+ export type PostAuthApiSpec = {
26
+ method: 'post' | 'put';
27
+ url: string;
28
+ extra_headers: { [key: string]: string };
29
+ };
30
+
31
+ export function createConfig(opts: Partial<IConfig>): IConfig {
32
+ return {
33
+ ...config,
34
+ ...pickBy(opts),
35
+ };
36
+ }
@@ -0,0 +1,54 @@
1
+ import EventEmitter from 'eventemitter3';
2
+ const bus = new EventEmitter();
3
+
4
+ export enum EventType {
5
+ AUTH = 'auth',
6
+ SIGN_OUT = 'sign_out',
7
+ USER_DATA = 'user_data',
8
+ USER_DATA_SAVED = 'user_data_saved',
9
+ }
10
+
11
+ export type TAuthEvent = {
12
+ access_token: string;
13
+ user_id: string;
14
+ app_id: string;
15
+ };
16
+
17
+ type EventListenerOptions = {
18
+ once?: boolean;
19
+ };
20
+
21
+ export const events = {
22
+ addEventListener: (
23
+ type: string,
24
+ callback: (...args: any[]) => void | null,
25
+ options?: boolean | EventListenerOptions | undefined
26
+ ): void => {
27
+ if (!Object.values<string>(EventType).includes(type)) {
28
+ console.warn(`Unknown event type: ${type}`);
29
+ return;
30
+ }
31
+
32
+ let busFn = bus.on;
33
+ if (options === true || (options as EventListenerOptions)?.once) {
34
+ busFn = bus.once;
35
+ }
36
+
37
+ busFn.apply(bus, [type, callback, options]);
38
+ },
39
+ removeEventListener: bus.removeListener,
40
+ dispatchEvent: (event: CustomEvent): boolean => {
41
+ if (!Object.values<string>(EventType).includes(event.type)) {
42
+ throw new Error(`Unknown event type: ${event.type}`);
43
+ }
44
+
45
+ return bus.emit(event.type, event.detail);
46
+ },
47
+ dispatch(type: EventType, data: any): boolean {
48
+ if (!Object.values<string>(EventType).includes(type)) {
49
+ throw new Error(`Unknown event type: ${type}`);
50
+ }
51
+
52
+ return bus.emit(type, data);
53
+ },
54
+ };
@@ -0,0 +1,64 @@
1
+ import { Text, TextInput } from 'react-native';
2
+ import { Picker } from '@react-native-picker/picker';
3
+ import React from 'react';
4
+
5
+ type FormFieldProps = {
6
+ id?: string;
7
+ name: string;
8
+ value?: string;
9
+ type?: string;
10
+ label?: string;
11
+ placeholder?: string;
12
+ options?:
13
+ | [
14
+ {
15
+ value: string;
16
+ label: string;
17
+ }
18
+ ]
19
+ | null;
20
+ onChange?: (value: string) => void;
21
+ };
22
+
23
+ export function renderField({
24
+ id,
25
+ label = '',
26
+ name,
27
+ type = 'input',
28
+ value,
29
+ placeholder,
30
+ options = null,
31
+ onChange,
32
+ }: FormFieldProps) {
33
+ if (!id) {
34
+ id = `rph-input-${name}`;
35
+ }
36
+
37
+ return (
38
+ <>
39
+ {label && <Text>{label}</Text>}
40
+
41
+ {type === 'select' && (
42
+ <Picker
43
+ onValueChange={onChange}
44
+ selectedValue={value || options?.[0]?.value}
45
+ >
46
+ {options?.map((opt) => (
47
+ <Picker.Item value={opt.value} key={opt.value}>
48
+ {' '}
49
+ {opt.label}{' '}
50
+ </Picker.Item>
51
+ ))}
52
+ </Picker>
53
+ )}
54
+
55
+ {type === 'input' && (
56
+ <TextInput
57
+ value={value}
58
+ placeholder={placeholder}
59
+ onChangeText={onChange}
60
+ />
61
+ )}
62
+ </>
63
+ );
64
+ }
@@ -0,0 +1,75 @@
1
+ // import { logger } from "./utils/log";
2
+
3
+ let count = 0;
4
+
5
+ type QueueItem = {
6
+ action: () => Promise<any>;
7
+ resolve: (value?: any) => void;
8
+ reject: (reason?: any) => void;
9
+ count: number;
10
+ };
11
+
12
+ class Queue {
13
+ #_items: any[];
14
+ constructor() {
15
+ this.#_items = [];
16
+ }
17
+ enqueue(item: QueueItem | (() => Promise<any>)) {
18
+ this.#_items.push(item);
19
+ }
20
+ dequeue(): any {
21
+ return this.#_items.shift();
22
+ }
23
+ get size() {
24
+ return this.#_items.length;
25
+ }
26
+ }
27
+
28
+ class AutoQueue<T> extends Queue {
29
+ _cache: Record<string, unknown>;
30
+ #_pendingPromise: boolean;
31
+ constructor() {
32
+ super();
33
+ this.#_pendingPromise = false;
34
+ this._cache = {};
35
+ }
36
+
37
+ enqueue(action: () => Promise<any>): Promise<T> {
38
+ return new Promise((resolve, reject) => {
39
+ super.enqueue({ action, resolve, reject, count: count++ });
40
+ // logger.log('queued', count);
41
+ this.dequeue();
42
+ });
43
+ }
44
+
45
+ async dequeue() {
46
+ if (this.#_pendingPromise) return false;
47
+
48
+ const item = super.dequeue();
49
+
50
+ if (!item) {
51
+ this._cache = {};
52
+ return false;
53
+ }
54
+
55
+ // logger.log('dequeued', item.count);
56
+
57
+ try {
58
+ this.#_pendingPromise = true;
59
+
60
+ const payload = await item.action(this);
61
+
62
+ this.#_pendingPromise = false;
63
+ item.resolve(payload);
64
+ } catch (e) {
65
+ this.#_pendingPromise = false;
66
+ item.reject(e);
67
+ } finally {
68
+ this.dequeue();
69
+ }
70
+
71
+ return true;
72
+ }
73
+ }
74
+
75
+ export default AutoQueue;
@@ -0,0 +1,7 @@
1
+ import { MMKV } from 'react-native-mmkv';
2
+
3
+ const storage = new MMKV({
4
+ id: 'rownd-storage',
5
+ });
6
+
7
+ export default storage;
@@ -0,0 +1,6 @@
1
+ import { create } from 'twrnc';
2
+ import twConfig from '../../tailwind.config.js';
3
+
4
+ const tw = create(twConfig);
5
+
6
+ export default tw;
@@ -0,0 +1,26 @@
1
+ import jwt_decode from 'jwt-decode';
2
+
3
+ type TokenInput = Record<string, any> | string;
4
+
5
+ // Make sure token is always in a decoded form
6
+ function normalizeToken(token: TokenInput): Record<string, any> {
7
+ if (typeof token === 'string') {
8
+ return jwt_decode(token);
9
+ }
10
+
11
+ return token;
12
+ }
13
+
14
+ export function getAppId(token: TokenInput) {
15
+ token = normalizeToken(token);
16
+
17
+ return token?.aud
18
+ ?.find((aud: string) => aud.startsWith('app:'))
19
+ ?.substring(4);
20
+ }
21
+
22
+ export function getUserId(token: TokenInput) {
23
+ token = normalizeToken(token);
24
+
25
+ return token?.sub;
26
+ }
@@ -0,0 +1,15 @@
1
+ export function redactUserDataWithAcls(
2
+ userData: Record<string, any> | undefined | null,
3
+ acls: Record<string, { shared: boolean }> | undefined | null
4
+ ): Record<string, any> {
5
+ if (!userData) {
6
+ return {};
7
+ }
8
+ return Object.entries(userData).reduce(
9
+ (acc: Record<string, any>, [key, value]) => {
10
+ acc[key] = !acls?.[key] || acls?.[key]?.shared ? value : 'ROWND_REDACTED';
11
+ return acc;
12
+ },
13
+ {}
14
+ );
15
+ }