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