Files
mwy/frontend/src/components/MessageForm.vue
flowerstonezl c90b10cd5a first commit
2026-05-11 19:34:35 +08:00

94 lines
3.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>