generated from lucien/api-template
fix: fixed mentions display and added MessageComponent
This commit is contained in:
parent
6c8f354bf6
commit
e38691c02a
4 changed files with 56 additions and 45 deletions
31
front/src/components/MessageComponent.tsx
Normal file
31
front/src/components/MessageComponent.tsx
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { Message, User, Channel } from "../types";
|
||||||
|
|
||||||
|
export default function MessageComponent({ message, user, channel, deleteMessage }: {
|
||||||
|
message: Message;
|
||||||
|
user: User | undefined;
|
||||||
|
channel: Channel | undefined;
|
||||||
|
deleteMessage: ((messageId: number) => void) | undefined;
|
||||||
|
}) {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<li key={message.id}>
|
||||||
|
<Link to={`/u/${message.username}`}>{message.username}</Link>:{" "}
|
||||||
|
{message.content.split(" ").map((word, index) => {
|
||||||
|
if (word.startsWith("@")) {
|
||||||
|
const mention = message.mentions.find((mention) => `@${mention.username}` === word);
|
||||||
|
if (mention) {
|
||||||
|
return <span><Link key={index} to={`/u/${mention.username}`}>{word}</Link> </span>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return <span key={index}>{word} </span>;
|
||||||
|
})}
|
||||||
|
<p>{new Date(message.date * 1000).toLocaleString()}</p>
|
||||||
|
{channel && deleteMessage && (
|
||||||
|
user?.id === message.user_id || user?.id === channel?.owner_id || user?.admin === 1) && (
|
||||||
|
<button onClick={() => {deleteMessage(message.id)}}>Delete</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import { useParams, Link } from "react-router-dom";
|
import { useParams, Link } from "react-router-dom";
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { Channel, Messages, User } from "../types";
|
import { Channel, Messages, User } from "../types";
|
||||||
|
import MessageComponent from "../components/MessageComponent";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
export default function ChannelPage() {
|
export default function ChannelPage() {
|
||||||
|
@ -105,7 +106,7 @@ export default function ChannelPage() {
|
||||||
<Link to="/">Home</Link>
|
<Link to="/">Home</Link>
|
||||||
<h1>Channel {channel.name}</h1>
|
<h1>Channel {channel.name}</h1>
|
||||||
<p>{channel.description}</p>
|
<p>{channel.description}</p>
|
||||||
<p>Owner: {channel.owner_username}</p>
|
<p>Owner: <Link to={`/u/${channel.owner_username}`}>{channel.owner_username}</Link></p>
|
||||||
{channel.name.toLowerCase().includes("cat") && (
|
{channel.name.toLowerCase().includes("cat") && (
|
||||||
<img src="/cat.jpg" alt="cat" className="cat" />
|
<img src="/cat.jpg" alt="cat" className="cat" />
|
||||||
)}
|
)}
|
||||||
|
@ -150,22 +151,13 @@ export default function ChannelPage() {
|
||||||
}
|
}
|
||||||
<ul>
|
<ul>
|
||||||
{messages.slice(0, maxMessageToShown).map((message) => (
|
{messages.slice(0, maxMessageToShown).map((message) => (
|
||||||
<li key={message.id}>
|
<MessageComponent
|
||||||
<Link to={`/u/${message.username}`}>{message.username}</Link>:{" "}
|
key={message.id}
|
||||||
{message.content.split(" ").map((word, index) => {
|
message={message}
|
||||||
if (word.startsWith("@")) {
|
user={user}
|
||||||
const mention = message.mentions.find((mention) => `@${mention.username}` === word);
|
channel={channel}
|
||||||
if (mention) {
|
deleteMessage={deleteMessage}
|
||||||
return <Link key={index} to={`/u/${mention.username}`}>{word}</Link>;
|
/>
|
||||||
}
|
|
||||||
}
|
|
||||||
return <span key={index}>{word} </span>;
|
|
||||||
})}
|
|
||||||
<p>{new Date(message.date * 1000).toLocaleString()}</p>
|
|
||||||
{(user?.id === message.user_id || user?.id === channel.owner_id || user?.admin === 1) && (
|
|
||||||
<button onClick={() => {deleteMessage(message.id)}}>Delete</button>
|
|
||||||
)}
|
|
||||||
</li>
|
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { useState, useEffect } from "react"
|
import { useState, useEffect } from "react"
|
||||||
import { Link } from "react-router-dom"
|
import { Link } from "react-router-dom"
|
||||||
import { Channels, RecentChannels, User, Messages } from "../types"
|
import { Channels, RecentChannels, User, Messages } from "../types"
|
||||||
|
import MessageComponent from "../components/MessageComponent"
|
||||||
import axios from "axios"
|
import axios from "axios"
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
|
@ -122,20 +123,13 @@ export default function Home() {
|
||||||
<h2>Last messages</h2>
|
<h2>Last messages</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{messages?.map((message) => (
|
{messages?.map((message) => (
|
||||||
<li key={message.id}>
|
<MessageComponent
|
||||||
<Link to={`/u/${message.username}`}>{message.username}</Link>:{" "}
|
key={message.id}
|
||||||
{message.content.split(" ").map((word, index) => {
|
message={message}
|
||||||
if (word.startsWith("@")) {
|
user={user}
|
||||||
const mention = message.mentions.find((mention) => `@${mention.username}` === word);
|
channel={undefined}
|
||||||
if (mention) {
|
deleteMessage={undefined}
|
||||||
return <Link key={index} to={`/u/${mention.username}`}>{word}</Link>;
|
/>
|
||||||
}
|
|
||||||
}
|
|
||||||
return <span key={index}>{word} </span>;
|
|
||||||
})}
|
|
||||||
<p>In <Link to={`/c/${message.channel_name}`}>{message.channel_name}</Link></p>
|
|
||||||
<p>{new Date(message.date * 1000).toLocaleString()}</p>
|
|
||||||
</li>
|
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
<img src="osaka_arch.png" alt="osaka" className="osaka"/>
|
<img src="osaka_arch.png" alt="osaka" className="osaka"/>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { useParams, Link } from "react-router-dom";
|
import { useParams, Link } from "react-router-dom";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { User, Messages } from "../types";
|
import { User, Messages } from "../types";
|
||||||
|
import MessageComponent from "../components/MessageComponent";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
export default function UserPage() {
|
export default function UserPage() {
|
||||||
|
@ -41,20 +42,13 @@ export default function UserPage() {
|
||||||
<h1>Last messages</h1>
|
<h1>Last messages</h1>
|
||||||
<ul>
|
<ul>
|
||||||
{messages?.map((message) => (
|
{messages?.map((message) => (
|
||||||
<li key={message.id}>
|
<MessageComponent
|
||||||
<Link to={`/u/${message.username}`}>{message.username}</Link>:{" "}
|
key={message.id}
|
||||||
{message.content.split(" ").map((word, index) => {
|
message={message}
|
||||||
if (word.startsWith("@")) {
|
user={user}
|
||||||
const mention = message.mentions.find((mention) => `@${mention.username}` === word);
|
channel={undefined}
|
||||||
if (mention) {
|
deleteMessage={undefined}
|
||||||
return <Link key={index} to={`/u/${mention.username}`}>{word}</Link>;
|
/>
|
||||||
}
|
|
||||||
}
|
|
||||||
return <span key={index}>{word} </span>;
|
|
||||||
})}
|
|
||||||
<p>In <Link to={`/c/${message.channel_name}`}>{message.channel_name}</Link></p>
|
|
||||||
<p>{new Date(message.date * 1000).toLocaleString()}</p>
|
|
||||||
</li>
|
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue