diff --git a/src/components/mypage/edit/EditProfileContent.tsx b/src/components/mypage/edit/EditProfileContent.tsx index 032c0d57..dd88d9ac 100644 --- a/src/components/mypage/edit/EditProfileContent.tsx +++ b/src/components/mypage/edit/EditProfileContent.tsx @@ -94,6 +94,7 @@ function EditProfileContent({ className, schools, majors, ...props }: EditProfil const onSubmit = (data: EditProfileFormData) => { updateProfile( { + clubId, user: { name: data.name, email: data.email, diff --git a/src/hooks/home/useProfileStatusQuery.ts b/src/hooks/home/useProfileStatusQuery.ts index 64c662d3..f1c20489 100644 --- a/src/hooks/home/useProfileStatusQuery.ts +++ b/src/hooks/home/useProfileStatusQuery.ts @@ -2,8 +2,9 @@ import { useQuery } from '@tanstack/react-query'; import { homeApi } from '@/lib/apis/home'; import { useClubId } from '@/stores/useClubStore'; -export function useProfileStatusQuery() { - const clubId = useClubId(); +export function useProfileStatusQuery(clubIdOverride?: string) { + const storedClubId = useClubId(); + const clubId = clubIdOverride ?? storedClubId; return useQuery({ queryKey: ['home', 'profile-status', clubId], diff --git a/src/hooks/home/useWritePost.ts b/src/hooks/home/useWritePost.ts index c029fcc8..b4e97e82 100644 --- a/src/hooks/home/useWritePost.ts +++ b/src/hooks/home/useWritePost.ts @@ -8,7 +8,7 @@ import { useSetActiveBoardId } from '@/stores/useBoardNavStore'; export function useWritePost() { const router = useRouter(); const { clubId } = useParams<{ clubId: string }>(); - const { data: profileStatus, isLoading, isFetching, refetch } = useProfileStatusQuery(); + const { data: profileStatus, isLoading, isFetching, refetch } = useProfileStatusQuery(clubId); const setActiveBoardId = useSetActiveBoardId(); const [cardinalModalOpen, setCardinalModalOpen] = useState(false); @@ -17,8 +17,12 @@ export function useWritePost() { const handleWriteClick = async () => { if (isLoading || isFetching) return; - const { data: latestProfileStatus } = await refetch(); - const currentProfileStatus = latestProfileStatus ?? profileStatus; + let currentProfileStatus = profileStatus; + + if (!currentProfileStatus?.cardinalAssigned || !currentProfileStatus?.profileCompleted) { + const { data: latestProfileStatus } = await refetch(); + currentProfileStatus = latestProfileStatus ?? currentProfileStatus; + } if (!currentProfileStatus?.cardinalAssigned) { setCardinalModalOpen(true); diff --git a/src/hooks/mutations/useUpdateProfileMutation.ts b/src/hooks/mutations/useUpdateProfileMutation.ts index f71beda0..dd8cb674 100644 --- a/src/hooks/mutations/useUpdateProfileMutation.ts +++ b/src/hooks/mutations/useUpdateProfileMutation.ts @@ -6,12 +6,23 @@ import { useClubId } from '@/stores/useClubStore'; import { useUserStore } from '@/stores/useUserStore'; interface UpdateProfileParams { + clubId?: string; user: UpdateUserBody; clubProfile: Omit; profileImageFile?: File | null; resetImage?: boolean; } +const isCompleteProfile = (user: UpdateUserBody) => + Boolean( + user.name.trim() && + user.email.trim() && + user.tel.trim() && + user.school.trim() && + user.department.trim() && + user.studentId.trim(), + ); + export function useUpdateProfileMutation() { const queryClient = useQueryClient(); const clubId = useClubId(); @@ -38,11 +49,12 @@ export function useUpdateProfileMutation() { return { isReset: !!resetImage }; }, - onSuccess: async ({ isReset }, { user, clubProfile }) => { - if (!clubId) return; + onSuccess: async ({ isReset }, { clubId: mutationClubId, user, clubProfile }) => { + const targetClubId = mutationClubId ?? clubId; + if (!targetClubId) return; queryClient.setQueryData( - ['mypage', 'me', clubId], + ['mypage', 'me', targetClubId], (old: Record | undefined) => { if (!old) return old; return { @@ -65,20 +77,38 @@ export function useUpdateProfileMutation() { 'syncProfile', ); - void queryClient.invalidateQueries({ queryKey: ['home', clubId] }); - void queryClient.invalidateQueries({ queryKey: ['home', 'profile-status', clubId] }); - void queryClient.invalidateQueries({ queryKey: ['home', 'recent-posts', clubId] }); - void queryClient.invalidateQueries({ queryKey: ['posts', clubId] }); + queryClient.setQueryData( + ['home', 'profile-status', targetClubId], + ( + old: + | { cardinalAssigned: boolean; profileCompleted: boolean; missingFields: string[] } + | undefined, + ) => { + if (!old) return old; + + const profileCompleted = isCompleteProfile(user); + return { + ...old, + profileCompleted, + missingFields: profileCompleted ? [] : old.missingFields, + }; + }, + ); + + await queryClient.invalidateQueries({ queryKey: ['home', targetClubId] }); + await queryClient.invalidateQueries({ queryKey: ['home', 'profile-status', targetClubId] }); + void queryClient.invalidateQueries({ queryKey: ['home', 'recent-posts', targetClubId] }); + void queryClient.invalidateQueries({ queryKey: ['posts', targetClubId] }); if (isReset) { - void queryClient.invalidateQueries({ queryKey: ['mypage', 'me', clubId] }); + void queryClient.invalidateQueries({ queryKey: ['mypage', 'me', targetClubId] }); return; } try { const res = await queryClient.fetchQuery({ - queryKey: ['mypage', 'me', clubId], - queryFn: () => mypageApi.getMe(clubId).then((r) => r.data.data), + queryKey: ['mypage', 'me', targetClubId], + queryFn: () => mypageApi.getMe(targetClubId).then((r) => r.data.data), staleTime: 0, }); useUserStore.setState( @@ -87,7 +117,7 @@ export function useUpdateProfileMutation() { 'syncProfile', ); } catch { - void queryClient.invalidateQueries({ queryKey: ['mypage', 'me', clubId] }); + void queryClient.invalidateQueries({ queryKey: ['mypage', 'me', targetClubId] }); } }, });