Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lizardkinglk #184

Merged
merged 3 commits into from
Sep 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions components/cards/message/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { IMessageCardProps } from "@/types";
import MessageMedia from "@/components/media/message";
import VerticalEllipsis from "@/components/svgs/ellipsis/vertical";
import MessageMenu from "@/components/menus/message";
import Close from "@/components/svgs/close";

export default function MessageCard(props: IMessageCardProps) {
const [options, setOptions] = useState(false);
Expand All @@ -18,6 +19,7 @@ export default function MessageCard(props: IMessageCardProps) {
messageImagePath,
content,
onDeleteHandler,
onCopyHandler,
loading,
} = props;

Expand All @@ -37,8 +39,8 @@ export default function MessageCard(props: IMessageCardProps) {
messageTime={messageTime}
referenceId={referenceId}
options={options}
setOptions={setOptions}
onDeleteHandler={onDeleteHandler}
onCopyHandler={onCopyHandler}
loading={loading}
/>
) : (
Expand All @@ -54,7 +56,13 @@ export default function MessageCard(props: IMessageCardProps) {
</div>
)}
{type === messageTypes.SENT && (
<button
options ? <button
className="flex h-min mt-4 text-stone-100 hover:text-stone-100"
title="Close Message Options"
onClick={() => setOptions((prev) => !prev)}
>
<Close size={6} />
</button> : <button
className="flex h-min mt-4 text-stone-900 hover:text-stone-100"
title="Message Options"
onClick={() => setOptions((prev) => !prev)}
Expand Down
3 changes: 2 additions & 1 deletion components/lists/message/MessageList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Fragment } from "react";

const MessageList = (props: IMessageListProps) => {
if (props) {
const { messages, group, active, lastMessageRef, onDeleteHandler, loading } = props;
const { messages, group, active, lastMessageRef, onDeleteHandler, onCopyHandler, loading } = props;
return (
<Fragment>
{group &&
Expand All @@ -18,6 +18,7 @@ const MessageList = (props: IMessageListProps) => {
messageTime={message.createdOn}
messageImagePath={group.displayImage}
onDeleteHandler={onDeleteHandler}
onCopyHandler={onCopyHandler}
loading={loading}
/>
</Fragment>
Expand Down
18 changes: 8 additions & 10 deletions components/media/message/index.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import React from "react";
import Picture from "../../picture";
import { isLocalStorage, isImage, isMedia } from "@/utils/helpers";
import { isLocalStorage, isImage } from "@/utils/helpers";

const MessageMedia = (props: { content: string }) => {
const { content } = props;
if (props) {
if (isMedia(content)) {
if (isImage(content)) {
const path = content.substring(
content.indexOf("(") + 1,
content.indexOf(")")
);
const src = isLocalStorage() ? `/uploads/${path}` : path;
return <Picture alt="preview" height={120} width={120} src={src} />;
}
if (isImage(content)) {
const path = content.substring(
content.indexOf("(") + 1,
content.indexOf(")")
);
const src = isLocalStorage() ? `/uploads/${path}` : path;
return <Picture alt="preview" height={120} width={120} src={src} />;
}
return (
<h1
Expand Down
30 changes: 15 additions & 15 deletions components/menus/message/index.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import React from "react";

import Bin from "@/components/svgs/Bin";
import Close from "@/components/svgs/close";
import Copy from "@/components/svgs/copy";
import Pencil from "@/components/svgs/pencil";
import Spinner from "@/components/svgs/spinner";

import { IMessageMenuProps } from "@/types";
import React from "react";

const MessageMenu = (props: IMessageMenuProps) => {
if (props) {
const { referenceId, options, onDeleteHandler, loading, messageTime, setOptions } =
const { referenceId, options, onDeleteHandler, onCopyHandler, loading, messageTime } =
props;

if (options) {
Expand All @@ -23,29 +25,27 @@ const MessageMenu = (props: IMessageMenuProps) => {
title="Edit Message"
className="text-green-500 font-black rounded-full text-sm text-center w-full p-2"
>
<Pencil />
<Pencil size={6} />
</button>
</li>
<li className="pr-2">
<button
id={`${referenceId}`}
type="button"
title="Delete Message"
className="text-red-500 font-black rounded-full text-sm text-center w-full p-2"
onClick={() => onDeleteHandler(referenceId)}
title="Copy Message"
className="text-green-500 font-black rounded-full text-sm text-center w-full p-2"
onClick={() => onCopyHandler(referenceId)}
>
{loading ? <Spinner size={8} /> : <Bin size={8} />}
<Copy size={6} />
</button>
</li>
<li>
<li className="pr-2">
<button
id={`${referenceId}`}
type="button"
title="Close"
className="text-white font-black rounded-full text-sm text-center w-full p-2"
onClick={() => setOptions(false)}
title="Remove Message"
className="text-red-500 font-black rounded-full text-sm text-center w-full p-2"
onClick={() => onDeleteHandler(referenceId)}
>
<Close size={8} />
{loading ? <Spinner size={6} /> : <Bin size={6} />}
</button>
</li>
</ul>
Expand Down
2 changes: 2 additions & 0 deletions components/sections/group/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const Group = (props: IGroupSectionProps) => {
onKeyDownHandler,
onSubmitHandler,
onDeleteHandler,
onCopyHandler,
onMediaHandler,
textInputRef,
loading,
Expand Down Expand Up @@ -56,6 +57,7 @@ const Group = (props: IGroupSectionProps) => {
notifs={notifs}
lastMessageRef={lastMessageRef}
onDeleteHandler={onDeleteHandler}
onCopyHandler={onCopyHandler}
loading={loading}
/>
</div>
Expand Down
2 changes: 2 additions & 0 deletions components/sections/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const SectionSwitch = (props: ISecitonSwitchProps) => {
onKeyDownHandler,
onSubmitHandler,
onDeleteHandler,
onCopyHandler,
onMediaHandler,
onAddFriendHandler,
textInputRef,
Expand Down Expand Up @@ -82,6 +83,7 @@ const SectionSwitch = (props: ISecitonSwitchProps) => {
onSubmitHandler={onSubmitHandler}
onMediaHandler={onMediaHandler}
onDeleteHandler={onDeleteHandler}
onCopyHandler={onCopyHandler}
textInputRef={textInputRef}
loading={loading}
navbar={navbar}
Expand Down
12 changes: 12 additions & 0 deletions components/svgs/copy/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React from 'react'

const Copy = ({ size }: { size: number | undefined }) => {
const className = size ? `w-${size} h-${size}` : "w-8 h-8";
return (
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className={className}>
<path strokeLinecap="round" strokeLinejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" />
</svg>
)
}

export default Copy
11 changes: 6 additions & 5 deletions components/svgs/pencil/index.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import React from "react";
import React from 'react'

const Pencil = () => {
const Pencil = ({ size }: { size: number | undefined }) => {
const className = size ? `w-${size} h-${size}` : "w-8 h-8";
return (
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="w-7 h-7"
className={className}
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
/>
</svg>
);
};
)
}

export default Pencil;
7 changes: 7 additions & 0 deletions pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
getRandomNumber,
getTimeConverted,
isLocalStorage,
writeContentToClipboard,
} from "@/utils/helpers";

import LayoutSwitch from "@/components/layout";
Expand Down Expand Up @@ -269,6 +270,11 @@ const Messages = () => {
});
};

const onCopyHandler = (referenceId: string) => {
const message = messages?.find(m => m.referenceId === referenceId);
writeContentToClipboard(message?.content);
}

const onDeleteHandler = async (referenceId: string) => {
setLoading(true);
deleteMessage(referenceId, group.id).then((data) => {
Expand Down Expand Up @@ -577,6 +583,7 @@ const Messages = () => {
onSubmitHandler={onSubmitHandler}
onMediaHandler={onMediaHandler}
onDeleteHandler={onDeleteHandler}
onCopyHandler={onCopyHandler}
onAddFriendHandler={onAddFriendHandler}
loading={loading}
groups={groups}
Expand Down
6 changes: 5 additions & 1 deletion types/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export interface IMessageListProps {
notifs: NotifType;
lastMessageRef: LegacyRef<HTMLDivElement>;
onDeleteHandler: Function;
onCopyHandler: Function;
loading: boolean;
}

Expand Down Expand Up @@ -164,6 +165,7 @@ export interface IMessageCardProps {
messageTime: string;
messageAuthorName: NameType | string;
onDeleteHandler: Function;
onCopyHandler: Function;
loading: boolean;
}

Expand Down Expand Up @@ -259,6 +261,7 @@ export interface ISecitonSwitchProps {
onKeyDownHandler: KeyboardEventHandler<HTMLInputElement>;
onSubmitHandler: MouseEventHandler<HTMLButtonElement>;
onDeleteHandler: Function;
onCopyHandler: Function;
onMediaHandler: Function;
onAddFriendHandler: Function;
setGroup: Function;
Expand All @@ -279,6 +282,7 @@ export interface IGroupSectionProps {
onKeyDownHandler: KeyboardEventHandler<HTMLInputElement>;
onSubmitHandler: MouseEventHandler<HTMLButtonElement>;
onDeleteHandler: Function;
onCopyHandler: Function;
onMediaHandler: Function;
setGroup: Function;
lastMessageRef: null | LegacyRef<HTMLDivElement>;
Expand All @@ -292,7 +296,7 @@ export interface IMessageMenuProps {
loading: boolean;
messageTime: string;
onDeleteHandler: Function;
setOptions: Function;
onCopyHandler: Function;
}

export interface IAddFriendProps {
Expand Down
21 changes: 13 additions & 8 deletions utils/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,24 @@ const formatCompactNumber = (input: string) => {
return formatter.format(number);
};

const isMedia = (content: string) => {
const isImage = (content: string) => {
return content?.startsWith("[image](");
};

const isImage = (content: string) => {
return content?.includes(mediaTypes.image);
const getContent = (content: string) => {
const isMedia = isImage(content);
return isMedia
? content?.substring(content?.indexOf("(") + 1, content?.indexOf(")"))
: content;
};

const writeContentToClipboard = (content: string) => {
navigator.clipboard.writeText(getContent(content));
};

const getBriefContent = (content: string) => {
if (isMedia(content)) {
if (isImage(content)) {
return mediaTypes.image;
}
if (isImage(content)) {
return mediaTypes.image;
} else if (content?.length > 30) {
return content.substring(0, 30).concat("...");
} else return content;
Expand Down Expand Up @@ -65,11 +70,11 @@ const getNameOfUser = (target: {
export {
getTimeConverted,
formatCompactNumber,
isMedia,
isImage,
getBriefContent,
isLocalStorage,
getRandomNumber,
getMessageType,
getNameOfUser,
writeContentToClipboard,
};