diff --git a/apps/client/src/pages/onBoarding/hooks/useOnboardingFunnel.ts b/apps/client/src/pages/onBoarding/hooks/useOnboardingFunnel.ts index dbaceae5..6eba99c4 100644 --- a/apps/client/src/pages/onBoarding/hooks/useOnboardingFunnel.ts +++ b/apps/client/src/pages/onBoarding/hooks/useOnboardingFunnel.ts @@ -115,7 +115,12 @@ export function useOnboardingFunnel() { if (isFinalStep) { postSignData( - { email: userEmail, remindDefault: remindTime, fcmToken }, + { + email: userEmail, + remindDefault: remindTime, + fcmToken, + job: selectedJob ?? '', + }, { onSuccess: () => (window.location.href = '/'), onError: () => { @@ -145,6 +150,7 @@ export function useOnboardingFunnel() { setStep, step, userEmail, + selectedJob, ]); const prevStep = useCallback(() => { diff --git a/apps/client/src/shared/apis/axios.ts b/apps/client/src/shared/apis/axios.ts index 9762b213..ee4edaca 100644 --- a/apps/client/src/shared/apis/axios.ts +++ b/apps/client/src/shared/apis/axios.ts @@ -33,10 +33,11 @@ export interface postSignUpRequest { email: string; remindDefault: string; fcmToken: string | null; + job: string; } export const postSignUp = async (responsedata: postSignUpRequest) => { - const { data } = await apiRequest.patch('/api/v2/auth/signup', responsedata); + const { data } = await apiRequest.patch('/api/v3/auth/signup', responsedata); return data; }; @@ -86,3 +87,12 @@ export const getJobs = async (): Promise => { const { data } = await apiRequest.get('/api/v3/enums/jobs'); return data.data; }; + +export interface patchUserJobRequest { + job: string; +} + +export const patchUserJob = async (requestData: patchUserJobRequest) => { + const { data } = await apiRequest.patch('/api/v3/users/job', requestData); + return data; +}; diff --git a/apps/client/src/shared/apis/queries.ts b/apps/client/src/shared/apis/queries.ts index 4d2f9488..35a9fd9a 100644 --- a/apps/client/src/shared/apis/queries.ts +++ b/apps/client/src/shared/apis/queries.ts @@ -20,6 +20,8 @@ import { getGoogleProfile, getMyProfile, getJobs, + patchUserJob, + patchUserJobRequest, } from '@shared/apis/axios'; import { AxiosError } from 'axios'; import { @@ -171,3 +173,9 @@ export const useSuspenseGetJobs = () => { staleTime: Infinity, }); }; + +export const usePatchUserJob = () => { + return useMutation({ + mutationFn: (data: patchUserJobRequest) => patchUserJob(data), + }); +}; diff --git a/apps/client/src/shared/apis/setting/axiosInstance.ts b/apps/client/src/shared/apis/setting/axiosInstance.ts index 60bb84aa..a23bedf4 100644 --- a/apps/client/src/shared/apis/setting/axiosInstance.ts +++ b/apps/client/src/shared/apis/setting/axiosInstance.ts @@ -27,7 +27,7 @@ apiRequest.interceptors.response.use( const noAuthNeeded = [ '/api/v1/auth/token', - '/api/v2/auth/signup', + '/api/v3/auth/signup', '/api/v2/auth/google', ]; diff --git a/apps/client/src/shared/components/jobSelectionFunnel/JobSelectionFunnel.tsx b/apps/client/src/shared/components/jobSelectionFunnel/JobSelectionFunnel.tsx index 1806dc4e..cc3ab4df 100644 --- a/apps/client/src/shared/components/jobSelectionFunnel/JobSelectionFunnel.tsx +++ b/apps/client/src/shared/components/jobSelectionFunnel/JobSelectionFunnel.tsx @@ -1,4 +1,5 @@ import { Button } from '@pinback/design-system/ui'; +import { usePatchUserJob } from '@shared/apis/queries'; import { useFunnel } from '@shared/hooks/useFunnel'; import { useState } from 'react'; import FunnelProgress from './FunnelProgress'; @@ -24,9 +25,14 @@ export default function JobSelectionFunnel({ const [selectedJob, setSelectedJob] = useState(null); const [jobShareAgree, setJobShareAgree] = useState(false); + const { mutateAsync: patchUserJob, isPending: isPatchUserJobPending } = + usePatchUserJob(); - const handleNext = () => { + const handleNext = async () => { if (isLastStep) { + if (selectedJob) { + await patchUserJob({ job: selectedJob }); + } onComplete?.(); return; } @@ -59,7 +65,10 @@ export default function JobSelectionFunnel({ size="medium" className="w-[4.8rem]" onClick={handleNext} - isDisabled={currentStep === 'job' && (!jobShareAgree || !selectedJob)} + isDisabled={ + isPatchUserJobPending || + (currentStep === 'job' && (!jobShareAgree || !selectedJob)) + } > {isLastStep ? '완료' : '다음'} diff --git a/apps/extension/src/apis/axios.ts b/apps/extension/src/apis/axios.ts index 1c3eff87..296db93e 100644 --- a/apps/extension/src/apis/axios.ts +++ b/apps/extension/src/apis/axios.ts @@ -1,30 +1,18 @@ -import apiRequest from "./axiosInstance"; +import apiRequest from './axiosInstance'; export interface PostArticleRequest { url: string; categoryId: number; memo?: string | null; - remindTime?: string | null; + remindTime?: string | null; } export const postArticle = async (data: PostArticleRequest) => { - const response = await apiRequest.post("/api/v1/articles", data); - return response.data; -}; - - -export interface postSignupRequest { - email: string; - remindDefault: string - fcmToken: string; -} - -export const postSignup = async (data: postSignupRequest) => { - const response = await apiRequest.post("/api/v1/auth/signup", data); + const response = await apiRequest.post('/api/v1/articles', data); return response.data; }; export const getCategoriesExtension = async () => { - const response = await apiRequest.get("/api/v1/categories/extension"); + const response = await apiRequest.get('/api/v1/categories/extension'); return response.data; }; @@ -33,27 +21,26 @@ export interface postCategoriesRequest { } export const postCategories = async (data: postCategoriesRequest) => { - const response = await apiRequest.post("/api/v1/categories", data); + const response = await apiRequest.post('/api/v1/categories', data); return response.data; -} +}; export const getRemindTime = async () => { - const now = new Date().toISOString().split(".")[0]; + const now = new Date().toISOString().split('.')[0]; - const response = await apiRequest.get("/api/v1/users/remind-time", { + const response = await apiRequest.get('/api/v1/users/remind-time', { params: { now }, }); return response.data; }; - -export const getArticleSaved=async (url:string) => { - const response = await apiRequest.get("/api/v1/articles/saved", { +export const getArticleSaved = async (url: string) => { + const response = await apiRequest.get('/api/v1/articles/saved', { params: { url }, }); return response.data; -} +}; export interface PutArticleRequest { categoryId: number; @@ -62,7 +49,10 @@ export interface PutArticleRequest { remindTime: string | null; } -export const putArticle = async (articleId: number, data: PutArticleRequest) => { +export const putArticle = async ( + articleId: number, + data: PutArticleRequest +) => { const response = await apiRequest.put(`/api/v1/articles/${articleId}`, data); return response.data; -}; \ No newline at end of file +}; diff --git a/apps/extension/src/apis/axiosInstance.ts b/apps/extension/src/apis/axiosInstance.ts index d56aca0f..36c37e9d 100644 --- a/apps/extension/src/apis/axiosInstance.ts +++ b/apps/extension/src/apis/axiosInstance.ts @@ -36,7 +36,7 @@ apiRequest.interceptors.response.use( const noAuthNeeded = [ '/api/v1/auth/token', - '/api/v2/auth/signup', + '/api/v3/auth/signup', '/api/v2/auth/google', ]; const isNoAuth = noAuthNeeded.some((url) => diff --git a/apps/extension/src/apis/query/queries.ts b/apps/extension/src/apis/query/queries.ts index 51983444..a0c16b7e 100644 --- a/apps/extension/src/apis/query/queries.ts +++ b/apps/extension/src/apis/query/queries.ts @@ -1,17 +1,15 @@ -import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'; import { + getArticleSaved, + getCategoriesExtension, + getRemindTime, postArticle, PostArticleRequest, - postSignup, - postSignupRequest, - getCategoriesExtension, postCategories, postCategoriesRequest, - getRemindTime, - getArticleSaved, putArticle, PutArticleRequest, } from '@apis/axios'; +import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'; export const usePostArticle = () => { return useMutation({ @@ -19,12 +17,6 @@ export const usePostArticle = () => { }); }; -export const usePostSignup = () => { - return useMutation({ - mutationFn: (data: postSignupRequest) => postSignup(data), - }); -}; - export const usePostCategories = () => { return useMutation({ mutationFn: (data: postCategoriesRequest) => postCategories(data),