<script>
import { _ } from 'svelte-i18n';
- import LanguageSelector from '../language_selector/language_selector.svelte';
+ import LanguageSelector from '$/components/language_selector/language_selector.svelte';
const licenseUrl = 'https://gitlab.com/rbdr/forum/';
</script>
export let id;
import { _ } from 'svelte-i18n';
- import { getForum } from '$stores/forum';
- import ErrorBlock from '../error_block/error_block.svelte';
+ import { getForum } from '$/stores/forum';
+ import ErrorBlock from '$/components/error_block/error_block.svelte';
+ import Loader from '$/components/loader/loader.svelte';
- import TopicSummary from '$components/topic_summary/topic_summary.svelte';
+ import TopicSummary from '$/components/topic_summary/topic_summary.svelte';
$: store = getForum(id);
$: forum = $store.data;
</script>
{#if $store.loading}
- <p>Loading...</p>
+ <Loader />
{/if}
{#if $store.error}
- <ErrorBlock message={$_('forum_list.error.unavailable')} />
+ <ErrorBlock message={$_('forum.error.unavailable')} />
{/if}
{#if forum}
<h1>{forum.glyph} {$_(forum.label)}</h1>
<script>
import { _ } from 'svelte-i18n';
- import { forums } from '$stores/forums';
- import ErrorBlock from '../error_block/error_block.svelte';
+ import { forums } from '$/stores/forums';
+ import Loader from '$/components/loader/loader.svelte';
+ import ErrorBlock from '$/components/error_block/error_block.svelte';
</script>
<nav title="{$_('forum_list.title')}">
{#if $forums.loading}
- <p>Loading...</p>
+ <Loader />
{/if}
{#if $forums.error}
<ErrorBlock message={$_('forum_list.error.unavailable')} />
<script>
import { _ } from 'svelte-i18n';
- import { getGlyphHash } from '../../utils/glyph_hash';
+ import { getGlyphHash } from '$/utils/glyph_hash';
export let uuid;
</script>
<script>
import { _ } from 'svelte-i18n';
- import { version } from '$config/config';
+ import { version } from '$/config/config';
</script>
<header title="{$_('header.title')}">
<script>
+ export let id;
+
import { _ } from 'svelte-i18n';
+ import { getTopic } from '$/stores/topic';
- import Glyph from '../glyph/glyph.svelte';
-</script>
+ import ErrorBlock from '$/components/error_block/error_block.svelte';
+ import Loader from '$/components/loader/loader.svelte';
+ import PostContent from '$/components/post_content/post_content.svelte';
+ import { readableTime } from '$/utils/readable_time.js';
-<div class="h-entry" title="{$_('topic.title')}">
- <h1 class="p-name">This is a post in the forum.</h1>
- <aside class="topic-meta" title="{$_('topic.metadata_title')}">
- <span class="topic-location">{$_('topic.category_location')} <a href="/f/interaction"
- class="p-category">{$_('forum.name.interaction')}</a>.</span>
- <span class="topic-ttl"><a class="u-url u-uid" title="{$_('topic.permalink_title')}" href="/t/2a3fc567af8c897ca6f55fb5fj">{$_('topic.remaining_time', { values: { remaining: $_('time.days', { values: { count: 3 } }) } })}</a>.</span>
- </aside>
- <aside class="topic-tags" title="{$_('topic.tags_title')}">
- {$_('topic.tags_location')}
- <a href="/g/question" class="p-category">question<span class="tag-weight">(5)</span></a>
- <a href="/g/meta" class="p-category">meta<span class="tag-weight">(34)</span></a>
- <a href="/g/carrots" class="p-category">carrots<span class="tag-weight">(1)</span></a>
- <a href="/g/tpbo" class="p-category">tpbo<span class="tag-weight">(2)</span></a>
- </aside>
- <aside class="post-meta" title="{$_('post.metadata_title', { values: { count: 1, total: 2 } })}">
- <Glyph uuid="3cd8c84e18144a2da71f6bace9392abc" />
- <span class="h-card">
- {$_('post.author_credit')} <a href="/a/rbdr" class="p-nickname u-url">rbdr</a>.
- </span>
- <time role="presentation" class="dt-published" datetime="2018-08-14T03:32:10.929Z">
- <a title="{$_('post.permalink_title')}" href="/p/a80c70ea0120387123097ce1907ff">
- 2018-08-14 03:32:10
- </a>
- </time>
- </aside>
- <article class="e-content" title="{$_('post.title', { values: { count: 1, total: 2, author: 'rbdr' } })}">
- <p>This is a main topic in the forum. Does that abstraction still even make sense?</p>
- <p>Is this really it??</p>
- <p>This might all be fake but at least the links look purple when visited</p>
- </article>
- <hr/>
- <aside class="post-meta" title="{$_('post.metadata_title', { values: { count: 2, total: 2 } })}">
- <Glyph uuid="b33f0339f7d64d1ca27f1c0aefb7d753" />
- <span class="h-card">
- {$_('post.author_credit')} <a href="/a/time4carrots" class="p-nickname u-url">time4carrots</a>.
- </span>
- <time role="presentation" class="dt-published" datetime="2018-08-15T04:10:00.929Z">
- <a href="/p/da9910f3febde91948000ce1535ea">
- 2018-08-15 04:10:00
- </a>
- </time>
- </aside>
- <article class="e-content" title="{$_('post.title', { values: { count: 1, total: 2, author: 'time4carrots' } })}">
- <p>It's just how it is...</p>
- </article>
- <hr/>
-</div>
+ $: store = getTopic(id);
+ $: topic = $store.data;
+ $: remainingTime = topic ? (topic.updated_at + topic.ttl) - Date.now() : 0;
+ $: remaining = readableTime(remainingTime);
+</script>
-<style>
- .post-meta * {
- vertical-align: top;
- }
-</style>
+{#if $store.loading}
+ <Loader />
+{/if}
+{#if $store.error}
+ <ErrorBlock message={$_('topic.error.unavailable')} />
+{/if}
+{#if topic}
+ <div class="h-entry" title="{$_('topic.title')}">
+ <h1 class="p-name">{topic.title}</h1>
+ <aside class="topic-meta" title="{$_('topic.metadata_title')}">
+ {#if topic.forum}
+ <span class="topic-location">{$_('topic.category_location')} <a href="/f/{topic.forum.id}"
+ class="p-category">{topic.forum.glyph} {$_(topic.forum.label)}</a>.</span>
+ {/if}
+ <span class="topic-ttl"><a class="u-url u-uid" title="{$_('topic.permalink_title')}" href="/t/{topic.id}">({$_('topic.remaining_time', { values: { remaining: $_(remaining.label, { values: { count: remaining.count } }) } })})</a>.</span>
+ </aside>
+ {#if topic.tags.length > 0}
+ <aside class="topic-tags" title="{$_('topic.tags_title')}">
+ {$_('topic.tags_location')}
+ {#each topic.tags as tag}
+ <a href="/g/{tag.id}" class="p-category">{tag.id}<span class="tag-weight">({tag.weight})</span></a>{' '}
+ {/each}
+ </aside>
+ {/if}
+ {#each topic.posts as post, index}
+ <PostContent post={post} index={index} count={topic.posts.length} />
+ {/each}
+ </div>
+{/if}
<script>
- import InvalidRoute from '$components/invalid_route/invalid_route.svelte';
+ import InvalidRoute from '$/components/invalid_route/invalid_route.svelte';
</script>
<InvalidRoute />
<script>
- import '$config/i18n';
+ import '$/config/i18n';
import { isLoading } from 'svelte-i18n';
- import ForumList from '$components/forum_list/forum_list.svelte';
- import Header from '$components/header/header.svelte';
- import Footer from '$components/footer/footer.svelte';
+ import ForumList from '$/components/forum_list/forum_list.svelte';
+ import Header from '$/components/header/header.svelte';
+ import Loader from '$/components/loader/loader.svelte';
+ import Footer from '$/components/footer/footer.svelte';
</script>
{#if $isLoading}
- <h1>Loading.</h1>
- <p>Please wait.</p>
+ <Loader />
{:else}
<Header />
<main>
<script>
- import Author from '$components/author/author.svelte';
+ import Author from '$/components/author/author.svelte';
</script>
<Author/>
<script>
- import Forum from '$components/forum/forum.svelte';
+ import Forum from '$/components/forum/forum.svelte';
export let id;
</script>
<script>
+ import Tag from '$/components/tag/tag.svelte';
export let id;
</script>
-<h1>Tag Index.</h1>
-<p>This component lists topics for tag with id: {id}</p>
+<Tag id={id}/>
<script>
import { _ } from 'svelte-i18n';
+ import Loader from '$/components/loader/loader.svelte';
</script>
+<Loader />
<h1>{$_('home.title')}</h1>
<p>{$_('home.content')}</p>
<script>
- import Post from '$components/post/post.svelte';
+ import Post from '$/components/post/post.svelte';
+ export let id;
</script>
-<Post/>
+<Post id={id}/>
<script>
- import Topic from '$components/topic/topic.svelte';
+ import Topic from '$/components/topic/topic.svelte';
+ export let id;
</script>
-<Topic/>
+<Topic id={id}/>
import { ApolloError } from '@apollo/client/core';
import { readable } from 'svelte/store';
-import { client } from '$config/apollo';
+import { client } from '$/config/apollo';
/*
* This is a generic store for use with apollo
import { store } from './apollo';
-import { GET_FORUM } from '$data/queries';
+import { GET_FORUM } from '$/data/queries';
export const getForum = (id) => store({ key: 'forum', query: GET_FORUM, variables: { id } });
import { store } from './apollo';
-import { GET_FORUMS } from '$data/queries';
+import { GET_FORUMS } from '$/data/queries';
export const forums = store({ key: 'forums', query: GET_FORUMS, initialValue: [] });
import { store } from './apollo';
-import { GET_POST } from '$data/queries';
+import { GET_POST } from '$/data/queries';
export const getPost = (id) => store({ key: 'post', query: GET_POST, variables: { id } });
import { store } from './apollo';
-import { GET_TAG } from '$data/queries';
+import { GET_TAG } from '$/data/queries';
export const getTag = (id) => store({ key: 'tag', query: GET_TAG, variables: { id } });
import { store } from './apollo';
-import { GET_TOPIC } from '$data/queries';
+import { GET_TOPIC } from '$/data/queries';
export const getTopic = (id) => store({ key: 'topic', query: GET_TOPIC, variables: { id } });