Skip to content

Commit 17b14ba

Browse files
fix(ticket): disallow empty message
1 parent cfef9ed commit 17b14ba

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

api/src/api/errors.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ errors!(
245245
status: NOT_FOUND,
246246
"The requested ticket was not found.",
247247
},
248+
TicketMessageEmpty {
249+
status: BAD_REQUEST,
250+
"The ticket message is empty.",
251+
},
248252
TicketMetaNotValid {
249253
status: BAD_REQUEST,
250254
"The metadata for the ticket is not in a valid format, should be a key-value of strings.",

api/src/api/tickets.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ pub async fn post_message_handler(
117117
return Err(ApiError::TicketNotFound);
118118
}
119119

120+
if new_message.message.is_empty() {
121+
return Err(ApiError::TicketMessageEmpty);
122+
}
123+
120124
let (message, message_author) = db
121125
.ticket_add_message(id, current_user.id, new_message)
122126
.await?;

frontend/islands/TicketMessageInput.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright 2024 the JSR authors. All rights reserved. MIT license.
2-
import { useState } from "preact/hooks";
2+
import { useEffect, useState } from "preact/hooks";
33
import { TbCheck, TbClock } from "tb-icons";
44
import {
55
AdminUpdateTicketRequest,
@@ -13,13 +13,29 @@ export function TicketMessageInput(
1313
{ ticket, user }: { ticket: Ticket; user: FullUser },
1414
) {
1515
const [message, setMessage] = useState("");
16+
const [error, setError] = useState<string | null>(null);
17+
18+
useEffect(() => {
19+
if (error) {
20+
const timeout = setTimeout(() => {
21+
setError(null);
22+
}, 3000); // 3 seconds
23+
24+
return () => clearTimeout(timeout);
25+
}
26+
}, [error]);
1627

1728
return (
1829
<form
1930
class="space-y-5"
2031
onSubmit={(e) => {
2132
e.preventDefault();
2233

34+
if (message.trim() === "") {
35+
setError("Message cannot be empty");
36+
return;
37+
}
38+
2339
api.post(
2440
path`/tickets/${ticket.id}`,
2541
{
@@ -42,7 +58,14 @@ export function TicketMessageInput(
4258
placeholder="Type your message here..."
4359
onChange={(e) => setMessage(e.currentTarget!.value)}
4460
/>
45-
<div class="flex justify-end gap-4">
61+
<div class="flex justify-end gap-4 items-center">
62+
{error && (
63+
<div class="text-red-500 font-semibold">
64+
<p>
65+
{error}
66+
</p>
67+
</div>
68+
)}
4669
<button type="submit" class="button-primary">Send message</button>
4770
{user.isStaff && (
4871
<button

0 commit comments

Comments
 (0)