upend/ui/src/components/Address.svelte

82 lines
1.8 KiB
Svelte
Raw Normal View History

2021-11-11 23:37:42 +01:00
<script lang="ts">
import { createEventDispatcher } from "svelte";
2021-11-11 23:37:42 +01:00
import { identify, useEntity } from "../lib/entity";
import HashBadge from "./HashBadge.svelte";
import Marquee from "./Marquee.svelte";
import UpLink from "./UpLink.svelte";
const dispatch = createEventDispatcher();
2021-11-11 23:37:42 +01:00
export let address: string;
export let link = false;
export let isFile = false;
export let resolve = true;
2021-11-30 21:18:47 +01:00
let resolving = resolve;
2021-11-11 23:37:42 +01:00
// Identification
let inferredIds: string[] = [];
2021-11-11 23:37:42 +01:00
const { attributes, backlinks } = useEntity(address, () => resolve);
$: {
if (resolve) {
2021-11-30 21:18:47 +01:00
resolving = true;
2021-11-11 23:37:42 +01:00
identify($attributes, $backlinks).then((inferredEntries) => {
inferredIds = inferredEntries.map((eid) => eid.value);
2021-11-30 21:18:47 +01:00
resolving = false;
2021-11-11 23:37:42 +01:00
});
}
}
2021-12-01 13:37:23 +01:00
$: label = inferredIds.join(" | ") || address;
$: dispatch("resolved", inferredIds);
2021-11-11 23:37:42 +01:00
</script>
<div class="address" class:identified={Boolean(inferredIds)}>
<HashBadge {address} />
<div class="separator" />
2021-11-11 23:37:42 +01:00
<Marquee>
2021-12-01 13:37:23 +01:00
<div class="label" class:resolving title={label}>
2021-11-30 21:18:47 +01:00
{#if isFile}
<UpLink to={{ entity: address }}>
{address}
</UpLink>
{:else if link}
<UpLink to={{ entity: address }}>
2021-12-01 13:37:23 +01:00
{label}
2021-11-30 21:18:47 +01:00
</UpLink>
{:else}
2021-12-01 13:37:23 +01:00
{label}
2021-11-30 21:18:47 +01:00
{/if}
</div>
2021-11-11 23:37:42 +01:00
</Marquee>
</div>
<style scoped lang="scss">
.address {
display: flex;
align-items: center;
padding: 0.1em;
border: 0.1em solid var(--foreground);
border-radius: 0.2em;
font-family: var(--monospace-font);
line-break: anywhere;
2021-11-11 23:37:42 +01:00
&.identified {
font-family: var(--default-font);
font-size: 0.95em;
line-break: auto;
}
}
2021-11-11 23:37:42 +01:00
.separator {
width: 0.5em;
2021-11-11 23:37:42 +01:00
}
2021-11-30 21:18:47 +01:00
.resolving {
opacity: 0.7;
}
2021-11-11 23:37:42 +01:00
</style>