Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
100 lines
2.5 KiB
TypeScript
100 lines
2.5 KiB
TypeScript
import { useCallback, useMemo, useState } from 'react'
|
|
import {
|
|
DefaultSizeStyle,
|
|
ErrorBoundary,
|
|
TLComponents,
|
|
Tldraw,
|
|
TldrawUiToastsProvider,
|
|
TLUiOverrides,
|
|
} from 'tldraw'
|
|
import { TldrawAgentApp } from './agent/TldrawAgentApp'
|
|
import {
|
|
TldrawAgentAppContextProvider,
|
|
TldrawAgentAppProvider,
|
|
} from './agent/TldrawAgentAppProvider'
|
|
import { ChatPanel } from './components/ChatPanel'
|
|
import { ChatPanelFallback } from './components/ChatPanelFallback'
|
|
import { CustomHelperButtons } from './components/CustomHelperButtons'
|
|
import { AgentHighlightOverlayUtil } from './overlays/AgentHighlightOverlayUtil'
|
|
import { TargetAreaTool } from './tools/TargetAreaTool'
|
|
import { TargetShapeTool } from './tools/TargetShapeTool'
|
|
|
|
// Customize tldraw's styles to play to the agent's strengths
|
|
DefaultSizeStyle.setDefaultValue('s')
|
|
|
|
// Custom tools for picking context items
|
|
const tools = [TargetShapeTool, TargetAreaTool]
|
|
const overlayUtils = [AgentHighlightOverlayUtil]
|
|
const overrides: TLUiOverrides = {
|
|
tools: (editor, tools) => {
|
|
return {
|
|
...tools,
|
|
'target-area': {
|
|
id: 'target-area',
|
|
label: 'Pick Area',
|
|
kbd: 'c',
|
|
icon: 'tool-frame',
|
|
onSelect() {
|
|
editor.setCurrentTool('target-area')
|
|
},
|
|
},
|
|
'target-shape': {
|
|
id: 'target-shape',
|
|
label: 'Pick Shape',
|
|
kbd: 's',
|
|
icon: 'tool-frame',
|
|
onSelect() {
|
|
editor.setCurrentTool('target-shape')
|
|
},
|
|
},
|
|
}
|
|
},
|
|
}
|
|
|
|
function App() {
|
|
const [app, setApp] = useState<TldrawAgentApp | null>(null)
|
|
|
|
const handleUnmount = useCallback(() => {
|
|
setApp(null)
|
|
}, [])
|
|
|
|
// Custom components that need the agent app's React context
|
|
const components: TLComponents = useMemo(() => {
|
|
return {
|
|
HelperButtons: () =>
|
|
app && (
|
|
<TldrawAgentAppContextProvider app={app}>
|
|
<CustomHelperButtons />
|
|
</TldrawAgentAppContextProvider>
|
|
),
|
|
}
|
|
}, [app])
|
|
|
|
return (
|
|
<TldrawUiToastsProvider>
|
|
<div className="tldraw-agent-container">
|
|
<div className="tldraw-canvas">
|
|
<Tldraw
|
|
persistenceKey="tldraw-agent-demo"
|
|
tools={tools}
|
|
overlayUtils={overlayUtils}
|
|
overrides={overrides}
|
|
components={components}
|
|
>
|
|
<TldrawAgentAppProvider onMount={setApp} onUnmount={handleUnmount} />
|
|
</Tldraw>
|
|
</div>
|
|
<ErrorBoundary fallback={ChatPanelFallback}>
|
|
{app && (
|
|
<TldrawAgentAppContextProvider app={app}>
|
|
<ChatPanel />
|
|
</TldrawAgentAppContextProvider>
|
|
)}
|
|
</ErrorBoundary>
|
|
</div>
|
|
</TldrawUiToastsProvider>
|
|
)
|
|
}
|
|
|
|
export default App
|