Gmail working

This commit is contained in:
Roman Krček
2025-06-22 16:55:33 +02:00
parent 620c9c5cb7
commit 14213fe341
3 changed files with 185 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
<script lang="ts">
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
let authorized = false;
let refreshToken = '';
let to = '';
let subject = '';
let body = '';
onMount(() => {
refreshToken = localStorage.getItem('gmail_refresh_token') ?? '';
authorized = !!refreshToken;
});
/* ⇢ redirects straight to Google via server 302 */
const connect = () => goto('/private/api/gmail?action=auth');
async function sendEmail() {
const r = await fetch('/private/api/gmail', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'send',
to,
subject,
text: body,
refreshToken
})
});
r.ok ? alert('Sent!') : alert(await r.text());
to = subject = body = '';
}
async function disconnect() {
if (!confirm('Disconnect Google account?')) return;
await fetch('/private/api/gmail', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'revoke', refreshToken })
});
localStorage.removeItem('gmail_refresh_token');
refreshToken = '';
authorized = false;
}
</script>
{#if !authorized}
<section class="space-y-4">
<p>You havent connected your Google account yet.</p>
<button class="btn" on:click={connect}>Connect Google</button>
</section>
{:else}
<button class="btn-secondary mb-4" on:click={disconnect}>Disconnect Google</button>
<form class="space-y-4" on:submit|preventDefault={sendEmail}>
<input class="input w-full" type="email" placeholder="recipient@example.com" bind:value={to} required />
<input class="input w-full" placeholder="Subject" bind:value={subject} required />
<textarea class="textarea w-full" rows="6" placeholder="Message" bind:value={body} required />
<button class="btn-primary">Send</button>
</form>
{/if}