<template>
|
<div>
|
|
<el-upload
|
class="pam-avatar-uploader"
|
ref="upload"
|
action="#"
|
:auto-upload="false"
|
:on-change="handleAvatarUploaded"
|
:show-file-list="false"
|
accept="image/png, image/jpeg, image/jpg">
|
<el-avatar
|
|
:size="150"
|
:src="imgSrc"
|
class="pam-avatar cursor--pointer fix-chrome-click--issue"
|
></el-avatar>
|
<div class="pam-avatar-uploader__action-label mt-10 cursor--pointer" >設定相片</div>
|
</el-upload>
|
<div
|
v-if="showResetAvatarBtn"
|
class="pam-avatar-uploader__action-label text--center mt-10 cursor--pointer"
|
@click="resetAvatar">
|
取消上傳相片
|
</div>
|
|
</div>
|
</template>
|
|
<script lang="ts">
|
import { Vue, Component, Prop, PropSync } from 'nuxt-property-decorator';
|
|
import { MessageBox } from 'element-ui';
|
import { MessageBoxData } from 'element-ui/types/message-box';
|
import _ from 'lodash';
|
|
import myConsultantService from '~/shared/services/my-consultant.service';
|
|
@Component
|
export default class editConsultantAvatar extends Vue {
|
|
@Prop({type:String, default:""})
|
agentNo!:string;
|
|
@PropSync('photoBase64',{type:String, default:""})
|
syncPhotoBase64!:string;
|
|
_imgSrc: string = '';
|
imgSrc: string='';
|
|
//////////////////////////////////////////////////////////////////////
|
|
mounted() {
|
if(this.agentNo) this.initConsultantAvatar()
|
}
|
|
private initConsultantAvatar(): void {
|
myConsultantService.getConsultantAvatar(this.agentNo)
|
.then(base64=>
|
this.splitBase64WithCommon(base64)
|
)
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
resetAvatar(): void {
|
this.imgSrc = this._imgSrc;
|
}
|
|
handleAvatarUploaded(file:any): void {
|
const isFollowUploadRule =_.includes(file.raw.type,'image/');
|
isFollowUploadRule ? this.getImgSrc(file) : this.showFileUploadErrorMsg()
|
}
|
|
private getImgSrc(file:any):void{
|
const blob = file.raw;
|
this.blobToBase64(blob).then(base64=>{
|
this.splitBase64WithCommon(base64 as string);
|
});
|
}
|
|
private blobToBase64(blob:File):Promise<string | ArrayBuffer | null> {
|
return new Promise((resolve,reject) => {
|
const reader = new FileReader();
|
reader.readAsDataURL(blob);
|
reader.onloadend = () => {
|
resolve(reader.result)
|
};
|
});
|
}
|
|
private splitBase64WithCommon(base64: string): void {
|
const splitBase64= _.split(base64, ','); // 為了把 data:image , base64 解析分開;
|
this.syncPhotoBase64 = splitBase64[1];
|
// NOTE: 因為目前以 agentNO 取得 avatar 會失敗,
|
// 故加上此判斷來防範不預期顯示'取消按鈕'的狀況。 [Tomas, 2022/1/3]
|
if (!this._imgSrc) {
|
this._imgSrc = base64;
|
}
|
this.imgSrc = base64;
|
}
|
|
private showFileUploadErrorMsg():Promise<MessageBoxData>{
|
return MessageBox({
|
message:`<div class="message-header">上傳格式有誤</div>
|
<div class="message-content">請上傳正確圖檔</div>`,
|
dangerouslyUseHTMLString: true,
|
showClose:false,
|
showConfirmButton:true,
|
confirmButtonText:'確認',
|
customClass:'pam-message-box',
|
closeOnClickModal:false,
|
});
|
}
|
|
get showResetAvatarBtn(): boolean {
|
// NOTE: 因為目前以 agentNO 取得 avatar 會失敗,
|
// 故加上此判斷來防範不預期顯示'取消按鈕'的狀況。 [Tomas, 2022/1/3]
|
if (!this._imgSrc && !this.imgSrc) return false;
|
return this._imgSrc !== this.imgSrc;
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
|
</style>
|