feat: 계정삭제 안내 페이지 + 카드알림(알림접근) 첫 출시 비활성화
CI / build (push) Failing after 13m7s

- /account-deletion 공개 페이지(웹 접근) — Play 데이터 삭제 정책 URL, 웹 안내 하단 링크
- CARD_NOTIF_ENABLED=false: 카드알림 자동인식 UI 숨김
- AndroidManifest: CardNotifListenerService 선언 주석 처리(알림접근 정책 회피)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-06-28 18:43:22 +09:00
parent 4838eba9af
commit e8d3549f02
6 changed files with 126 additions and 2 deletions
+105
View File
@@ -0,0 +1,105 @@
<script setup>
import { useRouter } from 'vue-router'
import { SERVICE_NAME, CONTACT_EMAIL } from '@/constants/terms'
const router = useRouter()
function goBack() {
if (window.history.length > 1) router.back()
else router.push('/')
}
</script>
<template>
<main class="legal">
<header class="legal-head">
<div class="brand">{{ SERVICE_NAME }}</div>
<h1>계정 데이터 삭제</h1>
</header>
<div class="legal-body">
<p>{{ SERVICE_NAME }} 이용자가 본인의 계정과 모든 데이터를 직접 삭제할 있도록 제공합니다.</p>
<h2>앱에서 삭제하기</h2>
<ol>
<li>(또는 PC 클라이언트) 로그인합니다.</li>
<li><b>설정 계정정보</b> 화면으로 이동합니다.</li>
<li> 아래 <b>회원 탈퇴</b> 눌러 안내에 따라 진행합니다.</li>
</ol>
<h2>삭제되는 데이터</h2>
<p>탈퇴 아래 데이터가 <b>지체 없이 영구 삭제</b>되며 복구할 없습니다.</p>
<ul>
<li>계정 정보(아이디·이메일·프로필 )</li>
<li>가계부·계좌·자산·예산·거래 내역 모든 가계부 데이터</li>
<li>게시판 ·댓글·추천 기록</li>
<li>포인트 결제(구독) 기록</li>
</ul>
<p class="muted">, 관련 법령에 따라 보존이 필요한 정보는 해당 기간 동안 보관 파기합니다.</p>
<h2> 없이 삭제를 요청하려면</h2>
<p>앱에 접근할 없는 경우, 아래 이메일로 가입 계정 정보와 함께 삭제를 요청하시면 처리해 드립니다.</p>
<p><b>문의:</b> {{ CONTACT_EMAIL }}</p>
</div>
<div class="legal-foot">
<button type="button" class="legal-back" @click="goBack">돌아가기</button>
</div>
</main>
</template>
<style scoped>
.legal {
max-width: 760px;
margin: 0 auto;
padding: 1.5rem;
}
.legal-head {
text-align: center;
margin-bottom: 1.25rem;
}
.brand {
font-size: 1.1rem;
font-weight: 700;
color: hsla(160, 100%, 37%, 1);
}
.legal-head h1 {
font-size: 1.4rem;
margin-top: 0.3rem;
}
.legal-body {
font-size: 0.92rem;
line-height: 1.75;
color: var(--color-text);
background: var(--color-background-soft);
border: 1px solid var(--color-border);
border-radius: 10px;
padding: 1.2rem 1.3rem;
}
.legal-body h2 {
font-size: 1.02rem;
margin: 1.2rem 0 0.4rem;
color: var(--color-heading);
}
.legal-body ol,
.legal-body ul {
padding-left: 1.2rem;
}
.legal-body .muted {
font-size: 0.85rem;
opacity: 0.7;
}
.legal-foot {
display: flex;
justify-content: flex-end;
margin-top: 1.25rem;
}
.legal-back {
padding: 0.5rem 1.3rem;
border: 1px solid var(--color-border);
border-radius: 8px;
background: var(--color-background);
color: var(--color-text);
cursor: pointer;
font-weight: 600;
}
</style>
+2 -1
View File
@@ -7,6 +7,7 @@ import { useDialog } from '@/composables/dialog'
import IconBtn from '@/components/ui/IconBtn.vue'
import { imageToBlob, parseReceiptText } from '@/utils/receiptOcr'
import { cardNotif } from '@/native/cardNotif'
import { CARD_NOTIF_ENABLED } from '@/config/features'
import { Capacitor } from '@capacitor/core'
// @capacitor/camera 는 네이티브에서만 동적 로드 (웹은 file input 사용 — 정적 import 시 모바일 웹 청크 로드 실패 유발)
@@ -25,7 +26,7 @@ const pendingCount = ref(0) // 확인 필요(카드 알림 자동인식) 건수
const editingPending = ref(false) // 수정 중인 항목이 미확인 건인지
// 카드 결제 알림 자동인식 권한 (네이티브 전용)
const notifNative = cardNotif.isNative()
const notifNative = CARD_NOTIF_ENABLED && cardNotif.isNative()
const notifEnabled = ref(true) // 미허용일 때만 배너 노출
async function checkNotifPermission() {
if (notifNative) notifEnabled.value = await cardNotif.isEnabled()