Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 20x 6x 20x 6x 6x 6x 1x 5x 1x 4x 5x 6x 20x 6x 1x 20x 20x 1x 20x 48x 48x 20x 20x | import OurTable, { ButtonColumn } from "main/components/OurTable";
import { useBackendMutation } from "main/utils/useBackend";
import { toast } from "react-toastify";
import axios from "axios";
import { useMutation, useQueryClient } from "react-query";
 
export default function UsersTable({ users }) {
  const queryClient = useQueryClient();
 
  //toggleAdmin
  function cellToAxiosParamsToggleAdmin(cell) {
    return {
      url: "/api/admin/users/toggleAdmin",
      method: "POST",
      params: {
        id: cell.row.values.id,
      },
    };
  }
 
  // Custom mutation that handles errors without the default Axios error
  const toggleAdminMutation = useMutation(
    async (cell) => {
      try {
        const params = cellToAxiosParamsToggleAdmin(cell);
        const response = await axios(params);
        return response.data;
      } catch (error) {
        if (
          error.response &&
          error.response.data &&
          error.response.data.message
        ) {
          toast(`Error: ${error.response.data.message}`);
        } else {
          toast(`Error: ${error.message || "Unknown error occurred"}`);
        }
        throw error; // Re-throw to maintain error state in mutation
      }
    },
    {
      onSettled: () => {
        queryClient.invalidateQueries(["/api/admin/users"]);
      },
      retry: false,
    },
  );
 
  // Stryker disable next-line all : TODO try to make a good test for this
  const toggleAdminCallback = async (cell) => {
    toggleAdminMutation.mutate(cell);
  };
 
  function cellToAxiosParamsToggleProfessor(cell) {
    return {
      url: "/api/admin/users/toggleProfessor",
      method: "POST",
      params: {
        id: cell.row.values.id,
      },
    };
  }
 
  // Stryker disable all : hard to test for query caching
  const toggleProfessorMutation = useBackendMutation(
    cellToAxiosParamsToggleProfessor,
    {},
    ["/api/admin/users"],
  );
  // Stryker enable all
 
  // Stryker disable next-line all : TODO try to make a good test for this
  const toggleProfessorCallback = async (cell) => {
    toggleProfessorMutation.mutate(cell);
  };
 
  const columns = [
    {
      Header: "id",
      accessor: "id", // accessor is the "key" in the data
    },
    {
      Header: "First Name",
      accessor: "givenName",
    },
    {
      Header: "Last Name",
      accessor: "familyName",
    },
    {
      Header: "Email",
      accessor: "email",
    },
    {
      Header: "Admin",
      id: "admin",
      accessor: (row, _rowIndex) => String(row.admin), // hack needed for boolean values to show up
    },
    {
      Header: "Professor",
      id: "professor",
      accessor: (row, _rowIndex) => String(row.professor), // hack needed for boolean values to show up
    },
  ];
 
  const buttonColumn = [
    ...columns,
    ButtonColumn("Toggle Admin", "primary", toggleAdminCallback, "UsersTable"),
    ButtonColumn(
      "Toggle Professor",
      "success",
      toggleProfessorCallback,
      "UsersTable",
    ),
  ];
 
  return <OurTable data={users} columns={buttonColumn} testid={"UsersTable"} />;
}
  |