/*
This file is part of GNU Taler
(C) 2022 Taler Systems S.A.
GNU Taler is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see
*/
import { css } from "@linaria/core";
import { h, JSX, VNode, ComponentChildren } from "preact";
import { useCallback, useEffect, useRef, useState } from "preact/hooks";
// eslint-disable-next-line import/extensions
import { alpha } from "./colors/manipulation.js";
import { ModalManager } from "./ModalManager.js";
import { Portal } from "./Portal.js";
// eslint-disable-next-line import/extensions
import { theme } from "./style.js";
const baseStyle = css`
position: fixed;
z-index: ${theme.zIndex.modal};
right: 0px;
bottom: 0px;
top: 0px;
left: 0px;
`;
interface Props {
class: string;
children: ComponentChildren;
open?: boolean;
exited?: boolean;
container?: VNode;
}
const defaultManager = new ModalManager();
const manager = defaultManager;
function getModal(): any {
return null; //TODO: fix
}
export function Modal({
open,
// exited,
class: _class,
children,
container,
...rest
}: Props): VNode {
const [exited, setExited] = useState(true);
const mountNodeRef = useRef(undefined);
const isTopModal = useCallback(
() => manager.isTopModal(getModal()),
[manager],
);
const handlePortalRef = useEventCallback((node) => {
mountNodeRef.current = node;
if (!node) {
return;
}
// if (open && isTopModal()) {
// handleMounted();
// } else {
// ariaHidden(modalRef.current, true);
// }
});
return (
{children}
);
}
function getOffsetTop(rect: any, vertical: any): number {
let offset = 0;
if (typeof vertical === "number") {
offset = vertical;
} else if (vertical === "center") {
offset = rect.height / 2;
} else if (vertical === "bottom") {
offset = rect.height;
}
return offset;
}
function getOffsetLeft(rect: any, horizontal: any): number {
let offset = 0;
if (typeof horizontal === "number") {
offset = horizontal;
} else if (horizontal === "center") {
offset = rect.width / 2;
} else if (horizontal === "right") {
offset = rect.width;
}
return offset;
}
function getTransformOriginValue(transformOrigin: any): string {
return [transformOrigin.horizontal, transformOrigin.vertical]
.map((n) => (typeof n === "number" ? `${n}px` : n))
.join(" ");
}
function resolveAnchorEl(anchorEl: any): any {
return typeof anchorEl === "function" ? anchorEl() : anchorEl;
}
function useEventCallback(
fn: (...args: Args) => Return,
): (...args: Args) => Return {
const ref = useRef(fn);
useEffect(() => {
ref.current = fn;
});
return useCallback(
(...args: Args) =>
// @ts-expect-error hide `this`
// tslint:disable-next-line:ban-comma-operator
(0, ref.current!)(...args),
[],
);
}