diff --git a/packages/bruno-app/src/providers/Hotkeys/index.js b/packages/bruno-app/src/providers/Hotkeys/index.js index 8b0503b1c..c79264946 100644 --- a/packages/bruno-app/src/providers/Hotkeys/index.js +++ b/packages/bruno-app/src/providers/Hotkeys/index.js @@ -9,7 +9,7 @@ import NetworkError from 'components/ResponsePane/NetworkError'; import NewRequest from 'components/Sidebar/NewRequest'; import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions'; import { findCollectionByUid, findItemInCollection } from 'utils/collections'; -import { closeTabs } from 'providers/ReduxStore/slices/tabs'; +import { closeTabs, cloneRequest, renameRequest } from 'providers/ReduxStore/slices/tabs'; export const HotkeysContext = React.createContext(); @@ -154,6 +154,50 @@ export const HotkeysProvider = (props) => { }; }, [activeTabUid]); + // clone request (ctrl/cmd + d) +useEffect(() => { + Mousetrap.bind(['command+d', 'ctrl+d'], (e) => { + const activeTab = find(tabs, (t) => t.uid === activeTabUid); + if (activeTab) { + const collection = findCollectionByUid(collections, activeTab.collectionUid); + if (collection) { + const item = findItemInCollection(collection, activeTab.uid); + if (item && item.uid) { + dispatch(cloneRequest(item.uid, activeTab.collectionUid)); + } + } + } + + return false; // this stops the event bubbling + }); + + return () => { + Mousetrap.unbind(['command+d', 'ctrl+d']); + }; +}, [activeTabUid, tabs, collections]); + +// rename request (ctrl/cmd + e) +useEffect(() => { + Mousetrap.bind(['command+e', 'ctrl+e'], (e) => { + const activeTab = find(tabs, (t) => t.uid === activeTabUid); + if (activeTab) { + const collection = findCollectionByUid(collections, activeTab.collectionUid); + if (collection) { + const item = findItemInCollection(collection, activeTab.uid); + if (item && item.uid) { + dispatch(renameRequest(item.uid, activeTab.collectionUid)); + } + } + } + + return false; // this stops the event bubbling + }); + + return () => { + Mousetrap.unbind(['command+e', 'ctrl+e']); + }; +}, [activeTabUid, tabs, collections]); + return ( {showSaveRequestModal && ( diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/tabs.js b/packages/bruno-app/src/providers/ReduxStore/slices/tabs.js index 74c503dad..dec20bef8 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/tabs.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/tabs.js @@ -101,6 +101,23 @@ export const tabsSlice = createSlice({ const collectionUid = action.payload.collectionUid; state.tabs = filter(state.tabs, (t) => t.collectionUid !== collectionUid); state.activeTabUid = null; + }, + cloneRequest: (state, action) => { + const { requestId, collectionId } = action.payload; + const tab = find(state.tabs, (t) => t.uid === requestId && t.collectionUid === collectionId); + + if (tab) { + const clonedTab = { ...tab, uid: action.payload.uid }; + state.tabs.push(clonedTab); + } + }, + renameRequest: (state, action) => { + const { requestId, collectionId, newName } = action.payload; + const tab = find(state.tabs, (t) => t.uid === requestId && t.collectionUid === collectionId); + + if (tab) { + tab.name = newName; + } } } }); @@ -112,7 +129,9 @@ export const { updateRequestPaneTab, updateResponsePaneTab, closeTabs, - closeAllCollectionTabs + closeAllCollectionTabs, + cloneRequest, + renameRequest } = tabsSlice.actions; export default tabsSlice.reducer;