[ui] add a last visited view

feat/vaults
Tomáš Mládek 2022-02-02 18:30:07 +01:00
parent 6bb3fe1788
commit 41f929d352
No known key found for this signature in database
GPG Key ID: ED21612889E75EC5
1 changed files with 35 additions and 6 deletions

View File

@ -1,11 +1,14 @@
<script lang="ts"> <script lang="ts">
import { formatRelative, parseISO } from "date-fns"; import { formatRelative, parseISO } from "date-fns";
import { last } from "lodash";
import { Link } from "svelte-navigator"; import { Link } from "svelte-navigator";
import { UpListing } from "upend"; import { UpListing } from "upend";
import type { IFile, ListingResult, VaultInfo } from "upend/types"; import type { IFile, ListingResult, VaultInfo } from "upend/types";
import UpObjectCard from "../components/display/UpObjectCard.svelte"; import UpObject from "../components/display/UpObject.svelte";
import Spinner from "../components/utils/Spinner.svelte"; import UpObjectCard from "../components/display/UpObjectCard.svelte";
import Spinner from "../components/utils/Spinner.svelte";
import { query } from "../lib/entity";
let infoData: VaultInfo | undefined; let infoData: VaultInfo | undefined;
@ -22,9 +25,19 @@ import Spinner from "../components/utils/Spinner.svelte";
); );
})(); })();
const { result: lastVisitedQuery } = query(
() => `(matches ? "LAST_VISITED" ? )`
);
$: lastVisited = ($lastVisitedQuery?.entries || [])
.filter((e) => e.value.t == "Number")
.sort((a, b) => (a.value.c as number) - (b.value.c as number))
.map((e) => [e.entity, e.value.c as number])
.slice(0, 25) as [string, number][];
const latestFiles = (async () => { const latestFiles = (async () => {
const response = await fetch("/api/files/latest"); const response = await fetch("/api/files/latest");
return (await response.json()) as IFile[]; const files = (await response.json()) as IFile[];
return files.slice(0, 25);
})(); })();
function fmtDate(dateString: string) { function fmtDate(dateString: string) {
@ -55,6 +68,20 @@ import Spinner from "../components/utils/Spinner.svelte";
{/await} {/await}
</section> </section>
{#if lastVisited.length > 0}
<section class="lastVisited">
<h2>Last visited</h2>
<table>
{#each lastVisited as [address, visited]}
<tr>
<td class="timestamp">{formatRelative(visited, new Date())}</td>
<td class="object"><UpObject link {address} /></td>
</tr>
{/each}
</table>
</section>
{/if}
<section class="latest"> <section class="latest">
<h2>Most recently added files</h2> <h2>Most recently added files</h2>
{#await latestFiles} {#await latestFiles}
@ -63,7 +90,7 @@ import Spinner from "../components/utils/Spinner.svelte";
<table> <table>
{#each data as file} {#each data as file}
<tr> <tr>
<td class="file-added">{fmtDate(file.added)}</td> <td class="timestamp">{fmtDate(file.added)}</td>
<td> <td>
<Link to="/browse/{file.hash}"> <Link to="/browse/{file.hash}">
<div class="file-path">{file.path}</div> <div class="file-path">{file.path}</div>
@ -82,18 +109,20 @@ import Spinner from "../components/utils/Spinner.svelte";
text-align: center; text-align: center;
} }
.latest { .latest,
.lastVisited {
table { table {
border-spacing: 1em 0.25em; border-spacing: 1em 0.25em;
} }
.file-added { .timestamp {
opacity: 0.77; opacity: 0.77;
white-space: nowrap; white-space: nowrap;
text-align: center; text-align: center;
} }
} }
.roots { .roots {
ul { ul {
list-style: none; list-style: none;