aboutsummaryrefslogtreecommitdiff
path: root/src/hooks/useFavorites.ts
blob: 54d77fdaf385d3299bc22c75a1c77587383a10bb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import {useCallback, useEffect, useState} from 'react';
import {useAsyncStorage} from '@react-native-async-storage/async-storage';

export const useFavorites = () => {
  const favoritesStorage = useAsyncStorage('favorites');
  const [favoriteAppNames, setFavoriteAppNames] = useState<string[]>([]);

  const getFavoriteAppNames = useCallback(async (): Promise<string[]> => {
    try {
      const result = await favoritesStorage.getItem();
      const apps = result ? JSON.parse(result) : [];
      if (!Array.isArray(apps)) return [];
      return apps;
    } catch (err) {
      console.error(err);
      return [];
    }
  }, [favoritesStorage]);

  const refreshFavorites = useCallback(async () => {
    getFavoriteAppNames().then(setFavoriteAppNames);
  }, [getFavoriteAppNames]);

  const setFavorites = useCallback(
    async (names: string[]) => {
      const newNames = [...new Set(names)];
      setFavoriteAppNames(newNames);
      await favoritesStorage.setItem(JSON.stringify(newNames));
    },
    [favoritesStorage],
  );

  const addToFavorites = useCallback(
    async (packageName: string) => {
      const names = await getFavoriteAppNames();
      setFavorites([...names, packageName]);
    },
    [getFavoriteAppNames, setFavorites],
  );

  useEffect(() => {
    refreshFavorites();
  }, [refreshFavorites]);

  return {
    favoriteAppNames,
    getFavoriteAppNames,
    addToFavorites,
    refreshFavorites,
    setFavorites,
  };
};