diff --git a/app/src/components/Home/components/ApiClientCard/apiClientCard.scss b/app/src/components/Home/components/ApiClientCard/apiClientCard.scss deleted file mode 100644 index bd97411fed..0000000000 --- a/app/src/components/Home/components/ApiClientCard/apiClientCard.scss +++ /dev/null @@ -1,25 +0,0 @@ -.history-card { - .middle-section { - .list { - .list-item { - align-items: center; - } - } - } -} - -.new-request-cta { - height: 100%; - width: 100%; - line-height: 20px; - font-size: var(--requestly-font-size-md, 14px); - font-weight: 500; - display: flex; - align-items: center; - justify-content: center; - svg { - width: 20px; - height: 20px; - margin-right: 8px; - } -} diff --git a/app/src/components/Home/components/ApiClientCard/index.tsx b/app/src/components/Home/components/ApiClientCard/index.tsx deleted file mode 100644 index eb755be85e..0000000000 --- a/app/src/components/Home/components/ApiClientCard/index.tsx +++ /dev/null @@ -1,201 +0,0 @@ -import { useFeatureIsOn } from "@growthbook/growthbook-react"; -import { CgStack } from "@react-icons/all-files/cg/CgStack"; -import { MdHorizontalSplit } from "@react-icons/all-files/md/MdHorizontalSplit"; -import { MdOutlineKeyboardArrowDown } from "@react-icons/all-files/md/MdOutlineKeyboardArrowDown"; -import { MdOutlineSyncAlt } from "@react-icons/all-files/md/MdOutlineSyncAlt"; -import { SiOpenapiinitiative } from "@react-icons/all-files/si/SiOpenapiinitiative"; -import { MenuProps } from "antd"; -import DropdownButton from "antd/lib/dropdown/dropdown-button"; -import { trackHomeApisActionClicked } from "components/Home/analytics"; -import { useTabs } from "componentsV2/Tabs/slice"; -import PATHS from "config/constants/sub/paths"; -import { ApiClientImporterType, CreateType } from "features/apiClient/types"; -import { RoleBasedComponent, useRBAC } from "features/rbac"; -import { RQButton, RQTooltip } from "lib/design-system-v2/components"; -import { isEmpty } from "lodash"; -import { useCallback, useMemo } from "react"; -import { useSelector } from "react-redux"; -import { useNavigate } from "react-router-dom"; -import { getUserAuthDetails } from "store/slices/global/user/selectors"; -import Postman from "../../../../assets/img/brand/postman-icon.svg?react"; -import { Card } from "../Card"; -import { CardListItem, CardType } from "../Card/types"; -import { PRODUCT_FEATURES } from "../EmptyCard/staticData"; -import "./apiClientCard.scss"; -import { getOptions } from "./utils"; - -interface CardOptions { - bodyTitle: string; - contentList: CardListItem[]; -} - -const ApiClientCard = () => { - const navigate = useNavigate(); - const user = useSelector(getUserAuthDetails); - const isLoggedIn = user?.details?.isLoggedIn; - const tabs = useTabs(); - const cardOptions = useMemo( - () => (!isEmpty(tabs) ? getOptions(tabs) : null), - [tabs] - ); - const { validatePermission } = useRBAC(); - const { isValidPermission } = validatePermission("api_client_request", "create"); - const isOpenApiSupportEnabled = useFeatureIsOn("openapi-import-support"); - - const createNewHandler = useCallback( - (type: CreateType) => { - navigate(PATHS.API_CLIENT.ABSOLUTE as string, { state: { action: "create", type } }); - trackHomeApisActionClicked(`new_${type}_clicked`); - }, - [navigate] - ); - - const importTriggerHandler = useCallback( - (modal: ApiClientImporterType) => { - navigate(PATHS.API_CLIENT.ABSOLUTE as string, { state: { modal } }); - trackHomeApisActionClicked(`${modal.toLowerCase()}_importer_clicked`); - }, - [navigate] - ); - - const items: MenuProps["items"] = [ - { - icon: , - label: "Collection", - key: "1", - onClick: () => createNewHandler(CreateType.COLLECTION), - }, - { - icon: , - label: "Environment", - key: "2", - onClick: () => createNewHandler(CreateType.ENVIRONMENT), - }, - { - type: "divider", - }, - { - key: "3", - label: "Import cURL Request", - icon: , - onClick: () => importTriggerHandler(ApiClientImporterType.CURL), - }, - ]; - - const IMPORT_OPTIONS = [ - { - key: "1", - label: "Postman", - icon: , - onClick: () => importTriggerHandler(ApiClientImporterType.POSTMAN), - }, - { - key: "2", - label: "Bruno", - icon: Bruno, - onClick: () => importTriggerHandler(ApiClientImporterType.BRUNO), - }, - { - key: "3", - label: "cURL", - icon: , - onClick: () => importTriggerHandler(ApiClientImporterType.CURL), - }, - { - key: "4", - hidden: !isOpenApiSupportEnabled, - label: "OpenAPI", - icon: , - onClick: () => importTriggerHandler(ApiClientImporterType.OPENAPI), - }, - { - key: "5", - label: "Requestly", - icon: Requestly, - onClick: () => importTriggerHandler(ApiClientImporterType.REQUESTLY), - }, - ]; - - const actionButtons = ( - - } - overlayClassName="more-options" - onClick={() => { - createNewHandler(CreateType.API); - }} - menu={{ items }} - trigger={["click"]} - > - {"New request"} - - - ); - - return ( - { - if (item.url) { - navigate(item.url as string); - trackHomeApisActionClicked("recent_tab_clicked"); - } - }} - actionButtons={actionButtons} - viewAllCta={"View all APIs"} - viewAllCtaLink={PATHS.API_CLIENT.ABSOLUTE as string} - viewAllCtaOnClick={() => trackHomeApisActionClicked("view_all_apis")} - emptyCardOptions={{ - ...PRODUCT_FEATURES.API_CLIENT, - primaryAction: ( - { - navigate(PATHS.API_CLIENT.ABSOLUTE as string); - }} - > - View requests - - } - > - { - createNewHandler(CreateType.API); - }} - > - New request - - - ), - }} - /> - ); -}; - -export default ApiClientCard; diff --git a/app/src/components/Home/components/ApiClientCard/types.ts b/app/src/components/Home/components/ApiClientCard/types.ts deleted file mode 100644 index 3c147ae57a..0000000000 --- a/app/src/components/Home/components/ApiClientCard/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum FormatType { - TABS = "TABS", - HISTORY = "HISTORY", -} diff --git a/app/src/components/Home/components/ApiClientCard/utils.tsx b/app/src/components/Home/components/ApiClientCard/utils.tsx deleted file mode 100644 index 305b84140d..0000000000 --- a/app/src/components/Home/components/ApiClientCard/utils.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { TabState } from "componentsV2/Tabs/slice/types"; -import { AbstractTabSource } from "componentsV2/Tabs/helpers/tabSource"; -import { CardListItem } from "../Card/types"; - -const formatContentList = (list: TabState[]) => { - return list.map((tabState): CardListItem => { - const tabSource = tabState.source as AbstractTabSource; - return { - id: tabSource.metadata.id, - title: tabSource.metadata.title, - icon: tabSource.getIcon(), - url: tabSource.getUrlPath(), - type: tabSource.type, - }; - }); -}; - -export const getOptions = (list: TabState[]) => { - const bodyTitle = "Recent Tabs"; - const contentList = formatContentList(list); - return { bodyTitle, contentList }; -}; diff --git a/app/src/components/Home/index.tsx b/app/src/components/Home/index.tsx index cb5ab8a99b..9ed97f380e 100644 --- a/app/src/components/Home/index.tsx +++ b/app/src/components/Home/index.tsx @@ -6,7 +6,6 @@ import UserAvatar from "../../assets/images/illustrations/avatar.svg?react"; import { APIMockingCard } from "./components/APIMockingCard"; import { RulesCard } from "./components/RulesCard"; import { HomeScreenProvider } from "./contexts"; -import ApiClientCard from "./components/ApiClientCard"; import "./home.scss"; export const Home: React.FC = () => { @@ -25,7 +24,6 @@ export const Home: React.FC = () => { - diff --git a/app/src/components/features/mocksV2/MockEditorIndex/Editor/Header/index.tsx b/app/src/components/features/mocksV2/MockEditorIndex/Editor/Header/index.tsx index c6016e73d7..dd0a96d4a9 100644 --- a/app/src/components/features/mocksV2/MockEditorIndex/Editor/Header/index.tsx +++ b/app/src/components/features/mocksV2/MockEditorIndex/Editor/Header/index.tsx @@ -1,12 +1,10 @@ import React, { useState } from "react"; import { Row, Layout, Col, Tooltip, Dropdown, Menu, Button } from "antd"; -import { ExperimentOutlined, LockOutlined, UnlockOutlined } from "@ant-design/icons"; +import { LockOutlined, UnlockOutlined } from "@ant-design/icons"; import { RQBreadcrumb, RQButton } from "lib/design-system-v2/components"; import { MockType } from "components/features/mocksV2/types"; import "./index.css"; import { trackMockEditorClosed, trackMockPasswordGenerateClicked } from "modules/analytics/events/features/mocksV2"; -import { isFeatureCompatible } from "utils/CompatibilityUtils"; -import FEATURES from "config/constants/sub/features"; import { useLocation } from "react-router-dom"; import PasswordPopup from "./PasswordPopup/PasswordPopup"; import { Conditional } from "components/common/Conditional"; @@ -20,7 +18,6 @@ interface HeaderProps { savingInProgress: boolean; handleClose: Function; handleSave: () => void; - handleTest: () => void; setPassword: (password: string) => void; password: string; isEditorReadOnly: boolean; @@ -32,7 +29,6 @@ export const MockEditorHeader: React.FC = ({ savingInProgress, handleClose, handleSave, - handleTest, setPassword, password, isEditorReadOnly, @@ -116,15 +112,6 @@ export const MockEditorHeader: React.FC = ({ - {!isNewMock && isFeatureCompatible(FEATURES.API_CLIENT) && ( - } - onClick={handleTest} - type={isEditorReadOnly ? "primary" : "secondary"} - > - Test - - )} { diff --git a/app/src/components/features/mocksV2/MockEditorIndex/Editor/index.tsx b/app/src/components/features/mocksV2/MockEditorIndex/Editor/index.tsx index 16a3b21ed8..e74a8ebb1d 100644 --- a/app/src/components/features/mocksV2/MockEditorIndex/Editor/index.tsx +++ b/app/src/components/features/mocksV2/MockEditorIndex/Editor/index.tsx @@ -8,21 +8,16 @@ import { MockEditorHeader } from "./Header"; import { Tabs } from "antd"; import APP_CONSTANTS from "config/constants"; import React, { ReactNode, useState, useMemo, useCallback, useEffect, useRef } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import { getUserAuthDetails } from "store/slices/global/user/selectors"; +import { useDispatch } from "react-redux"; import { toast } from "utils/Toast"; import { FileType, MockType, RQMockCollection } from "../../types"; import type { TabsProps } from "antd"; -import { generateFinalUrl } from "../../utils"; import { requestMethodDropdownOptions } from "../constants"; import { MockEditorDataSchema, RequestMethod, ValidationErrors } from "../types"; import { cleanupEndpoint, getEditorLanguage, validateEndpoint, validateHeaders, validateStatusCode } from "../utils"; import "./index.css"; -import { trackMockEditorOpened, trackTestMockClicked } from "modules/analytics/events/features/mocksV2"; -import { APIClientModal, APIClientRequest } from "features/apiClient/components/common/APIClient"; +import { trackMockEditorOpened } from "modules/analytics/events/features/mocksV2"; import MockEditorEndpoint from "./Endpoint"; -import { trackRQDesktopLastActivity, trackRQLastActivity } from "utils/AnalyticsUtils"; -import { MOCKSV2 } from "modules/analytics/events/features/constants"; import { EditorLanguage } from "componentsV2/CodeEditor"; import { BottomSheetLayout, BottomSheetProvider } from "componentsV2/BottomSheet"; import MockLogs from "./BottomSheet/MockLogs"; @@ -30,7 +25,6 @@ import { BottomSheetFeatureContext, SheetLayout } from "componentsV2/BottomSheet import { useFeatureValue } from "@growthbook/growthbook-react"; import { ExportMocksModalWrapper } from "features/mocks/modals"; import { globalActions } from "store/slices/global/slice"; -import { getActiveWorkspaceId } from "store/slices/workspaces/selectors"; import Editor from "componentsV2/CodeEditor"; interface Props { @@ -59,10 +53,6 @@ const MockEditor: React.FC = ({ mockType, }) => { const dispatch = useDispatch(); - const user = useSelector(getUserAuthDetails); - const username = user?.details?.username; - - const activeWorkspaceId = useSelector(getActiveWorkspaceId); const areLogsVisible = useFeatureValue("mock_logs", false); @@ -87,30 +77,8 @@ const MockEditor: React.FC = ({ headers: null, }); - const [isTestModalOpen, setIsTestModalOpen] = useState(false); - const collectionPath = mockCollectionData?.path ?? ""; - const finalUrl = useMemo( - () => - generateFinalUrl({ - endpoint, - uid: user?.details?.profile?.uid, - username, - teamId: activeWorkspaceId, - password, - collectionPath, - }), - [endpoint, activeWorkspaceId, user?.details?.profile?.uid, username, password, collectionPath] - ); - - const apiRequest = useMemo(() => { - return { - url: finalUrl, - method, - }; - }, [finalUrl, method]); - //editor fields ref const endpointRef = useRef(null); const statusCodeRef = useRef(null); @@ -236,13 +204,6 @@ const MockEditor: React.FC = ({ } }, [onSave, errors, createMockEditorData, validateMockEditorData, id, dispatch]); - const handleTest = useCallback(() => { - setIsTestModalOpen(true); - trackTestMockClicked(); - trackRQLastActivity(MOCKSV2.TEST_MOCK_CLICKED); - trackRQDesktopLastActivity(MOCKSV2.TEST_MOCK_CLICKED); - }, []); - const onNameChange = (name: string) => { setName(name); }; @@ -458,7 +419,6 @@ const MockEditor: React.FC = ({ savingInProgress={savingInProgress} handleClose={onClose} handleSave={handleOnSave} - handleTest={handleTest} setPassword={setPassword} password={password} isEditorReadOnly={isEditorReadOnly} @@ -491,14 +451,6 @@ const MockEditor: React.FC = ({ - {!isNew ? ( - setIsTestModalOpen(false)} - /> - ) : null} ) : ( @@ -509,7 +461,6 @@ const MockEditor: React.FC = ({ savingInProgress={savingInProgress} handleClose={onClose} handleSave={handleOnSave} - handleTest={handleTest} setPassword={setPassword} password={password} isEditorReadOnly={isEditorReadOnly} @@ -536,14 +487,6 @@ const MockEditor: React.FC = ({ - {!isNew ? ( - setIsTestModalOpen(false)} - /> - ) : null} )} diff --git a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/ContextMenu/index.tsx b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/ContextMenu/index.tsx index 891b26e1b8..4c1cb1ee55 100644 --- a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/ContextMenu/index.tsx +++ b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/ContextMenu/index.tsx @@ -12,7 +12,6 @@ import { } from "modules/analytics/events/desktopApp"; import { trackWalkthroughCompleted } from "modules/analytics/events/misc/productWalkthrough"; import FEATURES from "config/constants/sub/features"; -import { isFeatureCompatible } from "utils/CompatibilityUtils"; import { getLogResponseById } from "store/features/desktop-traffic-table/selectors"; import "./index.css"; import { trackRQDesktopLastActivity } from "utils/AnalyticsUtils"; @@ -26,10 +25,9 @@ import { RQNetworkLog } from "../../../TrafficExporter/harLogs/types"; interface ContextMenuProps { log: RQNetworkLog; children: ReactNode; - onReplayRequest: () => void; } -export const ContextMenu: React.FC = ({ children, log, onReplayRequest }) => { +export const ContextMenu: React.FC = ({ children, log }) => { const dispatch = useDispatch(); const isTrafficTableTourCompleted = useSelector(getIsTrafficTableTourCompleted); const selectedRequestResponse = useSelector(getLogResponseById(log?.id)) || log?.response?.body; @@ -149,24 +147,12 @@ export const ContextMenu: React.FC = ({ children, log, onRepla }, ]; - if (isFeatureCompatible(FEATURES.API_CLIENT)) { - menuItems.splice(2, 0, { - key: "replay_request", - label: "Edit and Replay", - onClick: () => { - trackTrafficTableDropdownClicked("replay_request"); - trackRQDesktopLastActivity(TRAFFIC_TABLE.TRAFFIC_TABLE_REQUEST_DROPDOWN_CLICKED); - onReplayRequest(); - }, - }); - } - if (!log.requestShellCurl) { menuItems.splice(0, 1); } return menuItems; - }, [log, onReplayRequest, handleOnClick, isLocalSyncEnabled]); + }, [log, handleOnClick, isLocalSyncEnabled]); const handleDropdownOpenChange = (open: boolean) => { if (open) { diff --git a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/VirtualTableV2.tsx b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/VirtualTableV2.tsx index d75ac1ab9d..8151732a6a 100644 --- a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/VirtualTableV2.tsx +++ b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/VirtualTableV2.tsx @@ -14,10 +14,9 @@ interface Props { header: React.ReactNode; renderLogRow: any; selectedRowData: RQNetworkLog | null; - onReplayRequest: () => void; } -const VirtualTableV2: React.FC = ({ logs = [], header, renderLogRow, selectedRowData, onReplayRequest }) => { +const VirtualTableV2: React.FC = ({ logs = [], header, renderLogRow, selectedRowData }) => { const [selected, setSelected] = useState(null); const [lastKnownBottomIndex, setLastKnownBottomIndex] = useState(null); const [isScrollToBottomEnabled, setIsScrollToBottomEnabled] = useState(true); @@ -155,7 +154,7 @@ const VirtualTableV2: React.FC = ({ logs = [], header, renderLogRow, sele onContextMenu={(e: any) => setSelected(e.target?.parentElement.id)} > {header} - + {/* Hack to fix alternate colors flickering due to virtualization*/} {items[0]?.index % 2 === 0 ? null : } diff --git a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/index.tsx b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/index.tsx index e9c06b0bf1..0a83a2147f 100644 --- a/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/index.tsx +++ b/app/src/components/mode-specific/desktop/InterceptTraffic/WebTraffic/TrafficTableV2/NetworkInspector/NetworkTable/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { globalActions } from "store/slices/global/slice"; import { getIsTrafficTableTourCompleted, getIsConnectedAppsTourCompleted } from "store/selectors"; @@ -9,14 +9,12 @@ import AppliedRules from "../../Tables/columns/AppliedRules"; import { ProductWalkthrough } from "components/misc/ProductWalkthrough"; import FEATURES from "config/constants/sub/features"; import VirtualTableV2 from "./VirtualTableV2"; -import { APIClientRequest } from "features/apiClient/components/common/APIClient"; import { RQNetworkLog } from "../../../TrafficExporter/harLogs/types"; import { Checkbox, Typography } from "antd"; import { trackMockResponsesRequestsSelected } from "modules/analytics/events/features/sessionRecording/mockResponseFromSession"; import { REQUEST_METHOD_COLORS, RequestMethod } from "../../../../../../../../constants/requestMethodColors"; import "./index.scss"; import { TOUR_TYPES } from "components/misc/ProductWalkthrough/types"; -import { APIClientModal } from "features/apiClient/components/common/APIClient"; export const ITEM_SIZE = 32; @@ -38,29 +36,9 @@ const NetworkTable: React.FC = ({ selectedMockRequests, }) => { const [selectedRowData, setSelectedRowData] = useState(null); - const [isReplayRequestModalOpen, setIsReplayRequestModalOpen] = useState(false); const dispatch = useDispatch(); const isTrafficTableTourCompleted = useSelector(getIsTrafficTableTourCompleted); const isConnectedAppsTourCompleted = useSelector(getIsConnectedAppsTourCompleted); - const apiClientRequestForSelectedRowRef = useRef(null); - - const onReplayRequest = useCallback(() => { - if (!selectedRowData) { - return; - } - apiClientRequestForSelectedRowRef.current = { - url: selectedRowData.url, - headers: selectedRowData.request.headers, - method: selectedRowData.request.method, - body: selectedRowData.request.body, - }; - setIsReplayRequestModalOpen(true); - }, [selectedRowData]); - - const onReplayRequestModalClose = useCallback(() => { - apiClientRequestForSelectedRowRef.current = null; - setIsReplayRequestModalOpen(false); - }, []); const columns = useMemo( () => [ @@ -270,16 +248,8 @@ const NetworkTable: React.FC = ({ renderLogRow={renderLogRow} logs={logs} selectedRowData={selectedRowData} - onReplayRequest={onReplayRequest} /> - {isReplayRequestModalOpen ? ( - - ) : null} ); }; diff --git a/app/src/componentsV2/modals/CreateWorkspaceModalOld/CreateWorkspaceModalOld.tsx b/app/src/componentsV2/modals/CreateWorkspaceModalOld/CreateWorkspaceModalOld.tsx index c2ec8a5be2..795e2afed7 100644 --- a/app/src/componentsV2/modals/CreateWorkspaceModalOld/CreateWorkspaceModalOld.tsx +++ b/app/src/componentsV2/modals/CreateWorkspaceModalOld/CreateWorkspaceModalOld.tsx @@ -1,14 +1,11 @@ import React, { useCallback, useState } from "react"; -import { Checkbox, Input, Modal, Radio, Tag } from "antd"; +import { Checkbox, Input, Modal, Radio } from "antd"; import { useDispatch, useSelector } from "react-redux"; import * as Sentry from "@sentry/react"; import { getAppMode } from "store/selectors"; import { RQButton } from "lib/design-system-v2/components"; -import { CreateTeamParams, LocalWorkspaceConfig, SharedOrPrivateWorkspaceConfig } from "types"; -import { displayFolderSelector } from "components/mode-specific/desktop/misc/FileDialogButton"; -import { CONSTANTS as GLOBAL_CONSTANTS } from "@requestly/requestly-core"; -import { IoMdClose } from "@react-icons/all-files/io/IoMdClose"; +import { CreateTeamParams, SharedOrPrivateWorkspaceConfig } from "types"; import { getFunctions, httpsCallable } from "firebase/functions"; import { trackAddTeamMemberSuccess, @@ -24,10 +21,8 @@ import { switchWorkspace } from "actions/TeamWorkspaceActions"; import { redirectToTeam } from "utils/RedirectionUtils"; import { useNavigate } from "react-router-dom"; import { getAvailableBillingTeams } from "store/features/billing/selectors"; -import { createWorkspaceFolder } from "services/fsManagerServiceAdapter"; import { isActiveWorkspaceShared } from "store/slices/workspaces/selectors"; -import { workspaceActions } from "store/slices/workspaces/slice"; -import { Workspace, WorkspaceMemberRole, WorkspaceType } from "features/workspaces/types"; +import { WorkspaceType } from "features/workspaces/types"; import "./createOldWorkspaceModal.scss"; interface Props { @@ -45,17 +40,10 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp const isSharedWorkspaceMode = useSelector(isActiveWorkspaceShared); const billingTeams = useSelector(getAvailableBillingTeams); const [workspaceName, setWorkspaceName] = useState(""); - const [workspaceType, setWorkspaceType] = useState( - defaultWorkspaceType || (user.loggedIn ? WorkspaceType.SHARED : WorkspaceType.LOCAL) - ); - const [folderPath, setFolderPath] = useState(""); + const [workspaceType, setWorkspaceType] = useState(defaultWorkspaceType || WorkspaceType.SHARED); const [isLoading, setIsLoading] = useState(false); const [isNotifyAllSelected, setIsNotifyAllSelected] = useState(false); - const folderSelectCallback = (path: string) => { - setFolderPath(path); - }; - const handlePostTeamCreationStep = useCallback( (teamId: string, newTeamName: string, hasMembersInSameDomain: boolean) => { switchWorkspace( @@ -138,43 +126,15 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp const createOrgTeamInvite = httpsCallable(functions, "invites-createOrganizationTeamInvite"); const upsertTeamCommonInvite = httpsCallable(functions, "invites-upsertTeamCommonInvite"); - const config = - workspaceType === WorkspaceType.LOCAL - ? ({ type: WorkspaceType.LOCAL, rootPath: folderPath } as LocalWorkspaceConfig) - : ({ type: WorkspaceType.SHARED } as SharedOrPrivateWorkspaceConfig); + const config = { type: WorkspaceType.SHARED } as SharedOrPrivateWorkspaceConfig; try { const teamId = await (async () => { - if (config.type === WorkspaceType.LOCAL) { - const workspaceCreationResult = await createWorkspaceFolder(workspaceName, config.rootPath); - if (workspaceCreationResult.type === "error") { - throw new Error(workspaceCreationResult.error.message); - } - const partialWorkspace = workspaceCreationResult.content; - const localWorkspace: Workspace = { - id: partialWorkspace.id, - name: partialWorkspace.name, - owner: user?.details?.profile?.uid, - accessCount: 1, - adminCount: 1, - members: { - [user?.details?.profile?.uid]: { - role: WorkspaceMemberRole.admin, - }, - }, - appsumo: null, - workspaceType: WorkspaceType.LOCAL, - rootPath: partialWorkspace.path, - }; - dispatch(workspaceActions.upsertWorkspace(localWorkspace)); - return partialWorkspace.id; - } else { - const response: any = await createTeam({ - teamName: workspaceName, - config, - }); - return response.data.teamId; - } + const response: any = await createTeam({ + teamName: workspaceName, + config, + }); + return response.data.teamId; })(); trackNewTeamCreateSuccess(teamId, workspaceName, "create_workspace_modal", workspaceType); @@ -216,7 +176,6 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp }, [ billingTeams, callback, - dispatch, isNotifyAllSelected, toggleModal, user?.details?.profile?.email, @@ -224,8 +183,6 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp handlePostTeamCreationStep, handleDomainInvitesCreation, workspaceType, - folderPath, - user?.details?.profile?.uid, ]); return ( @@ -245,7 +202,7 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp Cancel @@ -300,45 +257,6 @@ export const CreateWorkspaceModalOld: React.FC = ({ isOpen, defaultWorksp ), }, - { - value: WorkspaceType.LOCAL, - disabled: appMode !== GLOBAL_CONSTANTS.APP_MODES.DESKTOP, - label: ( -
-
- Local workspace BETA -
-
- In a Local Workspace, your files are stored on your device. Currently, only API client files are - supported. -
- {workspaceType === WorkspaceType.LOCAL ? ( -
- {folderPath.length ? ( -
-
- SELECTED LOCATION setFolderPath("")} /> -
-
{folderPath}
-
- ) : ( - <> - displayFolderSelector(folderSelectCallback)} - > - Select a folder - -
A location to store your workspace data.
- - )} -
- ) : null} -
- ), - }, ]} > diff --git a/app/src/features/onboarding/components/recommendations/components/recommendations/personaRecommendationData.tsx b/app/src/features/onboarding/components/recommendations/components/recommendations/personaRecommendationData.tsx index 20dd8fa6ad..eb6cd7cb14 100644 --- a/app/src/features/onboarding/components/recommendations/components/recommendations/personaRecommendationData.tsx +++ b/app/src/features/onboarding/components/recommendations/components/recommendations/personaRecommendationData.tsx @@ -5,7 +5,6 @@ import { FeatureSection, FeatureReleaseTag } from "./types"; import { CONSTANTS as GLOBAL_CONSTANTS } from "@requestly/requestly-core"; import { FiVideo } from "@react-icons/all-files/fi/FiVideo"; import { IoDocumentTextOutline } from "@react-icons/all-files/io5/IoDocumentTextOutline"; -import { ApiOutlined } from "@ant-design/icons"; const { RULE_TYPES } = GLOBAL_CONSTANTS; const { RULE_TYPES_CONFIG } = APP_CONSTANTS; @@ -76,13 +75,6 @@ export const personaRecommendationData: FeatureSection[] = [ subTitle: "Create mocks for your APIs", link: PATHS.MOCK_SERVER_V2.ABSOLUTE, }, - { - id: "test_api_endpoints", - title: "Test API endpoints", - icon: () => , - subTitle: "Test responses quickly using API Client", - link: PATHS.API_CLIENT.ABSOLUTE, - }, ], }, ]; diff --git a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/DesktopOnboardingModal.tsx b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/DesktopOnboardingModal.tsx index a1e59e013b..956554f5b6 100644 --- a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/DesktopOnboardingModal.tsx +++ b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/DesktopOnboardingModal.tsx @@ -1,19 +1,13 @@ import React, { useEffect, useState } from "react"; import { Button, Modal } from "antd"; -import { useNavigate } from "react-router-dom"; -import { WorkspaceCreationView } from "componentsV2/modals/CreateWorkspaceModal/components/WorkspaceCreationView"; import { AuthCard } from "./components/AuthCard/AuthCard"; import { WelcomeCard } from "./components/WelcomeCard/WelcomeCard"; import { useDispatch, useSelector } from "react-redux"; import { globalActions } from "store/slices/global/slice"; import { getUserAuthDetails } from "store/slices/global/user/selectors"; -// import { IoMdArrowBack } from "@react-icons/all-files/io/IoMdArrowBack"; -import { redirectToApiClient } from "utils/RedirectionUtils"; import "./desktopOnboardingModal.scss"; import { trackDesktopOnboardingStepSkipped, trackDesktopOnboardingViewed } from "./analytics"; import { OnboardingStep } from "./types"; -import { WorkspaceType } from "features/workspaces/types"; -import { WorkspaceCreationProvider } from "componentsV2/modals/CreateWorkspaceModal/context"; export const DesktopOnboardingCard = ({ children, className }: { children: React.ReactNode; className?: string }) => { return
{children}
; @@ -21,7 +15,6 @@ export const DesktopOnboardingCard = ({ children, className }: { children: React export const DesktopOnboardingModal = () => { const dispatch = useDispatch(); - const navigate = useNavigate(); const user = useSelector(getUserAuthDetails); const [onboardingStep, setOnboardingStep] = useState(OnboardingStep.FEATURE_SELECTION); @@ -42,43 +35,29 @@ export const DesktopOnboardingModal = () => { wrapClassName="rq-desktop-onboarding-modal-wrapper" className="rq-desktop-onboarding-modal" > - -
- {onboardingStep === OnboardingStep.FEATURE_SELECTION ? ( - - setOnboardingStep(step)} /> +
+ {onboardingStep === OnboardingStep.FEATURE_SELECTION ? ( + + setOnboardingStep(step)} /> + + ) : onboardingStep === OnboardingStep.AUTH ? ( + <> + + setOnboardingStep(OnboardingStep.FEATURE_SELECTION)} /> - ) : onboardingStep === OnboardingStep.FOLDER_SELECTION ? ( - - setOnboardingStep(OnboardingStep.FEATURE_SELECTION)} - callback={() => { - dispatch(globalActions.updateIsOnboardingCompleted(true)); - redirectToApiClient(navigate); - }} - analyticEventSource="desktop_onboarding_modal" - /> - - ) : onboardingStep === OnboardingStep.AUTH ? ( - <> - - setOnboardingStep(OnboardingStep.FEATURE_SELECTION)} /> - - - - ) : null} -
- + + + ) : null} +
); }; diff --git a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/components/WelcomeCard/WelcomeCard.tsx b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/components/WelcomeCard/WelcomeCard.tsx index ea8b6671ca..c2e94de95c 100644 --- a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/components/WelcomeCard/WelcomeCard.tsx +++ b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/components/WelcomeCard/WelcomeCard.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from "react"; +import React from "react"; import { Button } from "antd"; import RQOnlyLogo from "/assets/media/common/RQ-only-logo.svg"; import { useDispatch } from "react-redux"; @@ -6,20 +6,8 @@ import { globalActions } from "store/slices/global/slice"; import { trackDesktopOnboardingFeatureSelected, trackDesktopOnboardingStepSkipped } from "../../analytics"; import { OnboardingStep } from "../../types"; import { WelcomeCardHeader } from "./components/WelcomeCardHeader/WelcomeCardHeader"; -import { AnimatePresence, m } from "framer-motion"; -import { collapseExpandTransition } from "utils/animations"; -import { MdOutlineKeyboardArrowUp } from "@react-icons/all-files/md/MdOutlineKeyboardArrowUp"; -import { MdOutlineKeyboardArrowDown } from "@react-icons/all-files/md/MdOutlineKeyboardArrowDown"; -import { LocalWorkspaceCreateOptions } from "componentsV2/modals/CreateWorkspaceModal"; -import clsx from "clsx"; -import { useCreateDefaultLocalWorkspace } from "features/workspaces/hooks/useCreateDefaultLocalWorkspace"; -import { FileSystemError } from "features/apiClient/helpers/modules/sync/local/services/types"; -import { OpenWorkspaceErrorView } from "componentsV2/modals/CreateWorkspaceModal/components/LocalWorkspaceCreationView/components/OpenWorkspaceErrorView"; -import { useOpenLocalWorkspace } from "features/workspaces/hooks/useOpenLocalWorkspace"; import { MdOutlineKeyboardArrowRight } from "@react-icons/all-files/md/MdOutlineKeyboardArrowRight"; import "./welcomeCard.scss"; -import { useNavigate } from "react-router-dom"; -import { redirectToApiClient } from "utils/RedirectionUtils"; interface Props { onFeatureClick: (step: OnboardingStep) => void; @@ -27,140 +15,19 @@ interface Props { export const WelcomeCard: React.FC = ({ onFeatureClick }) => { const dispatch = useDispatch(); - const navigate = useNavigate(); - const [isApiClientCardExpanded, setIsApiClientCardExpanded] = useState(false); - const [openWorkspaceError, setOpenWorkspaceError] = useState(null); - const apiClientCardRef = useRef(null); - - const { createWorkspace, isLoading } = useCreateDefaultLocalWorkspace({ - analyticEventSource: "desktop_onboarding_modal", - onCreateWorkspaceCallback: () => { - trackDesktopOnboardingStepSkipped(OnboardingStep.FEATURE_SELECTION); - dispatch(globalActions.updateIsOnboardingCompleted(true)); - redirectToApiClient(navigate); - }, - }); - - const { openWorkspace, isLoading: isOpeningWorkspaceLoading } = useOpenLocalWorkspace({ - analyticEventSource: "desktop_onboarding_modal", - onOpenWorkspaceCallback: () => { - dispatch(globalActions.updateIsOnboardingCompleted(true)); - redirectToApiClient(navigate); - }, - onError: (error: FileSystemError) => { - setOpenWorkspaceError(error); - }, - }); - - useEffect(() => { - if (!isApiClientCardExpanded) { - return; - } - - const handleClickOutside = (event: MouseEvent) => { - if (apiClientCardRef.current && !apiClientCardRef.current.contains(event.target as Node)) { - setIsApiClientCardExpanded(false); - } - }; - - document.addEventListener("mousedown", handleClickOutside); - - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, [isApiClientCardExpanded]); - - const handleApiClientCardExpandToggle = () => { - if (!isApiClientCardExpanded) { - trackDesktopOnboardingFeatureSelected("api_client"); - } - setIsApiClientCardExpanded((prev) => !prev); - }; - - if (openWorkspaceError) { - return ( -
- onFeatureClick(OnboardingStep.FOLDER_SELECTION)} - openWorkspace={openWorkspace} - isOpeningWorkspaceLoading={isOpeningWorkspaceLoading} - analyticEventSource="desktop_onboarding_modal" - /> -
- ); - } return (
- RQ Only Logo -
+ RQ Only Logo +
Welcome to Requestly
-
+
Intercept, Mock, Build & Test APIs faster
- -
-
- - {isApiClientCardExpanded ? ( - - ) : ( - - )} -
- - {isApiClientCardExpanded && ( - -
- onFeatureClick(OnboardingStep.FOLDER_SELECTION)} - onCreationCallback={() => { - dispatch(globalActions.updateIsOnboardingCompleted(true)); - redirectToApiClient(navigate); - }} - openWorkspace={openWorkspace} - isOpeningWorkspaceLoading={isOpeningWorkspaceLoading} - /> -
-
- )} -
-
-
{ trackDesktopOnboardingFeatureSelected("rules"); onFeatureClick(OnboardingStep.AUTH); @@ -175,7 +42,14 @@ export const WelcomeCard: React.FC = ({ onFeatureClick }) => {
- {" "} this screen and quick start diff --git a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/types.ts b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/types.ts index 271a41f8d8..a0ca630dbc 100644 --- a/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/types.ts +++ b/app/src/features/onboarding/componentsV2/DesktopOnboardingModal/types.ts @@ -1,5 +1,4 @@ export enum OnboardingStep { FEATURE_SELECTION = "feature_selection", - FOLDER_SELECTION = "folder_selection", AUTH = "auth", } diff --git a/app/src/hooks/AppModeInitializer.js b/app/src/hooks/AppModeInitializer.js index aee104b311..cf7c3941e8 100644 --- a/app/src/hooks/AppModeInitializer.js +++ b/app/src/hooks/AppModeInitializer.js @@ -45,7 +45,6 @@ import FEATURES from "config/constants/sub/features"; import { trackHarFileOpened } from "modules/analytics/events/features/sessionRecording/networkSessions"; import { trackLocalSessionRecordingOpened } from "modules/analytics/events/features/sessionRecording"; import { getActiveWorkspaceId } from "store/slices/workspaces/selectors"; -import { ApiClientImporterType } from "features/apiClient/types"; import { clientStorageService } from "services/clientStorageService"; import { initAndSubscribeSecretsManager } from "features/apiClient/slices/secrets-manager"; import { secretsManagerService } from "services/secretsManagerService"; @@ -395,23 +394,6 @@ const AppModeInitializer = () => { }; }); - PSMH.addMessageListener(GLOBAL_CONSTANTS.EXTENSION_MESSAGES.OPEN_CURL_IMPORT_MODAL, (message) => { - const { payload } = message; - - // Navigate to API Client with cURL import modal state - const navigationState = { - modal: ApiClientImporterType.CURL, - curlCommand: payload.curlCommand, - pageURL: payload.pageURL, - source: payload.source, - }; - - navigate(PATHS.API_CLIENT.ABSOLUTE, { state: navigationState }); - - return { - received: true, - }; - }); } }, [appMode, activeWorkspaceId, dispatch, user?.details?.isSyncEnabled, user?.details?.profile?.uid, navigate]); diff --git a/app/src/hooks/useRootPathRedirector.ts b/app/src/hooks/useRootPathRedirector.ts index 58fd70f7c7..477fe10442 100644 --- a/app/src/hooks/useRootPathRedirector.ts +++ b/app/src/hooks/useRootPathRedirector.ts @@ -25,7 +25,6 @@ const useRootPathRedirector = () => { }, [searchParams, isAuthSkipped]); const LAST_KNOWN_PATHS = new Set([ - PATHS.API_CLIENT.INDEX, PATHS.RULES.INDEX, PATHS.MOCK_SERVER.INDEX, PATHS.NETWORK_INSPECTOR.INDEX, diff --git a/app/src/layouts/DashboardLayout/Sidebar/PrimarySidebar/index.tsx b/app/src/layouts/DashboardLayout/Sidebar/PrimarySidebar/index.tsx index 53dc6327bf..78b5d52fd2 100644 --- a/app/src/layouts/DashboardLayout/Sidebar/PrimarySidebar/index.tsx +++ b/app/src/layouts/DashboardLayout/Sidebar/PrimarySidebar/index.tsx @@ -24,7 +24,6 @@ import { RQTooltip } from "lib/design-system-v2/components"; import HomeIcon from "/assets/media/common/feature_home.svg"; import NetworkIcon from "/assets/media/common/feature_network.svg"; import RulesIcon from "/assets/media/common/feature_rules.svg"; -import ApiIcon from "/assets/media/common/feature_apis.svg"; import FilesIcon from "/assets/media/common/feature_files.svg"; import SessionsIcon from "/assets/media/common/feature_sessions.svg"; @@ -35,7 +34,6 @@ enum SidebarItemKey { NETWORK = "network", NETWORK_INSPECTOR = "network_inspector", RULES = "rules", - APIs = "apis", FILES = "files", SESSIONS = "sessions", } @@ -43,7 +41,6 @@ enum SidebarItemKey { const LocalWorkspaceSidebarOrder = [ SidebarItemKey.HOME, SidebarItemKey.NETWORK, - SidebarItemKey.APIs, SidebarItemKey.SESSIONS, SidebarItemKey.RULES, SidebarItemKey.FILES, @@ -54,7 +51,6 @@ const defaultSidebarOrder = [ SidebarItemKey.NETWORK, SidebarItemKey.NETWORK_INSPECTOR, SidebarItemKey.RULES, - SidebarItemKey.APIs, SidebarItemKey.FILES, SidebarItemKey.SESSIONS, ]; @@ -122,13 +118,6 @@ export const PrimarySidebar: React.FC = () => { ), disabled: isLocalSyncEnabled, }, - [SidebarItemKey.APIs]: { - id: 4, - title: "APIs", - path: PATHS.API_CLIENT.INDEX, - icon: apis, - display: true, - }, [SidebarItemKey.FILES]: { id: 5, title: "Files", diff --git a/app/src/lib/design-system/components/RQBreadcrumb/index.tsx b/app/src/lib/design-system/components/RQBreadcrumb/index.tsx index 1513c1af9e..0d04a708dd 100644 --- a/app/src/lib/design-system/components/RQBreadcrumb/index.tsx +++ b/app/src/lib/design-system/components/RQBreadcrumb/index.tsx @@ -13,10 +13,6 @@ export const RQBreadcrumb: React.FC = (props) => { return "Files"; } - if (path === "api-client") { - return "API Client"; - } - // TODO: rather derive from the list used in Sidebar return capitalize(path.includes("-") ? path.split("-").join(" ") : path); }, []); diff --git a/app/src/routes/index.tsx b/app/src/routes/index.tsx index 6e67327428..5f25ba737e 100644 --- a/app/src/routes/index.tsx +++ b/app/src/routes/index.tsx @@ -7,7 +7,6 @@ import { automationRoutes } from "views/misc/Automation/routes"; import AppLayout from "layouts/AppLayout"; import { ruleRoutes } from "features/rules/routes"; import { sessionRoutes } from "features/sessionBook"; -import { apiClientRoutes } from "features/apiClient"; import { accountRoutes } from "./accountRoutes"; import { authRoutes } from "./authRoutes"; import { desktopRoutes } from "./desktopRoutes"; @@ -52,7 +51,6 @@ export const routesV2: RouteObject[] = [ children: [ ...ruleRoutes, ...sessionRoutes, - ...apiClientRoutes, ...accountRoutes, ...authRoutes, ...desktopRoutes, diff --git a/app/src/views/features/sessions/SessionViewer/NetworkLogs/NetworkLogsPanel.tsx b/app/src/views/features/sessions/SessionViewer/NetworkLogs/NetworkLogsPanel.tsx index cb3615c585..e10567e13a 100644 --- a/app/src/views/features/sessions/SessionViewer/NetworkLogs/NetworkLogsPanel.tsx +++ b/app/src/views/features/sessions/SessionViewer/NetworkLogs/NetworkLogsPanel.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useMemo } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Empty, Typography, Row } from "antd"; import { getIncludeNetworkLogs } from "store/features/session-recording/selectors"; @@ -6,7 +6,6 @@ import { globalActions } from "store/slices/global/slice"; import { getActiveModals } from "store/slices/global/modals/selectors"; import { RQNetworkLog } from "lib/design-system/components/RQNetworkTable/types"; import { RQNetworkTable, RQNetworkTableProps } from "lib/design-system/components/RQNetworkTable"; -import { APIClientModal, APIClientRequest } from "features/apiClient/components/common/APIClient"; import RuleEditorModal from "components/common/RuleEditorModal"; import { copyToClipBoard } from "utils/Misc"; import { snakeCase } from "lodash"; @@ -29,8 +28,6 @@ interface Props { const NetworkLogsPanel: React.FC = ({ startTime, networkLogs, playerTimeOffset, disableFilters = false }) => { const dispatch = useDispatch(); const { ruleEditorModal } = useSelector(getActiveModals); - const [isApiClientModalOpen, setIsApiClientModalOpen] = useState(false); - const [selectedRequestData, setSelectedRequestData] = useState(null); const isLocalSyncEnabled = useCheckLocalSyncSupport(); const includeNetworkLogs = useSelector(getIncludeNetworkLogs); @@ -81,27 +78,6 @@ const NetworkLogsPanel: React.FC = ({ startTime, networkLogs, playerTimeO { type: "divider", }, - { - key: "replay_request", - label: "Replay Request", - disabled: isLocalSyncEnabled, - onSelect: (key, log) => { - const { url, method, headers, postData } = log.entry.request ?? {}; - - setSelectedRequestData({ - url, - method, - body: postData.text, - headers: headers.reduce((result, header) => ({ ...result, [header.name]: header.value }), {}), - }); - - trackSessionRecordingNetworkLogContextMenuOptionClicked(key); - setIsApiClientModalOpen(true); - }, - }, - { - type: "divider", - }, { key: RuleType.REDIRECT, label: "Redirect URL (Map local/Remote)", @@ -167,11 +143,6 @@ const NetworkLogsPanel: React.FC = ({ startTime, networkLogs, playerTimeO [handleContextMenuRuleOptionSelect, isLocalSyncEnabled] ); - const handleCloseApiClientModal = useCallback(() => { - setIsApiClientModalOpen(false); - setSelectedRequestData(null); - }, []); - const emptyTableView = ( No request matches the search query! @@ -195,15 +166,6 @@ const NetworkLogsPanel: React.FC = ({ startTime, networkLogs, playerTimeO disableFilters={disableFilters} /> - {isApiClientModalOpen && ( - - )} - {ruleEditorModal.isActive && (