feat: hackathon

This commit is contained in:
Maulana Sodiqin
2025-11-25 01:47:56 +07:00
parent 5a99f216cb
commit 9e9bfc2793
53 changed files with 6892 additions and 927 deletions
+73 -23
View File
@@ -1,44 +1,94 @@
import { useQuery, useMutation, UseQueryResult, UseMutationResult, UseQueryOptions } from '@tanstack/react-query';
import { userService, UserDetailResponseDto, UserUpdateRequestDto } from '../../api/users';
import { TResponseError } from '../../types/common';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { userService } from '../../api/users';
import { supabase, getAuthenticatedClient } from '../../supabase';
import { useAuthStore } from '@imphnen-frontend-service/utils';
export const useUserMe = (options?: UseQueryOptions<UserDetailResponseDto, TResponseError>): UseQueryResult<UserDetailResponseDto, TResponseError> => {
// Supabase-based user hooks
export const useUserMe = () => {
return useQuery({
queryKey: ['user-me'],
queryFn: () => userService.getUserMe(),
...options,
queryFn: async () => {
const user = await userService.getUserMe();
return { data: user };
},
});
};
export const useUserById = (id: string, options?: UseQueryOptions<UserDetailResponseDto, TResponseError>): UseQueryResult<UserDetailResponseDto, TResponseError> => {
export const useUserById = (id: string) => {
return useQuery({
queryKey: ['user-by-id', id],
queryFn: () => userService.getUserById(id),
queryFn: async () => {
const user = await userService.getUserById(id);
return { data: user };
},
enabled: !!id,
...options,
});
};
export const useUpdateUserMe = (): UseMutationResult<
UserDetailResponseDto,
TResponseError,
UserUpdateRequestDto,
unknown
> => {
export const useUpdateUserMe = () => {
const queryClient = useQueryClient();
const { session, setSession } = useAuthStore();
return useMutation({
mutationKey: ['update-user-me'],
mutationFn: (data) => userService.updateUserMe(data),
mutationFn: async (data: any) => {
if (!session?.user?.id) {
throw new Error('You must be logged in to update profile');
}
// Supabase client now has auth context from setSession()
const { data: updatedUser, error } = await supabase
.from('users')
.update({
fullname: data.fullname,
bio: data.bio,
location: data.location,
avatar: data.avatar,
skills: data.skills,
updated_at: new Date().toISOString(),
})
.eq('id', session.user.id)
.select()
.single();
if (error) {
console.error('Failed to update user profile:', error);
throw new Error(error.message || 'Failed to update profile');
}
return { data: updatedUser };
},
onSuccess: (result) => {
// Update Zustand session store with new user data
if (session && result.data) {
setSession({
token: session.token,
user: {
...session.user,
fullname: result.data.fullname || session.user.fullname,
bio: result.data.bio || '',
location: result.data.location || '',
avatar: result.data.avatar || session.user.avatar,
skills: result.data.skills || [],
},
});
}
queryClient.invalidateQueries({ queryKey: ['user-me'] });
},
});
};
export const useUpdateUserById = (): UseMutationResult<
UserDetailResponseDto,
TResponseError,
{ id: string; data: UserUpdateRequestDto },
unknown
> => {
export const useUpdateUserById = () => {
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['update-user-by-id'],
mutationFn: ({ id, data }) => userService.updateUserById(id, data),
mutationFn: async ({ id, data }: { id: string; data: any }) => {
const updated = await userService.updateUserById(id, data);
return { data: updated };
},
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ['user-by-id', variables.id] });
},
});
};