diff --git a/ui/package.json b/ui/package.json index ba6227c..2156369 100644 --- a/ui/package.json +++ b/ui/package.json @@ -23,9 +23,11 @@ "@vue/cli-plugin-typescript": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/eslint-config-typescript": "^9.1.0", + "axios": "^0.18.0", "eslint": "^7.32.0", "eslint-plugin-vue": "^8.0.3", "typescript": "~4.5.5", + "vue-cli-plugin-axios": "~0.0.4", "vue-template-compiler": "^2.6.14" } } diff --git a/ui/src/main.ts b/ui/src/main.ts index 839820a..7ccf6c2 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -1,5 +1,6 @@ import Vue from 'vue' import App from './App.vue' +import './plugins/axios' import './registerServiceWorker' Vue.config.productionTip = false diff --git a/ui/src/plugins/axios.js b/ui/src/plugins/axios.js new file mode 100644 index 0000000..834a683 --- /dev/null +++ b/ui/src/plugins/axios.js @@ -0,0 +1,63 @@ +"use strict"; + +import axios from "axios"; +import Vue from 'vue'; + +// Full config: https://github.com/axios/axios#request-config +// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || ''; +// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; +// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; + +let config = { + // baseURL: process.env.baseURL || process.env.apiUrl || "" + // timeout: 60 * 1000, // Timeout + // withCredentials: true, // Check cross-site Access-Control +}; + +const _axios = axios.create(config); + +_axios.interceptors.request.use( + function (config) { + // Do something before request is sent + return config; + }, + function (error) { + // Do something with request error + return Promise.reject(error); + } +); + +// Add a response interceptor +_axios.interceptors.response.use( + function (response) { + // Do something with response data + return response; + }, + function (error) { + // Do something with response error + return Promise.reject(error); + } +); + +Plugin.install = function (Vue, options) { + options; + + Vue.axios = _axios; + window.axios = _axios; + Object.defineProperties(Vue.prototype, { + axios: { + get() { + return _axios; + } + }, + $axios: { + get() { + return _axios; + } + }, + }); +}; + +Vue.use(Plugin) + +export default Plugin; diff --git a/ui/src/plugins/vue-ovdashboard.js b/ui/src/plugins/vue-ovdashboard.js new file mode 100644 index 0000000..4a5d341 --- /dev/null +++ b/ui/src/plugins/vue-ovdashboard.js @@ -0,0 +1,40 @@ +"use strict"; + +import Vue from 'vue'; + +function get_baseurl() { + if (process.env.NODE_ENV === "production") { + return "//" + window.location.host + "/api/v1"; + + } else { + if (process.env.NODE_ENV !== "development") { + console.warn("Unexpected NODE_ENV value"); + } + + return "//" + window.location.hostname + ":8000/api/v1"; + } +} + +Plugin.install = function (Vue, options) { + options; + + Vue.ovd_api_baseurl = get_baseurl(); + window.ovd_api_baseurl = get_baseurl(); + + Object.defineProperties(Vue.prototype, { + ovd_api_baseurl: { + get() { + return get_baseurl(); + } + }, + $ovd_api_baseurl: { + get() { + return get_baseurl(); + } + }, + }); +}; + +Vue.use(Plugin) + +export default Plugin; diff --git a/ui/yarn.lock b/ui/yarn.lock index 1413add..dc97af6 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2075,6 +2075,14 @@ autoprefixer@^10.2.4: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +axios@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + babel-loader@^8.2.2: version "8.2.5" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" @@ -2762,6 +2770,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3445,6 +3460,13 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: version "1.15.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" @@ -3945,6 +3967,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -6366,6 +6393,11 @@ vue-class-component@^7.2.3: resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.6.tgz#8471e037b8e4762f5a464686e19e5afc708502e4" integrity sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w== +vue-cli-plugin-axios@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vue-cli-plugin-axios/-/vue-cli-plugin-axios-0.0.4.tgz#29d4eb48275c7fe15b92e1fd5d95fbe2a966436f" + integrity sha512-p2b/fvPJuPBnvU8027PAAuU5DiOzUn2lku8XLG/f6c8FU0N+/MXWZAlOuHhqd9e7+KIZitwe/c8qlmv7TglbTg== + vue-eslint-parser@^8.0.0, vue-eslint-parser@^8.0.1: version "8.3.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"