add the visitor API endpoint

This commit is contained in:
ngn
2025-01-08 00:20:11 +03:00
parent fc11748e57
commit dee3ef4d85
26 changed files with 444 additions and 163 deletions

View File

@ -1,19 +1,29 @@
import { locale, waitLocale } from "svelte-i18n";
import { init, register } from "svelte-i18n";
import { browser } from "$app/environment";
import { init, register, waitLocale } from "svelte-i18n";
import { browser_lang } from "$lib/util.js";
import { services } from "$lib/api.js";
import languages from "$lib/lang.js";
const defaultLocale = languages[0].code;
// setup the locale
for (let i = 0; i < languages.length; i++)
register(languages[i].code, () => import(/* @vite-ignore */ languages[i].path));
init({
fallbackLocale: defaultLocale,
initialLocale: browser ? window.navigator.language.slice(0, 2).toLowerCase() : defaultLocale,
fallbackLocale: languages[0].code,
initialLocale: browser_lang(),
});
export const load = async () => {
if (browser) locale.set(window.navigator.language);
// load locales & load data from the API
export async function load({ fetch }) {
await waitLocale();
};
try {
return {
services: await services(fetch),
error: null,
};
} catch (err) {
return {
error: err,
};
}
}

View File

@ -1,14 +1,21 @@
<script>
import Navbar from "$lib/navbar.svelte";
import Footer from "$lib/footer.svelte";
import Error from "$lib/error.svelte";
let { data, children } = $props();
</script>
<main>
<Navbar />
<div class="content">
<slot></slot>
</div>
<Footer />
{#if data.error === null}
<Navbar />
<div class="content">
{@render children()}
</div>
<Footer />
{:else}
<Error error={data.error} />>
{/if}
</main>
<style>

View File

@ -1,6 +1,5 @@
<script>
import Header from "$lib/header.svelte";
import Content from "$lib/content.svelte";
import Head from "$lib/head.svelte";
import Card from "$lib/card.svelte";
import Link from "$lib/link.svelte";
@ -10,9 +9,9 @@
</script>
<Head title="home" desc="home page of my personal website" />
<Header title={$_("home.title")} picture="tired" />
<Header picture="tired" title={$_("home.title")} />
<Content>
<main>
<Card title={$_("home.welcome.title")}>
<span> 👋 {$_("home.welcome.desc")}</span>
<ul>
@ -77,9 +76,19 @@
</div>
</div>
</Card>
</Content>
</main>
<style>
main {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
padding: 50px;
gap: 28px;
}
.prefer {
color: var(--white-2);
font-style: italic;
@ -98,4 +107,10 @@
display: flex;
flex-direction: column;
}
@media only screen and (max-width: 900px) {
main {
flex-direction: column;
}
}
</style>

View File

@ -1,39 +1,39 @@
<script>
import Header from "$lib/header.svelte";
import Head from "$lib/head.svelte";
import Icon from "$lib/icon.svelte";
import { color } from "$lib/util.js";
import { _ } from "svelte-i18n";
</script>
<Head title="donate" desc="give me all of your life savings" />
<Header title="donate money!" picture="money" />
<Header picture="money" title={$_("donate.title")} />
<main>
<span
>I spend a lot of time working on different projects and maintaining different services.</span
>
<span
>I also spend a lot of money, but unlike time, you don't usually get much of it for free.</span
>
<span
>I mostly pay for hosting and electricity. Which when added up costs around 550₺ per month, that
is Turkish Lira, equals to ~$15 at time of writing.</span
>
<span> </span>
<span>
{$_("donate.info")}
{$_("donate.price")}
</span>
<br />
<br />
<span
>So even a small donation would be highly appreciated and it would help me keep everything up
and running.</span
>
<span>
{$_("donate.details")}
</span>
<table>
<thead>
<tr>
<th style="color: var(--{color()})">Platform</th>
<th style="color: var(--{color()})">Address/Link</th>
<th style="color: var(--{color()})">{$_("donate.table.platform")}</th>
<th style="color: var(--{color()})">{$_("donate.table.address")}</th>
</tr>
</thead>
<tbody>
<tr>
<td>Monero (XMR)</td>
<td>
<Icon icon="nf-fa-monero" />
Monero (XMR)
</td>
<td>
<code>
46q7G7u7cmASvJm7AmrhmNg6ctS77mYMmDAy1QxpDn5w57xV3GUY5za4ZPZHAjqaXdfS5YRWm4AVj5UArLDA1retRkJp47F
@ -42,10 +42,9 @@
</tr>
</tbody>
</table>
<span
>Also huge thanks to all of you who has donated so far, as I said, I highly appreciate it. Thank
you!</span
>
<span>
{$_("donate.thanks")}
</span>
</main>
<style>
@ -77,6 +76,7 @@
td,
th {
font-size: var(--size-4);
border: solid 1px var(--black-4);
padding: 16px;
}

View File

@ -1,7 +0,0 @@
import { services } from "$lib/api.js";
export async function load({ fetch }) {
return {
list: await services(fetch),
};
}

View File

@ -4,42 +4,42 @@
import Link from "$lib/link.svelte";
import Head from "$lib/head.svelte";
import { api_url } from "$lib/util.js";
import { locale } from "svelte-i18n";
import { _, locale } from "svelte-i18n";
import { api_url } from "$lib/api.js";
export let data;
let list = data.list,
services = list;
let value = "";
let { data } = $props();
let list = $state(data.services);
function change(input) {
value = input.target.value.toLowerCase();
services = [];
let value = input.target.value.toLowerCase();
list = [];
if (value === "") {
services = list;
list = data.services;
return;
}
list.forEach((s) => {
if (s.name.toLowerCase().includes(value)) services.push(s);
data.services.forEach((s) => {
if (s.name.toLowerCase().includes(value)) list.push(s);
else if (s.desc[$locale.slice(0, 2)].toLowerCase().includes(value)) list.push(s);
});
}
</script>
<Head title="services" desc="my self-hosted services and projects" />
<Header title="service status" picture="cool" />
<Header picture="cool" title={$_("services.title")} />
<main>
<div class="title">
<input on:input={change} type="text" placeholder="Search for a service" />
<input oninput={change} type="text" placeholder={$_("services.search")} />
<div>
<Link icon="nf-fa-feed" link={api_url("/news/" + $locale.slice(0, 2))}>News and updates</Link>
<Link icon="nf-fa-feed" link={api_url("/news/" + $locale.slice(0, 2))}
>{$_("services.feed")}</Link
>
</div>
</div>
<div class="services">
{#each services as service}
{#each list as service}
<Service {service} />
{/each}
</div>