diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js b/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js
deleted file mode 100644
index 35f5a486e..000000000
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import React, { useEffect, useState } from "react";
-import { IconEdit, IconTrash } from "@tabler/icons";
-import RenameEnvironment from "../../RenameEnvironment";
-import DeleteEnvironment from "../../DeleteEnvironment";
-// import StyledWrapper from "./StyledWrapper";
-
-const EnvironmentDetails = ({selected}) => {
- const [ openEditModal, setOpenEditModal] = useState(false);
- const [ openDeleteModal, setOpenDeleteModal] = useState(false);
-
- return (
-
-
{selected.name}
-
- setOpenEditModal(true)}/>
- setOpenDeleteModal(true)}/>
-
- {openEditModal &&
setOpenEditModal(false)} environment={selected} />}
- {openDeleteModal && setOpenDeleteModal(false)} environment={selected} />}
-
-
- );
-};
-
-export default EnvironmentDetails;
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js b/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js
deleted file mode 100644
index 3e2c05a00..000000000
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import Modal from "components/Modal/index";
-import React, { useState } from "react";
-import CreateEnvironment from "./CreateEnvironment";
-import Layout from "./Layout";
-
-const EnvironmentSettings = ({onClose}) => {
- const environments = [
- {name: "My env", uid: 123},
- {name: "hjdgfh dj", uid: 3876},
- ];
- const [openCreateModal, setOpenCreateModal] = useState(false)
-
- if(!environments.length) {
- return (
-
- No environment found!
-
- {openCreateModal && setOpenCreateModal(false)}/>}
-
- )
- }
-
- return (
-
-
-
- )
-
-}
-
-export default EnvironmentSettings;
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSelector/StyledWrapper.js
similarity index 100%
rename from packages/bruno-app/src/components/EnvironmentSelector/StyledWrapper.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSelector/StyledWrapper.js
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js
similarity index 88%
rename from packages/bruno-app/src/components/EnvironmentSelector/index.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js
index 7d5de34f2..8ec67bac2 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/index.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js
@@ -1,10 +1,10 @@
import React, { useRef, forwardRef, useState } from 'react';
import Dropdown from 'components/Dropdown';
import { IconAdjustmentsHorizontal, IconCaretDown } from '@tabler/icons';
-import EnvironmentSettings from "./EnvironmentSettings";
+import EnvironmentSettings from "../EnvironmentSettings";
import StyledWrapper from './StyledWrapper';
-const EnvironmentSelector = () => {
+const EnvironmentSelector = ({collection}) => {
const dropdownTippyRef = useRef();
const [openSettingsModal, setOpenSettingsModal] = useState(false);
@@ -46,7 +46,7 @@ const EnvironmentSelector = () => {
- {openSettingsModal && setOpenSettingsModal(false)}/>}
+ {openSettingsModal && setOpenSettingsModal(false)}/>}
);
};
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js
similarity index 78%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js
index d01f98fb8..885d901c1 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js
@@ -1,12 +1,13 @@
import React, { useEffect, useRef } from 'react';
import Portal from "components/Portal/index";
import Modal from "components/Modal/index";
+import toast from 'react-hot-toast';
import { useFormik } from 'formik';
-import { addWorkspace } from 'providers/ReduxStore/slices/workspaces';
+import { addEnvironment } from 'providers/ReduxStore/slices/collections/actions';
import * as Yup from 'yup';
import { useDispatch } from 'react-redux';
-const CreateEnvironment = ({onClose}) => {
+const CreateEnvironment = ({collection, onClose}) => {
const dispatch = useDispatch();
const inputRef = useRef();
const formik = useFormik({
@@ -17,12 +18,16 @@ const CreateEnvironment = ({onClose}) => {
validationSchema: Yup.object({
name: Yup.string()
.min(1, 'must be atleast 1 characters')
- .max(30, 'must be 30 characters or less')
+ .max(50, 'must be 50 characters or less')
.required('name is required')
}),
onSubmit: (values) => {
- // dispatch(addWorkspace({name: values.name}));
- // onClose();
+ dispatch(addEnvironment(values.name, collection.uid))
+ .then(() => {
+ toast.success("Environment created in collection");
+ onClose();
+ })
+ .catch(() => toast.error("An error occured while created the environment"));
}
});
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js
similarity index 100%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js
similarity index 61%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js
index f13aee318..c4cc0cb69 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js
@@ -1,15 +1,20 @@
import React from 'react';
import Portal from "components/Portal/index";
+import toast from 'react-hot-toast';
import Modal from "components/Modal/index";
-// import { deleteWorkspace } from 'providers/ReduxStore/slices/workspaces';
+import { deleteEnvironment } from 'providers/ReduxStore/slices/collections/actions';
import { useDispatch } from 'react-redux';
import StyledWrapper from './StyledWrapper';
-const DeleteEnvironment = ({onClose, environment}) => {
+const DeleteEnvironment = ({onClose, environment, collection}) => {
const dispatch = useDispatch();
const onConfirm = () =>{
- // dispatch(deleteWorkspace({workspaceUid: workspace.uid}))
- onClose();
+ dispatch(deleteEnvironment(environment.uid, collection.uid))
+ .then(() => {
+ toast.success("Environment deleted successfully");
+ onClose();
+ })
+ .catch(() => toast.error("An error occured while deleting the environment"));
};
return (
diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js
new file mode 100644
index 000000000..766bba05d
--- /dev/null
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js
@@ -0,0 +1,26 @@
+import React, {useState } from "react";
+import { IconEdit, IconTrash } from "@tabler/icons";
+import RenameEnvironment from "../../RenameEnvironment";
+import DeleteEnvironment from "../../DeleteEnvironment";
+
+const EnvironmentDetails = ({environment, collection}) => {
+ const [ openEditModal, setOpenEditModal] = useState(false);
+ const [ openDeleteModal, setOpenDeleteModal] = useState(false);
+
+ return (
+
+ {openEditModal &&
setOpenEditModal(false)} environment={environment} collection={collection}/>}
+ {openDeleteModal && setOpenDeleteModal(false)} environment={environment} collection={collection}/>}
+
+
{environment.name}
+
+ setOpenEditModal(true)}/>
+ setOpenDeleteModal(true)}/>
+
+
+
+
+ );
+};
+
+export default EnvironmentDetails;
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js
similarity index 54%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js
index c44482cc0..4c7ce038c 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js
@@ -1,12 +1,12 @@
import styled from "styled-components";
const StyledWrapper = styled.div`
- margin-left: -1rem;
+ margin-inline: -1rem;
margin-block: -1.5rem;
+
.environments-sidebar {
- margin-bottom: 8px;
- background-color: #ffffff;
- min-height: 300px;
+ background-color: #eaeaea;
+ min-height: 400px;
}
.environment-item {
@@ -15,28 +15,34 @@ const StyledWrapper = styled.div`
position: relative;
cursor: pointer;
padding: 8px 10px;
- color: rgb(35, 35, 35);
- border-bottom: 1px solid #eaecef;
+ border-left: solid 2px transparent;
+ text-decoration: none;
&:hover {
text-decoration: none;
- background-color: #f6f8fa;
+ background-color: #e4e4e4;
}
}
.active {
- background-color: #e1e4e8;
+ background-color: #dcdcdc !important;
+ border-left: solid 2px var(--color-brand);
&:hover {
- text-decoration: none;
- background-color: #e1e4e8;
+ background-color: #dcdcdc !important;
}
}
- .create-env {
+ .btn-create-environment {
padding: 8px 10px;
cursor: pointer;
border-bottom: none;
color: var(--color-text-link);
+
+ &:hover {
+ span {
+ text-decoration: underline;
+ }
+ }
}
`;
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js
similarity index 50%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js
index 19a15d032..c3d0cc8b3 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js
@@ -3,38 +3,43 @@ import EnvironmentDetails from "./EnvironmentDetails";
import CreateEnvironment from "../CreateEnvironment/index";
import StyledWrapper from "./StyledWrapper";
-const environments = [
- {name: "My env", uid: 123},
- {name: "hjdgfh dj", uid: 3876},
- {name: "hjdgfer dj", uid: 4678},
-];
-
-const Layout = () => {
- const [selectedEnvironment, setSelectedEnvironment] = useState({});
+const EnvironmentList = ({collection}) => {
+ const { environments } = collection;
+ const [selectedEnvironment, setSelectedEnvironment] = useState(null);
const [openCreateModal, setOpenCreateModal] = useState(false);
useEffect(() => {
setSelectedEnvironment(environments[0]);
}, []);
+ if(!selectedEnvironment) {
+ return null;
+ }
+
return (
+ {openCreateModal && setOpenCreateModal(false)}/>}
-
+
{environments && environments.length && environments.map((env) => (
-
setSelectedEnvironment(env)}>
+
setSelectedEnvironment(env)}
+ >
{env.name}
))}
-
setOpenCreateModal(true)}> + Create
+
setOpenCreateModal(true)}>
+ + Create
+
-
+
- {openCreateModal &&
setOpenCreateModal(false)}/>}
);
};
-export default Layout;
+export default EnvironmentList;
diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js
similarity index 75%
rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js
rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js
index 7023a9971..1811aa44a 100644
--- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js
@@ -1,13 +1,14 @@
import React, { useEffect, useRef } from 'react';
import Portal from "components/Portal/index";
import Modal from "components/Modal/index";
+import toast from 'react-hot-toast';
import { useFormik } from 'formik';
-// import { rename } from 'providers/ReduxStore/slices/environments';
+import { renameEnvironment } from 'providers/ReduxStore/slices/collections/actions';
import * as Yup from 'yup';
import { useDispatch } from 'react-redux';
-const RenameEnvironment = ({onClose, environment}) => {
- // const dispatch = useDispatch();
+const RenameEnvironment = ({onClose, environment, collection}) => {
+ const dispatch = useDispatch();
const inputRef = useRef();
const formik = useFormik({
enableReinitialize: true,
@@ -17,12 +18,16 @@ const RenameEnvironment = ({onClose, environment}) => {
validationSchema: Yup.object({
name: Yup.string()
.min(1, 'must be atleast 1 characters')
- .max(30, 'must be 30 characters or less')
+ .max(50, 'must be 50 characters or less')
.required('name is required')
}),
onSubmit: (values) => {
- // dispatch(rename({name: values.name, uid: environment.uid}));
- onClose();
+ dispatch(renameEnvironment(values.name, environment.uid, collection.uid))
+ .then(() => {
+ toast.success("Environment renamed successfully");
+ onClose();
+ })
+ .catch(() => toast.error("An error occured while renaming the environment"));
}
});
diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js
new file mode 100644
index 000000000..14e04bb5c
--- /dev/null
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js
@@ -0,0 +1,13 @@
+import styled from "styled-components";
+
+const StyledWrapper = styled.div`
+ button.btn-create-environment {
+ &:hover {
+ span {
+ text-decoration: underline;
+ }
+ }
+ }
+`;
+
+export default StyledWrapper;
\ No newline at end of file
diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js
new file mode 100644
index 000000000..6cb08cd79
--- /dev/null
+++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js
@@ -0,0 +1,50 @@
+import Modal from "components/Modal/index";
+import React, { useState } from "react";
+import CreateEnvironment from "./CreateEnvironment";
+import EnvironmentList from "./EnvironmentList";
+import StyledWrapper from "./StyledWrapper";
+
+const EnvironmentSettings = ({collection, onClose}) => {
+ const { environments } = collection;
+ const [openCreateModal, setOpenCreateModal] = useState(false)
+
+ if(!environments || !environments.length) {
+ return (
+
+
+ {openCreateModal && setOpenCreateModal(false)}/>}
+
+
No environments found!
+
+
+
+
+ )
+ }
+
+ return (
+
+
+
+ )
+
+}
+
+export default EnvironmentSettings;
diff --git a/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js b/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js
index 16013dbd7..fd728e2ec 100644
--- a/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js
+++ b/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js
@@ -1,6 +1,6 @@
import React from 'react';
import { IconFiles } from '@tabler/icons';
-import EnvironmentSelector from 'components/EnvironmentSelector';
+import EnvironmentSelector from 'components/Environments/EnvironmentSelector';
import StyledWrapper from './StyledWrapper';
const CollectionToolBar = ({collection}) => {
@@ -12,7 +12,7 @@ const CollectionToolBar = ({collection}) => {
{collection.name}
-
+
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 e19647764..059991f1a 100644
--- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
+++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
@@ -1,5 +1,5 @@
import path from 'path';
-import axios from 'axios';
+import filter from 'lodash/filter';
import each from 'lodash/each';
import trim from 'lodash/trim';
import toast from 'react-hot-toast';
@@ -13,6 +13,7 @@ import {
transformRequestToSaveToFilesystem,
deleteItemInCollection,
findParentItemInCollection,
+ findEnvironmentInCollection,
isItemAFolder,
refreshUidsInItem
} from 'utils/collections';
@@ -31,6 +32,9 @@ import {
cloneItem as _cloneItem,
deleteItem as _deleteItem,
saveRequest as _saveRequest,
+ addEnvironment as _addEnvironment,
+ renameEnvironment as _renameEnvironment,
+ deleteEnvironment as _deleteEnvironment,
createCollection as _createCollection,
renameCollection as _renameCollection,
deleteCollection as _deleteCollection,
@@ -71,7 +75,8 @@ export const createCollection = (collectionName) => (dispatch, getState) => {
const newCollection = {
uid: uuid(),
name: collectionName,
- items: []
+ items: [],
+ environments: []
};
const requestItem = {
@@ -606,6 +611,88 @@ export const newHttpRequest = (params) => (dispatch, getState) => {
});
};
+export const addEnvironment = (name, collectionUid) => (dispatch, getState) => {
+ return new Promise((resolve, reject) => {
+ const state = getState();
+ const collection = findCollectionByUid(state.collections.collections, collectionUid);
+ if(!collection) {
+ return reject(new Error('Collection not found'));
+ }
+
+ const environment = {
+ uid: uuid(),
+ name: name,
+ variables: []
+ };
+
+ const collectionCopy = cloneDeep(collection);
+ const collectionToSave = transformCollectionToSaveToIdb(collectionCopy);
+ collectionToSave.environments = collectionToSave.environments || [];
+ collectionToSave.environments.push(environment);
+
+ collectionSchema
+ .validate(collectionToSave)
+ .then(() => saveCollectionToIdb(window.__idb, collectionToSave))
+ .then(() => dispatch(_addEnvironment({environment, collectionUid})))
+ .then(resolve)
+ .catch(reject);
+ });
+};
+
+export const renameEnvironment = (newName, environmentUid, collectionUid) => (dispatch, getState) => {
+ return new Promise((resolve, reject) => {
+ const state = getState();
+ const collection = findCollectionByUid(state.collections.collections, collectionUid);
+ if(!collection) {
+ return reject(new Error('Collection not found'));
+ }
+
+ const collectionCopy = cloneDeep(collection);
+ const environment = findEnvironmentInCollection(collectionCopy, environmentUid);
+ if(!environment) {
+ return reject(new Error('Environment not found'));
+ }
+
+ environment.name = newName;
+
+ const collectionToSave = transformCollectionToSaveToIdb(collectionCopy);
+
+ collectionSchema
+ .validate(collectionToSave)
+ .then(() => saveCollectionToIdb(window.__idb, collectionToSave))
+ .then(() => dispatch(_renameEnvironment({newName, environmentUid, collectionUid})))
+ .then(resolve)
+ .catch(reject);
+ });
+};
+
+export const deleteEnvironment = (environmentUid, collectionUid) => (dispatch, getState) => {
+ return new Promise((resolve, reject) => {
+ const state = getState();
+ const collection = findCollectionByUid(state.collections.collections, collectionUid);
+ if(!collection) {
+ return reject(new Error('Collection not found'));
+ }
+
+ const collectionCopy = cloneDeep(collection);
+ const environment = findEnvironmentInCollection(collectionCopy, environmentUid);
+ if(!environment) {
+ return reject(new Error('Environment not found'));
+ }
+
+ collectionCopy.environments = filter(collectionCopy.environments, (e) => e.uid !== environmentUid);
+
+ const collectionToSave = transformCollectionToSaveToIdb(collectionCopy);
+
+ collectionSchema
+ .validate(collectionToSave)
+ .then(() => saveCollectionToIdb(window.__idb, collectionToSave))
+ .then(() => dispatch(_deleteEnvironment({environmentUid, collectionUid})))
+ .then(resolve)
+ .catch(reject);
+ });
+};
+
export const removeLocalCollection = (collectionUid) => (dispatch, getState) => {
return new Promise((resolve, reject) => {
const state = getState();
diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js
index fe7cdcbfd..62f2dd92a 100644
--- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js
+++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js
@@ -11,6 +11,7 @@ import splitOnFirst from 'split-on-first';
import {
findCollectionByUid,
findItemInCollection,
+ findEnvironmentInCollection,
findItemInCollectionByPathname,
addDepth,
collapseCollection,
@@ -69,6 +70,39 @@ export const collectionsSlice = createSlice({
deleteCollection: (state, action) => {
state.collections = filter(state.collections, c => c.uid !== action.payload.collectionUid);
},
+ addEnvironment: (state, action) => {
+ const { environment, collectionUid } = action.payload;
+ const collection = findCollectionByUid(state.collections, collectionUid);
+
+ if(collection) {
+ collection.environments = collection.environments || [];
+ collection.environments.push(environment);
+ }
+ },
+ renameEnvironment: (state, action) => {
+ const { newName, environmentUid, collectionUid } = action.payload;
+ const collection = findCollectionByUid(state.collections, collectionUid);
+
+ if(collection) {
+ const environment = findEnvironmentInCollection(collection, environmentUid);
+
+ if(environment) {
+ environment.name = newName;
+ }
+ }
+ },
+ deleteEnvironment: (state, action) => {
+ const { environmentUid, collectionUid } = action.payload;
+ const collection = findCollectionByUid(state.collections, collectionUid);
+
+ if(collection) {
+ const environment = findEnvironmentInCollection(collection, environmentUid);
+
+ if(environment) {
+ collection.environments = filter(collection.environments, (e) => e.uid !== environmentUid);
+ }
+ }
+ },
newItem: (state, action) => {
const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
@@ -690,6 +724,9 @@ export const {
renameCollection,
deleteCollection,
loadCollections,
+ addEnvironment,
+ renameEnvironment,
+ deleteEnvironment,
newItem,
deleteItem,
renameItem,
diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js
index 4d8bbda2a..29542a65c 100644
--- a/packages/bruno-app/src/utils/collections/index.js
+++ b/packages/bruno-app/src/utils/collections/index.js
@@ -117,6 +117,10 @@ export const recursivelyGetAllItemUids = (items = []) => {
return map(flattenedItems, (i) => i.uid);
};
+export const findEnvironmentInCollection = (collection, envUid) => {
+ return find(collection.environments, (e) => e.uid === envUid);
+}
+
export const transformCollectionToSaveToIdb = (collection, options = {}) => {
const copyHeaders = (headers) => {
return map(headers, (header) => {
@@ -233,6 +237,7 @@ export const transformCollectionToSaveToIdb = (collection, options = {}) => {
collectionToSave.name = collection.name;
collectionToSave.uid = collection.uid;
collectionToSave.items = [];
+ collectionToSave.environments = collection.environments || [];
copyItems(collection.items, collectionToSave.items);
diff --git a/packages/bruno-schema/src/collections/index.js b/packages/bruno-schema/src/collections/index.js
index 5aa1e38a4..e20e2a4c9 100644
--- a/packages/bruno-schema/src/collections/index.js
+++ b/packages/bruno-schema/src/collections/index.js
@@ -1,6 +1,21 @@
const Yup = require('yup');
const { uidSchema } = require("../common");
+const environmentVariablesSchema = Yup.object({
+ uid: uidSchema,
+ name: Yup.string().nullable().max(256, 'name must be 256 characters or less').defined(),
+ value: Yup.string().nullable().max(2048, 'value must be 2048 characters or less').defined(),
+ type: Yup.string().oneOf(['text']).required('type is required'),
+ enabled: Yup.boolean().defined()
+}).noUnknown(true).strict();
+
+
+const environmentSchema = Yup.object({
+ uid: uidSchema,
+ name: Yup.string().min(1).max(50, 'name must be 50 characters or less').required('name is required'),
+ variables: Yup.array().of(environmentVariablesSchema).required('variables are required')
+}).noUnknown(true).strict();
+
const keyValueSchema = Yup.object({
uid: uidSchema,
name: Yup.string().nullable().max(256, 'name must be 256 characters or less').defined(),
@@ -55,6 +70,7 @@ const collectionSchema = Yup.object({
.max(50, 'name must be 100 characters or less')
.required('name is required'),
items: Yup.array().of(itemSchema),
+ environments: Yup.array().of(environmentSchema),
pathname: Yup.string().max(1024, 'pathname cannot be more than 1024 characters').nullable()
}).noUnknown(true).strict();