[ SYSTEM ]: Linux wordpress 6.1.0-44-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.164-1 (2026-03-09) x86_64
[ SERVER ]: Apache/2.4.66 (Debian) | PHP: 8.2.30
[ USER ]: www-data | IP: 172.19.30.54
GEFORCE FILE MANAGER
/
var
/
www
/
html
/
wordpress
/
wp-content
/
plugins
/
presto-player
/
src
/
admin
/
blocks
/
blocks
/
popup
/
UPLOAD:
NAME
SIZE
QUICK PERMS
ACTIONS
📁 components
SET
[ DEL ]
📁 context
SET
[ DEL ]
📁 hooks
SET
[ DEL ]
📄 block.json
599 B
SET
[ EDIT ]
|
[ DEL ]
📄 edit.js
5,828 B
SET
[ EDIT ]
|
[ DEL ]
📄 editor.css
1,691 B
SET
[ EDIT ]
|
[ DEL ]
📄 index.js
361 B
SET
[ EDIT ]
|
[ DEL ]
📄 save.js
258 B
SET
[ EDIT ]
|
[ DEL ]
DELETE SELECTED
[ CLOSE ]
EDIT: edit.js
/** @jsx jsx */ import { css, jsx } from "@emotion/react"; import { useBlockProps, store as blockEditorStore, BlockControls, useInnerBlocksProps, } from "@wordpress/block-editor"; import { useState, useEffect } from "@wordpress/element"; import { __ } from "@wordpress/i18n"; import { button } from "@wordpress/icons"; import { Placeholder, MenuGroup, MenuItem, ToolbarDropdownMenu, } from "@wordpress/components"; import { useSelect, useDispatch, select } from "@wordpress/data"; import { useEntityProp, store as coreStore } from "@wordpress/core-data"; import { symbol, symbolFilled } from "@wordpress/icons"; import MediaProviders from "../../shared/MediaProviders"; import Context from "./context/context"; import TriggerSelection from "./components/TriggerSelection"; import { usePopupTemplate } from "./hooks/usePopupTemplate"; function Edit({ clientId, attributes, setAttributes }) { const [triggerType, setTriggerType] = useState(""); const [open, setOpen] = useState(true); const { setProModal } = useDispatch("presto-player/player"); const blockProps = useBlockProps(); const { replaceTemplate } = usePopupTemplate(clientId); // Set a unique ID for the popup using the block's clientId useEffect(() => { if (!attributes?.popupId) { setAttributes({ popupId: clientId }); } }, [attributes?.popupId, clientId, setAttributes]); const [mediaHubSyncDefault] = useEntityProp( "root", "site", "presto_player_media_hub_sync_default" ); const [sync, setSync] = useState(() => mediaHubSyncDefault); const innerBlocksProps = useInnerBlocksProps(blockProps, { allowedBlocks: ["presto-player/popup-trigger", "presto-player/popup-media"], template: [["presto-player/popup-trigger"], ["presto-player/popup-media"]], }); /** * Get inner blocks */ const hasInnerBlocks = useSelect( (select) => select(blockEditorStore).getBlock(clientId).innerBlocks?.length > 0 ); /** * Handle trigger type selection with pro check */ const handleTriggerTypeSelect = (type) => { if (type === "custom" && !prestoPlayer?.hasRequiredProVersion?.popups) { setProModal(true); return; } setTriggerType(type); }; // Handler for when existing media is selected const handleMediaSelected = (mediaId) => { // Get media item const queryArgs = ["postType", "pp_video_block", mediaId]; const media = select(coreStore).getEntityRecord(...queryArgs); if (!triggerType) { return; } // Get poster image if it's an image trigger const imageUrl = media?.details?.poster && triggerType === "image" ? media?.details?.poster : null; // Replace inner blocks with template replaceTemplate({ type: `${triggerType}Trigger`, mediaId, imageUrl, }); }; // ================================================ // If there are inner blocks already. // ================================================ if (hasInnerBlocks) { return ( <> {/* * Context provider for all blocks nested within the popup trigger * This is used to provide the popup open/closed tab to all blocks * nested within the popup trigger. */} <Context.Provider value={{ open, setOpen }}> <div {...innerBlocksProps}></div> </Context.Provider> </> ); } // ================================================ // Select trigger type // ================================================ if (!triggerType) { return ( <Placeholder icon={button} label={__("Popup Trigger", "presto-player")} instructions={__( "Select a trigger type for your video popup.", "presto-player" )} {...blockProps} > <TriggerSelection triggerType={triggerType} onTriggerTypeSelect={handleTriggerTypeSelect} /> </Placeholder> ); } // ================================================ // Media selection step with sync controls // ================================================ return ( <div {...blockProps}> <BlockControls group="other"> <ToolbarDropdownMenu label={__("Media Hub Sync", "presto-player")} icon={sync ? symbolFilled : symbol} text={ sync ? __("Synced", "presto-player") : __("Not synced", "presto-player") } > {({ onClose }) => ( <MenuGroup> <MenuItem onClick={() => { setSync(true); onClose(); }} icon={sync ? "yes" : undefined} isSelected={sync} > {__("Sync to media hub", "presto-player")} </MenuItem> <MenuItem onClick={() => { setSync(false); onClose(); }} icon={!sync ? "yes" : undefined} isSelected={!sync} > {__("Don't sync to media hub", "presto-player")} </MenuItem> </MenuGroup> )} </ToolbarDropdownMenu> </BlockControls> <MediaProviders sync={sync} onSyncedMediaCreated={(id) => { // Once synced media is created, replace the template with the new media. replaceTemplate({ type: `${triggerType}Trigger`, mediaId: id }); }} onSelect={(provider) => { // Once a provider is selected, replace the template with the new provider. replaceTemplate({ type: `${triggerType}Trigger`, provider }); }} onSelectMedia={handleMediaSelected} /> </div> ); } export default Edit;