This commit is contained in:
Jay Sheen
2025-11-21 15:57:36 +09:00
27 changed files with 379 additions and 86 deletions

View File

@@ -1,6 +1,4 @@
VITE_APP_ENV=development VITE_APP_ENV=development
# VITE_APP_AUTH_PROXY_HOST='http://3.35.79.250:8090'
# VITE_APP_API_PROXY_HOST='http://3.35.79.250:8080'
VITE_APP_AUTH_PROXY_HOST='https://auth.nicepay.co.kr' VITE_APP_AUTH_PROXY_HOST='https://auth.nicepay.co.kr'
VITE_APP_API_PROXY_HOST='https://rest.nicepay.co.kr' VITE_APP_API_PROXY_HOST='https://rest.nicepay.co.kr'
GENERATE_SOURCEMAP=false GENERATE_SOURCEMAP=false

View File

@@ -4,7 +4,7 @@
"version": "1.0.3", "version": "1.0.3",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "env-cmd -f .env.local vite --host --open", "dev": "env-cmd -f .env.development vite --host --open",
"build:development": "env-cmd -f .env.development vite build", "build:development": "env-cmd -f .env.development vite build",
"build": "env-cmd -f .env.production vite build", "build": "env-cmd -f .env.production vite build",
"lint": "eslint . --ext js,jsx,ts,tsx --report-unused-disable-directives --max-warnings 0", "lint": "eslint . --ext js,jsx,ts,tsx --report-unused-disable-directives --max-warnings 0",

View File

@@ -1,8 +1,40 @@
import { TFunction } from 'i18next'; import { TFunction } from 'i18next';
import { LinkPaymentProcessStatus } from "./types"; import { LinkPaymentPaymentMethod, LinkPaymentProcessStatus } from "./types";
export const getProcessStatusBtnGroup = (t: TFunction) => [ export const getProcessStatusBtnGroup = (t: TFunction) => [
{ name: t('transaction.constants.all'), value: LinkPaymentProcessStatus.ALL }, { name: t('transaction.constants.all'), value: LinkPaymentProcessStatus.ALL },
{ name: t('additionalService.linkPay.sendRequest'), value: LinkPaymentProcessStatus.SEND_REQUEST }, { name: t('additionalService.linkPay.sendRequest'), value: LinkPaymentProcessStatus.SEND_REQUEST },
{ name: t('additionalService.linkPay.sendCancel'), value: LinkPaymentProcessStatus.SEND_CANCEL } { name: t('additionalService.linkPay.sendCancel'), value: LinkPaymentProcessStatus.SEND_CANCEL }
] ]
export const getPaymentMethodOptionGroup = (t: TFunction) => [
{ name: t('additionalService.linkPayment.paymentMethod.all'), value: '' },
{ name: t('additionalService.linkPayment.paymentMethod.card'), value: LinkPaymentPaymentMethod.CARD},
{ name: t('additionalService.linkPayment.paymentMethod.bank'), value: LinkPaymentPaymentMethod.BANK},
{ name: t('additionalService.linkPayment.paymentMethod.virtualAccount'), value: LinkPaymentPaymentMethod.VIRTURE_BANK},
{ name: t('additionalService.linkPayment.paymentMethod.phone'), value: LinkPaymentPaymentMethod.PHONE},
{ name: t('additionalService.linkPayment.paymentMethod.cultureland'), value: LinkPaymentPaymentMethod.CULTURELAND},
{ name: t('additionalService.linkPayment.paymentMethod.ssgMoney'), value: LinkPaymentPaymentMethod.SSG_MONEY},
{ name: t('additionalService.linkPayment.paymentMethod.ssgBank'), value: LinkPaymentPaymentMethod.SSG_BANK},
{ name: t('additionalService.linkPayment.paymentMethod.cmsBank'), value: LinkPaymentPaymentMethod.CMS_BANK}, //계좌간편결제
{ name: t('additionalService.linkPayment.paymentMethod.tmoneyPay'), value: LinkPaymentPaymentMethod.TMONEY_PAY},
]
export const getPaymentMethodText = (t: TFunction) => (status?: string): string => {
if (!status) return '';
const paymentMethodMap: Record<LinkPaymentPaymentMethod, string> = {
[LinkPaymentPaymentMethod.ALL]: t('additionalService.linkPayment.paymentMethod.all'),
[LinkPaymentPaymentMethod.CARD]: t('additionalService.linkPayment.paymentMethod.card'),
[LinkPaymentPaymentMethod.BANK]: t('additionalService.linkPayment.paymentMethod.bank'),
[LinkPaymentPaymentMethod.VIRTURE_BANK]: t('additionalService.linkPayment.paymentMethod.virtualAccount'),
[LinkPaymentPaymentMethod.PHONE]: t('additionalService.linkPayment.paymentMethod.phone'),
[LinkPaymentPaymentMethod.CULTURELAND]: t('additionalService.linkPayment.paymentMethod.cultureland'),
[LinkPaymentPaymentMethod.SSG_MONEY]: t('additionalService.linkPayment.paymentMethod.ssgMoney'),
[LinkPaymentPaymentMethod.SSG_BANK]: t('additionalService.linkPayment.paymentMethod.ssgBank'),
[LinkPaymentPaymentMethod.CMS_BANK]: t('additionalService.linkPayment.paymentMethod.cmsBank'),
[LinkPaymentPaymentMethod.TMONEY_PAY]: t('additionalService.linkPayment.paymentMethod.tmoneyPay')
}
return paymentMethodMap[status as LinkPaymentPaymentMethod] || status;
}

View File

