알림함 카테고리 셋팅

This commit is contained in:
focp212@naver.com
2025-10-27 11:30:02 +09:00
parent 9eba765957
commit 9be67b403e
12 changed files with 242 additions and 130 deletions

View File

@@ -93,6 +93,7 @@
"swiper": "^11.2.10", "swiper": "^11.2.10",
"ts-loader": "^9.5.4", "ts-loader": "^9.5.4",
"tsconfig-paths-webpack-plugin": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.2.0",
"ua-parser-js": "^2.0.6",
"use-local-storage-state": "^19.5.0", "use-local-storage-state": "^19.5.0",
"vite-plugin-checker": "^0.10.3", "vite-plugin-checker": "^0.10.3",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",

28
pnpm-lock.yaml generated
View File

@@ -254,6 +254,9 @@ importers:
tsconfig-paths-webpack-plugin: tsconfig-paths-webpack-plugin:
specifier: ^4.2.0 specifier: ^4.2.0
version: 4.2.0 version: 4.2.0
ua-parser-js:
specifier: ^2.0.6
version: 2.0.6
use-local-storage-state: use-local-storage-state:
specifier: ^19.5.0 specifier: ^19.5.0
version: 19.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) version: 19.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
@@ -3115,6 +3118,9 @@ packages:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
detect-europe-js@0.1.2:
resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==}
detect-libc@1.0.3: detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
@@ -3898,6 +3904,9 @@ packages:
resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
is-standalone-pwa@0.1.1:
resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==}
is-string@1.1.1: is-string@1.1.1:
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -5801,10 +5810,17 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
ua-is-frozen@0.1.2:
resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==}
ua-parser-js@1.0.41: ua-parser-js@1.0.41:
resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==}
hasBin: true hasBin: true
ua-parser-js@2.0.6:
resolution: {integrity: sha512-EmaxXfltJaDW75SokrY4/lXMrVyXomE/0FpIIqP2Ctic93gK7rlme55Cwkz8l3YZ6gqf94fCU7AnIkidd/KXPg==}
hasBin: true
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -9363,6 +9379,8 @@ snapshots:
destroy@1.2.0: {} destroy@1.2.0: {}
detect-europe-js@0.1.2: {}
detect-libc@1.0.3: detect-libc@1.0.3:
optional: true optional: true
@@ -10292,6 +10310,8 @@ snapshots:
dependencies: dependencies:
call-bound: 1.0.4 call-bound: 1.0.4
is-standalone-pwa@0.1.1: {}
is-string@1.1.1: is-string@1.1.1:
dependencies: dependencies:
call-bound: 1.0.4 call-bound: 1.0.4
@@ -12425,8 +12445,16 @@ snapshots:
typescript@5.9.2: {} typescript@5.9.2: {}
ua-is-frozen@0.1.2: {}
ua-parser-js@1.0.41: {} ua-parser-js@1.0.41: {}
ua-parser-js@2.0.6:
dependencies:
detect-europe-js: 0.1.2
is-standalone-pwa: 0.1.1
ua-is-frozen: 0.1.2
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
dependencies: dependencies:
call-bound: 1.0.4 call-bound: 1.0.4

View File

