94 lines
3.2 KiB
Vue
94 lines
3.2 KiB
Vue
<script setup lang="ts">
|
||
import { Heart, Send } from 'lucide-vue-next'
|
||
import { ref } from 'vue'
|
||
import { postMessage } from '../api/client'
|
||
|
||
const nickname = ref('')
|
||
const message = ref('')
|
||
const sending = ref(false)
|
||
const done = ref(false)
|
||
const error = ref<string | null>(null)
|
||
|
||
async function submit() {
|
||
error.value = null
|
||
const n = nickname.value.trim()
|
||
const m = message.value.trim()
|
||
if (!n || !m) {
|
||
error.value = '请填写昵称和留言'
|
||
return
|
||
}
|
||
sending.value = true
|
||
try {
|
||
await postMessage({ nickname: n, message: m })
|
||
done.value = true
|
||
nickname.value = ''
|
||
message.value = ''
|
||
} catch {
|
||
error.value = '发送失败,请稍后再试'
|
||
} finally {
|
||
sending.value = false
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<template>
|
||
<section
|
||
class="relative mx-auto max-w-lg px-4 pb-28 pt-4 sm:px-6"
|
||
aria-labelledby="guestbook-title"
|
||
>
|
||
<div class="nepal-brick-frame">
|
||
<div
|
||
class="relative rounded-2xl bg-gradient-to-b from-white/98 to-lokta-cream/40 p-6 ring-1 ring-lokta-deep/5 sm:p-8"
|
||
>
|
||
<div class="flex items-center gap-2 text-rose-deep">
|
||
<Heart class="h-5 w-5" fill="currentColor" aria-hidden="true" />
|
||
<h2 id="guestbook-title" class="font-brush text-3xl text-lokta-deep sm:text-4xl">
|
||
给她的一句话
|
||
</h2>
|
||
</div>
|
||
<p class="mt-2 text-sm text-ink-muted">
|
||
写下手帐最后一页的悄悄话,会保存在服务器上。
|
||
</p>
|
||
<form class="mt-6 space-y-4" @submit.prevent="submit">
|
||
<div>
|
||
<label class="block text-xs font-medium text-ink-muted" for="nick">昵称</label>
|
||
<input
|
||
id="nick"
|
||
v-model="nickname"
|
||
maxlength="80"
|
||
autocomplete="nickname"
|
||
class="mt-1 w-full rounded-xl border border-paper-shadow bg-paper/80 px-4 py-3 text-ink shadow-inner outline-none ring-0 transition focus:border-rose-soft/60 focus:ring-2 focus:ring-rose-soft/25"
|
||
placeholder="例如:你的小朋友"
|
||
>
|
||
</div>
|
||
<div>
|
||
<label class="block text-xs font-medium text-ink-muted" for="msg">留言</label>
|
||
<textarea
|
||
id="msg"
|
||
v-model="message"
|
||
rows="5"
|
||
maxlength="2000"
|
||
class="mt-1 w-full resize-y rounded-xl border border-paper-shadow bg-paper/80 px-4 py-3 text-ink shadow-inner outline-none transition focus:border-rose-soft/60 focus:ring-2 focus:ring-rose-soft/25"
|
||
placeholder="写下你想说的话…"
|
||
/>
|
||
</div>
|
||
<p v-if="error" class="text-sm text-rose-deep">
|
||
{{ error }}
|
||
</p>
|
||
<p v-if="done" class="text-sm text-ink-muted">
|
||
已收到你的心意,谢谢你打开这一页。
|
||
</p>
|
||
<button
|
||
type="submit"
|
||
class="inline-flex w-full items-center justify-center gap-2 rounded-full bg-rose-soft px-5 py-3 text-sm font-semibold text-white shadow-md transition hover:bg-rose-deep disabled:cursor-not-allowed disabled:opacity-60"
|
||
:disabled="sending"
|
||
>
|
||
<Send class="h-4 w-4" aria-hidden="true" />
|
||
{{ sending ? '发送中…' : '寄出留言' }}
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</template>
|