Self-hosted US Congress monitoring platform with AI policy briefs, bill/member/topic follows, ntfy + RSS + email notifications, alignment scoring, collections, and draft-letter generator. Authored by: Jack Levy
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import { followsAPI } from "../api";
|
|
import { useAuthStore } from "@/stores/authStore";
|
|
|
|
export function useFollows() {
|
|
const token = useAuthStore((s) => s.token);
|
|
return useQuery({
|
|
queryKey: ["follows"],
|
|
queryFn: () => followsAPI.list(),
|
|
staleTime: 30 * 1000,
|
|
enabled: !!token,
|
|
});
|
|
}
|
|
|
|
export function useAddFollow() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ type, value }: { type: string; value: string }) =>
|
|
followsAPI.add(type, value),
|
|
onSuccess: () => {
|
|
qc.invalidateQueries({ queryKey: ["follows"] });
|
|
qc.invalidateQueries({ queryKey: ["dashboard"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRemoveFollow() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) => followsAPI.remove(id),
|
|
onSuccess: () => {
|
|
qc.invalidateQueries({ queryKey: ["follows"] });
|
|
qc.invalidateQueries({ queryKey: ["dashboard"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useIsFollowing(type: string, value: string) {
|
|
const { data: follows = [] } = useFollows();
|
|
return follows.find((f) => f.follow_type === type && f.follow_value === value);
|
|
}
|
|
|
|
export function useUpdateFollowMode() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, mode }: { id: number; mode: string }) =>
|
|
followsAPI.updateMode(id, mode),
|
|
onSuccess: () => qc.invalidateQueries({ queryKey: ["follows"] }),
|
|
});
|
|
}
|