TopBar.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /** @jsx h */
  2. import { h } from "preact";
  3. import { useEffect, useState } from "preact/hooks";
  4. interface TopBarProps {
  5. allowMode: "edit" | "read" | "both";
  6. }
  7. export default function TopBar(props: TopBarProps) {
  8. const [mode, setMode] = useState(props.allowMode);
  9. // Event listener
  10. const modeChangeListener = (e: CustomEvent) => {
  11. if (e.detail && props.allowMode === "both") {
  12. setMode(e.detail);
  13. }
  14. };
  15. // Event dispatche
  16. const modeChangeDispatcher = (mode: string) => {
  17. window.dispatchEvent(new CustomEvent("ModeChange", { detail: mode }));
  18. };
  19. // Init event listeners
  20. useEffect(() => {
  21. window.addEventListener("ModeChange", modeChangeListener);
  22. return () => {
  23. window.removeEventListener("ModeChange", modeChangeListener);
  24. };
  25. }, []);
  26. return (
  27. <div className="pd-top-bar">
  28. <div className="pd-top-bar-mode-switcher">
  29. <button
  30. className={`pd-top-bar-btn ${mode === "edit" ? "active" : ""}`}
  31. id="edit"
  32. type="button"
  33. onClick={() => {
  34. modeChangeDispatcher("edit");
  35. }}
  36. >
  37. Edit
  38. </button>
  39. <button
  40. className={`pd-top-bar-btn ${mode === "read" ? "active" : ""}`}
  41. id="read"
  42. type="button"
  43. onClick={() => {
  44. modeChangeDispatcher("read");
  45. }}
  46. >
  47. Read
  48. </button>
  49. <button
  50. className={`pd-top-bar-btn ${mode === "both" ? "active" : ""}`}
  51. id="both"
  52. type="button"
  53. onClick={() => {
  54. modeChangeDispatcher("both");
  55. }}
  56. >
  57. Both
  58. </button>
  59. </div>
  60. </div>
  61. );
  62. }