diff --git a/classes/Message.ts b/classes/Message.ts index a782d6a..de0d12b 100644 --- a/classes/Message.ts +++ b/classes/Message.ts @@ -12,4 +12,8 @@ export default class Message { this.userUuid = user_uuid; this.message = message; } + + getTimestamp() { + return uuidToTimestamp(this.uuid); + } } \ No newline at end of file diff --git a/components/Message.vue b/components/Message.vue index c6207a1..c926616 100644 --- a/components/Message.vue +++ b/components/Message.vue @@ -1,22 +1,24 @@ @@ -69,37 +71,33 @@ import MessageReply from './UserInterface/MessageReply.vue'; import type { ContextMenuInterface, ContextMenuItem } from '~/types/interfaces'; const { getDisplayName } = useProfile() -const { getUser } = useAuth() const props = defineProps(); -const me = await getUser() - const contextMenu = useState("contextMenu", () => ({ show: false, pointerX: 0, pointerY: 0, items: [] })); const messageElement = ref(); const dateHidden = ref(true); -const date = uuidToDate(props.message.uuid); - +const date = new Date(props.timestamp); const currentDate: Date = new Date() console.log("[MSG] message to render:", props.message); -console.log("author:", props.message.member); +console.log("author:", props.author); console.log("[MSG] reply message:", props.replyMessage); const linkRegex = /https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)/g; const linkMatches = props.message.message.matchAll(linkRegex).map(link => link[0]); -const mediaLinks = ref([]); +const mediaLinks: string[] = []; console.log("link matches:", linkMatches); -const hideText = ref(false); +const hasEmbed = ref(false); const sanitized = ref(); onMounted(async () => { - const parsed = await parse(props.message.message, { gfm: true }); + const parsed = await parse(props.text, { gfm: true }); sanitized.value = DOMPurify.sanitize(parsed, { ALLOWED_TAGS: [ "strong", "em", "br", "blockquote", @@ -123,35 +121,23 @@ onMounted(async () => { console.log("added listeners"); } - const links: string[] = []; for (const link of linkMatches) { - console.log("link:", link); - try { - const res = await $fetch.raw(link); - if (res.ok && res.headers.get("content-type")?.match(/^image\/(apng|gif|jpeg|png|webp)$/)) { - console.log("link is image"); - links.push(link); - } - } catch (error) { - console.error(error); + console.log("link:", link); + try { + const res = await $fetch.raw(link); + if (res.ok && res.headers.get("content-type")?.match(/^image\/(apng|gif|jpeg|png|webp)$/)) { + console.log("link is image"); + mediaLinks.push(link); } - - mediaLinks.value = [...links]; + if (mediaLinks.length) { + hasEmbed.value = true + }; + } catch (error) { + console.error(error); } +} - if (mediaLinks.value.length) { - const nonLinks = props.message.message.split(linkRegex); - let invalidContent = false; - for (const nonLink of nonLinks) { - if (nonLink != "" && nonLink != "\n" && nonLink != "
") { - invalidContent = true; - break; - } - } - hideText.value = !invalidContent; - }; - - console.log("media links:", mediaLinks); +console.log("media links:", mediaLinks); }); //function toggleTooltip(e: Event) { @@ -162,13 +148,13 @@ const menuItems: ContextMenuItem[] = [ { name: "Reply", icon: "lucide:reply", type: "normal", callback: () => { if (messageElement.value) replyToMessage(messageElement.value, props) } } ] -console.log("me:", me); -if (props.message.member.user.uuid == me!.uuid) { +console.log("me:", props.me); +if (props.author?.user.uuid == props.me.uuid) { // Inserts "edit" option at index 1 (below the "reply" option) menuItems.splice(1, 0, { name: "Edit (WIP)", icon: "lucide:square-pen", type: "normal", callback: () => { /* if (messageElement.value) editMessage(messageElement.value, props) */ } }); } -if (props.message.member.user.uuid == me!.uuid /* || check message delete permission*/) { +if (props.author?.user.uuid == props.me.uuid /* || check message delete permission*/) { // Inserts "edit" option at index 2 (below the "edit" option) menuItems.splice(2, 0, { name: "Delete (WIP)", icon: "lucide:trash", type: "danger", callback: () => {} }); } @@ -188,20 +174,14 @@ function getDayDifference(date1: Date, date2: Date) { \ No newline at end of file diff --git a/components/Modal/Base.vue b/components/Modal/Base.vue index a5d8ebd..f2360bc 100644 --- a/components/Modal/Base.vue +++ b/components/Modal/Base.vue @@ -1,18 +1,11 @@ - \ No newline at end of file diff --git a/components/Modal/ProfilePopup.vue b/components/Modal/ProfilePopup.vue index b99a9ea..8eeee6c 100644 --- a/components/Modal/ProfilePopup.vue +++ b/components/Modal/ProfilePopup.vue @@ -114,16 +114,16 @@ function buttonEditProfile() { text-align: left; position: relative; - max-height: 60dvh; - max-width: 60dvw; + max-height: 70dvh; + max-width: 70dvw; height: 30em; width: 40em; display: flex; flex-direction: column; - background-color: var(--chat-background-color); - border-radius: var(--standard-radius); + color: var(--text-color); + background-color: var(--modal-background-color); overflow-y: scroll; } @@ -142,7 +142,6 @@ function buttonEditProfile() { z-index: 0; background-color: var(--primary-color); - border-radius: var(--standard-radius) var(--standard-radius) 0 0; /* top left and top right */ } #avatar { diff --git a/public/themes/layout/gorb.css b/public/themes/layout/gorb.css index 1cee0b4..86ea465 100644 --- a/public/themes/layout/gorb.css +++ b/public/themes/layout/gorb.css @@ -9,8 +9,8 @@ complementaryColor = white --sidebar-icon-gap: .25em; --sidebar-margin: .5em; - --minor-radius: .35em; --standard-radius: .5em; + --embed-radius: .3em; --button-radius: .6em; --guild-icon-radius: 15%; --pfp-radius: 50%; diff --git a/public/themes/style/ash.css b/public/themes/style/ash.css index e33fbf6..d4ed893 100644 --- a/public/themes/style/ash.css +++ b/public/themes/style/ash.css @@ -10,15 +10,16 @@ complementaryColor = white --reply-text-color: #969696; --danger-text-color: #ff0000; - --chat-background-color: #383432; - --chat-highlighted-background-color: #4c4a48; + --chat-background-color: #2f2e2d; + --chat-highlighted-background-color: #3f3b38; --chat-important-background-color: #ffcf5f38; --chat-important-highlighted-background-color: #ffa86f4f; --chat-featured-message-color: #4f3f2f60; --popup-background-color: #2f2828; --popup-highlighted-background-color: #382f2f; + --modal-background-color: #3a352f; - --sidebar-background-color: #322f2d; + --sidebar-background-color: #3e3a37; --sidebar-highlighted-background-color: #46423b; --topbar-background-color: #3a3733; --chatbox-background-color: #3a3733; diff --git a/public/themes/style/dark.css b/public/themes/style/dark.css index 420e8c9..4fddaf8 100644 --- a/public/themes/style/dark.css +++ b/public/themes/style/dark.css @@ -10,16 +10,17 @@ complementaryColor = white --reply-text-color: #969696; --danger-text-color: #ff0000; - --chat-background-color: #282624; - --chat-highlighted-background-color: #383430; + --chat-background-color: #1f1e1d; + --chat-highlighted-background-color: #2f2b28; --chat-important-background-color: #ffc44f2f; --chat-important-highlighted-background-color: #ffa45f4a; --chat-featured-message-color: #4f2f1f58; --popup-background-color: #2f1f1f; --popup-highlighted-background-color: #3f2f2f; + --modal-background-color: #28241f; - --sidebar-background-color: #1f1e1d; - --sidebar-highlighted-background-color: #2f2b28; + --sidebar-background-color: #2e2a27; + --sidebar-highlighted-background-color: #36322b; --topbar-background-color: #2a2723; --chatbox-background-color: #1a1713; diff --git a/public/themes/style/description.css b/public/themes/style/description.css index 972821c..45829e0 100644 --- a/public/themes/style/description.css +++ b/public/themes/style/description.css @@ -18,6 +18,7 @@ complementaryColor = black --chat-featured-message-color: #4f2f1f58; --popup-background-color: #2f1f1f; --popup-highlighted-background-color: #3f2f2f; + --modal-background-color: #181f1f; --sidebar-background-color: #80808000; --sidebar-highlighted-background-color: #ffffff20; diff --git a/public/themes/style/light.css b/public/themes/style/light.css index cd1f55b..6cfecf6 100644 --- a/public/themes/style/light.css +++ b/public/themes/style/light.css @@ -10,13 +10,14 @@ complementaryColor = black --reply-text-color: #969696; --danger-text-color: #ff0000; - --chat-background-color: #f0edeb; - --chat-highlighted-background-color: #aba8a4; + --chat-background-color: #f0ebe8; + --chat-highlighted-background-color: #e8e4e0; --chat-important-background-color: #df5f0b26; --chat-important-hightlighted-background-color: #df5f0b3d; --chat-featured-message-color: #e8ac841f; - --popup-background-color: #b8b4b0; - --popup-highlighted-background-color: #a6a4a2; + --popup-background-color: #e8e4e0; + --popup-highlighted-background-color: #dfdbd6; + --modal-background-color: #e8e4e0; --sidebar-background-color: #dbd8d4; --sidebar-highlighted-background-color: #d4d0ca; diff --git a/public/themes/style/rainbow-capitalism.css b/public/themes/style/rainbow-capitalism.css index 8ca3ed7..df01d39 100644 --- a/public/themes/style/rainbow-capitalism.css +++ b/public/themes/style/rainbow-capitalism.css @@ -17,6 +17,7 @@ complementaryColor = white --chat-featured-message-color: #4f8f4f80; --popup-background-color: #80808080; --popup-highlighted-background-color: #9f9f9f9f; + --modal-background-color: #7fa87fff; --sidebar-background-color: #80808000; --sidebar-highlighted-background-color: #ffffff20; diff --git a/types/props.ts b/types/props.ts index 5796d83..f25ae8d 100644 --- a/types/props.ts +++ b/types/props.ts @@ -1,9 +1,21 @@ -import type { MessageResponse, UserResponse } from "./interfaces"; +import type { GuildMemberResponse, MessageResponse, UserResponse } from "./interfaces"; export interface MessageProps { - message: MessageResponse, - replyMessage?: MessageResponse, + class?: string, + img?: string | null, + author: GuildMemberResponse + text: string, + timestamp: number, + format: "12" | "24", type: "normal" | "grouped", + marginBottom: boolean, + authorColor: string, + last: boolean, + messageId: string, + replyingTo?: boolean, editing?: boolean, + me: UserResponse + message: MessageResponse, + replyMessage?: MessageResponse isMentioned?: boolean, } \ No newline at end of file diff --git a/utils/replyToMessage.ts b/utils/replyToMessage.ts index 1ff4df7..83f4eda 100644 --- a/utils/replyToMessage.ts +++ b/utils/replyToMessage.ts @@ -9,7 +9,7 @@ export default (element: HTMLDivElement, props: MessageProps) => { const messageBox = document.getElementById("message-box") as HTMLDivElement; if (messageBox) { const div = document.createElement("div"); - const messageReply = h(MessageReply, { author: getDisplayName(props.message.member), text: props.message.message || "", id: props.message.uuid, replyId: props.replyMessage?.uuid || element.dataset.messageId!, maxWidth: "full" }); + const messageReply = h(MessageReply, { author: getDisplayName(props.author), text: props.text || "", id: props.message.uuid, replyId: props.replyMessage?.uuid || element.dataset.messageId!, maxWidth: "full" }); messageBox.prepend(div); render(messageReply, div); const message = document.querySelector(`.message[data-message-id='${props.message.uuid}']`);