'use client'; /* eslint-disable @next/next/no-img-element */ import * as fal from '@fal-ai/serverless-client'; import { ChangeEvent, useRef, useState } from 'react'; import { DrawingCanvas } from '../../components/drawing'; fal.config({ proxyUrl: '/api/fal/proxy', }); const PROMPT_EXPANDED = ', beautiful, colorful, highly detailed, best quality, uhd'; const PROMPT = 'a moon in the night sky'; const defaults = { model_name: 'runwayml/stable-diffusion-v1-5', image_size: 'square', num_inference_steps: 4, seed: 6252023, }; export default function RealtimePage() { const [prompt, setPrompt] = useState(PROMPT); const currentDrawing = useRef(null); const outputCanvasRef = useRef(null); const { send } = fal.realtime.connect( 'fal-ai/fast-lcm-diffusion/image-to-image', { connectionKey: 'realtime-demo', throttleInterval: 128, onResult(result) { if (result.images && result.images[0] && result.images[0].content) { const canvas = outputCanvasRef.current; const context = canvas?.getContext('2d'); if (canvas && context) { const imageBytes: Uint8Array = result.images[0].content; const blob = new Blob([imageBytes], { type: 'image/png' }); createImageBitmap(blob) .then((bitmap) => { context.drawImage(bitmap, 0, 0); }) .catch(console.error); } } }, } ); const handlePromptChange = (e: ChangeEvent) => { setPrompt(e.target.value); if (currentDrawing.current) { send({ prompt: e.target.value.trim() + PROMPT_EXPANDED, image_bytes: currentDrawing.current, ...defaults, }); } }; return (

falrealtime

{ currentDrawing.current = imageData; send({ prompt: prompt + PROMPT_EXPANDED, image_bytes: imageData, ...defaults, }); }} />
); }