Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fix_pmp_empty_displayname.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

fix the issue of empty displaynames of a persona, causing an empty fallback message, it will now ommit the fallback, if the name is empty or only consists of whitespace
42 changes: 23 additions & 19 deletions src/app/features/room/RoomInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -768,30 +768,34 @@ export const RoomInput = forwardRef<HTMLDivElement, RoomInputProps>(
const perMessageProfile = await getCurrentlyUsedPerMessageProfileForRoom(mx, roomId);

if (perMessageProfile) {
content['com.beeper.per_message_profile'] =
convertPerMessageProfileToBeeperFormat(perMessageProfile);
content['com.beeper.per_message_profile'] = convertPerMessageProfileToBeeperFormat(
perMessageProfile,
perMessageProfile.name.trim() !== ''
);

// if a per-message profile is used, it must per spec include a fallback
const prefix = `${perMessageProfile.name}: `;
if (perMessageProfile.name.trim() !== '') {
// if a per-message profile is used, it must per spec include a fallback
const prefix = `${perMessageProfile.name}: `;

if (!content.body.startsWith(prefix)) {
// to prevent double-prefixing when the fallback is already present
content.body = prefix + content.body;
}
if (!content.body.startsWith(prefix)) {
// to prevent double-prefixing when the fallback is already present
content.body = prefix + content.body;
}

/**
* html escaped version of the display name
*/
const escapedName = sanitizeCustomHtml(perMessageProfile.name);
/**
* html escaped version of the display name
*/
const escapedName = sanitizeCustomHtml(perMessageProfile.name);

const htmlPrefix = `<strong data-mx-profile-fallback>${escapedName}: </strong>`;
const htmlPrefix = `<strong data-mx-profile-fallback>${escapedName}: </strong>`;

if (content.formatted_body && !content.formatted_body.startsWith(htmlPrefix)) {
content.formatted_body = htmlPrefix + content.formatted_body;
} else {
// we don't have a formatted body, but we need one
content.format = 'org.matrix.custom.html';
content.formatted_body = `${htmlPrefix}${plainText}`;
if (content.formatted_body && !content.formatted_body.startsWith(htmlPrefix)) {
content.formatted_body = htmlPrefix + content.formatted_body;
} else {
// we don't have a formatted body, but we need one
content.format = 'org.matrix.custom.html';
content.formatted_body = `${htmlPrefix}${plainText}`;
}
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/app/features/room/message/Message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,9 @@ function MessageInternal(

/**
* boolean to indicate wheather we should indicate to the user that it is a pmp
* We want to not show it, when the name is unset, or whitespace only
*/
const showPmPInfo = pmp !== undefined;
const showPmPInfo = parsedPMPContent?.name && parsedPMPContent.name?.trim() !== '';
// Profiles and Colors
const profile = useUserProfile(senderId, room);
const { color: usernameColor, font: usernameFont } = useSableCosmetics(senderId, room);
Expand Down
20 changes: 14 additions & 6 deletions src/app/hooks/usePerMessageProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export type PerMessageProfileBeeperFormat = {
/**
* the display name to use for messages using this profile. This is required because otherwise the profile would have no effect on the message.
*/
displayname: string;
displayname?: string;
/**
* the avatar url to use for messages using this profile.
* Beeper expects this to be a mxc url.
Expand All @@ -50,7 +50,7 @@ export type PerMessageProfileBeeperFormat = {
* using the unstable prefix for pronouns, under which it is also stored in profiles
*/
'io.fsky.nyx.pronouns'?: PronounSet[];
has_fallback: boolean;
has_fallback?: boolean;
};

/**
Expand All @@ -61,15 +61,23 @@ export type PerMessageProfileBeeperFormat = {
* @return {*} {PerMessageProfileBeeperFormat} the per message profile in Beeper's format, which can be applied to a message before sending it
*/
export function convertPerMessageProfileToBeeperFormat(
profile: PerMessageProfile
profile: PerMessageProfile,
has_fallback: boolean
): PerMessageProfileBeeperFormat {
return {
const beeperPMP: PerMessageProfileBeeperFormat = {
id: profile.id,
displayname: profile.name,
avatar_url: profile.avatarUrl,
'io.fsky.nyx.pronouns': profile.pronouns,
has_fallback: true,
has_fallback,
};
// delete empty fields
// to-do maybe find a better way of doing it
if (!profile.name || profile?.name.trim().length === 0) delete beeperPMP.displayname;
if (!profile.avatarUrl) delete beeperPMP.avatar_url;
if (!profile.pronouns || profile.pronouns?.length === 0) delete beeperPMP['io.fsky.nyx.pronouns'];
if (!has_fallback) delete beeperPMP.has_fallback;
return beeperPMP;
}

/**
Expand All @@ -85,7 +93,7 @@ export function convertBeeperFormatToOurPerMessageProfile(
): PerMessageProfile {
return {
id: beeperProfile.id,
name: beeperProfile.displayname,
name: beeperProfile.displayname ?? '',
avatarUrl: beeperProfile.avatar_url,
pronouns: beeperProfile['io.fsky.nyx.pronouns'],
};
Expand Down
Loading