Initialize voicebox project with backend, frontend, and Tauri setup. Added configuration files, dependencies, and basic structure for components, hooks, and utilities. Included README and setup documentation for guidance.

This commit is contained in:
Jamie Pine
2026-01-25 02:19:06 -08:00
commit 01e3065692
166 changed files with 22764 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '@/lib/api/client';
import type { VoiceProfileCreate } from '@/lib/api/types';
export function useProfiles() {
return useQuery({
queryKey: ['profiles'],
queryFn: () => apiClient.listProfiles(),
});
}
export function useProfile(profileId: string) {
return useQuery({
queryKey: ['profiles', profileId],
queryFn: () => apiClient.getProfile(profileId),
enabled: !!profileId,
});
}
export function useCreateProfile() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: VoiceProfileCreate) => apiClient.createProfile(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['profiles'] });
},
});
}
export function useUpdateProfile() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ profileId, data }: { profileId: string; data: VoiceProfileCreate }) =>
apiClient.updateProfile(profileId, data),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ['profiles'] });
queryClient.invalidateQueries({
queryKey: ['profiles', variables.profileId],
});
},
});
}
export function useDeleteProfile() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (profileId: string) => apiClient.deleteProfile(profileId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['profiles'] });
},
});
}
export function useProfileSamples(profileId: string) {
return useQuery({
queryKey: ['profiles', profileId, 'samples'],
queryFn: () => apiClient.listProfileSamples(profileId),
enabled: !!profileId,
});
}
export function useAddSample() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({
profileId,
file,
referenceText,
}: {
profileId: string;
file: File;
referenceText: string;
}) => apiClient.addProfileSample(profileId, file, referenceText),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({
queryKey: ['profiles', variables.profileId, 'samples'],
});
queryClient.invalidateQueries({
queryKey: ['profiles', variables.profileId],
});
},
});
}
export function useDeleteSample() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (sampleId: string) => apiClient.deleteProfileSample(sampleId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['profiles'] });
},
});
}