import React, { useCallback, useState, useEffect } from "react"; import Footer from "components/footer"; import Header from "components/header"; import styles from "styles/app.module.scss"; import { UpdateTokenTimer } from "components/auth/updateTokenTimer"; import { useDispatch, useSelector } from "react-redux"; import { AppDispatch } from "app/store"; import { getTranslationID } from "translation"; import { useTranslation } from "react-i18next"; import { PartnerLicenseInfo } from "api"; import { CardLicenseIssuePopup } from "./cardLicenseIssuePopup"; import postAdd from "../../assets/images/post_add.svg"; import history from "../../assets/images/history.svg"; import returnLabel from "../../assets/images/undo.svg"; import { isApproveTier } from "../../features/auth/utils"; import { TIERS } from "../../components/auth/constants"; import { getPartnerLicenseAsync, ACCOUNTS_VIEW_LIMIT, selectMyAccountInfo, selectTotal, selectOwnPartnerLicense, selectChildrenPartnerLicenses, selectHierarchicalElements, selectTotalPage, selectIsLoading, selectOffset, selectCurrentPage, pushHierarchicalElement, popHierarchicalElement, spliceHierarchicalElement, savePageInfo, getMyAccountAsync, changeSelectedRow, } from "../../features/license/partnerLicense"; import { LicenseOrderPopup } from "./licenseOrderPopup"; import { LicenseOrderHistory } from "./licenseOrderHistory"; import { LicenseSummary } from "./licenseSummary"; import progress_activit from "../../assets/images/progress_activit.svg"; const PartnerLicense: React.FC = (): JSX.Element => { const dispatch: AppDispatch = useDispatch(); const [t] = useTranslation(); // popup制御関係 const [isCardLicenseIssuePopupOpen, setIsCardLicenseIssuePopupOpen] = useState(false); const [islicenseOrderPopupOpen, setIslicenseOrderPopupOpen] = useState(false); const [islicenseOrderHistoryOpen, setIslicenseOrderHistoryOpen] = useState(false); const [isViewDetailsOpen, setIsViewDetailsOpen] = useState(false); // 階層表示用 const tierNames: { [key: number]: string } = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: t(getTranslationID("common.label.tier1")), // eslint-disable-next-line @typescript-eslint/naming-convention 2: t(getTranslationID("common.label.tier2")), // eslint-disable-next-line @typescript-eslint/naming-convention 3: t(getTranslationID("common.label.tier3")), // eslint-disable-next-line @typescript-eslint/naming-convention 4: t(getTranslationID("common.label.tier4")), // eslint-disable-next-line @typescript-eslint/naming-convention 5: t(getTranslationID("common.label.tier5")), }; const onlicenseIssueOpen = useCallback(() => { setIsCardLicenseIssuePopupOpen(true); }, [setIsCardLicenseIssuePopupOpen]); const onlicenseOrderOpen = useCallback(() => { setIslicenseOrderPopupOpen(true); }, [setIslicenseOrderPopupOpen]); // apiからの値取得関係 const myAccountInfo = useSelector(selectMyAccountInfo); const total = useSelector(selectTotal); const totalPage = useSelector(selectTotalPage); const ownPartnerLicenseInfo = useSelector(selectOwnPartnerLicense); const childrenPartnerLicensesInfo = useSelector( selectChildrenPartnerLicenses ); const hierarchicalElements = useSelector(selectHierarchicalElements); const isLoading = useSelector(selectIsLoading); // ページネーション制御用 const currentPage = useSelector(selectCurrentPage); const offset = useSelector(selectOffset); // ページネーションのボタンクリック時のアクション const movePage = (targetOffset: number) => { dispatch( savePageInfo({ limit: ACCOUNTS_VIEW_LIMIT, offset: targetOffset }) ); }; // パンくずリスト内のアカウント押下時 const onClickBreadCrumbList = (id: number) => { const clickLevel = hierarchicalElements.findIndex( (param) => param.accountId === id ); const nowLevel = hierarchicalElements.length - 1; const deleteCount = nowLevel - clickLevel; // 階層を上がった分だけ表示アカウント管理用の配列の最後からパラメータを削除する if (deleteCount > 0) { dispatch(spliceHierarchicalElement({ deleteCount })); movePage(0); } }; // 行要素クリック時イベント const handleRowClick = (value: PartnerLicenseInfo) => { dispatch( pushHierarchicalElement({ hierarchicalElement: { accountId: value.accountId, companyName: value.companyName, }, }) ); movePage(0); }; // returnボタンクリック時イベント const returnClick = () => { dispatch(popHierarchicalElement()); movePage(0); }; // ログイン時に階層をチェック const isTier1 = isApproveTier([TIERS.TIER1]); const isTier2ToTier4 = isApproveTier([TIERS.TIER2, TIERS.TIER3, TIERS.TIER4]); // viewDetailsボタン押下時 const onClickViewDetails = useCallback( (value?: PartnerLicenseInfo) => { dispatch(changeSelectedRow({ value })); setIsViewDetailsOpen(true); }, [dispatch, setIsViewDetailsOpen] ); // orderHistoryボタン押下時 const onClickOrderHistory = useCallback( (value?: PartnerLicenseInfo) => { dispatch(changeSelectedRow({ value })); setIslicenseOrderHistoryOpen(true); }, [dispatch, setIslicenseOrderHistoryOpen] ); // マウント時のみ実行 useEffect(() => { dispatch(getMyAccountAsync()); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // 自アカウントID取得時に実行 useEffect(() => { if (myAccountInfo.accountId !== 0) { dispatch( getPartnerLicenseAsync({ limit: ACCOUNTS_VIEW_LIMIT, offset, accountId: myAccountInfo.accountId, }) ); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [myAccountInfo]); // 現在の表示階層に合わせたボタン制御用 const [buttonLabel, setButtonLabel] = useState(""); // パンくずリスト用stateに自アカウントを追加 useEffect(() => { if ( hierarchicalElements.length === 0 && ownPartnerLicenseInfo.accountId !== 0 ) { dispatch( pushHierarchicalElement({ hierarchicalElement: { accountId: ownPartnerLicenseInfo.accountId, companyName: ownPartnerLicenseInfo.companyName, }, }) ); } // 表内のボタン表示判定 if (hierarchicalElements.length === 1 && ownPartnerLicenseInfo.tier !== 4) { setButtonLabel( t(getTranslationID("partnerLicense.label.orderHistoryButton")) ); } else if (ownPartnerLicenseInfo.tier === 4) { setButtonLabel(t(getTranslationID("partnerLicense.label.viewDetails"))); } else { setButtonLabel(""); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [ownPartnerLicenseInfo]); // 表内の情報取得処理 useEffect(() => { if (hierarchicalElements.length !== 0) { dispatch( getPartnerLicenseAsync({ limit: ACCOUNTS_VIEW_LIMIT, offset, accountId: hierarchicalElements[hierarchicalElements.length - 1].accountId, }) ); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [hierarchicalElements, currentPage]); return ( <> {/* isPopupOpenがfalseの場合はポップアップのhtmlを生成しないように対応。これによりポップアップは都度生成されて初期化の考慮が減る */} {isCardLicenseIssuePopupOpen && ( { setIsCardLicenseIssuePopupOpen(false); }} /> )} {islicenseOrderPopupOpen && ( { setIslicenseOrderPopupOpen(false); }} /> )} {islicenseOrderHistoryOpen && ( { setIslicenseOrderHistoryOpen(false); }} /> )} {isViewDetailsOpen && ( { setIsViewDetailsOpen(false); }} /> )} {!islicenseOrderHistoryOpen && !isViewDetailsOpen && (

{t(getTranslationID("partnerLicense.label.title"))}

{t(getTranslationID("partnerLicense.label.subTitle"))}

    {hierarchicalElements.map((value) => ( // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions
  • { onClickBreadCrumbList(value.accountId); }} > {value.companyName}
  • ))}
{/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} {childrenPartnerLicensesInfo.map((value) => ( ))}
{t(getTranslationID("partnerLicense.label.name"))} {t(getTranslationID("partnerLicense.label.category"))} {t(getTranslationID("partnerLicense.label.accountId"))} {t(getTranslationID("partnerLicense.label.stockLicense"))} {t( getTranslationID("partnerLicense.label.issueRequested") )} {t(getTranslationID("partnerLicense.label.shortage"))} {t( getTranslationID("partnerLicense.label.issueRequesting") )}
{ownPartnerLicenseInfo.companyName} {tierNames[ownPartnerLicenseInfo.tier]} {ownPartnerLicenseInfo.accountId} {ownPartnerLicenseInfo.tier !== 1 ? ownPartnerLicenseInfo.stockLicense : "-"} {ownPartnerLicenseInfo.issuedRequested} 0 && ownPartnerLicenseInfo.tier !== 1 ? styles.isAlert : "" } > {ownPartnerLicenseInfo.tier !== 1 ? ownPartnerLicenseInfo.shortage : "-"} {ownPartnerLicenseInfo.tier !== 1 ? ownPartnerLicenseInfo.issueRequesting : "-"}
  • {/* レイアウト維持用 */}
{ if (value.tier !== 5) { handleRowClick(value); } }} > {value.companyName} {tierNames[value.tier]} {value.accountId} {value.stockLicense} {value.issuedRequested} 0 ? styles.isAlert : ""} > {value.shortage} {value.issueRequesting}
{!isLoading && childrenPartnerLicensesInfo.length === 0 && (

{t(getTranslationID("common.message.listEmpty"))}

)} {/* pagenation */}
Loading
)} ; ); }; export default PartnerLicense;