import { createRef, useCallback, useEffect, useState } from "react";
import { User } from "../network/models";
import { network } from "../network/network";
import showToast from "../components/toast";
import Loading from "../components/loading";
import { MdMoreHoriz, MdSearch } from "react-icons/md";
import Pagination from "../components/pagination";
import showPopup, { PopupMenuItem } from "../components/popup";
import { useTranslation } from "../utils/i18n";
import { app } from "../app";
import { ErrorAlert } from "../components/alert";
export default function UserView() {
const { t } = useTranslation();
const [searchKeyword, setSearchKeyword] = useState("");
const [page, setPage] = useState(1);
const [totalPages, setTotalPages] = useState(0);
if (!app.user) {
return (
);
}
if (!app.user?.is_admin) {
return (
);
}
return (
<>
{totalPages ? (
) : null}
>
);
}
function UserTable({
page,
searchKeyword,
totalPagesCallback,
}: {
page: number;
searchKeyword: string;
totalPagesCallback: (totalPages: number) => void;
}) {
const { t } = useTranslation();
const [users, setUsers] = useState(null);
const fetchUsers = useCallback(() => {
if (searchKeyword) {
network.searchUsers(searchKeyword, page).then((response) => {
if (response.success) {
setUsers(response.data!);
totalPagesCallback(response.totalPages!);
} else {
showToast({
type: "error",
message: response.message,
});
}
});
} else {
network.listUsers(page).then((response) => {
if (response.success) {
setUsers(response.data!);
totalPagesCallback(response.totalPages!);
} else {
showToast({
type: "error",
message: response.message,
});
}
});
}
}, [page, searchKeyword, totalPagesCallback]);
useEffect(() => {
fetchUsers();
}, [fetchUsers]);
const handleChanged = useCallback(async () => {
setUsers(null);
fetchUsers();
}, [fetchUsers]);
if (users === null) {
return ;
}
return (
{t("Username")} |
{t("Created At")} |
{t("Admin")} |
{t("Can Upload")} |
{t("Actions")} |
{users.map((u) => {
return ;
})}
);
}
function UserRow({ user, onChanged }: { user: User; onChanged: () => void }) {
const { t } = useTranslation();
const [isLoading, setIsLoading] = useState(false);
const buttonRef = createRef();
const handleDelete = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
const res = await network.deleteUser(user.id);
if (res.success) {
showToast({
type: "success",
message: t("User deleted successfully"),
});
onChanged();
} else {
showToast({
type: "error",
message: res.message,
});
}
setIsLoading(false);
};
const handleSetAdmin = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
const res = await network.setUserAdmin(user.id, true);
if (res.success) {
showToast({
type: "success",
message: t("User set as admin successfully"),
});
onChanged();
} else {
showToast({
type: "error",
message: res.message,
});
}
setIsLoading(false);
};
const handleSetUser = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
const res = await network.setUserAdmin(user.id, false);
if (res.success) {
showToast({
type: "success",
message: t("User set as user successfully"),
});
onChanged();
} else {
showToast({
type: "error",
message: res.message,
});
}
setIsLoading(false);
};
const handleSetUploadPermission = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
const res = await network.setUserUploadPermission(user.id, true);
if (res.success) {
showToast({
type: "success",
message: t("User set as upload permission successfully"),
});
onChanged();
} else {
showToast({
type: "error",
message: res.message,
});
}
setIsLoading(false);
};
const handleRemoveUploadPermission = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
const res = await network.setUserUploadPermission(user.id, false);
if (res.success) {
showToast({
type: "success",
message: t("User removed upload permission successfully"),
});
onChanged();
} else {
showToast({
type: "error",
message: res.message,
});
}
setIsLoading(false);
};
return (
{user.username} |
{new Date(user.created_at).toLocaleDateString()} |
{user.is_admin ? t("Yes") : t("No")} |
{user.can_upload ? t("Yes") : t("No")} |
|
);
}