// Next.js page to show all locations in the database with a link to the location page import { useSession } from "next-auth/react"; import { useEffect, useState, useRef, use } from "react"; // import { getSession } from 'next-auth/client' // import { NextAuth } from 'next-auth/client' import { Publisher, UserRole } from "@prisma/client"; import Layout from "../../../components/layout"; import PublisherCard from "../../../components/publisher/PublisherCard"; import axiosInstance from "../../../src/axiosSecure"; import axiosServer from '../../../src/axiosServer'; const common = require("../../../src/helpers/common"); import toast from "react-hot-toast"; import { levenshteinEditDistance } from "levenshtein-edit-distance"; import ProtectedRoute from '../../../components/protectedRoute'; import ConfirmationModal from '../../../components/ConfirmationModal'; import { relative } from "path"; interface IProps { initialItems: Publisher[]; } function PublishersPage({ publishers = [] }: IProps) { const [shownPubs, setShownPubs] = useState(publishers); const [filter, setFilter] = useState(""); const [filterIsImported, setFilterIsImported] = useState({ checked: false, indeterminate: true, }); const [showZeroShiftsOnly, setShowZeroShiftsOnly] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [isModalOpenDeleteAllVisible, setIsModalOpenDeleteAllVisible] = useState(false); const [isModalOpenDeleteAllAvaillabilities, setIsModalOpenDeleteAllAvaillabilities] = useState(false); const handleDeleteAllVisible = async () => { setIsDeleting(true); for (const publisher of shownPubs) { try { await axiosInstance.delete(`/api/data/publishers/${publisher.id}`); setShownPubs(shownPubs.filter(p => p.id !== publisher.id)); } catch (error) { console.log(JSON.stringify(error)); } } setIsDeleting(false); setIsModalOpenDeleteAllVisible(false); }; const handleDeleteAllAvailabilities = async () => { setIsDeleting(true); try { const today = new Date(); const targetDate = new Date(today.setDate(today.getDate() - 35)); await axiosInstance.post('/api/?action=deleteAllAvailabilities', { date: targetDate }); } catch (error) { console.error(JSON.stringify(error)); // Log the error } setIsDeleting(false); setIsModalOpenDeleteAllAvaillabilities(false); }; useEffect(() => { // const filteredPublishers = publishers.filter((publisher) => { // return publisher.firstName.toLowerCase().includes(filter.toLowerCase()) // || publisher.lastName.toLowerCase().includes(filter.toLowerCase()); // }); //name filter let filteredPublishersByName = publishers .filter((publisher) => { const fullName = publisher.firstName.toLowerCase() + " " + publisher.lastName.toLowerCase(); const distance = levenshteinEditDistance(fullName, filter.toLowerCase()); const lenDiff = Math.max(fullName.length, filter.length) - Math.min(fullName.length, filter.length); let similarity; if (distance === 0) { similarity = 1; // Exact match } else { similarity = 1 - (distance - lenDiff) / distance; } //console.log("distance: " + distance + "; lenDiff: " + lenDiff + " similarity: " + similarity + "; " + fullName + " =? " + filter + "") return similarity >= 0.95; }); // Email filter let filteredPublishersByEmail = publishers.filter(publisher => publisher.email.toLowerCase().includes(filter.toLowerCase()) ); // Combine name and email filters, removing duplicates let filteredPublishers = [...new Set([...filteredPublishersByName, ...filteredPublishersByEmail])]; // inactive publishers filter filteredPublishers = showZeroShiftsOnly ? filteredPublishers.filter(p => p.assignments.length === 0) : filteredPublishers; setShownPubs(filteredPublishers); }, [filter, showZeroShiftsOnly]); const checkboxRef = useRef(); const renderPublishers = () => { if (shownPubs.length === 0) { return (