refactor: migrate flow handling hooks and clean up component code (#5024)
* ✨ (use-post-add-flow.ts): Add useGetRefreshFlows hook to refresh flows after adding a new flow ♻️ (use-add-flow.ts): Remove unnecessary refreshFlows hook and refactor code to use useGetRefreshFlows hook instead 📝 (dropdown/index.tsx): Update import paths for useDuplicateFlows and useSelectOptionsChange hooks 📝 (grid/index.tsx): Update import path for useDescriptionModal hook and remove commented out code related to playground functionality ✨ (MainPage): Add new hooks for handling duplicate flows, selecting all flows, changing select options, and managing selected flows 📝 (MainPage): Update import path for useDescriptionModal hook to correct location 🔧 (MainPage): Remove unused code related to playground functionality in ListComponent 🔧 (use-handle-duplicate.tsx): Remove unused file use-handle-duplicate.tsx 🔧 (componentsComponent/index.tsx): Remove unused imports and function call for useDuplicateFlows 📝 (homePage/index.tsx): Add console log to log data.flows for debugging purposes * 📝 (dropdown/index.tsx): refactor useDuplicateFlows hook to accept an object with named parameters for better readability and maintainability 📝 (use-handle-duplicate.tsx): update useDuplicateFlows hook to accept an object with named parameters for better readability and maintainability 📝 (componentsComponent/index.tsx): remove import of useDuplicateFlows hook as it is no longer used in the file 📝 (homePage/index.tsx): remove console.log statement for data.flows in the HomePage component * ✨ (FlowMenu/index.tsx): Add useGetRefreshFlowsQuery to fetch and refresh flows data when folders are fetched ♻️ (use-get-flow.ts): Refactor useGetFlow to include queryClient for refetching queries on settled response ✨ (use-get-refresh-flows-query.ts): Introduce useGetRefreshFlowsQuery to fetch and process flows data with query options 🔧 (use-post-add-flow.ts): Update usePostAddFlow to use queryClient for refetching queries instead of refreshFlows 🔧 (use-get-folders.ts): Update useGetFoldersQuery to remove unnecessary refreshFlows call and use queryClient for refetching queries 🔧 (use-upload-flow.ts): Remove unnecessary refreshFlows call from useUploadFlow to improve flow data handling 🔧 (FlowPage/index.tsx): Remove unused imports and variables for better code cleanliness and maintainability 🔧 (ViewPage/index.tsx): Remove unused imports and variables for better code cleanliness and maintainability * 🔧 (twoEdges.spec.ts): remove unnecessary click on "input-inspection-retriever" element to improve test clarity and efficiency
This commit is contained in:
parent
5145b7496c
commit
3f027396d3
20 changed files with 196 additions and 261 deletions
|
|
@ -19,6 +19,7 @@ import {
|
|||
} from "@/components/ui/dropdown-menu";
|
||||
import { UPLOAD_ERROR_ALERT } from "@/constants/alerts_constants";
|
||||
import { SAVED_HOVER } from "@/constants/constants";
|
||||
import { useGetRefreshFlowsQuery } from "@/controllers/API/queries/flows/use-get-refresh-flows-query";
|
||||
import { useGetFoldersQuery } from "@/controllers/API/queries/folders/use-get-folders";
|
||||
import ExportModal from "@/modals/exportModal";
|
||||
import FlowLogsModal from "@/modals/flowLogsModal";
|
||||
|
|
@ -53,7 +54,16 @@ export const MenuBar = ({}: {}): JSX.Element => {
|
|||
const onFlowPage = useFlowStore((state) => state.onFlowPage);
|
||||
const setCurrentFlow = useFlowsManagerStore((state) => state.setCurrentFlow);
|
||||
const stopBuilding = useFlowStore((state) => state.stopBuilding);
|
||||
const { data: folders } = useGetFoldersQuery();
|
||||
|
||||
const { data: folders, isFetched: isFoldersFetched } = useGetFoldersQuery();
|
||||
|
||||
useGetRefreshFlowsQuery(
|
||||
{
|
||||
get_all: true,
|
||||
header_flows: true,
|
||||
},
|
||||
{ enabled: isFoldersFetched },
|
||||
);
|
||||
|
||||
const currentFolder = useMemo(
|
||||
() => folders?.find((f) => f.id === currentFlow?.folder_id),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { useMutationFunctionType } from "@/types/api";
|
||||
import { FlowType } from "@/types/flow";
|
||||
import { processFlows } from "@/utils/reactflowUtils";
|
||||
import { useQueryClient } from "@tanstack/react-query";
|
||||
import { api } from "../../api";
|
||||
import { getURL } from "../../helpers/constants";
|
||||
import { UseRequestProcessor } from "../../services/request-processor";
|
||||
|
|
@ -14,6 +15,7 @@ export const useGetFlow: useMutationFunctionType<undefined, IGetFlow> = (
|
|||
options,
|
||||
) => {
|
||||
const { mutate } = UseRequestProcessor();
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const getFlowFn = async (payload: IGetFlow): Promise<FlowType> => {
|
||||
const response = await api.get<FlowType>(
|
||||
|
|
@ -25,7 +27,19 @@ export const useGetFlow: useMutationFunctionType<undefined, IGetFlow> = (
|
|||
return flows[0];
|
||||
};
|
||||
|
||||
const mutation = mutate(["useGetFlow"], getFlowFn, options);
|
||||
const mutation = mutate(["useGetFlow"], getFlowFn, {
|
||||
...options,
|
||||
onSettled: (response) => {
|
||||
if (response) {
|
||||
queryClient.refetchQueries({
|
||||
queryKey: [
|
||||
"useGetRefreshFlowsQuery",
|
||||
{ get_all: true, header_flows: true },
|
||||
],
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return mutation;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,91 @@
|
|||
import buildQueryStringUrl from "@/controllers/utils/create-query-param-string";
|
||||
import useAlertStore from "@/stores/alertStore";
|
||||
import useFlowsManagerStore from "@/stores/flowsManagerStore";
|
||||
import { useTypesStore } from "@/stores/typesStore";
|
||||
import { useQueryFunctionType } from "@/types/api";
|
||||
import { FlowType, PaginatedFlowsType } from "@/types/flow";
|
||||
import {
|
||||
extractFieldsFromComponenents,
|
||||
processFlows,
|
||||
} from "@/utils/reactflowUtils";
|
||||
import { UseQueryOptions } from "@tanstack/react-query";
|
||||
import { api } from "../../api";
|
||||
import { getURL } from "../../helpers/constants";
|
||||
import { UseRequestProcessor } from "../../services/request-processor";
|
||||
|
||||
interface GetFlowsParams {
|
||||
components_only?: boolean;
|
||||
get_all?: boolean;
|
||||
header_flows?: boolean;
|
||||
folder_id?: string;
|
||||
remove_example_flows?: boolean;
|
||||
page?: number;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
const addQueryParams = (url: string, params: GetFlowsParams): string => {
|
||||
return buildQueryStringUrl(url, params);
|
||||
};
|
||||
|
||||
export const useGetRefreshFlowsQuery: useQueryFunctionType<
|
||||
GetFlowsParams,
|
||||
FlowType[] | PaginatedFlowsType
|
||||
> = (params, options) => {
|
||||
const { query } = UseRequestProcessor();
|
||||
const setFlows = useFlowsManagerStore((state) => state.setFlows);
|
||||
const setErrorData = useAlertStore((state) => state.setErrorData);
|
||||
|
||||
const getFlowsFn = async (
|
||||
params: GetFlowsParams,
|
||||
): Promise<FlowType[] | PaginatedFlowsType> => {
|
||||
try {
|
||||
const url = addQueryParams(`${getURL("FLOWS")}/`, params);
|
||||
const { data: dbDataFlows } = await api.get<FlowType[]>(url);
|
||||
|
||||
if (params.components_only) {
|
||||
return dbDataFlows;
|
||||
}
|
||||
|
||||
const { data: dbDataComponents } = await api.get<FlowType[]>(
|
||||
addQueryParams(`${getURL("FLOWS")}/`, {
|
||||
components_only: true,
|
||||
get_all: true,
|
||||
}),
|
||||
);
|
||||
|
||||
if (dbDataComponents) {
|
||||
const { data } = processFlows(dbDataComponents);
|
||||
useTypesStore.setState((state) => ({
|
||||
data: { ...state.data, ["saved_components"]: data },
|
||||
ComponentFields: extractFieldsFromComponenents({
|
||||
...state.data,
|
||||
["saved_components"]: data,
|
||||
}),
|
||||
}));
|
||||
}
|
||||
|
||||
if (dbDataFlows) {
|
||||
const flows = Array.isArray(dbDataFlows)
|
||||
? dbDataFlows
|
||||
: (dbDataFlows as { items: FlowType[] }).items;
|
||||
setFlows(flows);
|
||||
return flows;
|
||||
}
|
||||
|
||||
return [];
|
||||
} catch (e) {
|
||||
setErrorData({
|
||||
title: "Could not load flows from database",
|
||||
});
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
const queryResult = query(
|
||||
["useGetRefreshFlowsQuery", params],
|
||||
() => getFlowsFn(params || {}),
|
||||
options as UseQueryOptions,
|
||||
);
|
||||
|
||||
return queryResult;
|
||||
};
|
||||
|
|
@ -35,7 +35,6 @@ export const usePostAddFlow: useMutationFunctionType<
|
|||
gradient: payload.gradient || null,
|
||||
endpoint_name: payload.endpoint_name || null,
|
||||
});
|
||||
|
||||
return response.data;
|
||||
};
|
||||
|
||||
|
|
@ -45,9 +44,18 @@ export const usePostAddFlow: useMutationFunctionType<
|
|||
{
|
||||
...options,
|
||||
onSettled: (response) => {
|
||||
queryClient.refetchQueries({
|
||||
queryKey: ["useGetFolder", response.folder_id ?? myCollectionId],
|
||||
});
|
||||
if (response) {
|
||||
queryClient.refetchQueries({
|
||||
queryKey: [
|
||||
"useGetRefreshFlowsQuery",
|
||||
{ get_all: true, header_flows: true },
|
||||
],
|
||||
});
|
||||
|
||||
queryClient.refetchQueries({
|
||||
queryKey: ["useGetFolder", response.folder_id ?? myCollectionId],
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -2,19 +2,16 @@ import { DEFAULT_FOLDER } from "@/constants/constants";
|
|||
import { FolderType } from "@/pages/MainPage/entities";
|
||||
import useAuthStore from "@/stores/authStore";
|
||||
import { useFolderStore } from "@/stores/foldersStore";
|
||||
import { useTypesStore } from "@/stores/typesStore";
|
||||
import { useQueryFunctionType } from "@/types/api";
|
||||
import { api } from "../../api";
|
||||
import { getURL } from "../../helpers/constants";
|
||||
import { UseRequestProcessor } from "../../services/request-processor";
|
||||
import { useGetRefreshFlows } from "../flows/use-get-refresh-flows";
|
||||
|
||||
export const useGetFoldersQuery: useQueryFunctionType<
|
||||
undefined,
|
||||
FolderType[]
|
||||
> = (options) => {
|
||||
const { query } = UseRequestProcessor();
|
||||
const { mutateAsync: refreshFlows } = useGetRefreshFlows();
|
||||
|
||||
const setMyCollectionId = useFolderStore((state) => state.setMyCollectionId);
|
||||
const setFolders = useFolderStore((state) => state.setFolders);
|
||||
|
|
@ -29,9 +26,6 @@ export const useGetFoldersQuery: useQueryFunctionType<
|
|||
const myCollectionId = data?.find((f) => f.name === DEFAULT_FOLDER)?.id;
|
||||
setMyCollectionId(myCollectionId);
|
||||
setFolders(data);
|
||||
const { types } = useTypesStore.getState();
|
||||
|
||||
await refreshFlows({ get_all: true, header_flows: true });
|
||||
|
||||
return data;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ const useAddFlow = () => {
|
|||
const myCollectionId = useFolderStore((state) => state.myCollectionId);
|
||||
|
||||
const { mutate: postAddFlow } = usePostAddFlow();
|
||||
const { mutate: refreshFlows } = useGetRefreshFlows();
|
||||
|
||||
const addFlow = async (params?: {
|
||||
flow?: FlowType;
|
||||
|
|
@ -57,8 +56,6 @@ const useAddFlow = () => {
|
|||
);
|
||||
});
|
||||
// Create a new flow with a default name if no flow is provided.
|
||||
const folder_id = folderId ?? myCollectionId ?? "";
|
||||
|
||||
if (params?.override && flow) {
|
||||
const flowId = flows?.find((f) => f.name === flow.name);
|
||||
if (flowId) {
|
||||
|
|
@ -66,12 +63,11 @@ const useAddFlow = () => {
|
|||
}
|
||||
}
|
||||
|
||||
const folder_id = folderId ?? myCollectionId ?? "";
|
||||
const flowsToCheckNames = flows?.filter(
|
||||
(f) => f.folder_id === myCollectionId,
|
||||
);
|
||||
|
||||
const newFlow = createNewFlow(flowData!, folder_id, flow);
|
||||
|
||||
const newName = addVersionToDuplicates(newFlow, flowsToCheckNames ?? []);
|
||||
newFlow.name = newName;
|
||||
newFlow.folder_id = folder_id;
|
||||
|
|
@ -92,11 +88,6 @@ const useAddFlow = () => {
|
|||
}),
|
||||
}));
|
||||
|
||||
refreshFlows({
|
||||
get_all: true,
|
||||
header_flows: true,
|
||||
});
|
||||
|
||||
setFlowToCanvas(createdFlow);
|
||||
resolve(createdFlow.id);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ const useUploadFlow = () => {
|
|||
throw new Error("Invalid flow data");
|
||||
}
|
||||
}
|
||||
await refreshFlows({ get_all: true, header_flows: true });
|
||||
}
|
||||
} catch (e) {
|
||||
throw e;
|
||||
|
|
|
|||
|
|
@ -1,16 +1,13 @@
|
|||
import { SidebarProvider } from "@/components/ui/sidebar";
|
||||
import { useGetFlow } from "@/controllers/API/queries/flows/use-get-flow";
|
||||
import { useGetRefreshFlows } from "@/controllers/API/queries/flows/use-get-refresh-flows";
|
||||
import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate";
|
||||
import useSaveFlow from "@/hooks/flows/use-save-flow";
|
||||
import { useIsMobile } from "@/hooks/use-mobile";
|
||||
import { SaveChangesModal } from "@/modals/saveChangesModal";
|
||||
import useAlertStore from "@/stores/alertStore";
|
||||
import { useTypesStore } from "@/stores/typesStore";
|
||||
import { customStringify } from "@/utils/reactflowUtils";
|
||||
import { useEffect } from "react";
|
||||
import { useBlocker, useParams } from "react-router-dom";
|
||||
import { useDarkStore } from "../../stores/darkStore";
|
||||
import useFlowStore from "../../stores/flowStore";
|
||||
import useFlowsManagerStore from "../../stores/flowsManagerStore";
|
||||
import Page from "./components/PageComponent";
|
||||
|
|
@ -29,7 +26,6 @@ export default function FlowPage({ view }: { view?: boolean }): JSX.Element {
|
|||
const isBuilding = useFlowStore((state) => state.isBuilding);
|
||||
const blocker = useBlocker(changesNotSaved || isBuilding);
|
||||
|
||||
const version = useDarkStore((state) => state.version);
|
||||
const setOnFlowPage = useFlowStore((state) => state.setOnFlowPage);
|
||||
const { id } = useParams();
|
||||
const navigate = useCustomNavigate();
|
||||
|
|
@ -40,10 +36,6 @@ export default function FlowPage({ view }: { view?: boolean }): JSX.Element {
|
|||
|
||||
const flowToCanvas = useFlowsManagerStore((state) => state.flowToCanvas);
|
||||
|
||||
const { mutateAsync: refreshFlows } = useGetRefreshFlows();
|
||||
const setIsLoading = useFlowsManagerStore((state) => state.setIsLoading);
|
||||
const types = useTypesStore((state) => state.types);
|
||||
|
||||
const updatedAt = currentSavedFlow?.updated_at;
|
||||
const autoSaving = useFlowsManagerStore((state) => state.autoSaving);
|
||||
const stopBuilding = useFlowStore((state) => state.stopBuilding);
|
||||
|
|
@ -114,10 +106,6 @@ export default function FlowPage({ view }: { view?: boolean }): JSX.Element {
|
|||
flowToCanvas
|
||||
? setCurrentFlow(flowToCanvas)
|
||||
: getFlowToAddToCanvas(isAnExistingFlowId);
|
||||
} else if (!flows) {
|
||||
setIsLoading(true);
|
||||
await refreshFlows({ get_all: true, header_flows: true });
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
awaitgetTypes();
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
|
|||
import useAlertStore from "@/stores/alertStore";
|
||||
import { FlowType } from "@/types/flow";
|
||||
import { downloadFlow } from "@/utils/reactflowUtils";
|
||||
import useDuplicateFlows from "../../oldComponents/componentsComponent/hooks/use-handle-duplicate";
|
||||
import useSelectOptionsChange from "../../oldComponents/componentsComponent/hooks/use-select-options-change";
|
||||
import useDuplicateFlows from "../../hooks/use-handle-duplicate";
|
||||
import useSelectOptionsChange from "../../hooks/use-select-options-change";
|
||||
|
||||
type DropdownComponentProps = {
|
||||
flowData: FlowType;
|
||||
|
|
@ -15,20 +15,15 @@ type DropdownComponentProps = {
|
|||
const DropdownComponent = ({
|
||||
flowData,
|
||||
setOpenDelete,
|
||||
handlePlaygroundClick,
|
||||
}: DropdownComponentProps) => {
|
||||
const setSuccessData = useAlertStore((state) => state.setSuccessData);
|
||||
const setErrorData = useAlertStore((state) => state.setErrorData);
|
||||
|
||||
const { handleDuplicate } = useDuplicateFlows(
|
||||
[flowData.id],
|
||||
[flowData],
|
||||
() => {},
|
||||
const { handleDuplicate } = useDuplicateFlows({
|
||||
selectedFlowsComponentsCards: [flowData.id],
|
||||
allFlows: [flowData],
|
||||
setSuccessData,
|
||||
() => {},
|
||||
() => {},
|
||||
"flow",
|
||||
);
|
||||
});
|
||||
|
||||
const handleExport = () => {
|
||||
downloadFlow(flowData, flowData.name, flowData.description);
|
||||
|
|
@ -45,30 +40,6 @@ const DropdownComponent = ({
|
|||
|
||||
return (
|
||||
<>
|
||||
{/* <DropdownMenuItem onClick={() => {}} className="cursor-pointer">
|
||||
<ForwardedIconComponent
|
||||
name="square-pen"
|
||||
aria-hidden="true"
|
||||
className="mr-2 h-4 w-4"
|
||||
/>
|
||||
Edit details
|
||||
</DropdownMenuItem> */}
|
||||
{/* {handlePlaygroundClick && (
|
||||
<DropdownMenuItem
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
handlePlaygroundClick();
|
||||
}}
|
||||
className="cursor-pointer sm:hidden"
|
||||
>
|
||||
<ForwardedIconComponent
|
||||
name="play"
|
||||
aria-hidden="true"
|
||||
className="mr-2 h-4 w-4"
|
||||
/>
|
||||
Playground
|
||||
</DropdownMenuItem>
|
||||
)} */}
|
||||
<DropdownMenuItem
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
|
|
|
|||
|
|
@ -18,21 +18,19 @@ import { swatchColors } from "@/utils/styleUtils";
|
|||
import { cn, getNumberFromString } from "@/utils/utils";
|
||||
import { useState } from "react";
|
||||
import { useParams } from "react-router-dom";
|
||||
import useDescriptionModal from "../../oldComponents/componentsComponent/hooks/use-description-modal";
|
||||
import useDescriptionModal from "../../hooks/use-description-modal";
|
||||
import { useGetTemplateStyle } from "../../utils/get-template-style";
|
||||
import { timeElapsed } from "../../utils/time-elapse";
|
||||
import DropdownComponent from "../dropdown";
|
||||
|
||||
const GridComponent = ({ flowData }: { flowData: FlowType }) => {
|
||||
const navigate = useCustomNavigate();
|
||||
/* const [openPlayground, setOpenPlayground] = useState(false);
|
||||
const [loadingPlayground, setLoadingPlayground] = useState(false); */
|
||||
|
||||
const [openDelete, setOpenDelete] = useState(false);
|
||||
const setSuccessData = useAlertStore((state) => state.setSuccessData);
|
||||
const { deleteFlow } = useDeleteFlow();
|
||||
|
||||
const setErrorData = useAlertStore((state) => state.setErrorData);
|
||||
/* const setCurrentFlow = useFlowsManagerStore((state) => state.setCurrentFlow); */
|
||||
const { folderId } = useParams();
|
||||
const isComponent = flowData.is_component ?? false;
|
||||
const setFlowToCanvas = useFlowsManagerStore(
|
||||
|
|
@ -43,38 +41,6 @@ const GridComponent = ({ flowData }: { flowData: FlowType }) => {
|
|||
|
||||
const editFlowLink = `/flow/${flowData.id}${folderId ? `/folder/${folderId}` : ""}`;
|
||||
|
||||
function hasPlayground(flow?: FlowType) {
|
||||
if (!flow) {
|
||||
return false;
|
||||
}
|
||||
const { inputs, outputs } = getInputsAndOutputs(flow?.data?.nodes ?? []);
|
||||
return inputs.length > 0 || outputs.length > 0;
|
||||
}
|
||||
|
||||
/* const handlePlaygroundClick = () => {
|
||||
track("Playground Button Clicked", { flowId: flowData.id });
|
||||
setLoadingPlayground(true);
|
||||
|
||||
if (flowData) {
|
||||
if (!hasPlayground(flowData)) {
|
||||
setErrorData({
|
||||
title: "Error",
|
||||
list: ["This flow doesn't have a playground."],
|
||||
});
|
||||
setLoadingPlayground(false);
|
||||
return;
|
||||
}
|
||||
setCurrentFlow(flowData);
|
||||
// setOpenPlayground(true);
|
||||
setLoadingPlayground(false);
|
||||
} else {
|
||||
setErrorData({
|
||||
title: "Error",
|
||||
list: ["Error getting flow data."],
|
||||
});
|
||||
}
|
||||
}; */
|
||||
|
||||
const handleClick = async () => {
|
||||
if (!isComponent) {
|
||||
await setFlowToCanvas(flowData);
|
||||
|
|
@ -167,35 +133,8 @@ const GridComponent = ({ flowData }: { flowData: FlowType }) => {
|
|||
<div className="line-clamp-2 h-full pt-5 text-sm text-primary">
|
||||
{flowData.description}
|
||||
</div>
|
||||
|
||||
{/* <div className="flex justify-end pt-[24px]">
|
||||
{flowData.is_component ? (
|
||||
<></>
|
||||
) : (
|
||||
<Button
|
||||
disabled={loadingPlayground || !hasPlayground(flowData)}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
handlePlaygroundClick();
|
||||
}}
|
||||
variant="outline"
|
||||
>
|
||||
Playground
|
||||
</Button>
|
||||
)}
|
||||
</div> */}
|
||||
</Card>
|
||||
{/* {openPlayground && (
|
||||
<IOModal
|
||||
key={flowData.id}
|
||||
cleanOnClose={true}
|
||||
open={openPlayground}
|
||||
setOpen={setOpenPlayground}
|
||||
>
|
||||
<></>
|
||||
</IOModal>
|
||||
)} */}
|
||||
|
||||
{openDelete && (
|
||||
<DeleteConfirmationModal
|
||||
open={openDelete}
|
||||
|
|
|
|||
|
|
@ -17,20 +17,18 @@ import { swatchColors } from "@/utils/styleUtils";
|
|||
import { cn, getNumberFromString } from "@/utils/utils";
|
||||
import { useState } from "react";
|
||||
import { useParams } from "react-router-dom";
|
||||
import useDescriptionModal from "../../oldComponents/componentsComponent/hooks/use-description-modal";
|
||||
import useDescriptionModal from "../../hooks/use-description-modal";
|
||||
import { useGetTemplateStyle } from "../../utils/get-template-style";
|
||||
import { timeElapsed } from "../../utils/time-elapse";
|
||||
import DropdownComponent from "../dropdown";
|
||||
|
||||
const ListComponent = ({ flowData }: { flowData: FlowType }) => {
|
||||
const navigate = useCustomNavigate();
|
||||
/* const [openPlayground, setOpenPlayground] = useState(false);
|
||||
const [loadingPlayground, setLoadingPlayground] = useState(false); */
|
||||
|
||||
const [openDelete, setOpenDelete] = useState(false);
|
||||
const setSuccessData = useAlertStore((state) => state.setSuccessData);
|
||||
const { deleteFlow } = useDeleteFlow();
|
||||
const setErrorData = useAlertStore((state) => state.setErrorData);
|
||||
/* const setCurrentFlow = useFlowsManagerStore((state) => state.setCurrentFlow); */
|
||||
const { folderId } = useParams();
|
||||
const isComponent = flowData.is_component ?? false;
|
||||
const setFlowToCanvas = useFlowsManagerStore(
|
||||
|
|
@ -40,38 +38,6 @@ const ListComponent = ({ flowData }: { flowData: FlowType }) => {
|
|||
|
||||
const editFlowLink = `/flow/${flowData.id}${folderId ? `/folder/${folderId}` : ""}`;
|
||||
|
||||
/* function hasPlayground(flow?: FlowType) {
|
||||
if (!flow) {
|
||||
return false;
|
||||
}
|
||||
const { inputs, outputs } = getInputsAndOutputs(flow?.data?.nodes ?? []);
|
||||
return inputs.length > 0 || outputs.length > 0;
|
||||
} */
|
||||
|
||||
/* const handlePlaygroundClick = () => {
|
||||
track("Playground Button Clicked", { flowId: flowData.id });
|
||||
setLoadingPlayground(true);
|
||||
|
||||
if (flowData) {
|
||||
if (!hasPlayground(flowData)) {
|
||||
setErrorData({
|
||||
title: "Error",
|
||||
list: ["This flow doesn't have a playground."],
|
||||
});
|
||||
setLoadingPlayground(false);
|
||||
return;
|
||||
}
|
||||
setCurrentFlow(flowData);
|
||||
setOpenPlayground(true);
|
||||
setLoadingPlayground(false);
|
||||
} else {
|
||||
setErrorData({
|
||||
title: "Error",
|
||||
list: ["Error getting flow data."],
|
||||
});
|
||||
}
|
||||
}; */
|
||||
|
||||
const handleClick = async () => {
|
||||
if (!isComponent) {
|
||||
await setFlowToCanvas(flowData);
|
||||
|
|
@ -155,22 +121,6 @@ const ListComponent = ({ flowData }: { flowData: FlowType }) => {
|
|||
|
||||
{/* right side */}
|
||||
<div className="ml-5 flex items-center gap-2">
|
||||
{/* {flowData.is_component ? (
|
||||
<></>
|
||||
) : (
|
||||
<Button
|
||||
variant="outline"
|
||||
disabled={loadingPlayground || !hasPlayground(flowData)}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
handlePlaygroundClick();
|
||||
}}
|
||||
className="hidden sm:block"
|
||||
>
|
||||
Playground
|
||||
</Button>
|
||||
)} */}
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button
|
||||
|
|
@ -202,16 +152,7 @@ const ListComponent = ({ flowData }: { flowData: FlowType }) => {
|
|||
</DropdownMenu>
|
||||
</div>
|
||||
</Card>
|
||||
{/* {openPlayground && (
|
||||
<IOModal
|
||||
key={flowData.id}
|
||||
cleanOnClose={true}
|
||||
open={openPlayground}
|
||||
setOpen={setOpenPlayground}
|
||||
>
|
||||
<></>
|
||||
</IOModal>
|
||||
)} */}
|
||||
|
||||
{openDelete && (
|
||||
<DeleteConfirmationModal
|
||||
open={openDelete}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import cloneDeep from "lodash/cloneDeep";
|
||||
import { useEffect } from "react";
|
||||
import { FlowType } from "../../../../../types/flow";
|
||||
import { FlowType } from "../../../types/flow";
|
||||
|
||||
const useFilteredFlows = (
|
||||
flowsFromFolder: FlowType[],
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
import { usePostAddFlow } from "@/controllers/API/queries/flows/use-post-add-flow";
|
||||
import { useFolderStore } from "@/stores/foldersStore";
|
||||
import { addVersionToDuplicates, createNewFlow } from "@/utils/reactflowUtils";
|
||||
import { useParams } from "react-router-dom";
|
||||
|
||||
type UseDuplicateFlowsParams = {
|
||||
selectedFlowsComponentsCards: string[];
|
||||
allFlows: any[];
|
||||
setSuccessData: (data: { title: string }) => void;
|
||||
};
|
||||
|
||||
const useDuplicateFlows = ({
|
||||
selectedFlowsComponentsCards,
|
||||
allFlows,
|
||||
setSuccessData,
|
||||
}: UseDuplicateFlowsParams) => {
|
||||
const { mutateAsync: postAddFlow } = usePostAddFlow();
|
||||
const { folderId } = useParams();
|
||||
const myCollectionId = useFolderStore((state) => state.myCollectionId);
|
||||
|
||||
const handleDuplicate = async () => {
|
||||
selectedFlowsComponentsCards.map(async (selectedFlow) => {
|
||||
const currentFlow = allFlows.find((flow) => flow.id === selectedFlow);
|
||||
const folder_id = folderId ?? myCollectionId ?? "";
|
||||
|
||||
const flowsToCheckNames = allFlows?.filter(
|
||||
(f) => f.folder_id === folder_id,
|
||||
);
|
||||
|
||||
const newFlow = createNewFlow(currentFlow.data, folder_id, currentFlow);
|
||||
|
||||
const newName = addVersionToDuplicates(newFlow, flowsToCheckNames ?? []);
|
||||
newFlow.name = newName;
|
||||
newFlow.folder_id = folder_id;
|
||||
|
||||
await postAddFlow(newFlow);
|
||||
setSuccessData({
|
||||
title: `${newFlow.is_component ? "Component" : "Flow"} duplicated successfully`,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
return { handleDuplicate };
|
||||
};
|
||||
|
||||
export default useDuplicateFlows;
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
import { useCallback } from "react";
|
||||
import { FlowType } from "../../../../../types/flow";
|
||||
import { FlowType } from "../../../types/flow";
|
||||
|
||||
const useSelectAll = (
|
||||
flowsFromFolder: FlowType[],
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
import useAddFlow from "@/hooks/flows/use-add-flow";
|
||||
import { useCallback } from "react";
|
||||
|
||||
const useDuplicateFlows = (
|
||||
selectedFlowsComponentsCards: string[],
|
||||
allFlows: any[],
|
||||
resetFilter: () => void,
|
||||
setSuccessData: (data: { title: string }) => void,
|
||||
setSelectedFlowsComponentsCards: (
|
||||
selectedFlowsComponentsCards: string[],
|
||||
) => void,
|
||||
handleSelectAll: (select: boolean) => void,
|
||||
cardTypes: string,
|
||||
) => {
|
||||
const addFlow = useAddFlow();
|
||||
const handleDuplicate = useCallback(() => {
|
||||
Promise.all(
|
||||
selectedFlowsComponentsCards.map((selectedFlow) =>
|
||||
addFlow({ flow: allFlows.find((flow) => flow.id === selectedFlow) }),
|
||||
),
|
||||
).then(() => {
|
||||
resetFilter();
|
||||
setSuccessData({ title: `${cardTypes} duplicated successfully` });
|
||||
setSelectedFlowsComponentsCards([]);
|
||||
handleSelectAll(false);
|
||||
});
|
||||
}, [
|
||||
selectedFlowsComponentsCards,
|
||||
addFlow,
|
||||
allFlows,
|
||||
resetFilter,
|
||||
setSuccessData,
|
||||
setSelectedFlowsComponentsCards,
|
||||
handleSelectAll,
|
||||
cardTypes,
|
||||
]);
|
||||
|
||||
return { handleDuplicate };
|
||||
};
|
||||
|
||||
export default useDuplicateFlows;
|
||||
|
|
@ -16,15 +16,14 @@ import { FlowType } from "../../../../types/flow";
|
|||
import useFileDrop from "../../hooks/use-on-file-drop";
|
||||
import { getNameByType } from "../../utils/get-name-by-type";
|
||||
|
||||
import useDescriptionModal from "../../hooks/use-description-modal";
|
||||
import useFilteredFlows from "../../hooks/use-filtered-flows";
|
||||
import useSelectAll from "../../hooks/use-handle-select-all";
|
||||
import useSelectOptionsChange from "../../hooks/use-select-options-change";
|
||||
import useSelectedFlows from "../../hooks/use-selected-flows";
|
||||
import EmptyComponent from "../emptyComponent";
|
||||
import HeaderComponent from "../headerComponent";
|
||||
import CollectionCard from "./components/collectionCard";
|
||||
import useDescriptionModal from "./hooks/use-description-modal";
|
||||
import useFilteredFlows from "./hooks/use-filtered-flows";
|
||||
import useDuplicateFlows from "./hooks/use-handle-duplicate";
|
||||
import useSelectAll from "./hooks/use-handle-select-all";
|
||||
import useSelectOptionsChange from "./hooks/use-select-options-change";
|
||||
import useSelectedFlows from "./hooks/use-selected-flows";
|
||||
|
||||
export default function ComponentsComponent({
|
||||
type = "all",
|
||||
|
|
@ -106,15 +105,7 @@ export default function ComponentsComponent({
|
|||
setValue,
|
||||
);
|
||||
|
||||
const { handleDuplicate } = useDuplicateFlows(
|
||||
selectedFlowsComponentsCards,
|
||||
flowsFromFolder,
|
||||
resetFilter,
|
||||
setSuccessData,
|
||||
setSelectedFlowsComponentsCards,
|
||||
handleSelectAll,
|
||||
cardTypes,
|
||||
);
|
||||
const handleDuplicate = () => {};
|
||||
|
||||
const { mutate: mutateDownloadMultipleFlows } =
|
||||
usePostDownloadMultipleFlows();
|
||||
|
|
|
|||
|
|
@ -14,9 +14,6 @@ export default function ViewPage() {
|
|||
|
||||
const flows = useFlowsManagerStore((state) => state.flows);
|
||||
const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId);
|
||||
const { mutateAsync: refreshFlows } = useGetRefreshFlows();
|
||||
const setIsLoading = useFlowsManagerStore((state) => state.setIsLoading);
|
||||
const types = useTypesStore((state) => state.types);
|
||||
|
||||
// Set flow tab id
|
||||
useEffect(() => {
|
||||
|
|
@ -30,10 +27,6 @@ export default function ViewPage() {
|
|||
}
|
||||
|
||||
setCurrentFlow(isAnExistingFlow);
|
||||
} else if (!flows) {
|
||||
setIsLoading(true);
|
||||
await refreshFlows({ get_all: true, header_flows: true });
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
awaitgetTypes();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue