This commit is contained in:
Omer Sabic 2024-07-08 01:38:36 +02:00
parent dab659978c
commit ec61fc41e8
4 changed files with 54 additions and 20 deletions

View File

@ -3,19 +3,18 @@
import Menu from 'lucide-svelte/icons/menu'; import Menu from 'lucide-svelte/icons/menu';
import Package2 from 'lucide-svelte/icons/package-2'; import Package2 from 'lucide-svelte/icons/package-2';
import Search from 'lucide-svelte/icons/search';
import CircleUser from 'lucide-svelte/icons/circle-user'; import CircleUser from 'lucide-svelte/icons/circle-user';
import Sun from 'svelte-radix/Sun.svelte'; import Sun from 'svelte-radix/Sun.svelte';
import Moon from 'svelte-radix/Moon.svelte'; import Moon from 'svelte-radix/Moon.svelte';
import * as DropdownMenu from '$lib/components/ui/dropdown-menu/index.js'; import * as DropdownMenu from '$lib/components/ui/dropdown-menu/index.js';
import { Input } from '$lib/components/ui/input/index.js';
import * as Sheet from '$lib/components/ui/sheet/index.js'; import * as Sheet from '$lib/components/ui/sheet/index.js';
import { Button } from '$lib/components/ui/button/index.js'; import { Button } from '$lib/components/ui/button/index.js';
import { ModeWatcher, toggleMode } from 'mode-watcher'; import { ModeWatcher, toggleMode } from 'mode-watcher';
import { Toaster } from '$lib/components/ui/sonner'; import { Toaster } from '$lib/components/ui/sonner';
import { config } from '$lib'; import { config } from '$lib';
import * as Dialog from '$lib/components/ui/dialog';
/** @type {import('./$types').LayoutServerData} */ /** @type {import('./$types').LayoutServerData} */
export let data; export let data;
@ -24,14 +23,16 @@
{ name: 'Dashboard', redirect: '/' }, { name: 'Dashboard', redirect: '/' },
{ name: 'Articles', redirect: '/articles' }, { name: 'Articles', redirect: '/articles' },
{ name: 'Emails', redirect: '/emails' }, { name: 'Emails', redirect: '/emails' },
{ name: 'Website', redirect: '/website' }, { name: 'Website', redirect: '/website' }
// { name: 'Analytics', redirect: '##' }, // { name: 'Analytics', redirect: '##' },
]; ];
async function logout() { async function logout() {
fetch("/auth/logout"); fetch('/auth/logout');
window.location.href = "/auth" window.location.href = '/auth';
} }
const is_subscribed = new Date(data.me.subscribed_until) > new Date();
</script> </script>
<Toaster /> <Toaster />
@ -47,7 +48,9 @@
<span class="sr-only">{data.me.name}</span> <span class="sr-only">{data.me.name}</span>
</a> </a>
{#each navs as nav} {#each navs as nav}
<a href="{nav.redirect}" class="text-muted-foreground transition-colors hover:text-foreground">{nav.name}</a> <a href={nav.redirect} class="text-muted-foreground transition-colors hover:text-foreground"
>{nav.name}</a
>
{/each} {/each}
</nav> </nav>
<Sheet.Root> <Sheet.Root>
@ -64,7 +67,7 @@
<span class="sr-only">{data.me.name}</span> <span class="sr-only">{data.me.name}</span>
</a> </a>
{#each navs as nav} {#each navs as nav}
<a href="{nav.redirect}" class="hover:text-foreground">{nav.name}</a> <a href={nav.redirect} class="hover:text-foreground">{nav.name}</a>
{/each} {/each}
<div class="mt-auto"> <div class="mt-auto">
<Button on:click={toggleMode} variant="outline" size="icon"> <Button on:click={toggleMode} variant="outline" size="icon">
@ -103,7 +106,7 @@
/> />
</div> </div>
</form> --> </form> -->
<div class="md:ml-0 ml-auto"> <div class="ml-auto md:ml-0">
Tokens: <span>{data.me.tokens}</span> Tokens: <span>{data.me.tokens}</span>
</div> </div>
<DropdownMenu.Root> <DropdownMenu.Root>
@ -116,8 +119,11 @@
<DropdownMenu.Content align="end"> <DropdownMenu.Content align="end">
<DropdownMenu.Label>My Account</DropdownMenu.Label> <DropdownMenu.Label>My Account</DropdownMenu.Label>
<DropdownMenu.Separator /> <DropdownMenu.Separator />
<DropdownMenu.Item href={config.api_url + "/me/billing"}>Billing</DropdownMenu.Item> <DropdownMenu.Item href={config.api_url + '/me/billing'}>Billing</DropdownMenu.Item>
<DropdownMenu.Item><a href="mailto:osabic2004@gmail.com?Subject=Youpage.ai support">Support</a></DropdownMenu.Item> <DropdownMenu.Item
><a href="mailto:osabic2004@gmail.com?Subject=Youpage.ai support">Support</a
></DropdownMenu.Item
>
<DropdownMenu.Separator /> <DropdownMenu.Separator />
<DropdownMenu.Item on:click={logout}>Logout</DropdownMenu.Item> <DropdownMenu.Item on:click={logout}>Logout</DropdownMenu.Item>
</DropdownMenu.Content> </DropdownMenu.Content>
@ -128,3 +134,21 @@
<slot /> <slot />
</main> </main>
</div> </div>
<!-- <Dialog open={true}>
<Dialog.Content> -->
{#if !is_subscribed}
<div
class="fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:max-w-[750px] sm:rounded-lg md:w-full"
>
<p>
Oh! It looks like you aren't subscribed. Don't worry. Your site is still up at its normal
location and will remain available. But, if you want to manage your articles and signups, then
please update your billing information or resubscribe!
</p>
<Button href="{config.api_url}/me/subscribe">Resubscribe</Button>
<Button href="{config.api_url}/me/billing">Manage Billing</Button>
</div>
{/if}
<!-- </Dialog.Content>
</Dialog> -->

View File

@ -3,9 +3,11 @@ import { message, setError, superValidate, fail } from "sveltekit-superforms";
import { createFormSchema, editFormSchema } from "./schema"; import { createFormSchema, editFormSchema } from "./schema";
import { zod } from "sveltekit-superforms/adapters"; import { zod } from "sveltekit-superforms/adapters";
const articlesPerPage = 10;
/** @type {import("./$types").PageServerLoad} */ /** @type {import("./$types").PageServerLoad} */
export const load = async ({ fetch, url, request }) => { export const load = async ({ fetch, url, request }) => {
const offset = (Number(url.searchParams.get("page") || 1) - 1) * 10; const offset = (Number(url.searchParams.get("page") || 1) - 1) * articlesPerPage;
// @ts-ignore // @ts-ignore
const blogRes = await fetch(config.api_url + "/blog?mine=true&offset=" + offset, { const blogRes = await fetch(config.api_url + "/blog?mine=true&offset=" + offset, {
credentials: 'include' credentials: 'include'

View File

@ -12,6 +12,7 @@
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import {config} from '$lib'; import {config} from '$lib';
const articlesPerPage = 10;
/** @type {import("./$types").PageData} */ /** @type {import("./$types").PageData} */
export let data; export let data;
@ -30,7 +31,8 @@
}); });
} }
let currentPage = 1; /** @type {Number} */
let currentPage;
onMount(() => { onMount(() => {
if(!browser) return; if(!browser) return;
@ -61,7 +63,9 @@
isLoading = false; isLoading = false;
} }
} }
$: currentPage // $: {
// console.log(currentPage)
// }
let isLoading = true; let isLoading = true;
</script> </script>
@ -132,7 +136,7 @@
</Table.Body> </Table.Body>
</Table.Root> </Table.Root>
<Pagination.Root count={data.total_articles} perPage={10} let:pages currentPage={currentPage}> <Pagination.Root count={data.total_articles} perPage={articlesPerPage} let:pages currentPage={currentPage}>
<Pagination.Content> <Pagination.Content>
<!-- <Pagination.Item> <!-- <Pagination.Item>
<Pagination.PrevButton> <Pagination.PrevButton>

View File

@ -5,22 +5,26 @@
import { onDestroy, onMount } from 'svelte'; import { onDestroy, onMount } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import { Badge } from "$lib/components/ui/badge"; import { Badge } from "$lib/components/ui/badge";
import { browser } from '$app/environment';
/** @type {any[]} */ /** @type {any[]} */
let queue; let queue;
let open = false; let open = false;
let interval;
onMount(async () => { onMount(async () => {
if(!browser) return;
queue = await fetch('/articles/getQueue').then((x) => x.json()); queue = await fetch('/articles/getQueue').then((x) => x.json());
}); });
let interval = setInterval(async () => { if(browser) {
interval = setInterval(async () => {
queue = await fetch('/articles/getQueue').then((x) => x.json()); queue = await fetch('/articles/getQueue').then((x) => x.json());
}, 5000); }, 5000);
}
onDestroy(() => { onDestroy(() => {
clearInterval(interval); if(interval) clearInterval(interval);
}); });
</script> </script>