Commit 5c9d2668 authored by Ategon's avatar Ategon
Browse files

Add cursors of other users and reactions

parent 22ea4dcc
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
import React, { createContext, useContext, useEffect, useReducer } from "react";
import React, {
  createContext,
  useCallback,
  useContext,
  useEffect,
  useLayoutEffect,
  useReducer,
} from "react";
import { UserModSidebar } from "./UserModSidebar";
import { KeybindManager } from "../lib/keybinds";
import { ModSidebar } from "./ModSidebar";
import { useHasRole } from "../hooks/useHasRole";
import { ModeratorModule } from "./ModeratorModule";
import { usePanel } from "../contexts/PanelContext";

ModeratorModule.get(); // initialize

@@ -40,18 +48,21 @@ export const useModerator = () => useContext(context);

export const ModeratorContext = ({ children }: React.PropsWithChildren) => {
  const isMod = useHasRole("MOD");
  const Panel = usePanel();

  const [state, dispatch] = useReducer<IModeratorContext, [ModerationActions]>(
  const [state, reducerDispatch] = useReducer<IModeratorContext, [ModerationActions]>(
    (state, data) => {
      switch (data.action) {
        case "INSPECT_USER":
          return {
            ...state,
            inspectUser: data.user,
            showMenu: data.user ? false : state.showMenu,
          };
        case "OPEN_MENU":
          return {
            ...state,
            inspectUser: undefined,
            showMenu: true,
          };
        case "CLOSE_MENU":
@@ -105,6 +116,29 @@ export const ModeratorContext = ({ children }: React.PropsWithChildren) => {
    }
  );

  const dispatch = useCallback(
    (action: ModerationActions) => {
      if (
        action.action === "OPEN_MENU" ||
        (action.action === "INSPECT_USER" && action.user)
      ) {
        Panel.dispatch(["info", undefined]);
      }
      reducerDispatch(action);
    },
    [Panel.dispatch],
  );

  useLayoutEffect(() => {
    if (!Panel.state.info) return;

    if (state.showMenu) {
      reducerDispatch({ action: "CLOSE_MENU" });
    } else if (state.inspectUser) {
      reducerDispatch({ action: "INSPECT_USER" });
    }
  }, [Panel.state.info, state.inspectUser, state.showMenu]);

  useEffect(() => {
    if (isMod) {
      ModeratorModule.get().connect();
+44.8 KiB
Loading image diff...
+90.8 KiB
Loading image diff...
+13 KiB
Loading image diff...
+32.4 KiB
Loading image diff...
Loading