diff --git a/src/api/spots.ts b/src/api/spots.ts index 0892905..56f9316 100644 --- a/src/api/spots.ts +++ b/src/api/spots.ts @@ -40,8 +40,11 @@ export const spotsApi = { list: () => http.get('/api/spots'), mates: (spotId: number, userId?: number) => http.get(`/api/spots/${spotId}/mates${userId ? `?userId=${userId}` : ''}`), - aiMates: (spotId: number, dogId: number) => - http.get(`/api/spots/${spotId}/ai-mates?dogId=${dogId}`), + aiMates: (spotId: number, dogId: number, neutered?: boolean) => + http.get( + `/api/spots/${spotId}/ai-mates?dogId=${dogId}` + + (neutered != null ? `&neutered=${neutered}` : ''), + ), frequentBreeds: (spotId: number) => http.get<{ breeds: string[] }>(`/api/spots/${spotId}/frequent-breeds`), reviews: (spotId: number) => http.get(`/api/spots/${spotId}/reviews`), diff --git a/src/pages/HomePage.vue b/src/pages/HomePage.vue index 3a70139..3bb1f54 100644 --- a/src/pages/HomePage.vue +++ b/src/pages/HomePage.vue @@ -40,6 +40,26 @@ · AI 분석으로 실제와 다를 수 있어요 + +
+ 중성화 + +
친구 찾는 중… @@ -153,6 +173,7 @@ const loadError = ref(false) const aiMates = ref([]) const aiLoading = ref(false) const aiTried = ref(false) +const aiNeutered = ref<'any' | 'yes' | 'no'>('any') // AI 찾기 옵션: 중성화 조건 onMounted(load) @@ -218,8 +239,9 @@ async function loadAiMates() { if (!currentSpot.value || dogs.currentDogId == null) return aiLoading.value = true aiTried.value = true + const neutered = aiNeutered.value === 'yes' ? true : aiNeutered.value === 'no' ? false : undefined try { - aiMates.value = await spotsApi.aiMates(currentSpot.value.id, dogs.currentDogId) + aiMates.value = await spotsApi.aiMates(currentSpot.value.id, dogs.currentDogId, neutered) } catch { aiMates.value = [] } finally { diff --git a/src/pages/ProfilePage.vue b/src/pages/ProfilePage.vue index 3056ab4..8b501a5 100644 --- a/src/pages/ProfilePage.vue +++ b/src/pages/ProfilePage.vue @@ -102,6 +102,22 @@ emit-value map-options /> +
+
중성화 여부 *
+ +
@@ -110,7 +126,7 @@ unelevated label="등록" :loading="creating" - :disable="!form.name" + :disable="!form.name || form.neutered === null" @click="onCreate" /> @@ -141,10 +157,16 @@ const sizeOptions = [ { label: '중형견', value: 'MEDIUM' }, { label: '대형견', value: 'LARGE' }, ] -const form = reactive<{ name: string; breed: string; size: string | null }>({ +const form = reactive<{ + name: string + breed: string + size: string | null + neutered: boolean | null +}>({ name: '', breed: '', size: null, + neutered: null, }) onMounted(async () => { @@ -208,13 +230,20 @@ function openCreate() { form.name = '' form.breed = '' form.size = null + form.neutered = null createOpen.value = true } async function onCreate() { + if (form.neutered === null) return creating.value = true try { - await dogs.createDog({ name: form.name, breed: form.breed || null, size: form.size }) + await dogs.createDog({ + name: form.name, + breed: form.breed || null, + size: form.size, + neutered: form.neutered, + }) createOpen.value = false $q.notify({ color: 'primary', message: `${form.name} 등록 완료!`, icon: 'pets', position: 'top' }) } catch (e) {