blob: 955670ac4f5c852d22dfeec825afaa172b54c9f0 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {LitElement, html, css} from 'lit-element';
import qs from 'qs';
import {connectStore} from 'reducers/base.js';
import * as sitewide from 'reducers/sitewide.js';
import {SHARED_STYLES} from 'shared/shared-styles.js';
/**
* Class for displaying a single flipper.
* @extends {LitElement}
*/
export default class MrFlipper extends connectStore(LitElement) {
/** @override */
static get properties() {
return {
currentIndex: {type: Number},
totalCount: {type: Number},
prevUrl: {type: String},
nextUrl: {type: String},
listUrl: {type: String},
queryParams: {type: Object},
};
}
/** @override */
constructor() {
super();
this.currentIndex = null;
this.totalCount = null;
this.prevUrl = null;
this.nextUrl = null;
this.listUrl = null;
this.queryParams = {};
}
/** @override */
stateChanged(state) {
this.queryParams = sitewide.queryParams(state);
}
/** @override */
updated(changedProperties) {
if (changedProperties.has('queryParams')) {
this.fetchFlipperData(qs.stringify(this.queryParams));
}
}
// Eventually this should be replaced with pRPC.
fetchFlipperData(query) {
const options = {
credentials: 'include',
method: 'GET',
};
fetch(`detail/flipper?${query}`, options).then(
(response) => response.text(),
).then(
(responseBody) => {
let responseData;
try {
// Strip XSSI prefix from response.
responseData = JSON.parse(responseBody.substr(5));
} catch (e) {
console.error(`Error parsing JSON response for flipper: ${e}`);
return;
}
this._populateResponseData(responseData);
},
);
}
_populateResponseData(data) {
this.totalCount = data.total_count;
this.currentIndex = data.cur_index;
this.prevUrl = data.prev_url;
this.nextUrl = data.next_url;
this.listUrl = data.list_url;
}
/** @override */
static get styles() {
return [
SHARED_STYLES,
css`
:host {
display: flex;
justify-content: center;
flex-direction: column;
}
/* Use visibility instead of display:hidden for hiding in order to
* avoid popping when elements are made visible. */
.row a[hidden], .counts[hidden] {
visibility: hidden;
}
.counts[hidden] {
display: block;
}
.row a {
display: block;
padding: 0.25em 0;
}
.row a, .row div {
flex: 1;
white-space: nowrap;
padding: 0 2px;
}
.row .counts {
padding: 0 16px;
}
.row {
display: flex;
align-items: baseline;
text-align: center;
flex-direction: row;
}
@media (max-width: 960px) {
:host {
display: inline-block;
}
}
`,
];
}
/** @override */
render() {
return html`
<div class="row">
<a href="${this.prevUrl}" ?hidden="${!this.prevUrl}" title="Prev" class="prev-url">
&lsaquo; Prev
</a>
<div class="counts" ?hidden=${!this.totalCount}>
${this.currentIndex + 1} of ${this.totalCount}
</div>
<a href="${this.nextUrl}" ?hidden="${!this.nextUrl}" title="Next" class="next-url">
Next &rsaquo;
</a>
</div>
<div class="row">
<a href="${this.listUrl}" ?hidden="${!this.listUrl}" title="Back to list" class="list-url">
Back to list
</a>
</div>
`;
}
}
window.customElements.define('mr-flipper', MrFlipper);