diff --git a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js index a1d7dd86a..69963f45f 100644 --- a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js +++ b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js @@ -10,12 +10,14 @@ import SingleLineEditor from 'components/SingleLineEditor'; import { isMacOS } from 'utils/common/platform'; import { hasRequestChanges } from 'utils/collections'; import StyledWrapper from './StyledWrapper'; +import { usePreferences } from 'providers/Preferences/index'; import GenerateCodeItem from 'components/Sidebar/Collections/Collection/CollectionItem/GenerateCodeItem/index'; import toast from 'react-hot-toast'; const QueryUrl = ({ item, collection, handleRun }) => { const { theme, storedTheme } = useTheme(); const dispatch = useDispatch(); + const autoSavePreference = usePreferences().preferences.request.autoSave; const method = item.draft ? get(item, 'draft.request.method') : get(item, 'request.method'); const url = item.draft ? get(item, 'draft.request.url', '') : get(item, 'request.url', ''); const isMac = isMacOS(); @@ -33,8 +35,8 @@ const QueryUrl = ({ item, collection, handleRun }) => { setMethodSelectorWidth(el.offsetWidth); }, [method]); - const onSave = (finalValue) => { - dispatch(saveRequest(item.uid, collection.uid)); + const onSave = (notify = 1) => { + dispatch(saveRequest(item.uid, collection.uid, notify)); }; const onUrlChange = (value) => { @@ -118,6 +120,7 @@ const QueryUrl = ({ item, collection, handleRun }) => { highlightPathParams={true} item={item} showNewlineArrow={true} + autoSave={autoSavePreference} />
{ + if (this.props.autoSave && this.props.onSave) { + this.autoSaveInterval = setInterval(this.saveEditorContent, this.props.autoSaveInterval || 15000); // Default to 15 sec + } + }; + + clearAutosave = () => { + if (this.autoSaveInterval) { + clearInterval(this.autoSaveInterval); + } + }; + + saveEditorContent = () => { + if (this.props.onSave) { + const content = this.editor.getValue(); + console.log(content); + this.props.onSave(content, 0); + } + }; + _onPaste = (_, event) => this.props.onPaste?.(event); componentDidUpdate(prevProps) { @@ -190,6 +213,7 @@ class SingleLineEditor extends Component { } componentWillUnmount() { + this.clearAutosave(); if (this.editor) { if (this.editor?._destroyLinkAware) { this.editor._destroyLinkAware(); diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js index 27a068d05..0639e046e 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js @@ -94,28 +94,32 @@ export const renameCollection = (newName, collectionUid) => (dispatch, getState) }); }; -export const saveRequest = (itemUid, collectionUid, saveSilently) => (dispatch, getState) => { + +export const saveRequest = (itemUid, collectionUid, saveSilently, notify = 1) => (dispatch, getState) => { const state = getState(); const collection = findCollectionByUid(state.collections.collections, collectionUid); - return new Promise((resolve, reject) => { - if (!collection) { - return reject(new Error('Collection not found')); - } + return new Promise((resolve, reject) => { + if (!collection) { + return reject(new Error('Collection not found')); + } - const collectionCopy = cloneDeep(collection); - const item = findItemInCollection(collectionCopy, itemUid); - if (!item) { - return reject(new Error('Not able to locate item')); - } + const collectionCopy = cloneDeep(collection); + const item = findItemInCollection(collectionCopy, itemUid); + if (!item) { + return reject(new Error('Not able to locate item')); + } - const itemToSave = transformRequestToSaveToFilesystem(item); - const { ipcRenderer } = window; + const itemToSave = transformRequestToSaveToFilesystem(item); + const { ipcRenderer } = window; itemSchema .validate(itemToSave) .then(() => ipcRenderer.invoke('renderer:save-request', item.pathname, itemToSave)) .then(() => { + if (notify === 1) { + toast.success('Request saved successfully'); + } if (!saveSilently) { toast.success('Request saved successfully'); }