Video replacement
Replace selected video elements in designs with custom content.
Running this example
To run this example locally:
-
If you haven't already, create a new app in the Developer Portal(opens in a new tab or window). For more information, refer to our Quickstart guide.
-
In your app's configuration on the Developer Portal(opens in a new tab or window), ensure the "Development URL" is set to
http://localhost:8080. -
Clone the starter kit:
git clone https://github.com/canva-sdks/canva-apps-sdk-starter-kit.gitcd canva-apps-sdk-starter-kitSHELL -
Install dependencies:
npm installSHELL -
Run the example:
npm run start:example video_replacementSHELL -
Click the Preview URL link shown in the terminal to open the example in the Canva editor.
Example app source code
// For usage information, see the README.md file.import { Button, Rows, Text } from "@canva/app-ui-kit";import { useState } from "react";import * as styles from "styles/components.css";import { upload } from "@canva/asset";import { useSelection } from "@canva/app-hooks";export const App = () => {const [loading, setLoading] = useState(false);// Monitor selection for video elements in the designconst selection = useSelection("video");const updateVideo = async () => {setLoading(true);// Upload video asset to Canva's media storageconst queuedVideo = await upload({type: "video",mimeType: "video/mp4",thumbnailImageUrl:"https://www.canva.dev/example-assets/video-import/beach-thumbnail-image.jpg",thumbnailVideoUrl:"https://www.canva.dev/example-assets/video-import/beach-thumbnail-video.mp4",url: "https://www.canva.dev/example-assets/video-import/beach-video.mp4",width: 320,height: 180,aiDisclosure: "none",});// Create a draft to modify the selected video elementsconst draft = await selection.read();// Replace each selected video's content with the new uploaded videodraft.contents.forEach((s) => (s.ref = queuedVideo.ref));// Apply changes to the designawait draft.save();setLoading(false);};return (<div className={styles.scrollContainer}><Rows spacing="2u"><Text>This example demonstrates how apps can replace the selected video.Select a video in the editor to begin.</Text><Buttonvariant="primary"onClick={updateVideo}disabled={selection.count === 0}loading={loading}>Replace with sample video</Button></Rows></div>);};
TYPESCRIPT
// For usage information, see the README.md file.import { createRoot } from "react-dom/client";import { App } from "./app";import "@canva/app-ui-kit/styles.css";import { AppUiProvider } from "@canva/app-ui-kit";import type { DesignEditorIntent } from "@canva/intents/design";import { prepareDesignEditor } from "@canva/intents/design";async function render() {const root = createRoot(document.getElementById("root") as Element);root.render(<AppUiProvider><App /></AppUiProvider>,);}const designEditor: DesignEditorIntent = { render };prepareDesignEditor(designEditor);// Hot Module Replacement for development (automatically reloads the app when changes are made)if (module.hot) {module.hot.accept("./app", render);}
TYPESCRIPT
# Video replacementDemonstrates how to replace selected video elements in a design with new video content. Shows selection detection, video upload, and content replacement patterns for updating existing design elements.For API reference docs and instructions on running this example, see: <https://www.canva.dev/docs/apps/examples/video-replacement/>.Related examples: See content_replacement/image_replacement for image substitution, or asset_upload for general video import patterns.NOTE: This example differs from what is expected for public apps to pass a Canva review:- Static assets are used for demonstration purposes only. Production apps should host assets on a CDN/hosting service and use the `upload` function from the `@canva/asset` package- Video format validation is not implemented. Production apps should validate video formats and handle unsupported formats gracefully- Error handling is simplified for demonstration. Production apps must implement comprehensive error handling with clear user feedback and graceful failure modes- Internationalization is not implemented. Production apps must support multiple languages using the `@canva/app-i18n-kit` package to pass Canva review requirements- The code structure is simplified: Production apps using [intents](https://www.canva.dev/docs/apps/intents/) are recommended to call the prepareDesignEditor function from src/intents/design_editor/index.tsx
MARKDOWN
API reference
Need help?
- Join our Community Forum(opens in a new tab or window)
- Report issues with this example on GitHub(opens in a new tab or window)