@@ -4,6 +4,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import moment from 'moment'; import moment from 'moment';
export interface AlarmItemProps { export interface AlarmItemProps {
appNotificationSequence?: number;
appNotificationCategory?: string; appNotificationCategory?: string;
notificationReceivedDate?: string; notificationReceivedDate?: string;
appNotificationTitle?: string; appNotificationTitle?: string;
@@ -12,6 +13,7 @@ export interface AlarmItemProps {
}; };
export const AlarmItem = ({ export const AlarmItem = ({
appNotificationSequence,
appNotificationCategory, appNotificationCategory,
notificationReceivedDate, notificationReceivedDate,
appNotificationTitle, appNotificationTitle,
@@ -19,9 +21,10 @@ export const AlarmItem = ({
appNotificationLink appNotificationLink
}: AlarmItemProps) => { }: AlarmItemProps) => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const onClickToNavigate = (alarmId: number) => {
let path = PATHS.support.notice.detail + alarmId; const onClickToNavigate = () => {
navigate(path); let path = PATHS.support.notice.detail + appNotificationSequence;
// navigate(path);
}; };
return ( return (
@@ -35,7 +38,7 @@ export const AlarmItem = ({
</div> </div>
<div <div
className="notice-arrow" className="notice-arrow"
onClick={ () => onClickToNavigate(4) } onClick={ () => onClickToNavigate() }
> >
<img <img
src={ IMAGE_ROOT + '/Forward.svg' } src={ IMAGE_ROOT + '/Forward.svg' }

View File

@@ -11,11 +11,11 @@ import { useStore } from '@/shared/model/store';
import { DefaultRequestPagination } from '@/entities/common/model/types'; import { DefaultRequestPagination } from '@/entities/common/model/types';
export interface AlarmListProps { export interface AlarmListProps {
category: string; appNotificationCategory: string;
}; };
export const AlarmList = ({ export const AlarmList = ({
category appNotificationCategory
}: AlarmListProps) => { }: AlarmListProps) => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -24,28 +24,10 @@ export const AlarmList = ({
const [onActionIntersect, setOnActionIntersect] = useState<boolean>(false); const [onActionIntersect, setOnActionIntersect] = useState<boolean>(false);
const [pageParam, setPageParam] = useState<DefaultRequestPagination>(DEFAULT_PAGE_PARAM); const [pageParam, setPageParam] = useState<DefaultRequestPagination>(DEFAULT_PAGE_PARAM);
const [appCl, setAppCl] = useState<MERCHANT_ADMIN_APP>(MERCHANT_ADMIN_APP.MERCHANT_ADMIN_APP) const [appCl, setAppCl] = useState<MERCHANT_ADMIN_APP>(MERCHANT_ADMIN_APP.MERCHANT_ADMIN_APP)
const [appNotificationCategory, setAppNotificationCategory] = useState<string>('');
const [resultList, setResultList] = useState<Array<AlarmListContent>>([]); const [resultList, setResultList] = useState<Array<AlarmListContent>>([]);
const [selectedCategory, setSelectedCategory] = useState<string>('');
const { mutateAsync: appAlarmList } = useAppAlarmListMutation(); const { mutateAsync: appAlarmList } = useAppAlarmListMutation();
const getAlarmItems = () => {
let rs = [];
for(let i=0;i<resultList.length;i++){
rs.push(
<AlarmItem
appNotificationCategory={ resultList[i]?.appNotificationCategory }
notificationReceivedDate={ resultList[i]?.notificationReceivedDate }
appNotificationTitle={ resultList[i]?.appNotificationTitle }
appNotificationContent={ resultList[i]?.appNotificationContent }
appNotificationLink={ resultList[i]?.appNotificationLink }
></AlarmItem>
)
}
return rs;
};
const onIntersect: IntersectionObserverCallback = (entries: Array<IntersectionObserverEntry>) => { const onIntersect: IntersectionObserverCallback = (entries: Array<IntersectionObserverEntry>) => {
entries.forEach((entry: IntersectionObserverEntry) => { entries.forEach((entry: IntersectionObserverEntry) => {
if(entry.isIntersecting){ if(entry.isIntersecting){
@@ -73,7 +55,7 @@ export const AlarmList = ({
appCl: appCl, appCl: appCl,
appNotificationCategory: appNotificationCategory, appNotificationCategory: appNotificationCategory,
page: pageParam page: pageParam
} };
if(type !== 'page' && params.page){ if(type !== 'page' && params.page){
params.page.cursor = null; params.page.cursor = null;
@@ -115,11 +97,27 @@ export const AlarmList = ({
} }
}; };
const getAlarmItems = () => {
let rs = [];
for(let i=0;i<resultList.length;i++){
rs.push(
<AlarmItem
appNotificationSequence={ resultList[i]?.appNotificationSequence }
appNotificationCategory={ resultList[i]?.appNotificationCategory }
notificationReceivedDate={ resultList[i]?.notificationReceivedDate }
appNotificationTitle={ resultList[i]?.appNotificationTitle }
appNotificationContent={ resultList[i]?.appNotificationContent }
appNotificationLink={ resultList[i]?.appNotificationLink }
></AlarmItem>
);
}
return rs;
};
useEffect(() => { useEffect(() => {
callList(); callList();
}, [selectedCategory]); }, [appNotificationCategory]);
return ( return (
<> <>
<div className="notice-box sub"> <div className="notice-box sub">

View File

@@ -16,6 +16,8 @@ export interface CommonState {
setBankList: (update: SetStateAction<Array<any>>) => void; setBankList: (update: SetStateAction<Array<any>>) => void;
virtualBankList: Array<any>; virtualBankList: Array<any>;
setVirtualBankList: (update: SetStateAction<Array<any>>) => void; setVirtualBankList: (update: SetStateAction<Array<any>>) => void;
appNotificationCategories: Array<any>;
setAppNotificationCategories: (update: SetStateAction<Array<any>>) => void;
}; };
const initialBannerInfoState = { const initialBannerInfoState = {
@@ -24,6 +26,10 @@ const initialBannerInfoState = {
const initialCommonState = { const initialCommonState = {
serviceCodes: [] as Array<any>, serviceCodes: [] as Array<any>,
creditCardList: [] as Array<any>,
bankList: [] as Array<any>,
virtualBankList: [] as Array<any>,
appNotificationCategories: [] as Array<any>
} as CommonState; } as CommonState;
export const createBannerInfoStore = lens<BannerInfoState>((set, get) => ({ export const createBannerInfoStore = lens<BannerInfoState>((set, get) => ({
@@ -94,4 +100,16 @@ export const createCommonStore = lens<CommonState>((set, get) => ({
}; };
}); });
}, },
setAppNotificationCategories: (update) => {
set((state: CommonState) => {
const newAppNotificationCategories = (typeof update === 'function')
? update(state.appNotificationCategories): update;
return {
...state,
appNotificationCategories: [
...newAppNotificationCategories
]
};
});
},
})); }));

View File

@@ -12,6 +12,7 @@ import {
} from '@tanstack/react-query'; } from '@tanstack/react-query';
export const allTransactionList = (params: AllTransactionListParams) => { export const allTransactionList = (params: AllTransactionListParams) => {
//axios.AxiosHeaders[]
return resultify( return resultify(
axios.post<AllTransactionListResponse>(API_URL_TRANSACTION.allTransactionList(), params), axios.post<AllTransactionListResponse>(API_URL_TRANSACTION.allTransactionList(), params),
); );

View File

@@ -4,6 +4,7 @@ import { NumericFormat } from 'react-number-format';
import { AllTransactionCancelSectionPasswordGroup } from './section/all-transaction-cancel-section-password-group'; import { AllTransactionCancelSectionPasswordGroup } from './section/all-transaction-cancel-section-password-group';
import { AllTransactionCancelSectionBankGroup } from './section/all-transaction-cancel-section-bank-group'; import { AllTransactionCancelSectionBankGroup } from './section/all-transaction-cancel-section-bank-group';
import { BankCode } from '@/shared/@types/banking-code'; import { BankCode } from '@/shared/@types/banking-code';
import { ChangeEvent, useEffect, useState } from 'react';
export interface AllTransactionPartCancelProps extends AllTransactionCancelInfoResponse { export interface AllTransactionPartCancelProps extends AllTransactionCancelInfoResponse {
serviceCode: string; serviceCode: string;
@@ -15,6 +16,14 @@ export interface AllTransactionPartCancelProps extends AllTransactionCancelInfoR
setAccountNo?: (accountNo: string) => void; setAccountNo?: (accountNo: string) => void;
accountHolder?: string; accountHolder?: string;
setAccountHolder?: (accountHolder: string) => void; setAccountHolder?: (accountHolder: string) => void;
cancelSupplyAmount: number;
setCancelSupplyAmount: (cancelSupplyAmount: number) => void;
cancelGoodsVat: number;
setCancelGoodsVat: (cancelGoodsVat: number) => void;
cancelTaxFreeAmount: number;
setCancelTaxFreeAmount: (cancelTaxFreeAmount: number) => void;
cancelServiceAmount: number;
setCancelServiceAmount: (cancelServiceAmount: number) => void;
}; };
export const AllTransactionPartCancel = ({ export const AllTransactionPartCancel = ({
@@ -40,99 +49,115 @@ export const AllTransactionPartCancel = ({
accountNo, accountNo,
setAccountNo, setAccountNo,
accountHolder, accountHolder,
setAccountHolder setAccountHolder,
cancelSupplyAmount,
setCancelSupplyAmount,
cancelGoodsVat,
setCancelGoodsVat,
cancelTaxFreeAmount,
setCancelTaxFreeAmount,
cancelServiceAmount,
setCancelServiceAmount
}: AllTransactionPartCancelProps) => { }: AllTransactionPartCancelProps) => {
return ( return (
<> <>
{ !!isCompoundTax && { !!isCompoundTax &&
<div className="tb_both"> <div className="tb_both">
<table className="partial-cancel-table"> <table className="partial-cancel-table">
<colgroup> <colgroup>
<col width="30%" /> <col width="30%" />
<col width="30%" /> <col width="30%" />
<col width="40%" /> <col width="40%" />
</colgroup> </colgroup>
<thead> <thead>
<tr>
<th className="header-empty"></th>
<th className="header-balance"></th>
<th className="header-cancel"></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label"></td>
<td className="row-balance">
<NumericFormat
value={ supplyAmount }
thousandSeparator
displayType="text"
></NumericFormat>
</td>
<td className="row-cancel">
<input
className="cancel-input"
type="text"
value=""
/>
</td>
</tr>
<tr> <tr>
<td className="row-label"></td> <th className="header-empty"></th>
<th className="header-balance"></th>
<th className="header-cancel"></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label"></td>
<td className="row-balance"> <td className="row-balance">
<NumericFormat <NumericFormat
value={ goodsVat } value={ supplyAmount }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
</td> </td>
<td className="row-cancel"> <td className="row-cancel">
<input
className="cancel-input"
type="text"
placeholder=""
/>
</td>
</tr>
<tr>
<td className="row-label"></td>
<td className="row-balance">
<NumericFormat <NumericFormat
value={ taxFreeAmount } className="cancel-input"
thousandSeparator value={ cancelSupplyAmount }
displayType="text" allowNegative={ false }
displayType="input"
onChange={(e: ChangeEvent<HTMLInputElement>) => setCancelServiceAmount(parseInt(e.target.value)) }
></NumericFormat> ></NumericFormat>
</td> </td>
<td className="row-cancel">
<input
className="cancel-input"
type="text"
placeholder=""
/>
</td>
</tr> </tr>
<tr> <tr>
<td className="row-label"></td> <td className="row-label"></td>
<td className="row-balance"> <td className="row-balance">
<NumericFormat <NumericFormat
value={ serviceAmount } value={ goodsVat }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
</td> </td>
<td className="row-cancel"> <td className="row-cancel">
<input <NumericFormat
className="cancel-input" className="cancel-input"
type="text" value={ cancelGoodsVat }
placeholder="" allowNegative={ false }
/> displayType="input"
</td> onChange={(e: ChangeEvent<HTMLInputElement>) => setCancelGoodsVat(parseInt(e.target.value)) }
</tr> ></NumericFormat>
</tbody> </td>
</table> </tr>
</div> <tr>
<td className="row-label"></td>
<td className="row-balance">
<NumericFormat
value={ taxFreeAmount }
thousandSeparator
displayType="text"
></NumericFormat>
</td>
<td className="row-cancel">
<NumericFormat
className="cancel-input"
value={ cancelTaxFreeAmount }
allowNegative={ false }
displayType="input"
onChange={(e: ChangeEvent<HTMLInputElement>) => setCancelTaxFreeAmount(parseInt(e.target.value)) }
></NumericFormat>
</td>
</tr>
<tr>
<td className="row-label"></td>
<td className="row-balance">
<NumericFormat
value={ serviceAmount }
thousandSeparator
displayType="text"
></NumericFormat>
</td>
<td className="row-cancel">
<NumericFormat
className="cancel-input"
value={ cancelServiceAmount }
allowNegative={ false }
displayType="input"
onChange={(e: ChangeEvent<HTMLInputElement>) => setCancelServiceAmount(parseInt(e.target.value)) }
></NumericFormat>
</td>
</tr>
</tbody>
</table>
</div>
} }
<div className="form-section"> <div className="form-section">

View File

@@ -1,45 +1,56 @@
import { AlarmList } from '@/entities/alarm/ui/alarm-list'; import { AlarmList } from '@/entities/alarm/ui/alarm-list';
import { HeaderType } from '@/entities/common/model/types'; import { HeaderType } from '@/entities/common/model/types';
import { useStore } from '@/shared/model/store';
import { import {
useSetHeaderTitle, useSetHeaderTitle,
useSetHeaderType, useSetHeaderType,
useSetFooterMode useSetFooterMode
} from '@/widgets/sub-layout/use-sub-layout'; } from '@/widgets/sub-layout/use-sub-layout';
import { useState } from 'react'; import { useEffect, useState } from 'react';
export const ListPage = () => { export const ListPage = () => {
let totalAppNotificationCategories = useStore.getState().CommonStore.appNotificationCategories;
const [appNotificationCategories, setAppNotificationCategories] = useState<Array<any>>(totalAppNotificationCategories);
useSetHeaderTitle('알림함'); useSetHeaderTitle('알림함');
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false); useSetFooterMode(false);
const [category, setCategory] = useState<string>('all'); const [appNotificationCategory, setAppNotificationCategory] = useState<string>('');
let btnList = [ const resetAlarmCategories = () => {
{name: '전체', category: 'all'}, if(appNotificationCategories){
{name: '혜택/이벤트', category: 'event'}, let newAppNotificationCategories = appNotificationCategories.filter((value, index) => {
{name: '공지사항', category: 'notice'} return value.code1 !== '****' && value.code2 === '*';
]; });
setAppNotificationCategories(newAppNotificationCategories);
const onClickToCategory = (value: any) => { }
setCategory(value.category);
}; };
useEffect(() => {
resetAlarmCategories();
}, [totalAppNotificationCategories])
return ( return (
<> <>
<main className="pop"> <main className="pop">
<div className="sub-wrap"> <div className="sub-wrap">
<div className="notice-tabs"> <div className="notice-tabs">
{ <button
btnList.map((value, index) => ( className={ `tab36 ${(appNotificationCategory === '')? 'on': ''}`}
onClick={ () => setAppNotificationCategory('') }
></button>
{ !!appNotificationCategories &&
appNotificationCategories.map((value, index) => (
<button <button
className={ `tab36 ${(category === value.category)? 'on': ''}`} className={ `tab36 ${(appNotificationCategory === value.code1)? 'on': ''}`}
onClick={ () => onClickToCategory(value) } onClick={ () => setAppNotificationCategory(value.code1) }
>{ value.name }</button> >{ value.desc1 }</button>
)) ))
} }
</div> </div>
<AlarmList <AlarmList
category={ category } appNotificationCategory={ appNotificationCategory }
></AlarmList> ></AlarmList>
</div> </div>
</main> </main>

View File

@@ -50,6 +50,10 @@ export const AllTransactionCancelPage = () => {
const [vatAutoCalcSummary, setVatAutoCalcSummary] = useState<number>(0); const [vatAutoCalcSummary, setVatAutoCalcSummary] = useState<number>(0);
const [totalCancelAmount, setTotalCancelAmount] = useState<number>(0); const [totalCancelAmount, setTotalCancelAmount] = useState<number>(0);
const [cancelPassword, setCancelPassword] = useState<string>(''); const [cancelPassword, setCancelPassword] = useState<string>('');
const [cancelSupplyAmount, setCancelSupplyAmount] = useState<number>(0);
const [cancelGoodsVat, setCancelGoodsVat] = useState<number>(0);
const [cancelTaxFreeAmount, setCancelTaxFreeAmount] = useState<number>(0);
const [cancelServiceAmount, setCancelServiceAmount] = useState<number>(0);
const [bankCode, setBankCode] = useState<string>(''); const [bankCode, setBankCode] = useState<string>('');
const [accountNo, setAccountNo] = useState<string>(''); const [accountNo, setAccountNo] = useState<string>('');
@@ -105,10 +109,10 @@ export const AllTransactionCancelPage = () => {
bankCode: bankCode, bankCode: bankCode,
accountNo: accountNo, accountNo: accountNo,
accountHolder: accountHolder, accountHolder: accountHolder,
supplyAmount: supplyAmount, supplyAmount: (!!partCancelCl)? cancelSupplyAmount: supplyAmount,
goodsVatAmount: goodsVat, goodsVatAmount: (!!partCancelCl)? cancelGoodsVat: goodsVat,
taxFreeAmount: taxFreeAmount, taxFreeAmount: (!!partCancelCl)? cancelTaxFreeAmount: taxFreeAmount,
serviceAmount: serviceAmount, serviceAmount: (!!partCancelCl)? cancelServiceAmount: serviceAmount,
clientIp: userInfo.clientAddressIP, clientIp: userInfo.clientAddressIP,
partCancelCl: partCancelCl, partCancelCl: partCancelCl,
isNpg: isNpg, isNpg: isNpg,
@@ -195,7 +199,7 @@ export const AllTransactionCancelPage = () => {
setAccountHolder={ setAccountHolder } setAccountHolder={ setAccountHolder }
></AllTransactionAllCancel> ></AllTransactionAllCancel>
} }
{ partCancelCl && (tabAction === CancelTabKeys.Part) && { !!partCancelCl && (tabAction === CancelTabKeys.Part) &&
<AllTransactionPartCancel <AllTransactionPartCancel
serviceCode={ serviceCode } serviceCode={ serviceCode }
debtPreventionCancelDisplayInfo={ debtPreventionCancelDisplayInfo } debtPreventionCancelDisplayInfo={ debtPreventionCancelDisplayInfo }
@@ -220,6 +224,14 @@ export const AllTransactionCancelPage = () => {
setAccountNo={ setAccountNo } setAccountNo={ setAccountNo }
accountHolder={ accountHolder } accountHolder={ accountHolder }
setAccountHolder={ setAccountHolder } setAccountHolder={ setAccountHolder }
cancelSupplyAmount={ cancelSupplyAmount }
setCancelSupplyAmount={ setCancelSupplyAmount }
cancelGoodsVat={ cancelGoodsVat }
setCancelGoodsVat={ setCancelGoodsVat }
cancelTaxFreeAmount={ cancelTaxFreeAmount}
setCancelTaxFreeAmount={ setCancelTaxFreeAmount }
cancelServiceAmount={ cancelServiceAmount }
setCancelServiceAmount={ setCancelServiceAmount }
></AllTransactionPartCancel> ></AllTransactionPartCancel>
} }
</div> </div>

View File

@@ -1,3 +1,5 @@
import { UAParser } from 'ua-parser-js';
const { origin } = window.location; const { origin } = window.location;
export const CURRENT_URL = `${origin}`; export const CURRENT_URL = `${origin}`;
@@ -17,13 +19,20 @@ const getAPIAuthBaseUrl = () => {
} }
return rs; return rs;
} }
const getHeaderUserAgent = () => { const getHeaderUserAgent = (options?: {
let os = 'Android'; menuId?: number,
let deviceType = 'Galaxy Flip 6'; apiType?: string
}) => {
let parser = new UAParser();
let result = parser.getResult();
let os = result.os.name;
let deviceType = result.device.type;
let deviceID = 'uuid'; let deviceID = 'uuid';
let appVersion = '1.0.0'; let appVersion = '1.0.0';
let browserInformation = 'Chrome135'; let browserInformation = result.browser.name;
return `${os} ${deviceType} ${deviceID} ${appVersion} ${browserInformation}`;
return `${os} ${deviceType} ${deviceID} ${appVersion} ${browserInformation} ${options?.menuId} ${options?.apiType}`;
}; };
export const API_BASE_URL = getAPIBaseUrl(); export const API_BASE_URL = getAPIBaseUrl();

View File

@@ -391,4 +391,7 @@ main.home-main{
text-overflow: ellipsis; text-overflow: ellipsis;
overflow-x: hidden; overflow-x: hidden;
width: 100%; width: 100%;
}
.cancel-input{
width: calc(100% - 5px);
} }

View File

@@ -246,7 +246,7 @@ export const SubLayout = () => {
codeCl: '0022', codeCl: '0022',
code1Filter: filter0022 code1Filter: filter0022
}); });
callCodesSelect({ codeCl: '0325' });
callCodesSelect({ codeCl: '0074' }); callCodesSelect({ codeCl: '0074' });
}).catch((error: any) => { }).catch((error: any) => {
@@ -309,6 +309,9 @@ export const SubLayout = () => {
}); });
useStore.getState().CommonStore.setServiceCodes(options); useStore.getState().CommonStore.setServiceCodes(options);
} }
else if(codeCl === '0325'){
useStore.getState().CommonStore.setAppNotificationCategories(data);
}
else if(codeCl === '0074'){ else if(codeCl === '0074'){
useStore.getState().CommonStore.setVirtualBankList(data); useStore.getState().CommonStore.setVirtualBankList(data);
} }