From f4be1323132f97fb79bf4854389ee596352d1ecb Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 17 Nov 2024 02:36:01 +0200 Subject: [PATCH] web/modal: add boxing to modal utility --- web/src/ui/modal/Lightbox.css | 15 ++++++++++ web/src/ui/modal/Modal.tsx | 30 +++++++++++++------ .../timeline/menu/ConfirmWithMessageModal.tsx | 4 +-- web/src/ui/timeline/menu/EventExtraMenu.tsx | 12 ++++++-- web/src/ui/timeline/menu/ViewSourceModal.tsx | 29 ------------------ web/src/ui/timeline/menu/index.css | 12 -------- 6 files changed, 48 insertions(+), 54 deletions(-) delete mode 100644 web/src/ui/timeline/menu/ViewSourceModal.tsx diff --git a/web/src/ui/modal/Lightbox.css b/web/src/ui/modal/Lightbox.css index b6ef425..9d65ab7 100644 --- a/web/src/ui/modal/Lightbox.css +++ b/web/src/ui/modal/Lightbox.css @@ -8,6 +8,21 @@ div.overlay { &.dimmed { background-color: var(--dimmed-overlay-background-color); } + + &.modal > div.modal-box { + background-color: var(--background-color); + border-radius: 1rem; + padding: 1rem; + + max-width: min(80rem, 80vw); + max-height: min(80rem, 80vh); + overflow: hidden; + display: flex; + + > div.modal-box-inner { + overflow: scroll; + } + } } div.lightbox { diff --git a/web/src/ui/modal/Modal.tsx b/web/src/ui/modal/Modal.tsx index adbc50c..5a1df7e 100644 --- a/web/src/ui/modal/Modal.tsx +++ b/web/src/ui/modal/Modal.tsx @@ -18,7 +18,9 @@ import React, { JSX, createContext, useCallback, useLayoutEffect, useReducer, us export interface ModalState { content: JSX.Element dimmed?: boolean - wrapperClass?: string + boxed?: boolean + boxClass?: string + innerBoxClass?: string onClose?: () => void } @@ -52,18 +54,28 @@ export const ModalWrapper = ({ children }: { children: React.ReactNode }) => { wrapperRef.current.focus() } }, [state]) - return - {children} - {state &&
{state.content} + if (state.boxed) { + content =
+
+ {content} +
+
+ } + modal =
- - {state.content} - -
} + {content} +
+ } + return + {children} + {modal} } diff --git a/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx b/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx index 46c70a0..c789d17 100644 --- a/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx +++ b/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx @@ -40,7 +40,7 @@ const ConfirmWithMessageModal = ({ const onChangeReason = useCallback((evt: React.ChangeEvent) => { setReason(evt.target.value) }, []) - return
+ return <>

{title}

@@ -53,7 +53,7 @@ const ConfirmWithMessageModal = ({
-
+ } export default ConfirmWithMessageModal diff --git a/web/src/ui/timeline/menu/EventExtraMenu.tsx b/web/src/ui/timeline/menu/EventExtraMenu.tsx index b035e7d..a675712 100644 --- a/web/src/ui/timeline/menu/EventExtraMenu.tsx +++ b/web/src/ui/timeline/menu/EventExtraMenu.tsx @@ -19,8 +19,8 @@ import { MemDBEvent, PowerLevelEventContent } from "@/api/types" import ClientContext from "../../ClientContext.ts" import { ModalCloseContext, ModalContext } from "../../modal/Modal.tsx" import { RoomContext, RoomContextData } from "../../roomview/roomcontext.ts" +import JSONView from "../../util/JSONView.tsx" import ConfirmWithMessageModal from "./ConfirmWithMessageModal.tsx" -import ViewSourceModal from "./ViewSourceModal.tsx" import ViewSourceIcon from "@/icons/code.svg?react" import DeleteIcon from "@/icons/delete.svg?react" import PinIcon from "@/icons/pin.svg?react" @@ -39,11 +39,17 @@ const EventExtraMenu = ({ evt, room, style }: EventExtraMenuProps) => { const closeModal = use(ModalCloseContext) const openModal = use(ModalContext) const onClickViewSource = useCallback(() => { - openModal({ dimmed: true, content: }) + openModal({ + dimmed: true, + boxed: true, + content: , + }) }, [evt, openModal]) const onClickReport = useCallback(() => { openModal({ dimmed: true, + boxed: true, + innerBoxClass: "confirm-message-modal", content: { const onClickRedact = useCallback(() => { openModal({ dimmed: true, + boxed: true, + innerBoxClass: "confirm-message-modal", content: . -import { MemDBEvent } from "@/api/types" -import JSONView from "../../util/JSONView.tsx" - -interface ViewSourceModalProps { - evt: MemDBEvent -} - -const ViewSourceModal = ({ evt }: ViewSourceModalProps) => { - return
- -
-} - -export default ViewSourceModal diff --git a/web/src/ui/timeline/menu/index.css b/web/src/ui/timeline/menu/index.css index c778558..9029487 100644 --- a/web/src/ui/timeline/menu/index.css +++ b/web/src/ui/timeline/menu/index.css @@ -45,21 +45,9 @@ div.event-context-menu-extra { } } -div.view-source-modal { - max-width: min(80rem, 80vw); - max-height: min(80rem, 80vh); - overflow: auto; - background-color: var(--background-color); - border-radius: 1rem; - padding: 1rem; -} - div.confirm-message-modal { width: min(40rem, 80vw); max-height: min(40rem, 80vh); - background-color: var(--background-color); - border-radius: 1rem; - padding: 1rem; display: flex; flex-direction: column; gap: .5rem;