🐛 fix(vk): марка ВКонтакте вместо чужого значка в ленте и карточке

Канал ВКонтакте появился, а марки у него не было: в ленте диалогов и в
карточке контакта рисовался общий пузырь сообщения, а в строке логина —
значок отправки, который для Telegram выглядел уместно только по
совпадению. Клиент из ВКонтакте выглядел пришедшим непонятно откуда.

Теперь `ChannelGlyph` знает ВКонтакте и отдаёт тот же официальный
монохромный глиф, что стоит на плитке подключения, а строка логина берёт
марку своего канала вместо общего значка: Telegram, MAX и ВКонтакте —
каждый свой.

Проверено: глифы на 13-18px в тёмной теме рядом с Telegram и MAX, лента
диалогов, строка логина и плитки каналов в карточке контакта; tsc.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
AndreyandClaude Opus 5 committed 2026-09-17 11:38:40 +03:00
1 parent d34aea8a8a
commit ca23cd285f
2 files changed
+11 -7

No files matched your search

@@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import { useEffect, useState, type ReactNode } from "react";
import { ChannelGlyph } from "../../../../shared/badges";
import { Icon } from "../../../../shared/icons";
import { CopyButton } from "../../../../shared/ui-controls";
import { providerMeta } from "../../../../shared/providers";
@@ -73,10 +74,12 @@ export function ClientContext({
}
}
const fields: Array<{ key: string; icon: Parameters<typeof Icon>[0]["name"]; text: string; copy?: string; muted?: boolean }> = [];
// Логин показывается маркой своего канала: общий значок отправки годился,
// пока каналов с логином было два, и врал уже на третьем.
const fields: Array<{ key: string; icon: Parameters<typeof Icon>[0]["name"]; glyph?: ReactNode; text: string; copy?: string; muted?: boolean }> = [];
if (phone) fields.push({ key: "phone", icon: "phone", text: phone, copy: phone });
if (dialog.channel === "EMAIL" && email) fields.push({ key: "email", icon: "mail", text: email, copy: email });
if (username) fields.push({ key: "username", icon: "send", text: `@${username} · ${channel.label}`, copy: `@${username}` });
if (username) fields.push({ key: "username", icon: "send", glyph: <ChannelGlyph provider={dialog.channel} size={15} />, text: `@${username} · ${channel.label}`, copy: `@${username}` });
if (isGuest) fields.push({ key: "guest", icon: "message", text: t("sales.anonymous_session", { channel: channel.label, connection: detail?.connection?.name ?? t("sales.widget") }), muted: true });
if (fields.length === 0 && detail?.connection) fields.push({ key: "connection", icon: "plug", text: `${channel.label} · ${detail.connection.name}`, muted: true });
// Компания и город — из карточки контакта (решение 5), без «копировать».
@@ -109,7 +112,7 @@ export function ClientContext({
<div className="ctx-contact-fields">
{fields.map((field) => (
<div className={`ctx-contact-field ${field.muted ? "is-muted" : ""}`} key={field.key}>
<span><Icon name={field.icon} size={15} /></span>
<span>{field.glyph ?? <Icon name={field.icon} size={15} />}</span>
<span>{field.text}</span>
{field.copy && <CopyButton value={field.copy} />}
</div>
+4 -3
View File
@@ -1,12 +1,13 @@
import { Icon, MaxLogo, TelegramLogo } from "./icons";
import { Icon, MaxLogo, TelegramLogo, VkLogo } from "./icons";
import { providerKey } from "./providers";
/** Иконка канала без подложки (дизайн-базлайн v2, решение 4): Telegram/MAX —
* фирменные глифы, Email/Web — линейные. */
/** Иконка канала без подложки (дизайн-базлайн v2, решение 4): Telegram, MAX и
* ВКонтакте — фирменные глифы, Email/Web — линейные. */
export function ChannelGlyph({ provider, size = 13 }: { provider: string; size?: number }) {
const key = providerKey(provider);
if (key === "TG") return <TelegramLogo size={size} />;
if (key === "MAX") return <MaxLogo size={size} />;
if (key === "VK") return <VkLogo size={size} />;
if (key === "EMAIL") return <Icon name="mail" size={size} />;
return <Icon name="message" size={size} />;
}