@@ -20,6 +20,7 @@ export enum LinkPaymentSearchCl {
} }
export enum LinkPaymentPaymentMethod { export enum LinkPaymentPaymentMethod {
ALL = "",
CARD = "CARD", CARD = "CARD",
BANK = "BANK", BANK = "BANK",
VIRTURE_BANK = "VIRTURE_BANK", VIRTURE_BANK = "VIRTURE_BANK",
@@ -124,6 +125,7 @@ export interface LinkPaymentHistoryFilterProps extends FilterProps {
mid: string; mid: string;
searchCl: LinkPaymentSearchCl; searchCl: LinkPaymentSearchCl;
searchValue: string; searchValue: string;
paymentMethod: LinkPaymentPaymentMethod;
fromDate: string; fromDate: string;
toDate: string; toDate: string;
paymentStatus: LinkPaymentPaymentStatus; paymentStatus: LinkPaymentPaymentStatus;
@@ -132,6 +134,7 @@ export interface LinkPaymentHistoryFilterProps extends FilterProps {
setMid: (mid: string) => void; setMid: (mid: string) => void;
setSearchType: (searchType: LinkPaymentSearchCl) => void; setSearchType: (searchType: LinkPaymentSearchCl) => void;
setSearchKeyword: (searchKeyWorld: string) => void; setSearchKeyword: (searchKeyWorld: string) => void;
setPaymentMethod: (paymentMethod: LinkPaymentPaymentMethod) => void;
setStartDate: (startDate: string) => void; setStartDate: (startDate: string) => void;
setEndDate: (endDate: string) => void; setEndDate: (endDate: string) => void;
setPaymentStatus: (transactionStatus: LinkPaymentPaymentStatus) => void; setPaymentStatus: (transactionStatus: LinkPaymentPaymentStatus) => void;
@@ -161,6 +164,7 @@ export interface LinkPaymentWaitFilterProps extends FilterProps {
export interface ExtensionLinkPayHistoryListParams extends ExtensionRequestParams { export interface ExtensionLinkPayHistoryListParams extends ExtensionRequestParams {
searchCl: string; searchCl: string;
searchValue: string; searchValue: string;
paymentMethod: LinkPaymentPaymentMethod;
fromDate: string; fromDate: string;
toDate: string; toDate: string;
paymentStatus: LinkPaymentPaymentStatus; paymentStatus: LinkPaymentPaymentStatus;

View File

@@ -131,9 +131,14 @@ export const LinkPaymentStep1 = ({ formData, setFormData }: LinkPaymentStep1Prop
<div className="issue-field"> <div className="issue-field">
<input <input
type="text" type="text"
inputMode="text"
placeholder="" placeholder=""
value={formData.moid} value={formData.moid}
onChange={(e) => handleInputChange('moid', e.target.value)} onChange={(e) => {
// 영문자와 숫자만 허용 (한글, 특수문자 제거)
const cleanedValue = e.target.value.replace(/[^a-zA-Z0-9]/g, '');
handleInputChange('moid', cleanedValue);
}}
onFocus={handleInputFocus} onFocus={handleInputFocus}
/> />
</div> </div>

View File

@@ -13,11 +13,12 @@ import { FilterCalendar } from '@/shared/ui/filter/calendar';
import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups';
import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { LinkPaymentHistoryFilterProps, LinkPaymentPaymentStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus } from '@/entities/additional-service/model/link-pay/types'; import { LinkPaymentHistoryFilterProps, LinkPaymentPaymentMethod, LinkPaymentPaymentStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus } from '@/entities/additional-service/model/link-pay/types';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks'; import { useKeyboardAware } from '@/shared/lib/hooks';
import { getPaymentMethodOptionGroup } from '@/entities/additional-service/model/link-pay/constant';
export const LinkPaymentHistoryFilter = ({ export const LinkPaymentHistoryFilter = ({
filterOn, filterOn,
@@ -25,6 +26,7 @@ export const LinkPaymentHistoryFilter = ({
mid, mid,
searchCl, searchCl,
searchValue, searchValue,
paymentMethod,
fromDate, fromDate,
toDate, toDate,
paymentStatus, paymentStatus,
@@ -33,6 +35,7 @@ export const LinkPaymentHistoryFilter = ({
setMid, setMid,
setSearchType, setSearchType,
setSearchKeyword, setSearchKeyword,
setPaymentMethod,
setStartDate, setStartDate,
setEndDate, setEndDate,
setPaymentStatus, setPaymentStatus,
@@ -44,6 +47,7 @@ export const LinkPaymentHistoryFilter = ({
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<LinkPaymentSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<LinkPaymentSearchCl>(searchCl);
const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue); const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue);
const [filterPaymentMethod, setFilterPaymentMethod] = useState<LinkPaymentPaymentMethod>(paymentMethod);
const [filterStartDate, setFilterStartDate] = useState<string>(fromDate); const [filterStartDate, setFilterStartDate] = useState<string>(fromDate);
const [filterEndDate, setFilterEndDate] = useState<string>(toDate); const [filterEndDate, setFilterEndDate] = useState<string>(toDate);
const [filterTransactionStatus, setFilterTransactionStatus] = useState<LinkPaymentPaymentStatus>(paymentStatus) const [filterTransactionStatus, setFilterTransactionStatus] = useState<LinkPaymentPaymentStatus>(paymentStatus)
@@ -85,6 +89,7 @@ export const LinkPaymentHistoryFilter = ({
setMid(filterMid); setMid(filterMid);
setSearchType(filterSearchCl); setSearchType(filterSearchCl);
setSearchKeyword(filterSearchValue); setSearchKeyword(filterSearchValue);
setPaymentMethod(filterPaymentMethod);
setStartDate(filterStartDate); setStartDate(filterStartDate);
setEndDate(filterEndDate); setEndDate(filterEndDate);
setPaymentStatus(filterTransactionStatus); setPaymentStatus(filterTransactionStatus);
@@ -112,7 +117,7 @@ export const LinkPaymentHistoryFilter = ({
<div className="full-menu-actions"> <div className="full-menu-actions">
<FullMenuClose <FullMenuClose
addClass='full-menu-close' addClass='full-menu-close'
onClickToCallback={ onClickToClose } onClickToCallback={onClickToClose}
></FullMenuClose> ></FullMenuClose>
</div> </div>
</div> </div>
@@ -131,8 +136,14 @@ export const LinkPaymentHistoryFilter = ({
selectOptions={searchTypeOption} selectOptions={searchTypeOption}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={ handleInputFocus } handleInputFocus={handleInputFocus}
></FilterSelectInput> ></FilterSelectInput>
<FilterSelect
title={t('filter.paymentMethod')}
selectValue={filterPaymentMethod}
selectSetter={setFilterPaymentMethod}
selectOptions={getPaymentMethodOptionGroup(t)}
></FilterSelect>
<FilterCalendar <FilterCalendar
startDate={filterStartDate} startDate={filterStartDate}
endDate={filterEndDate} endDate={filterEndDate}

View File

@@ -35,7 +35,7 @@ const defaultParams = {
toDate: moment().format('YYYYMMDD'), toDate: moment().format('YYYYMMDD'),
searchCl: LinkPaymentSearchCl.PHONE, searchCl: LinkPaymentSearchCl.PHONE,
searchValue: '', searchValue: '',
paymentMethod: LinkPaymentPaymentMethod.CARD, paymentMethod: LinkPaymentPaymentMethod.ALL,
paymentStatus: LinkPaymentPaymentStatus.ALL, paymentStatus: LinkPaymentPaymentStatus.ALL,
sendStatus: LinkPaymentSendStatus.ALL, sendStatus: LinkPaymentSendStatus.ALL,
sendMethod: LinkPaymentSendMethod.ALL sendMethod: LinkPaymentSendMethod.ALL
@@ -109,6 +109,7 @@ export const LinkPaymentHistoryWrap = () => {
mid: mid, mid: mid,
searchCl: searchCl, searchCl: searchCl,
searchValue: searchValue, searchValue: searchValue,
paymentMethod: paymentMethod,
fromDate: fromDate, fromDate: fromDate,
toDate: toDate, toDate: toDate,
paymentStatus: paymentStatus, paymentStatus: paymentStatus,
@@ -333,6 +334,7 @@ export const LinkPaymentHistoryWrap = () => {
mid={mid} mid={mid}
searchCl={searchCl} searchCl={searchCl}
searchValue={searchValue} searchValue={searchValue}
paymentMethod={paymentMethod}
fromDate={fromDate} fromDate={fromDate}
toDate={toDate} toDate={toDate}
paymentStatus={paymentStatus} paymentStatus={paymentStatus}
@@ -341,6 +343,7 @@ export const LinkPaymentHistoryWrap = () => {
setMid={setMid} setMid={setMid}
setSearchType={setSearchCl} setSearchType={setSearchCl}
setSearchKeyword={setSearchValue} setSearchKeyword={setSearchValue}
setPaymentMethod={setPaymentMethod}
setStartDate={setFromDate} setStartDate={setFromDate}
setEndDate={setToDate} setEndDate={setToDate}
setPaymentStatus={setPaymentStatus} setPaymentStatus={setPaymentStatus}

View File

@@ -14,6 +14,7 @@ import { ServiceCode } from '../model/alimtalk/types';
import { getAlimtalkAlimClText, getAlimtalkSendClTypeText, getAlimtalkSendTypeText, getAlimtalkServiceCodeText } from '../model/alimtalk/constant'; import { getAlimtalkAlimClText, getAlimtalkSendClTypeText, getAlimtalkSendTypeText, getAlimtalkServiceCodeText } from '../model/alimtalk/constant';
import { getAuthResultStatusText, getTransTypeText } from '../model/face-auth/constant'; import { getAuthResultStatusText, getTransTypeText } from '../model/face-auth/constant';
import { getPayoutStatusText } from '../model/payout/constant'; import { getPayoutStatusText } from '../model/payout/constant';
import { getPaymentMethodText } from '../model/link-pay/constant';
export const ListItem = ({ export const ListItem = ({
additionalServiceCategory, additionalServiceCategory,
@@ -376,9 +377,9 @@ export const ListItem = ({
} }
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory
) { ) {
str = `${getMaskedName(buyerName)}`; str = receiverInfo ? `${getMaskedName(buyerName)}(${receiverInfo})` : `${getMaskedName(buyerName)}`;
} else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait) { } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait) {
str = `${getMaskedName(buyerName)}(${receiverInfo})`; str = receiverInfo ? `${getMaskedName(buyerName)}(${receiverInfo})` : `${getMaskedName(buyerName)}`;
} }
else if (additionalServiceCategory === AdditionalServiceCategory.Payout) { else if (additionalServiceCategory === AdditionalServiceCategory.Payout) {
str = companyName; str = companyName;
@@ -452,7 +453,7 @@ export const ListItem = ({
); );
} }
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) { else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) {
if (paymentStatus === "0" || paymentStatus === "3" || paymentStatus === "4") { if (paymentStatus === "2" || paymentStatus === "4") {
rs.push( rs.push(
<div key="link-payment-history" className="transaction-details"> <div key="link-payment-history" className="transaction-details">
<span>{getPaymentStatusText(t)(paymentStatus)}</span> <span>{getPaymentStatusText(t)(paymentStatus)}</span>
@@ -466,8 +467,12 @@ export const ListItem = ({
<span>{getPaymentStatusText(t)(paymentStatus)}</span> <span>{getPaymentStatusText(t)(paymentStatus)}</span>
<span className="separator">|</span> <span className="separator">|</span>
<span>{getSendMethodText(t)(sendMethod)}</span> <span>{getSendMethodText(t)(sendMethod)}</span>
<span className="separator">|</span> {paymentMethod && (
<span>{paymentMethod}</span> <>
<span className="separator">|</span>
<span>{getPaymentMethodText(t)(paymentMethod)}</span>
</>
)}
</div> </div>
); );
} }
@@ -483,7 +488,7 @@ export const ListItem = ({
} }
else if (additionalServiceCategory === AdditionalServiceCategory.Payout) { else if (additionalServiceCategory === AdditionalServiceCategory.Payout) {
rs.push( rs.push(
<div className="transaction-details"> <div key="payout" className="transaction-details">
<span>{getPayoutStatusText(t)(status)}</span> <span>{getPayoutStatusText(t)(status)}</span>
<span className="separator">|</span> <span className="separator">|</span>
<span>{submallId}</span> <span>{submallId}</span>
@@ -519,7 +524,7 @@ export const ListItem = ({
} }
else if (additionalServiceCategory === AdditionalServiceCategory.Ars) { else if (additionalServiceCategory === AdditionalServiceCategory.Ars) {
rs.push( rs.push(
<div className="transaction-details"> <div key="ars" className="transaction-details">
<span>{getTime()}</span> <span>{getTime()}</span>
<span className="separator">|</span> <span className="separator">|</span>
<span>{getStatus()}</span> <span>{getStatus()}</span>
@@ -532,7 +537,7 @@ export const ListItem = ({
} }
else if (additionalServiceCategory === AdditionalServiceCategory.Alimtalk) { else if (additionalServiceCategory === AdditionalServiceCategory.Alimtalk) {
rs.push( rs.push(
<div className="transaction-details"> <div key="alimtalk" className="transaction-details">
<span>{getTime()}</span> <span>{getTime()}</span>
<span className="separator">|</span> <span className="separator">|</span>
<span>{getAlimtalkServiceCodeText(t)(serviceCode)}</span> <span>{getAlimtalkServiceCodeText(t)(serviceCode)}</span>
@@ -557,14 +562,14 @@ export const ListItem = ({
let rs: any[] = []; let rs: any[] = [];
if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) { if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
rs.push( rs.push(
<div className={`status-label ${resultStatus === 'SUCCESS' ? 'success' : 'fail'}`}> <div key="account-holder-search-amount" className={`status-label ${resultStatus === 'SUCCESS' ? 'success' : 'fail'}`}>
{resultStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')} {resultStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')}
</div> </div>
); );
} }
else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) {
rs.push( rs.push(
<div className={`status-label ${authResult === 'SUCCESS' ? 'success' : 'fail'}`}> <div key="face-auth-amount" className={`status-label ${authResult === 'SUCCESS' ? 'success' : 'fail'}`}>
{authResult === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')} {authResult === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')}
</div> </div>
); );
@@ -573,14 +578,14 @@ export const ListItem = ({
const statusText = authStatus === 'REQUEST' ? t('additionalService.common.request') : authStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail'); const statusText = authStatus === 'REQUEST' ? t('additionalService.common.request') : authStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail');
const statusClass = authStatus === 'SUCCESS' || 'REQUEST' ? 'success' : 'fail'; const statusClass = authStatus === 'SUCCESS' || 'REQUEST' ? 'success' : 'fail';
rs.push( rs.push(
<div className={`status-label ${statusClass}`}> <div key="account-holder-auth-amount" className={`status-label ${statusClass}`}>
{statusText} {statusText}
</div> </div>
); );
} }
else if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) { else if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) {
rs.push( rs.push(
<div className="transaction-amount"> <div key="key-in-payment-amount" className="transaction-amount">
{t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })} {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
</div> </div>
); );
@@ -589,7 +594,7 @@ export const ListItem = ({
additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait
) { ) {
rs.push( rs.push(
<div className="transaction-amount"> <div key="link-payment-amount" className="transaction-amount">
{t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })} {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
</div> </div>
); );

View File

@@ -98,7 +98,7 @@ export const ListFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterButtonGroups <FilterButtonGroups

View File

@@ -84,6 +84,9 @@ export const NoticeDetail = ({
className="notice-detail__body" className="notice-detail__body"
dangerouslySetInnerHTML={{ __html: result.contents || '' }} dangerouslySetInnerHTML={{ __html: result.contents || '' }}
></div> ></div>
{/*
<div className="notice-detail__body">{ result.contents }</div>
*/}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,39 @@
import axios from 'axios';
import { API_URL_TRANSACTION } from '@/shared/api/api-url-transaction';
import { resultify } from '@/shared/lib/resultify';
import { NiceAxiosError } from '@/shared/@types/error';
import {
AllTransactionIssueSendParams,
AllTransactionIssueSendResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
import { getHeaderUserAgent } from '@/shared/constants/url';
export const allTransactionIssueSend = (params: AllTransactionIssueSendParams) => {
let headerOptions = {
menuId: 31,
apiType: 'SEND'
};
let options = {
headers: {
'X-User-Agent': getHeaderUserAgent(headerOptions)
}
};
return resultify(
axios.post<AllTransactionIssueSendResponse>(API_URL_TRANSACTION.transactionIssueSend(), params, options),
);
};
export const useAllTransactionIssueSendMutation = (options?: UseMutationOptions<AllTransactionIssueSendResponse, NiceAxiosError, AllTransactionIssueSendParams>) => {
const mutation = useMutation<AllTransactionIssueSendResponse, NiceAxiosError, AllTransactionIssueSendParams>({
...options,
mutationFn: (params: AllTransactionIssueSendParams) => allTransactionIssueSend(params),
});
return {
...mutation,
};
};

View File

@@ -454,8 +454,10 @@ export interface ImportantInfo {
approvalDate?: string; approvalDate?: string;
approvalTime?: string; approvalTime?: string;
transactionDate?: string; transactionDate?: string;
transactionTime?: string;
requestDate?: string; requestDate?: string;
cancelDate?: string; cancelDate?: string;
cancelTime?: string;
goodsName?: string; goodsName?: string;
orderNumber?: string; orderNumber?: string;
@@ -483,6 +485,7 @@ export interface PaymentInfo {
depositorName?: string; depositorName?: string;
depositDeadline?: string; depositDeadline?: string;
depositDate?: string; depositDate?: string;
depositTime?: string;
refundScheduleDate?: string; refundScheduleDate?: string;
refundBankName?: string; refundBankName?: string;
refundAccountNumber?: string; refundAccountNumber?: string;
@@ -907,3 +910,34 @@ export interface EscrowMailResendParams {
export interface EscrowMailResendResponse { export interface EscrowMailResendResponse {
}; };
export interface AllTransactionIssueSendParams {
sendEmail: string;
mid?: string;
tid: string;
buyerName?: string;
approvalDate?: string;
depositDate?: string;
transactionDate?: string;
approvalTime?: string;
depositTime?: string;
transactionTime?: string;
transactionAmount?: number;
goodsName?: string;
buyerTel?: string;
approvalNo?: string;
installmentMonth?: string;
moid?: string;
bankName?: string;
accountNo?: string;
purchaseCompany?: string;
cancelDate?: string;
cancelTime?: string;
serviceCode?: string;
transactionStatus?: string;
};
export interface AllTransactionIssueSendResponse {
code: string;
message: string;
ordNm: string;
};

View File

@@ -191,6 +191,9 @@ export const AllTransactionDetail = ({
<AmountInfoSection <AmountInfoSection
transactionCategory={ TransactionCategory.AllTransaction } transactionCategory={ TransactionCategory.AllTransaction }
amountInfo={ amountInfo } amountInfo={ amountInfo }
importantInfo={ importantInfo }
paymentInfo={ paymentInfo }
transactionInfo={ transactionInfo }
isOpen={ showAmountInfo } isOpen={ showAmountInfo }
tid={ tid } tid={ tid }
serviceCode={ serviceCode } serviceCode={ serviceCode }

View File

@@ -234,7 +234,7 @@ export const AllTransactionFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterSelectInput <FilterSelectInput

View File

@@ -119,7 +119,7 @@ export const CashReceiptFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterCalendar <FilterCalendar

View File

@@ -118,7 +118,7 @@ export const EscrowFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterSelectInput <FilterSelectInput

View File

@@ -1,7 +1,7 @@
import moment from 'moment'; import moment from 'moment';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { AmountInfo, CashReceiptReceiptDownloadParams, CashReceiptReceiptDownloadResponse, CashReceiptReceiptSendEmailParams, CashReceiptReceiptSendEmailResponse, CustomerInfo, InfoSectionKeys, InfoSectionProps, IssueInfo, MerchantInfo, ProductInfo, TransactionCategory, TransactionInfo } from '../../model/types'; import { AllTransactionIssueSendParams, AllTransactionIssueSendResponse, AmountInfo, CashReceiptReceiptDownloadParams, CashReceiptReceiptDownloadResponse, CashReceiptReceiptSendEmailParams, CashReceiptReceiptSendEmailResponse, CustomerInfo, InfoSectionKeys, InfoSectionProps, IssueInfo, MerchantInfo, ProductInfo, TransactionCategory, TransactionInfo } from '../../model/types';
import { SlideDown } from 'react-slidedown'; import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css'; import 'react-slidedown/lib/slidedown.css';
import { snackBar } from '@/shared/lib'; import { snackBar } from '@/shared/lib';
@@ -10,11 +10,15 @@ import { useState } from 'react';
import { DownloadBottomSheet, DownloadSelectedMode } from '@/entities/common/ui/download-bottom-sheet'; import { DownloadBottomSheet, DownloadSelectedMode } from '@/entities/common/ui/download-bottom-sheet';
import { CashReceiptSample } from '@/entities/common/ui/cash-receipt-sample'; import { CashReceiptSample } from '@/entities/common/ui/cash-receipt-sample';
import { useCashReceiptReceiptSendEmailMutation } from '../../api/use-cash-receipt-receipt-send-email-mutation'; import { useCashReceiptReceiptSendEmailMutation } from '../../api/use-cash-receipt-receipt-send-email-mutation';
import { useDownloadBottomSheetOnStore } from '@/shared/model/store'; import { useDownloadBottomSheetOn2Store } from '@/shared/model/store';
import { useAllTransactionIssueSendMutation } from '../../api/use-all-transaction-issue-send-mutation';
export const AmountInfoSection = ({ export const AmountInfoSection = ({
transactionCategory, transactionCategory,
amountInfo, amountInfo,
importantInfo,
paymentInfo,
transactionInfo,
isOpen, isOpen,
tid, tid,
serviceCode, serviceCode,
@@ -23,10 +27,11 @@ export const AmountInfoSection = ({
}: InfoSectionProps) => { }: InfoSectionProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { mutateAsync: allTransactionIssueSend } = useAllTransactionIssueSendMutation();
const { mutateAsync: cashReceiptReceiptDownload } = useCashReceiptReceiptDownloadMutation(); const { mutateAsync: cashReceiptReceiptDownload } = useCashReceiptReceiptDownloadMutation();
const { mutateAsync: cashReceiptReceiptSendEamil } = useCashReceiptReceiptSendEmailMutation(); const { mutateAsync: cashReceiptReceiptSendEamil } = useCashReceiptReceiptSendEmailMutation();
const { downloadBottomSheetOn, setDownloadBottomSheetOn } = useDownloadBottomSheetOnStore(); const { downloadBottomSheetOn2, setDownloadBottomSheetOn2 } = useDownloadBottomSheetOn2Store();
const [cashReceiptSampleOn, setCashReceiptSampleOn] = useState<boolean>(false); const [cashReceiptSampleOn, setCashReceiptSampleOn] = useState<boolean>(false);
const [receiptIssueInfo, setReceiptIssueInfo] = useState<IssueInfo>({}); const [receiptIssueInfo, setReceiptIssueInfo] = useState<IssueInfo>({});
@@ -199,7 +204,7 @@ export const AmountInfoSection = ({
}; };
const onClickToOpenDownloadBottomSheet = () => { const onClickToOpenDownloadBottomSheet = () => {
setDownloadBottomSheetOn(true); setDownloadBottomSheetOn2(true);
}; };
const onRequestDownload = ( const onRequestDownload = (
@@ -210,21 +215,63 @@ export const AmountInfoSection = ({
if(selectedMode === DownloadSelectedMode.EMAIL if(selectedMode === DownloadSelectedMode.EMAIL
&& !!userEmail && !!userEmail
){ ){
let params: CashReceiptReceiptSendEmailParams = { if(transactionCategory === TransactionCategory.AllTransaction){
tid: tid, let params: AllTransactionIssueSendParams = {
email: userEmail sendEmail: userEmail,
}; mid: amountInfo?.mid,
cashReceiptReceiptSendEamil(params).then((rs: CashReceiptReceiptSendEmailResponse) => { tid: tid,
console.log(rs); buyerName: transactionInfo?.buyerName,
if(rs.message){ approvalDate: importantInfo?.approvalDate,
snackBar(rs.message); depositDate: paymentInfo?.depositDate,
} transactionDate: importantInfo?.transactionDate,
}).catch((e: any) => { approvalTime: importantInfo?.approvalTime,
if(e.response?.data?.error?.message){ depositTime: paymentInfo?.depositTime,
snackBar(e.response?.data?.error?.message); transactionTime: importantInfo?.transactionTime,
return; transactionAmount: amountInfo?.transactionAmount,
} goodsName: importantInfo?.goodsName,
}); buyerTel: transactionInfo?.buyerTel,
approvalNo: paymentInfo?.approvalNo,
installmentMonth: paymentInfo?.approvalNo,
moid: importantInfo?.moid,
bankName: paymentInfo?.bankName || paymentInfo?.refundBankName,
accountNo: paymentInfo?.accountNo || paymentInfo?.refundAccountNo,
purchaseCompany: paymentInfo?.purchaseCompany,
cancelDate: importantInfo?.cancelDate,
cancelTime: importantInfo?.cancelTime,
serviceCode: serviceCode,
transactionStatus: importantInfo?.transactionStatus
};
allTransactionIssueSend(params).then((rs: AllTransactionIssueSendResponse) => {
if(rs.message){
snackBar(rs.message);
}
else{
snackBar('메일이 전송 되었습니다.');
}
}).catch((e: any) => {
if(e.response?.data?.error?.message){
snackBar(e.response?.data?.error?.message);
return;
}
});
}
else if(transactionCategory === TransactionCategory.CashReceipt){
let params: CashReceiptReceiptSendEmailParams = {
tid: tid,
email: userEmail
};
cashReceiptReceiptSendEamil(params).then((rs: CashReceiptReceiptSendEmailResponse) => {
console.log(rs);
if(rs.message){
snackBar(rs.message);
}
}).catch((e: any) => {
if(e.response?.data?.error?.message){
snackBar(e.response?.data?.error?.message);
return;
}
});
}
} }
else if(selectedMode === DownloadSelectedMode.IMAGE){ else if(selectedMode === DownloadSelectedMode.IMAGE){
let params: CashReceiptReceiptDownloadParams = { let params: CashReceiptReceiptDownloadParams = {
@@ -460,8 +507,9 @@ export const AmountInfoSection = ({
</div> </div>
} }
<div className="txn-doc"> <div className="txn-doc">
{ (transactionCategory === TransactionCategory.CashReceipt) && { ((transactionCategory === TransactionCategory.AllTransaction) ||
!!canDownloadReceipt && ((transactionCategory === TransactionCategory.CashReceipt) &&
!!canDownloadReceipt)) &&
<button <button
className="doc-btn" className="doc-btn"
type="button" type="button"
@@ -470,11 +518,11 @@ export const AmountInfoSection = ({
} }
</div> </div>
</div> </div>
{ !!downloadBottomSheetOn && { !!downloadBottomSheetOn2 &&
<DownloadBottomSheet <DownloadBottomSheet
bottomSheetOn={ downloadBottomSheetOn } bottomSheetOn={ downloadBottomSheetOn2 }
setBottomSheetOn={ setDownloadBottomSheetOn } setBottomSheetOn={ setDownloadBottomSheetOn2 }
imageMode={ true } imageMode={ (transactionCategory === TransactionCategory.CashReceipt) }
emailMode={ true } emailMode={ true }
sendRequest={ onRequestDownload } sendRequest={ onRequestDownload }
></DownloadBottomSheet> ></DownloadBottomSheet>

View File

@@ -86,7 +86,7 @@ export const ListFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('merchant.title')} title={t('merchant.title')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterCalendarMonth <FilterCalendarMonth

View File

@@ -1295,7 +1295,18 @@
"apply": "Apply", "apply": "Apply",
"sendRequest": "Send Request", "sendRequest": "Send Request",
"sendCancel": "Send Cancel", "sendCancel": "Send Cancel",
"progressStatus": "Progress Status" "progressStatus": "Progress Status",
"paymentMethod": {
"card": "Credit Card",
"bank": "Bank Transfer",
"virtualAccount": "Virtual Account",
"phone": "Mobile Phone",
"cultureland": "Cultureland",
"ssgMoney": "SSG Money",
"ssgBank": "SSG Bank",
"cmsBank": "Easy Account Payment",
"tmoneyPay": "T-money Pay"
}
}, },
"infoWrap": { "infoWrap": {
"paymentInfo": "Payment Information", "paymentInfo": "Payment Information",

View File

@@ -897,27 +897,27 @@
}, },
"services": { "services": {
"sms": "SMS 결제 통보", "sms": "SMS 결제 통보",
"smsDesc": "입금 요청부터 완료까지 SMS 자동 전송", "smsDesc": "입금 요청부터 완료까지 \n SMS 자동 전송",
"ars": "신용카드 ARS 결제", "ars": "신용카드 ARS 결제",
"arsDesc": "전화 한 통으로 결제 성공 편리하고 안전한 서비스", "arsDesc": "전화 한 통으로 결제 성공 \n 편리하고 안전한 서비스",
"keyIn": "KEY-IN 결제", "keyIn": "KEY-IN 결제",
"keyInDesc": "카드정보 입력만으로 \n 간편하게 결제 가능", "keyInDesc": "카드정보 입력만으로 \n 간편하게 결제 가능",
"accountHolderSearch": "계좌성명조회", "accountHolderSearch": "계좌성명조회",
"accountHolderSearchDesc": "예금주 정보 입력으로 즉시 예금주 확인", "accountHolderSearchDesc": "예금주 정보 입력으로 \n 즉시 예금주 확인",
"payout": "지급대행", "payout": "지급대행",
"payoutDesc": "하위 가맹점에 빠른 정산금 지급 지급대행 서비스", "payoutDesc": "하위 가맹점에 빠른 정산금 지급 지급대행 서비스",
"settlementAgency": "정산대행", "settlementAgency": "정산대행",
"settlementAgencyDesc": "하위 가맹점 정산금 계산부터 지급까지 자동 해결 서비스", "settlementAgencyDesc": "하위 가맹점 정산금 계산부터 지급까지 자동 해결 서비스",
"linkPayment": "링크 결제", "linkPayment": "링크 결제",
"linkPaymentDesc": "결제 링크 전송만으로 어디서든 결제 가능 서비스", "linkPaymentDesc": "결제 링크 전송만으로 \n 어디서든 결제 가능 서비스",
"fundAccount": "자금이체", "fundAccount": "자금이체",
"fundAccountDesc": "예치금으로 즉시 송금, 파일 등록만으로 다중 송금 가능", "fundAccountDesc": "예치금으로 즉시 송금, 파일 등록만으로 다중 송금 가능",
"accountHolderAuth": "계좌점유인증", "accountHolderAuth": "계좌점유인증",
"accountHolderAuthDesc": "1원 송금으로 \n 계좌 점유 인증 가능", "accountHolderAuthDesc": "1원 송금으로 \n 계좌 점유 인증 가능",
"alimtalk": "알림톡 결제통보", "alimtalk": "알림톡 결제통보",
"alimtalkDesc": "결제 상태를 알림톡으로 쉽고 빠른 안내", "alimtalkDesc": "결제 상태를 알림톡으로 \n 쉽고 빠른 안내",
"faceAuth": "안면인증", "faceAuth": "안면인증",
"faceAuthDesc": "얼굴 인식만으로 본인확인과 \n 결제 가능한 안전 결제 서비스" "faceAuthDesc": "얼굴 인식만으로 본인확인과 결제 가능한 안전 결제 서비스"
}, },
"settlementAgency": { "settlementAgency": {
"title": "정산대행", "title": "정산대행",
@@ -1290,13 +1290,25 @@
"kakao": "카카오", "kakao": "카카오",
"merchant": "가맹점", "merchant": "가맹점",
"phoneNumberEmail": "휴대폰번호/이메일", "phoneNumberEmail": "휴대폰번호/이메일",
"transactionStatus": "거래 상태", "transactionStatus": "결제 상태",
"sendResult": "발송 결과", "sendResult": "전송결과",
"sendMethod": "발송수단", "sendMethod": "발송수단",
"apply": "적용", "apply": "적용",
"sendRequest": "발송요청", "sendRequest": "발송요청",
"sendCancel": "발송취소", "sendCancel": "발송취소",
"progressStatus": "진행상태" "progressStatus": "진행상태",
"paymentMethod": {
"all": "전체",
"card": "신용카드",
"bank": "계좌이체",
"virtualAccount": "가상계좌",
"phone": "휴대폰",
"cultureland": "문화상품권",
"ssgMoney": "SSG머니",
"ssgBank": "SSG뱅크",
"cmsBank": "계좌간편결제",
"tmoneyPay": "티머니페이"
}
}, },
"infoWrap": { "infoWrap": {
"paymentInfo": "결제 정보", "paymentInfo": "결제 정보",

View File

@@ -91,7 +91,9 @@ export const LinkPaymentApplyConfirmPage = () => {
}; };
const onClickToBack = () => { const onClickToBack = () => {
navigate(-1); navigate(PATHS.additionalService.linkPayment.request, {
state: { formData, returnToStep: 2 }
});
}; };
return ( return (

View File

@@ -11,12 +11,14 @@ import { IdentityType, Language } from '@/entities/additional-service/model/type
import { LinkContentType, LinkPaymentFormData, LinkPaymentSendMethod } from '@/entities/additional-service/model/link-pay/types'; import { LinkContentType, LinkPaymentFormData, LinkPaymentSendMethod } from '@/entities/additional-service/model/link-pay/types';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import moment from 'moment'; import moment from 'moment';
import { useLocation } from 'react-router';
export const LinkPaymentApplyPage = () => { export const LinkPaymentApplyPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const location = useLocation();
const midOptionsWithoutGids = useStore.getState().UserStore.selectOptionsMidsWithoutGids; const midOptionsWithoutGids = useStore.getState().UserStore.selectOptionsMidsWithoutGids;
const userMid = useStore.getState().UserStore.mid; const userMid = useStore.getState().UserStore.mid;
@@ -27,23 +29,31 @@ export const LinkPaymentApplyPage = () => {
}); });
const initialMid = (midItem.length > 0) ? userMid : (midOptionsWithoutGids.length > 0 ? midOptionsWithoutGids[0]?.value || '' : ''); const initialMid = (midItem.length > 0) ? userMid : (midOptionsWithoutGids.length > 0 ? midOptionsWithoutGids[0]?.value || '' : '');
const [processStep, setProcessStep] = useState<ProcessStep>(ProcessStep.One); // location.state에서 formData와 returnToStep 받기
const [formData, setFormData] = useState<LinkPaymentFormData>({ const savedFormData = location.state?.formData;
mid: initialMid, const returnToStep = location.state?.returnToStep;
sendMethod: LinkPaymentSendMethod.SMS,
goodsName: '', const [processStep, setProcessStep] = useState<ProcessStep>(
amount: 0, returnToStep === 2 ? ProcessStep.Two : ProcessStep.One
moid: '', );
paymentLimitDate: moment().format('YYYY.MM.DD'), const [formData, setFormData] = useState<LinkPaymentFormData>(
buyerName: '', savedFormData || {
email: '', mid: initialMid,
phoneNumber: '', sendMethod: LinkPaymentSendMethod.SMS,
isIdentity: false, goodsName: '',
identityType: IdentityType.INDIVIDUAL, amount: 0,
identityValue: '', moid: '',
language: Language.KR, paymentLimitDate: moment().format('YYYY.MM.DD'),
linkContentType: LinkContentType.BASIC buyerName: '',
}); email: '',
phoneNumber: '',
isIdentity: false,
identityType: IdentityType.INDIVIDUAL,
identityValue: '',
language: Language.KR,
linkContentType: LinkContentType.BASIC
}
);
useSetHeaderTitle(t('additionalService.linkPayment.applyTitle')); useSetHeaderTitle(t('additionalService.linkPayment.applyTitle'));
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);

View File

@@ -31,6 +31,10 @@ export const API_URL_TRANSACTION = {
// POST: 거래취소 정보 조회 // POST: 거래취소 정보 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/cancel-info`; return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/cancel-info`;
}, },
transactionIssueSend: () => {
// POST: 거래확인서 메일 발송
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/issue/send`;
},
/* Cash Receipt Management - 현금영수증 API */ /* Cash Receipt Management - 현금영수증 API */
cashReceiptList: () => { cashReceiptList: () => {

View File

@@ -10,6 +10,10 @@ export interface DownloadBottomSheetOnStore {
downloadBottomSheetOn: boolean; downloadBottomSheetOn: boolean;
setDownloadBottomSheetOn: (downloadBottomSheetOn: boolean) => void; setDownloadBottomSheetOn: (downloadBottomSheetOn: boolean) => void;
}; };
export interface DownloadBottomSheetOn2Store {
downloadBottomSheetOn2: boolean;
setDownloadBottomSheetOn2: (downloadBottomSheetOn2: boolean) => void;
};
export interface FilterOnStore { export interface FilterOnStore {
filterOn: boolean; filterOn: boolean;
setFilterOn: (filterOn: boolean) => void; setFilterOn: (filterOn: boolean) => void;
@@ -50,6 +54,14 @@ export const useDownloadBottomSheetOnStore = create<DownloadBottomSheetOnStore>(
})); }));
} }
})); }));
export const useDownloadBottomSheetOn2Store = create<DownloadBottomSheetOn2Store>((set) => ({
downloadBottomSheetOn2: false,
setDownloadBottomSheetOn2: (downloadBottomSheetOn2: boolean) => {
set((state: {downloadBottomSheetOn2: boolean}) => ({
downloadBottomSheetOn2: (state.downloadBottomSheetOn2 = downloadBottomSheetOn2)
}));
}
}));
export const useFilterlOnStore = create<FilterOnStore>((set) => ({ export const useFilterlOnStore = create<FilterOnStore>((set) => ({
filterOn: false, filterOn: false,

View File

@@ -567,6 +567,46 @@ main.pop{
padding-bottom: 100px; padding-bottom: 100px;
} }
/* 부가서비스 리스트 스타일 조정 */
.ing-list .list-wrap02 {
gap: 50px;
}
.ing-list .list-wrap01 img,
.ing-list .list-wrap02 img {
width: 60px;
height: 60px;
object-fit: contain;
}
/* 링크결제 확인 페이지 */
main.pop {
height: 100vh;
overflow: hidden;
display: flex;
flex-direction: column;
}
main.pop .sub-wrap {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding-bottom: 120px;
-webkit-overflow-scrolling: touch;
}
main.pop .preview-body {
max-width: 338px;
width: 100%;
min-height: auto;
}
main.pop .apply-row {
position: fixed;
bottom: 0;
flex-shrink: 0;
}
.resend-text { .resend-text {
word-break: break-all !important; word-break: break-all !important;
} }
@@ -591,3 +631,20 @@ main.pop{
.tab36 { .tab36 {
font-size: var(--fs-15); font-size: var(--fs-15);
} }
/* 로그인 인증 정보 input-row 레이아웃 수정 */
.settings-login-auth .input-row {
display: flex;
align-items: center;
gap: 16px;
padding-bottom: 16px;
}
.settings-login-auth .input-row input {
flex: 1;
min-width: 0;
}
.settings-login-auth .icon-btn.minus {
flex-shrink: 0;
}

View File

@@ -54,11 +54,11 @@ export const MaskedNameInput = ({
onChange(valueWithoutSpace); onChange(valueWithoutSpace);
}} }}
onChange={(e: ChangeEvent<HTMLInputElement>) => { onChange={(e: ChangeEvent<HTMLInputElement>) => {
if(isComposing){
// composition 중에는 스페이스 제거 // composition 중에는 스페이스 제거
const valueWithoutSpace = e.target.value.replace(/\s/g, ''); const valueWithoutSpace = e.target.value.replace(/\s/g, '');
onChange(valueWithoutSpace); onChange(valueWithoutSpace);
}
}} }}
onFocus={onFocus} onFocus={onFocus}
/> />

View File

@@ -260,8 +260,8 @@ export const SubLayout = () => {
let userParmas; let userParmas;
if(!isNativeEnvironment){ if(!isNativeEnvironment){
userParmas = { userParmas = {
//id: 'nictest00', id: 'nictest00',
id: 'reptest22m', //id: 'reptest22m',
password: 'nictest00' password: 'nictest00'
}; };
// userParmas = { // userParmas = {