@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.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/android/build.gradle +59 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/com/reactnative/ReactNativePackage.java +22 -0
- package/android/src/main/java/com/reactnative/ReactNativeViewManager.java +31 -0
- package/ios/ReactNative.xcodeproj/project.pbxproj +282 -0
- package/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
- package/ios/ReactNativeViewManager.m +34 -0
- package/lib/commonjs/assets/images/checkmark--filled.svg +12 -0
- package/lib/commonjs/assets/images/email-verify-waiting.svg +36 -0
- package/lib/commonjs/assets/images/phone-verify-waiting.svg +26 -0
- package/lib/commonjs/components/AuthenticatedComponent.js +35 -0
- package/lib/commonjs/components/AuthenticatedComponent.js.map +1 -0
- package/lib/commonjs/components/AutoSigninDialog.js +119 -0
- package/lib/commonjs/components/AutoSigninDialog.js.map +1 -0
- package/lib/commonjs/components/DefaultContext.js +269 -0
- package/lib/commonjs/components/DefaultContext.js.map +1 -0
- package/lib/commonjs/components/GlobalContext.js +340 -0
- package/lib/commonjs/components/GlobalContext.js.map +1 -0
- package/lib/commonjs/components/RowndComponents.js +29 -0
- package/lib/commonjs/components/RowndComponents.js.map +1 -0
- package/lib/commonjs/components/RowndProvider.js +55 -0
- package/lib/commonjs/components/RowndProvider.js.map +1 -0
- package/lib/commonjs/components/SignIn.js +622 -0
- package/lib/commonjs/components/SignIn.js.map +1 -0
- package/lib/commonjs/data/actions.js +26 -0
- package/lib/commonjs/data/actions.js.map +1 -0
- package/lib/commonjs/hooks/api.js +157 -0
- package/lib/commonjs/hooks/api.js.map +1 -0
- package/lib/commonjs/hooks/debounce.js +38 -0
- package/lib/commonjs/hooks/debounce.js.map +1 -0
- package/lib/commonjs/hooks/fingerprint.js +176 -0
- package/lib/commonjs/hooks/fingerprint.js.map +1 -0
- package/lib/commonjs/hooks/index.js +48 -0
- package/lib/commonjs/hooks/index.js.map +1 -0
- package/lib/commonjs/hooks/interval.js +31 -0
- package/lib/commonjs/hooks/interval.js.map +1 -0
- package/lib/commonjs/hooks/nav.js +39 -0
- package/lib/commonjs/hooks/nav.js.map +1 -0
- package/lib/commonjs/hooks/rownd.js +163 -0
- package/lib/commonjs/hooks/rownd.js.map +1 -0
- package/lib/commonjs/index.js +32 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.tsx.bak +26 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/config.js +28 -0
- package/lib/commonjs/utils/config.js.map +1 -0
- package/lib/commonjs/utils/events.js +57 -0
- package/lib/commonjs/utils/events.js.map +1 -0
- package/lib/commonjs/utils/form.js +46 -0
- package/lib/commonjs/utils/form.js.map +1 -0
- package/lib/commonjs/utils/queue.js +117 -0
- package/lib/commonjs/utils/queue.js.map +1 -0
- package/lib/commonjs/utils/storage.js +15 -0
- package/lib/commonjs/utils/storage.js.map +1 -0
- package/lib/commonjs/utils/tailwind.js +17 -0
- package/lib/commonjs/utils/tailwind.js.map +1 -0
- package/lib/commonjs/utils/tokens.js +35 -0
- package/lib/commonjs/utils/tokens.js.map +1 -0
- package/lib/commonjs/utils/user-data.js +21 -0
- package/lib/commonjs/utils/user-data.js.map +1 -0
- package/lib/module/assets/images/checkmark--filled.svg +12 -0
- package/lib/module/assets/images/email-verify-waiting.svg +36 -0
- package/lib/module/assets/images/phone-verify-waiting.svg +26 -0
- package/lib/module/components/AuthenticatedComponent.js +24 -0
- package/lib/module/components/AuthenticatedComponent.js.map +1 -0
- package/lib/module/components/AutoSigninDialog.js +100 -0
- package/lib/module/components/AutoSigninDialog.js.map +1 -0
- package/lib/module/components/DefaultContext.js +244 -0
- package/lib/module/components/DefaultContext.js.map +1 -0
- package/lib/module/components/GlobalContext.js +318 -0
- package/lib/module/components/GlobalContext.js.map +1 -0
- package/lib/module/components/RowndComponents.js +14 -0
- package/lib/module/components/RowndComponents.js.map +1 -0
- package/lib/module/components/RowndProvider.js +39 -0
- package/lib/module/components/RowndProvider.js.map +1 -0
- package/lib/module/components/SignIn.js +593 -0
- package/lib/module/components/SignIn.js.map +1 -0
- package/lib/module/data/actions.js +19 -0
- package/lib/module/data/actions.js.map +1 -0
- package/lib/module/hooks/api.js +138 -0
- package/lib/module/hooks/api.js.map +1 -0
- package/lib/module/hooks/debounce.js +29 -0
- package/lib/module/hooks/debounce.js.map +1 -0
- package/lib/module/hooks/fingerprint.js +157 -0
- package/lib/module/hooks/fingerprint.js.map +1 -0
- package/lib/module/hooks/index.js +7 -0
- package/lib/module/hooks/index.js.map +1 -0
- package/lib/module/hooks/interval.js +23 -0
- package/lib/module/hooks/interval.js.map +1 -0
- package/lib/module/hooks/nav.js +30 -0
- package/lib/module/hooks/nav.js.map +1 -0
- package/lib/module/hooks/rownd.js +148 -0
- package/lib/module/hooks/rownd.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.tsx.bak +26 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/config.js +17 -0
- package/lib/module/utils/config.js.map +1 -0
- package/lib/module/utils/events.js +45 -0
- package/lib/module/utils/events.js.map +1 -0
- package/lib/module/utils/form.js +34 -0
- package/lib/module/utils/form.js.map +1 -0
- package/lib/module/utils/queue.js +109 -0
- package/lib/module/utils/queue.js.map +1 -0
- package/lib/module/utils/storage.js +6 -0
- package/lib/module/utils/storage.js.map +1 -0
- package/lib/module/utils/tailwind.js +5 -0
- package/lib/module/utils/tailwind.js.map +1 -0
- package/lib/module/utils/tokens.js +24 -0
- package/lib/module/utils/tokens.js.map +1 -0
- package/lib/module/utils/user-data.js +14 -0
- package/lib/module/utils/user-data.js.map +1 -0
- package/lib/typescript/example2/App.d.ts +11 -0
- package/lib/typescript/src/components/AuthenticatedComponent.d.ts +7 -0
- package/lib/typescript/src/components/AutoSigninDialog.d.ts +1 -0
- package/lib/typescript/src/components/DefaultContext.d.ts +12 -0
- package/lib/typescript/src/components/GlobalContext.d.ts +111 -0
- package/lib/typescript/src/components/RowndComponents.d.ts +1 -0
- package/lib/typescript/src/components/RowndProvider.d.ts +8 -0
- package/lib/typescript/src/components/SignIn.d.ts +1 -0
- package/lib/typescript/src/data/actions.d.ts +20 -0
- package/lib/typescript/src/hooks/api.d.ts +12 -0
- package/lib/typescript/src/hooks/debounce.d.ts +5 -0
- package/lib/typescript/src/hooks/fingerprint.d.ts +12 -0
- package/lib/typescript/src/hooks/index.d.ts +6 -0
- package/lib/typescript/src/hooks/interval.d.ts +2 -0
- package/lib/typescript/src/hooks/nav.d.ts +6 -0
- package/lib/typescript/src/hooks/rownd.d.ts +37 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/types.d.ts +26 -0
- package/lib/typescript/src/utils/config.d.ts +18 -0
- package/lib/typescript/src/utils/events.d.ts +22 -0
- package/lib/typescript/src/utils/form.d.ts +17 -0
- package/lib/typescript/src/utils/queue.d.ts +21 -0
- package/lib/typescript/src/utils/storage.d.ts +3 -0
- package/lib/typescript/src/utils/tailwind.d.ts +2 -0
- package/lib/typescript/src/utils/tokens.d.ts +4 -0
- package/lib/typescript/src/utils/user-data.d.ts +3 -0
- package/lib/typescript/tailwind.config.d.ts +10 -0
- package/package.json +177 -0
- package/react-native.podspec +19 -0
- package/src/assets/images/checkmark--filled.svg +12 -0
- package/src/assets/images/email-verify-waiting.svg +36 -0
- package/src/assets/images/phone-verify-waiting.svg +26 -0
- package/src/components/AuthenticatedComponent.tsx +30 -0
- package/src/components/AutoSigninDialog.tsx +125 -0
- package/src/components/DefaultContext.tsx +278 -0
- package/src/components/GlobalContext.tsx +485 -0
- package/src/components/RowndComponents.tsx +21 -0
- package/src/components/RowndProvider.tsx +56 -0
- package/src/components/SignIn.tsx +770 -0
- package/src/data/actions.ts +21 -0
- package/src/hooks/api.ts +163 -0
- package/src/hooks/debounce.ts +36 -0
- package/src/hooks/fingerprint.ts +217 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/interval.ts +25 -0
- package/src/hooks/nav.tsx +29 -0
- package/src/hooks/rownd.ts +184 -0
- package/src/index.tsx +6 -0
- package/src/index.tsx.bak +26 -0
- package/src/types.ts +27 -0
- package/src/utils/config.ts +36 -0
- package/src/utils/events.ts +54 -0
- package/src/utils/form.tsx +64 -0
- package/src/utils/queue.ts +75 -0
- package/src/utils/storage.ts +7 -0
- package/src/utils/tailwind.ts +6 -0
- package/src/utils/tokens.ts +26 -0
- 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,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
|
+
}
|