3737 template( v-if ="panel.cropper" )
3838 span.crop-panel-footer__label {{ $t('editor.original') }}: {{ panel.cropper.image.width }}x{{ panel.cropper.image.height }}
3939 span.crop-panel-footer__label {{ $t('editor.cropped') }}: {{ panel.cropper.coordinates.width }}x{{ panel.cropper.coordinates.height }}
40+ vs-tooltip( bottom dark not-arrow )
41+ vs-button( flat active dark size ="mini" : loading= "panel.isBusy" : disabled= "panel.isBusy" @click ="download({ type })" )
42+ AppIcon( name ="charm:download" )
43+ template( #tooltip )
44+ span {{ $t('general.download') }} ({{ $t(`cropType.${type}.title`) }})
4045</template >
4146
4247<script >
43- import { defineComponent , useStore , ref , reactive , computed , onMounted , onUnmounted } from ' @nuxtjs/composition-api'
48+ import { defineComponent , useStore , ref , reactive , computed , onMounted } from ' @nuxtjs/composition-api'
4449import { cropTypeEnum } from ' @/enums'
4550import useEditor from ' @/hooks/useEditor'
4651import { Cropper } from ' vue-advanced-cropper'
@@ -81,15 +86,18 @@ export default defineComponent({
8186 }
8287 },
8388 setup (props ) {
89+ const FileSaver = require (' file-saver' )
90+
8491 const store = useStore ()
85- const { sleep } = useEditor ()
92+ const { sleep , getFileExtension } = useEditor ()
8693
8794 const cropperRef = ref (null )
8895
8996 const isReady = computed (() => store .getters [' editor/isReady' ])
9097 const original = computed (() => store .getters [' editor/original' ])
9198
9299 const panel = reactive ({
100+ isBusy: false ,
93101 cropper: null
94102 })
95103
@@ -136,13 +144,15 @@ export default defineComponent({
136144 const handleOnChangeCropper = ({ coordinates, image, visibleArea, canvas }) => {
137145 panel .cropper = { coordinates, image, visibleArea, canvas }
138146
147+ panel .isBusy = true
139148 store .commit (' editor/SET_IS_BUSY' , true )
140149
141150 canvas .toBlob (blob => {
142151 store .commit (' editor/SET_CROPPED' , { type: props .type , coordinates, file: blob })
143152 }, original .value .file .type )
144153
145154 sleep (1000 ).then (() => {
155+ panel .isBusy = false
146156 store .commit (' editor/SET_IS_BUSY' , false )
147157 })
148158 }
@@ -151,6 +161,20 @@ export default defineComponent({
151161 cropperRef .value .zoom (value)
152162 }
153163
164+ const cropped = computed (() => store .getters [' editor/cropped' ])
165+
166+ const download = ({ type }) => {
167+ store .commit (' editor/SET_IS_BUSY' , true )
168+ panel .isBusy = true
169+
170+ FileSaver .saveAs (cropped .value [type].file , ` image-${ cropped .value [type].key } .${ getFileExtension (original .value .file .name )} ` )
171+
172+ sleep (1000 ).then (() => {
173+ store .commit (' editor/SET_IS_BUSY' , false )
174+ panel .isBusy = false
175+ })
176+ }
177+
154178 onMounted (() => {
155179 window .addEventListener (' resize' , () => {
156180 if (isReady .value ) {
@@ -167,7 +191,8 @@ export default defineComponent({
167191 handleOnSelectFreeFormRatio,
168192 getFreeStencilProps,
169193 handleOnReadyCropper,
170- handleOnChangeCropper
194+ handleOnChangeCropper,
195+ download
171196 }
172197 }
173198})
0 commit comments