flotilla/src/app/components/EventCreate.svelte

140 lines
3.9 KiB
Svelte
Raw Normal View History

2024-09-11 22:21:25 +00:00
<script lang="ts">
import {EditorContent} from "svelte-tiptap"
2025-01-02 18:04:28 +00:00
import {writable} from "svelte/store"
2024-09-20 18:00:41 +00:00
import {randomId} from "@welshman/lib"
2025-01-02 18:04:28 +00:00
import {createEvent, EVENT_TIME} from "@welshman/util"
import {publishThunk, dateToSeconds} from "@welshman/app"
2025-02-04 03:28:29 +00:00
import {preventDefault} from "@lib/html"
2024-09-11 22:21:25 +00:00
import Icon from "@lib/components/Icon.svelte"
import Field from "@lib/components/Field.svelte"
import Button from "@lib/components/Button.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte"
2024-09-12 23:56:33 +00:00
import DateTimeInput from "@lib/components/DateTimeInput.svelte"
2024-12-09 19:59:42 +00:00
import {PROTECTED} from "@app/state"
import {makeEditor} from "@app/editor"
2024-09-12 23:56:33 +00:00
import {pushToast} from "@app/toast"
2024-09-11 22:21:25 +00:00
const {url} = $props()
2024-09-11 22:21:25 +00:00
2025-01-02 18:04:28 +00:00
const uploading = writable(false)
2024-09-11 22:21:25 +00:00
const back = () => history.back()
2024-09-23 20:58:01 +00:00
const submit = () => {
2025-01-02 18:04:28 +00:00
if ($uploading) return
2024-11-16 16:04:09 +00:00
2024-09-12 23:56:33 +00:00
if (!title) {
return pushToast({
theme: "error",
message: "Please provide a title.",
})
}
if (!start || !end) {
return pushToast({
theme: "error",
message: "Please provide start and end times.",
})
}
2025-01-02 18:04:28 +00:00
const event = createEvent(EVENT_TIME, {
content: $editor.getText({blockSeparator: "\n"}).trim(),
2024-09-20 18:00:41 +00:00
tags: [
["d", randomId()],
["title", title],
["location", location],
["start", dateToSeconds(start).toString()],
["end", dateToSeconds(end).toString()],
2025-01-02 23:57:51 +00:00
...$editor.storage.nostr.getEditorTags(),
2024-12-09 19:59:42 +00:00
PROTECTED,
2024-09-20 18:00:41 +00:00
],
2024-09-11 22:21:25 +00:00
})
publishThunk({event, relays: [url]})
2024-10-15 22:52:30 +00:00
history.back()
2024-09-11 22:21:25 +00:00
}
const editor = makeEditor({submit, uploading})
2025-02-04 00:37:14 +00:00
let title = $state("")
let location = $state("")
let start: Date | undefined = $state()
let end: Date | undefined = $state()
2024-09-11 22:21:25 +00:00
</script>
2025-02-04 00:37:14 +00:00
<form class="column gap-4" onsubmit={preventDefault(submit)}>
<ModalHeader>
2025-02-04 00:37:14 +00:00
{#snippet title()}
<div>Create an Event</div>
{/snippet}
{#snippet info()}
<div>Invite other group members to events online or in real life.</div>
{/snippet}
</ModalHeader>
2024-09-11 22:21:25 +00:00
<Field>
2025-02-04 00:37:14 +00:00
{#snippet label()}
<p>Title*</p>
{/snippet}
{#snippet input()}
<label class="input input-bordered flex w-full items-center gap-2">
<input bind:value={title} class="grow" type="text" />
</label>
{/snippet}
2024-09-11 22:21:25 +00:00
</Field>
<Field>
2025-02-04 00:37:14 +00:00
{#snippet label()}
<p>Summary</p>
{/snippet}
{#snippet input()}
<div class="relative z-feature flex gap-2 border-t border-solid border-base-100 bg-base-100">
<div class="input-editor flex-grow overflow-hidden">
<EditorContent editor={$editor} />
</div>
<Button
data-tip="Add an image"
class="center btn tooltip"
onclick={() => $editor.chain().selectFiles().run()}>
2025-02-04 00:37:14 +00:00
{#if $uploading}
<span class="loading loading-spinner loading-xs"></span>
{:else}
<Icon icon="gallery-send" />
{/if}
</Button>
2024-09-12 23:56:33 +00:00
</div>
2025-02-04 00:37:14 +00:00
{/snippet}
2024-09-12 23:56:33 +00:00
</Field>
<Field>
2025-02-04 00:37:14 +00:00
{#snippet input()}
<div class="grid grid-cols-2 gap-2">
<div class="flex flex-col gap-1">
<strong>Start</strong>
<DateTimeInput bind:value={start} />
</div>
<div class="flex flex-col gap-1">
<strong>End</strong>
<DateTimeInput bind:value={end} />
</div>
2024-09-11 22:21:25 +00:00
</div>
2025-02-04 00:37:14 +00:00
{/snippet}
2024-09-11 22:21:25 +00:00
</Field>
<Field>
2025-02-04 00:37:14 +00:00
{#snippet label()}
<p>Location (optional)</p>
{/snippet}
{#snippet input()}
<label class="input input-bordered flex w-full items-center gap-2">
<Icon icon="map-point" />
<input bind:value={location} class="grow" type="text" />
</label>
{/snippet}
2024-09-11 22:21:25 +00:00
</Field>
<ModalFooter>
<Button class="btn btn-link" onclick={back}>
2024-09-11 22:21:25 +00:00
<Icon icon="alt-arrow-left" />
Go back
</Button>
2024-09-23 20:58:01 +00:00
<Button type="submit" class="btn btn-primary">Create Event</Button>
</ModalFooter>
2024-09-11 22:21:25 +00:00
</form>