async-storage.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import AsyncStorage from '@react-native-async-storage/async-storage';
  2. import { Song } from '@/types/song';
  3. export const addToFavoritesStorage = async (song: Song): Promise<boolean> => {
  4. try {
  5. const stored = await AsyncStorage.getItem('favorites');
  6. const parsed: Song[] = stored ? JSON.parse(stored) : [];
  7. const updatedFavorites = [...parsed, song];
  8. await AsyncStorage.setItem('favorites', JSON.stringify(updatedFavorites));
  9. return true;
  10. } catch (error) {
  11. console.error('Error adding to favorites:', error);
  12. return false;
  13. }
  14. };
  15. export interface FavoriteFolder {
  16. id: string;
  17. name: string;
  18. songs: Song[];
  19. expanded: boolean;
  20. }
  21. const STORAGE_KEY = 'favoritesFolders';
  22. // 폴더 저장
  23. export const saveFavoriteFolders = async (folders: FavoriteFolder[]): Promise<void> => {
  24. try {
  25. await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(folders));
  26. } catch (error) {
  27. console.error('Error saving favorite folders:', error);
  28. }
  29. };
  30. // 폴더 불러오기
  31. export const loadFavoriteFolders = async (): Promise<FavoriteFolder[]> => {
  32. try {
  33. const stored = await AsyncStorage.getItem(STORAGE_KEY);
  34. return stored ? JSON.parse(stored) : [];
  35. } catch (error) {
  36. console.error('Error loading favorite folders:', error);
  37. return [];
  38. }
  39. };
  40. // 폴더 초기화
  41. export const clearFavoriteFolders = async (): Promise<void> => {
  42. try {
  43. await AsyncStorage.removeItem(STORAGE_KEY);
  44. } catch (error) {
  45. console.error('Error clearing favorite folders:', error);
  46. }
  47. };
  48. // 🔹 폴더에 노래 추가
  49. export const addSongToFolder = async (
  50. folderId: string,
  51. song: Song
  52. ): Promise<FavoriteFolder[] | null> => {
  53. try {
  54. const folders = await loadFavoriteFolders();
  55. const updated = folders.map((folder) => {
  56. if (folder.id === folderId) {
  57. const isDuplicate = folder.songs.some((s) => s.no === song.no);
  58. if (!isDuplicate) {
  59. return { ...folder, songs: [...folder.songs, song] };
  60. }
  61. }
  62. return folder;
  63. });
  64. await saveFavoriteFolders(updated);
  65. return updated;
  66. } catch (error) {
  67. console.error('Error adding song to folder:', error);
  68. return null;
  69. }
  70. };
  71. // 🔸 폴더에서 노래 삭제
  72. export const removeSongFromFolder = async (
  73. folderId: string,
  74. songNo: string
  75. ): Promise<FavoriteFolder[] | null> => {
  76. try {
  77. const folders = await loadFavoriteFolders();
  78. const updated = folders.map((folder) => {
  79. if (folder.id === folderId) {
  80. return {
  81. ...folder,
  82. songs: folder.songs.filter((s) => s.no !== songNo),
  83. };
  84. }
  85. return folder;
  86. });
  87. await saveFavoriteFolders(updated);
  88. return updated;
  89. } catch (error) {
  90. console.error('Error removing song from folder:', error);
  91. return null;
  92. }
  93. };