chore: satisfies prettier
							parent
							
								
									2c808eab45
								
							
						
					
					
						commit
						0f19bb7d06
					
				| 
						 | 
				
			
			@ -3,12 +3,12 @@ import { atomWithStorage } from "jotai/utils";
 | 
			
		|||
type TokenThreshold = {
 | 
			
		||||
    threshold: string;
 | 
			
		||||
    symbol: string;
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type BareUser = {
 | 
			
		||||
    userId: string;
 | 
			
		||||
    rawDisplayName: string;
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const verifiedAccountsAtom = atomWithStorage<Record<string, string>>("VERIFIED_ACCOUNTS", {});
 | 
			
		||||
export const minimumTokenThresholdAtom = atomWithStorage<Record<string, TokenThreshold>>("TOKEN_THRESHOLD", {});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,14 +6,15 @@ import { _t } from "../../../languageHandler";
 | 
			
		|||
import { cleanRoomName } from "../../../hooks/useVerifiedRoom";
 | 
			
		||||
 | 
			
		||||
export function CommunityRoomPeekMessage({ roomName }: { roomName: string }): ReactElement {
 | 
			
		||||
    const [allTokens] = useAtom(minimumTokenThresholdAtom)
 | 
			
		||||
    const [allTokens] = useAtom(minimumTokenThresholdAtom);
 | 
			
		||||
    const cleanedRoomName = cleanRoomName(roomName);
 | 
			
		||||
 | 
			
		||||
    const tokenThreshold = allTokens[cleanedRoomName];
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <h3>{_t("room|no_peek_join_prompt_community", { roomName: cleanedRoomName })} {
 | 
			
		||||
            tokenThreshold ? (_t('room|no_peek_join_prompt_community_threshold', tokenThreshold)) : ''
 | 
			
		||||
        }</h3>
 | 
			
		||||
        <h3>
 | 
			
		||||
            {_t("room|no_peek_join_prompt_community", { roomName: cleanedRoomName })}{" "}
 | 
			
		||||
            {tokenThreshold ? _t("room|no_peek_join_prompt_community_threshold", tokenThreshold) : ""}
 | 
			
		||||
        </h3>
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,37 +5,36 @@ import { Room } from "matrix-js-sdk/src/matrix";
 | 
			
		|||
import { minimumTokenThresholdAtom } from "../../../atoms";
 | 
			
		||||
import { _t } from "../../../languageHandler";
 | 
			
		||||
import { useVerifiedRoom } from "../../../hooks/useVerifiedRoom";
 | 
			
		||||
import {  MessageCommunityBotButton } from "./MessageButton";
 | 
			
		||||
import { MessageCommunityBotButton } from "./MessageButton";
 | 
			
		||||
 | 
			
		||||
export function DisabledMessageField({ room }: { room: Room }): JSX.Element {
 | 
			
		||||
    const [allTokens] = useAtom(minimumTokenThresholdAtom)
 | 
			
		||||
    const { isTokenGatedRoom, isCommunityRoom,  } = useVerifiedRoom(room);
 | 
			
		||||
    const [allTokens] = useAtom(minimumTokenThresholdAtom);
 | 
			
		||||
    const { isTokenGatedRoom, isCommunityRoom } = useVerifiedRoom(room);
 | 
			
		||||
 | 
			
		||||
    let tokenThreshold = allTokens[room.name];
 | 
			
		||||
    if(!tokenThreshold) {
 | 
			
		||||
    if (!tokenThreshold) {
 | 
			
		||||
        const tokenName = room.name.match(/\[TG] (.*) \(ct_.*\)/)?.[1];
 | 
			
		||||
        if(isTokenGatedRoom && tokenName) {
 | 
			
		||||
        if (isTokenGatedRoom && tokenName) {
 | 
			
		||||
            tokenThreshold = {
 | 
			
		||||
                threshold: "1",
 | 
			
		||||
                symbol: tokenName,
 | 
			
		||||
            }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (tokenThreshold) {
 | 
			
		||||
        return (
 | 
			
		||||
            <div key="controls_error" className="mx_MessageComposer_noperm_error">
 | 
			
		||||
                {_t("composer|no_perms_token_notice", tokenThreshold)}
 | 
			
		||||
                { isCommunityRoom ? (
 | 
			
		||||
                {isCommunityRoom ? (
 | 
			
		||||
                    <>
 | 
			
		||||
                        <span style={{'marginLeft': '1rem', display: 'block'}} />
 | 
			
		||||
                        <span style={{ marginLeft: "1rem", display: "block" }} />
 | 
			
		||||
                        <MessageCommunityBotButton text="Get room tokens" />
 | 
			
		||||
                    </>
 | 
			
		||||
                ) : null }
 | 
			
		||||
                ) : null}
 | 
			
		||||
            </div>
 | 
			
		||||
        );
 | 
			
		||||
    }  else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return (
 | 
			
		||||
            <div key="controls_error" className="mx_MessageComposer_noperm_error">
 | 
			
		||||
                {_t("composer|no_perms_notice")}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import { BareUser, communityBotAtom } from "../../../atoms";
 | 
			
		|||
 * Converts the member to a DirectoryMember and starts a DM with them.
 | 
			
		||||
 */
 | 
			
		||||
async function openDmForUser(matrixClient: MatrixClient, user: Member | BareUser): Promise<void> {
 | 
			
		||||
    const avatarUrl = user instanceof User ? user.avatarUrl : user instanceof RoomMember ? user.getMxcAvatarUrl() : '';
 | 
			
		||||
    const avatarUrl = user instanceof User ? user.avatarUrl : user instanceof RoomMember ? user.getMxcAvatarUrl() : "";
 | 
			
		||||
    const startDmUser = new DirectoryMember({
 | 
			
		||||
        user_id: user.userId,
 | 
			
		||||
        display_name: user.rawDisplayName,
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,13 @@ async function openDmForUser(matrixClient: MatrixClient, user: Member | BareUser
 | 
			
		|||
    await startDmOnFirstMessage(matrixClient, [startDmUser]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const MessageButton = ({ member, text = 'Send Message' }: { member: Member | BareUser, text?: string }): JSX.Element => {
 | 
			
		||||
export const MessageButton = ({
 | 
			
		||||
    member,
 | 
			
		||||
    text = "Send Message",
 | 
			
		||||
}: {
 | 
			
		||||
    member: Member | BareUser;
 | 
			
		||||
    text?: string;
 | 
			
		||||
}): JSX.Element => {
 | 
			
		||||
    const cli = useContext(MatrixClientContext);
 | 
			
		||||
    const [busy, setBusy] = useState(false);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -44,12 +50,8 @@ export const MessageButton = ({ member, text = 'Send Message' }: { member: Membe
 | 
			
		|||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const MessageCommunityBotButton = ({ text = 'Send Message' }: { text?: string }): JSX.Element => {
 | 
			
		||||
    const [communityBot] = useAtom(communityBotAtom)
 | 
			
		||||
export const MessageCommunityBotButton = ({ text = "Send Message" }: { text?: string }): JSX.Element => {
 | 
			
		||||
    const [communityBot] = useAtom(communityBotAtom);
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
       <MessageButton member={communityBot} text={text} />
 | 
			
		||||
    );
 | 
			
		||||
    return <MessageButton member={communityBot} text={text} />;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,11 @@ import { Action } from "matrix-react-sdk/src/dispatcher/actions";
 | 
			
		|||
import { SettingUpdatedPayload } from "matrix-react-sdk/src/dispatcher/payloads/SettingUpdatedPayload";
 | 
			
		||||
import { ViewRoomPayload } from "matrix-react-sdk/src/dispatcher/payloads/ViewRoomPayload";
 | 
			
		||||
import { ComposerInsertPayload } from "matrix-react-sdk/src/dispatcher/payloads/ComposerInsertPayload";
 | 
			
		||||
import { getConversionFunctions, sendMessage, SendWysiwygComposer } from "matrix-react-sdk/src/components/views/rooms/wysiwyg_composer";
 | 
			
		||||
import {
 | 
			
		||||
    getConversionFunctions,
 | 
			
		||||
    sendMessage,
 | 
			
		||||
    SendWysiwygComposer,
 | 
			
		||||
} from "matrix-react-sdk/src/components/views/rooms/wysiwyg_composer";
 | 
			
		||||
import EditorModel from "matrix-react-sdk/src/editor/model";
 | 
			
		||||
import { isLocalRoom } from "matrix-react-sdk/src/utils/localRoom/isLocalRoom";
 | 
			
		||||
import { aboveLeftOf, MenuProps } from "matrix-react-sdk/src/components/structures/ContextMenu";
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +59,9 @@ import { SdkContextClass } from "matrix-react-sdk/src/contexts/SDKContext";
 | 
			
		|||
import { VoiceBroadcastInfoState } from "matrix-react-sdk/src/voice-broadcast";
 | 
			
		||||
import { createCantStartVoiceMessageBroadcastDialog } from "matrix-react-sdk/src/components/views/dialogs/CantStartVoiceMessageBroadcastDialog";
 | 
			
		||||
import E2EIcon from "matrix-react-sdk/src/components/views/rooms/E2EIcon";
 | 
			
		||||
import SendMessageComposer, { SendMessageComposer as SendMessageComposerClass } from "matrix-react-sdk/src/components/views/rooms/SendMessageComposer";
 | 
			
		||||
import SendMessageComposer, {
 | 
			
		||||
    SendMessageComposer as SendMessageComposerClass,
 | 
			
		||||
} from "matrix-react-sdk/src/components/views/rooms/SendMessageComposer";
 | 
			
		||||
import Tooltip, { Alignment } from "matrix-react-sdk/src/components/views/elements/Tooltip";
 | 
			
		||||
import { formatTimeLeft } from "matrix-react-sdk/src/DateUtils";
 | 
			
		||||
import Stickerpicker from "matrix-react-sdk/src/components/views/rooms/Stickerpicker";
 | 
			
		||||
| 
						 | 
				
			
			@ -546,10 +552,7 @@ export class MessageComposer extends React.Component<IProps, IState> {
 | 
			
		|||
            controls.push(
 | 
			
		||||
                <div className="mx_MessageComposer_replaced_wrapper" key="room_replaced">
 | 
			
		||||
                    <div className="mx_MessageComposer_replaced_valign">
 | 
			
		||||
                        <RoomReplacedIcon
 | 
			
		||||
                            aria-hidden
 | 
			
		||||
                            className="mx_MessageComposer_roomReplaced_icon"
 | 
			
		||||
                        />
 | 
			
		||||
                        <RoomReplacedIcon aria-hidden className="mx_MessageComposer_roomReplaced_icon" />
 | 
			
		||||
                        <span className="mx_MessageComposer_roomReplaced_header">
 | 
			
		||||
                            {_t("composer|room_upgraded_notice")}
 | 
			
		||||
                        </span>
 | 
			
		||||
| 
						 | 
				
			
			@ -559,9 +562,7 @@ export class MessageComposer extends React.Component<IProps, IState> {
 | 
			
		|||
                </div>,
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            controls.push(
 | 
			
		||||
                <DisabledMessageField room={this.props.room} key="controls_error" />,
 | 
			
		||||
            );
 | 
			
		||||
            controls.push(<DisabledMessageField room={this.props.room} key="controls_error" />);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let recordingTooltip: JSX.Element | undefined;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -334,7 +334,6 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
 | 
			
		|||
 | 
			
		||||
        const { isCommunityRoom } = isVerifiedRoom(roomName);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        const messageCase = this.getMessageCase();
 | 
			
		||||
        switch (messageCase) {
 | 
			
		||||
            case MessageCase.Joining: {
 | 
			
		||||
| 
						 | 
				
			
			@ -704,10 +703,10 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
 | 
			
		|||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(isCommunityRoom) {
 | 
			
		||||
        if (isCommunityRoom) {
 | 
			
		||||
            secondaryButton = primaryButton;
 | 
			
		||||
            primaryButton = (<MessageCommunityBotButton text="Message Superhero Bot to get tokens" />);
 | 
			
		||||
            titleElement = (<CommunityRoomPeekMessage roomName={roomName} />);
 | 
			
		||||
            primaryButton = <MessageCommunityBotButton text="Message Superhero Bot to get tokens" />;
 | 
			
		||||
            titleElement = <CommunityRoomPeekMessage roomName={roomName} />;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const isPanel = this.props.canPreview;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ const useMinimumTokenThreshold = (config: any): void => {
 | 
			
		|||
                .then((res) => res.json())
 | 
			
		||||
                .then(setMinimumTokenThreshold)
 | 
			
		||||
                .catch((e) => {
 | 
			
		||||
                    console.error('Error loading minimum token threshold', e);
 | 
			
		||||
                    console.error("Error loading minimum token threshold", e);
 | 
			
		||||
                })
 | 
			
		||||
                .finally(() => {
 | 
			
		||||
                    setIsLoading(false);
 | 
			
		||||
| 
						 | 
				
			
			@ -33,8 +33,7 @@ const useMinimumTokenThreshold = (config: any): void => {
 | 
			
		|||
 | 
			
		||||
        return (): void => clearInterval(interval);
 | 
			
		||||
    }, [loadMinimumTokenThreshold]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provides the superhero context to its children components.
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +48,7 @@ export const SuperheroProvider = ({ children, config }: any): any => {
 | 
			
		|||
    useEffect(() => {
 | 
			
		||||
        setCommunityBot({
 | 
			
		||||
            userId: config.community_bot_user_id,
 | 
			
		||||
            rawDisplayName: 'Community DAO Room Bot',
 | 
			
		||||
            rawDisplayName: "Community DAO Room Bot",
 | 
			
		||||
        });
 | 
			
		||||
    }, [setCommunityBot, config.community_bot_user_id]);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,21 +25,23 @@ export function useVerifiedRoom(room?: Room | IPublicRoomsChunkRoom): {
 | 
			
		|||
 | 
			
		||||
export const cleanRoomName = (roomName: string): string => {
 | 
			
		||||
    // remove # in the beginning
 | 
			
		||||
    let parsedName = roomName.startsWith('#') ? roomName.slice(1) : roomName;
 | 
			
		||||
    let parsedName = roomName.startsWith("#") ? roomName.slice(1) : roomName;
 | 
			
		||||
 | 
			
		||||
    // remove domain
 | 
			
		||||
    parsedName = parsedName.split(':')[0];
 | 
			
		||||
    parsedName = parsedName.split(":")[0];
 | 
			
		||||
 | 
			
		||||
    return parsedName;
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const isVerifiedRoom = (roomName: string): {
 | 
			
		||||
export const isVerifiedRoom = (
 | 
			
		||||
    roomName: string,
 | 
			
		||||
): {
 | 
			
		||||
    isTokenGatedRoom: boolean;
 | 
			
		||||
    isCommunityRoom: boolean;
 | 
			
		||||
} =>  {
 | 
			
		||||
} => {
 | 
			
		||||
    const parsedRoomName = cleanRoomName(roomName);
 | 
			
		||||
    return {
 | 
			
		||||
        isTokenGatedRoom: parsedRoomName.startsWith("[TG]"),
 | 
			
		||||
        isCommunityRoom: parsedRoomName.startsWith("$"),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue