<template> <div v-html="generateIcon()" class="w-fit"></div> </template> <script lang="ts"> import { createAvatar, StyleOptions } from "@dicebear/core"; import { avataaars } from "@dicebear/collection"; import { Vue, Component, Prop } from "vue-facing-decorator"; import { Contact } from "../db/tables/contacts"; @Component export default class EntityIcon extends Vue { @Prop contact: Contact; @Prop entityId = ""; // overridden by contact.did or profileImageUrl @Prop iconSize = 0; @Prop profileImageUrl = ""; // overridden by contact.profileImageUrl generateIcon() { const imageUrl = this.contact?.profileImageUrl || this.profileImageUrl; if (imageUrl) { return `<img src="${imageUrl}" class="rounded" width="${this.iconSize}" height="${this.iconSize}" />`; } else { const identifier = this.contact?.did || this.entityId; if (!identifier) { return `<img src="../src/assets/blank-square.svg" class="rounded" width="${this.iconSize}" height="${this.iconSize}" />`; } // https://api.dicebear.com/8.x/avataaars/svg?seed= // ... does not render things with the same seed as this library. // "did:ethr:0x222BB77E6Ff3774d34c751f3c1260866357B677b" yields a girl with flowers in her hair and a lightning earring // ... which looks similar to '' at the dicebear site but which is different. const options: StyleOptions<object> = { seed: (identifier as string) || "", size: this.iconSize, }; const avatar = createAvatar(avataaars, options); const svgString = avatar.toString(); return svgString; } } } </script> <style scoped></style>