PluginProbe ʕ •ᴥ•ʔ
Presto Player / 4.3.2
Presto Player v4.3.2
4.3.2 4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / dashboard / pages / learn / useLearnProgress.js
presto-player / src / admin / dashboard / pages / learn Last commit date
ChapterCard.js 2 months ago LearnPage.js 2 months ago LearnPageSkeleton.js 2 months ago ProgressPill.js 2 months ago ScreenshotDialog.js 2 months ago SetupCompleteCard.js 2 months ago StepItem.js 2 months ago useLearnProgress.js 2 months ago
useLearnProgress.js
103 lines
1 import { useCallback, useEffect, useState } from '@wordpress/element';
2 import apiFetch from '@wordpress/api-fetch';
3 import { toast } from '@bsf/force-ui';
4
5 const { __ } = wp.i18n;
6
7 /**
8 * Fetches Learn chapters from the REST API and exposes a toggle function
9 * for marking individual steps complete/incomplete.
10 *
11 * Each step carries a `completed` boolean merged server-side from the
12 * current user's saved progress. State updates are optimistic: the UI
13 * flips immediately, and we roll back on API failure with a toast.
14 */
15 const useLearnProgress = () => {
16 const [ chapters, setChapters ] = useState( [] );
17 const [ isLoading, setIsLoading ] = useState( true );
18 const [ error, setError ] = useState( null );
19
20 const loadChapters = useCallback( async () => {
21 setIsLoading( true );
22 try {
23 const response = await apiFetch( {
24 path: '/presto-player/v1/get-learn-chapters',
25 method: 'GET',
26 } );
27 if ( Array.isArray( response ) ) {
28 setChapters( response );
29 }
30 } catch ( err ) {
31 setError( err );
32 toast.error( {
33 title: __( 'Failed to load learn chapters.', 'presto-player' ),
34 } );
35 } finally {
36 setIsLoading( false );
37 }
38 }, [] );
39
40 useEffect( () => {
41 loadChapters();
42 }, [ loadChapters ] );
43
44 const setStepCompleted = useCallback(
45 async ( chapterId, stepId, completed ) => {
46 // Optimistic update.
47 setChapters( ( prev ) =>
48 prev.map( ( chapter ) => {
49 if ( chapter.id !== chapterId ) {
50 return chapter;
51 }
52 return {
53 ...chapter,
54 steps: chapter.steps.map( ( step ) =>
55 step.id === stepId ? { ...step, completed } : step
56 ),
57 };
58 } )
59 );
60
61 try {
62 await apiFetch( {
63 path: '/presto-player/v1/update-learn-progress',
64 method: 'POST',
65 data: { chapterId, stepId, completed },
66 } );
67 } catch ( err ) {
68 // Revert on failure.
69 setChapters( ( prev ) =>
70 prev.map( ( chapter ) => {
71 if ( chapter.id !== chapterId ) {
72 return chapter;
73 }
74 return {
75 ...chapter,
76 steps: chapter.steps.map( ( step ) =>
77 step.id === stepId ? { ...step, completed: ! completed } : step
78 ),
79 };
80 } )
81 );
82 toast.error( {
83 title: __(
84 'Could not update your progress. Please try again.',
85 'presto-player'
86 ),
87 } );
88 }
89 },
90 []
91 );
92
93 return {
94 chapters,
95 isLoading,
96 error,
97 setStepCompleted,
98 reload: loadChapters,
99 };
100 };
101
102 export default useLearnProgress;
103