'use client'; import { useQuery, useMutation, UseQueryOptions } from '@tanstack/react-query'; import { pastelAPI } from './client'; import type { ColorInfoRequest, ColorInfoData, ConvertFormatRequest, ConvertFormatData, ColorManipulationRequest, ColorManipulationData, ColorMixRequest, ColorMixData, RandomColorsRequest, RandomColorsData, DistinctColorsRequest, DistinctColorsData, GradientRequest, GradientData, NamedColorsData, HealthData, } from './types'; // Color Information export const useColorInfo = ( request: ColorInfoRequest, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery({ queryKey: ['colorInfo', request.colors], queryFn: async () => { const response = await pastelAPI.getColorInfo(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, enabled: request.colors.length > 0 && request.colors.every((c) => c.length > 0), ...options, }); }; // Format Conversion export const useConvertFormat = () => { return useMutation({ mutationFn: async (request: ConvertFormatRequest) => { const response = await pastelAPI.convertFormat(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; // Color Manipulation export const useLighten = () => { return useMutation({ mutationFn: async (request: ColorManipulationRequest) => { const response = await pastelAPI.lighten(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useDarken = () => { return useMutation({ mutationFn: async (request: ColorManipulationRequest) => { const response = await pastelAPI.darken(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useSaturate = () => { return useMutation({ mutationFn: async (request: ColorManipulationRequest) => { const response = await pastelAPI.saturate(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useDesaturate = () => { return useMutation({ mutationFn: async (request: ColorManipulationRequest) => { const response = await pastelAPI.desaturate(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useRotate = () => { return useMutation({ mutationFn: async (request: ColorManipulationRequest) => { const response = await pastelAPI.rotate(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useComplement = () => { return useMutation({ mutationFn: async (colors: string[]) => { const response = await pastelAPI.complement(colors); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useMixColors = () => { return useMutation({ mutationFn: async (request: ColorMixRequest) => { const response = await pastelAPI.mix(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; // Color Generation export const useGenerateRandom = () => { return useMutation({ mutationFn: async (request: RandomColorsRequest) => { const response = await pastelAPI.generateRandom(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useGenerateDistinct = () => { return useMutation({ mutationFn: async (request: DistinctColorsRequest) => { const response = await pastelAPI.generateDistinct(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; export const useGenerateGradient = () => { return useMutation({ mutationFn: async (request: GradientRequest) => { const response = await pastelAPI.generateGradient(request); if (!response.success) { throw new Error(response.error.message); } return response.data; }, }); }; // Named Colors export const useNamedColors = () => { return useQuery({ queryKey: ['namedColors'], queryFn: async () => { const response = await pastelAPI.getNamedColors(); if (!response.success) { throw new Error(response.error.message); } return response.data; }, staleTime: Infinity, // Named colors never change }); }; // Health Check export const useHealth = () => { return useQuery({ queryKey: ['health'], queryFn: async () => { const response = await pastelAPI.getHealth(); if (!response.success) { throw new Error(response.error.message); } return response.data; }, refetchInterval: 60000, // Check every minute }); };