PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
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 / ScreenshotDialog.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
ScreenshotDialog.js
74 lines
1 import { useEffect, useState } from '@wordpress/element';
2 import { Dialog, Container, Skeleton, Text } from '@bsf/force-ui';
3 import { ImageOff } from 'lucide-react';
4
5 const { __ } = wp.i18n;
6
7 const ScreenshotDialog = ( { open, onOpenChange, title, screenshot } ) => {
8 const imageUrl = screenshot?.url || '';
9 const alt = screenshot?.alt || title || '';
10 const [ loaded, setLoaded ] = useState( false );
11
12 useEffect( () => {
13 setLoaded( false );
14 }, [ imageUrl ] );
15
16 return (
17 <Dialog open={ open } setOpen={ onOpenChange } exitOnClickOutside>
18 <Dialog.Backdrop />
19 <Dialog.Panel className="!w-full max-w-5xl">
20 <Dialog.Header className="flex flex-row items-center justify-between">
21 <Dialog.Title>{ title }</Dialog.Title>
22 <Dialog.CloseButton />
23 </Dialog.Header>
24 <Dialog.Body style={ { padding: '0 20px 20px' } }>
25 { imageUrl ? (
26 <div className="rounded-xl border border-solid border-border-strong/20 p-2 bg-background-secondary shadow-soft-shadow overflow-hidden">
27 { ! loaded && (
28 <Skeleton className="w-full h-[400px] rounded-lg" />
29 ) }
30 { loaded && (
31 <img
32 src={ imageUrl }
33 alt={ alt }
34 decoding="async"
35 className="block w-full h-auto rounded-lg border border-solid border-border-subtle"
36 />
37 ) }
38 { /* Hidden preloader */ }
39 { ! loaded && (
40 <img
41 src={ imageUrl }
42 alt=""
43 decoding="async"
44 className="hidden"
45 onLoad={ () => setLoaded( true ) }
46 />
47 ) }
48 </div>
49 ) : (
50 <Container
51 containerType="flex"
52 direction="column"
53 justify="center"
54 align="center"
55 gap="xs"
56 className="py-10"
57 >
58 <ImageOff className="w-8 h-8 text-text-tertiary" />
59 <Text size={ 14 } color="secondary">
60 { __(
61 'Screenshot coming soon.',
62 'presto-player'
63 ) }
64 </Text>
65 </Container>
66 ) }
67 </Dialog.Body>
68 </Dialog.Panel>
69 </Dialog>
70 );
71 };
72
73 export default ScreenshotDialog;
74