import React, { useState, useMemo } from "react"; import { useDispatch } from "react-redux"; import { useSelector } from "store"; import { getUserApplicationsOrgs } from "selectors/applicationSelectors"; import { isPermitted, PERMISSION_TYPE } from "./permissionHelpers"; import { ReduxActionTypes } from "constants/ReduxActionConstants"; import { AppState } from "reducers"; import { Size } from "components/ads/Button"; import { StyledDialog, StyledRadioComponent, ForkButton, OrganizationList, ButtonWrapper, SpinnerWrapper, } from "./ForkModalStyles"; import Divider from "components/editorComponents/Divider"; import { getIsFetchingApplications } from "selectors/applicationSelectors"; import { useLocation } from "react-router"; import { getApplicationViewerPageURL } from "constants/routes"; import { getCurrentPageId } from "selectors/editorSelectors"; import Spinner from "components/ads/Spinner"; import { IconSize } from "components/ads/Icon"; type ForkApplicationModalProps = { applicationId: string; // if a trigger is passed // it renders that component trigger?: React.ReactNode; isModalOpen?: boolean; setModalClose?: (isOpen: boolean) => void; }; function ForkApplicationModal(props: ForkApplicationModalProps) { const { isModalOpen, setModalClose } = props; const [organizationId, selectOrganizationId] = useState(""); const dispatch = useDispatch(); const userOrgs = useSelector(getUserApplicationsOrgs); const forkingApplication = useSelector( (state: AppState) => state.ui.applications.forkingApplication, ); const isFetchingApplications = useSelector(getIsFetchingApplications); const currentPageId = useSelector(getCurrentPageId); const { pathname } = useLocation(); const showBasedOnURL = pathname === `${getApplicationViewerPageURL(props.applicationId, currentPageId)}/fork`; const forkApplication = () => { dispatch({ type: ReduxActionTypes.FORK_APPLICATION_INIT, payload: { applicationId: props.applicationId, organizationId, }, }); }; const organizationList = useMemo(() => { const filteredUserOrgs = userOrgs.filter((item) => { const permitted = isPermitted( item.organization.userPermissions ?? [], PERMISSION_TYPE.CREATE_APPLICATION, ); return permitted; }); if (filteredUserOrgs.length) { selectOrganizationId(filteredUserOrgs[0].organization.id); } return filteredUserOrgs.map((org) => { return { label: org.organization.name, value: org.organization.id, }; }); }, [userOrgs]); return ( {isFetchingApplications && ( )} {!isFetchingApplications && organizationList.length && ( selectOrganizationId(value)} options={organizationList} /> )} ); } export default ForkApplicationModal;