/* eslint react/react-in-jsx-scope: 0*/
const React = window.React;
const ReactDOM = window.ReactDOM;
const {
SyncPolicy,
SetAllSyncPolicies,
AccountFilter,
SyncGraph,
} = window;
class Account extends React.Component {
renderError() {
const {account} = this.props;
if (account.sync_error != null) {
const {message, stack} = account.sync_error
const error = {
message,
stack: stack.slice(0, 4),
}
return (
Error
{JSON.stringify(error, null, 2)}
)
}
return
}
render() {
const {account, assignment, active} = this.props;
const errorClass = account.sync_error ? ' errored' : ''
const numStoredSyncs = account.last_sync_completions.length;
const oldestSync = account.last_sync_completions[numStoredSyncs - 1];
const newestSync = account.last_sync_completions[0];
const avgBetweenSyncs = (newestSync - oldestSync) / (1000 * numStoredSyncs);
const timeSinceLastSync = (Date.now() - newestSync) / 1000;
let firstSyncDuration = "Incomplete";
if (account.first_sync_completed_at) {
firstSyncDuration = (new Date(account.first_sync_completed_at) - new Date(account.created_at)) / 1000;
}
return (
{account.email_address} {active ? '🌕' : '🌑'}
{assignment}
Sync Cycles
First Sync Duration (seconds):
{firstSyncDuration}
Average Time Between Syncs (seconds):
{avgBetweenSyncs}
Time Since Last Sync (seconds):
{timeSinceLastSync}
Recent Syncs:
{this.renderError()}
);
}
}
Account.propTypes = {
account: React.PropTypes.object,
active: React.PropTypes.bool,
assignment: React.PropTypes.string,
}
class Root extends React.Component {
constructor() {
super();
this.state = {
accounts: {},
assignments: {},
activeAccountIds: [],
visibleAccounts: AccountFilter.states.all,
};
}
componentDidMount() {
let url = null;
if (window.location.protocol === "https:") {
url = `wss://${window.location.host}/accounts`;
} else {
url = `ws://${window.location.host}/accounts`;
}
this.websocket = new WebSocket(url);
this.websocket.onopen = () => {
this.websocket.send("Message to send");
};
this.websocket.onmessage = (evt) => {
try {
const msg = JSON.parse(evt.data);
if (msg.cmd === 'ACCOUNT') {
this.onReceivedAccount(msg.payload);
}
if (msg.cmd === 'ASSIGNMENTS') {
this.onReceivedAssignments(msg.payload);
}
if (msg.cmd === 'ACTIVE') {
this.onReceivedActiveAccountIds(msg.payload);
}
} catch (err) {
console.error(err);
}
};
this.websocket.onclose = () => {
window.location.reload();
};
}
onReceivedAssignments(assignments) {
this.setState({assignments})
}
onReceivedActiveAccountIds(accountIds) {
this.setState({activeAccountIds: accountIds})
}
onReceivedAccount(account) {
const accounts = Object.assign({}, this.state.accounts);
accounts[account.id] = account;
this.setState({accounts});
}
onFilter() {
this.setState({visibleAccounts: document.getElementById('account-filter').value});
}
render() {
let ids = Object.keys(this.state.accounts);
switch (this.state.visibleAccounts) {
case AccountFilter.states.errored:
ids = ids.filter((id) => this.state.accounts[id].sync_error)
break;
case AccountFilter.states.notErrored:
ids = ids.filter((id) => !this.state.accounts[id].sync_error)
break;
default:
break;
}
return (
this.onFilter.call(this)} />
parseInt(id, 10))} />
{
ids.sort((a, b) => a.localeCompare(b)).map((id) =>
)
}
)
}
}
ReactDOM.render(
,
document.getElementById('root')
);