import { Dispatch, SetStateAction } from "react"; import { Query, useQueryClient } from "@tanstack/react-query"; import ActionButton from "./ActionButton"; import { getQueryStatusLabel } from "../../utils/getQueryStatusLabel"; import triggerLoading from "../../utils/actions/triggerLoading"; import refetch from "../../utils/actions/refetch"; import reset from "../../utils/actions/reset"; import remove from "../../utils/actions/remove"; import invalidate from "../../utils/actions/invalidate"; import triggerError from "../../utils/actions/triggerError"; import { View, Text, StyleSheet } from "react-native"; import { gameUIColors } from "@react-buoy/shared-ui"; interface Props { setSelectedQuery: Dispatch>; query: Query | undefined; } /** * Action panel rendered in query detail views providing mutation simulation and removal controls. */ export default function QueryActions({ query, setSelectedQuery }: Props) { const queryClient = useQueryClient(); if (query === undefined) { return null; } const queryStatus = query.state.status; return ( Actions { refetch({ query, }); }} bgColorClass="btnRefetch" text="Refetch" _textColorClass="btnRefetch" /> { invalidate({ query, queryClient }); }} bgColorClass="btnInvalidate" text="Invalidate" _textColorClass="btnInvalidate" /> { reset({ queryClient, query }); }} bgColorClass="btnReset" text="Reset" _textColorClass="btnReset" /> { remove({ queryClient, query }); setSelectedQuery(undefined); }} bgColorClass="btnRemove" text="Remove" _textColorClass="btnRemove" /> { triggerLoading({ query }); }} bgColorClass="btnTriggerLoading" text={ query.state.fetchStatus === "fetching" ? "Restore Loading" : "Trigger Loading" } _textColorClass="btnTriggerLoading" /> { triggerError({ query, queryClient }); }} bgColorClass="btnTriggerLoadiError" text={queryStatus === "error" ? "Restore Error" : "Trigger Error"} _textColorClass="btnTriggerLoadiError" /> ); } const styles = StyleSheet.create({ container: { backgroundColor: gameUIColors.panel, borderRadius: 12, borderWidth: 1, borderColor: gameUIColors.border + "40", padding: 16, gap: 12, }, headerText: { fontSize: 14, fontWeight: "700", color: gameUIColors.primary, marginBottom: 8, textAlign: "left", fontFamily: "monospace", letterSpacing: 1, textTransform: "uppercase", }, buttonsContainer: { flexDirection: "row", flexWrap: "wrap", gap: 8, }, });