docbrown/app/javascript/listings/components/Modal.jsx
Suzanne Aitchison 5bed8f56d4
improve keyboard accessibility of modals 12427 10610 (#12511)
* adds focusTrap wrapper to preact Modal component

* add view specific code for focus trap in admin add nav link

* add script to return a focustrap toggle, use in add nav link modal partial

* add trap to edit nav link modal

* add handlers for sign up modal

* update modal controller for admin section, update nav link modals to use

* update other admin modals with new data values for trap

* remove unneeded erb script file

* remove unneeded target

* refactor to remove extra unneeded param

* remove duplicate code, store getFocusTrapToggle in window

* trap focus in comment and bookmark showModal instances for not logged in user

* remove need for activator id

* clean up id refs no longer needed

* remove custom code and re-use focsu-trap lib

* update storybook docs

* update default export in focusTrap

* prevent close button click triggering a modal toggle twice

* ensure if user navigates from a modal the trap is deactivated

* add jsdoc comments and add dynamic import

* ensure admin controller modal traps are cleaned up on disconnect

* update sign up modal to use crayons

* update modal controller and admin nav links modals to use preact modal

* update profile fields modals for new controller

* tweak styling of sign up and admin modals to match previous

* update listings modal to use crayons modal, adapt focus trap to work with click outside

* memoize deactivate callback to ensure modal can be presented on first page load

* add missed focustrap changes

* fix focus trap issues in onboarding flow

* refactor onboarding focus trap, remove getFocusTrapToggle

* tweaks for styling and article modal toggle

* add click outside tests to modal

* add cypress tests for the login modal

* update liquid tag tests affected by change

* refactors to address review comments

* fix issue with login modal presented twice on comment add

* change ids to selectors in admin modals

* small pr comment refactors

* add listings e2e tests

* add nav link modal tests

* fix issue with help modal

* tweak to fix ui bug from merge

* remove context from showLoginModal

* rename toggleModal

* rename state property for clarity

Co-authored-by: Nick Taylor <nick@dev.to>
2021-02-24 16:01:10 +00:00

66 lines
1.7 KiB
JavaScript

import { h } from 'preact';
import PropTypes from 'prop-types';
import { SingleListing } from '../singleListing/SingleListing';
import { MessageModal } from './MessageModal';
import { Modal as CrayonsModal } from '@crayons';
export const Modal = ({
currentUserId,
onAddTag,
onChangeDraftingMessage,
onClick,
onChangeCategory,
onOpenModal,
onSubmit,
listing,
message,
}) => {
const shouldRenderMessageModal = listing && listing.contact_via_connect;
return (
<div className="listings-modal" data-testid="listings-modal">
<CrayonsModal
onClose={onClick}
closeOnClickOutside={true}
title="Listing"
>
<div className="p-3 m:p-6 l:p-8">
<SingleListing
onAddTag={onAddTag}
onChangeCategory={onChangeCategory}
listing={listing}
currentUserId={currentUserId}
onOpenModal={onOpenModal}
isOpen
/>
</div>
{shouldRenderMessageModal && (
<div className="bg-base-10 p-3 m:p-6 l:p-8">
<MessageModal
onSubmit={onSubmit}
onChangeDraftingMessage={onChangeDraftingMessage}
message={message}
listing={listing}
/>
</div>
)}
</CrayonsModal>
</div>
);
};
Modal.propTypes = {
listing: PropTypes.isRequired,
onAddTag: PropTypes.func.isRequired,
onChangeDraftingMessage: PropTypes.func.isRequired,
onClick: PropTypes.func.isRequired,
onChangeCategory: PropTypes.func.isRequired,
onOpenModal: PropTypes.func.isRequired,
onSubmit: PropTypes.func.isRequired,
currentUserId: PropTypes.number,
message: PropTypes.string.isRequired,
};
Modal.defaultProps = {
currentUserId: null,
};