2022-06-02 01:29:03 +04:00
|
|
|
import TxSprite from './tx-sprite';
|
|
|
|
import { FastVertexArray } from './fast-vertex-array';
|
2022-09-21 17:23:45 +02:00
|
|
|
import { TransactionStripped } from '../../interfaces/websocket.interface';
|
2022-06-02 01:29:03 +04:00
|
|
|
import { SpriteUpdateParams, Square, Color, ViewUpdateParams } from './sprite-types';
|
2023-12-07 11:12:20 +00:00
|
|
|
import { hexToColor } from './utils';
|
2022-11-23 19:07:17 +09:00
|
|
|
import BlockScene from './block-scene';
|
2022-05-30 21:53:39 +00:00
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
const hoverTransitionTime = 300;
|
|
|
|
const defaultHoverColor = hexToColor('1bd8f4');
|
2023-07-12 10:11:04 +09:00
|
|
|
const defaultHighlightColor = hexToColor('800080');
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
// convert from this class's update format to TxSprite's update format
|
2022-06-02 01:29:03 +04:00
|
|
|
function toSpriteUpdate(params: ViewUpdateParams): SpriteUpdateParams {
|
2022-05-30 21:53:39 +00:00
|
|
|
return {
|
2022-05-31 18:00:40 +00:00
|
|
|
start: (params.start || performance.now()) + (params.delay || 0),
|
|
|
|
duration: params.duration,
|
|
|
|
minDuration: params.minDuration,
|
|
|
|
...params.display.position,
|
|
|
|
...params.display.color,
|
|
|
|
adjust: params.adjust
|
2022-06-02 01:29:03 +04:00
|
|
|
};
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export default class TxView implements TransactionStripped {
|
|
|
|
txid: string;
|
|
|
|
fee: number;
|
|
|
|
vsize: number;
|
|
|
|
value: number;
|
|
|
|
feerate: number;
|
2023-07-18 15:05:44 +09:00
|
|
|
acc?: boolean;
|
2023-03-14 15:39:55 +09:00
|
|
|
rate?: number;
|
2023-05-22 18:16:58 -04:00
|
|
|
status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated';
|
2022-11-23 19:07:17 +09:00
|
|
|
context?: 'projected' | 'actual';
|
2023-01-26 18:57:32 -06:00
|
|
|
scene?: BlockScene;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
initialised: boolean;
|
|
|
|
vertexArray: FastVertexArray;
|
|
|
|
hover: boolean;
|
2023-07-12 10:11:04 +09:00
|
|
|
highlight: boolean;
|
2022-05-30 21:53:39 +00:00
|
|
|
sprite: TxSprite;
|
|
|
|
hoverColor: Color | void;
|
2023-07-12 10:11:04 +09:00
|
|
|
highlightColor: Color | void;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
screenPosition: Square;
|
2022-06-02 01:29:03 +04:00
|
|
|
gridPosition: Square | void;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
dirty: boolean;
|
|
|
|
|
2023-01-26 18:57:32 -06:00
|
|
|
constructor(tx: TransactionStripped, scene: BlockScene) {
|
|
|
|
this.scene = scene;
|
2022-11-23 19:07:17 +09:00
|
|
|
this.context = tx.context;
|
2022-06-02 01:29:03 +04:00
|
|
|
this.txid = tx.txid;
|
|
|
|
this.fee = tx.fee;
|
|
|
|
this.vsize = tx.vsize;
|
|
|
|
this.value = tx.value;
|
2023-03-14 15:39:55 +09:00
|
|
|
this.feerate = tx.rate || (tx.fee / tx.vsize); // sort by effective fee rate where available
|
2023-05-26 21:10:32 -04:00
|
|
|
this.acc = tx.acc;
|
2023-03-14 15:39:55 +09:00
|
|
|
this.rate = tx.rate;
|
2022-07-07 19:11:42 +02:00
|
|
|
this.status = tx.status;
|
2022-06-02 01:29:03 +04:00
|
|
|
this.initialised = false;
|
2023-01-26 18:57:32 -06:00
|
|
|
this.vertexArray = scene.vertexArray;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
this.hover = false;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
this.screenPosition = { x: 0, y: 0, s: 0 };
|
2022-05-30 21:53:39 +00:00
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
this.dirty = true;
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
destroy(): void {
|
2022-05-30 21:53:39 +00:00
|
|
|
if (this.sprite) {
|
2022-06-02 01:29:03 +04:00
|
|
|
this.sprite.destroy();
|
|
|
|
this.sprite = null;
|
|
|
|
this.initialised = false;
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-02 01:29:03 +04:00
|
|
|
applyGridPosition(position: Square): void {
|
|
|
|
if (!this.gridPosition) {
|
|
|
|
this.gridPosition = { x: 0, y: 0, s: 0 };
|
|
|
|
}
|
|
|
|
if (this.gridPosition.x !== position.x || this.gridPosition.y !== position.y || this.gridPosition.s !== position.s) {
|
|
|
|
this.gridPosition.x = position.x;
|
|
|
|
this.gridPosition.y = position.y;
|
|
|
|
this.gridPosition.s = position.s;
|
|
|
|
this.dirty = true;
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
display: defines the final appearance of the sprite
|
|
|
|
position: { x, y, s } (coordinates & size)
|
|
|
|
color: { r, g, b, a} (color channels & alpha)
|
|
|
|
duration: of the tweening animation from the previous display state
|
|
|
|
start: performance.now() timestamp, when to start the transition
|
|
|
|
delay: additional milliseconds to wait before starting
|
|
|
|
jitter: if set, adds a random amount to the delay,
|
|
|
|
adjust: if true, modify an in-progress transition instead of replacing it
|
2022-06-14 23:08:18 +00:00
|
|
|
|
|
|
|
returns minimum transition end time
|
2022-05-30 21:53:39 +00:00
|
|
|
*/
|
2022-06-14 23:08:18 +00:00
|
|
|
update(params: ViewUpdateParams): number {
|
2022-06-02 01:29:03 +04:00
|
|
|
if (params.jitter) {
|
|
|
|
params.delay += (Math.random() * params.jitter);
|
|
|
|
}
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
if (!this.initialised || !this.sprite) {
|
2022-06-02 01:29:03 +04:00
|
|
|
this.initialised = true;
|
2022-05-30 21:53:39 +00:00
|
|
|
this.sprite = new TxSprite(
|
2022-05-31 18:00:40 +00:00
|
|
|
toSpriteUpdate(params),
|
2022-05-30 21:53:39 +00:00
|
|
|
this.vertexArray
|
2022-06-02 01:29:03 +04:00
|
|
|
);
|
2022-05-30 21:53:39 +00:00
|
|
|
// apply any pending hover event
|
|
|
|
if (this.hover) {
|
2022-06-14 23:08:18 +00:00
|
|
|
params.duration = Math.max(params.duration, hoverTransitionTime);
|
2022-05-30 21:53:39 +00:00
|
|
|
this.sprite.update({
|
|
|
|
...this.hoverColor,
|
|
|
|
duration: hoverTransitionTime,
|
|
|
|
adjust: false,
|
|
|
|
temp: true
|
2022-06-02 01:29:03 +04:00
|
|
|
});
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.sprite.update(
|
2022-05-31 18:00:40 +00:00
|
|
|
toSpriteUpdate(params)
|
2022-06-02 01:29:03 +04:00
|
|
|
);
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
2022-06-02 01:29:03 +04:00
|
|
|
this.dirty = false;
|
2022-06-14 23:08:18 +00:00
|
|
|
return (params.start || performance.now()) + (params.delay || 0) + (params.duration || 0);
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Temporarily override the tx color
|
2022-06-14 23:08:18 +00:00
|
|
|
// returns minimum transition end time
|
|
|
|
setHover(hoverOn: boolean, color: Color | void = defaultHoverColor): number {
|
2022-05-30 21:53:39 +00:00
|
|
|
if (hoverOn) {
|
2022-06-02 01:29:03 +04:00
|
|
|
this.hover = true;
|
|
|
|
this.hoverColor = color;
|
2022-05-30 21:53:39 +00:00
|
|
|
|
|
|
|
this.sprite.update({
|
|
|
|
...this.hoverColor,
|
|
|
|
duration: hoverTransitionTime,
|
|
|
|
adjust: false,
|
|
|
|
temp: true
|
2022-06-02 01:29:03 +04:00
|
|
|
});
|
2022-05-30 21:53:39 +00:00
|
|
|
} else {
|
2022-06-02 01:29:03 +04:00
|
|
|
this.hover = false;
|
|
|
|
this.hoverColor = null;
|
2023-07-12 10:11:04 +09:00
|
|
|
if (this.highlight) {
|
|
|
|
this.setHighlight(true, this.highlightColor);
|
|
|
|
} else {
|
|
|
|
if (this.sprite) {
|
|
|
|
this.sprite.resume(hoverTransitionTime);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.dirty = false;
|
|
|
|
return performance.now() + hoverTransitionTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Temporarily override the tx color
|
|
|
|
// returns minimum transition end time
|
|
|
|
setHighlight(highlightOn: boolean, color: Color | void = defaultHighlightColor): number {
|
|
|
|
if (highlightOn) {
|
|
|
|
this.highlight = true;
|
|
|
|
this.highlightColor = color;
|
|
|
|
|
|
|
|
this.sprite.update({
|
|
|
|
...this.highlightColor,
|
|
|
|
duration: hoverTransitionTime,
|
|
|
|
adjust: false,
|
|
|
|
temp: true
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.highlight = false;
|
|
|
|
this.highlightColor = null;
|
|
|
|
if (this.hover) {
|
|
|
|
this.setHover(true, this.hoverColor);
|
|
|
|
} else {
|
|
|
|
if (this.sprite) {
|
|
|
|
this.sprite.resume(hoverTransitionTime);
|
|
|
|
}
|
2022-06-02 01:29:03 +04:00
|
|
|
}
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
2022-06-02 01:29:03 +04:00
|
|
|
this.dirty = false;
|
2022-06-14 23:08:18 +00:00
|
|
|
return performance.now() + hoverTransitionTime;
|
2022-05-30 21:53:39 +00:00
|
|
|
}
|
2022-10-27 18:39:26 -06:00
|
|
|
}
|