fix: fixed mentions menu position and focus

This commit is contained in:
Lukian 2025-04-06 23:12:57 +02:00
parent 477fff18fd
commit eae2a483b5
2 changed files with 28 additions and 3 deletions

View file

@ -16,6 +16,7 @@ export default function ChannelPage() {
const [message, setMessage] = useState<string>(""); const [message, setMessage] = useState<string>("");
const [maxMessageToShown, setMaxMessageToShown] = useState<number>(10); const [maxMessageToShown, setMaxMessageToShown] = useState<number>(10);
const [searchedUsers, setSearchedUsers] = useState<User[]>([]); const [searchedUsers, setSearchedUsers] = useState<User[]>([]);
const ref = React.createRef<HTMLInputElement>();
function handleSubmit(e: React.FormEvent) { function handleSubmit(e: React.FormEvent) {
e.preventDefault(); e.preventDefault();
@ -121,13 +122,13 @@ export default function ChannelPage() {
placeholder="Message" placeholder="Message"
value={message} value={message}
onChange={(e) => setMessage(e.target.value)} onChange={(e) => setMessage(e.target.value)}
ref={ref}
/> />
<button type="submit">Send</button> <button type="submit">Send</button>
{searchedUsers.length > 0 && ( {searchedUsers.length > 0 && (
<div> <div className="mentions">
<p>Mentions:</p>
{searchedUsers.map((user) => ( {searchedUsers.map((user) => (
<div key={user.id}> <div key={user.id} className="mention">
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
<button <button
type="button" type="button"
@ -136,6 +137,7 @@ export default function ChannelPage() {
message.split(" ").slice(0, -1).join(" ") + " @" + user.username + " " message.split(" ").slice(0, -1).join(" ") + " @" + user.username + " "
); );
setSearchedUsers([]); setSearchedUsers([]);
ref.current?.focus();
}} }}
> >
Mention Mention

View file

@ -16,6 +16,29 @@
.message-form { .message-form {
margin: 16px 0; margin: 16px 0;
position: relative;
}
.mentions {
position: absolute;
top: 100%;
border: 1px solid #270722;
padding: 5px;
display: flex;
flex-direction: column;
justify-content: start;
align-items: left;
gap: 5px;
width: 20%;
background-color: white;
}
.mention {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: top;
gap: 5px;
} }
.login-prompt { .login-prompt {