TopBar.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 (
  12. e.detail &&
  13. (props.allowMode === e.detail || props.allowMode === "both")
  14. ) {
  15. setMode(e.detail);
  16. }
  17. };
  18. // Event dispatche
  19. const modeChangeDispatcher = (mode: string) => {
  20. dispatchEvent(new CustomEvent("ModeChange", { detail: mode }));
  21. };
  22. // Init event listeners
  23. useEffect(() => {
  24. addEventListener("ModeChange", modeChangeListener);
  25. return () => {
  26. removeEventListener("ModeChange", modeChangeListener);
  27. };
  28. }, []);
  29. return (
  30. <div className="pd-top-bar">
  31. <div className="pd-top-bar-mode-switcher">
  32. <button
  33. className={`pd-top-bar-btn${mode === "edit" ? " active" : ""}${
  34. props.allowMode === "read" ? " disabled" : ""
  35. }`}
  36. id="edit"
  37. type="button"
  38. onClick={() => {
  39. modeChangeDispatcher("edit");
  40. }}
  41. >
  42. Edit
  43. </button>
  44. <button
  45. className={`pd-top-bar-btn${mode === "read" ? " active" : ""}${
  46. props.allowMode === "edit" ? " disabled" : ""
  47. }`}
  48. id="read"
  49. type="button"
  50. onClick={() => {
  51. modeChangeDispatcher("read");
  52. }}
  53. >
  54. Read
  55. </button>
  56. <button
  57. className={`pd-top-bar-btn${mode === "both" ? " active" : ""}${
  58. props.allowMode !== "both" ? " disabled" : ""
  59. }`}
  60. id="both"
  61. type="button"
  62. onClick={() => {
  63. modeChangeDispatcher("both");
  64. }}
  65. >
  66. Both
  67. </button>
  68. </div>
  69. </div>
  70. );
  71. }