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 / ScreenshotDialog.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
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