첫 커밋

This commit is contained in:
focp212@naver.com
2025-09-05 15:36:48 +09:00
commit 05238b04c1
825 changed files with 176358 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
export const DEFAULT_BACKGROUND_COLOR = '#FFFFFF';
export const HOME_BACKGROUND_COLOR = '#EEF3F8';

View File

@@ -0,0 +1 @@
export const IMAGE_ROOT = '/src/shared/ui/assets/images';

View File

@@ -0,0 +1,14 @@
import packageInfo from '../../../package.json';
// 어플리케이션 running environment (development, production, test)
export const IS_LOCAL = import.meta.env.VITE_APP_ENV === 'local';
export const IS_TEST = import.meta.env.VITE_APP_ENV === 'test';
export const IS_DEV = import.meta.env.VITE_APP_ENV === 'development';
export const IS_PROD = import.meta.env.VITE_APP_ENV === 'production';
export const IS_STORYBOOK = !!import.meta.env.STORYBOOK;
export const IS_DEV_PHASE = IS_LOCAL || IS_DEV;
export const IS_MOCK_PHASE = import.meta.env.VITE_APP_ENV === 'mock';
export const RELEASE_VERSION = packageInfo.version;

View File

@@ -0,0 +1,55 @@
import { FieldValues, RegisterOptions } from 'react-hook-form';
export const createFormOptions = <T extends FieldValues>(overrides?: Partial<Record<string, RegisterOptions<T>>>) => {
const defaultOptions: Partial<Record<string, RegisterOptions<T>>> = {
NAME: {
required: '이름을 입력해 주세요.',
pattern: { value: /^[가-힣]{2,}$/, message: '이름을 두 글자 이상 입력해 주세요.' },
},
BIRTH: {
minLength: { value: 8, message: '생년월일을 8자리로 입력해 주세요.' },
pattern: {
value: /^\d{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$/,
message: '생년월일 형식에 맞게 입력해 주세요.',
},
validate: {
isBeforeToday: (value: string | null | undefined) => {
if (!value) return '생년월일을 입력해 주세요.';
const birthDate = new Date(
Number(value.slice(0, 4)),
Number(value.slice(4, 6)) - 1,
Number(value.slice(6, 8)),
);
const today = new Date();
today.setHours(0, 0, 0, 0);
return birthDate < today || '오늘 이전 날짜로 입력해 주세요.';
},
},
required: '생년월일을 입력해 주세요.',
},
CARRIER: {
required: '',
},
PHONE: {
required: '휴대폰 번호를 입력해 주세요.',
pattern: { value: /^01[016789][0-9]{7,8}$/, message: '올바르지 않은 휴대폰 형식입니다.' },
},
BANK_ACCOUNT: {
required: '계좌번호를 입력해 주세요.',
pattern: { value: /^[0-9]+$/, message: '숫자만 입력 가능합니다.' },
},
BANK_CODE: {
required: '은행을 선택해 주세요.',
},
ALIAS_NM: {
required: true,
pattern: { value: /^[0-9]+$/, message: '숫자만 입력 가능합니다.' },
},
};
return {
...defaultOptions,
...overrides,
};
};
export const MAX_INPUT_NUMBER = 999999999999999;

View File

@@ -0,0 +1,33 @@
export enum StorageKeys {
TokenType = 'TOKEN_TYPE',
AccessToken = 'ACCESS_TOKEN',
RefreshToken = 'REFRESH_TOKEN',
AccessTokenExpiresIn = 'ACCESS_TOKEN_EXPIRE_IN',
RefreshTokenExpiresIn = 'REFRESH_TOKEN_EXPIRES_IN',
MenuGrants = 'MENU_GRANTS',
Usrid = 'USRID',
ClientAddressIP = 'ClIENT_ADDRESS_IP',
Requires2FA = 'REQUIRES_2FA',
BottomBannerClose = 'BOTTOM_BANNER_CLOSE',
RootStore = 'ROOT_STORE',
requestId = 'REQUEST_ID',
Jwt = 'JWT',
RequestId = 'REQUEST_ID',
HasBioHardware = 'HAS_BIO_HARDWARE',
DeviceUniqueId = 'DEVICE_UNIQUE_ID',
AppVersion = 'APP_VERSION',
AppColor = 'APP_COLOR',
RedirectPath = 'REDIRECT_PATH',
Platform = 'PLATFORM',
AppPagingSpeed = 'APP_PAGING_SPEED', // deprecated
ScannedQrCode = 'SCANNED_QR_CODE',
HasPushTokenSent = 'HAS_PUSH_TOKEN_SENT',
SetFont = 'SET_FONT',
LogOut = 'LOGOUT',
}

View File

@@ -0,0 +1 @@
export * from './start';

View File

@@ -0,0 +1,5 @@
export const start = {
alreadyRegistered: 'already Registered?',
startConvenientSpending: 'Start enjoying convenient spending with an e-wallet.',
start: 'Start',
};

View File

@@ -0,0 +1,5 @@
import * as localeEn from './en';
import * as localeKr from './kr';
export const kr = { ...localeKr };
export const en = { ...localeEn };

View File

@@ -0,0 +1,128 @@
export const common = {
confirm: '확인',
depositToken: '예금 토큰',
eMoneyToken: '이머니 토큰',
voucher: '바우처',
transferDeposit: '전환 입금',
payment: '결제',
remittance: '송금',
switchDeposit: '예금 전환',
topUp: '충전',
conversion: '예금 토큰 전환',
transactionNotAllowed: '결제/송금/예금 전환 불가',
transferDepositTokenConversionNotAllowed: '송금/예금 토큰 전환 불가',
paymentRemittanceNotAllowed: '결제/송금 불가',
hideBalance: '잔액 숨기기',
name: '이름',
idNumber7Digits: '주민등록번호 7자리(생년월일/성별)',
birthDate8Digits: '생년월일 (8자리)',
selectCarrier: '통신사 선택',
phoneNumberWithoutHyphens: '휴대폰 번호 (-없이 입력)',
lastLoginDate: '최근 접속 일시',
userSuffix: '님',
transactionRestriction: '거래제한',
issuedAccountNumber: '발급 계좌 번호',
manageMyWallet: '내 지갑 관리',
authenticationAndSecurity: '인증/보안',
notice: '공지사항',
serviceSettings: '서비스 설정',
checkLinkedAccount: '연동 계좌 확인',
notificationSettings: '알림설정',
myVoucherStatus: '내 바우처 현황',
serviceGuide: '서비스 안내',
usageGuide: '이용 안내',
usageLocationGuide: '사용처 안내',
customerSupport: '고객 지원',
frequentlyAskedQuestions: '자주 묻는 질문',
oneOnOneInquiry: '1:1 문의',
oneOnOneInquirySubmit: '1:1 문의하기',
phoneInquiry: '전화 문의',
termsAndConditions: '약관 및 이용 동의',
privacyPolicy: '개인정보 처리방침',
appVersion: '앱 버전',
largeFontSetting: '큰 폰트설정',
logout: '로그아웃',
cancel: '취소',
logoutAction: '로그아웃 하기',
customerCenter: '고객센터',
weekdays: '평일',
register: '등록하기',
edit: '수정',
delete: '삭제',
total: '전체',
detail: '상세',
search: '검색',
resetPin: '간편 비밀번호 재설정',
shuffle: '재배열',
close: '닫기',
reset: '재설정',
proceedWithRegistration: '가입진행',
selectBank: '은행 선택',
next: ' 다음',
deleteAll: '전체삭제',
start: '시작하기',
allUsageHistoryView: '전체 이용 내역 조회',
selectInquiryPeriod: '조회 기간 선택',
previousMonth: '이전달',
nextMonth: '다음달',
selectMonthArrow: '월 선택 화살표',
tokenSelect: '토큰 선택',
selectArrow: '선택 화살표',
totalOwnedTokens: '총 보유 토큰',
viewAllUsageHistory: '전체 이용 내역 보기',
transactionType: '거래 구분',
usageToken: '이용 토큰',
availableAmount: '{{pageLabel}} 가능 금액',
transfer: '전송',
scanWalletQRCode: '지갑번호 QR 스캔하기',
bankLogo: '은행로고',
recentRecipient: '최근 보는 사람',
enterWalletNumberOrScanQRCode: '지갑 번호 입력 또는 QR코드 스캔',
insufficientBalanceConversionNotAllowed: '잔액 부족 전환 불가',
answerComplete: '답변완료',
inProgress: '확인중',
newInquiry: '새로운 문의 작성하기',
selectCategory: '카테고리 선택',
verificationRequest: '인증요청',
inquiryTitle: '문의 제목',
resend: '재요청',
newPost: '새글',
latestVersion: '최신 버전',
tokenInfo: '토큰 정보',
update: '업데이트',
recentUsageHistory: '최근이용내역',
linkedAccount: '연동계좌',
voucherIcon: '바우처아이콘',
notification: '알림',
qrNfcScan: 'QR/NFC 스캔',
showQr: 'QR 보여주기',
qrScan: 'QR 스캔하기',
qrPayment: 'QR 결제하기',
applyVoucherBenefits: '바우처 혜택 적용',
noApply: '미적용',
validTime: '유효시간',
reissue: '재발급',
retry: '재시도',
goBack: '돌아가기',
back: '뒤로가기',
agreeToAllTerms: '약관 전체 동의하기',
viewTerms: '약관보기',
doNotShowAgainToday: '오늘은 다시 보지 않기',
oneWonVerification: '1원 인증하기',
change: '변경하기',
changeAccount: '계좌변경',
deleteWaller: '지갑만들기',
viewQRCode: 'QR코드보기',
createWallet: '지갑 만들기',
hideTokenBalance: '토큰 잔액 숨기기',
tokenAndPayment: '토큰ㆍ결제',
security: '보안',
activityAndNews: '활동ㆍ소식',
receiveAllNotifications: '모든 알림 받기',
pushNotificationSettings: '푸시 알림 설정',
pushNotificationInfo: '푸시알림정보',
fontSizeSetting: '큰폰트 설정',
useLargeFont: '큰폰트 사용',
myTokenList: '내 트콘 목록',
help: '도움말',
};

View File

@@ -0,0 +1 @@
export const glossary = {};

View File

@@ -0,0 +1,4 @@
export * from './validation';
export * from './common';
export * from './text';
export * from './pin';

View File

@@ -0,0 +1,31 @@
export const pin = {
titleSetPin: `간편 비밀번호 설정`,
messageSetPin: `생년월일, 휴대폰 번호 또는 \n동일하거나 연속된 숫자는 등록이 제한됩니다.`,
titleSetPinConfirm: `간편 비밀번호 확인`,
messageSetPinConfirm: `동일한 비밀번호를 한번 더 입력해 주세요.`,
titleResetInput: `비밀번호 입력`,
messageResetInput: `사용 중인 비밀번호를 입력해 주세요.`,
titleResetPin: `신규 비밀번호 설정`,
messageResetPin: `새롭게 사용할 비밀번호를 입력해 주세요.`,
titleResetPinConfirm: `신규 비밀번호 다시 입력`,
messageResetPinConfirm: `동일한 비밀번호를 한번 더 입력해 주세요.`,
completeResetPin: `간편 비밀번호를 변경했습니다.`,
titleInputPin: `간편 비밀번호 입력`,
messageInputPin: `비밀번호 6자리를 입력해 주세요.`,
messageInputBio: `생체인증 사용을 위해 비밀번호를 입력해 주세요.`,
titlePin: `비밀번호 입력`,
errorResetInput: `간편 비밀번호가 초기화되었습니다. \n비밀번호를 다시 설정해 주세요.`,
errorResetPin: `생년월일, 휴대폰 번호 또는 동일하거나 연속된 숫자는 등록이 제한됩니다.`,
errorMaxPin: `다시 입력할 수 있는 횟수를 초과했습니다.\n비멀번호 재설정 후 다시 시도해 주세요.`,
errorMaxIncorrectPin: `다시 입력할 수 있는 횟수를 초과했습니다. \n간편 비밀번호를 처음부터 설정해 주세요.`,
errorResetMaxIncorrectPin: `다시 입력할 수 있는 횟수를 초과했습니다. \n신규 비밀번호를 처음부터 설정해 주세요.`,
errorDifferentInputPin: `{{cnt}}회 틀렸습니다. ({{cnt}}/5)\n5회 이상 틀리면 정보가 초기화됩니다.`,
errorDifferentPin: `먼저 입력한 비밀번호와 다릅니다. \n다시 확인해 주세요.({{cnt}}/5)`,
errorCheckBio: `생체 정보를 확인할 수 없습니다. \n처음부터 다시 시도해 주세요.`,
};

View File

@@ -0,0 +1,28 @@
export const text = {
alreadyRegistered: '이미 가입하셨나요?',
startConvenientSpending: '전자지갑으로\n편리한 소비를 시작해 보세요.',
searchPlaceholder: '사용처, 사람 이름으로 검색해 보세요.',
recentYearTransactionsOnly: '최근 1년 간의 거래 기록만 조회할 수 있습니다.',
transactionInfo: '이용 내역 반영까지 최대 5분이 소용될 수 있습니다.',
enterAmount: '{{pageLabel}}할 금액을 입력해 주세요.',
enterWalletNumberForBankRecommendation: '지갑 번호를 입력하시면 은행을 추천해 드려요.',
howCanWeHelp: '무엇을 도와드릴까요?',
fmTokenCopied: 'FCM 토큰이 복사되었습니다.',
unableToResolveIssue: '문제를 해결하지 못하셨나요?',
whereToSend: '어디로 보낼까요?',
linkedAccountChangeConfirmation: '연동 꼐좌 정보를 변경하시겠습니까?',
walletAddressCopied: '지갑 주소가 복사되었습니다.',
accountNumberCopied: '계좌번호가 복사되었습니다.',
walletCreationRequired: '지갑 생성 후\n메뉴를 사용할 수 있습니다.\n\n지갑을 만들고 다시 시도해 주세요.',
hideBalanceDescription: '설정 시, 앱 화면에서 잔액이 숨겨집니다.',
tokenAndPaymentDescription: '결제, 송금 등 토큰 이용 시 앱 푸시 알림을 받습니다.',
activityNewsDescription: '공지사항, 1:1 문의 답변 등 앱 내 활동/소식 관련 앱 푸시 알림을 받습니다.',
usefulServiceNotifications:
'서비스 이용에 유용한 알림을 앱 푸시로 받아보세요.\n받고 싶지 않은 알림은 언제든 끌 수 있어요.',
securityNotifications: '보안 관련 앱 푸시 알림을 받습니다.',
essentialServiceInfoPushNotification:
'서비스 이용에 필수적인 정보에 대한 알림은 설정과 관계없이 앱 푸시 알림이 발송됩니다.',
largeFontWalletAndTransfer: '지갑조회, 이체화면 등의 글자를 크게 볼 수 있습니다.',
tokenOverviewMessage:
'가지고 있는 모든 토큰을 확인할 수 있어요.\nㆍ 예금 토큰: 예금 기반의 토큰\nㆍ 이머니토큰: 예금 토큰 기반의 토큰',
};

View File

@@ -0,0 +1,62 @@
export const validation = {
authenticationComplete: '본인 인증이 완료되었습니다.',
authenticationFail: '본인 인증이 실패하였습니다.',
verificationCodeSent: '인증번호가 발송되었습니다.',
authenticationMismatch: '본인인증 요청 정보와 \n기존 회원정보가 불일치 합니다.',
verificationCodeReset: '인증번호가 재요청 되었습니다.',
timeExceeded: '시간이 초과되었어요. 재요청 버튼을 눌러주세요.',
enterNamePrompt: '이름을 입력해 주세요.',
enterAtLeastTwoCharacters: '이름을 구 글자 이상 입력해 주세요.',
enterKorean: '한글을 입력해 주세요',
enterUpTo20Characters: '최대 20자까지 입력해 주세요.',
enterBirthdate: '생년월일을 입력해 주세요.',
enterBirthdateIn8Digits: '생년월일을 8자리로 입력ㄱ해 주세요.',
enterBirthdateInCorrectFormat: '생년월일 형식에 맞게 입력해 주세요.',
enterDateAfter1900: '1900-01-01 이후 날짜로 입력해 주세요.',
enterDateBeforeToday: '오늘 이전 날짜로 입력해 주세요.',
enterPhoneNumber: '휴대폰 번호를 입력해 주세요.',
invalidPhoneNumberFormat: '올바르지 않은 휴대폰 형식입니다.',
didNotReceiveVerificationText: '인증 문자를 받지 못하셨나요?',
invalidVerificationCode: '올바르지 않은 인증번호입니다. 다시 시도해 주세요.',
numbersOnlyAllowed: '숫자만 입력 가능합니다.',
enterSixDigits: '인증번호 6자리를 입력해 주세요.',
enterVerificationCode: '인증번호를 입력해 주세요.',
enter6DigitVerificationCode: '인증번호 6자리 입력',
enterResidentNumber: '주민등록번호를 입력해 주세요.',
enterResidentNumberIn7Digit: '주민등록번호 7자리를 입력해 주세요.',
enterResidentNumberInCorrectFormat: '주민등록번호 형식에 맞게 입력해 주세요.',
alreadyRegisteredUser: '이미 가입된 사용자 정보입니다.\n간편 비밀번호를 재설정 하는 화면으로\n이동하시겠습니까?',
noRegisteredInformation: '가입된 정보가 ㅇ벗습니다.\n회원가입을 진행하시겠습니까?',
enterShopNumberDirectly: '사용처 번호를\n직접 입력해 주세요.',
enterInquiryDetails: '문의 내용을 입력해주세요.',
chooseCategory: '카테고리를 선택해 주세요.',
deleteInquiryConfirmation: '작성하신\n1:1 문의를 삭제하시겠습니까?',
onlyNumbersAllowed: '숫자만 입력 가능합니다.',
enterNumber: '번호를 입력해 주세요.',
logoutConfirmation: '로그아웃 하시겠습니까?\n로그아웃 후\n인증을 통해 다시 로그인 할 수 있습니다.',
noPostAvailable: '등록된 게시물이 없습니다.',
noRemittanceHistory: '송금 내역이 없습니다.',
noHistoryAvailable: '이용내역이 없습니다.',
noInquiries: '등록하신 1:1 문의가 없습니다.',
noNoticesAvailable: '등록된 공지사항이 없습니다.',
noVouchersAvailable: '보유하고 계신 바우처가 없습니다.',
verificationTimeExpired: '인증 시간이 만료되었습니다.',
authInfoResetWarning: '지금 페이지를 벗어나시면 인증된 계좌정보가 초기화 됩니다.',
returnToBeginning: '처음으로 돌아가시겠습니까?',
accountInfoResetWarning: '지금 페이지를 벗어나시면 인증된 계좌정보가 초기화 됩니다.',
invalidAuthInfo: '인증정보가 올바르지 않스빈다.\n다시 시도해 주세요.',
usingLatestVersion: '현재 최신 버전을 사용 중입니다.',
newVersionAvailable: '새로운 버전이 사용 가능합니다.',
blockedWalletMessage:
'현재 일부 거래가 제한된 상태입니다.\n관련 문의 사항을 1:1 문의 또는\n고객센터를 이용해 주세요.',
accountInfoCheckError:
'계좌 정보를 확인할 수 없습니다.\n잘못된 정보로 5회 이상 실패 시\n하루동안 인증이 제한될 수 있습니다.',
accountAuthAttemptExceeded:
'계좌 인증 확인 횟수를 초과하였습니다.\n내일 다시 시도해 주세요.\n\n지속적으로 오류가 발생하거나\n추가 문의 사항이 있으시면 1:1문의 또는 고객센터를 이용해 주세요.',
accountInfoInvalid: '계좌 정보를 확인할 수 없습니다.\n입력하신 정보를\n다시 한 번 확인해 주세요.',
walletDeletionConfirmation: '지갑을 삭제하시겠습니까?\n지갑을 삭제 후에도\n인증을 통해 다시 만들 수 있습니다.',
temporaryErrorOccurred: '일시적인 오류가 발생하였습니다.',
tryAgainLater: '잠시 후 다시 시도해주세요.',
networkConnectionError: '현재 네트워크 연결이 원활하지 않습니다.\n데이터 또는 Wi-Fi 연결 상태를\n확인해 주세요.',
inaccessiblePage: '접근할 수 없는 페이지입니다.',
};

View File

@@ -0,0 +1,28 @@
export enum NativeFunction {
ExitApp = 'exitApp',
Biometrics = 'biometrics',
PaymentQRScan = 'PaymentQRScan',
WalletQRScan = 'WalletQRScan',
IDScan = 'IDScan',
PassportScan = 'PassportScan',
BusinessLicenseScan = 'BusinessLicenseScan',
SetStorage = 'setStorage',
GetStorage = 'getStorage',
ClearStorage = 'clearStorage',
BeginNfcReaderMode = 'beginNfcReaderMode',
EndNfcReaderMode = 'endNfcReaderMode',
TransmitNFCBytes = 'transmitNFCBytes',
SetAppColor = 'setAppColor',
CopyToClipboard = 'copyToClipboard',
OpenAppSetting = 'openAppSetting',
OpenSecuritySetting = 'openSecuritySetting',
OpenWebview = 'openWebview',
GoBack = 'goBack',
GetNotificationToken = 'getNotificationToken',
CanGoBack = 'canGoBack',
PhoneCall = 'phoneCall',
LocationPermission = 'locationPermission',
CheckLocationPermission = 'checkLocationPermission',
RootNavigation = 'rootNavigation',
RequestNotification = 'requestNotification',
}

View File

@@ -0,0 +1,4 @@
export enum NativeMessage {
HardwareBackPress = 'hardwareBackPress',
WebViewNavigate = 'webViewNavigate',
}

View File

@@ -0,0 +1,229 @@
import { ROUTE_NAMES, RouteNamesType } from '@/shared/constants/route-names';
export type PathType = RouteNamesType[keyof RouteNamesType];
const generatePath = (base: string, path?: PathType): string => {
base = base.replace(/\/\*/g, '');
if (typeof path === 'string') {
path = path?.replace(/:.*/, '');
}
let rs = path ? `${base}/${path as string}` : base;
return rs;
};
export const PATHS: RouteNamesType = {
home: generatePath(ROUTE_NAMES.home),
transaction: {
base: generatePath(ROUTE_NAMES.transaction.base),
allTransaction: {
base: generatePath(`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.allTransaction.base}`),
list: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.allTransaction.base}`,
ROUTE_NAMES.transaction.allTransaction.list,
),
detail: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.allTransaction.base}`,
ROUTE_NAMES.transaction.allTransaction.detail,
),
cancel: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.allTransaction.base}`,
ROUTE_NAMES.transaction.allTransaction.cancel,
),
},
cashReceit: {
base: generatePath(`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.cashReceit.base}`),
list: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.cashReceit.base}`,
ROUTE_NAMES.transaction.cashReceit.list,
),
detail: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.cashReceit.base}`,
ROUTE_NAMES.transaction.cashReceit.detail,
),
handWrittenIssuance: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.cashReceit.base}`,
ROUTE_NAMES.transaction.cashReceit.handWrittenIssuance,
),
},
escro: {
base: generatePath(`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.escro.base}`),
list: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.escro.base}`,
ROUTE_NAMES.transaction.escro.list,
),
detail: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.escro.base}`,
ROUTE_NAMES.transaction.escro.detail,
),
},
billing: {
base: generatePath(`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.billing.base}`),
list: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.billing.base}`,
ROUTE_NAMES.transaction.billing.list,
),
detail: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.billing.base}`,
ROUTE_NAMES.transaction.billing.detail,
),
paymentRequest: generatePath(
`${ROUTE_NAMES.transaction.base}${ROUTE_NAMES.transaction.billing.base}`,
ROUTE_NAMES.transaction.billing.paymentRequest,
),
}
},
settlement: {
base: generatePath(ROUTE_NAMES.settlement.base),
calendar: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.calendar),
list: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.list),
detail: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.detail),
},
businessMember: {
base: generatePath(ROUTE_NAMES.businessMember.base),
info: generatePath(ROUTE_NAMES.businessMember.base, ROUTE_NAMES.businessMember.info),
registrationStatus: generatePath(ROUTE_NAMES.businessMember.base, ROUTE_NAMES.businessMember.registrationStatus),
},
payment: {
base: generatePath(ROUTE_NAMES.payment.base),
info: generatePath(ROUTE_NAMES.payment.base, ROUTE_NAMES.payment.info),
dataNotification: generatePath(ROUTE_NAMES.payment.base, ROUTE_NAMES.payment.dataNotification),
},
account: {
base: generatePath(ROUTE_NAMES.account.base),
user: {
base: generatePath(`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`),
manage: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`,
ROUTE_NAMES.account.user.manage,
),
loginAuthInfo: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`,
ROUTE_NAMES.account.user.loginAuthInfo,
),
accountAuth: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`,
ROUTE_NAMES.account.user.accountAuth,
),
menuAuth: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`,
ROUTE_NAMES.account.user.menuAuth,
),
addAccount: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.user.base}`,
ROUTE_NAMES.account.user.addAccount,
),
},
password: {
base: generatePath(`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.password.base}`),
manage: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.password.base}`,
ROUTE_NAMES.account.password.manage,
),
modifyLoginPassword: generatePath(
`${ROUTE_NAMES.account.base}${ROUTE_NAMES.account.password.base}`,
ROUTE_NAMES.account.password.modifyLoginPassword,
),
}
},
tax: {
base: generatePath(ROUTE_NAMES.tax.base),
invoice: {
base: generatePath(`${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`),
list: generatePath(
`${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`,
ROUTE_NAMES.tax.invoice.list,
),
detail: generatePath(
`${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`,
ROUTE_NAMES.tax.invoice.detail,
),
},
vatReference: generatePath(ROUTE_NAMES.tax.base, ROUTE_NAMES.tax.vatReference),
},
additionalService: {
base: generatePath(ROUTE_NAMES.additionalService.base),
intro: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.intro),
arsCardPayment: {
base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.arsCardPayment.base}`),
list: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.arsCardPayment.base}`,
ROUTE_NAMES.additionalService.arsCardPayment.list,
),
request: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.arsCardPayment.base}`,
ROUTE_NAMES.additionalService.arsCardPayment.request,
),
requestSuccess: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.arsCardPayment.base}`,
ROUTE_NAMES.additionalService.arsCardPayment.requestSuccess,
),
},
keyInPayment: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.keyInPayment),
smsPaymentNotification: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.smsPaymentNotification),
accountHolderSearch: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.accountHolderSearch),
accountHolderAuth: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.accountHolderAuth),
linkPayment: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.linkPayment),
kakaoPaymentNotification: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.kakaoPaymentNotification),
fundTransfer: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.fundTransfer),
settlementAgency: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.settlementAgency),
paymentAgency: generatePath(ROUTE_NAMES.additionalService.base, ROUTE_NAMES.additionalService.paymentAgency),
},
support: {
base: generatePath(ROUTE_NAMES.support.base),
notice: {
base: generatePath(`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.notice.base}`),
list: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.notice.base}`,
ROUTE_NAMES.support.notice.list,
),
detail: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.notice.base}`,
ROUTE_NAMES.support.notice.detail,
),
},
faq: {
base: generatePath(`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.faq.base}`),
list: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.faq.base}`,
ROUTE_NAMES.support.notice.list,
),
detail: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.faq.base}`,
ROUTE_NAMES.support.faq.detail,
),
},
qna: {
base: generatePath(`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.qna.base}`),
list: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.qna.base}`,
ROUTE_NAMES.support.qna.list,
),
detail: generatePath(
`${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.qna.base}`,
ROUTE_NAMES.support.qna.detail,
),
},
},
setting: generatePath(ROUTE_NAMES.setting),
alarm: {
base: generatePath(ROUTE_NAMES.alarm.base),
list: generatePath(ROUTE_NAMES.alarm.base, ROUTE_NAMES.alarm.list),
},
};
export const BACK_BLOCKED_PATHS = {
/*
[PATHS.home]: [
PATHS.intro,
PATHS.start,
PATHS.appAuth,
PATHS.mobileVerification,
PATHS.signUp.bioPinNumber,
PATHS.signUp.inputPinNumber,
PATHS.signUp.setPinNumber,
PATHS.signUp.reSetBiometricAuth,
PATHS.signUp.setBiometricAuth,
],
*/
//[PATHS.appAuth]: [PATHS.intro],
};

View File

@@ -0,0 +1,198 @@
export const ROUTE_NAMES = {
home: '/home',
transaction: {
base: '/transaction/*',
allTransaction: {
base: '/all-transaction/*',
list: 'list',
detail: 'detail/:tid',
cancel: 'cancel',
},
cashReceit: {
base: '/cash-receit/*',
list: 'list',
detail: 'detail/:tid',
handWrittenIssuance: 'hand-written-issuance',
},
escro: {
base: '/escro/*',
list: 'list',
detail: 'detail/:tid',
},
billing: {
base: '/billing/*',
list: 'list',
detail: 'detail/:tid',
paymentRequest: 'payment-request',
}
},
settlement: {
base: '/settlement/*',
calendar: 'calendar',
list: 'list',
detail: 'detail/:tid',
},
businessMember: {
base: '/business-member/*',
info: 'info',
registrationStatus: 'registration-status'
},
payment: {
base: '/payment/*',
info: 'info',
dataNotification: 'data-notification'
},
account: {
base: '/account/*',
user: {
base: '/user/*',
manage: 'manage',
loginAuthInfo: 'login-auth-info',
accountAuth: 'account-auth',
menuAuth: 'menu-auth',
addAccount: 'add-account',
},
password: {
base: '/password/*',
manage: 'manage',
modifyLoginPassword: 'modifyLoginPassword'
}
},
tax: {
base: '/tax/*',
invoice: {
base: '/invoice/*',
list: 'list',
detail: 'detail',
},
vatReference: 'vatReference'
},
additionalService: {
base: '/additional-service/*',
intro: 'intro',
arsCardPayment: {
base: '/ars-card-payment/*',
list: 'list',
request: 'request',
requestSuccess: 'request-success',
},
keyInPayment: 'key-in-payment',
smsPaymentNotification: 'sms-payment-notification',
accountHolderSearch: 'account-holder-search',
accountHolderAuth: 'account-holder-auth',
linkPayment: 'link-payment',
kakaoPaymentNotification: 'kakao-payment-notification',
fundTransfer: 'fund-transfer',
settlementAgency: 'settlement-agency',
paymentAgency: 'payment-agency',
},
support: {
base: '/support/*',
notice: {
base: '/notice/*',
list: 'list',
detail: 'detail/:noticeId',
},
faq: {
base: '/faq/*',
list: 'list',
detail: 'detail/:faqId',
},
qna: {
base: '/qna/*',
list: 'list',
detail: 'detail/:qnaId',
}
},
setting: '/setting',
alarm: {
base: '/alarm/*',
list: 'list',
},
/*
intro: '/intro',
appAuth: '/appAuth',
start: '/start',
mobileVerification: '/mobileVerification',
pwFail: '/pwFail',
signUp: {
base: '/signUp/*',
termsAndConditions: 'termsAndConditions',
setPinNumber: 'setPinNumber',
reSetBiometricAuth: 'reSetBiometricAuth',
setBiometricAuth: 'setBiometricAuth',
reSetPinNumber: 'reSetPinNumber',
bioPinNumber: 'bioPinNumber',
inputPinNumber: 'inputPinNumber',
},
issueWallet: {
base: '/issueWallet/*',
intro: 'intro',
inputBankAccount: 'inputBankAccount',
authBankAccount: 'authBankAccount',
chooseIDCardType: 'chooseIDCardType',
captureBusinessLicense: 'captureBusinessLicense',
confirm: {
base: '/confirm/*',
IDCard: 'IDCard',
driverLicense: 'driverLicense',
passport: 'passport',
businessLicense: 'businessLicense',
},
},
myWallet: {
base: '/myWallet/*',
history: 'history',
historyDetail: 'history/:historyId',
refundQRCode: 'refundQRCode/:historyId',
tokenDetail: 'token/:tokenId',
},
exchange: {
base: '/exchange/*',
selectRecipient: 'selectRecipient',
inputRecipient: 'inputRecipient',
inputAmount: 'inputAmount',
inputConfirm: 'inputConfirm',
process: 'process',
complete: 'complete',
},
myBankAccount: '/myBankAccount',
security: '/security',
appVersion: '/appVersion',
settingFontSize: '/settingFontSize',
community: {
base: '/community/*',
faq: 'faq',
faqDetail: 'faqDetail',
notice: 'notice',
noticeDetail: 'noticeDetail',
inquiry: 'inquiry',
inquiryDetail: 'inquiryDetail',
inquiryModify: 'inquiryModify',
},
menu: '/menu',
login: '/login',
reLogin: '/reLogin',
home: '/home',
shopList: '/shopList',
notification: {
base: '/notification/*',
setting: 'setting',
},
payment: {
base: '/payment/*',
myPaymentQRCode: 'myPaymentQRCode',
payWithNFCManual: 'payWithNFCManual',
payWithNFCAuto: 'payWithNFCAuto',
},
voucher: {
base: '/voucher/*',
voucherDetail: ':voucherId',
},
paymentGuide: 'paymentGuide',
inputShopWalletAddr: 'inputShopWalletAddr',
*/
};
export type RouteNamesType = typeof ROUTE_NAMES;

View File

@@ -0,0 +1,20 @@
const { origin } = window.location;
export const CURRENT_URL = `${origin}`;
const getAPIBaseUrl = () => {
return CURRENT_URL;
};
const getHeaderUserAgent = () => {
let os = 'Android';
let deviceType = 'Galaxy Flip 6';
let deviceID = 'uuid';
let appVersion = '1.0.0';
let browserInformation = 'Chrome135';
return `${os} ${deviceType} ${deviceID} ${appVersion} ${browserInformation}`;
};
export const API_BASE_URL = getAPIBaseUrl();
export const API_URL_KEY = 'nmsa';
export const HEADER_USER_AGENT = getHeaderUserAgent();
export const API_PARAM = {};