Ver código fonte

Fetch and upload letterhead from settings view

master
Immanuel Onyeka 2 anos atrás
pai
commit
6e5cf4b5cd
4 arquivos alterados com 73 adições e 21 exclusões
  1. BIN
      assets/image/empty-letterhead.jpg
  2. +14
    -7
      components/app.vue
  3. +58
    -13
      components/settings.vue
  4. +1
    -1
      skouter.go

BIN
assets/image/empty-letterhead.jpg Ver arquivo

Antes Depois
Largura: 1280  |  Altura: 720  |  Tamanho: 115 KiB

+ 14
- 7
components/app.vue Ver arquivo

@@ -30,6 +30,7 @@ v-else-if="active == 3"
:user="user" :user="user"
:token="token" :token="token"
@updateAvatar="updateAvatar" @updateAvatar="updateAvatar"
@updateLetterhead="updateLetterhead"
v-else-if="active == 4" /> v-else-if="active == 4" />
<sign-out :user="user" v-else-if="active == 5" /> <sign-out :user="user" v-else-if="active == 5" />
</template> </template>
@@ -113,12 +114,16 @@ function getUser() {
this.user.avatar = b this.user.avatar = b
return getLetterhead(token) return getLetterhead(token)
}).then (result => { }).then(b => {
if (!result || !result.length) return // Exit if token is invalid const validTypes = ['image/jpeg', 'image/png']
this.user = result[0] if (!validTypes.includes(b.type) || b.size <= 1) {
if (this.user.letterhead) return fetch("/assets/image/empty-letterhead.jpg").
then(r => r.blob()).then( a => this.user.letterhead = a )
return getAvatar(token) return
}
this.user.letterhead = b
}) })


} }
@@ -150,7 +155,7 @@ function updateAvatar() {


function updateLetterhead() { function updateLetterhead() {
const token = getCookie("skouter") const token = getCookie("skouter")
getAvatar(token).then(b => this.user.letterhead = b) getLetterhead(token).then(b => this.user.letterhead = b)
} }


function getFees() { function getFees() {
@@ -233,6 +238,8 @@ export default {
refreshToken, refreshToken,
updateAvatar, updateAvatar,
getAvatar, getAvatar,
updateLetterhead,
getLetterhead,
}, },
data() { data() {
return { return {


+ 58
- 13
components/settings.vue Ver arquivo

@@ -4,7 +4,7 @@


<section class="form inputs"> <section class="form inputs">
<h3>Avatar</h3> <h3>Avatar</h3>
<canvas class="displayer" width="200" height="200" ref="canvas"></canvas> <canvas class="displayer" width="200" height="200" ref="avatar"></canvas>
<input type="file" <input type="file"
@change="e => uploadAvatar(e.target.files[0])" @change="e => uploadAvatar(e.target.files[0])"
/> />
@@ -14,9 +14,12 @@


<section class="form inputs"> <section class="form inputs">
<h3>Letterhead</h3> <h3>Letterhead</h3>
<span>Header as appears on PDFs.</span> <canvas class="displayer" width="200" height="200" ref="letterhead"></canvas>
<img src="/assets/image/mintberry.jpg" alt="avatar"> <input type="file"
@change="e => uploadLetterhead(e.target.files[0])"
/>
<button>Upload</button> <button>Upload</button>
<label class="error">{{avatarError}}</label>
</section> </section>


<section class="form inputs special"> <section class="form inputs special">
@@ -60,13 +63,14 @@
import { ref, watch, onMounted } from "vue" import { ref, watch, onMounted } from "vue"
import Dialog from "./dialog.vue" import Dialog from "./dialog.vue"


let avatar = ref(null) let avatar = ref(null) // the canvas element
let letterhead = ref(null) // the canvas element
let ready = ref(false) let ready = ref(false)
let avatarChanged = ref(false) let avatarChanged = ref(false)
let avatarError = ref('') let avatarError = ref('')
const canvas = ref(null) let letterheadError = ref('')
const props = defineProps(['user', 'token']) const props = defineProps(['user', 'token'])
const emit = defineEmits(['updateAvatar']) const emit = defineEmits(['updateAvatar', 'updateLetterhead'])


function save() { function save() {
} }
@@ -77,7 +81,7 @@ function check() {


function uploadAvatar(blob) { function uploadAvatar(blob) {
changeAvatar(blob)?.then(() => { changeAvatar(blob)?.then(() => {
canvas.value.toBlob(b => { avatar.value.toBlob(b => {
fetch(`/api/user/avatar`, fetch(`/api/user/avatar`,
{method: 'POST', {method: 'POST',
body: b, body: b,
@@ -92,13 +96,34 @@ function uploadAvatar(blob) {
}) })
canvas.value.toBlob(b => { avatar.value.toBlob(b => {
// uploadAvatar(b) // uploadAvatar(b)
}) })
}

function uploadLetterhead(blob) {
changeLetterhead(blob)?.then(() => {
letterhead.value.toBlob(b => {
fetch(`/api/user/letterhead`,
{method: 'POST',
body: b,
headers: {
"Accept": "application/json",
"Authorization": `Bearer ${props.token}`,
},
}).then(resp => {
if (resp.ok) {emit('updateLetterhead')}
})
})
})
letterhead.value.toBlob(b => {
// uploadAvatar(b)
})
} }



function changeAvatar(blob) { function changeAvatar(blob) {
const validTypes = ['image/jpeg', 'image/png'] const validTypes = ['image/jpeg', 'image/png']
@@ -109,18 +134,38 @@ function changeAvatar(blob) {
avatarError.value = '' avatarError.value = ''
avatar.value = blob
return createImageBitmap(blob, return createImageBitmap(blob,
{resizeWidth: 200, resizeHeight: 200, resizeQuality: 'medium'}). {resizeWidth: 200, resizeHeight: 200, resizeQuality: 'medium'}).
then((img) => { then((img) => {
avatar.value = img avatar.value.getContext("2d").drawImage(img, 0, 0, 200, 200)
canvas.value.getContext("2d").drawImage(img, 0, 0, 200, 200) })
}

function changeLetterhead(blob) {
const validTypes = ['image/jpeg', 'image/png']
if (!validTypes.includes(blob.type)) {
letterheadError.value = 'Image must be JPEG of PNG format'
return
}
letterheadError.value = ''
return createImageBitmap(blob,
{resizeWidth: 200, resizeHeight: 200, resizeQuality: 'medium'}).
then((img) => {
letterhead.value.getContext("2d").drawImage(img, 0, 0, 200, 200)
}) })
} }


watch(props.user, () => { watch(props.user, () => {
if (!props.user.avatar) return if (props.user.avatar) {
changeAvatar(props.user.avatar) changeAvatar(props.user.avatar)
}
if (props.user.letterhead) {
changeLetterhead(props.user.letterhead)
}
}, {immediate: true}) }, {immediate: true})


</script> </script>

+ 1
- 1
skouter.go Ver arquivo

@@ -1067,7 +1067,7 @@ func setLetterhead(w http.ResponseWriter, db *sql.DB, r *http.Request) {
} }
if !isValidType { http.Error(w, "Invalid file type.", 422); return } if !isValidType { http.Error(w, "Invalid file type.", 422); return }


err = insertAvatar(db, claims.Id, img) err = insertLetterhead(db, claims.Id, img)
if err != nil { http.Error(w, "Could not insert.", 500); return } if err != nil { http.Error(w, "Could not insert.", 500); return }
} }




||||||
x
 
000:0
Carregando…
Cancelar
Salvar