PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.6.9.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.6.9.1
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 / apps / js / frontend / single-curriculum / skeleton.js

skeleton.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.1.6.9.1, at assets/src/apps/js/frontend/single-curriculum/skeleton.js

283 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1
2 // Rest API load content in Tab Curriculum - Nhamdv.
3 import { addQueryArgs } from '@wordpress/url';
4 import apiFetch from '@wordpress/api-fetch';
5 import scrollToItemCurrent from './scrolltoitem';
6 import { searchCourseContent } from './components/search';
7
8 export default function courseCurriculumSkeleton( courseID = '' ) {
9 const Sekeleton = () => {
10 const elementCurriculum = document.querySelector( '.learnpress-course-curriculum' );
11
12 if ( ! elementCurriculum ) {
13 return;
14 }
15
16 getResponse( elementCurriculum );
17 };
18
19 const getResponse = async ( ele ) => {
20 const skeleton = ele.querySelector( '.lp-skeleton-animation' );
21 const itemID = ele.dataset.id;
22 const sectionID = ele.dataset.section;
23
24 try {
25 const page = 1;
26 const response = await apiFetch( {
27 path: addQueryArgs( 'lp/v1/lazy-load/course-curriculum', {
28 courseId: courseID || lpGlobalSettings.post_id || '',
29 page,
30 sectionID: sectionID || '',
31 } ),
32 method: 'GET',
33 } );
34
35 const { data, status, message } = response;
36 let section_ids = data.section_ids;
37
38 if ( status === 'error' ) {
39 throw new Error( message || 'Error' );
40 }
41
42 let returnData = data.content;
43 if ( undefined === returnData ) { // For old Eduma <= 4.6.0
44 returnData = data;
45 section_ids = response.section_ids;
46 }
47
48 if ( sectionID ) {
49 if ( section_ids && ! section_ids.includes( sectionID ) ) {
50 const response2 = await getResponsive( '', page + 1, sectionID );
51
52 if ( response2 ) {
53 const { data2, pages2, page2 } = response2;
54
55 await parseContentItems( { ele, returnData, sectionID, itemID, data2, pages2, page2 } );
56 }
57 } else {
58 await parseContentItems( { ele, returnData, sectionID, itemID } );
59 }
60 } else {
61 returnData && ele.insertAdjacentHTML( 'beforeend', returnData );
62 }
63 } catch ( error ) {
64 ele.insertAdjacentHTML( 'beforeend', `<div class="lp-ajax-message error" style="display:block">${ error.message || 'Error: Query lp/v1/lazy-load/course-curriculum' }</div>` );
65 }
66
67 skeleton && skeleton.remove();
68
69 searchCourseContent();
70 };
71
72 const parseContentItems = async ( { ele, returnData, sectionID, itemID, data2, pages2, page2 } ) => {
73 const parser = new DOMParser();
74 const doc = parser.parseFromString( returnData, 'text/html' );
75
76 if ( data2 ) {
77 const sections = doc.querySelector( '.curriculum-sections' );
78
79 const loadMoreBtn = doc.querySelector( '.curriculum-more__button' );
80
81 if ( loadMoreBtn ) {
82 if ( pages2 <= page2 ) {
83 loadMoreBtn.remove();
84 } else {
85 loadMoreBtn.dataset.page = page2;
86 }
87 }
88
89 sections.insertAdjacentHTML( 'beforeend', data2 );
90 }
91
92 const section = doc.querySelector( `[data-section-id="${ sectionID }"]` );
93
94 if ( section ) {
95 const items = section.querySelectorAll( '.course-item' );
96 const item_ids = [ ...items ].map( ( item ) => item.dataset.id );
97 const sectionContent = section.querySelector( '.section-content' );
98 const itemLoadMore = section.querySelector( '.section-item__loadmore' );
99
100 if ( itemID && ! item_ids.includes( itemID ) ) {
101 const responseItem = await getResponsiveItem( '', 2, sectionID, itemID );
102
103 const { data3, pages3, paged3, page } = responseItem;
104
105 if ( pages3 <= paged3 || pages3 <= page ) {
106 itemLoadMore.remove();
107 } else {
108 itemLoadMore.dataset.page = page;
109 }
110
111 if ( data3 && sectionContent ) {
112 sectionContent.insertAdjacentHTML( 'beforeend', data3 );
113 }
114 }
115 }
116
117 ele.insertAdjacentHTML( 'beforeend', doc.body.innerHTML );
118
119 scrollToItemCurrent.init();
120 };
121
122 const getResponsiveItem = async ( returnData, paged, sectionID, itemID ) => {
123 const response = await apiFetch( {
124 path: addQueryArgs( 'lp/v1/lazy-load/course-curriculum-items', {
125 sectionId: sectionID || '',
126 page: paged,
127 } ),
128 method: 'GET',
129 } );
130
131 const { data, status, pages, message } = response;
132
133 const { page } = data;
134
135 let item_ids;
136
137 if ( status === 'success' ) {
138 let dataTmp = data.content;
139 item_ids = data.item_ids;
140
141 if ( undefined === dataTmp ) { // For old Eduma <= 4.6.0
142 dataTmp = data;
143 item_ids = response.item_ids;
144 }
145
146 returnData += dataTmp;
147
148 if ( sectionID && item_ids && itemID && ! item_ids.includes( itemID ) ) {
149 return getResponsiveItem( returnData, paged + 1, sectionID, itemID );
150 }
151 }
152
153 return { data3: returnData, pages3: pages || data.pages, status3: status, message3: message, page: page || 0 };
154 };
155
156 const getResponsive = async ( returnData, page, sectionID ) => {
157 const response = await apiFetch( {
158 path: addQueryArgs( 'lp/v1/lazy-load/course-curriculum', {
159 courseId: courseID || lpGlobalSettings.post_id || '',
160 page,
161 sectionID: sectionID || '',
162 loadMore: true,
163 } ),
164 method: 'GET',
165 } );
166
167 const { data, status, message } = response;
168
169 let returnDataTmp = data.content;
170 let section_ids = data.section_ids;
171 let pages = data.pages;
172 if ( undefined === returnDataTmp ) { // For old Eduma <= 4.6.0
173 returnDataTmp = data;
174 section_ids = response.section_ids;
175 pages = response.pages;
176 }
177
178 if ( status === 'success' ) {
179 returnData += returnDataTmp;
180
181 if ( sectionID && section_ids && section_ids.length > 0 && ! section_ids.includes( sectionID ) ) {
182 return getResponsive( returnData, page + 1, sectionID );
183 }
184 }
185
186 return { data2: returnData, pages2: pages || data.pages, page2: page, status2: status, message2: message };
187 };
188
189 Sekeleton();
190
191 document.addEventListener( 'click', ( e ) => {
192 const sectionBtns = document.querySelectorAll( '.section-item__loadmore' );
193
194 [ ...sectionBtns ].map( async ( sectionBtn ) => {
195 if ( sectionBtn.contains( e.target ) ) {
196 const sectionItem = sectionBtn.parentNode;
197 const sectionId = sectionItem.getAttribute( 'data-section-id' );
198 const sectionContent = sectionItem.querySelector( '.section-content' );
199
200 const paged = parseInt( sectionBtn.dataset.page );
201
202 sectionBtn.classList.add( 'loading' );
203
204 try {
205 const response = await getResponsiveItem( '', paged + 1, sectionId, '' );
206
207 const { data3, pages3, status3, message3 } = response;
208
209 if ( status3 === 'error' ) {
210 throw new Error( message3 || 'Error' );
211 }
212
213 if ( pages3 <= paged + 1 ) {
214 sectionBtn.remove();
215 } else {
216 sectionBtn.dataset.page = paged + 1;
217 }
218
219 sectionContent.insertAdjacentHTML( 'beforeend', data3 );
220 } catch ( e ) {
221 sectionContent.insertAdjacentHTML( 'beforeend', `<div class="lp-ajax-message error" style="display:block">${ e.message || 'Error: Query lp/v1/lazy-load/course-curriculum' }</div>` );
222 }
223
224 sectionBtn.classList.remove( 'loading' );
225
226 searchCourseContent();
227 }
228 } );
229
230 // Load more Sections
231 const moreSections = document.querySelectorAll( '.curriculum-more__button' );
232
233 [ ...moreSections ].map( async ( moreSection ) => {
234 if ( moreSection.contains( e.target ) ) {
235 const paged = parseInt( moreSection.dataset.page );
236
237 const sections = moreSection.parentNode.parentNode.querySelector( '.curriculum-sections' );
238
239 if ( paged && sections ) {
240 moreSection.classList.add( 'loading' );
241
242 try {
243 const response2 = await getResponsive( '', paged + 1, '' );
244
245 const { data2, pages2, status2, message2 } = response2;
246
247 if ( status2 === 'error' ) {
248 throw new Error( message2 || 'Error' );
249 }
250
251 if ( pages2 <= paged + 1 ) {
252 moreSection.remove();
253 } else {
254 moreSection.dataset.page = paged + 1;
255 }
256
257 sections.insertAdjacentHTML( 'beforeend', data2 );
258 } catch ( e ) {
259 sections.insertAdjacentHTML( 'beforeend', `<div class="lp-ajax-message error" style="display:block">${ e.message || 'Error: Query lp/v1/lazy-load/course-curriculum' }</div>` );
260 }
261
262 moreSection.classList.remove( 'loading' );
263
264 searchCourseContent();
265 }
266 }
267 } );
268
269 // Show/Hide accordion
270 if ( document.querySelector( '.learnpress-course-curriculum' ) ) {
271 const sections = document.querySelectorAll( '.section' );
272
273 [ ...sections ].map( ( section ) => {
274 if ( section.contains( e.target ) ) {
275 const toggle = section.querySelector( '.section-left' );
276
277 toggle.contains( e.target ) && section.classList.toggle( 'closed' );
278 }
279 } );
280 }
281 } );
282 }
283