samling 0.13.1

App for managing apparel collections
Documentation
import { useLocalize } from "../../../i18n";
import { t } from "@lingui/macro";
import { useGroupSummaries, useUserList } from "../../../api";
import Breadcrumbs from "../../../components/nav/Breadcrumbs";
import ApiError from "../errors/ApiError";
import Loading from "../../../components/Loading";
import { GroupSummary, Role, User, UserSortOrder } from "../../../types/api";
import UsersTable from "../../../components/admin/UsersTable";
import { Dispatch, SetStateAction, useMemo, useState } from "react";
import { useTitle } from "../../../hooks";

export default function AdminUsersPage() {
  useTitle([t`Admin`, t`Users`]);

  const [userSortBy, setUserSortBy] = useState(UserSortOrder.NameAsc);
  const [userRolesFilter, setUserRolesFilter] = useState([] as Role[]);
  const [userGroupsFilter, setUserGroupsFilter] = useState(
    [] as GroupSummary[],
  );

  const [groupsResult] = useGroupSummaries();
  const userFilters = useMemo(
    () => ({
      roles: userRolesFilter,
      groups: userGroupsFilter.length === 0 ? null : userGroupsFilter.map((g) => ({ id: g.id })),
    }),
    [userRolesFilter, userGroupsFilter],
  );
  const [usersResult, refreshUsers] = useUserList(userSortBy, userFilters);
  const [allUsersResult] = useUserList(userSortBy);

  if (groupsResult.isErr()) {
    return <ApiError error={groupsResult.unwrapErr()} />;
  }

  if (usersResult.isErr()) {
    return <ApiError error={usersResult.unwrapErr()} />;
  }

  const groups = groupsResult.unwrap();
  const users = usersResult.unwrap();
  const allUsers = allUsersResult.unwrap();

  if (groups === null || users === null || allUsers === null) {
    return <Loading />;
  } else {
    return (
      <AdminUsersInner
        groups={groups}
        users={users}
        allUsers={allUsers}
        refreshUsers={refreshUsers}
        userSortBy={userSortBy}
        setUserSortBy={setUserSortBy}
        userRolesFilter={userRolesFilter}
        setUserRolesFilter={setUserRolesFilter}
        userGroupsFilter={userGroupsFilter}
        setUserGroupsFilter={setUserGroupsFilter}
      />
    );
  }
}

interface AdminUsersInnerProps {
  groups: GroupSummary[];
  users: User[];
  allUsers: User[];
  refreshUsers: () => void;
  userSortBy: UserSortOrder;
  setUserSortBy: Dispatch<SetStateAction<UserSortOrder>>;
  userRolesFilter: Role[];
  setUserRolesFilter: Dispatch<SetStateAction<Role[]>>;
  userGroupsFilter: GroupSummary[];
  setUserGroupsFilter: Dispatch<SetStateAction<GroupSummary[]>>;
}

export function AdminUsersInner({
  groups,
  users,
  allUsers,
  refreshUsers,
  userSortBy,
  setUserSortBy,
  userRolesFilter,
  setUserRolesFilter,
  userGroupsFilter,
  setUserGroupsFilter,
}: AdminUsersInnerProps) {
  const { i18nLink } = useLocalize();
  const breadcrumbItems = [
    { title: t`Admin`, to: i18nLink("/app/admin"), current: false },
    { title: t`Users`, to: i18nLink("/app/admin/users"), current: true },
  ];

  return (
    <>
      <Breadcrumbs items={breadcrumbItems} />
      <div className="px-4 sm:px-6 lg:px-8">
        <UsersTable
          allUsers={allUsers}
          users={users}
          refreshUsers={refreshUsers}
          sortBy={userSortBy}
          setSortBy={setUserSortBy}
          roles={userRolesFilter}
          setRoles={setUserRolesFilter}
          groups={userGroupsFilter}
          setGroups={setUserGroupsFilter}
          allGroups={groups}
        />
      </div>
    </>
  );
}