import type { ColumnDef, Table } from "@tanstack/react-table";
import {
Crown,
Mail,
MessagesSquare,
Paperclip,
Plus,
Search,
ShoppingBag,
Tags,
User,
UserCog,
X,
} from "lucide-react";
import Link from "next/link";
import { useRouter } from "next/router";
import { useRef, useState } from "react";
import toast from "react-hot-toast";
import { NotePopover } from "~/components/notePopover";
import { DataTable } from "~/components/ui/data-table";
import { DataTableColumnHeader } from "~/components/ui/dataTable-header";
import type {
PinnedFiltro,
SearchFiltro,
} from "~/components/ui/dataTable-toolbar";
import { UserAvatar } from "~/components/user_avatar";
import { MutationPageRestore } from "~/lib/tableUtils";
import { cn } from "~/lib/utils";
import type { Etichette } from "~/schemas/public/Etichette";
import type { UsersId } from "~/schemas/public/Users";
import type { UserWChatInfo } from "~/server/controllers/user.controller";
import { api } from "~/utils/api";
import { Etichetta } from "../etichette";
import { WhatsAppIcon2 } from "../svgs";
import { Button } from "../ui/button";
import {
ContextMenuContent,
ContextMenuItem,
ContextMenuLabel,
ContextMenuSeparator,
} from "../ui/context-menu";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "../ui/dialog";
import { Separator } from "../ui/separator";
export const UsersTable = (props: { data: UserWChatInfo[] }) => {
const router = useRouter();
const { mutateAsync: swap } = api.auth.swapUser.useMutation({
onSuccess: async () => {
toast.success("Utente cambiato con successo");
await router.push("/area-riservata/load-page");
},
});
const [selected, setSelected] = useState<{
id: UsersId;
etichette: Etichette[];
} | null>(null);
const { data } = props;
const tabledata = data.map((user) => {
return {
chatid: user.chatid,
created_at: user.created_at,
email: user.email,
telefono: user.telefono,
note: user.note,
id: user.id,
isAdmin: user.isAdmin ? "Admin" : "Utente",
isBlocked: user.isBlocked ? "Bloccato" : "Attivo",
username: user.username,
etichette: user.etichette,
};
});
const admin_options = [
{ label: "Admin", value: "Admin" },
{ label: "Utente", value: "Utente" },
];
const columns_titles = {
created_at: "Creato il",
email: "Email",
note: "Note",
telefono: "Telefono",
isAdmin: "Ruolo",
isBlocked: "Status",
username: "User",
etichette: "📎",
};
type Column = (typeof tabledata)[number];
const tableRef = useRef
| null>(null);
const utils = api.useUtils();
const { onMutate, onSettled } = MutationPageRestore(tableRef);
const { mutate, isPending } = api.users.editUser.useMutation({
onSuccess: async () => {
toast.success("Note aggiornate con successo");
await utils.users.invalidate();
},
onMutate,
onSettled,
onError: (error) => {
toast.error(error.message);
},
});
const columns: ColumnDef[] = [
{
accessorKey: "etichette",
header: ({ column }) => (
),
cell: ({ row }) => {
return (
{row.original.etichette.map((e) => (
))}
);
},
enableHiding: false,
enableSorting: false,
},
{
accessorKey: "username",
cell: ({ row }) => {
const user = row.original;
return (
{user.username}
);
},
enableHiding: false,
header: ({ column }) => (
),
},
{
accessorKey: "note",
cell: ({ row }) => {
const note = row.original.note;
return (
);
},
header: ({ column }) => (
),
enableSorting: false,
},
{
accessorKey: "telefono",
header: ({ column }) => (
),
},
{
accessorKey: "email",
header: ({ column }) => (
),
},
{
accessorKey: "created_at",
cell: ({ row }) => {
const date = row.getValue("created_at");
return new Date(date as Date).toLocaleDateString();
},
enableHiding: false,
header: ({ column }) => (
),
sortingFn: "datetime",
},
{
accessorKey: "isAdmin",
cell: ({ row }) => {
const isadmin = admin_options.find(
(status) => status.value === row.getValue("isAdmin"),
);
if (!isadmin) {
return null;
}
return (
{isadmin.value === "Admin" && }
{isadmin.label}
);
},
filterFn: (row, id, value) => {
return value.includes(row.getValue(id));
},
header: ({ column }) => (
),
},
{
accessorKey: "isBlocked",
filterFn: (row, id, value) => {
return value.includes(row.getValue(id));
},
header: ({ column }) => (
),
},
];
const pinnedFiltri: PinnedFiltro[] = [
{
columnName: "isAdmin",
options: [
{ label: "Admin", value: "Admin" },
{ label: "Utente", value: "Utente" },
],
title: "Ruolo",
},
{
columnName: "isBlocked",
options: [
{ label: "Bloccato", value: "Bloccato" },
{ label: "Attivo", value: "Attivo" },
],
title: "Status",
},
];
const searchFiltro: SearchFiltro = {
columnName: null,
placeholder: "Cerca...",
};
return (
(
{data.username}
Ricerca
Comunicazioni
Profilo
Ordini
Allegati
Chat
WhatsApp
)}
data={tabledata}
defaultColumnVisibility={{
created_at: true,
email: true,
telefono: true,
isAdmin: true,
isBlocked: false,
username: true,
}}
defaultSort={[{ desc: true, id: "created_at" }]}
onTableInit={(t) => (tableRef.current = t)}
pinnedFiltri={pinnedFiltri}
searchColumn={searchFiltro}
withContextMenu={true}
/>
);
};
const UsersEtichetteModal = ({
selected,
setSelected,
}: {
selected: { id: UsersId; etichette: Etichette[] } | null;
setSelected: React.Dispatch<
React.SetStateAction<{ id: UsersId; etichette: Etichette[] } | null>
>;
}) => {
const utils = api.useUtils();
const { data: etichette } = api.etichette.getAllEtichette.useQuery();
const { mutate: addEtichetta } = api.etichette.addUserEtichetta.useMutation({
onSuccess: async () => {
toast.success("Etichetta aggiunta con successo");
await utils.etichette.getAllEtichette.invalidate();
await utils.users.getUsersWChatInfo.invalidate();
},
onError: () => {
toast.error("Errore nell'aggiunta dell'etichetta");
},
});
const { mutate: removeEtichetta } =
api.etichette.removeUserEtichetta.useMutation({
onSuccess: async () => {
toast.success("Etichetta rimossa con successo");
await utils.etichette.getAllEtichette.invalidate();
await utils.users.getUsersWChatInfo.invalidate();
},
onError: () => {
toast.error("Errore nella rimozione dell'etichetta");
},
});
return (
);
};