1 | import { useState, useEffect } from 'react';
|
2 | import { NativeEventEmitter, NativeModules } from 'react-native';
|
3 | import type { AsyncHookResult } from './types';
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | export function useOnMount<T>(asyncGetter: () => Promise<T>, initialResult: T): AsyncHookResult<T> {
|
11 | const [response, setResponse] = useState<AsyncHookResult<T>>({
|
12 | loading: true,
|
13 | result: initialResult,
|
14 | });
|
15 |
|
16 | useEffect(() => {
|
17 |
|
18 | const getAsync = async () => {
|
19 | const result = await asyncGetter();
|
20 | setResponse({ loading: false, result });
|
21 | };
|
22 |
|
23 | getAsync();
|
24 | }, [asyncGetter]);
|
25 |
|
26 | return response;
|
27 | }
|
28 |
|
29 | export const deviceInfoEmitter = new NativeEventEmitter(NativeModules.RNDeviceInfo);
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | export function useOnEvent<T>(
|
38 | eventName: string,
|
39 | initialValueAsyncGetter: () => Promise<T>,
|
40 | defaultValue: T
|
41 | ): AsyncHookResult<T> {
|
42 | const { loading, result: initialResult } = useOnMount(initialValueAsyncGetter, defaultValue);
|
43 | const [result, setResult] = useState<T>(defaultValue);
|
44 |
|
45 |
|
46 | useEffect(() => {
|
47 | setResult(initialResult);
|
48 | }, [initialResult]);
|
49 |
|
50 |
|
51 |
|
52 | useEffect(() => {
|
53 | const subscription = deviceInfoEmitter.addListener(eventName, setResult);
|
54 | return () => subscription.remove();
|
55 | }, [eventName]);
|
56 |
|
57 |
|
58 | return { loading, result };
|
59 | }
|