PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
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 1 month ago LearnPage.js 1 month ago LearnPageSkeleton.js 1 month ago ProgressPill.js 1 month ago ScreenshotDialog.js 1 month ago SetupCompleteCard.js 1 month ago StepItem.js 1 month ago useLearnProgress.js 1 month 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