blob: ea56aa848f510b88e78ee51e920acb95cfd4f97a [file] [log] [blame]
import { css, html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { ToolCall } from "../types";
@customElement("sketch-tool-card-screenshot")
export class SketchToolCardScreenshot extends LitElement {
@property()
toolCall: ToolCall;
@property()
open: boolean;
@state()
imageLoaded: boolean = false;
@state()
loadError: boolean = false;
static styles = css`
.summary-text {
font-style: italic;
padding: 0.5em;
}
.screenshot-container {
margin: 10px 0;
display: flex;
flex-direction: column;
align-items: center;
}
.screenshot {
max-width: 100%;
max-height: 500px;
border-radius: 4px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
border: 1px solid #ddd;
}
.loading-indicator {
margin: 20px;
color: #666;
font-style: italic;
}
.error-message {
color: #d32f2f;
font-style: italic;
margin: 10px 0;
}
.screenshot-info {
margin-top: 8px;
font-size: 12px;
color: #666;
}
.selector-info {
padding: 4px 8px;
background-color: #f5f5f5;
border-radius: 4px;
font-family: monospace;
margin: 5px 0;
display: inline-block;
}
`;
constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
}
disconnectedCallback() {
super.disconnectedCallback();
}
render() {
// Parse the input to get selector
let selector = "";
try {
if (this.toolCall?.input) {
const input = JSON.parse(this.toolCall.input);
selector = input.selector || "(full page)";
}
} catch (e) {
console.error("Error parsing screenshot input:", e);
}
// Get the screenshot ID from the result
let screenshotId = "";
let hasResult = false;
if (this.toolCall?.result_message?.tool_result) {
try {
const result = JSON.parse(this.toolCall.result_message.tool_result);
screenshotId = result.id;
hasResult = true;
} catch (e) {
console.error("Error parsing screenshot result:", e);
}
}
// Construct the URL for the screenshot (using relative URL without leading slash)
const screenshotUrl = screenshotId ? `screenshot/${screenshotId}` : "";
return html`
<sketch-tool-card .open=${this.open} .toolCall=${this.toolCall}>
<span slot="summary" class="summary-text">
Screenshot of ${selector}
</span>
<div slot="input" class="selector-info">
${selector !== "(full page)"
? `Taking screenshot of element: ${selector}`
: `Taking full page screenshot`}
</div>
<div slot="result">
${hasResult
? html`
<div class="screenshot-container">
${!this.imageLoaded && !this.loadError
? html`<div class="loading-indicator">
Loading screenshot...
</div>`
: ""}
${this.loadError
? html`<div class="error-message">
Failed to load screenshot
</div>`
: html`
<img
class="screenshot"
src="${screenshotUrl}"
@load=${() => (this.imageLoaded = true)}
@error=${() => (this.loadError = true)}
?hidden=${!this.imageLoaded}
/>
${this.imageLoaded
? html`<div class="screenshot-info">
Screenshot ID: ${screenshotId}
</div>`
: ""}
`}
</div>
`
: ""}
</div>
</sketch-tool-card>
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"sketch-tool-card-screenshot": SketchToolCardScreenshot;
}
}