blob: 440d756032aa81a9200038d2b3bbb18c6012aaba [file] [edit]
// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {css, html, LitElement} from 'lit';
import {customElement, property} from 'lit/decorators.js';
import {RevisionInfo} from '@gerritcodereview/typescript-api/rest-api';
const COPY_TIMEOUT_MS = 1000;
@customElement('ref-copy')
export class RefCopy extends LitElement {
@property({type: Object})
revision!: RevisionInfo;
static override get styles() {
return [
css`
.text {
min-width: 8em;
padding: var(--spacing-l);
text-transform: none;
}
`
];
}
override render() {
return html`
<div class="text">
<input
id="input"
type="text"
.value="${this.revision.ref}"
@click=${(e: InputEvent) => this.handleInputTap(e)}
readonly
/>
<gr-button
id="button"
link
class="copyToClipboard"
@click=${(e: Event) => this.copyToClipboard(e)}>
copy
</gr-button>
</div>`;
}
private handleInputTap(e: InputEvent) {
e.preventDefault();
const rootTarget = e.composedPath()[0] as HTMLInputElement;
rootTarget.select();
}
private copyToClipboard(e: Event) {
const ref = this.revision.ref;
const copyBtn = e.target as HTMLButtonElement;
if (ref) {
navigator.clipboard.writeText(ref).then(() => {
copyBtn!.innerText = 'done';
setTimeout(() => {
copyBtn!.innerText = 'copy'
}, COPY_TIMEOUT_MS);
}).catch(err => {
console.log('Failed to copy ref to clipboard', err);
})
}
}
}