Skip to content
Snippets Groups Projects
UpdateIndicator.tsx 1.46 KiB
Newer Older
insert's avatar
insert committed
/* eslint-disable react-hooks/rules-of-hooks */
import { Download, CloudDownload } from "@styled-icons/boxicons-regular";
insert's avatar
insert committed

insert's avatar
insert committed
import { useContext, useEffect, useState } from "preact/hooks";

insert's avatar
insert committed
import { internalSubscribe } from "../../lib/eventEmitter";

import { ThemeContext } from "../../context/Theme";

import IconButton from "../ui/IconButton";

import { updateSW } from "../../main";
import Tooltip from "./Tooltip";
let pendingUpdate = false;
insert's avatar
insert committed
internalSubscribe("PWA", "update", () => (pendingUpdate = true));
insert's avatar
insert committed

interface Props {
    style: "titlebar" | "channel";
}

export default function UpdateIndicator({ style }: Props) {
    const [pending, setPending] = useState(pendingUpdate);
insert's avatar
insert committed

    useEffect(() => {
        return internalSubscribe("PWA", "update", () => setPending(true));
    });
insert's avatar
insert committed

    if (!pending) return null;
    const theme = useContext(ThemeContext);
insert's avatar
insert committed

    if (style === "titlebar") {
        return (
            <div class="actions">
                <Tooltip
                    content="A new update is available!"
                    placement="bottom">
                    <div onClick={() => updateSW(true)}>
                        <CloudDownload size={22} color={theme.success} />
                    </div>
                </Tooltip>
            </div>
        );
    }

    if (window.isNative) return null;

    return (
        <IconButton onClick={() => updateSW(true)}>
            <Download size={22} color={theme.success} />
        </IconButton>
    );
insert's avatar
insert committed
}