flotilla/src/app/components/EventCreate.svelte

144 lines
3.9 KiB
Svelte
Raw Normal View History

2024-09-11 22:21:25 +00:00
<script lang="ts">
2025-01-02 18:04:28 +00:00
import {writable} from "svelte/store"
2025-02-05 23:15:50 +00:00
import {randomId} from "@welshman/lib"
2025-01-02 18:04:28 +00:00
import {createEvent, EVENT_TIME} from "@welshman/util"
2025-02-05 23:05:58 +00:00
import {publishThunk} from "@welshman/app"
2025-02-04 03:28:29 +00:00
import {preventDefault} from "@lib/html"
2025-02-05 23:15:50 +00:00
import {daysBetween} from "@lib/util"
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"
2025-02-05 16:17:51 +00:00
import EditorContent from "@app/editor/EditorContent.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, {
2025-02-04 04:57:47 +00:00
content: editor.getText({blockSeparator: "\n"}).trim(),
2024-09-20 18:00:41 +00:00
tags: [
["d", randomId()],
["title", title],
["location", location],
2025-02-05 23:05:58 +00:00
["start", start.toString()],
["end", end.toString()],
2025-02-05 23:15:50 +00:00
...daysBetween(start, end).map(D => ["D", D]),
2025-02-04 04:57:47 +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("")
2025-02-05 23:05:58 +00:00
let start: number | undefined = $state()
let end: number | 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">
2025-02-04 04:57:47 +00:00
<EditorContent {editor} />
2025-02-04 00:37:14 +00:00
</div>
<Button
data-tip="Add an image"
class="center btn tooltip"
2025-02-04 04:57:47 +00:00
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-01-29 01:43:26 +00:00
{#snippet label()}
2025-02-05 18:47:56 +00:00
Start*
2025-01-29 01:43:26 +00:00
{/snippet}
2025-02-04 00:37:14 +00:00
{#snippet input()}
2025-01-29 01:43:26 +00:00
<DateTimeInput bind:value={start} />
{/snippet}
</Field>
<Field>
{#snippet label()}
2025-02-05 18:47:56 +00:00
End*
2025-01-29 01:43:26 +00:00
{/snippet}
{#snippet input()}
<DateTimeInput bind:value={end} />
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>