Fix some linter errors, use blob URL for download

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2023-09-23 17:11:28 +02:00
parent 69c2b09bcc
commit b8fd877654
No known key found for this signature in database
GPG Key ID: D91C3E91E4CAD6F5
6 changed files with 28 additions and 16 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
src/langs/langs.tpl.js

View File

@ -1,7 +1,6 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@ -64,4 +63,3 @@
></script>
</body>
</html>

View File

@ -1,3 +1,4 @@
<!-- eslint-disable vue/no-v-html -->
<template>
<div id="app">
<b-navbar
@ -76,7 +77,10 @@
v-html="$t('title-explanation')"
/>
<ul>
<li v-for="explanation in $t('items-explanation')">
<li
v-for="(explanation, idx) in $t('items-explanation')"
:key="`idx${idx}`"
>
{{ explanation }}
</li>
</ul>
@ -255,7 +259,7 @@
<i class="fas fa-fw fa-clipboard" />
</b-button>
<b-button
:href="`data:text/plain;charset=UTF-8,${encodeURIComponent(secret)}`"
:href="secretContentBlobURL"
download
title="Download Secret as Text File"
>
@ -305,6 +309,8 @@
</template>
<script>
/* global maxSecretExpire */
import crypto from './crypto.js'
import qrcode from 'qrcode'
@ -351,10 +357,11 @@ export default {
explanationShown: false,
mode: 'create',
secret: '',
secretContentBlobURL: '',
secretContentQRDataURL: '',
secretExpiry: null,
secretId: '',
secretQRDataURL: '',
secretContentQRDataURL: '',
securePassword: '',
selectedExpiry: null,
showError: false,
@ -443,7 +450,7 @@ export default {
window.setTimeout(() => this.$refs.secretUrl.focus(), 100)
})
})
.catch(err => {
.catch(() => {
// Network error
this.error = this.$t('alert-something-went-wrong')
this.showError = true
@ -533,7 +540,7 @@ export default {
})
})
})
.catch(err => {
.catch(() => {
// Network error
this.error = this.$t('alert-something-went-wrong')
this.showError = true
@ -558,6 +565,11 @@ export default {
},
secret(to) {
if (this.secretContentBlobURL) {
window.URL.revokeObjectURL(this.secretContentBlobURL)
}
this.secretContentBlobURL = window.URL.createObjectURL(new Blob([to], { type: 'text/plain' }))
if (this.customize.disableQRSupport || !to) {
return
}
@ -566,7 +578,9 @@ export default {
.then(url => {
this.secretContentQRDataURL = url
})
.catch(() => this.secretContentQRDataURL = null)
.catch(() => {
this.secretContentQRDataURL = null
})
},
secretUrl(to) {

View File

@ -1,8 +1,6 @@
// Auto-Generated, do not edit!
const switchFormal = (formal, informal) => {
return window.useFormalLanguage ? formal : informal
}
const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
export default {
'ca': JSON.parse('{"alert-secret-not-found":"Aquest no és el secret que busques\u0026hellip; - Si esperaves que el secret estiguera ací, és possible que s\'haja vist compromés, ja que una altra persona podria haver obert l\'enllaç en comptes de tu.","alert-something-went-wrong":"Alguna cosa ha eixit malament. Ens sap molt greu\u0026hellip;","btn-create-secret":"Crea el secret!","btn-new-secret":"Nou secret","btn-reveal-secret":"Mostra\'m el secret!","btn-show-explanation":"Com funciona?","expire-default":"Caducitat predeterminada","expire-n-days":"{n} dia | {n} dies","expire-n-hours":"{n} hora | {n} hores","expire-n-minutes":"{n} minut | {n} minuts","expire-n-seconds":"{n} segon | {n} segons","items-explanation":["Introduïx un secret en el formulari que hi ha en aquesta pàgina","El teu navegador xifra el secret utilitzant una contrasenya generada","Únicament s\'envia al servidor el secret xifrat (mai s\'envien ni el secret sense xifrar ni la contrasenya!)","El servidor emmagatzema el secret xifrat durant un temps limitat","Envia al destinatari l\'enllaç mostrat, que conté l\'identificador del secret i la contrasenya de desxifrat","El destinatari pot veure el secret una sola vegada: si no pot, el secret podria haver sigut vist per una altra persona!","Quan s\'ha obtingut per primera i única vegada el secret xifrat, s\'elimina del servidor"],"label-expiry":"Caduca en:","label-secret-data":"Informació secreta:","text-burn-hint":"Per favor, recorda no accedir a aquest enllaç tu mateix, ja que això destruiria el secret. Només has de passar-li\'l a una altra persona!","text-burn-time":"Si no es mostra abans, aquest secret s\'eliminarà automàticament:","text-hint-burned":"\u003cstrong\u003eAtenció:\u003c/strong\u003e Només veuràs això una vegada. Quan recarregues la pàgina, el secret desapareixerà, així que copia\'l ja\u0026hellip;","text-powered-by":"Funciona amb","text-pre-reveal-hint":"Per a mostrar el secret prem aquest botó, però tingues en compte que en fer-ho es destruirà. Només pots veure\'l una vegada!","text-pre-url":"El teu secret ha sigut creat i emmagatzemat en el següent enllaç:","text-secret-create-disabled":"La creació de nous secrets està desactivada en aquesta instància.","title-explanation":"Així és com funciona\u0026hellip;","title-new-secret":"Crea un nou secret","title-reading-secret":"Obtenint el teu secret\u0026hellip;","title-secret-create-disabled":"S\'ha desactivat la creació de secrets...","title-secret-created":"Secret creat!"}'),

View File

@ -1,8 +1,6 @@
// Auto-Generated, do not edit!
const switchFormal = (formal, informal) => {
return window.useFormalLanguage ? formal : informal
}
const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
export default {
{{- range $lang, $translation := .Translations -}}

View File

@ -1,3 +1,5 @@
/* eslint-disable sort-imports */
/* global version */
import Vue from 'vue'
import VueI18n from 'vue-i18n'
@ -16,15 +18,16 @@ const cookieSet = Object.fromEntries(document.cookie.split('; ')
.map(el => decodeURIComponent(el))))
const i18n = new VueI18n({
locale: cookieSet.lang || navigator?.language || 'en',
fallbackLocale: 'en',
locale: cookieSet.lang || navigator?.language || 'en',
messages,
})
new Vue({
el: '#app',
components: { app },
data: { version },
el: '#app',
i18n,
name: 'OTSAppInterface',
render: createElement => createElement('app'),
})