forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
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;