all repos — emessage @ d9e959888aed862973f5df75ac7a3c7663467d90

The EMessage email client

frontend/src/lib/components/EnvelopeControl.svelte (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
<script lang="ts">
	import ContactSelector from '$lib/components/ContactSelector.svelte';
	import {
		GetUserContact,
		GetActiveMailEmails,
		GetRecipientDisplay,
	} from "$lib/wailsjs/go/main/App";
	import { goto } from "$app/navigation";
	import { global } from "$lib/global.svelte.js";

	let { conversation } = $props();

	const userContact = await GetUserContact();
	const activeEmails = await GetActiveMailEmails();
	
	let recipients = $state(conversation.Recipients || []);
	let recipientInfo = $state([]);
	$effect(async () => {
		if (global.conversation.Recipients) {
			global.conversation.Recipients[0] = conversation.ServerRecipient;
			global.fromAddress = conversation.ServerRecipient;
		}
		recipientInfo = await GetRecipientDisplay(conversation.Recipients).then(list => { if (list) return list.slice(1) });
	});
	
	
	function add_recipient(email) {
		if (recipients.some(r => r.ID === email.ID || r.Value === email.Value)) return;
		recipients.push(email);
	}

	function remove_recipient(index) {
		recipients = recipients.filter((_, i) => i !== index);
	}

	function handle_from_select(event) {
		const selected = event.target.options[event.target.selectedIndex];
		if (selected && selected.dataset.action === 'edit') {
			global.contact = userContact;
			goto("/contact");
		}
	}
</script>

<div class="flex gap-1 text-xs items-center w-full">
	<span class="flex items-center gap-1">
		From:
		{#if conversation.ID === 0}
			<select class="w-min"
					onchange={handle_from_select}
					bind:value={conversation.ServerRecipient}>
				{#each userContact.Emails as email}
					<option value={email}
							disabled={!activeEmails.includes(email.Value)}>
						&lt;{email.Value}&gt; ({email.Key})
					</option>
				{/each}
				{#if activeEmails.length === 0}
					<option value={{}} selected>Nobody</option>
				{/if}
				<option data-action="edit">Edit my contact card</option>
			</select>
		{:else}
			<p class="text-xs text-nowrap">{conversation.ServerRecipient.Value}</p>
		{/if}
	</span>

	<span class="flex items-center gap-1 w-full flex-wrap">
		To:
		<span class="flex items-center gap-1 flex-wrap">
			{#each recipientInfo as display, i}
				{#if conversation.ID === 0}
					<button
						class="text-center p-1 text-xs text-nowrap border-1 border-primary rounded"
						onclick={() => remove_recipient(i)}>
						{display} | &times;
					</button>
				{:else}
					<p class="text-xs text-nowrap">{display}</p>
				{/if}
			{/each}
		</span>
		{#if conversation.ID === 0}
			<ContactSelector onselect={add_recipient} />
		{/if}
	</span>
</div>