production-taskbar-client / src / renderer / app / components / toggle_button / ToggleButton.jsx
ToggleButton.jsx
Raw
import React, { useEffect, useCallback } from "react";
import { useDispatch, useSelector, batch } from "react-redux";
import { ipcRenderer } from "electron";

import { setIsAutoHide, setIsHide } from "./toggleButtonSlice";

import "./ToggleButton.less";

const kMainWindowChannel = "mainWindow";

export default function ToggleButton() {
  const dispatch = useDispatch();
  const isHide = useSelector((state) => state.togglebutton.isHide);

  useEffect(() => {
    // due if draggable prevent mouseEvents, use 'moved' event instead of onMouseUp
    const handler = (_e, { event, data }) => {
      if (event === "set-ishide") dispatch(setIsHide(data));
    };
    ipcRenderer.on(kMainWindowChannel, handler);

    (async () => {
      const { isHide: isH, isAutoHide: isA } = await ipcRenderer.invoke(
        kMainWindowChannel,
        {
          event: "get-toggle-settings",
        }
      );
      batch(() => {
        dispatch(setIsHide(isH));
        dispatch(setIsAutoHide(isA));
      });
    })();

    return function cleanup() {
      ipcRenderer.removeListener(kMainWindowChannel, handler);
    };
  }, [dispatch]);

  const callback = useCallback(() => {
    ipcRenderer.invoke(kMainWindowChannel, {
      event: "toggle-win",
      data: !isHide,
    });

    dispatch(setIsHide(!isHide));
  }, [dispatch, isHide]);

  return (
    // eslint-disable-next-line jsx-a11y/interactive-supports-focus
    <div
      onClick={callback}
      role="button"
      onKeyDown={() => {}}
      className="toggle-button"
    >
      <div
        className={
          isHide
            ? "toggle-button__triangle-left"
            : "toggle-button__triangle-right"
        }
      />
    </div>
  );
}