A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at fix/spotify 144 lines 3.5 kB view raw
1import { useMutation, useQuery } from "@tanstack/react-query"; 2import axios from "axios"; 3import { useCallback } from "react"; 4import { 5 cancelReport, 6 deleteShout, 7 reply, 8 reportShout, 9 shout, 10} from "../api/shouts"; 11import { API_URL } from "../consts"; 12 13export const useShoutMutation = () => 14 useMutation({ 15 mutationFn: ({ uri, message }: { uri: string; message: string }) => 16 shout(uri, message), 17 }); 18 19export const useReplyMutation = () => 20 useMutation({ 21 mutationFn: ({ uri, message }: { uri: string; message: string }) => 22 reply(uri, message), 23 }); 24 25export const useReportMutation = () => 26 useMutation({ 27 mutationFn: (uri: string) => reportShout(uri), 28 }); 29 30export const useDeleteShoutMutation = () => 31 useMutation({ 32 mutationFn: deleteShout, 33 }); 34 35export const useShoutsQuery = (uri: string) => 36 useQuery({ 37 queryKey: ["shouts", uri], 38 queryFn: () => 39 axios.get(`${API_URL}/users/${uri.replace("at://", "")}/shouts`), 40 select: (response) => response.data, 41 }); 42 43export const useCancelReportMutation = () => 44 useMutation({ 45 mutationFn: cancelReport, 46 }); 47 48function useShout() { 49 const shout = async (uri: string, message: string) => { 50 const response = await axios.post( 51 `${API_URL}/users/${uri.replace("at://", "")}/shouts`, 52 { message }, 53 { 54 headers: { 55 "Content-Type": "application/json", 56 Authorization: `Bearer ${localStorage.getItem("token")}`, 57 }, 58 }, 59 ); 60 return response.data; 61 }; 62 63 const getShouts = useCallback(async (uri: string) => { 64 const response = await axios.get( 65 `${API_URL}/users/${uri.replace("at://", "")}/shouts`, 66 { 67 headers: { 68 Authorization: `Bearer ${localStorage.getItem("token")}`, 69 }, 70 }, 71 ); 72 return response.data; 73 }, []); 74 75 const reply = async (uri: string, message: string) => { 76 const response = await axios.post( 77 `${API_URL}/users/${uri.replace("at://", "")}/replies`, 78 { message }, 79 { 80 headers: { 81 "Content-Type": "application/json", 82 Authorization: `Bearer ${localStorage.getItem("token")}`, 83 }, 84 }, 85 ); 86 return response.data; 87 }; 88 89 const getReplies = useCallback(async (uri: string) => { 90 const response = await axios.get( 91 `${API_URL}/users/${uri.replace("at://", "")}/replies`, 92 ); 93 return response.data; 94 }, []); 95 96 const reportShout = async (uri: string) => { 97 const response = await axios.post( 98 `${API_URL}/users/${uri.replace("at://", "")}/report`, 99 {}, 100 { 101 headers: { 102 Authorization: `Bearer ${localStorage.getItem("token")}`, 103 }, 104 }, 105 ); 106 return response.data; 107 }; 108 109 const deleteShout = async (uri: string) => { 110 const response = await axios.delete( 111 `${API_URL}/users/${uri.replace("at://", "")}`, 112 { 113 headers: { 114 Authorization: `Bearer ${localStorage.getItem("token")}`, 115 }, 116 }, 117 ); 118 return response.data; 119 }; 120 121 const cancelReport = async (uri: string) => { 122 const response = await axios.delete( 123 `${API_URL}/users/${uri.replace("at://", "")}/report`, 124 { 125 headers: { 126 Authorization: `Bearer ${localStorage.getItem("token")}`, 127 }, 128 }, 129 ); 130 return response.data; 131 }; 132 133 return { 134 shout, 135 getShouts, 136 reply, 137 getReplies, 138 reportShout, 139 deleteShout, 140 cancelReport, 141 }; 142} 143 144export default useShout;