feat: 찰떡지수 피드백 UI (우리/동네 궁합도)
CI / build (push) Successful in 27s

- FeedbackDialog: 잘 놀았어요/안 맞았어요 + BAD 사유 선택·추가입력
- 채팅 '산책 완료' 버튼 + 2시간 FEEDBACK_REQUEST 알림 → 피드백 팝업
- AffinityBadges: 동네 찰떡지수(전체), 우리 찰떡지수(매칭 쌍·유료 게이팅)
  스팟 메이트/AI 추천 카드 및 우리 강아지 프로필에 노출

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
sb
2026-07-11 23:55:16 +09:00
parent eb51201669
commit c8a8681a61
9 changed files with 344 additions and 3 deletions
+10
View File
@@ -15,6 +15,8 @@ export const useMatchingStore = defineStore('matching', () => {
const received = ref<ReceivedMatch[]>([])
const sentPendingTargetIds = ref<Set<number>>(new Set())
const openChatMatchId = ref<number | null>(null)
/** 산책 후 피드백(찰떡지수) 팝업을 띄울 매칭 id — 알림 수신 시 세팅. */
const feedbackMatchId = ref<number | null>(null)
let socket: ReturnType<typeof createUserNotifications> | null = null
let myDogId: number | null = null
@@ -57,6 +59,9 @@ export const useMatchingStore = defineStore('matching', () => {
if (n.type === 'ACCEPTED') {
openChatMatchId.value = n.matchId // 신청자: 수락됨 → 채팅 열기
}
if (n.type === 'FEEDBACK_REQUEST') {
feedbackMatchId.value = n.matchId // 2시간 후: 찰떡지수 피드백 팝업
}
if (myDogId != null) void refresh(myDogId) // 목록/진행중 동기화
}
@@ -86,6 +91,7 @@ export const useMatchingStore = defineStore('matching', () => {
received,
sentPendingTargetIds,
openChatMatchId,
feedbackMatchId,
connect,
disconnect,
refresh,
@@ -103,6 +109,8 @@ function colorFor(type: MatchNotification['type']): string {
case 'REJECTED':
case 'EXPIRED':
return 'grey-8'
case 'FEEDBACK_REQUEST':
return 'teal'
default:
return 'primary'
}
@@ -116,6 +124,8 @@ function iconFor(type: MatchNotification['type']): string {
return 'celebration'
case 'EXPIRED':
return 'schedule'
case 'FEEDBACK_REQUEST':
return 'rate_review'
default:
return 'heart_broken'
}