MediaAttachmentGrid: fix viewer DOM not removed
This commit is contained in:
		
							parent
							
								
									972b2eca8b
								
							
						
					
					
						commit
						1a0a9d7e77
					
				
					 2 changed files with 17 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -2,6 +2,8 @@ import type { mastodon } from "masto";
 | 
			
		|||
import {
 | 
			
		||||
  type Component,
 | 
			
		||||
  For,
 | 
			
		||||
  createEffect,
 | 
			
		||||
  createRenderEffect,
 | 
			
		||||
  createSignal,
 | 
			
		||||
  onCleanup,
 | 
			
		||||
  onMount,
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +17,7 @@ const MediaAttachmentGrid: Component<{
 | 
			
		|||
  attachments: mastodon.v1.MediaAttachment[];
 | 
			
		||||
}> = (props) => {
 | 
			
		||||
  let rootRef: HTMLElement;
 | 
			
		||||
  const [dispose, setDispose] = createSignal<() => void>();
 | 
			
		||||
  const [viewerIndex, setViewerIndex] = createSignal<number>();
 | 
			
		||||
  const viewerOpened = () => typeof viewerIndex() !== "undefined";
 | 
			
		||||
  const gridTemplateColumns = () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -28,31 +31,32 @@ const MediaAttachmentGrid: Component<{
 | 
			
		|||
    return "repeat(3, minmax(40px, auto))";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const openViewerFor = (index: number) => {
 | 
			
		||||
    setViewerIndex(index);
 | 
			
		||||
  createRenderEffect((lastDispose?: () => void) => {
 | 
			
		||||
    lastDispose?.();
 | 
			
		||||
    const vidx = viewerIndex();
 | 
			
		||||
    if (typeof vidx === "undefined") return;
 | 
			
		||||
    const container = document.createElement("div");
 | 
			
		||||
    container.setAttribute("role", "presentation");
 | 
			
		||||
    document.body.appendChild(container);
 | 
			
		||||
    return render(() => {
 | 
			
		||||
      onCleanup(() => {
 | 
			
		||||
        document.body.removeChild(container);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    let dispose: () => void;
 | 
			
		||||
 | 
			
		||||
    const removeContainer = () => {
 | 
			
		||||
      setViewerIndex(undefined);
 | 
			
		||||
      document.body.removeChild(container);
 | 
			
		||||
      dispose();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    dispose = render(() => {
 | 
			
		||||
      return (
 | 
			
		||||
        <MediaViewer
 | 
			
		||||
          show={viewerOpened()}
 | 
			
		||||
          index={viewerIndex() || 0}
 | 
			
		||||
          onIndexUpdated={setViewerIndex}
 | 
			
		||||
          media={props.attachments}
 | 
			
		||||
          onClose={removeContainer}
 | 
			
		||||
          onClose={() => setViewerIndex()}
 | 
			
		||||
        />
 | 
			
		||||
      );
 | 
			
		||||
    }, container);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const openViewerFor = (index: number) => {
 | 
			
		||||
    setViewerIndex(index);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  css`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -323,7 +323,7 @@ const MediaViewer: ParentComponent<MediaViewerProps> = (props) => {
 | 
			
		|||
              boxShadow: showControls() ? "var(--tutu-shadow-e6)" : undefined,
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            <IconButton onClick={props.onClose}>
 | 
			
		||||
            <IconButton onClick={props.onClose} disableRipple>
 | 
			
		||||
              <Close />
 | 
			
		||||
            </IconButton>
 | 
			
		||||
          </Toolbar>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue