Modal API Refactoring (#12062)

# Modal API Refactoring

This PR refactors the modal system to use an imperative approach for
setting hotkey scopes, addressing race conditions that occurred with the
previous effect-based implementation.

Fixes #11986
Closes #12087

## Key Changes:

- **New Modal API**: Introduced a `useModal` hook with `openModal`,
`closeModal`, and `toggleModal` functions, similar to the existing
dropdown API
- **Modal Identification**: Added a `modalId` prop to uniquely identify
modals
- **State Management**: Introduced `isModalOpenedComponentState` and
removed individual boolean state atoms (like
`isRemoveSortingModalOpenState`)
- **Modal Constants**: Added consistent modal ID constants (e.g.,
`FavoriteFolderDeleteModalId`, `RecordIndexRemoveSortingModalId`) for
better maintainability
- **Mount Effects**: Created mount effect components (like
`AuthModalMountEffect`) to handle initial modal opening where needed

## Implementation Details:

- Modified `Modal` and `ConfirmationModal` components to accept the new
`modalId` prop
- Added a component-state-based approach using
`ModalComponentInstanceContext` to track modal state
- Introduced imperative modal handlers that properly manage hotkey
scopes
- Components like `ActionModal` and `AttachmentList` now use the new
`useModal` hook for better control over modal state

## Benefits:

- **Race Condition Prevention**: Hotkey scopes are now set imperatively,
eliminating race conditions
- **Consistent API**: Modal and dropdown now share similar patterns,
improving developer experience

## Tests to do before merging:

1. Action Modals (Modal triggered by an action, for example the delete
action)

2. Auth Modal (`AuthModal.tsx` and `AuthModalMountEffect.tsx`)
   - Test that auth modal opens automatically on mount
   - Verify authentication flow works properly

3. Email Verification Sent Modal (in `SignInUp.tsx`)
   - Verify this modal displays correctly

4. Attachment Preview Modal (in `AttachmentList.tsx`)
   - Test opening preview modal by clicking on attachments
   - Verify close, download functionality works
   - Test modal navigation and interactions

5. Favorite Folder Delete Modal (`CurrentWorkspaceMemberFavorites.tsx`)
   - Test deletion confirmation flow
- Check that modal opens when attempting to delete folders with
favorites

6. Record Board Remove Sorting Modal (`RecordBoard.tsx` using
`RecordIndexRemoveSortingModalId`)
- Test that modal appears when trying to drag records with sorting
enabled
   - Verify sorting removal works correctly

7. Record Group Reorder Confirmation Modal
(`RecordGroupReorderConfirmationModal.tsx`)
   - Test group reordering with sorting enabled
   - Verify confirmation modal properly handles sorting removal

8. Confirmation Modal (base component used by several modals)
   - Test all variants with different confirmation options

For each modal, verify:
- Opening/closing behavior
- Hotkey support (Esc to close, Enter to confirm where applicable)
- Click outside behavior
- Proper z-index stacking
- Any modal-specific functionality
This commit is contained in:
Raphaël Bosi
2025-05-16 17:04:22 +02:00
committed by GitHub
parent 8334fe9528
commit 6554947671
94 changed files with 1268 additions and 563 deletions

View File

@ -617,7 +617,7 @@ msgid "Are you sure you want to delete this record? It can be recovered from the
msgstr "Sind Sie sicher, dass Sie diesen Datensatz löschen möchten? Er kann aus dem Befehlsmenü wiederhergestellt werden."
#. js-lingui-id: rnCqBK
#: src/modules/spreadsheet-import/components/ModalCloseButton.tsx
#: src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx
msgid "Are you sure? Your current information will not be saved."
msgstr ""
@ -798,7 +798,7 @@ msgstr "API-Namen für Standardobjekte können nicht geändert werden"
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx
#: src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx
#: src/modules/spreadsheet-import/components/ModalCloseButton.tsx
#: src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
msgid "Cancel"
msgstr "Abbrechen"
@ -2036,7 +2036,7 @@ msgid "Existing objects"
msgstr "Vorhandene Objekte"
#. js-lingui-id: ydzS9x
#: src/modules/spreadsheet-import/components/ModalCloseButton.tsx
#: src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx
msgid "Exit"
msgstr ""
@ -2046,7 +2046,7 @@ msgstr ""
#~ msgstr "Vollbildmodus beenden"
#. js-lingui-id: XB4onr
#: src/modules/spreadsheet-import/components/ModalCloseButton.tsx
#: src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx
msgid "Exit import flow"
msgstr ""