billing
This commit is contained in:
parent
dab659978c
commit
ec61fc41e8
@ -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,9 +106,9 @@
|
|||||||
/>
|
/>
|
||||||
</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>
|
||||||
<DropdownMenu.Trigger asChild let:builder>
|
<DropdownMenu.Trigger asChild let:builder>
|
||||||
<Button builders={[builder]} variant="secondary" size="icon" class="rounded-full">
|
<Button builders={[builder]} variant="secondary" size="icon" class="rounded-full">
|
||||||
@ -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> -->
|
||||||
|
@ -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'
|
||||||
|
@ -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>
|
||||||
|
@ -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) {
|
||||||
queue = await fetch('/articles/getQueue').then((x) => x.json());
|
interval = setInterval(async () => {
|
||||||
}, 5000);
|
queue = await fetch('/articles/getQueue').then((x) => x.json());
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
clearInterval(interval);
|
if(interval) clearInterval(interval);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user