import { useState } from "react"; import { useForm } from "react-hook-form"; import { faArrowDownAZ, faBorderAll, faCheck, faFolderOpen, faList, faMagnifyingGlass, faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useNavigate } from "@tanstack/react-router"; import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { OrgPermissionCan } from "@app/components/permissions"; import { Button, FormControl, IconButton, Input, Modal, ModalContent, Pagination, Skeleton, Tooltip } from "@app/components/v2"; import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; import { getProjectHomePage } from "@app/helpers/project"; import { getUserTablePreference, PreferenceKey, setUserTablePreference } from "@app/helpers/userTablePreferences"; import { useDebounce, usePagination, usePopUp, useResetPageHelper } from "@app/hooks"; import { useRequestProjectAccess, useSearchProjects } from "@app/hooks/api"; import { Workspace } from "@app/hooks/api/workspace/types"; type Props = { onAddNewProject: () => void; onUpgradePlan: () => void; isAddingProjectsAllowed: boolean; }; type RequestAccessModalProps = { projectId: string; onPopUpToggle: () => void; }; const RequestAccessModal = ({ projectId, onPopUpToggle }: RequestAccessModalProps) => { const form = useForm<{ note: string }>(); const requestProjectAccess = useRequestProjectAccess(); const onFormSubmit = ({ note }: { note: string }) => { if (requestProjectAccess.isPending) return; requestProjectAccess.mutate( { comment: note, projectId }, { onSuccess: () => { createNotification({ type: "success", title: "Project Access Request Sent", text: "Project admins will receive an email of your request" }); onPopUpToggle(); } } ); }; return (
); }; export const AllProjectView = ({ onAddNewProject, onUpgradePlan, isAddingProjectsAllowed }: Props) => { const navigate = useNavigate(); const [searchFilter, setSearchFilter] = useState(""); const [debouncedSearch] = useDebounce(searchFilter); const { setPage, perPage, setPerPage, page, offset, limit, toggleOrderDirection, orderDirection } = usePagination("name", { initPerPage: getUserTablePreference("allProjectsTable", PreferenceKey.PerPage, 50) }); const handlePerPageChange = (newPerPage: number) => { setPerPage(newPerPage); setUserTablePreference("allProjectsTable", PreferenceKey.PerPage, newPerPage); }; const { popUp, handlePopUpToggle, handlePopUpOpen } = usePopUp([ "requestAccessConfirmation" ] as const); const { data: searchedProjects, isPending: isProjectLoading } = useSearchProjects({ limit, offset, name: debouncedSearch || undefined, orderDirection }); useResetPageHelper({ setPage, offset, totalCount: searchedProjects?.totalCount || 0 }); const requestedWorkspaceDetails = (popUp.requestAccessConfirmation.data || {}) as Workspace; return (