import Vue from "vue"; export const SETTINGS_KEYS = [ /** * The CSS class that should be applied to the root element. * Essentially, the name of the background theme. */ "THEME_CLASS", /** * The hex color code for the currently active theme. */ "THEME_COLOR", /** * The hex color code for browser tab color. */ "THEME_TAB_COLOR", /** * Whether or not THEME_COLOR is considered 'vibrant'. * * For readability reasons, if the THEME_COLOR is vibrant, * any text placed on the theme color will have its color * inverted from white to black. */ "THEME_COLOR_VIBRANT", /** * The Ace editor theme */ "THEME_ACE_EDITOR", /** * Normally, section frames are multicolored in the UI * to emphasise the different sections. * This setting allows that to be turned off. */ "FRAME_COLORS_ENABLED", /** * Whether or not requests should be proxied. */ "PROXY_ENABLED", /** * The URL of the proxy to connect to for requests. */ "PROXY_URL", /** * The security key of the proxy. */ "PROXY_KEY", /** * An array of properties to exclude from the URL. * e.g. 'auth' */ "URL_EXCLUDES" ]; export const state = () => ({ settings: {}, collections: [ { name: "My Collection", folders: [], requests: [] } ], selectedRequest: {}, editingRequest: {} }); export const mutations = { applySetting({ settings }, setting) { if ( setting == null || !(setting instanceof Array) || setting.length !== 2 ) { throw new Error( "You must provide a setting (array in the form [key, value])" ); } const [key, value] = setting; // Do not just remove this check. // Add your settings key to the SETTINGS_KEYS array at the // top of the file. // This is to ensure that application settings remain documented. if (!SETTINGS_KEYS.includes(key)) { throw new Error(`The settings structure does not include the key ${key}`); } settings[key] = value; }, replaceCollections(state, collections) { state.collections = collections; }, importCollections(state, collections) { state.collections = [...state.collections, ...collections]; let index = 0; for (let collection of collections) { collection.collectionIndex = index; index += 1; } }, addNewCollection({ collections }, collection) { collections.push({ name: "", folders: [], requests: [], ...collection }); }, removeCollection({ collections }, payload) { const { collectionIndex } = payload; collections.splice(collectionIndex, 1); }, editCollection({ collections }, payload) { const { collection, collectionIndex } = payload; collections[collectionIndex] = collection; }, addNewFolder({ collections }, payload) { const { collectionIndex, folder } = payload; collections[collectionIndex].folders.push({ name: "", requests: [], ...folder }); }, editFolder({ collections }, payload) { const { collectionIndex, folder, folderIndex } = payload; Vue.set(collections[collectionIndex].folders, folderIndex, folder); }, removeFolder({ collections }, payload) { const { collectionIndex, folderIndex } = payload; collections[collectionIndex].folders.splice(folderIndex, 1); }, addRequest({ collections }, payload) { const { request } = payload; // Request that is directly attached to collection if (request.folder === -1) { collections[request.collection].requests.push(request); return; } collections[request.collection].folders[request.folder].requests.push( request ); }, editRequest({ collections }, payload) { const { requestOldCollectionIndex, requestOldFolderIndex, requestOldIndex, requestNew, requestNewCollectionIndex, requestNewFolderIndex } = payload; const changedCollection = requestOldCollectionIndex !== requestNewCollectionIndex; const changedFolder = requestOldFolderIndex !== requestNewFolderIndex; const changedPlace = changedCollection || changedFolder; // set new request if (requestNewFolderIndex !== undefined) { Vue.set( collections[requestNewCollectionIndex].folders[requestNewFolderIndex] .requests, requestOldIndex, requestNew ); } else { Vue.set( collections[requestNewCollectionIndex].requests, requestOldIndex, requestNew ); } // remove old request if (changedPlace) { if (requestOldFolderIndex !== undefined) { collections[requestOldCollectionIndex].folders[ requestOldFolderIndex ].requests.splice(requestOldIndex, 1); } else { collections[requestOldCollectionIndex].requests.splice( requestOldIndex, 1 ); } } }, saveRequestAs({ collections }, payload) { const { request, collectionIndex, folderIndex, requestIndex } = payload; const specifiedCollection = collectionIndex !== undefined; const specifiedFolder = folderIndex !== undefined; const specifiedRequest = requestIndex !== undefined; if (specifiedCollection && specifiedFolder && specifiedRequest) { Vue.set( collections[collectionIndex].folders[folderIndex].requests, requestIndex, request ); } else if (specifiedCollection && specifiedFolder && !specifiedRequest) { const requests = collections[collectionIndex].folders[folderIndex].requests; const lastRequestIndex = requests.length - 1; Vue.set(requests, lastRequestIndex + 1, request); } else if (specifiedCollection && !specifiedFolder && specifiedRequest) { const requests = collections[collectionIndex].requests; Vue.set(requests, requestIndex, request); } else if (specifiedCollection && !specifiedFolder && !specifiedRequest) { const requests = collections[collectionIndex].requests; const lastRequestIndex = requests.length - 1; Vue.set(requests, lastRequestIndex + 1, request); } }, saveRequest({ collections }, payload) { const { request } = payload; // Remove the old request from collection if (request.hasOwnProperty("oldCollection") && request.oldCollection > -1) { const folder = request.hasOwnProperty("oldFolder") && request.oldFolder >= -1 ? request.oldFolder : request.folder; if (folder > -1) { collections[request.oldCollection].folders[folder].requests.splice( request.requestIndex, 1 ); } else { collections[request.oldCollection].requests.splice( request.requestIndex, 1 ); } } else if ( request.hasOwnProperty("oldFolder") && request.oldFolder !== -1 ) { collections[request.collection].folders[folder].requests.splice( request.requestIndex, 1 ); } delete request.oldCollection; delete request.oldFolder; // Request that is directly attached to collection if (request.folder === -1) { Vue.set( collections[request.collection].requests, request.requestIndex, request ); return; } Vue.set( collections[request.collection].folders[request.folder].requests, request.requestIndex, request ); }, removeRequest({ collections }, payload) { const { collectionIndex, folderIndex, requestIndex } = payload; // Request that is directly attached to collection if (folderIndex === -1) { collections[collectionIndex].requests.splice(requestIndex, 1); return; } collections[collectionIndex].folders[folderIndex].requests.splice( requestIndex, 1 ); }, selectRequest(state, { request }) { state.selectedRequest = Object.assign({}, request); } };