{"version":3,"file":"static/js/1860.7a1f6710.chunk.js","mappings":"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","sources":["common/hooks/useDelayedState.ts","common/util/Array/orderByBoolean.ts","common/util/osCheck.ts","components/shared/Button/DarkButton.tsx","components/shared/Message/MessagePanel/getMessagesPerDay.ts","components/shared/Message/MessagePanel/components/ConversationArea/functions.ts","components/shared/Message/MessagePanel/components/ConversationArea/components/MyOwnPresent.tsx","components/shared/Message/MessagePanel/components/ConversationArea/components/SentTime.tsx","components/shared/Message/MessagePanel/components/ConversationArea/MessageMarkdown.tsx","components/shared/Message/MessagePanel/components/ConversationArea/MyMessage.tsx","components/shared/Message/MessagePanel/components/ConversationArea/components/TheirPresent.tsx","components/shared/Message/MessagePanel/components/ConversationArea/TheirMessage.tsx","components/shared/Message/MessagePanel/components/ConversationArea/ConversationArea.tsx","components/shared/Message/MessagePanel/components/MessageField.tsx","components/shared/Message/MessagePanel/Content.tsx","components/shared/Message/MessagePanel/components/MuteSwitch.tsx","components/shared/Message/MessagePanel/Panel.tsx","components/shared/Message/MessagePanel/components/fetchSetMuteStatus.ts","components/shared/Popover/DarkPopoverMenu.tsx","components/shared/User/UserAvatar/UserAvatar.tsx","components/shared/User/UserAvatar/validateImage.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\r\n\r\nexport function useDelayedState(\r\n state: T,\r\n checkOpen: (state: T) => boolean,\r\n timeoutMilliSecond: number\r\n): { delayedState: T; delayedOpen: boolean } {\r\n const [delayedState, setDelayedState] = useState(state);\r\n useEffect(() => {\r\n if (checkOpen(state)) {\r\n // When it opens\r\n setDelayedState(state);\r\n return;\r\n }\r\n\r\n // When it closes\r\n const timeoutId = setTimeout(() => {\r\n setDelayedState(state);\r\n }, timeoutMilliSecond);\r\n return () => {\r\n clearTimeout(timeoutId);\r\n };\r\n }, [state, timeoutMilliSecond, checkOpen]);\r\n\r\n return { delayedState, delayedOpen: checkOpen(delayedState) };\r\n}\r\n","export function orderByBoolean([...array]: T[], fnc: (array: T) => boolean) {\r\n // Sort while keeping original order in the same group\r\n return splitByBoolean(array, fnc).flat();\r\n}\r\n\r\nexport function splitByBoolean(\r\n [...array]: T[],\r\n fnc: (array: T, index: number) => boolean\r\n): [trueArray: T[], falseArray: T[]] {\r\n return array.reduce<[T[], T[]]>(\r\n (acc, val, i) => {\r\n if (fnc(val, i)) {\r\n return [[...acc[0], val], acc[1]];\r\n }\r\n return [acc[0], [...acc[1], val]];\r\n },\r\n [[], []]\r\n );\r\n}\r\n","export const isAndroid = /android/i.test(navigator.userAgent);\r\n","import Button, { ButtonProps } from \"@material-ui/core/Button\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { BaseCSSProperties } from \"@material-ui/core/styles/withStyles\";\r\nimport { forwardRef } from \"react\";\r\nimport { spaceBetween } from \"../../../common/util/Array/spaceBetween\";\r\n\r\ntype Props = { style?: BaseCSSProperties } & Omit<\r\n ButtonProps,\r\n \"style\" | \"buttonRef\"\r\n>;\r\n\r\nexport const DarkButton = forwardRef(\r\n ({ style, className, ...rest }, ref) => {\r\n const c = useStyles({ style });\r\n return (\r\n \r\n );\r\n }\r\n);\r\nconst useStyles = makeStyles(\r\n ({ palette }) => ({\r\n button: ({ style }) => ({\r\n backgroundColor: palette.grey[800],\r\n \"&:hover\": {\r\n backgroundColor: palette.grey[700],\r\n },\r\n color: \"white\",\r\n fontSize: \"medium\",\r\n ...style,\r\n }),\r\n })\r\n);\r\n","import { Message, MessagesPerDays } from \"./types\";\r\n\r\nexport function getMessagesPerDays(messages: Message[]): MessagesPerDays {\r\n const now = Number(new Date());\r\n\r\n return messages.reduce((acc, message) => {\r\n const milliSecondsAgo = message.minutesAgo * 60 * 1000;\r\n const strDate = new Date(now - milliSecondsAgo).toDateString();\r\n\r\n if (acc[strDate]) {\r\n return { ...acc, [strDate]: [...acc[strDate], message] };\r\n }\r\n return { ...acc, [strDate]: [message] };\r\n }, {} as MessagesPerDays);\r\n}\r\n","import { changeAppState } from \"../../../../../../common/appState\";\r\nimport { fetchPost } from \"../../../../../../common/util/fetch\";\r\nimport { PresentBoxKey } from \"../../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items/ItemClass/PresentBox\";\r\nimport { User } from \"../../../../User/types\";\r\nimport { getMessagesPerDays } from \"../../getMessagesPerDay\";\r\nimport { Message, MessagesPerDays, ReadMessageResponse } from \"../../types\";\r\n\r\ntype OpenPresentResponse = {\r\n messages: Message[];\r\n user: User;\r\n};\r\nexport async function openPresent(\r\n presenterUserId: number,\r\n openerUserId: number,\r\n messageNo: number,\r\n presentKey: string,\r\n coins: number,\r\n presentQuantity: number,\r\n num: number,\r\n setMessages: (messages: MessagesPerDays) => void,\r\n setCurrentlySentMessageNo: (messageId: number) => void\r\n): Promise {\r\n const result = await fetchPost<\r\n {\r\n presenterUserId: number;\r\n openerUserId: number;\r\n messageNo: number;\r\n presentKey: string;\r\n coins: number;\r\n presentQuantity: number;\r\n num: number;\r\n },\r\n OpenPresentResponse\r\n >(\"api/PresentBox/OpenPresent\", {\r\n presenterUserId,\r\n openerUserId,\r\n messageNo,\r\n presentKey,\r\n coins,\r\n presentQuantity,\r\n num,\r\n });\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n setCurrentlySentMessageNo(\r\n Math.max(...result.messages.map(m => m.messageNo))\r\n );\r\n changeAppState(\"user\", result.user);\r\n}\r\n\r\nexport async function readMessage(\r\n fromUserId: number,\r\n toUserId: number,\r\n messageNo: number,\r\n num: number\r\n): Promise {\r\n return fetchPost<\r\n {\r\n fromUserId: number;\r\n toUserId: number;\r\n messageNo: number;\r\n num: number;\r\n },\r\n ReadMessageResponse\r\n >(\"api/Message/ReadMessage\", { fromUserId, toUserId, messageNo, num });\r\n}\r\n\r\nexport async function readMessages(\r\n fromUserId: number,\r\n toUserId: number,\r\n messageNos: number[],\r\n num: number\r\n): Promise {\r\n return fetchPost<\r\n {\r\n fromUserId: number;\r\n toUserId: number;\r\n messageNos: number[];\r\n num: number;\r\n },\r\n ReadMessageResponse\r\n >(\"api/Message/ReadMessages\", { fromUserId, toUserId, messageNos, num });\r\n}\r\n\r\nexport type CoinsForPresentTypes = Partial<{\r\n [key in PresentBoxKey]: number;\r\n}>;\r\ntype OpenAllUnopenedPresentsResponse = {\r\n messages: Message[];\r\n user: User;\r\n};\r\nexport async function OpenAllUnopenedPresents(\r\n presenterUserId: number,\r\n openerUserId: number,\r\n coinsForPresentTypes: CoinsForPresentTypes,\r\n setMessages: (messages: MessagesPerDays) => void,\r\n setCurrentlySentMessageNo: (messageId: number) => void,\r\n num: number\r\n): Promise {\r\n const result = await fetchPost<\r\n {\r\n presenterUserId: number;\r\n openerUserId: number;\r\n coinsForPresentTypes: CoinsForPresentTypes;\r\n num: number;\r\n },\r\n OpenAllUnopenedPresentsResponse\r\n >(\"api/PresentBox/OpenAllUnopenedPresents\", {\r\n presenterUserId,\r\n openerUserId,\r\n coinsForPresentTypes,\r\n num,\r\n });\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n setCurrentlySentMessageNo(\r\n Math.max(...result.messages.map(m => m.messageNo))\r\n );\r\n changeAppState(\"user\", result.user);\r\n}\r\n","import Card from \"@material-ui/core/Card\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { appsPublicImg } from \"../../../../../../../common/consts\";\r\nimport { PresentBoxKey } from \"../../../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items/ItemClass/PresentBox\";\r\n\r\nexport function MyOwnPresent({\r\n present,\r\n presentQuantity,\r\n}: {\r\n present: PresentBoxKey;\r\n presentQuantity: number;\r\n}) {\r\n const c = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n {presentQuantity > 1 && (\r\n
× {presentQuantity}
\r\n )}\r\n
\r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles({\r\n outerContainer: { marginTop: 15, display: \"flex\" },\r\n card: { display: \"flex\", alignItems: \"center\", padding: 10 },\r\n quantity: { marginLeft: 7, fontSize: \"large\" },\r\n img: { width: 40 },\r\n});\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function SentTime({ minutesAgo }: { minutesAgo: number }) {\r\n const [time, setTime] = useState(\"\");\r\n\r\n useEffect(() => {\r\n const _minutesAgo = minutesAgo % (60 * 24);\r\n const milliSecondsAgo = _minutesAgo * 60 * 1000;\r\n const date = new Date(Number(new Date()) - milliSecondsAgo);\r\n const hours = date.getHours().toString().padStart(2, \"0\");\r\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\r\n setTime(`${hours}:${minutes}`);\r\n }, [minutesAgo]);\r\n\r\n return
{time}
;\r\n}\r\n","import { splitByBoolean } from \"../../../../../../common/util/Array/orderByBoolean\";\r\nimport { Markdown } from \"../../../../Markdown\";\r\nimport { replyToMessageKey } from \"../../../../Markdown/CodeRender\";\r\n\r\nexport function MessageMarkdown({\r\n text,\r\n noLinkShadow,\r\n}: {\r\n text: string;\r\n noLinkShadow?: boolean;\r\n}) {\r\n const [mainText, replyText] = splitByBoolean(\r\n text.split(\"```\"),\r\n text => !text.startsWith(replyToMessageKey)\r\n ).map(t => t.join(\"\"));\r\n\r\n return (\r\n <>\r\n {replyText && (\r\n \r\n )}\r\n {mainText.split(/\\n\\n+/g).map((t, i) => (\r\n 0 ? { marginTop: 30 } : {}}\r\n source={t}\r\n noParagraphMarginBottom\r\n noLinkShadow={noLinkShadow}\r\n />\r\n ))}\r\n \r\n );\r\n}\r\n\r\n","import { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport { useLayoutEffect, useRef, useState } from \"react\";\r\nimport { spaceBetween } from \"../../../../../../common/util/Array/spaceBetween\";\r\nimport ShurikenProgress from \"../../../../Animations/ShurikenProgress\";\r\nimport { DarkPopoverMenu } from \"../../../../Popover/DarkPopoverMenu\";\r\nimport { openOtherUserPanel } from \"../../../../User/OtherUserPanel/functions\";\r\nimport { User } from \"../../../../User/types\";\r\nimport { UserAvatar } from \"../../../../User/UserAvatar/UserAvatar\";\r\nimport { Message } from \"../../types\";\r\nimport { MyOwnPresent } from \"./components/MyOwnPresent\";\r\nimport { SentTime } from \"./components/SentTime\";\r\nimport { ImageMessage } from \"./ImageMessage\";\r\nimport { MessageMarkdown } from \"./MessageMarkdown\";\r\n\r\nexport function MyMessage({\r\n me,\r\n theirUserId,\r\n currentlySentMessageNo,\r\n message: {\r\n text,\r\n messageNo,\r\n minutesAgo,\r\n present,\r\n presentQuantity,\r\n unremovable,\r\n isSending,\r\n isImage,\r\n },\r\n unsendMessage,\r\n}: {\r\n me: User;\r\n theirUserId: number;\r\n currentlySentMessageNo: number;\r\n message: Message;\r\n unsendMessage: () => void;\r\n}) {\r\n const deleteIconRef = useRef(null);\r\n const containerRef = useRef(null);\r\n const [unsendOpen, setUnsendOpen] = useState(false);\r\n\r\n const c = useStyles({ isImage });\r\n\r\n useLayoutEffect(() => {\r\n if (currentlySentMessageNo === messageNo) {\r\n containerRef.current?.scrollIntoView();\r\n }\r\n }, [currentlySentMessageNo, messageNo]);\r\n\r\n return (\r\n
\r\n {\r\n openOtherUserPanel(me.userId);\r\n }}\r\n className=\"pointer\"\r\n />\r\n
\r\n
\r\n\r\n {isImage ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {present && (\r\n \r\n )}\r\n
\r\n
\r\n {isSending ? (\r\n \r\n ) : (\r\n
\r\n {!unremovable && (\r\n {\r\n setUnsendOpen(true);\r\n }}\r\n />\r\n )}\r\n \r\n
\r\n )}\r\n
\r\n {\r\n setUnsendOpen(false);\r\n }}\r\n items={[\r\n {\r\n label: \"Unsend\",\r\n icon: ,\r\n onClick: unsendMessage,\r\n },\r\n ]}\r\n />\r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"row-reverse\",\r\n width: \"100%\",\r\n marginBottom: 10,\r\n },\r\n comment: ({ isImage }) => ({\r\n minHeight: 40,\r\n color: \"white\",\r\n marginRight: 20,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n padding: isImage ? 3 : \"13px 15px 15px\",\r\n borderRadius: 10,\r\n position: \"relative\",\r\n backgroundColor: theme.palette.success.main,\r\n }),\r\n commentTail: {\r\n position: \"absolute\",\r\n width: 20,\r\n height: 20,\r\n top: 10,\r\n right: -5,\r\n transform: \"rotate(45deg)\",\r\n backgroundColor: theme.palette.success.main,\r\n },\r\n colorChange: {\r\n animation: \"$colorChange 300ms\",\r\n },\r\n \"@keyframes colorChange\": {\r\n \"0%\": {\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n \"100%\": {\r\n backgroundColor: theme.palette.success.main,\r\n },\r\n },\r\n timeAndIconOuterContainer: {\r\n width: 60,\r\n display: \"flex\",\r\n alignItems: \"flex-end\",\r\n justifyContent: \"flex-end\",\r\n padding: 5,\r\n fontSize: \"small\",\r\n },\r\n timeAndIconInnerContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n },\r\n deleteIcon: {\r\n color: theme.palette.grey[800],\r\n cursor: \"pointer\",\r\n },\r\n markdownContainer: {\r\n zIndex: 1,\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-word\",\r\n },\r\n}));\r\n","import Card from \"@material-ui/core/Card\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useState } from \"react\";\r\nimport { getAppState } from \"../../../../../../../common/appState\";\r\nimport { appsPublicImg } from \"../../../../../../../common/consts\";\r\nimport { spaceBetween } from \"../../../../../../../common/util/Array/spaceBetween\";\r\nimport { PresentBoxKey } from \"../../../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items/ItemClass/PresentBox\";\r\nimport ShurikenProgress from \"../../../../../Animations/ShurikenProgress\";\r\nimport { PrimaryButton } from \"../../../../../Button/PrimaryButton\";\r\n\r\nexport function TheirPresent({\r\n isOpen,\r\n present,\r\n presentQuantity,\r\n openPresent,\r\n globalSubmitting,\r\n setGlobalSubmitting,\r\n}: {\r\n isOpen?: boolean;\r\n present: PresentBoxKey;\r\n presentQuantity: number;\r\n openPresent: () => Promise;\r\n globalSubmitting?: boolean;\r\n setGlobalSubmitting?: (submitting: boolean) => void;\r\n}) {\r\n const c = useStyles();\r\n const [localSubmitting, setLocalSubmitting] = useState(false);\r\n const setSubmitting = (newSubmitting: boolean) => {\r\n setGlobalSubmitting?.(newSubmitting);\r\n setLocalSubmitting(newSubmitting);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n {presentQuantity > 1 && (\r\n
× {presentQuantity}
\r\n )}\r\n
\r\n\r\n {\r\n setSubmitting(true);\r\n const { user } = getAppState();\r\n if (!user) {\r\n setSubmitting(false);\r\n return;\r\n }\r\n await openPresent();\r\n setSubmitting(false);\r\n }}\r\n >\r\n {localSubmitting ? (\r\n \r\n ) : (\r\n \"Open!\"\r\n )}\r\n \r\n
\r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles({\r\n outerContainer: { marginTop: 15, display: \"flex\" },\r\n card: { display: \"flex\", padding: 10, width: \"100%\", alignItems: \"center\" },\r\n imgAndQuantity: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n margin: \"0 5px\",\r\n },\r\n img: { width: 40 },\r\n quantity: {\r\n width: \"100%\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n textAlign: \"center\",\r\n },\r\n button: {\r\n marginLeft: 10,\r\n },\r\n});\r\n","import IconButton from \"@material-ui/core/IconButton\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport ReplyIcon from \"@material-ui/icons/Reply\";\r\nimport { RefObject, useLayoutEffect, useRef } from \"react\";\r\nimport { changeAppState, getAppState } from \"../../../../../../common/appState\";\r\nimport {\r\n replyTargetImageKey,\r\n replyToMessageKey,\r\n} from \"../../../../Markdown/CodeRender\";\r\nimport { openOtherUserPanel } from \"../../../../User/OtherUserPanel/functions\";\r\nimport { OtherUser } from \"../../../../User/types\";\r\nimport { UserAvatar } from \"../../../../User/UserAvatar/UserAvatar\";\r\nimport { getMessagesPerDays } from \"../../getMessagesPerDay\";\r\nimport { Message, MessagesPerDays } from \"../../types\";\r\nimport { SentTime } from \"./components/SentTime\";\r\nimport { TheirPresent } from \"./components/TheirPresent\";\r\nimport { readMessage } from \"./functions\";\r\nimport { ImageMessage } from \"./ImageMessage\";\r\nimport { MessageMarkdown } from \"./MessageMarkdown\";\r\n\r\nexport function TheirMessage({\r\n them,\r\n message: {\r\n text,\r\n isRead,\r\n messageNo,\r\n minutesAgo,\r\n present,\r\n presentQuantity,\r\n isPresentOpen,\r\n isImage,\r\n },\r\n myUserId,\r\n setMessages,\r\n messagesCountToShow,\r\n openPresent,\r\n submitting,\r\n setSubmitting,\r\n targetUserIconColorNumber,\r\n setReplyTarget,\r\n inputRef,\r\n}: {\r\n them: OtherUser;\r\n message: Message;\r\n myUserId: number;\r\n setMessages: (messages: MessagesPerDays) => void;\r\n messagesCountToShow: number;\r\n openPresent: () => Promise;\r\n submitting: boolean;\r\n setSubmitting: (submitting: boolean) => void;\r\n targetUserIconColorNumber?: number;\r\n setReplyTarget: (text: string) => void;\r\n inputRef: RefObject;\r\n}) {\r\n const containerRef = useRef(null);\r\n const c = useStyles({ isImage });\r\n\r\n useLayoutEffect(() => {\r\n if (!isRead) {\r\n containerRef.current?.scrollIntoView();\r\n readMessage(\r\n them.userId,\r\n myUserId,\r\n messageNo,\r\n messagesCountToShow\r\n ).then(result => {\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n changeAppState(\r\n \"unreadMessages\",\r\n getAppState().unreadMessages.filter(\r\n m =>\r\n !(\r\n m.fromUserId === them.userId &&\r\n m.messageNo === messageNo\r\n )\r\n )\r\n );\r\n });\r\n }\r\n }, [isRead, myUserId, messageNo, setMessages, messagesCountToShow]);\r\n\r\n return (\r\n
\r\n {\r\n openOtherUserPanel(them.userId);\r\n }}\r\n className=\"pointer\"\r\n />\r\n
\r\n
\r\n\r\n {isImage ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {present && (\r\n \r\n )}\r\n
\r\n\r\n
\r\n
\r\n {\r\n inputRef.current?.focus();\r\n\r\n if (isImage) {\r\n setReplyTarget(\r\n `${replyTargetImageKey}${messageNo}:${myUserId}:${them.userId}`\r\n );\r\n return;\r\n }\r\n const textWithoutPreviousReply = text\r\n .split(\"```\")\r\n .filter(\r\n line => !line.startsWith(replyToMessageKey)\r\n )\r\n .join(\"\")\r\n .trim();\r\n setReplyTarget(textWithoutPreviousReply);\r\n }}\r\n >\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n container: {\r\n display: \"flex\",\r\n width: \"100%\",\r\n marginBottom: 10,\r\n },\r\n comment: ({ isImage }) => ({\r\n minHeight: 40,\r\n backgroundColor: theme.palette.grey[200],\r\n marginLeft: 20,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n padding: isImage ? 3 : \"13px 15px 15px\",\r\n borderRadius: 10,\r\n position: \"relative\",\r\n }),\r\n commentTail: {\r\n position: \"absolute\",\r\n width: 20,\r\n height: 20,\r\n top: 10,\r\n left: -5,\r\n transform: \"rotate(45deg)\",\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n rightSpace: {\r\n width: 60,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n padding: 5,\r\n fontSize: \"small\",\r\n },\r\n markdownContainer: {\r\n zIndex: 1,\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-word\",\r\n },\r\n replyButtonContainer: {\r\n width: 29,\r\n height: \"100%\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n replyButton: { width: 30, height: 30, cursor: \"pointer\" },\r\n}));\r\n","import Card from \"@material-ui/core/Card\";\r\nimport Collapse from \"@material-ui/core/Collapse\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { RefObject, useRef, useState } from \"react\";\r\nimport { useScreenSize } from \"../../../../../../common/hooks/useScreenSize\";\r\nimport { spaceBetween } from \"../../../../../../common/util/Array/spaceBetween\";\r\nimport { fetchPost } from \"../../../../../../common/util/fetch\";\r\nimport { PresentBox } from \"../../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items/ItemClass/PresentBox\";\r\nimport ShurikenProgress from \"../../../../Animations/ShurikenProgress\";\r\nimport {\r\n rightPanelTopBarHeight,\r\n rightPanelTopGap,\r\n} from \"../../../../Panel/RightPanel\";\r\nimport { OtherUser, User } from \"../../../../User/types\";\r\nimport { usernameHeight, usernameMarginBottom } from \"../../Content\";\r\nimport { getMessagesPerDays } from \"../../getMessagesPerDay\";\r\nimport {\r\n MessagePanelOpenState,\r\n MessagesPerDays,\r\n UnsendMessageResponse,\r\n} from \"../../types\";\r\nimport { openPresent } from \"./functions\";\r\nimport { MyMessage } from \"./MyMessage\";\r\nimport { TheirMessage } from \"./TheirMessage\";\r\n\r\nexport function ConversationArea({\r\n messages,\r\n user,\r\n targetUser,\r\n setMessages,\r\n currentlySentMessageNo,\r\n setCurrentlySentMessageNo,\r\n textareaHeight,\r\n showMore,\r\n messagesCountToShow,\r\n submitting,\r\n setSubmitting,\r\n panelState,\r\n setReplyTarget,\r\n inputRef,\r\n onlyOwnMessage,\r\n}: {\r\n messages: MessagesPerDays;\r\n user: User;\r\n targetUser: OtherUser;\r\n setMessages: (messages: MessagesPerDays) => void;\r\n currentlySentMessageNo: number;\r\n setCurrentlySentMessageNo: (messageId: number) => void;\r\n textareaHeight: number;\r\n showMore: () => Promise;\r\n messagesCountToShow: number;\r\n submitting: boolean;\r\n setSubmitting: (submitting: boolean) => void;\r\n panelState: MessagePanelOpenState;\r\n setReplyTarget: (text: string) => void;\r\n inputRef: RefObject;\r\n onlyOwnMessage: boolean;\r\n}) {\r\n const { screenHeight } = useScreenSize();\r\n const c = useStyles({ screenHeight, textareaHeight });\r\n\r\n const {\r\n loadMoreIfNecessary,\r\n hasNoMessage,\r\n scrollableContainerRef,\r\n loadingMore,\r\n } = useEndlessScroll(messages, showMore);\r\n\r\n const [firstHeightTransitionFinished, setFirstHeightTransitionFinished] =\r\n useState(false);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {\r\n if (!firstHeightTransitionFinished) {\r\n const el = scrollableContainerRef.current;\r\n if (el) {\r\n el.scrollTo({\r\n top: el.scrollHeight,\r\n behavior: \"smooth\",\r\n });\r\n setFirstHeightTransitionFinished(true);\r\n }\r\n }\r\n }}\r\n onScroll={loadMoreIfNecessary}\r\n >\r\n {Object.keys(messages).map((strDate, i) => {\r\n const messagesPerDay = messages[strDate];\r\n const allDataLoaded = messagesPerDay.some(\r\n m => m.messageNo === 1\r\n );\r\n const isFirstDate = i === 0;\r\n const filteredMessagesPerDay = onlyOwnMessage\r\n ? messagesPerDay.filter(\r\n m => m.fromUserId === user.userId && !m.isUnsent\r\n )\r\n : messagesPerDay.filter(m => !m.isUnsent);\r\n\r\n if (filteredMessagesPerDay.length === 0) {\r\n return null;\r\n }\r\n return (\r\n
\r\n
\r\n {(!isFirstDate || allDataLoaded) && (\r\n \r\n {strDate}\r\n \r\n )}\r\n
\r\n {filteredMessagesPerDay.map(message => {\r\n if (message.fromUserId === user.userId) {\r\n return (\r\n {\r\n unsendMessage(\r\n setMessages,\r\n messages,\r\n strDate,\r\n message.messageNo,\r\n user.userId,\r\n targetUser.userId,\r\n messagesCountToShow\r\n );\r\n }}\r\n />\r\n );\r\n }\r\n return (\r\n {\r\n if (!message.present) {\r\n return;\r\n }\r\n await openPresent(\r\n targetUser.userId,\r\n user.userId,\r\n message.messageNo,\r\n message.present,\r\n new PresentBox(message.present)\r\n .presentCoins,\r\n message.presentQuantity,\r\n messagesCountToShow,\r\n setMessages,\r\n setCurrentlySentMessageNo\r\n );\r\n }}\r\n submitting={submitting}\r\n setSubmitting={setSubmitting}\r\n targetUserIconColorNumber={\r\n panelState.targetUserIconColorNumber\r\n }\r\n setReplyTarget={setReplyTarget}\r\n inputRef={inputRef}\r\n />\r\n );\r\n })}\r\n
\r\n );\r\n })}\r\n {hasNoMessage && (\r\n
\r\n No messages yet, start the conversation!\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles<\r\n Theme,\r\n { screenHeight: number; textareaHeight: number }\r\n>(theme => ({\r\n container: {\r\n margin: \"0 -5px\",\r\n },\r\n scrollableContainer: ({ screenHeight, textareaHeight }) => {\r\n const restItemsHeight =\r\n rightPanelTopGap +\r\n rightPanelTopBarHeight +\r\n usernameHeight +\r\n usernameMarginBottom;\r\n return {\r\n overflowY: \"auto\",\r\n padding: 10,\r\n height: screenHeight - textareaHeight - restItemsHeight,\r\n width: \"100%\",\r\n transition: \"height 500ms\",\r\n borderBottom: `solid 1px ${theme.palette.grey[300]}`,\r\n };\r\n },\r\n noMessage: {\r\n textAlign: \"center\",\r\n marginTop: 30,\r\n },\r\n dateContainer: { textAlign: \"center\", margin: \"30px 0\" },\r\n dateCard: {\r\n display: \"inline\",\r\n padding: \"5px 30px\",\r\n borderRadius: 20,\r\n backgroundColor: theme.palette.primary.light,\r\n color: \"white\",\r\n },\r\n loadingMoreCollapse: {\r\n position: \"absolute\",\r\n top: \"0\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n zIndex: 1,\r\n },\r\n}));\r\n\r\nfunction unsendMessage(\r\n setMessages: (messages: MessagesPerDays) => void,\r\n messages: MessagesPerDays,\r\n strDate: string,\r\n messageNo: number,\r\n userId: number,\r\n targetUserId: number,\r\n num: number\r\n) {\r\n setMessages({\r\n ...messages,\r\n [strDate]: messages[strDate].filter(m => m.messageNo !== messageNo),\r\n });\r\n fetchUnsendMessage(userId, targetUserId, messageNo, num).then(result => {\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n });\r\n}\r\nasync function fetchUnsendMessage(\r\n fromUserId: number,\r\n toUserId: number,\r\n messageNo: number,\r\n num: number\r\n): Promise {\r\n return fetchPost<\r\n {\r\n fromUserId: number;\r\n toUserId: number;\r\n messageNo: number;\r\n num: number;\r\n },\r\n UnsendMessageResponse\r\n >(\"api/Message/UnsendMessage\", { fromUserId, toUserId, messageNo, num });\r\n}\r\n\r\nfunction useEndlessScroll(\r\n messages: MessagesPerDays,\r\n showMore: () => Promise\r\n) {\r\n const scrollableContainerRef = useRef(null);\r\n const hasNoMessage = Object.keys(messages).length === 0;\r\n const [loadingMore, setLoadingMore] = useState(false);\r\n\r\n const loadMoreIfNecessary = async () => {\r\n const el = scrollableContainerRef.current;\r\n if (!el || hasNoMessage) {\r\n return; // No scroll box, or no messages\r\n }\r\n const isScrollTop = el.scrollTop === 0;\r\n const hasScrollBar = el.scrollHeight > el.clientHeight;\r\n if (!isScrollTop && hasScrollBar) {\r\n return; // Scroll bar exists, but it is not near the top\r\n }\r\n if (Object.values(messages)[0].some(m => m.messageNo === 1)) {\r\n return; // All messages had already been loaded\r\n }\r\n\r\n setLoadingMore(true);\r\n const scrollPositionFromBottom = el.scrollHeight - el.scrollTop;\r\n await showMore();\r\n el.scrollTo({\r\n top: el.scrollHeight - scrollPositionFromBottom,\r\n });\r\n setLoadingMore(false);\r\n };\r\n\r\n return {\r\n loadMoreIfNecessary,\r\n hasNoMessage,\r\n scrollableContainerRef,\r\n loadingMore,\r\n };\r\n}\r\n","import Collapse from \"@material-ui/core/Collapse\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport ImageIcon from \"@material-ui/icons/Image\";\r\nimport SendIcon from \"@material-ui/icons/Send\";\r\nimport { RefObject, useEffect, useRef, useState } from \"react\";\r\nimport { fetchPost, fetchPostFormData } from \"../../../../../common/util/fetch\";\r\nimport { isAndroid } from \"../../../../../common/util/osCheck\";\r\nimport { allItems } from \"../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items\";\r\nimport { PresentBox } from \"../../../../zApps/Layout/Login/MyPage/components/OpenableCards/ItemsCard/items/ItemClass/PresentBox\";\r\nimport ShurikenProgress from \"../../../Animations/ShurikenProgress\";\r\nimport { PrimaryButton } from \"../../../Button/PrimaryButton\";\r\nimport { Markdown } from \"../../../Markdown\";\r\nimport {\r\n replyTargetImageKey,\r\n ReplyToMessageImage,\r\n replyToMessageKey,\r\n} from \"../../../Markdown/CodeRender\";\r\nimport { User } from \"../../../User/types\";\r\nimport { validateImage } from \"../../../User/UserAvatar/validateImage\";\r\nimport { getMessagesPerDays } from \"../getMessagesPerDay\";\r\nimport {\r\n MessagesPerDays,\r\n SendImageMessageResponse,\r\n SendMessageResponse,\r\n} from \"../types\";\r\nimport {\r\n CoinsForPresentTypes,\r\n OpenAllUnopenedPresents,\r\n} from \"./ConversationArea/functions\";\r\n\r\nconst collapseTimeout = 500;\r\n\r\nexport function MessageField({\r\n myUserId,\r\n targetUserId,\r\n setMessages,\r\n setCurrentlySentMessageNo,\r\n setTextareaHeight,\r\n messagesCountToShow,\r\n showMessageLimitDialog,\r\n setSendingMessage,\r\n globalSubmitting,\r\n setGlobalSubmitting,\r\n user,\r\n isOpenAllButtonShown,\r\n replyTarget,\r\n setReplyTarget,\r\n inputRef,\r\n}: {\r\n myUserId: number;\r\n targetUserId: number;\r\n setMessages: (messages: MessagesPerDays) => void;\r\n setCurrentlySentMessageNo: (messageId: number) => void;\r\n setTextareaHeight: (height: number) => void;\r\n messagesCountToShow: number;\r\n showMessageLimitDialog: () => boolean;\r\n setSendingMessage: (text: string, isImage?: boolean) => void;\r\n globalSubmitting: boolean;\r\n setGlobalSubmitting: (submitting: boolean) => void;\r\n user: User;\r\n isOpenAllButtonShown: boolean;\r\n replyTarget: string;\r\n setReplyTarget: (text: string) => void;\r\n inputRef: RefObject;\r\n}) {\r\n const { message, setMessage } = useSavedMessage(myUserId, targetUserId);\r\n\r\n const error =\r\n message.length > 5000\r\n ? \"Message must be less than or equal to 5000 characters\"\r\n : undefined;\r\n\r\n const containerRef = useRef(null);\r\n\r\n useEffect(() => {\r\n setTimeout(() => {\r\n const containerHeight = containerRef.current?.clientHeight ?? 0;\r\n setTextareaHeight(containerHeight);\r\n }, collapseTimeout); // Wait animation\r\n }, [message, setTextareaHeight, isOpenAllButtonShown, replyTarget]);\r\n\r\n const isReplyToImage = replyTarget.startsWith(replyTargetImageKey);\r\n\r\n const c = useMessageFieldStyles({ isReplyToImage });\r\n\r\n const [localSubmitting, setLocalSubmitting] = useState(false);\r\n const setSubmitting = (newSubmitting: boolean) => {\r\n setGlobalSubmitting(newSubmitting);\r\n setLocalSubmitting(newSubmitting);\r\n };\r\n\r\n return (\r\n
\r\n {isOpenAllButtonShown && (\r\n {\r\n setSubmitting(true);\r\n\r\n const allPresentItems = allItems.filter(\r\n item => item instanceof PresentBox\r\n ) as PresentBox[];\r\n const coinsForPresentTypes =\r\n allPresentItems.reduce(\r\n (acc, val) => {\r\n return {\r\n ...acc,\r\n [val.key]: val.presentCoins,\r\n };\r\n },\r\n {}\r\n );\r\n\r\n await OpenAllUnopenedPresents(\r\n targetUserId,\r\n user.userId,\r\n coinsForPresentTypes,\r\n setMessages,\r\n setCurrentlySentMessageNo,\r\n messagesCountToShow\r\n );\r\n\r\n setSubmitting(false);\r\n }}\r\n disabled={globalSubmitting}\r\n >\r\n {localSubmitting ? (\r\n \r\n ) : (\r\n \"Open all presents!\"\r\n )}\r\n \r\n )}\r\n\r\n \r\n\r\n
\r\n {\r\n setMessage(ev.target.value || \"\");\r\n }}\r\n inputProps={{\r\n className: c.input,\r\n ref: inputRef,\r\n }}\r\n helperText={\r\n error ? (\r\n
{error}
\r\n ) : undefined\r\n }\r\n error={!!error}\r\n />\r\n\r\n
\r\n \r\n\r\n {\r\n if (showMessageLimitDialog()) {\r\n return;\r\n }\r\n setMessage(\"\");\r\n inputRef.current?.focus();\r\n\r\n const messageWithReply = makeMessageWithReply(\r\n message,\r\n replyTarget\r\n ).trim();\r\n setSendingMessage(messageWithReply);\r\n setReplyTarget(\"\");\r\n const result = await sendMessage(\r\n myUserId,\r\n targetUserId,\r\n messageWithReply,\r\n messagesCountToShow\r\n );\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n setCurrentlySentMessageNo(\r\n Math.max(\r\n ...result.messages.map(m => m.messageNo)\r\n )\r\n );\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\nconst useMessageFieldStyles = makeStyles(\r\n theme => ({\r\n container: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n left: 0,\r\n width: \"100%\",\r\n backgroundColor: theme.palette.grey[300],\r\n padding: 5,\r\n zIndex: 2,\r\n },\r\n input: {\r\n backgroundColor: \"white\",\r\n padding: \"17px 14px\",\r\n margin: \"-18.5px -14px\",\r\n fontSize: 17,\r\n lineHeight: 1.3,\r\n },\r\n textField: { padding: 0 },\r\n errorText: { color: theme.palette.secondary.main, fontWeight: \"bold\" },\r\n buttonsContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n height: 55,\r\n },\r\n sendButton: {\r\n maxHeight: 49,\r\n minHeight: 49,\r\n maxWidth: 49,\r\n minWidth: 49,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n marginLeft: 5,\r\n borderRadius: \"50%\",\r\n },\r\n sendIcon: {\r\n height: 25,\r\n width: 25,\r\n color: \"white\",\r\n },\r\n inputContainer: { display: \"flex\", alignItems: \"flex-end\" },\r\n })\r\n);\r\n\r\nconst imgHeight = 100;\r\nconst imgContainerPaddingTop = 5;\r\nconst imgContainerPaddingBottom = 8;\r\n\r\nfunction ReplyTargetArea({\r\n replyTarget,\r\n setReplyTarget,\r\n isReplyToImage,\r\n}: {\r\n replyTarget: string;\r\n setReplyTarget: (text: string) => void;\r\n isReplyToImage: boolean;\r\n}) {\r\n const c = useReplyTargetAreaStyles({ isReplyToImage });\r\n\r\n const [delayedReplyTarget, setDelayedReplyTarget] = useState(\"\");\r\n useEffect(() => {\r\n // Prevent replyTarget from disappearing before Collapse closes\r\n const timeoutId = setTimeout(() => {\r\n setDelayedReplyTarget(replyTarget);\r\n }, collapseTimeout);\r\n return () => {\r\n clearTimeout(timeoutId);\r\n };\r\n }, [replyTarget]);\r\n\r\n const delayedIsReplyToImage =\r\n delayedReplyTarget.startsWith(replyTargetImageKey);\r\n const isImageCleared = replyTarget === \"\" && delayedIsReplyToImage; // Image was cleared but Collapse is still closing\r\n\r\n return (\r\n \r\n
\r\n
\r\n {isReplyToImage || isImageCleared ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n {\r\n setReplyTarget(\"\");\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nconst useReplyTargetAreaStyles = makeStyles(\r\n theme => ({\r\n replyContainer: {\r\n width: \"100%\",\r\n backgroundColor: \"rgba(255,255,255,0.8)\",\r\n marginBottom: 5,\r\n paddingRight: 10,\r\n color: theme.palette.grey[600],\r\n borderRadius: 5,\r\n display: \"flex\",\r\n },\r\n replyMarkdownContainer: ({ isReplyToImage }) => ({\r\n maxHeight: 250,\r\n overflowY: \"auto\",\r\n width: \"100%\",\r\n padding: isReplyToImage ? \"7px 0 3px 11px\" : \"8px 0 10px 10px\",\r\n }),\r\n replyDeleteButtonContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n replyDeleteIconButton: { height: 24, width: 24 },\r\n })\r\n);\r\n\r\nfunction makeMessageWithReply(message: string, reply: string) {\r\n if (!reply) {\r\n return message;\r\n }\r\n\r\n return `\\`\\`\\`${replyToMessageKey}\r\n${reply}\r\n\\`\\`\\`\r\n${message}`;\r\n}\r\n\r\nfunction ImageUploader({\r\n hasText,\r\n myUserId,\r\n targetUserId,\r\n setMessages,\r\n setCurrentlySentMessageNo,\r\n messagesCountToShow,\r\n setSendingMessage,\r\n}: {\r\n hasText: boolean;\r\n myUserId: number;\r\n targetUserId: number;\r\n setMessages: (messages: MessagesPerDays) => void;\r\n setCurrentlySentMessageNo: (messageId: number) => void;\r\n messagesCountToShow: number;\r\n setSendingMessage: (text: string, isImage?: boolean) => void;\r\n}) {\r\n const c = useImageUploaderStyles({ hasText });\r\n const imageInputRef = useRef(null);\r\n\r\n return (\r\n <>\r\n {\r\n imageInputRef.current?.click();\r\n }}\r\n className={c.imageIconButton}\r\n >\r\n \r\n \r\n\r\n {\r\n if (!target.files || !target.files[0]) {\r\n return;\r\n }\r\n const targetFile = target.files[0];\r\n if (imageInputRef.current) {\r\n imageInputRef.current.value = \"\"; // Reset in order to enable to upload the same file again\r\n }\r\n\r\n const error = validateImage(targetFile);\r\n if (error) {\r\n alert(error);\r\n return;\r\n }\r\n\r\n setSendingMessage(\"\", true);\r\n const result = await fetchSendImageMessage(\r\n myUserId,\r\n targetUserId,\r\n targetFile,\r\n messagesCountToShow\r\n );\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n setCurrentlySentMessageNo(\r\n Math.max(...result.messages.map(m => m.messageNo))\r\n );\r\n }}\r\n />\r\n \r\n );\r\n}\r\nconst imageIconSize = 35;\r\nconst useImageUploaderStyles = makeStyles(\r\n theme => ({\r\n imageIconButton: ({ hasText }) => {\r\n const size = hasText ? 0 : imageIconSize;\r\n return {\r\n maxHeight: imageIconSize,\r\n minHeight: imageIconSize,\r\n maxWidth: size,\r\n minWidth: size,\r\n margin: hasText ? 0 : \"0 3px 0 8px\",\r\n padding: 0,\r\n transition: \"all 300ms\",\r\n };\r\n },\r\n imageIcon: ({ hasText }) => {\r\n const size = hasText ? 0 : imageIconSize;\r\n return {\r\n width: size,\r\n height: imageIconSize,\r\n color: theme.palette.primary.main,\r\n backgroundColor: \"white\",\r\n borderRadius: 4,\r\n transition: \"all 300ms\",\r\n opacity: hasText ? 0 : 1,\r\n };\r\n },\r\n })\r\n);\r\n\r\nasync function fetchSendImageMessage(\r\n myUserId: number,\r\n toUserId: number,\r\n file: File,\r\n num: number\r\n): Promise {\r\n const formData = new FormData();\r\n formData.append(\"myUserId\", myUserId.toString());\r\n formData.append(\"toUserId\", toUserId.toString());\r\n formData.append(\"file\", file);\r\n formData.append(\"num\", num.toString());\r\n\r\n return await fetchPostFormData(\r\n \"api/Message/SendImageMessage\",\r\n formData\r\n );\r\n}\r\n\r\nfunction useSavedMessage(myUserId: number, targetUserId: number) {\r\n const storageKey = `Inputting-MessageField-from${myUserId}-to${targetUserId}`;\r\n const [message, setMessage] = useState(\r\n localStorage.getItem(storageKey) || \"\"\r\n );\r\n\r\n useEffect(() => {\r\n // Save data\r\n localStorage.setItem(storageKey, message);\r\n }, [message, myUserId, targetUserId]);\r\n\r\n return {\r\n message,\r\n setMessage,\r\n };\r\n}\r\n\r\nasync function sendMessage(\r\n myUserId: number,\r\n toUserId: number,\r\n text: string,\r\n num: number\r\n): Promise {\r\n return fetchPost<\r\n { myUserId: number; toUserId: number; text: string; num: number },\r\n SendMessageResponse\r\n >(\"api/Message/SendMessage\", { myUserId, toUserId, text, num });\r\n}\r\n","import { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useRef, useState } from \"react\";\r\nimport { changeAppState, getAppState } from \"../../../../common/appState\";\r\nimport { OtherUser, User } from \"../../User/types\";\r\nimport { ConversationArea } from \"./components/ConversationArea/ConversationArea\";\r\nimport { MessageField } from \"./components/MessageField\";\r\nimport { getMessagesPerDays } from \"./getMessagesPerDay\";\r\nimport {\r\n MessagePanelOpenState,\r\n MessagesPerDays,\r\n PresentMessage,\r\n} from \"./types\";\r\n\r\nexport function MessageContent({\r\n targetUser,\r\n user,\r\n messages,\r\n setMessages,\r\n showMore,\r\n messagesCountToShow,\r\n currentlySentMessageNo,\r\n setCurrentlySentMessageNo,\r\n panelState,\r\n}: {\r\n targetUser: OtherUser;\r\n user: User;\r\n messages: MessagesPerDays;\r\n setMessages: (messages: MessagesPerDays) => void;\r\n showMore: () => Promise;\r\n messagesCountToShow: number;\r\n currentlySentMessageNo: number;\r\n setCurrentlySentMessageNo: (messageId: number) => void;\r\n panelState: MessagePanelOpenState;\r\n}) {\r\n const [textareaHeight, setTextareaHeight] = useState(0);\r\n const unopenedPresents = Object.values(messages)\r\n .flat()\r\n .filter(\r\n m =>\r\n m.fromUserId === targetUser.userId &&\r\n m.present &&\r\n !m.isPresentOpen\r\n ) as PresentMessage[];\r\n const [submitting, setSubmitting] = useState(false);\r\n\r\n const c = useMessageContentStyles();\r\n\r\n const [replyTarget, setReplyTarget] = useState(\"\");\r\n const inputRef = useRef(null);\r\n\r\n const onlyOwnMessage = user.sul >= 2 || targetUser.sul >= 2;\r\n\r\n return (\r\n
\r\n

{targetUser.name}

\r\n\r\n \r\n\r\n \r\n showMessageLimitDialog(user, targetUser, messages)\r\n }\r\n setSendingMessage={(text, isImage) => {\r\n setSendingMessage(\r\n messages,\r\n setMessages,\r\n user,\r\n text,\r\n setCurrentlySentMessageNo,\r\n isImage\r\n );\r\n }}\r\n globalSubmitting={submitting}\r\n setGlobalSubmitting={setSubmitting}\r\n user={user}\r\n isOpenAllButtonShown={\r\n unopenedPresents.length >= 2 && !onlyOwnMessage\r\n }\r\n replyTarget={replyTarget}\r\n setReplyTarget={setReplyTarget}\r\n inputRef={inputRef}\r\n />\r\n
\r\n );\r\n}\r\nexport const usernameMarginBottom = 8;\r\nexport const usernameHeight = 48;\r\nconst useMessageContentStyles = makeStyles({\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n },\r\n userName: {\r\n padding: \"5px 20px\",\r\n marginBottom: usernameMarginBottom,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n maxWidth: \"100%\",\r\n height: usernameHeight,\r\n },\r\n});\r\n\r\nfunction showMessageLimitDialog(\r\n user: User,\r\n targetUser: OtherUser,\r\n messages: MessagesPerDays\r\n) {\r\n if (\r\n getAppState().relatedUsers.some(\r\n u => u.userId === targetUser.userId && u.isFriend\r\n )\r\n ) {\r\n return false; // Friend is ok\r\n }\r\n if (\r\n !Object.values(messages)\r\n .flat()\r\n .some(m => m.fromUserId === user.userId)\r\n ) {\r\n return false; // Still not reached the limit\r\n }\r\n changeAppState(\"guestMessageLimitDialogState\", {\r\n type: \"open\",\r\n targetUser,\r\n });\r\n return true; // Limit reached\r\n}\r\n\r\nfunction setSendingMessage(\r\n messages: MessagesPerDays,\r\n setMessages: (messages: MessagesPerDays) => void,\r\n user: User,\r\n text: string,\r\n setCurrentlySentMessageNo: (messageNo: number) => void,\r\n isImage?: boolean\r\n) {\r\n const flatMessages = Object.values(messages).flat();\r\n const messageNo = Math.max(...flatMessages.map(m => m.messageNo)) + 1;\r\n setMessages(\r\n getMessagesPerDays([\r\n ...flatMessages,\r\n {\r\n fromUserId: user.userId,\r\n messageNo,\r\n text,\r\n minutesAgo: 0,\r\n isRead: false,\r\n isUnsent: false,\r\n present: \"\",\r\n presentQuantity: 0,\r\n isPresentOpen: false,\r\n unremovable: false,\r\n isImage: !!isImage,\r\n isSending: true,\r\n },\r\n ])\r\n );\r\n setCurrentlySentMessageNo(messageNo);\r\n}\r\n","import { makeStyles } from \"@material-ui/core/styles\";\r\nimport Switch from \"@material-ui/core/Switch\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { spaceBetween } from \"../../../../../common/util/Array/spaceBetween\";\r\nimport { fetchPost } from \"../../../../../common/util/fetch\";\r\nimport { fetchSetMuteStatus } from \"./fetchSetMuteStatus\";\r\n\r\nexport function MuteSwitch({\r\n fromUserId,\r\n targetUserId,\r\n}: {\r\n fromUserId: number;\r\n targetUserId: number;\r\n}) {\r\n const [checked, setChecked] = useState(false);\r\n const toggleChecked = () => {\r\n setChecked(!checked);\r\n fetchSetMuteStatus(fromUserId, targetUserId, !checked).then(m => {\r\n setChecked(m);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n fetchGetMuteStatus(fromUserId, targetUserId).then(muted => {\r\n setChecked(muted);\r\n });\r\n }, []);\r\n\r\n const c = useStyles();\r\n\r\n return (\r\n
\r\n \r\n {checked ? \"You won't receive message alerts\" : \"Mute User\"}\r\n \r\n\r\n \r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles(theme => ({\r\n container: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 5,\r\n height: 38,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n message: {\r\n marginRight: 1,\r\n fontSize: \"small\",\r\n },\r\n grey: {\r\n color: theme.palette.grey[700],\r\n },\r\n}));\r\n\r\nasync function fetchGetMuteStatus(\r\n fromUserId: number,\r\n targetUserId: number\r\n): Promise {\r\n const result = await fetchPost<\r\n {\r\n fromUserId: number;\r\n targetUserId: number;\r\n },\r\n boolean\r\n >(\"api/Message/GetMuteStatus\", { fromUserId, targetUserId });\r\n if (typeof result === \"boolean\") {\r\n return result;\r\n }\r\n return false;\r\n}\r\n\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n changeAppState,\r\n getAppState,\r\n useAppState,\r\n} from \"../../../../common/appState\";\r\nimport { useDelayedState } from \"../../../../common/hooks/useDelayedState\";\r\nimport { useUser } from \"../../../../common/hooks/useUser\";\r\nimport { fetchGet } from \"../../../../common/util/fetch\";\r\nimport { RightPanel } from \"../../Panel/RightPanel\";\r\nimport { OtherUser, User } from \"../../User/types\";\r\nimport { MessageContent } from \"./Content\";\r\nimport { readMessages } from \"./components/ConversationArea/functions\";\r\nimport { MuteSwitch } from \"./components/MuteSwitch\";\r\nimport { getMessagesPerDays } from \"./getMessagesPerDay\";\r\nimport {\r\n InitMessagesResponse,\r\n MessagesPerDays,\r\n RecentMessagesResponse,\r\n} from \"./types\";\r\n\r\nconst transitionMilliseconds = 1000;\r\n\r\nconst initialMessageCountToShow = 30; // This should be a number that can show the scrollbar.\r\nconst additionalMessageCountToShow = 15;\r\n\r\nlet lastFetchedCount = initialMessageCountToShow;\r\n\r\nexport default function MessagePanel() {\r\n const [panelState, setPanelState] = useAppState(\"messagePanelState\");\r\n const isOpen = panelState !== \"close\";\r\n const targetUserId = isOpen ? panelState.targetUserId : undefined;\r\n\r\n const { user } = useUser();\r\n const [messagesCountToShow, setMessagesCountToShow] = useState(\r\n initialMessageCountToShow\r\n );\r\n const [currentlySentMessageNo, setCurrentlySentMessageNo] = useState(0);\r\n const { targetUser, messages, setMessages } = useLoad(\r\n user,\r\n targetUserId,\r\n messagesCountToShow,\r\n isOpen,\r\n setCurrentlySentMessageNo\r\n );\r\n\r\n const showMore = async () => {\r\n if (!user || !targetUserId) {\r\n return;\r\n }\r\n const newMessagesCountToShow =\r\n messagesCountToShow + additionalMessageCountToShow;\r\n if (newMessagesCountToShow !== lastFetchedCount) {\r\n lastFetchedCount = newMessagesCountToShow;\r\n await getExpandedNumberMessages(\r\n user.userId,\r\n targetUserId,\r\n newMessagesCountToShow,\r\n setMessages\r\n );\r\n setMessagesCountToShow(newMessagesCountToShow);\r\n }\r\n };\r\n\r\n const { delayedState } = useDelayedState(\r\n panelState,\r\n state => state !== \"close\",\r\n transitionMilliseconds\r\n );\r\n\r\n const loaded = targetUser && user;\r\n return (\r\n {\r\n setPanelState(\"close\");\r\n setMessagesCountToShow(initialMessageCountToShow);\r\n lastFetchedCount = initialMessageCountToShow;\r\n }}\r\n panelWidth={500}\r\n globalPanelState={panelState}\r\n isChildrenUnmounted={!loaded || targetUser.userId !== targetUserId}\r\n >\r\n {user && targetUser && (\r\n \r\n )}\r\n\r\n {loaded && delayedState !== \"close\" && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nasync function fetchInitMessages(\r\n myUserId: number,\r\n targetUserId: number,\r\n num: number\r\n): Promise {\r\n return fetchGet<\r\n { myUserId: number; targetUserId: number; num: number },\r\n InitMessagesResponse\r\n >(\"api/Message/GetInitMessages\", { myUserId, targetUserId, num });\r\n}\r\n\r\nlet lastFetchTime: number = 0;\r\nasync function fetchMessagesSometimes(\r\n myUserId: number,\r\n targetUserId: number,\r\n num: number\r\n): Promise {\r\n const now = Number(new Date());\r\n if (now - lastFetchTime < 3000) {\r\n return { error: \"fetching too often\" };\r\n }\r\n lastFetchTime = now;\r\n\r\n return fetchGet<\r\n { myUserId: number; targetUserId: number; num: number },\r\n RecentMessagesResponse\r\n >(\"api/Message/GetRecentMessages\", { myUserId, targetUserId, num });\r\n}\r\n\r\nasync function fetchRecentMessages(\r\n myUserId: number,\r\n targetUserId: number,\r\n num: number\r\n): Promise {\r\n return fetchGet<\r\n { myUserId: number; targetUserId: number; num: number },\r\n RecentMessagesResponse\r\n >(\"api/Message/GetRecentMessages\", { myUserId, targetUserId, num });\r\n}\r\n\r\nfunction useLoad(\r\n user: User | undefined,\r\n targetUserId: number | undefined,\r\n messagesCountToShow: number,\r\n isOpen: boolean,\r\n setCurrentlySentMessageNo: (messageNo: number) => void\r\n) {\r\n const [targetUser, setTargetUser] = useState(\r\n undefined\r\n );\r\n const [messages, setMessages] = useState({});\r\n\r\n useEffect(() => {\r\n if (!user || !targetUserId || !isOpen) {\r\n return;\r\n }\r\n fetchInitMessages(user.userId, targetUserId, messagesCountToShow).then(\r\n async result => {\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setTargetUser(result.targetUser);\r\n const messagesPerDay = getMessagesPerDays(result.messages);\r\n setMessages(messagesPerDay);\r\n const lastMessageNo = getLastMessageNo(messagesPerDay);\r\n setCurrentlySentMessageNo(lastMessageNo);\r\n\r\n // Read invisible unread messages (In case they are more than initialMessageCountToShow)\r\n const invisibleUnreadMessages = getAppState()\r\n .unreadMessages.filter(\r\n unreadMessages =>\r\n unreadMessages.fromUserId === targetUserId\r\n )\r\n .filter(\r\n unreadMessage =>\r\n !result.messages.some(\r\n m => m.messageNo === unreadMessage.messageNo\r\n )\r\n );\r\n if (invisibleUnreadMessages.length > 0) {\r\n await readMessages(\r\n targetUserId,\r\n user.userId,\r\n invisibleUnreadMessages.map(m => m.messageNo),\r\n messagesCountToShow\r\n );\r\n changeAppState(\r\n \"unreadMessages\",\r\n getAppState().unreadMessages.filter(\r\n m =>\r\n !(\r\n m.fromUserId === targetUserId &&\r\n m.messageNo === m.messageNo\r\n )\r\n )\r\n );\r\n }\r\n }\r\n );\r\n }, [targetUserId, !!user, isOpen]);\r\n\r\n useEffect(() => {\r\n if (!user || !targetUserId || !isOpen) {\r\n return;\r\n }\r\n const intervalId = setInterval(() => {\r\n getUnreadMessages(\r\n user.userId,\r\n targetUserId,\r\n messagesCountToShow,\r\n setMessages\r\n );\r\n }, 10 * 1000);\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }, [targetUserId, !!user, isOpen, messagesCountToShow]);\r\n\r\n return {\r\n targetUser,\r\n messages,\r\n setMessages,\r\n };\r\n}\r\n\r\nfunction getUnreadMessages(\r\n userId: number,\r\n targetUserId: number,\r\n messagesCountToShow: number,\r\n setMessages: (messages: MessagesPerDays) => void\r\n) {\r\n fetchMessagesSometimes(userId, targetUserId, messagesCountToShow).then(\r\n result => {\r\n if (\r\n \"error\" in result ||\r\n result.messages.every(\r\n m => m.fromUserId === userId || m.isRead // Already read all messages\r\n )\r\n ) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n }\r\n );\r\n}\r\n\r\nasync function getExpandedNumberMessages(\r\n userId: number,\r\n targetUserId: number,\r\n messagesCountToShow: number,\r\n setMessages: (messages: MessagesPerDays) => void\r\n) {\r\n const result = await fetchRecentMessages(\r\n userId,\r\n targetUserId,\r\n messagesCountToShow\r\n );\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n setMessages(getMessagesPerDays(result.messages));\r\n}\r\n\r\nfunction getLastMessageNo(messages: MessagesPerDays): number {\r\n const messageArrays = Object.values(messages);\r\n const lastDateMessages =\r\n messageArrays.length > 0 ? messageArrays[messageArrays.length - 1] : [];\r\n const lastMessage =\r\n lastDateMessages.length > 0\r\n ? lastDateMessages[lastDateMessages.length - 1]\r\n : undefined;\r\n return lastMessage?.messageNo ?? 0;\r\n}\r\n","import { fetchPost } from \"../../../../../common/util/fetch\";\r\n\r\nexport async function fetchSetMuteStatus(\r\n fromUserId: number,\r\n targetUserId: number,\r\n muted: boolean\r\n): Promise {\r\n const result = await fetchPost<\r\n {\r\n fromUserId: number;\r\n targetUserId: number;\r\n muted: boolean;\r\n },\r\n boolean\r\n >(\"api/Message/SetMuteStatus\", { fromUserId, targetUserId, muted });\r\n if (typeof result === \"boolean\") {\r\n return result;\r\n }\r\n return false;\r\n}\r\n\r\n","import Card from \"@material-ui/core/Card\";\r\nimport Popover from \"@material-ui/core/Popover\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { ReactNode } from \"react\";\r\nimport { spaceBetween } from \"../../../common/util/Array/spaceBetween\";\r\nimport { DarkButton } from \"../Button/DarkButton\";\r\n\r\nexport function DarkPopoverMenu({\r\n anchorEl,\r\n containerEl,\r\n open,\r\n onClose,\r\n items,\r\n disabled,\r\n}: {\r\n anchorEl: HTMLButtonElement | HTMLDivElement | SVGSVGElement | null;\r\n containerEl: HTMLDivElement | null;\r\n open: boolean;\r\n onClose: () => void;\r\n items: {\r\n key?: string;\r\n label: string;\r\n onClick?: () => void;\r\n icon?: ReactNode;\r\n }[];\r\n disabled?: boolean;\r\n}) {\r\n const c = usePopoverStyles();\r\n\r\n return (\r\n \r\n
\r\n \r\n {items.map((item, i) => (\r\n {\r\n item.onClick?.();\r\n onClose();\r\n }}\r\n className={spaceBetween(\r\n c.darkButton,\r\n i === 0 && c.topDarkButton\r\n )}\r\n disabled={disabled}\r\n >\r\n {item.label}\r\n \r\n ))}\r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\nconst usePopoverStyles = makeStyles(theme => ({\r\n topDarkButton: {\r\n borderBottom: \"solid 1px grey\",\r\n borderBottomRightRadius: 0,\r\n borderBottomLeftRadius: 0,\r\n },\r\n darkButton: {\r\n paddingLeft: 20,\r\n paddingRight: 20,\r\n },\r\n paper: {\r\n backgroundColor: \"rgba(0,0,0,0)\",\r\n },\r\n tail: {\r\n position: \"absolute\",\r\n bottom: 10,\r\n transform: \"rotate(45deg)\",\r\n backgroundColor: theme.palette.grey[800],\r\n zIndex: 1,\r\n width: 30,\r\n height: 30,\r\n },\r\n card: {\r\n backgroundColor: theme.palette.grey[800],\r\n zIndex: 2,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n paddingBottom: 15,\r\n },\r\n}));\r\n","import Avatar, { AvatarProps } from \"@material-ui/core/Avatar\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport PersonIcon from \"@material-ui/icons/Person\";\r\nimport { RefObject } from \"react\";\r\nimport { spaceBetween } from \"../../../../common/util/Array/spaceBetween\";\r\nimport { theme } from \"../../../zApps/Layout\";\r\nimport { User, UserForRanking } from \"../types\";\r\n\r\ninterface Props extends AvatarProps {\r\n user: User | UserForRanking | undefined;\r\n colorNumber: number | \"noColor\";\r\n size: number;\r\n icon300?: boolean;\r\n avatarRef?: RefObject;\r\n}\r\n\r\nexport function UserAvatar({\r\n user,\r\n colorNumber,\r\n size,\r\n className,\r\n icon300,\r\n avatarRef,\r\n ...rest\r\n}: Props) {\r\n const c = useStyles({ size, colorNumber });\r\n\r\n if (user?.avatarPath) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst colors = [\r\n \"#DC7633\",\r\n theme.palette.primary.light,\r\n theme.palette.success.main,\r\n theme.palette.secondary.light,\r\n \"#8E44AD\",\r\n \"#EC7063\",\r\n \"#34495E\",\r\n \"#5499C7\",\r\n \"#D4AC0D\",\r\n];\r\n\r\nconst useStyles = makeStyles<\r\n Theme,\r\n { size: number; colorNumber: number | \"noColor\" }\r\n>(theme => ({\r\n imgAvatar: ({ size }) => ({\r\n width: size,\r\n height: size,\r\n boxShadow: `0 0 3px ${theme.palette.grey[400]}`,\r\n }),\r\n img: ({ size }) => ({\r\n objectFit: \"cover\",\r\n objectPosition: \"50% 50%\",\r\n width: size,\r\n height: size,\r\n }),\r\n iconAvatar: ({ size, colorNumber }) => ({\r\n width: size,\r\n height: size,\r\n backgroundColor:\r\n colorNumber === \"noColor\"\r\n ? undefined\r\n : colors[colorNumber % colors.length],\r\n }),\r\n icon: ({ size }) => ({\r\n width: size * 0.8,\r\n height: size * 0.8,\r\n }),\r\n}));\r\n","export const validImageContentTypes = [\"image/jpeg\", \"image/png\", \"image/gif\"]; // Corresponding constants are also in: Z-Apps\\Util\\ImageUtil.cs\r\n\r\nexport function validateImage(file: File) {\r\n if (!validImageContentTypes.includes(file.type)) {\r\n return \"Sorry, only JPG, JPEG, PNG & GIF files are allowed\";\r\n }\r\n\r\n if (file.size > 10000000) {\r\n return \"File size must be less than 10MB\";\r\n }\r\n return null;\r\n}\r\n"],"names":["useDelayedState","state","checkOpen","timeoutMilliSecond","_useState","useState","_useState2","_slicedToArray","delayedState","setDelayedState","useEffect","timeoutId","setTimeout","clearTimeout","delayedOpen","orderByBoolean","_ref","fnc","splitByBoolean","_toArray","slice","flat","_ref3","reduce","acc","val","i","concat","_toConsumableArray","isAndroid","test","navigator","userAgent","DarkButton","forwardRef","ref","style","className","rest","_objectWithoutProperties","_excluded","c","useStyles","_jsx","Button","_objectSpread","spaceBetween","button","makeStyles","_ref2","palette","backgroundColor","grey","color","fontSize","getMessagesPerDays","messages","now","Number","Date","message","milliSecondsAgo","minutesAgo","strDate","toDateString","_defineProperty","openPresent","_x","_x2","_x3","_x4","_x5","_x6","_x7","_x8","_x9","_openPresent","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","presenterUserId","openerUserId","messageNo","presentKey","coins","presentQuantity","num","setMessages","setCurrentlySentMessageNo","result","wrap","_context","prev","next","fetchPost","sent","abrupt","Math","max","map","m","changeAppState","user","stop","_readMessage","_callee2","fromUserId","toUserId","_context2","readMessages","_x14","_x15","_x16","_x17","_readMessages","_callee3","messageNos","_context3","OpenAllUnopenedPresents","_x18","_x19","_x20","_x21","_x22","_x23","_OpenAllUnopenedPresents","_callee4","coinsForPresentTypes","_context4","MyOwnPresent","present","outerContainer","children","_jsxs","Card","card","src","appsPublicImg","img","quantity","marginTop","display","alignItems","padding","marginLeft","width","SentTime","time","setTime","date","hours","getHours","toString","padStart","minutes","getMinutes","MessageMarkdown","text","noLinkShadow","_splitByBoolean$map","split","startsWith","replyToMessageKey","t","join","_splitByBoolean$map2","mainText","replyText","_Fragment","Markdown","source","noParagraphMarginBottom","MyMessage","me","theirUserId","currentlySentMessageNo","_ref$message","unremovable","isSending","isImage","unsendMessage","deleteIconRef","useRef","containerRef","unsendOpen","setUnsendOpen","useLayoutEffect","_containerRef$current","current","scrollIntoView","container","UserAvatar","colorNumber","level","size","onClick","openOtherUserPanel","userId","comment","colorChange","commentTail","ImageMessage","myUserId","targetUserId","messageType","markdownContainer","timeAndIconOuterContainer","ShurikenProgress","paddingBottom","paddingRight","timeAndIconInnerContainer","DeleteIcon","deleteIcon","DarkPopoverMenu","open","anchorEl","containerEl","onClose","items","label","icon","theme","flexDirection","marginBottom","minHeight","marginRight","justifyContent","borderRadius","position","success","main","height","top","right","transform","animation","cursor","zIndex","whiteSpace","wordBreak","TheirPresent","isOpen","globalSubmitting","setGlobalSubmitting","localSubmitting","setLocalSubmitting","setSubmitting","newSubmitting","imgAndQuantity","PrimaryButton","disabled","fullWidth","_getAppState","getAppState","margin","textAlign","TheirMessage","them","isRead","isPresentOpen","messagesCountToShow","submitting","targetUserIconColorNumber","setReplyTarget","inputRef","_x10","_x11","_x12","_x13","readMessage","then","unreadMessages","filter","rightSpace","replyButtonContainer","IconButton","replyButton","_inputRef$current","focus","replyTargetImageKey","textWithoutPreviousReply","line","trim","ReplyIcon","left","ConversationArea","targetUser","textareaHeight","showMore","panelState","onlyOwnMessage","screenHeight","useScreenSize","_useEndlessScroll","scrollableContainerRef","hasNoMessage","Object","keys","length","_useState3","_useState4","loadingMore","setLoadingMore","loadMoreIfNecessary","_ref4","el","isScrollTop","hasScrollBar","scrollPositionFromBottom","scrollTop","scrollHeight","clientHeight","values","some","scrollTo","useEndlessScroll","firstHeightTransitionFinished","setFirstHeightTransitionFinished","Collapse","in","loadingMoreCollapse","scrollableContainer","onTransitionEnd","behavior","onScroll","messagesPerDay","allDataLoaded","isFirstDate","filteredMessagesPerDay","isUnsent","dateContainer","dateCard","_fetchUnsendMessage","fetchUnsendMessage","PresentBox","presentCoins","noMessage","overflowY","rightPanelTopGap","rightPanelTopBarHeight","usernameHeight","usernameMarginBottom","transition","borderBottom","primary","light","collapseTimeout","MessageField","setTextareaHeight","showMessageLimitDialog","setSendingMessage","isOpenAllButtonShown","replyTarget","_useSavedMessage","storageKey","_useState5","localStorage","getItem","_useState6","setMessage","setItem","useSavedMessage","error","undefined","_containerRef$current2","containerHeight","isReplyToImage","useMessageFieldStyles","maxHeight","allPresentItems","allItems","item","key","ReplyTargetArea","inputContainer","TextField","autoFocus","placeholder","variant","value","multiline","maxRows","textField","onChange","ev","target","inputProps","input","helperText","errorText","buttonsContainer","ImageUploader","hasText","sendButton","messageWithReply","makeMessageWithReply","sendMessage","SendIcon","sendIcon","bottom","lineHeight","secondary","fontWeight","maxWidth","minWidth","imgHeight","imgContainerPaddingTop","imgContainerPaddingBottom","useReplyTargetAreaStyles","delayedReplyTarget","setDelayedReplyTarget","delayedIsReplyToImage","isImageCleared","timeout","replyContainer","replyMarkdownContainer","ReplyToMessageImage","paddingTop","paddingLeft","imgStyle","objectPosition","isFontSmaller","replyDeleteButtonContainer","replyDeleteIconButton","CloseIcon","_ref5","reply","_ref6","useImageUploaderStyles","imageInputRef","_imageInputRef$curren","click","imageIconButton","ImageIcon","imageIcon","hidden","type","accept","_ref8","_ref7","targetFile","files","validateImage","alert","fetchSendImageMessage","_ref9","_ref10","opacity","_fetchSendImageMessage","file","formData","FormData","append","fetchPostFormData","_sendMessage","_callee5","_context5","MessageContent","unopenedPresents","useMessageContentStyles","sul","userName","name","relatedUsers","u","isFriend","flatMessages","overflow","textOverflow","MuteSwitch","checked","setChecked","_fetchGetMuteStatus","fetchGetMuteStatus","muted","Switch","fetchSetMuteStatus","transitionMilliseconds","initialMessageCountToShow","additionalMessageCountToShow","lastFetchedCount","MessagePanel","_useAppState","useAppState","_useAppState2","setPanelState","useUser","setMessagesCountToShow","_useLoad","setTargetUser","_useState7","_useState8","_fetchInitMessages","fetchInitMessages","lastMessageNo","invisibleUnreadMessages","getLastMessageNo","unreadMessage","intervalId","setInterval","_fetchMessagesSometimes","fetchMessagesSometimes","every","getUnreadMessages","clearInterval","useLoad","newMessagesCountToShow","getExpandedNumberMessages","loaded","RightPanel","panelName","panelWidth","globalPanelState","isChildrenUnmounted","fetchGet","lastFetchTime","fetchRecentMessages","_fetchRecentMessages","_getExpandedNumberMessages","_callee6","_context6","_lastMessage$messageN","messageArrays","lastDateMessages","lastMessage","_fetchSetMuteStatus","usePopoverStyles","Popover","classes","paper","anchorOrigin","vertical","horizontal","transformOrigin","elevation","startIcon","_item$onClick","call","darkButton","topDarkButton","tail","borderBottomRightRadius","borderBottomLeftRadius","icon300","avatarRef","avatarPath","Avatar","imgAvatar","replace","alt","title","iconAvatar","PersonIcon","colors","boxShadow","objectFit","validImageContentTypes","includes"],"sourceRoot":""}