Skip to content
Snippets Groups Projects
SubsonicTokenForm.vue 4.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
      <form class="ui form" @submit.prevent="requestNewToken()">
    
        <h2><translate>Subsonic API password</translate></h2>
    
        <p class="ui message" v-if="!subsonicEnabled">
    
          <translate>The Subsonic API is not available on this Funkwhale instance.</translate>
    
    Jo Vuit's avatar
    Jo Vuit committed
          <translate>Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate>You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
    
          <translate>However, accessing Funkwhale from those clients require a separate password you can set below.</translate>
    
        <p><a href="https://docs.funkwhale.audio/users/apps.html#subsonic-compatible-clients" target="_blank">
    
          <translate>Discover how to use Funkwhale from other apps</translate>
    
        </a></p>
        <div v-if="success" class="ui positive message">
          <div class="header">{{ successMessage }}</div>
        </div>
        <div v-if="subsonicEnabled && errors.length > 0" class="ui negative message">
    
          <div class="header"><translate>Error</translate></div>
    
          <ul class="list">
            <li v-for="error in errors">{{ error }}</li>
          </ul>
        </div>
        <template v-if="subsonicEnabled">
          <div v-if="token" class="field">
            <password-input v-model="token" />
          </div>
          <dangerous-button
            v-if="token"
            color="grey"
            :class="['ui', {'loading': isLoading}, 'button']"
            :action="requestNewToken">
    
            <translate>Request a new password</translate>
            <p slot="modal-header"><translate>Request a new Subsonic API password?</translate></p>
            <p slot="modal-content"><translate>This will log you out from existing devices that use the current password.</translate></p>
            <p slot="modal-confirm"><translate>Request a new password</translate></p>
    
          </dangerous-button>
          <button
            v-else
            color="grey"
            :class="['ui', {'loading': isLoading}, 'button']"
    
            @click="requestNewToken"><translate>Request a password</translate></button>
    
            <dangerous-button
              v-if="token"
              color="yellow"
              :class="['ui', {'loading': isLoading}, 'button']"
              :action="disable">
    
              <translate>Disable Subsonic access</translate>
              <p slot="modal-header"><translate>Disable Subsonic API access?</translate></p>
              <p slot="modal-content"><translate>This will completely disable access to the Subsonic API using from account.</translate></p>
              <p slot="modal-confirm"><translate>Disable access</translate></p>
    
            </dangerous-button>
        </template>
      </form>
    </template>
    
    <script>
    import axios from 'axios'
    import PasswordInput from '@/components/forms/PasswordInput'
    
    export default {
      components: {
        PasswordInput
      },
      data () {
        return {
          token: null,
          errors: [],
          success: false,
          isLoading: false,
          successMessage: ''
        }
      },
      created () {
        this.fetchToken()
      },
      methods: {
        fetchToken () {
          this.success = false
          this.errors = []
          this.isLoading = true
          let self = this
          let url = `users/users/${this.$store.state.auth.username}/subsonic-token/`
          return axios.get(url).then(response => {
            self.token = response.data['subsonic_api_token']
            self.isLoading = false
          }, error => {
            self.isLoading = false
            self.errors = error.backendErrors
          })
        },
        requestNewToken () {
    
    Eliot Berriot's avatar
    Eliot Berriot committed
          this.successMessage = this.$gettext('Password updated')
    
          this.success = false
          this.errors = []
          this.isLoading = true
          let self = this
          let url = `users/users/${this.$store.state.auth.username}/subsonic-token/`
          return axios.post(url, {}).then(response => {
            self.token = response.data['subsonic_api_token']
            self.isLoading = false
            self.success = true
          }, error => {
            self.isLoading = false
            self.errors = error.backendErrors
          })
        },
        disable () {
    
    Eliot Berriot's avatar
    Eliot Berriot committed
          this.successMessage = this.$gettext('Access disabled')
    
          this.success = false
          this.errors = []
          this.isLoading = true
          let self = this
          let url = `users/users/${this.$store.state.auth.username}/subsonic-token/`
          return axios.delete(url).then(response => {
            self.isLoading = false
            self.token = null
            self.success = true
          }, error => {
            self.isLoading = false
            self.errors = error.backendErrors
          })
        }
      },
      computed: {
        subsonicEnabled () {
          return this.$store.state.instance.settings.subsonic.enabled.value
        }
      }
    }
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style scoped>
    </style>