A plain blocklist for names like @support - separate from the collectible
system, so a reservation has no owner, no price and no "bought on Fragment"
badge.
- reserved_usernames table + migration.
- Enforced in replacePeerUsernameTx (the single editable-username write point:
account.updateUsername, channels.updateUsername, @BotFather /setusername) and
in the collectible mint path; a reserved name returns USERNAME_OCCUPIED.
- admin.Service: ReserveUsername / UnreserveUsername (journalled commands) and
the ReservedUsernames listing.
- adminapi: /v1/reserved-usernames{,/reserve,/unreserve}.
- telesrv-admin panel + a "Reserved Usernames" page in the web UI (dist rebuilt).
- Postgres and in-memory store implementations; the memory registry gains an
optional reserved-name check so tests exercise the same rule.
37 lines
1.7 KiB
TypeScript
37 lines
1.7 KiB
TypeScript
export type Navigate = (href: string) => void;
|
|
|
|
export type RouteState = {
|
|
href: string;
|
|
path: string;
|
|
search: URLSearchParams;
|
|
};
|
|
|
|
export function currentRoute(): RouteState {
|
|
return {
|
|
href: `${window.location.pathname}${window.location.search}`,
|
|
path: window.location.pathname,
|
|
search: new URLSearchParams(window.location.search)
|
|
};
|
|
}
|
|
|
|
export function routeTitle(pathname: string): string {
|
|
// Third-party verification is tested before the official section and before
|
|
// "/bots": three different prefixes that all read as "verification of a bot".
|
|
if (pathname.startsWith("/bot-verification")) return "Third-party verification";
|
|
if (pathname.startsWith("/verification")) return "Official Verification";
|
|
if (pathname.startsWith("/collectible-usernames")) return "Collectible Usernames";
|
|
if (pathname.startsWith("/reserved-usernames")) return "Reserved Usernames";
|
|
if (pathname.startsWith("/storage")) return "Storage";
|
|
if (pathname.startsWith("/accounts/shared-devices")) return "Shared Devices";
|
|
if (pathname.startsWith("/accounts")) return "Accounts";
|
|
if (pathname.startsWith("/channels")) return "Supergroups and Channels";
|
|
if (pathname.startsWith("/bots")) return "Bots";
|
|
if (pathname.startsWith("/moderation")) return "Reports and Moderation";
|
|
if (pathname.startsWith("/broadcasts")) return "Broadcasts";
|
|
if (pathname.startsWith("/emoji")) return "Emoji";
|
|
if (pathname.startsWith("/messages")) return "Message Audit";
|
|
if (pathname.startsWith("/stickers")) return "Stickers";
|
|
if (pathname.startsWith("/gif-catalog")) return "GIFs";
|
|
if (pathname.startsWith("/server-settings")) return "Server Settings";
|
|
return "Operations Console";
|
|
}
|