diff --git a/back/api/emojis.js b/back/api/emojis.js index e16e41e..d50f771 100644 --- a/back/api/emojis.js +++ b/back/api/emojis.js @@ -84,6 +84,10 @@ router.get('/:name', async (req, res) => { return res.status(404).send({ error: 'Emoji not found' }); } + if (!fs.existsSync(`data/emojis/${emoji[0].file}`)) { + return res.sendFile(path.join(__dirname, `../images/default.png`), { headers: { 'Content-Type': 'image' } }); + } + res.sendFile(path.join(__dirname, `../data/emojis/${emoji[0].file}`), { headers: { 'Content-Type': 'image' } }); }); diff --git a/back/api/users.js b/back/api/users.js index 5d2720a..ab8a50d 100644 --- a/back/api/users.js +++ b/back/api/users.js @@ -81,7 +81,7 @@ router.get('/:username/pfp', async (req, res) => { const pfp = user[0].pfp; if (!pfp || !fs.existsSync(path.join(__dirname, `../data/pfps/${pfp}`))) { - return res.sendFile(path.join(__dirname, `../images/default-pfp.png`), { headers: { 'Content-Type': 'image' } }); + return res.sendFile(path.join(__dirname, `../images/default.png`), { headers: { 'Content-Type': 'image' } }); } res.sendFile(path.join(__dirname, `../data/pfps/${pfp}`), { headers: { 'Content-Type': 'image' } }); diff --git a/back/images/default-pfp.png b/back/images/default.png similarity index 100% rename from back/images/default-pfp.png rename to back/images/default.png diff --git a/front/public/DepartureMonoNerdFontMono-Regular.otf b/front/public/DepartureMonoNerdFontMono-Regular.otf new file mode 100644 index 0000000..f9dc2e8 Binary files /dev/null and b/front/public/DepartureMonoNerdFontMono-Regular.otf differ diff --git a/front/src/components/MessageComponent.tsx b/front/src/components/MessageComponent.tsx index a41f92d..9d21183 100644 --- a/front/src/components/MessageComponent.tsx +++ b/front/src/components/MessageComponent.tsx @@ -148,31 +148,30 @@ export default function MessageComponent({ message, user, channel }: { Le poisson steve )} - {channel?.owner_id == user?.id || user?.admin == 1 || user?.username == message.username ? ( - user?.id === message.user_id || user?.id === channel?.owner_id || user?.admin === 1) && ( - - ) : ( -

In {message.channel_name}

+ {(channel?.owner_id == user?.id || user?.admin == 1 || user?.id == message.user_id) && ( + )} {channel && user && !reply && ( - + )} {reply && ( -
handleReply(e, message.id)} className="message-form"> + handleReply(e, message.id)} className="form-horizontal"> setReplyContent(e.target.value)} ref={ref} /> - + {searchedUsers.length > 0 && ( -
+
{searchedUsers.map((user) => ( -
+
{user.username}
)} {searchedEmojis.length > 0 && ( -
+
{searchedEmojis.map((emoji) => ( -
- {emoji.name} +
+ {emoji.name} :{emoji.name}:
)} - + )} {message.has_replies == true && ( diff --git a/front/src/components/TopBar.tsx b/front/src/components/TopBar.tsx index 0c80551..65d0e3b 100644 --- a/front/src/components/TopBar.tsx +++ b/front/src/components/TopBar.tsx @@ -25,7 +25,7 @@ export default function TopBar({ user }: { user: User | undefined }) { {user ? (
{user.username} -
)} -
diff --git a/front/src/index.css b/front/src/index.css index 8c34fe7..900ecc6 100644 --- a/front/src/index.css +++ b/front/src/index.css @@ -1,8 +1,27 @@ +@font-face { + font-family: DepartureMono; + src: url("/DepartureMonoNerdFontMono-Regular.otf") format("opentype"); +} + +* { + font-family: DepartureMono; +} + html { background: linear-gradient(#FFE0E3, #f59ebb); min-height: 100vh; } +input[type=file] { + display: none; +} + +label { + display: flex; + justify-content: center; + align-items: center; +} + .forum-page { display: flex; flex-direction: column; @@ -23,6 +42,82 @@ html { background-color: #fff6fd; } +.center { + justify-content: center; + align-items: center; +} + +.forum-button { + padding: 5px; + border-radius: 0px; + background-color: #ebb8e6; + border: 1px solid #270722; + box-shadow: none; + font-size: 13px; +} + +.forum-button span { + font-size: 13px; +} + +.forum-button:hover { + background-color: #d4b4f0; +} + +.forum-input { + padding: 5px; + border-radius: 0px; + background-color: #fff6fd; + border: 1px solid #270722; + box-shadow: none; +} + +.form-horizontal { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + gap: 5px; + position: relative; +} + +.form-vertical { + display: flex; + flex-direction: column; + justify-content: start; + align-items: left; + gap: 5px; + position: relative; +} + +.input-menu { + z-index: 1; + position: absolute; + top: 100%; + border: 1px solid #270722; + background-color: #fff6fd; + padding: 5px; + display: flex; + flex-direction: column; + justify-content: start; + align-items: left; + gap: 5px; + min-width: 20%; +} + +.input-menu-item { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: top; + gap: 5px; +} + +.emoji { + max-width: 1em; + max-height: 1em; +} + .cat { width: 100px; } @@ -50,6 +145,32 @@ html { color: #e4d9ec; } + .forum-button { + border: 1px solid #a678af; + background-color: #847996; + color: black; + } + + .forum-button:hover { + background-color: #584f68; + } + + .forum-input { + border: 1px solid #a678af; + background-color: #1b1b23; + color: #e4d9ec; + } + + .forum-input::placeholder { + color: #e4d9ec; + } + + .input-menu { + border: 1px solid #a678af; + background-color: #1b1b23; + color: #e4d9ec; + } + a { color: #b88edc; text-decoration: underline; diff --git a/front/src/pages/ChannelPage.tsx b/front/src/pages/ChannelPage.tsx index aba398c..e84e0cb 100644 --- a/front/src/pages/ChannelPage.tsx +++ b/front/src/pages/ChannelPage.tsx @@ -198,32 +198,37 @@ export default function ChannelPage({socket}: {socket: WebSocket}) { cat )} {user?.admin == 1 && ( - )} {user?.admin == 1 && ( - )} {token ? ( -
+ setMessage(e.target.value)} ref={ref} /> - - + + {searchedUsers.length > 0 && ( -
+
{searchedUsers.map((user) => ( -
+
{user.username}
)} {searchedEmojis.length > 0 && ( -
+
{searchedEmojis.map((emoji) => ( -
- {emoji.name} +
+ {emoji.name} :{emoji.name}: + )}
) : ( diff --git a/front/src/pages/ChannelsPage.tsx b/front/src/pages/ChannelsPage.tsx index 2050ada..fe06ce7 100644 --- a/front/src/pages/ChannelsPage.tsx +++ b/front/src/pages/ChannelsPage.tsx @@ -79,6 +79,7 @@ export default function ChannelsPage({socket}: {socket: WebSocket}) {

Channels

Create channel {channel.name} {user?.admin == 1 && ( - )} diff --git a/front/src/pages/CreateChannel.tsx b/front/src/pages/CreateChannel.tsx index c8a0a4b..4c56b94 100644 --- a/front/src/pages/CreateChannel.tsx +++ b/front/src/pages/CreateChannel.tsx @@ -41,25 +41,27 @@ export default function CreateChannel() {

Create Channel

- +

{!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && ( Channel name can only contain letters, numbers, - and _ )}

setName(e.target.value)} /> setDescription(e.target.value)} /> - diff --git a/front/src/pages/CreateEmoji.tsx b/front/src/pages/CreateEmoji.tsx index 9fdd062..11af1c3 100644 --- a/front/src/pages/CreateEmoji.tsx +++ b/front/src/pages/CreateEmoji.tsx @@ -52,20 +52,24 @@ export default function CreateEmoji() {

Create Emoji

-
+

{!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && ( Emoji name can only contain letters, numbers, - and _ )}

setName(e.target.value)} /> - -
diff --git a/front/src/pages/EditProfile.tsx b/front/src/pages/EditProfile.tsx index 85cc118..e59cd0b 100644 --- a/front/src/pages/EditProfile.tsx +++ b/front/src/pages/EditProfile.tsx @@ -105,26 +105,29 @@ export default function EditProfile() {

Edit Profile Picture

-
- - - + + + +

Edit Username

-
- - + + +

Edit Password

-
- - - - + + + + +
diff --git a/front/src/pages/EmojisPage.tsx b/front/src/pages/EmojisPage.tsx index 95bb4ec..1fcc18f 100644 --- a/front/src/pages/EmojisPage.tsx +++ b/front/src/pages/EmojisPage.tsx @@ -84,6 +84,7 @@ export default function EmojisPage({socket}: {socket: WebSocket}) {

Emojis

Create emoji {emojis?.sort().filter((emoji) => emoji.name.toLowerCase().includes(search.toLowerCase())).map((emoji) => (
  • - {emoji.name} + {emoji.name} :{emoji.name}: {user?.admin == 1 && ( - )} diff --git a/front/src/pages/Home.tsx b/front/src/pages/Home.tsx index 7789268..5918203 100644 --- a/front/src/pages/Home.tsx +++ b/front/src/pages/Home.tsx @@ -199,6 +199,7 @@ export default function Home({socket}: {socket: WebSocket}) {

    Search channels

    -
    +

    Login

    -
    + setUsername(e.target.value)} /> setPassword(e.target.value)} /> - +
    Register
    diff --git a/front/src/pages/Register.tsx b/front/src/pages/Register.tsx index 99d7461..17265d6 100644 --- a/front/src/pages/Register.tsx +++ b/front/src/pages/Register.tsx @@ -31,27 +31,27 @@ export default function Register () { return (
    -
    +

    Register

    -
    -

    - {!/^[a-zA-Z0-9-_]+$/.test(username) && username.length != 0 && ( - Username can only contain letters, numbers, - and _ - )} -

    + + {!/^[a-zA-Z0-9-_]+$/.test(username) && username.length != 0 && ( +

    Username can only contain letters, numbers, - and _

    + )} setUsername(e.target.value)} /> setPassword(e.target.value)} /> -
    diff --git a/front/src/pages/UserPage.tsx b/front/src/pages/UserPage.tsx index cb7bce1..6d6e7cc 100644 --- a/front/src/pages/UserPage.tsx +++ b/front/src/pages/UserPage.tsx @@ -132,14 +132,14 @@ export default function UserPage({socket}: {socket: WebSocket}) { Edit profile )} {user?.admin == 1 && ( -
    - - -
    + + )} + {user?.admin == 1 && ( + )}
    diff --git a/front/src/pages/UsersPage.tsx b/front/src/pages/UsersPage.tsx index 6e64d43..94948b6 100644 --- a/front/src/pages/UsersPage.tsx +++ b/front/src/pages/UsersPage.tsx @@ -78,6 +78,7 @@ export default function UsersPage({socket}: {socket: WebSocket}) {

    Users

    {user.username} {thisUser?.admin == 1 && ( - )} diff --git a/front/src/styles/ChannelPage.css b/front/src/styles/ChannelPage.css index 8ed32e0..0b24c2a 100644 --- a/front/src/styles/ChannelPage.css +++ b/front/src/styles/ChannelPage.css @@ -3,55 +3,6 @@ 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; - min-width: 20%; - background-color: white; -} - -.mention { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: top; - gap: 5px; -} - -.emojis { - position: absolute; - top: 100%; - border: 1px solid #270722; - padding: 5px; - display: flex; - flex-direction: column; - justify-content: start; - align-items: left; - gap: 5px; - min-width: 20%; - background-color: white; -} - -.search-emoji { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: top; - gap: 5px; -} - -.emojis-emoji { - max-width: 1em; - max-height: 1em; -} - .login-prompt { margin: 16px 0; display: flex; diff --git a/front/src/styles/EmojisPage.css b/front/src/styles/EmojisPage.css index ee8aa8c..b456e5a 100644 --- a/front/src/styles/EmojisPage.css +++ b/front/src/styles/EmojisPage.css @@ -1,4 +1,4 @@ -.emoji { - max-width: 5em; - max-height: 5em; +.emoji-fat { + max-width: 2em; + max-height: 2em; } \ No newline at end of file diff --git a/front/src/styles/TopBar.css b/front/src/styles/TopBar.css index 223884c..d979fb1 100644 --- a/front/src/styles/TopBar.css +++ b/front/src/styles/TopBar.css @@ -2,6 +2,7 @@ justify-content: space-between; align-items: center; flex-direction: row; + height: 45px; } .topbar-left { @@ -9,6 +10,17 @@ justify-content: space-between; align-items: center; gap: 10px; + z-index: 2; +} + +.topbar-center { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 0; + z-index: 1; } .topbar-right { @@ -16,6 +28,7 @@ justify-content: space-between; align-items: center; gap: 10px; + z-index: 2; } .topbar-user-pfp { @@ -46,12 +59,17 @@ .topbar { flex-direction: column; align-items: center; + height: auto; } .topbar-left { display: none; } + .topbar-center { + position: relative; + } + .topbar-right { display: none; }