diff --git a/web/src/api/media.ts b/web/src/api/media.ts index d6f12d3..8fae262 100644 --- a/web/src/api/media.ts +++ b/web/src/api/media.ts @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { parseMXC } from "@/util/validation.ts" +import { isPhoneNumber, parseMXC } from "@/util/validation.ts" import { ContentURI, RoomID, UserID, UserProfile } from "./types" export const getMediaURL = (mxc?: string, encrypted: boolean = false): string | undefined => { @@ -74,6 +74,11 @@ function getFallbackCharacter(from: unknown, idx: number): string { if (!from || typeof from !== "string" || from.length <= idx) { return "" } + + if (isPhoneNumber(from)) { + return "#" + } + // Array.from appears to be the only way to handle Unicode correctly return Array.from(from.slice(0, (idx + 1) * 2))[idx]?.toUpperCase().toWellFormed() ?? "" } diff --git a/web/src/util/validation.ts b/web/src/util/validation.ts index db5933a..b942c7d 100644 --- a/web/src/util/validation.ts +++ b/web/src/util/validation.ts @@ -17,6 +17,7 @@ import { ContentURI, EventID, RoomAlias, RoomID, UserID, UserProfile } from "@/a const simpleHomeserverRegex = /^[a-zA-Z0-9.:-]+$/ const mediaRegex = /^mxc:\/\/([a-zA-Z0-9.:-]+)\/([a-zA-Z0-9_-]+)$/ +const phoneNumberRegex = /^(?:(?:\+\d{1,4}[-.\s]?)?(?:\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}|\d{5,10})|\d{4,6})$/ function isIdentifier(identifier: unknown, sigil: string, requiresServer: boolean): identifier is T { if (typeof identifier !== "string" || !identifier.startsWith(sigil)) { @@ -38,6 +39,7 @@ export const isUserID = (userID: unknown) => isIdentifier(userID, "@", t export const isRoomID = (roomID: unknown) => isIdentifier(roomID, "!", true) export const isRoomAlias = (roomAlias: unknown) => isIdentifier(roomAlias, "#", true) export const isMXC = (mxc: unknown): mxc is ContentURI => typeof mxc === "string" && mediaRegex.test(mxc) +export const isPhoneNumber = (phone: unknown): boolean => typeof phone === "string" && phoneNumberRegex.test(phone) export interface ParsedMatrixURI { identifier: UserID | RoomID | RoomAlias