2018-03-26 23:32:43 +02:00
|
|
|
// @flow
|
2019-03-28 17:53:13 +01:00
|
|
|
import * as TXN_TYPES from 'constants/transaction_types';
|
2018-11-26 02:21:25 +01:00
|
|
|
import * as ICONS from 'constants/icons';
|
2018-03-26 23:32:43 +02:00
|
|
|
import React from 'react';
|
|
|
|
import ButtonTransaction from 'component/common/transaction-link';
|
|
|
|
import CreditAmount from 'component/common/credit-amount';
|
|
|
|
import DateTime from 'component/dateTime';
|
|
|
|
import Button from 'component/button';
|
2019-05-11 08:41:33 +02:00
|
|
|
import { buildURI, parseURI } from 'lbry-redux';
|
2018-03-26 23:32:43 +02:00
|
|
|
|
|
|
|
type Props = {
|
|
|
|
transaction: Transaction,
|
|
|
|
revokeClaim: (string, number) => void,
|
|
|
|
isRevokeable: boolean,
|
|
|
|
reward: ?{
|
|
|
|
reward_title: string,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
class TransactionListItem extends React.PureComponent<Props> {
|
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
|
|
|
|
(this: any).abandonClaim = this.abandonClaim.bind(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
getLink(type: string) {
|
2019-03-28 17:53:13 +01:00
|
|
|
if (type === TXN_TYPES.TIP) {
|
2018-04-23 07:08:55 +02:00
|
|
|
return <Button icon={ICONS.UNLOCK} onClick={this.abandonClaim} title={__('Unlock Tip')} />;
|
2018-03-26 23:32:43 +02:00
|
|
|
}
|
2019-01-22 21:36:28 +01:00
|
|
|
return <Button icon={ICONS.DELETE} onClick={this.abandonClaim} title={__('Abandon Claim')} />;
|
2018-03-26 23:32:43 +02:00
|
|
|
}
|
|
|
|
|
2018-07-25 02:50:04 +02:00
|
|
|
abandonClaim() {
|
|
|
|
const { txid, nout } = this.props.transaction;
|
|
|
|
|
|
|
|
this.props.revokeClaim(txid, nout);
|
2018-03-26 23:32:43 +02:00
|
|
|
}
|
|
|
|
|
2019-06-04 19:04:25 +02:00
|
|
|
capitalize = (string: ?string) => string && string.charAt(0).toUpperCase() + string.slice(1);
|
2018-07-25 02:50:04 +02:00
|
|
|
|
2018-03-26 23:32:43 +02:00
|
|
|
render() {
|
|
|
|
const { reward, transaction, isRevokeable } = this.props;
|
|
|
|
const { amount, claim_id: claimId, claim_name: name, date, fee, txid, type } = transaction;
|
2019-06-04 19:04:25 +02:00
|
|
|
|
|
|
|
// Ensure the claim name exists and is valid
|
2019-07-11 21:03:31 +02:00
|
|
|
let uri;
|
2019-06-04 19:04:25 +02:00
|
|
|
let claimName = name;
|
2019-07-11 21:03:31 +02:00
|
|
|
try {
|
2019-06-04 19:04:25 +02:00
|
|
|
({ claimName } = parseURI(name));
|
2019-07-11 21:03:31 +02:00
|
|
|
uri = buildURI({ claimName: claimName, claimId });
|
|
|
|
} catch (e) {}
|
2019-05-11 08:41:33 +02:00
|
|
|
|
2018-03-26 23:32:43 +02:00
|
|
|
const dateFormat = {
|
|
|
|
month: 'short',
|
|
|
|
day: 'numeric',
|
|
|
|
year: 'numeric',
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
|
|
<tr>
|
|
|
|
<td>
|
2019-01-08 19:48:09 +01:00
|
|
|
<CreditAmount badge={false} showPlus amount={amount} precision={8} />
|
2018-03-26 23:32:43 +02:00
|
|
|
<br />
|
|
|
|
|
|
|
|
{fee !== 0 && (
|
|
|
|
<span className="table__item-label">
|
2019-01-08 19:48:09 +01:00
|
|
|
<CreditAmount badge={false} fee amount={fee} precision={8} />
|
2018-03-26 23:32:43 +02:00
|
|
|
</span>
|
|
|
|
)}
|
|
|
|
</td>
|
|
|
|
<td className="table__item--actionable">
|
|
|
|
<span>{this.capitalize(type)}</span> {isRevokeable && this.getLink(type)}
|
|
|
|
</td>
|
|
|
|
<td className="table__item--actionable">
|
2019-07-21 23:31:22 +02:00
|
|
|
{reward ? <span>{reward.reward_title}</span> : <Button button="link" navigate={uri} label={claimName} />}
|
2018-03-26 23:32:43 +02:00
|
|
|
</td>
|
|
|
|
|
|
|
|
<td>
|
|
|
|
<ButtonTransaction id={txid} />
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
{date ? (
|
|
|
|
<div>
|
|
|
|
<DateTime date={date} show={DateTime.SHOW_DATE} formatOptions={dateFormat} />
|
|
|
|
<div className="table__item-label">
|
|
|
|
<DateTime date={date} show={DateTime.SHOW_TIME} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
<span className="empty">{__('Pending')}</span>
|
|
|
|
)}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default TransactionListItem;
|