결제 관리 페이지 및 컴포넌트 다국어화 완료
- 결제 관리 페이지 다국어화 (결제 정보, 통보 데이터) * 헤더 타이틀 및 탭 버튼 다국어화 - 결제 엔티티 컴포넌트 전체 다국어화 * payment-tab: 결제 정보/결제데이터 통보 탭 * info-wrap: 서비스 이용, 수수료 및 정산주기 섹션 * notification-data-wrap: 결제데이터 통보 조회 (신용카드, 계좌이체 등 5개 결제수단) * info-item: 수수료 및 정산주기 버튼 * notify-row: 통보 상세 정보 (시작일자, 관리자 메일, URL/IP 등) - 결제 바텀시트 컴포넌트 다국어화 * card-commission-bottom-sheet: 카드 수수료 (일반/무이자/머니포인트 탭, 할부개월) * transfer-commission-bottom-sheet: 계좌이체 수수료 (통화 표기 포함) * credit-card-list-bottom-sheet: 카드사 목록 * no-interest-info-bottom-sheet: 무이자 정보 (통화 표기 포함) - 통화 표기 개선 (한국어: 원 suffix / 영어: ₩ prefix) - 번역 키 추가: payment 네임스페이스 32개 키 - 계정 관리 페이지 헤더 타이틀 다국어화 적용 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IMAGE_ROOT } from '@/shared/constants/common';
|
import { IMAGE_ROOT } from '@/shared/constants/common';
|
||||||
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
|
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
|
||||||
import { BankFees, CategoryFees, FeeRanges, GeneralTabItems, InstallmentTabItems, MoneyPointTabItems, PaymentFees } from '../model/types';
|
import { BankFees, CategoryFees, FeeRanges, GeneralTabItems, InstallmentTabItems, MoneyPointTabItems, PaymentFees } from '../model/types';
|
||||||
@@ -34,6 +35,7 @@ export const CardCommissionBottomSheet = ({
|
|||||||
categoryFees,
|
categoryFees,
|
||||||
feeRate
|
feeRate
|
||||||
}: CardCommissionBottomSheetProps) => {
|
}: CardCommissionBottomSheetProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const cardList = useStore.getState().CommonStore.creditCardList;
|
const cardList = useStore.getState().CommonStore.creditCardList;
|
||||||
|
|
||||||
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
||||||
@@ -56,14 +58,14 @@ export const CardCommissionBottomSheet = ({
|
|||||||
>
|
>
|
||||||
<div className="bottomsheet-header">
|
<div className="bottomsheet-header">
|
||||||
<div className="bottomsheet-title">
|
<div className="bottomsheet-title">
|
||||||
<h2>수수료 및 정산주기</h2>
|
<h2>{t('payment.commissionAndSettlement')}</h2>
|
||||||
<button
|
<button
|
||||||
className="close-btn"
|
className="close-btn"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={ IMAGE_ROOT + '/ico_close.svg' }
|
src={ IMAGE_ROOT + '/ico_close.svg' }
|
||||||
alt="닫기"
|
alt={t('common.close')}
|
||||||
onClick={ () => onClickToClose() }
|
onClick={ () => onClickToClose() }
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
@@ -72,31 +74,31 @@ export const CardCommissionBottomSheet = ({
|
|||||||
|
|
||||||
<div className="bottomsheet-content">
|
<div className="bottomsheet-content">
|
||||||
<div className="card-fee">
|
<div className="card-fee">
|
||||||
<div className="desc">정산주기 : { settlementPeriod }</div>
|
<div className="desc">{t('payment.settlementPeriod')} : { settlementPeriod }</div>
|
||||||
|
|
||||||
<div className="notice-tabs">
|
<div className="notice-tabs">
|
||||||
{ (payType === 2 || payType === 3) &&
|
{ (payType === 2 || payType === 3) &&
|
||||||
<button
|
<button
|
||||||
className="tab36 on"
|
className="tab36 on"
|
||||||
type="button"
|
type="button"
|
||||||
>일반</button>
|
>{t('payment.general')}</button>
|
||||||
}
|
}
|
||||||
{ (payType === 2 || payType === 3) &&
|
{ (payType === 2 || payType === 3) &&
|
||||||
<button
|
<button
|
||||||
className="tab36"
|
className="tab36"
|
||||||
type="button"
|
type="button"
|
||||||
>무이자</button>
|
>{t('payment.noInterest')}</button>
|
||||||
}
|
}
|
||||||
{ (payType === 3) &&
|
{ (payType === 3) &&
|
||||||
<button
|
<button
|
||||||
className="tab36"
|
className="tab36"
|
||||||
type="button"
|
type="button"
|
||||||
>머니/포인트</button>
|
>{t('payment.moneyPoint')}</button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="card-fee-box">
|
<div className="card-fee-box">
|
||||||
<span className="label">카드사</span>
|
<span className="label">{t('payment.cardCompany')}</span>
|
||||||
<div className="field wid-100">
|
<div className="field wid-100">
|
||||||
<select
|
<select
|
||||||
value={ selectedCard }
|
value={ selectedCard }
|
||||||
@@ -113,43 +115,43 @@ export const CardCommissionBottomSheet = ({
|
|||||||
|
|
||||||
<div className="card-fee-list">
|
<div className="card-fee-list">
|
||||||
<div className="card-fee-list-header">
|
<div className="card-fee-list-header">
|
||||||
<span className="th-left">할부개월</span>
|
<span className="th-left">{t('payment.installmentMonths')}</span>
|
||||||
<span className="th-right">수수료</span>
|
<span className="th-right">{t('payment.commission')}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>02 개월</span>
|
<span>{t('payment.months', { count: 2 })}</span>
|
||||||
<span>2.000%</span>
|
<span>2.000%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>03 개월</span>
|
<span>{t('payment.months', { count: 3 })}</span>
|
||||||
<span>3.100%</span>
|
<span>3.100%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>04 개월</span>
|
<span>{t('payment.months', { count: 4 })}</span>
|
||||||
<span>4.400%</span>
|
<span>4.400%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>05 개월</span>
|
<span>{t('payment.months', { count: 5 })}</span>
|
||||||
<span>5.200%</span>
|
<span>5.200%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>06 개월</span>
|
<span>{t('payment.months', { count: 6 })}</span>
|
||||||
<span>6.000%</span>
|
<span>6.000%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>07 개월</span>
|
<span>{t('payment.months', { count: 7 })}</span>
|
||||||
<span>6.600%</span>
|
<span>6.600%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>08 개월</span>
|
<span>{t('payment.months', { count: 8 })}</span>
|
||||||
<span>7.500%</span>
|
<span>7.500%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>09 개월</span>
|
<span>{t('payment.months', { count: 9 })}</span>
|
||||||
<span>8.000%</span>
|
<span>8.000%</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-fee-row">
|
<div className="card-fee-row">
|
||||||
<span>10 개월</span>
|
<span>{t('payment.months', { count: 10 })}</span>
|
||||||
<span>9.000%</span>
|
<span>9.000%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IMAGE_ROOT } from '@/shared/constants/common';
|
import { IMAGE_ROOT } from '@/shared/constants/common';
|
||||||
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
|
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
|
||||||
import { useStore } from '@/shared/model/store';
|
import { useStore } from '@/shared/model/store';
|
||||||
@@ -13,6 +14,7 @@ export const CreditCardListBottomSheet = ({
|
|||||||
creditCardListBottomSheetOn,
|
creditCardListBottomSheetOn,
|
||||||
setCreditCardListBottomSheetOn
|
setCreditCardListBottomSheetOn
|
||||||
}: CreditCardListBottomSheetProps) => {
|
}: CreditCardListBottomSheetProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const cardList = useStore.getState().CommonStore.creditCardList;
|
const cardList = useStore.getState().CommonStore.creditCardList;
|
||||||
|
|
||||||
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
||||||
@@ -35,14 +37,14 @@ export const CreditCardListBottomSheet = ({
|
|||||||
>
|
>
|
||||||
<div className="bottomsheet-header">
|
<div className="bottomsheet-header">
|
||||||
<div className="bottomsheet-title">
|
<div className="bottomsheet-title">
|
||||||
<h2>카드사</h2>
|
<h2>{t('payment.cardCompany')}</h2>
|
||||||
<button
|
<button
|
||||||
className="close-btn"
|
className="close-btn"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={ IMAGE_ROOT + '/ico_close.svg' }
|
src={ IMAGE_ROOT + '/ico_close.svg' }
|
||||||
alt="닫기"
|
alt={t('common.close')}
|
||||||
onClick={ () => onClickToClose() }
|
onClick={ () => onClickToClose() }
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
@@ -62,10 +64,10 @@ export const CreditCardListBottomSheet = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="bottomsheet-footer">
|
<div className="bottomsheet-footer">
|
||||||
<button
|
<button
|
||||||
className="btn-50 btn-blue flex-1"
|
className="btn-50 btn-blue flex-1"
|
||||||
type="button"
|
type="button"
|
||||||
>확인</button>
|
>{t('common.confirm')}</button>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import { useTranslation } from 'react-i18next';
|
||||||
PaymentInfoItemType,
|
import {
|
||||||
|
PaymentInfoItemType,
|
||||||
} from '../model/types';
|
} from '../model/types';
|
||||||
|
|
||||||
export interface InfoItemProps {
|
export interface InfoItemProps {
|
||||||
@@ -21,6 +22,7 @@ export const InfoItem = ({
|
|||||||
setPayType,
|
setPayType,
|
||||||
setBottomSheetOn
|
setBottomSheetOn
|
||||||
}: InfoItemProps) => {
|
}: InfoItemProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const onClickToOpenBottomSheet = () => {
|
const onClickToOpenBottomSheet = () => {
|
||||||
if(setPayType && payType){
|
if(setPayType && payType){
|
||||||
@@ -42,11 +44,11 @@ export const InfoItem = ({
|
|||||||
</div>
|
</div>
|
||||||
<span className="ing-card-name">{ payName }</span>
|
<span className="ing-card-name">{ payName }</span>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
className="ing-card-link"
|
className="ing-card-link"
|
||||||
type="button"
|
type="button"
|
||||||
onClick={ () => onClickToOpenBottomSheet() }
|
onClick={ () => onClickToOpenBottomSheet() }
|
||||||
>수수료 및 정산주기 ></button>
|
>{t('payment.commissionAndSettlement')} ></button>
|
||||||
</li>
|
</li>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IMAGE_ROOT } from '@/shared/constants/common';
|
import { IMAGE_ROOT } from '@/shared/constants/common';
|
||||||
import { InfoItem } from './info-item';
|
import { InfoItem } from './info-item';
|
||||||
import { CardCommissionBottomSheet } from './card-commission-bottom-sheet';
|
import { CardCommissionBottomSheet } from './card-commission-bottom-sheet';
|
||||||
@@ -33,7 +34,8 @@ import { usePaymentNonCardMutation } from '../api/use-payment-non-card-mutation'
|
|||||||
import { usePaymentInstallmentMutation } from '../api/use-payment-installment-mutation';
|
import { usePaymentInstallmentMutation } from '../api/use-payment-installment-mutation';
|
||||||
|
|
||||||
export const InfoWrap = () => {
|
export const InfoWrap = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const [mid, setMid] = useState<string>('nictest00g');
|
const [mid, setMid] = useState<string>('nictest00g');
|
||||||
|
|
||||||
const [noInterestInfoBottomSheetOn, setNoInterestInfoBottomSheetOn] = useState<boolean>(false);
|
const [noInterestInfoBottomSheetOn, setNoInterestInfoBottomSheetOn] = useState<boolean>(false);
|
||||||
@@ -212,12 +214,12 @@ export const InfoWrap = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="ing-list">
|
<div className="ing-list">
|
||||||
<div className="ing-title">서비스 이용, 수수료 및 정산주기</div>
|
<div className="ing-title">{t('payment.serviceUsageCommissionAndSettlement')}</div>
|
||||||
<ul className="ing-card-list">
|
<ul className="ing-card-list">
|
||||||
{ getList(PaymentInfoItemType.Comission) }
|
{ getList(PaymentInfoItemType.Comission) }
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div className="ing-title">가맹점 분담 무이자 정보</div>
|
<div className="ing-title">{t('payment.merchantNoInterestInfo')}</div>
|
||||||
<ul className="ing-card-list">
|
<ul className="ing-card-list">
|
||||||
{ getList(PaymentInfoItemType.NoInterest) }
|
{ getList(PaymentInfoItemType.NoInterest) }
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IMAGE_ROOT } from '@/shared/constants/common';
|
import { IMAGE_ROOT } from '@/shared/constants/common';
|
||||||
import { BottomSheetMotionVaiants, BottomSheetMotionDuration } from '@/entities/common/model/constant';
|
import { BottomSheetMotionVaiants, BottomSheetMotionDuration } from '@/entities/common/model/constant';
|
||||||
import { InstallmentDetails, PaymentInstallmentDetailResponse } from '../model/types';
|
import { InstallmentDetails, PaymentInstallmentDetailResponse } from '../model/types';
|
||||||
@@ -23,6 +24,7 @@ export const NoInterestInfoBottomSheet = ({
|
|||||||
installmentDetails,
|
installmentDetails,
|
||||||
changeToCardCompany
|
changeToCardCompany
|
||||||
}: NoInterestInfoBottomSheetProps) => {
|
}: NoInterestInfoBottomSheetProps) => {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
const cardList = useStore.getState().CommonStore.creditCardList;
|
const cardList = useStore.getState().CommonStore.creditCardList;
|
||||||
|
|
||||||
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
|
||||||
@@ -52,23 +54,23 @@ export const NoInterestInfoBottomSheet = ({
|
|||||||
>
|
>
|
||||||
<div className="bottomsheet-header">
|
<div className="bottomsheet-header">
|
||||||
<div className="bottomsheet-title">
|
<div className="bottomsheet-title">
|
||||||
<h2>무이자 정보</h2>
|
<h2>{t('payment.noInterestInfo')}</h2>
|
||||||
<button
|
<button
|
||||||
className="close-btn"
|
className="close-btn"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={ IMAGE_ROOT + '/ico_close.svg' }
|
src={ IMAGE_ROOT + '/ico_close.svg' }
|
||||||
alt="닫기"
|
alt={t('common.close')}
|
||||||
onClick={ () => onClickToClose() }
|
onClick={ () => onClickToClose() }
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="fee-cycle">
|
<div className="fee-cycle">
|
||||||
<div className="card-fee-box">
|
<div className="card-fee-box">
|
||||||
<span className="label">카드사</span>
|
<span className="label">{t('payment.cardCompany')}</span>
|
||||||
<div className="field wid-100">
|
<div className="field wid-100">
|
||||||
{ !!cardCompanyOptions &&
|
{ !!cardCompanyOptions &&
|
||||||
<select onChange={ onChangeToCardCompany }>
|
<select onChange={ onChangeToCardCompany }>
|
||||||
@@ -87,24 +89,26 @@ export const NoInterestInfoBottomSheet = ({
|
|||||||
&& installmentDetails.length > 0
|
&& installmentDetails.length > 0
|
||||||
&& installmentDetails.map((value, index) => (
|
&& installmentDetails.map((value, index) => (
|
||||||
<>
|
<>
|
||||||
{ (index > 0) &&
|
{ (index > 0) &&
|
||||||
<div className="divider"></div>
|
<div className="divider"></div>
|
||||||
}
|
}
|
||||||
<div className="desc dot">
|
<div className="desc dot">
|
||||||
<span>할부개월 : </span>
|
<span>{t('payment.installmentMonths')} : </span>
|
||||||
<span>{ value.installmentMonths }</span>
|
<span>{ value.installmentMonths }</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="desc dot">
|
<div className="desc dot">
|
||||||
<span>적용기간 : </span>
|
<span>{t('payment.applicationPeriod')} : </span>
|
||||||
<span>{ value.applicationPeriod }</span>
|
<span>{ value.applicationPeriod }</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="desc dot">
|
<div className="desc dot">
|
||||||
<span>적용금액 : </span>
|
<span>{t('payment.applicationAmount')} : </span>
|
||||||
<span>
|
<span>
|
||||||
<NumericFormat
|
<NumericFormat
|
||||||
value={ value.applicationAmount }
|
value={ value.applicationAmount }
|
||||||
thousandSeparator
|
thousandSeparator
|
||||||
displayType="text"
|
displayType="text"
|
||||||
|
prefix={i18n.language === 'en' ? t('home.currencySymbol') : ''}
|
||||||
|
suffix={i18n.language === 'en' ? '' : t('home.currencyWon')}
|
||||||
></NumericFormat>
|
></NumericFormat>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import { ChangeEvent, useEffect, useState } from 'react';
|
import { ChangeEvent, useEffect, useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { NotifyRowKeys } from '../model/types';
|
import { NotifyRowKeys } from '../model/types';
|
||||||
import { usePaymentNotificationDataMutation } from '../api/use-payment-notification-data-mutation';
|
import { usePaymentNotificationDataMutation } from '../api/use-payment-notification-data-mutation';
|
||||||
import { useStore } from '@/shared/model/store';
|
import { useStore } from '@/shared/model/store';
|
||||||
import { NotifyRow } from './section/notify-row';
|
import { NotifyRow } from './section/notify-row';
|
||||||
|
|
||||||
export const NotificationDataWrap = () => {
|
export const NotificationDataWrap = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const midOptions = useStore.getState().UserStore.selectOptionsMids;
|
const midOptions = useStore.getState().UserStore.selectOptionsMids;
|
||||||
const userMid = useStore.getState().UserStore.mid;
|
const userMid = useStore.getState().UserStore.mid;
|
||||||
|
|
||||||
@@ -60,12 +62,12 @@ export const NotificationDataWrap = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="notify-container">
|
<div className="notify-container">
|
||||||
<div className="notify-header">
|
<div className="notify-header">
|
||||||
<h3 className="notify-title">결제데이터 통보 조회</h3>
|
<h3 className="notify-title">{t('payment.notificationDataInquiry')}</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul className="notify-list">
|
<ul className="notify-list">
|
||||||
<li>
|
<li>
|
||||||
<NotifyRow
|
<NotifyRow
|
||||||
paymentMethodName='신용카드'
|
paymentMethodName={t('payment.paymentMethods.creditCard')}
|
||||||
type={ NotifyRowKeys.CreditCard }
|
type={ NotifyRowKeys.CreditCard }
|
||||||
startDate={ creditCard?.startDate }
|
startDate={ creditCard?.startDate }
|
||||||
adminEmail={ creditCard?.adminEmail }
|
adminEmail={ creditCard?.adminEmail }
|
||||||
@@ -81,7 +83,7 @@ export const NotificationDataWrap = () => {
|
|||||||
<li className="notify-divider"></li>
|
<li className="notify-divider"></li>
|
||||||
<li>
|
<li>
|
||||||
<NotifyRow
|
<NotifyRow
|
||||||
paymentMethodName='계좌이체'
|
paymentMethodName={t('payment.paymentMethods.accountTransfer')}
|
||||||
type={ NotifyRowKeys.AccountTransfer }
|
type={ NotifyRowKeys.AccountTransfer }
|
||||||
startDate={ accountTransfer?.startDate }
|
startDate={ accountTransfer?.startDate }
|
||||||
adminEmail={ accountTransfer?.adminEmail }
|
adminEmail={ accountTransfer?.adminEmail }
|
||||||
@@ -97,7 +99,7 @@ export const NotificationDataWrap = () => {
|
|||||||
<li className="notify-divider"></li>
|
<li className="notify-divider"></li>
|
||||||
<li>
|
<li>
|
||||||
<NotifyRow
|
<NotifyRow
|
||||||
paymentMethodName='가상계좌'
|
paymentMethodName={t('payment.paymentMethods.virtualAccount')}
|
||||||
type={ NotifyRowKeys.VirtualAccount }
|
type={ NotifyRowKeys.VirtualAccount }
|
||||||
startDate={ virtualAccount?.startDate }
|
startDate={ virtualAccount?.startDate }
|
||||||
adminEmail={ virtualAccount?.adminEmail }
|
adminEmail={ virtualAccount?.adminEmail }
|
||||||
@@ -113,7 +115,7 @@ export const NotificationDataWrap = () => {
|
|||||||
<li className="notify-divider"></li>
|
<li className="notify-divider"></li>
|
||||||
<li>
|
<li>
|
||||||
<NotifyRow
|
<NotifyRow
|
||||||
paymentMethodName='휴대폰'
|
paymentMethodName={t('payment.paymentMethods.mobilePayment')}
|
||||||
type={ NotifyRowKeys.MobilePayment }
|
type={ NotifyRowKeys.MobilePayment }
|
||||||
startDate={ mobilePayment?.startDate }
|
startDate={ mobilePayment?.startDate }
|
||||||
adminEmail={ mobilePayment?.adminEmail }
|
adminEmail={ mobilePayment?.adminEmail }
|
||||||
@@ -129,7 +131,7 @@ export const NotificationDataWrap = () => {
|
|||||||
<li className="notify-divider"></li>
|
<li className="notify-divider"></li>
|
||||||
<li>
|
<li>
|
||||||
<NotifyRow
|
<NotifyRow
|
||||||
paymentMethodName='에스크로 결제'
|
paymentMethodName={t('payment.paymentMethods.escrowPayment')}
|
||||||
type={ NotifyRowKeys.EscrowPayment }
|
type={ NotifyRowKeys.EscrowPayment }
|
||||||
startDate={ escrowPayment?.startDate }
|
startDate={ escrowPayment?.startDate }
|
||||||
adminEmail={ escrowPayment?.adminEmail }
|
adminEmail={ escrowPayment?.adminEmail }
|
||||||
@@ -145,8 +147,8 @@ export const NotificationDataWrap = () => {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div className="notify-bar">
|
<div className="notify-bar">
|
||||||
<span>결제데이터 통보 설정은 PC에서 가능합니다.</span>
|
<span>{t('payment.notificationDataSettingInfo')}</span>
|
||||||
<span>전송 설정한 지불수단만 노출됩니다.</span>
|
<span>{t('payment.onlyConfiguredPaymentMethodsShown')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { PATHS } from '@/shared/constants/paths';
|
import { PATHS } from '@/shared/constants/paths';
|
||||||
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
||||||
import {
|
import {
|
||||||
PaymentTabKeys,
|
PaymentTabKeys,
|
||||||
PaymentTabProps
|
PaymentTabProps
|
||||||
} from '../model/types';
|
} from '../model/types';
|
||||||
@@ -8,6 +9,7 @@ import {
|
|||||||
export const PaymentTab = ({
|
export const PaymentTab = ({
|
||||||
activeTab
|
activeTab
|
||||||
}: PaymentTabProps) => {
|
}: PaymentTabProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const { navigate } = useNavigate();
|
const { navigate } = useNavigate();
|
||||||
|
|
||||||
const onClickToNavigation = (tab: PaymentTabKeys) => {
|
const onClickToNavigation = (tab: PaymentTabKeys) => {
|
||||||
@@ -23,14 +25,14 @@ export const PaymentTab = ({
|
|||||||
return(
|
return(
|
||||||
<>
|
<>
|
||||||
<div className="subTab">
|
<div className="subTab">
|
||||||
<button
|
<button
|
||||||
className={`subtab-btn ${(activeTab === PaymentTabKeys.Info)? 'active': ''}` }
|
className={`subtab-btn ${(activeTab === PaymentTabKeys.Info)? 'active': ''}` }
|
||||||
onClick={ () => onClickToNavigation(PaymentTabKeys.Info) }
|
onClick={ () => onClickToNavigation(PaymentTabKeys.Info) }
|
||||||
>결제 정보</button>
|
>{t('payment.info')}</button>
|
||||||
<button
|
<button
|
||||||
className={`subtab-btn ${(activeTab === PaymentTabKeys.NotificationData)? 'active': ''}` }
|
className={`subtab-btn ${(activeTab === PaymentTabKeys.NotificationData)? 'active': ''}` }
|
||||||
onClick={ () => onClickToNavigation(PaymentTabKeys.NotificationData) }
|
onClick={ () => onClickToNavigation(PaymentTabKeys.NotificationData) }
|
||||||
>결제데이터 통보</button>
|
>{t('payment.notificationData')}</button>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { SlideDown } from 'react-slidedown';
|
import { SlideDown } from 'react-slidedown';
|
||||||
import 'react-slidedown/lib/slidedown.css';
|
import 'react-slidedown/lib/slidedown.css';
|
||||||
import { NotifyRowKeys } from '../../model/types';
|
import { NotifyRowKeys } from '../../model/types';
|
||||||
@@ -31,6 +32,7 @@ export const NotifyRow = ({
|
|||||||
openChild,
|
openChild,
|
||||||
setOpenChild
|
setOpenChild
|
||||||
}: NotifyRowProps) => {
|
}: NotifyRowProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const [isOpen, setIsOpen] = useState<boolean>(false);
|
const [isOpen, setIsOpen] = useState<boolean>(false);
|
||||||
|
|
||||||
const openNotifyRow = () => {
|
const openNotifyRow = () => {
|
||||||
@@ -63,13 +65,13 @@ export const NotifyRow = ({
|
|||||||
{ isOpen &&
|
{ isOpen &&
|
||||||
<div className="notify-content">
|
<div className="notify-content">
|
||||||
<ul className="notify-detail-list">
|
<ul className="notify-detail-list">
|
||||||
<li className="notify-detail-item">시작일자 : { (!!startDate)? moment(startDate).format('YYYY-MM-DD'): '' }</li>
|
<li className="notify-detail-item">{t('payment.startDate')} : { (!!startDate)? moment(startDate).format('YYYY-MM-DD'): '' }</li>
|
||||||
<li className="notify-detail-item">관리자 메일 : { adminEmail } </li>
|
<li className="notify-detail-item">{t('payment.adminEmail')} : { adminEmail } </li>
|
||||||
<li className="notify-detail-item">URL/IP : { urlIp }</li>
|
<li className="notify-detail-item">{t('payment.urlIp')} : { urlIp }</li>
|
||||||
<li className="notify-detail-item">재전송 간격 : { retransmissionInterval }</li>
|
<li className="notify-detail-item">{t('payment.retransmissionInterval')} : { retransmissionInterval }</li>
|
||||||
<li className="notify-detail-item">재전송 횟수 : { retransmissionCount }</li>
|
<li className="notify-detail-item">{t('payment.retransmissionCount')} : { retransmissionCount }</li>
|
||||||
<li className="notify-detail-item">OK 체크 : { okCheck }</li>
|
<li className="notify-detail-item">{t('payment.okCheck')} : { okCheck }</li>
|
||||||
<li className="notify-detail-item">암호화 전송여부 : { encryptionStatus }</li>
|
<li className="notify-detail-item">{t('payment.encryptionStatus')} : { encryptionStatus }</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IMAGE_ROOT } from '@/shared/constants/common';
|
import { IMAGE_ROOT } from '@/shared/constants/common';
|
||||||
|
|
||||||
export const TransferCommissionBottomSheet = () => {
|
export const TransferCommissionBottomSheet = () => {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -8,43 +10,43 @@ export const TransferCommissionBottomSheet = () => {
|
|||||||
<div className="bottomsheet">
|
<div className="bottomsheet">
|
||||||
<div className="bottomsheet-header">
|
<div className="bottomsheet-header">
|
||||||
<div className="bottomsheet-title">
|
<div className="bottomsheet-title">
|
||||||
<h2>수수료 및 정산주기</h2>
|
<h2>{t('payment.commissionAndSettlement')}</h2>
|
||||||
<button
|
<button
|
||||||
className="close-btn"
|
className="close-btn"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={ IMAGE_ROOT + '/ico_close.svg' }
|
src={ IMAGE_ROOT + '/ico_close.svg' }
|
||||||
alt="닫기"
|
alt={t('common.close')}
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="fee-cycle">
|
<div className="fee-cycle">
|
||||||
<div className="desc dot">정산주기 : 일일(+3일)</div>
|
<div className="desc dot">{t('payment.settlementPeriod')} : {t('payment.dailyPlus3Days')}</div>
|
||||||
<div className="desc dot">수수료</div>
|
<div className="desc dot">{t('payment.commission')}</div>
|
||||||
<div className="divider"></div>
|
<div className="divider"></div>
|
||||||
<ul className="kv-list">
|
<ul className="kv-list">
|
||||||
<li className="kv-row pl-10">
|
<li className="kv-row pl-10">
|
||||||
<span className="k">결제수수료(최저수수료)</span>
|
<span className="k">{t('payment.paymentFeeMinimum')}</span>
|
||||||
<span className="v">1원</span>
|
<span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="kv-row pl-10">
|
<li className="kv-row pl-10">
|
||||||
<span className="k">결제수수료(1원~)</span>
|
<span className="k">{t('payment.paymentFeeFrom1Won')}</span>
|
||||||
<span className="v">1원</span>
|
<span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="kv-row pl-10">
|
<li className="kv-row pl-10">
|
||||||
<span className="k">취소수수료</span>
|
<span className="k">{t('payment.cancellationFee')}</span>
|
||||||
<span className="v">1원</span>
|
<span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="bottomsheet-footer">
|
<div className="bottomsheet-footer">
|
||||||
<button
|
<button
|
||||||
className="btn-50 btn-blue flex-1"
|
className="btn-50 btn-blue flex-1"
|
||||||
type="button"
|
type="button"
|
||||||
>확인</button>
|
>{t('common.confirm')}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -293,5 +293,45 @@
|
|||||||
"title": "Billing",
|
"title": "Billing",
|
||||||
"detailTitle": "Billing Details",
|
"detailTitle": "Billing Details",
|
||||||
"charge": "Billing Charge"
|
"charge": "Billing Charge"
|
||||||
|
},
|
||||||
|
"payment": {
|
||||||
|
"title": "Payment Management",
|
||||||
|
"info": "Payment Info",
|
||||||
|
"notificationData": "Notification Data",
|
||||||
|
"notificationDataInquiry": "Payment Notification Data Inquiry",
|
||||||
|
"serviceUsageCommissionAndSettlement": "Service Usage, Commission & Settlement Period",
|
||||||
|
"merchantNoInterestInfo": "Merchant No-Interest Info",
|
||||||
|
"commissionAndSettlement": "Commission & Settlement",
|
||||||
|
"settlementPeriod": "Settlement Period",
|
||||||
|
"general": "General",
|
||||||
|
"noInterest": "No Interest",
|
||||||
|
"moneyPoint": "Money/Point",
|
||||||
|
"cardCompany": "Card Company",
|
||||||
|
"installmentMonths": "Installment Months",
|
||||||
|
"commission": "Commission",
|
||||||
|
"months": "{{count}} Months",
|
||||||
|
"dailyPlus3Days": "Daily (+3 days)",
|
||||||
|
"paymentFeeMinimum": "Payment Fee (Minimum)",
|
||||||
|
"paymentFeeFrom1Won": "Payment Fee (From ₩1)",
|
||||||
|
"cancellationFee": "Cancellation Fee",
|
||||||
|
"noInterestInfo": "No-Interest Info",
|
||||||
|
"applicationPeriod": "Application Period",
|
||||||
|
"applicationAmount": "Application Amount",
|
||||||
|
"notificationDataSettingInfo": "Payment notification data settings are available on PC.",
|
||||||
|
"onlyConfiguredPaymentMethodsShown": "Only configured payment methods are shown.",
|
||||||
|
"startDate": "Start Date",
|
||||||
|
"adminEmail": "Admin Email",
|
||||||
|
"urlIp": "URL/IP",
|
||||||
|
"retransmissionInterval": "Retransmission Interval",
|
||||||
|
"retransmissionCount": "Retransmission Count",
|
||||||
|
"okCheck": "OK Check",
|
||||||
|
"encryptionStatus": "Encryption Status",
|
||||||
|
"paymentMethods": {
|
||||||
|
"creditCard": "Credit Card",
|
||||||
|
"accountTransfer": "Account Transfer",
|
||||||
|
"virtualAccount": "Virtual Account",
|
||||||
|
"mobilePayment": "Mobile Payment",
|
||||||
|
"escrowPayment": "Escrow Payment"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,5 +297,45 @@
|
|||||||
"title": "빌링",
|
"title": "빌링",
|
||||||
"detailTitle": "빌링 상세",
|
"detailTitle": "빌링 상세",
|
||||||
"charge": "빌링 청구"
|
"charge": "빌링 청구"
|
||||||
|
},
|
||||||
|
"payment": {
|
||||||
|
"title": "결제 관리",
|
||||||
|
"info": "결제 정보",
|
||||||
|
"notificationData": "결제데이터 통보",
|
||||||
|
"notificationDataInquiry": "결제데이터 통보 조회",
|
||||||
|
"serviceUsageCommissionAndSettlement": "서비스 이용, 수수료 및 정산주기",
|
||||||
|
"merchantNoInterestInfo": "가맹점 분담 무이자 정보",
|
||||||
|
"commissionAndSettlement": "수수료 및 정산주기",
|
||||||
|
"settlementPeriod": "정산주기",
|
||||||
|
"general": "일반",
|
||||||
|
"noInterest": "무이자",
|
||||||
|
"moneyPoint": "머니/포인트",
|
||||||
|
"cardCompany": "카드사",
|
||||||
|
"installmentMonths": "할부개월",
|
||||||
|
"commission": "수수료",
|
||||||
|
"months": "{{count}} 개월",
|
||||||
|
"dailyPlus3Days": "일일(+3일)",
|
||||||
|
"paymentFeeMinimum": "결제수수료(최저수수료)",
|
||||||
|
"paymentFeeFrom1Won": "결제수수료(1원~)",
|
||||||
|
"cancellationFee": "취소수수료",
|
||||||
|
"noInterestInfo": "무이자 정보",
|
||||||
|
"applicationPeriod": "적용기간",
|
||||||
|
"applicationAmount": "적용금액",
|
||||||
|
"notificationDataSettingInfo": "결제데이터 통보 설정은 PC에서 가능합니다.",
|
||||||
|
"onlyConfiguredPaymentMethodsShown": "전송 설정한 지불수단만 노출됩니다.",
|
||||||
|
"startDate": "시작일자",
|
||||||
|
"adminEmail": "관리자 메일",
|
||||||
|
"urlIp": "URL/IP",
|
||||||
|
"retransmissionInterval": "재전송 간격",
|
||||||
|
"retransmissionCount": "재전송 횟수",
|
||||||
|
"okCheck": "OK 체크",
|
||||||
|
"encryptionStatus": "암호화 전송여부",
|
||||||
|
"paymentMethods": {
|
||||||
|
"creditCard": "신용카드",
|
||||||
|
"accountTransfer": "계좌이체",
|
||||||
|
"virtualAccount": "가상계좌",
|
||||||
|
"mobilePayment": "휴대폰",
|
||||||
|
"escrowPayment": "에스크로 결제"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@ export const PasswordManagePage = () => {
|
|||||||
const { navigate } = useNavigate();
|
const { navigate } = useNavigate();
|
||||||
|
|
||||||
const [activeTab, setActiveTab] = useState<AccountTabKeys>(AccountTabKeys.PasswordManage);
|
const [activeTab, setActiveTab] = useState<AccountTabKeys>(AccountTabKeys.PasswordManage);
|
||||||
useSetHeaderTitle('계정 관리');
|
useSetHeaderTitle(t('account.manage'));
|
||||||
useSetHeaderType(HeaderType.LeftArrow);
|
useSetHeaderType(HeaderType.LeftArrow);
|
||||||
useSetFooterMode(false);
|
useSetFooterMode(false);
|
||||||
useSetOnBack(() => {
|
useSetOnBack(() => {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { PATHS } from '@/shared/constants/paths';
|
import { PATHS } from '@/shared/constants/paths';
|
||||||
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
||||||
import { PaymentTab } from '@/entities/payment/ui/payment-tab';
|
import { PaymentTab } from '@/entities/payment/ui/payment-tab';
|
||||||
import { InfoWrap } from '@/entities/payment/ui/info-wrap';
|
import { InfoWrap } from '@/entities/payment/ui/info-wrap';
|
||||||
import { PaymentTabKeys } from '@/entities/payment/model/types';
|
import { PaymentTabKeys } from '@/entities/payment/model/types';
|
||||||
import { HeaderType } from '@/entities/common/model/types';
|
import { HeaderType } from '@/entities/common/model/types';
|
||||||
import {
|
import {
|
||||||
useSetHeaderTitle,
|
useSetHeaderTitle,
|
||||||
useSetHeaderType,
|
useSetHeaderType,
|
||||||
useSetFooterMode,
|
useSetFooterMode,
|
||||||
@@ -13,11 +14,12 @@ import {
|
|||||||
} from '@/widgets/sub-layout/use-sub-layout';
|
} from '@/widgets/sub-layout/use-sub-layout';
|
||||||
|
|
||||||
export const InfoPage = () => {
|
export const InfoPage = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const { navigate } = useNavigate();
|
const { navigate } = useNavigate();
|
||||||
|
|
||||||
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.Info);
|
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.Info);
|
||||||
|
|
||||||
useSetHeaderTitle('결제 관리');
|
useSetHeaderTitle(t('payment.title'));
|
||||||
useSetHeaderType(HeaderType.LeftArrow);
|
useSetHeaderType(HeaderType.LeftArrow);
|
||||||
useSetFooterMode(false);
|
useSetFooterMode(false);
|
||||||
useSetOnBack(() => {
|
useSetOnBack(() => {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { PATHS } from '@/shared/constants/paths';
|
import { PATHS } from '@/shared/constants/paths';
|
||||||
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
|
||||||
import { PaymentTab } from '@/entities/payment/ui/payment-tab';
|
import { PaymentTab } from '@/entities/payment/ui/payment-tab';
|
||||||
import { NotificationDataWrap } from '@/entities/payment/ui/notification-data-wrap';
|
import { NotificationDataWrap } from '@/entities/payment/ui/notification-data-wrap';
|
||||||
import { PaymentTabKeys } from '@/entities/payment/model/types';
|
import { PaymentTabKeys } from '@/entities/payment/model/types';
|
||||||
import { HeaderType } from '@/entities/common/model/types';
|
import { HeaderType } from '@/entities/common/model/types';
|
||||||
import {
|
import {
|
||||||
useSetHeaderTitle,
|
useSetHeaderTitle,
|
||||||
useSetHeaderType,
|
useSetHeaderType,
|
||||||
useSetFooterMode,
|
useSetFooterMode,
|
||||||
@@ -13,10 +14,11 @@ import {
|
|||||||
} from '@/widgets/sub-layout/use-sub-layout';
|
} from '@/widgets/sub-layout/use-sub-layout';
|
||||||
|
|
||||||
export const NotificationDataPage = () => {
|
export const NotificationDataPage = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const { navigate } = useNavigate();
|
const { navigate } = useNavigate();
|
||||||
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.NotificationData);
|
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.NotificationData);
|
||||||
|
|
||||||
useSetHeaderTitle('결제 관리');
|
useSetHeaderTitle(t('payment.title'));
|
||||||
useSetHeaderType(HeaderType.LeftArrow);
|
useSetHeaderType(HeaderType.LeftArrow);
|
||||||
useSetFooterMode(false);
|
useSetFooterMode(false);
|
||||||
useSetOnBack(() => {
|
useSetOnBack(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user