UpdateAvatar.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <b-modal
  3. ref="avatarUpdateModal"
  4. centered
  5. hide-footer
  6. header-class="py-2"
  7. body-class="p-0"
  8. title-class="w-100 text-center pl-4 font-weight-bold"
  9. title-tag="p"
  10. title="Upload Avatar"
  11. >
  12. <input type="file" class="d-none" ref="avatarUpdateRef" @change="handleAvatarUpdate()" accept="image/jpg,image/png">
  13. <div class="d-flex align-items-center justify-content-center">
  14. <div
  15. v-if="avatarUpdateIndex === 0"
  16. class="py-5 user-select-none cursor-pointer"
  17. v-on:drop="handleDrop"
  18. v-on:dragover="handleDrop"
  19. @click="avatarUpdateStep(0)">
  20. <p class="text-center primary">
  21. <i class="fal fa-cloud-upload fa-3x"></i>
  22. </p>
  23. <p class="text-center lead">Drag photo here or click here</p>
  24. <p class="text-center small text-muted mb-0">Must be a <strong>png</strong> or <strong>jpg</strong> image up to 2MB</p>
  25. </div>
  26. <div v-else-if="avatarUpdateIndex === 1" class="w-100 p-5">
  27. <div class="d-md-flex justify-content-between align-items-center">
  28. <div class="text-center mb-4">
  29. <p class="small font-weight-bold" style="opacity:0.7;">Current</p>
  30. <img :src="user.avatar" class="shadow" style="width: 150px;height: 150px;object-fit: cover;border-radius: 18px;opacity: 0.7;">
  31. </div>
  32. <div class="text-center mb-4">
  33. <p class="font-weight-bold">New</p>
  34. <img :src="avatarUpdatePreview" class="shadow" style="width: 220px;height: 220px;object-fit: cover;border-radius: 18px;">
  35. </div>
  36. </div>
  37. <hr>
  38. <div class="d-flex justify-content-between">
  39. <button class="btn btn-light font-weight-bold btn-block mr-3" @click="avatarUpdateClear()">Clear</button>
  40. <button class="btn btn-primary primary font-weight-bold btn-block mt-0" @click="confirmUpload()">Upload</button>
  41. </div>
  42. </div>
  43. </div>
  44. </b-modal>
  45. </template>
  46. <script type="text/javascript">
  47. export default {
  48. props: ['user'],
  49. data() {
  50. return {
  51. loaded: false,
  52. avatarUpdateIndex: 0,
  53. avatarUpdateFile: undefined,
  54. avatarUpdatePreview: undefined
  55. }
  56. },
  57. methods: {
  58. open() {
  59. this.$refs.avatarUpdateModal.show();
  60. },
  61. avatarUpdateClose() {
  62. this.$refs.avatarUpdateModal.hide();
  63. this.avatarUpdateIndex = 0;
  64. this.avatarUpdateFile = undefined;
  65. },
  66. avatarUpdateClear() {
  67. this.avatarUpdateIndex = 0;
  68. this.avatarUpdateFile = undefined;
  69. },
  70. avatarUpdateStep(index) {
  71. this.$refs.avatarUpdateRef.click();
  72. this.avatarUpdateIndex = index;
  73. },
  74. handleAvatarUpdate() {
  75. let self = this;
  76. let files = event.target.files;
  77. Array.prototype.forEach.call(files, function(io, i) {
  78. self.avatarUpdateFile = io;
  79. self.avatarUpdatePreview = URL.createObjectURL(io);
  80. self.avatarUpdateIndex = 1;
  81. });
  82. },
  83. handleDrop(ev) {
  84. ev.preventDefault();
  85. let self = this;
  86. if (ev.dataTransfer.items) {
  87. for (var i = 0; i < ev.dataTransfer.items.length; i++) {
  88. if (ev.dataTransfer.items[i].kind === 'file') {
  89. var file = ev.dataTransfer.items[i].getAsFile();
  90. if(!file) {
  91. return;
  92. }
  93. self.avatarUpdateFile = file;
  94. self.avatarUpdatePreview = URL.createObjectURL(file);
  95. self.avatarUpdateIndex = 1;
  96. }
  97. }
  98. } else {
  99. for (var i = 0; i < ev.dataTransfer.files.length; i++) {
  100. if(!ev.dataTransfer.files[i].hasOwnProperty('name')) {
  101. return;
  102. }
  103. self.avatarUpdateFile = ev.dataTransfer.files[i];
  104. self.avatarUpdatePreview = URL.createObjectURL(ev.dataTransfer.files[i]);
  105. self.avatarUpdateIndex = 1;
  106. }
  107. }
  108. },
  109. confirmUpload() {
  110. if(!window.confirm('Are you sure you want to change your avatar photo?')) {
  111. return;
  112. }
  113. let formData = new FormData();
  114. formData.append('_method', 'PATCH');
  115. formData.append('avatar', this.avatarUpdateFile);
  116. axios.post('/api/v1/accounts/update_credentials', formData)
  117. .then(res => {
  118. window._sharedData.user.avatar = res.data.avatar;
  119. this.avatarUpdateClose();
  120. })
  121. .catch(err => {
  122. if(err.response.data && err.response.data.errors) {
  123. if(err.response.data.errors.avatar && err.response.data.errors.avatar.length) {
  124. swal('Oops!', err.response.data.errors.avatar[0], 'error');
  125. }
  126. }
  127. })
  128. }
  129. }
  130. }
  131. </script>