import type {
Action,
CollectibleApproval,
CollectibleBurn,
CollectibleMint,
CollectibleTrade,
CollectibleTransfer,
ExchangeLiquidity,
ExchangeStaking,
ExchangeSwap,
MetaverseBurn,
MetaverseMint,
MetaverseTrade,
MetaverseTransfer,
SocialComment,
SocialDelete,
SocialMint,
SocialPost,
SocialProfile,
SocialProxy,
SocialRevise,
SocialReward,
SocialShare,
StakeStaking,
StakeTransaction,
StakerProfitSnapshot,
TransactionApproval,
TransactionBridge,
TransactionBurn,
TransactionEvent,
TransactionMint,
TransactionTransfer,
} from "@rss3/api-core";
export function renderItemActionToHTML(actions: Action[]): string | undefined {
let joint = "";
let i = 0;
for (const action of actions) {
const metadata = action.metadata;
if (!metadata) {
continue;
}
const { tag } = action;
switch (tag) {
case "social":
joint += renderSocialTagContent(action);
break;
case "collectible":
joint += renderCollectibleTagContent(action);
break;
case "metaverse":
joint += renderMetaverseTagContent(action);
break;
case "exchange":
joint += renderExchange(action);
break;
case "transaction":
joint += renderTransaction(action);
break;
}
if (i < actions.length - 1) joint += "
";
i++;
}
return joint;
}
const renderTransaction = (action: Action) => {
let joint = "";
const { type } = action;
const tag = "transaction";
switch (type) {
case "transfer":
case "burn":
case "mint":
case "approval": {
const metadata = extractMetadata(tag, type, action);
if (!metadata) {
break;
}
joint += buildHTML([
/* html */ `
Name: ${metadata.name}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `Standard: ${metadata.standard}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Decimals: ${metadata.decimals}
`, /* html */ `Address: ${metadata.address}
`, ]); break; } case "event": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Block Hash: ${metadata.block.hash}
`, /* html */ `Transaction Hash: ${metadata.transaction.hash}
`, ]); break; } case "bridge": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Action: ${metadata.action}
`, /* html */ `Source Network: ${metadata.sourceNetwork}
`, /* html */ `Target Network: ${metadata.targetNetwork}
`, metadata.token && /* html */ `Token name: ${metadata.token.name}
`, metadata.token && /* html */ `Token Symbol: ${metadata.token.symbol}
`, metadata.token && /* html */ `Token Value: ${metadata.token.value}
`, metadata.token && /* html */ `Token Address: ${metadata.token.address}
`, ]); break; } } return buildSectionFooterHTML(joint, action); }; const renderExchange = (action: Action) => { let joint = ""; const { type } = action; const tag = "exchange"; switch (type) { case "liquidity": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Action: ${metadata.action}
`, /* html */ `
| Address | Value | Name | Symbol | Decimals | Standard |
|---|---|---|---|---|---|
| ${token.address} | ${token.value} | ${token.name} | ${token.symbol} | ${token.decimals} | ${token.standard} |
Action: ${metadata.action}
`, metadata.token && /* html */ `Token:
From: ${metadata.from.address}
`, /* html */ metadata.to && `To: ${metadata.to?.address}
`, ]); } } return buildSectionFooterHTML(joint, action); }; const renderMetaverseTagContent = (action: Action) => { let joint = ""; const { from, to, type } = action; const tag = "metaverse"; switch (type) { case "burn": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); break; } case "trade": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); break; } case "mint": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); } break; case "transfer": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); } } return buildSectionFooterHTML(joint, action); }; const renderCollectibleTagContent = (action: Action) => { let joint = ""; const { from, to, type } = action; const tag = "collectible"; switch (type) { case "approval": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); break; } case "burn": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); break; } case "trade": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); break; } case "mint": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); } break; case "transfer": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ "Name: ${metadata.name}
`, /* html */ `Address: ${metadata.address}
`, /* html */ `Symbol: ${metadata.symbol}
`, /* html */ `Value: ${metadata.value}
`, /* html */ `${from} --> ${to}
`, ]); } } return buildSectionFooterHTML(joint, action); }; const renderSocialTagContent = (action: Action) => { let joint = ""; const { type } = action; const tag = "social"; switch (type) { case "profile": { break; } case "mint": { const metadata = extractMetadata(tag, type, action); if (!metadata) { break; } joint += buildHTML([ /* html */ `${metadata.handle} mited a post${metadata.target.body}`, /* html */ `RT: ${metadata.body}`, /* html */ metadata.media ?.map( (media) => `
Platform: ${action.platform}
`, /* html */ `Related URLs: