2023-08-26 18:55:40 -07:00

80 lines
2.1 KiB
TypeScript

import OwnsBadge from "../element-factories/owns-badge";
import Star from "../element-factories/star";
import WantsBadge from "../element-factories/wants-badge";
import Trader from "../trader";
import TraderRepository from "../trader-repository";
export default class ProfileLink {
constructor(
public element: HTMLAnchorElement,
public traderRepository: TraderRepository
) {}
get username(): string {
return this.element.innerText.trim();
}
get profile(): string {
return this.element.href;
}
get trader(): Trader | null {
return this.traderRepository.find(this.username);
}
get lastElement(): Element {
return this.element.nextElementSibling?.tagName === "SPAN"
? this.element.nextElementSibling!
: this.element;
}
addOwnsBadge() {
let trader = this.trader;
if (trader === null) {
throw new Error(
"Cannot add owns badge to a profile link that has no trader data"
);
}
let badge = OwnsBadge.create(this.trader!);
this.lastElement.insertAdjacentElement("afterend", badge);
}
addWantsBadge() {
let trader = this.trader;
if (trader === null) {
throw new Error(
"Cannot add wants badge to a profile link that has no trader data"
);
}
let badge = WantsBadge.create(this.trader!);
this.lastElement.insertAdjacentElement("afterend", badge);
}
addStar() {
let star = Star.create();
this.element.style.position = "relative";
this.element.style.fontWeight = "bold";
this.element.appendChild(star);
}
static getAll(page: Document, traderRepository: TraderRepository) {
return Array.from(
page.querySelectorAll('a[href*="/profile/view-profile.php?id="]')
).map(
(profileLink) =>
new ProfileLink(
profileLink as HTMLAnchorElement,
traderRepository
)
);
}
}