import DeleteUserModal from "@/components/ModalContent/DeleteUserModal"; import NewUserModal from "@/components/ModalContent/NewUserModal"; import useUserStore from "@/store/admin/users"; import { User as U } from "@prisma/client"; import Link from "next/link"; import { useEffect, useState } from "react"; import { useTranslation } from "next-i18next"; import { GetServerSideProps } from "next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { useRouter } from "next/router"; import { i18n } from "next-i18next.config"; interface User extends U { subscriptions: { active: boolean; }; } type UserModal = { isOpen: boolean; userId: number | null; }; export default function Admin() { const { t } = useTranslation(); const router = useRouter(); const { users, setUsers } = useUserStore(); const [searchQuery, setSearchQuery] = useState(""); const [filteredUsers, setFilteredUsers] = useState(); const [deleteUserModal, setDeleteUserModal] = useState({ isOpen: false, userId: null, }); const [newUserModal, setNewUserModal] = useState(false); useEffect(() => { console.log(router); setUsers(); }, []); return (

{t("user_administration")}

{ setSearchQuery(e.target.value); if (users) { setFilteredUsers( users.filter((user) => JSON.stringify(user) .toLowerCase() .includes(e.target.value.toLowerCase()) ) ); } }} className="border border-neutral-content bg-base-200 focus:border-primary py-1 rounded-md pl-9 pr-2 w-full max-w-[15rem] md:w-[15rem] md:max-w-full duration-200 outline-none" />
setNewUserModal(true)} className="flex items-center btn btn-accent dark:border-violet-400 text-white btn-sm px-2 aspect-square relative" >
{filteredUsers && filteredUsers.length > 0 && searchQuery !== "" ? ( UserListing(filteredUsers, deleteUserModal, setDeleteUserModal) ) : searchQuery !== "" ? (

No users found with the given search query.

) : users && users.length > 0 ? ( UserListing(users, deleteUserModal, setDeleteUserModal) ) : (

No users found.

)} {newUserModal ? ( setNewUserModal(false)} /> ) : null}
); } const UserListing = ( users: User[], deleteUserModal: UserModal, setDeleteUserModal: Function ) => { return (
{process.env.NEXT_PUBLIC_EMAIL_PROVIDER === "true" && ( )} {process.env.NEXT_PUBLIC_STRIPE === "true" && } {users.map((user, index) => ( {process.env.NEXT_PUBLIC_EMAIL_PROVIDER === "true" && ( )} {process.env.NEXT_PUBLIC_STRIPE === "true" && ( )} ))}
UsernameEmailSubscribedCreated At
{index + 1} {user.username ? user.username : N/A}{user.email} {user.subscriptions?.active ? ( JSON.stringify(user.subscriptions?.active) ) : ( N/A )} {new Date(user.createdAt).toLocaleString()}
{deleteUserModal.isOpen && deleteUserModal.userId ? ( setDeleteUserModal({ isOpen: false, userId: null })} userId={deleteUserModal.userId} /> ) : null}
); }; // Take this into a separate file, it's for logged out users // For logged in users, we'll use their preferred language from the database (default: en) export const getServerSideProps: GetServerSideProps = async (ctx) => { console.log("CONTEXT", ctx); const acceptLanguageHeader = ctx.req.headers["accept-language"]; const availableLanguages = i18n.locales; console.log("ACCEPT LANGUAGE", acceptLanguageHeader); console.log("AVAILABLE LANGUAGES", availableLanguages); // Parse the accept-language header to get an array of languages const acceptedLanguages = acceptLanguageHeader ?.split(",") .map((lang) => lang.split(";")[0]); console.log(acceptedLanguages); // Find the best match between the accepted languages and available languages let bestMatch = acceptedLanguages?.find((lang) => availableLanguages.includes(lang) ); console.log(bestMatch); // If no direct match, find the best partial match if (!bestMatch) { acceptedLanguages?.some((acceptedLang) => { const partialMatch = availableLanguages.find((lang) => lang.startsWith(acceptedLang) ); if (partialMatch) { bestMatch = partialMatch; return true; } return false; }); } console.log("BEST MATCH", bestMatch); return { props: { ...(await serverSideTranslations(bestMatch ?? "en", ["common"])), }, }; };