Skip to content

Commit

Permalink
feat: optimistic messages
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnyTheCarrot committed Oct 18, 2023
1 parent 93b1731 commit 6cbdb86
Show file tree
Hide file tree
Showing 29 changed files with 158 additions and 87 deletions.
14 changes: 9 additions & 5 deletions src/Content/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React, { Children, memo, useMemo } from "react";
import Moment from "moment/moment";
import Message from "../Message";
import * as Styles from "./style";
import type { APIEmbedImage, APIMessage } from "discord-api-types/v10";
import type { APIEmbedImage } from "discord-api-types/v10";
import { MessageFlags } from "discord-api-types/v10";
import Tooltip from "../Tooltip";
import SvgFromUrl from "../SvgFromUrl";
Expand All @@ -16,6 +16,7 @@ import ThreadButton from "./Thread/ThreadButton";
import Components from "../Message/Components";
import getDisplayName from "../utils/getDisplayName";
import { useTranslation } from "react-i18next";
import type { DiscordMessage } from "../types";

interface EditedProps {
editedAt: string;
Expand Down Expand Up @@ -69,7 +70,7 @@ export function MessageAccessories({
interface ContentCoreProps {
children: ReactNode;
showTooltip: boolean;
referencedMessage: APIMessage | null;
referencedMessage: DiscordMessage | null;
}

function ContentCore(props: ContentCoreProps) {
Expand Down Expand Up @@ -97,7 +98,7 @@ function ContentCore(props: ContentCoreProps) {
}

interface ContentProps {
message: APIMessage;
message: DiscordMessage;
isReplyContent?: boolean;
noThreadButton?: boolean;
}
Expand Down Expand Up @@ -200,7 +201,10 @@ function Content(props: ContentProps) {

return (
<>
<Styles.Base isReplyContent={props.isReplyContent}>
<Styles.MessageContent
isReplyContent={props.isReplyContent}
isOptimistic={props.message.optimistic}
>
<ContentCore
referencedMessage={props.message}
showTooltip={props.isReplyContent ?? false}
Expand Down Expand Up @@ -229,7 +233,7 @@ function Content(props: ContentProps) {
</Styles.ContentContainer>
</ContentCore>
{props.isReplyContent && <ReplyIcon message={props.message} />}
</Styles.Base>
</Styles.MessageContent>
{!props.isReplyContent && (
<MessageAccessories
active={
Expand Down
7 changes: 6 additions & 1 deletion src/Content/style.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@ import { CodeBlock } from "../markdown/render/elements/code/style";
import SvgFromUrl from "../SvgFromUrl";
import { Heading } from "../markdown/render/elements";

export const Base = styled.withConfig({
export const MessageContent = styled.withConfig({
displayName: "message-content",
componentId: commonComponentId,
})("span", {
color: theme.colors.primaryOpacity20,
whiteSpace: "break-spaces",
fontSize: theme.fontSizes.l,
variants: {
isOptimistic: {
true: {
opacity: 0.5,
},
},
isReplyContent: {
true: {
fontSize: theme.fontSizes.m,
Expand Down
4 changes: 2 additions & 2 deletions src/Message/Components/ActionRow.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import type {
APIActionRowComponent,
APIMessage,
APIMessageActionRowComponent,
} from "discord-api-types/v10";
import * as Styles from "./style";
import React from "react";
import Component from "./Component";
import type { DiscordMessage } from "../../types";

interface ActionRowProps {
actionRow: APIActionRowComponent<APIMessageActionRowComponent>;
message: APIMessage;
message: DiscordMessage;
}

function ActionRow({ actionRow, message }: ActionRowProps) {
Expand Down
4 changes: 2 additions & 2 deletions src/Message/Components/ButtonComponent.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type {
APIButtonComponentWithCustomId,
APIButtonComponentWithURL,
APIMessage,
} from "discord-api-types/v10";
import * as Styles from "./style";
import type { ComponentProps } from "react";
Expand All @@ -11,6 +10,7 @@ import { ButtonStyle } from "discord-api-types/v10";
import Emoji from "../../Emoji";
import { useConfig } from "../../core/ConfigContext";
import ExternalLink from "../../ExternalLink";
import type { DiscordMessage } from "../../types";

const buttonStyleMap: Record<
ButtonStyle,
Expand All @@ -33,7 +33,7 @@ type ButtonComponentWithURL = APIButtonComponentWithURL & {

interface ButtonComponentProps {
button: ButtonComponentWithCustomId | ButtonComponentWithURL;
message: APIMessage;
message: DiscordMessage;
}

function ButtonComponent({ button, message }: ButtonComponentProps) {
Expand Down
8 changes: 3 additions & 5 deletions src/Message/Components/Component.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import type {
APIMessage,
APIMessageActionRowComponent,
} from "discord-api-types/v10";
import type { APIMessageActionRowComponent } from "discord-api-types/v10";
import { ComponentType } from "discord-api-types/v10";
import ButtonComponent from "./ButtonComponent";
import React from "react";
import type { DiscordMessage } from "../../types";

interface ComponentProps {
component: APIMessageActionRowComponent;
message: APIMessage;
message: DiscordMessage;
}

function Component({ component, message }: ComponentProps) {
Expand Down
6 changes: 3 additions & 3 deletions src/Message/Components/index.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { APIMessage } from "discord-api-types/v10";
import ActionRow from "./ActionRow";
import React from "react";
import * as Styles from "./style";
import type { DiscordMessage } from "../../types";

interface ComponentsProps {
components: APIMessage["components"];
message: APIMessage;
components: DiscordMessage["components"];
message: DiscordMessage;
}

function Components({ components, message }: ComponentsProps) {
Expand Down
7 changes: 4 additions & 3 deletions src/Message/index.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import NormalMessage from "./variants/NormalMessage";
import React, { memo } from "react";
import MessageContainer from "./MessageContainer";
import type { APIChannel, APIMessage } from "discord-api-types/v10";
import type { APIChannel } from "discord-api-types/v10";
import { MessageType } from "discord-api-types/v10";
import GuildMemberJoin from "./variants/GuildMemberJoin";
import GuildDiscoveryRequalified from "./variants/GuildDiscoveryRequalified";
Expand All @@ -19,10 +19,11 @@ import ThreadCreated from "./variants/ThreadCreated";
import { MessageTypeResponse, useConfig } from "../core/ConfigContext";
import ThreadStarterMessage from "./variants/ThreadStarterMessage";
import AutomodAction from "./variants/AutomodAction";
import type { DiscordMessage } from "../types";

export interface MessageProps {
isFirstMessage?: boolean;
message: APIMessage;
message: DiscordMessage;
isHovered?: boolean;
showButtons?: boolean;
thread?: boolean;
Expand Down Expand Up @@ -155,7 +156,7 @@ function MessageTypeSwitch(props: Omit<MessageProps, "showButtons">) {
default: {
switch (unknownMessageTypeResponse) {
case MessageTypeResponse.InAppError: {
const errorMessage: APIMessage = {
const errorMessage: DiscordMessage = {
...props.message,
type: MessageType.Default,
content: `Unknown message type \`${
Expand Down
5 changes: 3 additions & 2 deletions src/Message/variants/AutomodAction.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import type { APIMessage, APIReaction, Snowflake } from "discord-api-types/v10";
import type { APIReaction, Snowflake } from "discord-api-types/v10";
import * as Styles from "../style/message";
import MessageAuthor, { AutomodAuthor } from "../MessageAuthor";
import LargeTimestamp from "../LargeTimestamp";
Expand All @@ -9,6 +9,7 @@ import { useConfig } from "../../core/ConfigContext";
import { error } from "../../utils/error";
import { MessageAccessories } from "../../Content";
import Reactions from "../Reactions";
import type { DiscordMessage } from "../../types";

type QuarantineUserAction =
| "quarantine_user"
Expand Down Expand Up @@ -115,7 +116,7 @@ function hasReactions(
}

interface AutomodActionProps {
message: APIMessage;
message: DiscordMessage;
isHovered?: boolean;
}

Expand Down
7 changes: 4 additions & 3 deletions src/Message/variants/BoostTierUpgrade.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ import React, { useMemo } from "react";
import LargeTimestamp from "../LargeTimestamp";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage, Snowflake } from "discord-api-types/v10";
import type { Snowflake } from "discord-api-types/v10";
import { MessageType } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface BoostTierUpgradeProps {
createdAt: APIMessage["timestamp"];
createdAt: DiscordMessage["timestamp"];
content: string;
channelId: Snowflake;
type: MessageType;
author: APIMessage["author"];
author: DiscordMessage["author"];
}

function BoostTierUpgrade({
Expand Down
8 changes: 4 additions & 4 deletions src/Message/variants/ChannelFollowAdd.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface ChannelFollowAddProps {
content: string;
author: APIMessage["author"];
channelId: APIMessage["channel_id"];
createdAt: APIMessage["timestamp"];
author: DiscordMessage["author"];
channelId: DiscordMessage["channel_id"];
createdAt: DiscordMessage["timestamp"];
}

function ChannelFollowAdd(props: ChannelFollowAddProps) {
Expand Down
8 changes: 4 additions & 4 deletions src/Message/variants/ChannelNameChange.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface ChannelNameChangeProps {
content: string;
createdAt: APIMessage["timestamp"];
channelId: APIMessage["channel_id"];
author: APIMessage["author"];
createdAt: DiscordMessage["timestamp"];
channelId: DiscordMessage["channel_id"];
author: DiscordMessage["author"];
}

function ChannelNameChange(props: ChannelNameChangeProps) {
Expand Down
8 changes: 4 additions & 4 deletions src/Message/variants/ChannelPinnedMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import React from "react";
import LargeTimestamp from "../LargeTimestamp";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface ChannelPinnedMessageProps {
author: APIMessage["author"];
createdAt: APIMessage["timestamp"];
channelId: APIMessage["channel_id"];
author: DiscordMessage["author"];
createdAt: DiscordMessage["timestamp"];
channelId: DiscordMessage["channel_id"];
}

function ChannelPinnedMessage(props: ChannelPinnedMessageProps) {
Expand Down
8 changes: 4 additions & 4 deletions src/Message/variants/GuildBoost.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface GuildBoostProps {
createdAt: APIMessage["timestamp"];
author: APIMessage["author"];
createdAt: DiscordMessage["timestamp"];
author: DiscordMessage["author"];
content: string;
channelId: APIMessage["channel_id"];
channelId: DiscordMessage["channel_id"];
}

function GuildBoost(props: GuildBoostProps) {
Expand Down
4 changes: 2 additions & 2 deletions src/Message/variants/GuildDiscoveryDisqualified.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface GuildDiscoveryDisqualifiedProps {
createdAt: APIMessage["timestamp"];
createdAt: DiscordMessage["timestamp"];
}

function GuildDiscoveryDisqualified(props: GuildDiscoveryDisqualifiedProps) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface GuildDiscoveryGracePeriodFinalWarningProps {
createdAt: APIMessage["timestamp"];
createdAt: DiscordMessage["timestamp"];
}

function GuildDiscoveryGracePeriodFinalWarning(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface GuildDiscoveryGracePeriodInitialWarningProps {
createdAt: APIMessage["timestamp"];
createdAt: DiscordMessage["timestamp"];
}

function GuildDiscoveryGracePeriodInitialWarning(
Expand Down
4 changes: 2 additions & 2 deletions src/Message/variants/GuildDiscoveryRequalified.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { Trans, useTranslation } from "react-i18next";
import type { DiscordMessage } from "../../types";

interface GuildDiscoveryRequalifiedProps {
createdAt: APIMessage["timestamp"];
createdAt: DiscordMessage["timestamp"];
}

function GuildDiscoveryRequalified(props: GuildDiscoveryRequalifiedProps) {
Expand Down
8 changes: 4 additions & 4 deletions src/Message/variants/GuildMemberJoin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import LargeTimestamp from "../LargeTimestamp";
import React from "react";
import * as Styles from "../style/message";
import { SystemMessageIconSize } from "../style/message";
import type { APIMessage } from "discord-api-types/v10";
import { useConfig } from "../../core/ConfigContext";
import { Trans, useTranslation } from "react-i18next";
import { GuildMemberJoin as GuildMemberJoinI18n } from "../../i18n/locales/en/translation.json";
import type { DiscordMessage } from "../../types";

interface GuildMemberJoinProps {
createdAt: APIMessage["timestamp"];
author: APIMessage["author"];
channelId: APIMessage["channel_id"];
createdAt: DiscordMessage["timestamp"];
author: DiscordMessage["author"];
channelId: DiscordMessage["channel_id"];
}

function GuildMemberJoin(props: GuildMemberJoinProps) {
Expand Down
Loading

0 comments on commit 6cbdb86

Please sign in to comment.