From 7f2a0f091b934a2356f0554aba9054e258e81e33 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Wed, 19 Feb 2020 22:18:00 -0800 Subject: [PATCH] Extract DesktopIcon component --- demo/css/page.css | 8 ++------ demo/js/DesktopIcon.tsx | 44 +++++++++++++++++++++++++++++++++++++++++ demo/js/WebampIcon.tsx | 43 +++++++++------------------------------- 3 files changed, 55 insertions(+), 40 deletions(-) create mode 100644 demo/js/DesktopIcon.tsx diff --git a/demo/css/page.css b/demo/css/page.css index b6a53268..82a6ea9e 100644 --- a/demo/css/page.css +++ b/demo/css/page.css @@ -162,11 +162,7 @@ body { image-rendering: pixelated; } -#webamp-icon.hidden { - display: none; -} - -.webamp-icon-title { +.desktop-icon-title { color: white; font-family: "MS Sans Serif", "Segoe UI", sans-serif; font-size: 11px; @@ -176,7 +172,7 @@ body { border: 1px dotted transparent; } -#webamp-icon .selected .webamp-icon-title { +.desktop-icon.selected .desktop-icon-title { background-color: #000080; border-color: white; } diff --git a/demo/js/DesktopIcon.tsx b/demo/js/DesktopIcon.tsx new file mode 100644 index 00000000..f45e2bb7 --- /dev/null +++ b/demo/js/DesktopIcon.tsx @@ -0,0 +1,44 @@ +import React, { useEffect, useState, useRef } from "react"; +import classnames from "classnames"; + +interface Props { + iconUrl: string; + name: string; + onOpen: () => void; +} + +const DesktopIcon = ({ iconUrl, onOpen, name }: Props) => { + const ref = useRef(null); + const [selected, setSelected] = useState(false); + + useEffect(() => { + if (!selected) { + return; + } + const handleClick = (e: MouseEvent) => { + if (ref.current != null && ref.current.contains(e.target as Element)) { + return; + } + setSelected(false); + }; + document.addEventListener("click", handleClick); + return () => document.removeEventListener("click", handleClick); + }, [selected]); + + return ( +
{ + onOpen(); + setSelected(false); + }} + onClick={() => setSelected(true)} + className={classnames("desktop-icon", { selected })} + > + +
{name}
+
+ ); +}; + +export default DesktopIcon; diff --git a/demo/js/WebampIcon.tsx b/demo/js/WebampIcon.tsx index 8c9f0419..21343caf 100644 --- a/demo/js/WebampIcon.tsx +++ b/demo/js/WebampIcon.tsx @@ -1,59 +1,34 @@ import WebampLazy from "../../js/webampLazy"; -import React, { useEffect, useState, useRef } from "react"; +import React, { useEffect, useState } from "react"; // @ts-ignore import iconLarge from "../images/manifest/icon-96x96.png"; // @ts-ignore import iconSmall from "../images/manifest/icon-48x48.png"; +import DesktopIcon from "./DesktopIcon"; -const icon = window.devicePixelRatio > 1 ? iconLarge : iconSmall; +const iconUrl = window.devicePixelRatio > 1 ? iconLarge : iconSmall; interface Props { webamp: WebampLazy; } const WebampIcon = (props: Props) => { - const ref = useRef(null); const [hidden, setHidden] = useState(true); - const [selected, setSelected] = useState(false); useEffect(() => { return props.webamp.onClose(() => { setHidden(false); - setSelected(false); }); }, [props.webamp]); - useEffect(() => { - if (!selected) { - return; - } - const handleClick = (e: MouseEvent) => { - if (ref.current != null && ref.current.contains(e.target as Element)) { - return; - } - setSelected(false); - }; - document.addEventListener("click", handleClick); - return () => document.removeEventListener("click", handleClick); - }, [selected]); - if (hidden) { return null; } - return ( -
{ - props.webamp.reopen(); - setHidden(true); - setSelected(false); - }} - onClick={() => setSelected(true)} - className={selected ? "selected" : ""} - > - -
Webamp
-
- ); + + function onOpen() { + props.webamp.reopen(); + setHidden(true); + } + return ; }; export default WebampIcon;