Skip to content
Snippets Groups Projects
main.js 3.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • // The Vue build version to load with the `import` command
    // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    import logger from '@/logging'
    
    logger.default.info('Loading environment:', process.env.NODE_ENV)
    logger.default.debug('Environment variables:', process.env)
    
    import Vue from 'vue'
    import App from './App'
    import router from './router'
    
    import axios from 'axios'
    
    import {VueMasonryPlugin} from 'vue-masonry'
    
    import VueLazyload from 'vue-lazyload'
    
    Bat's avatar
    Bat committed
    import i18next from 'i18next'
    
    Bat's avatar
    Bat committed
    import i18nextFetch from 'i18next-fetch-backend'
    
    Bat's avatar
    Bat committed
    import VueI18Next from '@panter/vue-i18next'
    
    import store from './store'
    
    import config from './config'
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    import { sync } from 'vuex-router-sync'
    
    import filters from '@/filters' // eslint-disable-line
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    import globals from '@/components/globals' // eslint-disable-line
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    sync(store, router)
    
    
    window.$ = window.jQuery = require('jquery')
    
    // this is absolutely dirty but at the moment, semantic UI does not
    // play really nice with webpack and I want to get rid of Google Fonts
    // require('./semantic/semantic.css')
    require('semantic-ui-css/semantic.js')
    
    require('masonry-layout')
    
    Bat's avatar
    Bat committed
    Vue.use(VueI18Next)
    
    Vue.use(VueMasonryPlugin)
    
    Vue.use(VueLazyload)
    
    Bat's avatar
    Bat committed
    Vue.directive('title', {
    
      inserted: (el, binding) => {
        let parts = []
        let instanceName = store.state.instance.settings.instance.name.value
        if (instanceName.length === 0) {
          instanceName = 'Funkwhale'
        }
        parts.unshift(instanceName)
        parts.unshift(binding.value)
        document.title = parts.join(' - ')
      },
      updated: (el, binding) => {
        let parts = []
        let instanceName = store.state.instance.settings.instance.name.value
        if (instanceName.length === 0) {
          instanceName = 'Funkwhale'
        }
        parts.unshift(instanceName)
        parts.unshift(binding.value)
        document.title = parts.join(' - ')
      }
    
    Bat's avatar
    Bat committed
    })
    
    axios.defaults.baseURL = config.API_URL
    axios.interceptors.request.use(function (config) {
      // Do something before request is sent
    
    Eliot Berriot's avatar
    Eliot Berriot committed
      if (store.state.auth.token) {
    
        config.headers['Authorization'] = store.getters['auth/header']
    
      return config
    }, function (error) {
      // Do something with request error
      return Promise.reject(error)
    
    // Add a response interceptor
    axios.interceptors.response.use(function (response) {
    
      return response
    }, function (error) {
    
      error.backendErrors = []
    
      if (error.response.status === 401) {
    
        store.commit('auth/authenticated', false)
        logger.default.warn('Received 401 response from API, redirecting to login form')
        router.push({name: 'login', query: {next: router.currentRoute.fullPath}})
      }
    
      if (error.response.status === 404) {
        error.backendErrors.push('Resource not found')
    
      } else if (error.response.status === 403) {
        error.backendErrors.push('Permission denied')
    
      } else if (error.response.status === 500) {
        error.backendErrors.push('A server error occured')
      } else if (error.response.data) {
        for (var field in error.response.data) {
          if (error.response.data.hasOwnProperty(field)) {
            error.response.data[field].forEach(e => {
              error.backendErrors.push(e)
            })
          }
        }
      }
      if (error.backendErrors.length === 0) {
    
        error.backendErrors.push(i18next.t('An unknown error occured, ensure your are connected to the internet and your funkwhale instance is up and running'))
    
      // Do something with response error
      return Promise.reject(error)
    })
    
    store.dispatch('auth/check')
    
    Bat's avatar
    Bat committed
    
    // i18n
    
    Bat's avatar
    Bat committed
    i18next
      .use(i18nextFetch)
      .init({
    
    Bat's avatar
    Bat committed
        lng: navigator.language,
    
    Bat's avatar
    Bat committed
        fallbackLng: ['en'],
    
    Bat's avatar
    Bat committed
        preload: [navigator.language, 'en'],
    
    Bat's avatar
    Bat committed
        backend: {
    
          loadPath: '/static/translations/{%lng%}.json'
        },
        interpolation: {
          prefix: '{%',
          suffix: '%}'
    
    Bat's avatar
    Bat committed
        }
    
    Bat's avatar
    Bat committed
      })
    
    Bat's avatar
    Bat committed
    const i18n = new VueI18Next(i18next)
    
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      router,
    
    Bat's avatar
    Bat committed
      i18n,
    
      template: '<App/>',
      components: { App }
    })
    
    logger.default.info('Everything loaded!')