PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / assets / src / js / frontend / profile / cover-image.js

cover-image.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.8, at assets/src/js/frontend/profile/cover-image.js

258 lines 7.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import 'cropperjs/dist/cropper.css';
2 import Cropper from 'cropperjs';
3 import * as Util from '../../utils.js';
4 import API from '../../api.js';
5 import Toastify from 'toastify-js';
6 import 'toastify-js/src/toastify.css';
7
8 const profileCoverImage = () => {
9 const lpSet = new Set();
10 let cropper;
11 let elBtnSave, elBtnRemove, elBtnChoose, elBtnCancel,
12 elImagePreview, elCoverImageBackground, elImgCoverImageBackground, elImageEmpty,
13 formCoverImage, elInputFile, elAction, imgUrlOriginal;
14 const className = {
15 formCoverImage: 'lp-user-cover-image',
16 BtnChooseCoverImage: 'lp-btn-choose-cover-image',
17 BtnSaveCoverImage: 'lp-btn-save-cover-image',
18 BtnRemoveCoverImage: 'lp-btn-remove-cover-image',
19 BtnCancelCoverImage: 'lp-btn-cancel-cover-image',
20 BtnToEditCoverImage: 'lp-btn-to-edit-cover-image',
21 CoverImagePreview: 'lp-cover-image-preview',
22 CoverImageEmpty: 'lp-cover-image-empty',
23 CoverImageBackground: 'lp-user-cover-image_background',
24 InputFile: 'lp-cover-image-file',
25 loading: 'loading',
26 hidden: 'lp-hidden',
27 };
28
29 /**
30 * Get elements to use.
31 */
32 const getElements = () => {
33 elBtnSave = formCoverImage.querySelector( `.${ className.BtnSaveCoverImage }` );
34 elBtnChoose = formCoverImage.querySelector( `.${ className.BtnChooseCoverImage }` );
35 elBtnRemove = formCoverImage.querySelector( `.${ className.BtnRemoveCoverImage }` );
36 elBtnCancel = formCoverImage.querySelector( `.${ className.BtnCancelCoverImage }` );
37 elImagePreview = formCoverImage.querySelector( `.${ className.CoverImagePreview }` );
38 elCoverImageBackground = document.querySelector( `.${ className.CoverImageBackground }` );
39 elImgCoverImageBackground = elCoverImageBackground.querySelector( `img` );
40 elImageEmpty = formCoverImage.querySelector( `.${ className.CoverImageEmpty }` );
41 elAction = formCoverImage.querySelector( 'input[name=action]' );
42 elInputFile = formCoverImage.querySelector( 'input[name=lp-cover-image-file]' );
43
44 if ( ! lpSet.has( 'everClick' ) ) {
45 imgUrlOriginal = elImagePreview.src;
46 lpSet.add( 'everClick' );
47 }
48 };
49
50 const fetchAPI = ( formData ) => {
51 const callBack = {
52 success: ( response ) => {
53 const { status, message, data } = response;
54
55 Toastify( {
56 text: message,
57 gravity: lpData.toast.gravity, // `top` or `bottom`
58 position: lpData.toast.position, // `left`, `center` or `right`
59 className: `${ lpData.toast.classPrefix } ${ status }`,
60 close: lpData.toast.close == 1,
61 stopOnFocus: lpData.toast.stopOnFocus == 1,
62 duration: lpData.toast.duration,
63 } ).showToast();
64
65 if ( 'remove' === data.action ) {
66 Util.lpShowHideEl( elBtnRemove, 0 );
67 Util.lpShowHideEl( elBtnChoose, 0 );
68 elImagePreview.src = '';
69 Util.lpShowHideEl( elImagePreview, 0 );
70 Util.lpShowHideEl( elImageEmpty, 1 );
71 if ( elCoverImageBackground ) {
72 Util.lpShowHideEl( elCoverImageBackground, 0 );
73 }
74 } else if ( 'upload' === data.action ) {
75 Util.lpShowHideEl( elImagePreview, 1 );
76 elImagePreview.src = data.url;
77 imgUrlOriginal = data.url;
78 cropper.destroy();
79 }
80
81 imgUrlOriginal = elImagePreview.src;
82 },
83 error: ( error ) => {
84 console.log( error );
85 },
86 completed: () => {
87 Util.lpShowHideEl( elBtnSave, 0 );
88 Util.lpSetLoadingEl( elBtnSave, 0 );
89 Util.lpSetLoadingEl( elBtnRemove, 0 );
90 Util.lpShowHideEl( elBtnCancel, 0 );
91
92 if ( ! elImagePreview.src || elImagePreview.src === window.location.href ) {
93 Util.lpShowHideEl( elBtnRemove, 0 );
94 } else {
95 Util.lpShowHideEl( elBtnRemove, 1 );
96 }
97 },
98 };
99
100 const url = API.frontend.apiProfileCoverImage;
101 const option = { headers: {} };
102 if ( 0 !== parseInt( lpData.user_id ) ) {
103 option.headers[ 'X-WP-Nonce' ] = lpData.nonce;
104 }
105
106 option.method = 'POST';
107 option.body = formData;
108
109 Util.lpFetchAPI( url, option, callBack );
110 };
111
112 // Events
113 document.addEventListener( 'click', ( e ) => {
114 const target = e.target;
115
116 if ( target.classList.contains( className.BtnToEditCoverImage ) ) {
117 formCoverImage = document.querySelector( `.${ className.formCoverImage }` );
118 if ( ! formCoverImage ) {
119 return;
120 }
121
122 const isCorrectSection = target.dataset.sectionCorrect == 1;
123 if ( isCorrectSection ) {
124 e.preventDefault();
125 formCoverImage.scrollIntoView( { behavior: 'smooth', block: 'center' } );
126 }
127 }
128
129 formCoverImage = target.closest( `.${ className.formCoverImage }` );
130 if ( ! formCoverImage ) {
131 return;
132 }
133
134 getElements();
135 if ( target.classList.contains( className.BtnChooseCoverImage ) ) {
136 e.preventDefault();
137 elInputFile.click();
138 }
139 if ( target.classList.contains( className.BtnSaveCoverImage ) ) {
140 Util.lpSetLoadingEl( elBtnSave, 1 );
141 }
142 if ( target.classList.contains( className.BtnCancelCoverImage ) ) {
143 e.preventDefault();
144 cropper.destroy();
145 elImagePreview.src = imgUrlOriginal;
146 if ( imgUrlOriginal === window.location.href ) {
147 Util.lpShowHideEl( elImageEmpty, 1 );
148 Util.lpShowHideEl( elBtnChoose, 0 );
149 Util.lpShowHideEl( elImagePreview, 0 );
150 } else {
151 Util.lpShowHideEl( elBtnRemove, 1 );
152 }
153
154 Util.lpShowHideEl( elBtnSave, 0 );
155 Util.lpShowHideEl( elBtnCancel, 0 );
156 }
157 if ( target.classList.contains( className.BtnRemoveCoverImage ) ) {
158 e.preventDefault();
159 target.classList.add( 'loading' );
160 if ( cropper ) {
161 cropper.destroy();
162 cropper = undefined;
163 }
164 elAction.value = 'remove';
165 elBtnSave.click();
166 }
167 if ( target.classList.contains( className.CoverImageEmpty ) ) {
168 e.preventDefault();
169 elInputFile.click();
170 }
171 } );
172 document.addEventListener( 'change', ( e ) => {
173 const target = e.target;
174
175 formCoverImage = target.closest( `.${ className.formCoverImage }` );
176 if ( ! formCoverImage ) {
177 return;
178 }
179
180 getElements();
181 if ( target.classList.contains( className.InputFile ) ) {
182 e.preventDefault();
183 const file = target.files[ 0 ];
184 if ( ! file ) {
185 return;
186 }
187
188 const allowType = [ 'image/png', 'image/jpeg', 'image/webp' ];
189 if ( allowType.indexOf( file.type ) < 0 ) {
190 return;
191 }
192
193 elAction.value = 'upload';
194 Util.lpShowHideEl( elImagePreview, 1 );
195 Util.lpShowHideEl( elImageEmpty, 0 );
196 Util.lpShowHideEl( elBtnRemove, 0 );
197 Util.lpShowHideEl( elBtnSave, 1 );
198 Util.lpShowHideEl( elBtnChoose, 1 );
199 Util.lpShowHideEl( elBtnCancel, 1 );
200
201 const reader = new FileReader();
202 reader.onload = function( e ) {
203 elImagePreview.src = e.target.result;
204 // Destroy previous cropper instance if any
205 if ( cropper ) {
206 cropper.destroy();
207 }
208 // Initialize cropper
209 cropper = new Cropper( elImagePreview, {
210 aspectRatio: lpData.coverImageRatio,
211 viewMode: 1,
212 zoomOnWheel: false,
213 } );
214 };
215 reader.readAsDataURL( file );
216 }
217 } );
218 document.addEventListener( 'submit', ( e ) => {
219 const target = e.target;
220
221 if ( target.classList.contains( className.formCoverImage ) ) {
222 e.preventDefault();
223 const formData = new FormData( target );
224
225 if ( undefined !== cropper ) {
226 const canvas = cropper.getCroppedCanvas( {} );
227 if ( elCoverImageBackground ) {
228 const dataUrl = canvas.toDataURL( 'image/png' );
229 elCoverImageBackground.style.backgroundImage = `url(${ dataUrl })`;
230 elImgCoverImageBackground.src = dataUrl;
231 Util.lpShowHideEl( elCoverImageBackground, 1 );
232 }
233
234 canvas.toBlob( ( blob ) => {
235 formData.append( 'image', blob, 'cover.png' );
236
237 fetchAPI( formData );
238 }, 'image/png' );
239 } else {
240 fetchAPI( formData );
241 }
242 }
243 } );
244 document.addEventListener( 'DOMContentLoaded', ( e ) => {
245 const elBtnToEditCoverImage = document.querySelector( `.${ className.BtnToEditCoverImage }` );
246 const formCoverImage = document.querySelector( `.${ className.formCoverImage }` );
247
248 if ( elBtnToEditCoverImage && formCoverImage ) {
249 const isCorrectSection = elBtnToEditCoverImage.dataset.sectionCorrect == 1;
250 if ( isCorrectSection ) {
251 formCoverImage.scrollIntoView( { behavior: 'smooth', block: 'center' } );
252 }
253 }
254 } );
255 };
256
257 export default profileCoverImage;
258