fix(pc-client,account-service): B-61 试用前小修 - 头像取首字/群头像拼格/近似灰Token收敛/重置密码踢下线,构建 v1.0.1 安装包

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
编码工程师
2026-08-16 01:07:53 +08:00
co-authored by multica-agent
parent 2fe8417900
commit 4cf1d4120a
19 changed files with 194 additions and 43 deletions
+30 -2
View File
@@ -8,12 +8,12 @@ import { avatarList, getDefaultAvatar } from "@/utils/avatar";
const default_avatars = avatarList.map((item) => item.name);
// 头像文字:两个字以内原样显示;中文名取最后一个字,其他取首字母
// 头像文字:与手机端一致,中文名取首字(王志远→王);非中文取首字母大写
const getDisplayText = (text?: string) => {
if (!text) return text;
const trimmed = text.trim();
if (trimmed.length <= 2) return trimmed;
if (/^[一-龥]/.test(trimmed)) return trimmed.slice(-1);
if (/^[一-龥]/.test(trimmed)) return trimmed[0];
return trimmed[0].toUpperCase();
};
@@ -62,6 +62,34 @@ const OIMAvatar: React.FC<IOIMAvatarProps> = (props) => {
}
};
// 群头像:与手机端一致,无真实头像(或加载失败)时用 2x2 蓝灰拼格(浅灰底 + 蓝/灰蓝交替小方块)
const showGroupGrid = isgroup && (!src || errorHolder === default_group);
if (showGroupGrid) {
const cell = (size - 10) / 2;
const gridColors = ["var(--primary)", "var(--avatar-gray)", "var(--avatar-gray)", "var(--primary)"];
return (
<div
className={props.className}
onClick={props.onClick}
style={{
width: `${size}px`,
height: `${size}px`,
backgroundColor: "var(--search-bg)",
borderRadius: `${Math.round(size * 0.18)}px`,
padding: "2px",
display: "grid",
gridTemplateColumns: `${cell}px ${cell}px`,
gridTemplateRows: `${cell}px ${cell}px`,
gap: "2px",
}}
>
{gridColors.map((c, i) => (
<div key={i} style={{ backgroundColor: c, borderRadius: "2px" }} />
))}
</div>
);
}
return (
<AntdAvatar
style={{
+1 -1
View File
@@ -1,4 +1,4 @@
export const APP_NAME = "畅联";
export const APP_VERSION = "v1.0.0";
export const APP_VERSION = "v1.0.1";
export const SDK_VERSION = "SDK(ffi) v3.8.3";
export const isSaveLog = process.env.NODE_ENV !== "development";
@@ -55,7 +55,7 @@ const ConversationItem = ({ isActive, conversation }: IConversationProps) => {
className={clsx(
styles["conversation-item"],
"border border-transparent",
isActive ? `bg-[var(--primary-active)]` : "hover:bg-[#F3F5F7]",
isActive ? `bg-[var(--primary-active)]` : "hover:bg-[var(--chat-bg)]",
)}
onClick={toSpecifiedConversation}
>
@@ -152,7 +152,7 @@ const ConversationSider = () => {
<div className="app-drag px-4 pt-4">
<div className="pb-3 text-base font-bold">{t("placeholder.chat")}</div>
<Input
className="app-no-drag mb-2 rounded-md border-none !bg-[#F3F5F7]"
className="app-no-drag mb-2 rounded-md border-none !bg-[var(--chat-bg)]"
prefix={<SearchOutlined className="text-[var(--sub-text)]" rev={undefined} />}
placeholder={t("placeholder.search")}
allowClear
+1 -1
View File
@@ -5,7 +5,7 @@ export const EmptyChat = () => {
const { t } = useTranslation();
return (
<Layout className="no-mobile flex items-center justify-center !bg-[#F3F5F7]">
<Layout className="no-mobile flex items-center justify-center !bg-[var(--chat-bg)]">
<div className="flex flex-col items-center">
<div className="flex h-16 w-16 items-center justify-center rounded-2xl bg-[var(--primary)]">
<svg width="34" height="34" viewBox="0 0 24 24" fill="none">
@@ -141,7 +141,7 @@ const ChatContent = () => {
return (
<Layout.Content
className="relative flex h-full overflow-hidden !bg-[#F3F5F7]"
className="relative flex h-full overflow-hidden !bg-[var(--chat-bg)]"
id="chat-main"
>
{renderBody()}
@@ -185,7 +185,7 @@ const ChatFooter: ForwardRefRenderFunction<unknown, unknown> = (_, ref) => {
{/* 录音条 */}
{recording && (
<div className="mx-4 mt-2 flex items-center rounded-md bg-[#F3F5F7] px-3 py-2">
<div className="mx-4 mt-2 flex items-center rounded-md bg-[var(--chat-bg)] px-3 py-2">
<span className="mr-2 h-2 w-2 animate-pulse rounded-full bg-[var(--warn-text)]" />
<span className="flex-1 text-sm">
{t("placeholder.microphone")} {seconds}
@@ -1,4 +1,4 @@
import { RightOutlined } from "@ant-design/icons";
import { RightOutlined } from "@ant-design/icons";
import { Button, Divider, Upload } from "antd";
import clsx from "clsx";
import { t } from "i18next";
@@ -97,7 +97,7 @@ const GroupSettings = ({
</div>
</div>
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
{currentGroupInfo && isJoinGroup && (
<GroupMemberRow
currentGroupInfo={currentGroupInfo}
@@ -105,9 +105,9 @@ const GroupSettings = ({
updateTravel={updateTravel}
/>
)}
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
<SettingRow className="pb-2" title={`${t("placeholder.group")}ID`}>
<div className="flex items-center">
<span className="mr-1 text-xs text-[var(--sub-text)]">
@@ -131,11 +131,11 @@ const GroupSettings = ({
</span>
</SettingRow>
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
{isOwner && (
<>
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
<SettingRow
className="cursor-pointer"
title={t("placeholder.transferGroup")}
@@ -1,4 +1,4 @@
import { RightOutlined } from "@ant-design/icons";
import { RightOutlined } from "@ant-design/icons";
import { Button, Divider, Drawer } from "antd";
import { t } from "i18next";
import { forwardRef, ForwardRefRenderFunction, memo } from "react";
@@ -110,13 +110,13 @@ const SingleSetting: ForwardRefRenderFunction<OverlayVisibleHandle, unknown> = (
</div>
<RightOutlined rev={undefined} />
</div>
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
<SettingRow
title={t("placeholder.moveBlacklist")}
value={isBlack}
tryChange={updateBlack}
/>
<Divider className="m-0 border-4 border-[#F4F5F7]" />
<Divider className="m-0 border-4 border-[var(--chat-bg)]" />
<div className="flex-1" />
{isFriend && (
@@ -153,7 +153,7 @@ const GroupCardModal: ForwardRefRenderFunction<
</div>
</div>
) : (
<div className="bg-[#F2F8FF] p-5.5">
<div className="bg-[var(--call-wait-bg)] p-5.5">
<div className="mb-3">{`${t("placeholder.groupMember")}${
groupData?.memberCount
}`}</div>
@@ -87,7 +87,7 @@ export const RtcLayout = ({
<div
className={clsx(
"flex h-full flex-col items-center justify-between bg-[#262729]",
{ "!bg-[#F2F8FF]": isWaiting },
{ "!bg-[var(--call-wait-bg)]": isWaiting },
)}
>
{renderContent()}
+1 -1
View File
@@ -91,7 +91,7 @@ const ContactSider = () => {
"mx-2 flex cursor-pointer items-center rounded-lg px-3 py-2.5 text-sm",
index === selectIndex
? "bg-[var(--primary-active)]"
: "hover:bg-[#F3F5F7]",
: "hover:bg-[var(--chat-bg)]",
)}
onClick={() => {
setSelectIndex(index);
+4
View File
@@ -11,6 +11,10 @@
--warn-text: #f53f3f;
--moment-text: #6085b1;
--searchbar-height: 2.5rem;
--avatar-gray: #8593a8;
--search-bg: #f2f3f5;
--chat-bg: #f5f6f8;
--call-wait-bg: #f2f8ff;
}
@media only screen and (max-width: 600px) {