aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuben Beltran del Rio <ruben@unlimited.pizza>2021-08-29 21:49:37 +0200
committerRuben Beltran del Rio <ruben@unlimited.pizza>2021-08-29 21:49:37 +0200
commit38431710cfb1cc1ffd7297085d069be1328f083b (patch)
treeb28fba3eb891d8e1f383d4faa358ee7f067be93b /src
Add project
Diffstat (limited to 'src')
-rw-r--r--src/app.html13
-rw-r--r--src/config/i18n.js12
-rw-r--r--src/config/translations/en.json6
-rw-r--r--src/config/translations/es.json7
-rw-r--r--src/global.d.ts1
-rw-r--r--src/lib/components/language_selector.svelte31
-rw-r--r--src/lib/components/loader.svelte3
-rw-r--r--src/lib/components/new_prompt.svelte21
-rw-r--r--src/lib/components/prompt.svelte16
-rw-r--r--src/lib/stores/prompt.js45
-rw-r--r--src/routes/[locale]/[terms].svelte15
-rw-r--r--src/routes/[locale]/__layout.svelte22
-rw-r--r--src/routes/[locale]/index.svelte14
-rw-r--r--src/routes/__layout.svelte5
-rw-r--r--src/routes/index.svelte6
15 files changed, 217 insertions, 0 deletions
diff --git a/src/app.html b/src/app.html
new file mode 100644
index 0000000..b624a15
--- /dev/null
+++ b/src/app.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <link rel="icon" href="/favicon.png" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <link rel="stylesheet" href="/global.css" />
+ %svelte.head%
+ </head>
+ <body>
+ <div id="svelte">%svelte.body%</div>
+ </body>
+</html>
diff --git a/src/config/i18n.js b/src/config/i18n.js
new file mode 100644
index 0000000..25ffc45
--- /dev/null
+++ b/src/config/i18n.js
@@ -0,0 +1,12 @@
+import { addMessages, getLocaleFromNavigator, init } from 'svelte-i18n';
+
+import en from './translations/en.json';
+import es from './translations/es.json';
+
+addMessages('en', en);
+addMessages('es', es);
+
+init({
+ fallbackLocale: 'en',
+ initialLocale: getLocaleFromNavigator()
+});
diff --git a/src/config/translations/en.json b/src/config/translations/en.json
new file mode 100644
index 0000000..c5c0cef
--- /dev/null
+++ b/src/config/translations/en.json
@@ -0,0 +1,6 @@
+{
+ "refresh": "Get a new prompt.",
+ "title": "Your prompt is:",
+ "loading": "Finding your prompt..."
+}
+
diff --git a/src/config/translations/es.json b/src/config/translations/es.json
new file mode 100644
index 0000000..914970b
--- /dev/null
+++ b/src/config/translations/es.json
@@ -0,0 +1,7 @@
+{
+ "refresh": "Genera un prompt nuevo.",
+ "title": "Tu prompt es:",
+ "loading": "Encontrando tu prompt..."
+}
+
+
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..63908c6
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1 @@
+/// <reference types="@sveltejs/kit" />
diff --git a/src/lib/components/language_selector.svelte b/src/lib/components/language_selector.svelte
new file mode 100644
index 0000000..e8d0c44
--- /dev/null
+++ b/src/lib/components/language_selector.svelte
@@ -0,0 +1,31 @@
+<script>
+ import { locale, locales } from 'svelte-i18n';
+ import { getLangNameFromCode } from 'language-name-map';
+ import { goto } from '$app/navigation';
+
+ $: namedLocales = $locales
+ .map((code) => ({
+ code,
+ ...getLangNameFromCode(code)
+ }))
+ .sort((a, b) => a.native - b.native);
+
+ let selected = $locale;
+
+ $: {
+ locale.set(selected);
+ }
+
+ const navigateAway = function () {
+ goto('/');
+ };
+</script>
+
+<select bind:value={selected} on:change={navigateAway}>
+ {#each namedLocales as namedLocale}
+ <option value={namedLocale.code}>{namedLocale.native}</option>
+ {/each}
+</select>
+
+<style>
+</style>
diff --git a/src/lib/components/loader.svelte b/src/lib/components/loader.svelte
new file mode 100644
index 0000000..4309aff
--- /dev/null
+++ b/src/lib/components/loader.svelte
@@ -0,0 +1,3 @@
+<script>
+</script>
+<p> Loading... </p>
diff --git a/src/lib/components/new_prompt.svelte b/src/lib/components/new_prompt.svelte
new file mode 100644
index 0000000..f44ecf1
--- /dev/null
+++ b/src/lib/components/new_prompt.svelte
@@ -0,0 +1,21 @@
+<script>
+ import { _ } from 'svelte-i18n';
+ import { getPrompt } from '$lib/stores/prompt';
+ import { goto } from '$app/navigation';
+
+ export let locale
+
+ $: prompt = getPrompt(locale);
+
+ $: {
+ if ($prompt) {
+ goto(`/${locale.split('-')[0]}/${$prompt}`);
+ }
+ }
+</script>
+
+<article>
+ <main>
+ {$_('loading')}
+ </main>
+</article>
diff --git a/src/lib/components/prompt.svelte b/src/lib/components/prompt.svelte
new file mode 100644
index 0000000..fbdc9ef
--- /dev/null
+++ b/src/lib/components/prompt.svelte
@@ -0,0 +1,16 @@
+<script>
+ import { _ } from 'svelte-i18n';
+ export let terms
+</script>
+
+<article>
+ <header>
+ {$_('title')}
+ </header>
+ <main>
+ {terms}
+ </main>
+ <footer>
+ <a href="/">{$_('refresh')}</a>
+ </footer>
+</article>
diff --git a/src/lib/stores/prompt.js b/src/lib/stores/prompt.js
new file mode 100644
index 0000000..59df711
--- /dev/null
+++ b/src/lib/stores/prompt.js
@@ -0,0 +1,45 @@
+import { readable } from 'svelte/store';
+import { browser } from '$app/env';
+
+const internals = {
+ kDataPrefix: 'http://localhost:3000/data/',
+ kAdjectivesPath: '/adjectives.json',
+ kNounsPath: '/nouns.json',
+
+ async get(locale, path) {
+
+ const shortLocale = locale.split('-')[0];
+ const targetFile = internals.kDataPrefix + shortLocale + path;
+ const data = browser && sessionStorage.getItem(targetFile);
+
+ if (data) {
+ return JSON.parse(data);
+ }
+
+ let newData = await (await fetch(targetFile)).json();
+ browser && sessionStorage.setItem(targetFile, JSON.stringify(newData));
+
+ return newData;
+ },
+
+ random(list) {
+
+ return list[Math.floor(Math.random() * list.length)];
+ }
+};
+
+export const getPrompt = function (locale) {
+
+ return readable(null, function (set) {
+
+ (async function() {
+
+ const adjectives = await internals.get(locale, internals.kAdjectivesPath);
+ const nouns = await internals.get(locale, internals.kNounsPath);
+
+ set(`${internals.random(nouns)}, ${internals.random(nouns)}, ${internals.random(adjectives)}`);
+ })();
+
+ return function stop() {};
+ });
+};
diff --git a/src/routes/[locale]/[terms].svelte b/src/routes/[locale]/[terms].svelte
new file mode 100644
index 0000000..e389a4d
--- /dev/null
+++ b/src/routes/[locale]/[terms].svelte
@@ -0,0 +1,15 @@
+<script context="module">
+ export async function load({ page }) {
+ return {
+ props: {
+ terms: page.params.terms
+ }
+ }
+ }
+</script>
+<script>
+ import Prompt from '$lib/components/prompt.svelte';
+ export let terms;
+</script>
+
+<Prompt terms={terms} />
diff --git a/src/routes/[locale]/__layout.svelte b/src/routes/[locale]/__layout.svelte
new file mode 100644
index 0000000..29319ba
--- /dev/null
+++ b/src/routes/[locale]/__layout.svelte
@@ -0,0 +1,22 @@
+<script context="module">
+ export async function load({ page }) {
+ return {
+ props: {
+ localeFromPath: page.params.locale
+ }
+ }
+ }
+</script>
+
+<script>
+ import '../../config/i18n';
+ export let localeFromPath;
+
+ import { locale } from 'svelte-i18n';
+ import LanguageSelector from '$lib/components/language_selector.svelte';
+
+ locale.set(localeFromPath);
+</script>
+
+<slot />
+<LanguageSelector/>
diff --git a/src/routes/[locale]/index.svelte b/src/routes/[locale]/index.svelte
new file mode 100644
index 0000000..d8e8050
--- /dev/null
+++ b/src/routes/[locale]/index.svelte
@@ -0,0 +1,14 @@
+<script context="module">
+ export async function load({ page }) {
+ return {
+ props: {
+ locale: page.params.locale
+ }
+ }
+ }
+</script>
+<script>
+ import NewPrompt from '$lib/components/new_prompt.svelte';
+ export let locale;
+</script>
+<NewPrompt locale={locale} />
diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte
new file mode 100644
index 0000000..fce59a3
--- /dev/null
+++ b/src/routes/__layout.svelte
@@ -0,0 +1,5 @@
+<script>
+ import '../config/i18n';
+</script>
+
+<slot />
diff --git a/src/routes/index.svelte b/src/routes/index.svelte
new file mode 100644
index 0000000..edd7231
--- /dev/null
+++ b/src/routes/index.svelte
@@ -0,0 +1,6 @@
+<script>
+ import { locale } from 'svelte-i18n';
+ import NewPrompt from '$lib/components/new_prompt.svelte';
+</script>
+
+<NewPrompt locale={$locale}/>