import type { ICellRendererParams } from '@ag-grid-community/core'; import { RiHeartFill, RiHeartLine } from 'react-icons/ri'; import { Button } from '/@/renderer/components/button'; import { CellContainer } from '/@/renderer/components/virtual-table/cells/generic-cell'; import { useMutation } from '@tanstack/react-query'; import { HTTPError } from 'ky'; import { api } from '/@/renderer/api'; import { RawFavoriteResponse, FavoriteArgs, LibraryItem } from '/@/renderer/api/types'; import { useCurrentServer, useSetAlbumListItemDataById } from '/@/renderer/store'; const useCreateFavorite = () => { const server = useCurrentServer(); const setAlbumListData = useSetAlbumListItemDataById(); return useMutation, null>({ mutationFn: (args) => api.controller.createFavorite({ ...args, server }), onSuccess: (_data, variables) => { for (const id of variables.query.id) { // Set the userFavorite property to true for the album in the album list data store if (variables.query.type === LibraryItem.ALBUM) { setAlbumListData(id, { userFavorite: true }); } } }, }); }; const useDeleteFavorite = () => { const server = useCurrentServer(); const setAlbumListData = useSetAlbumListItemDataById(); return useMutation, null>({ mutationFn: (args) => api.controller.deleteFavorite({ ...args, server }), onSuccess: (_data, variables) => { for (const id of variables.query.id) { // Set the userFavorite property to false for the album in the album list data store if (variables.query.type === LibraryItem.ALBUM) { setAlbumListData(id, { userFavorite: false }); } } }, }); }; export const FavoriteCell = ({ value, data, node }: ICellRendererParams) => { const createMutation = useCreateFavorite(); const deleteMutation = useDeleteFavorite(); const handleToggleFavorite = () => { const newFavoriteValue = !value; if (newFavoriteValue) { createMutation.mutate( { query: { id: [data.id], type: data.itemType, }, }, { onSuccess: () => { node.setData({ ...data, userFavorite: newFavoriteValue }); }, }, ); } else { deleteMutation.mutate( { query: { id: [data.id], type: data.itemType, }, }, { onSuccess: () => { node.setData({ ...data, userFavorite: newFavoriteValue }); }, }, ); } }; return ( ); };