1import { Entypo, Ionicons, MaterialIcons } from '@expo/vector-icons';
2import { Assets as StackAssets } from '@react-navigation/stack';
3import { Asset } from 'expo-asset';
4import * as Font from 'expo-font';
5import { Platform } from 'react-native';
6
7import Icons from '../constants/Icons';
8
9async function loadAssetsAsync() {
10  const iconRequires = Object.keys(Icons).map(key => Icons[key]);
11
12  const assetPromises: Promise<any>[] = [
13    Asset.loadAsync(iconRequires),
14    Asset.loadAsync(StackAssets),
15    // @ts-ignore
16    Font.loadAsync(Ionicons.font),
17    // @ts-ignore
18    Font.loadAsync(Entypo.font),
19    // @ts-ignore
20    Font.loadAsync(MaterialIcons.font),
21    Font.loadAsync({
22      'space-mono': require('../../assets/fonts/SpaceMono-Regular.ttf'),
23    }),
24  ];
25  if (Platform.OS !== 'web') {
26    assetPromises.push(
27      Font.loadAsync({
28        Roboto: 'https://github.com/google/fonts/raw/d1a2e0f/ofl/roboto/static/Roboto-Regular.ttf',
29      })
30    );
31  }
32  await Promise.all(assetPromises);
33}
34
35let oncePromise: Promise<void>;
36export default function loadAssetsAsyncOnce() {
37  oncePromise = oncePromise || loadAssetsAsync();
38  return oncePromise;
39}
40