@@ -8,3 +8,10 @@ export const ID_LOGIN_ENABLED = false
|
||||
// 스토어 첫 출시에서는 Google Play 알림 접근 정책 심사 회피를 위해 비활성화.
|
||||
// (AndroidManifest 의 CardNotifListenerService 선언도 함께 주석 처리되어 있음)
|
||||
export const CARD_NOTIF_ENABLED = false
|
||||
|
||||
// 인앱결제(유료 구독) 기능.
|
||||
// 첫 출시는 무료 앱으로 등록 — 실제 Google Play Billing 연동(결제 플러그인 +
|
||||
// 서버 영수증 검증) 전까지는 구매 흐름이 테스트 스텁이라, 활성화하면 결제 없이
|
||||
// 프리미엄이 부여되는 문제가 있다. 그래서 구매 진입점을 모두 숨긴다.
|
||||
// 실연동 완료 후 true 로 바꾸면 업그레이드/정기결제 관리 화면이 다시 노출된다.
|
||||
export const BILLING_ENABLED = false
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useRouter } from 'vue-router'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
import { billingApi } from '@/api/billingApi'
|
||||
import { billing } from '@/native/billing'
|
||||
import { BILLING_ENABLED } from '@/config/features'
|
||||
|
||||
const router = useRouter()
|
||||
const auth = useAuthStore()
|
||||
@@ -29,7 +30,7 @@ function fmtDate(s) {
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
if (!isNative) return // PC 는 상품 목록 불필요
|
||||
if (!isNative || !BILLING_ENABLED) return // PC·결제 비활성화 시 상품 목록 불필요
|
||||
try {
|
||||
products.value = await billingApi.products()
|
||||
} catch {
|
||||
@@ -112,6 +113,14 @@ function goBack() {
|
||||
프리미엄 이용 중<span v-if="expiresAt"> · {{ fmtDate(expiresAt) }}까지</span>
|
||||
</p>
|
||||
|
||||
<!-- 결제 비활성화(첫 출시 무료 앱): 구독 준비 중 안내 -->
|
||||
<template v-else-if="!BILLING_ENABLED">
|
||||
<p class="notice">
|
||||
유료 멤버십 구독은 <b>곧 출시 예정</b>입니다. 📦<br />
|
||||
지금은 모든 <b>무료 기능</b>을 제한 없이 이용하실 수 있어요.
|
||||
</p>
|
||||
</template>
|
||||
|
||||
<!-- 미가입 + Android 앱: 상품 구매 -->
|
||||
<template v-else-if="isNative">
|
||||
<div class="products">
|
||||
|
||||
@@ -5,6 +5,7 @@ import { useAuthStore } from '@/stores/auth'
|
||||
import { authApi } from '@/api/authApi'
|
||||
import { billingApi } from '@/api/billingApi'
|
||||
import { billing } from '@/native/billing'
|
||||
import { BILLING_ENABLED } from '@/config/features'
|
||||
import { useDialog } from '@/composables/dialog'
|
||||
import { avatarSrc, avatarInitial, fileToAvatarDataUrl } from '@/utils/avatar'
|
||||
|
||||
@@ -151,7 +152,10 @@ async function choosePlan(product) {
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(loadSubscription)
|
||||
// 결제 비활성화(첫 출시 무료 앱) 시 구독 현황/상품을 불러오지 않음 → 정기결제 카드 미노출
|
||||
onMounted(() => {
|
||||
if (BILLING_ENABLED) loadSubscription()
|
||||
})
|
||||
|
||||
// 아바타: 사용자 지정 > 구글 > 이니셜
|
||||
const avatar = computed(() => avatarSrc(u.value))
|
||||
@@ -274,7 +278,7 @@ async function withdraw() {
|
||||
<span class="k">멤버십</span>
|
||||
<span class="v">
|
||||
<span :class="{ premium: isPremium }">{{ planLabel }}</span>
|
||||
<RouterLink v-if="!isPremium" to="/upgrade" class="up-link">업그레이드 →</RouterLink>
|
||||
<RouterLink v-if="!isPremium && BILLING_ENABLED" to="/upgrade" class="up-link">업그레이드 →</RouterLink>
|
||||
</span>
|
||||
</div>
|
||||
<button type="button" class="row row-point" @click="openHistory">
|
||||
@@ -290,8 +294,8 @@ async function withdraw() {
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<!-- 정기결제 관리 -->
|
||||
<section class="card sub-card">
|
||||
<!-- 정기결제 관리 (결제 비활성화 첫 출시에는 미노출) -->
|
||||
<section v-if="BILLING_ENABLED" class="card sub-card">
|
||||
<h2 class="sub-title">정기결제 관리</h2>
|
||||
|
||||
<template v-if="sub && sub.premium">
|
||||
|
||||
Reference in New Issue
Block a user