diff --git a/dictation_client/src/features/license/licenseCardIssue/licenseCardIssueSlice.ts b/dictation_client/src/features/license/licenseCardIssue/licenseCardIssueSlice.ts index 6fcd8bb..500365e 100644 --- a/dictation_client/src/features/license/licenseCardIssue/licenseCardIssueSlice.ts +++ b/dictation_client/src/features/license/licenseCardIssue/licenseCardIssueSlice.ts @@ -5,6 +5,7 @@ import { createCardLicenseAsync } from "./operations"; const initialState: LicenseCardIssuesState = { apps: { numberOfCreateLicenses: 0, + isLoading: false, }, }; export const licenseCardSlice = createSlice({ @@ -23,6 +24,9 @@ export const licenseCardSlice = createSlice({ }, }, extraReducers: (builder) => { + builder.addCase(createCardLicenseAsync.pending, (state) => { + state.apps.isLoading = true; + }); builder.addCase(createCardLicenseAsync.fulfilled, (state, action) => { // csvファイルダウンロード処理 // ファイル名は「{発行日時}_licenseCard.csv」とする @@ -43,6 +47,10 @@ export const licenseCardSlice = createSlice({ document.body.appendChild(a); a.click(); a.parentNode?.removeChild(a); + state.apps.isLoading = false; + }); + builder.addCase(createCardLicenseAsync.rejected, (state) => { + state.apps.isLoading = false; }); }, }); diff --git a/dictation_client/src/features/license/licenseCardIssue/selectors.ts b/dictation_client/src/features/license/licenseCardIssue/selectors.ts index 6de3e95..33ebffc 100644 --- a/dictation_client/src/features/license/licenseCardIssue/selectors.ts +++ b/dictation_client/src/features/license/licenseCardIssue/selectors.ts @@ -22,3 +22,6 @@ export const checkErrorIncorrectNumberOfCreateLicenses = ( export const selectNumberOfCreateLicenses = (state: RootState) => state.licenseCardIssue.apps.numberOfCreateLicenses; + +export const selectIsLoading = (state: RootState) => + state.licenseCardIssue.apps.isLoading; diff --git a/dictation_client/src/features/license/licenseCardIssue/state.ts b/dictation_client/src/features/license/licenseCardIssue/state.ts index d54098c..84de47c 100644 --- a/dictation_client/src/features/license/licenseCardIssue/state.ts +++ b/dictation_client/src/features/license/licenseCardIssue/state.ts @@ -4,4 +4,5 @@ export interface LicenseCardIssuesState { export interface Apps { numberOfCreateLicenses: number; + isLoading: boolean; } diff --git a/dictation_client/src/pages/LicensePage/cardLicenseIssuePopup.tsx b/dictation_client/src/pages/LicensePage/cardLicenseIssuePopup.tsx index e700d01..0535ec2 100644 --- a/dictation_client/src/pages/LicensePage/cardLicenseIssuePopup.tsx +++ b/dictation_client/src/pages/LicensePage/cardLicenseIssuePopup.tsx @@ -12,7 +12,9 @@ import { selectInputValidationErrors, createCardLicenseAsync, cleanupApps, + selectIsLoading, } from "../../features/license/licenseCardIssue/index"; +import progress_activit from "../../assets/images/progress_activit.svg"; interface CardLicenseIssuePopupProps { onClose: () => void; @@ -27,6 +29,8 @@ export const CardLicenseIssuePopup: React.FC = ( const initCount = useSelector(selectNumberOfCreateLicenses); const [count, setCount] = useState(initCount); + const isLoading = useSelector(selectIsLoading); + useEffect( () => () => { // useEffectのreturnとしてcleanupAppsを実行することで、ポップアップのアンマウント時に初期化を行う @@ -140,9 +144,17 @@ export const CardLicenseIssuePopup: React.FC = ( "cardLicenseIssuePopupPage.label.createButton" ) )} - className={`${styles.formSubmit} ${styles.marginBtm1} ${styles.isActive}`} + className={`${styles.formSubmit} ${styles.marginBtm1} ${ + !isLoading ? styles.isActive : "" + }`} onClick={onCreateLicense} /> + Loading