aboutsummaryrefslogtreecommitdiff
path: root/src/hooks/useFavorites.ts
blob: 619817ceb439314dfd996b12f0278c82af08e591 (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
import {useEffect, useState} from 'react';
import {useAsyncStorage} from '@react-native-async-storage/async-storage';
import {useStableCallback} from './useStableCallback';

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

  const getFavoriteAppNames = useStableCallback(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 [];
    }
  });

  const refreshFavorites = useStableCallback(async () => {
    getFavoriteAppNames().then(setFavoriteAppNames);
  });

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

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

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

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