From e8ae3b08f899d4efd7963ed9e5137f2bbb0b2af8 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Fri, 8 May 2026 19:06:26 +0300 Subject: [PATCH] =?UTF-8?q?UI=20-=20=D0=9B=D0=90=D0=A3=D0=9D=D0=A7=D0=95?= =?UTF-8?q?=D0=A0:=20=D0=9A=D0=A0=D0=A3=D0=93=D0=9B=D0=AB=D0=95=20=D0=90?= =?UTF-8?q?=D0=92=D0=90=D0=A2=D0=90=D0=A0=D0=AB=20=D0=9A=D0=9B=D0=98=D0=95?= =?UTF-8?q?=D0=9D=D0=A2=D0=9E=D0=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/globals.css | 18 ++++++++++--- src/widgets/admin-overlay/AdminOverlay.tsx | 30 +++++++++++++++++++--- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/styles/globals.css b/src/styles/globals.css index 524fb57..747cb94 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -411,20 +411,25 @@ code { position: relative; display: flex; width: 3rem; + min-width: 3rem; + max-width: 3rem; height: 3rem; + min-height: 3rem; + max-height: 3rem; + flex: 0 0 3rem; + aspect-ratio: 1; align-items: center; justify-content: center; overflow: hidden; border: 0; border-radius: 999px; - background: rgba(255, 255, 255, 0.04); - backdrop-filter: blur(18px); - -webkit-backdrop-filter: blur(18px); + background: transparent; + padding: 0; transition: background-color 160ms ease; } .nodedc-expanded-workspace-button:hover { - background: rgba(255, 255, 255, 0.07); + background: transparent; } .nodedc-expanded-workspace-button select, @@ -450,6 +455,7 @@ code { } .nodedc-expanded-workspace-avatar { + display: block; width: 100%; height: 100%; border-radius: inherit; @@ -3053,7 +3059,10 @@ code { .client-avatar-preview { display: grid; width: 3.1rem; + min-width: 3.1rem; height: 3.1rem; + min-height: 3.1rem; + aspect-ratio: 1; place-items: center; overflow: hidden; border-radius: var(--launcher-radius-circle); @@ -3061,6 +3070,7 @@ code { } .client-avatar-preview img { + display: block; width: 100%; height: 100%; border-radius: inherit; diff --git a/src/widgets/admin-overlay/AdminOverlay.tsx b/src/widgets/admin-overlay/AdminOverlay.tsx index e175810..4214645 100644 --- a/src/widgets/admin-overlay/AdminOverlay.tsx +++ b/src/widgets/admin-overlay/AdminOverlay.tsx @@ -1705,6 +1705,7 @@ function ClientEditorModal({ canDelete: boolean; }) { const [draft, setDraft] = useState(client); + const [avatarPreviewUrl, setAvatarPreviewUrl] = useState(client.avatarUrl ?? null); const [uploadingAvatar, setUploadingAvatar] = useState(false); const [storageError, setStorageError] = useState(null); const taskManagerWorkspaceBindings = getClientTaskManagerWorkspaces(draft); @@ -1713,10 +1714,19 @@ function ClientEditorModal({ useEffect(() => { setDraft(client); + setAvatarPreviewUrl(client.avatarUrl ?? null); setUploadingAvatar(false); setStorageError(null); }, [client]); + useEffect(() => { + return () => { + if (avatarPreviewUrl?.startsWith("blob:")) { + URL.revokeObjectURL(avatarPreviewUrl); + } + }; + }, [avatarPreviewUrl]); + function update(key: K, value: Client[K]) { setDraft((current) => ({ ...current, [key]: value })); } @@ -1765,14 +1775,18 @@ function ClientEditorModal({ async function handleAvatarUpload(file?: File) { if (!file) return; + const localPreviewUrl = URL.createObjectURL(file); + setAvatarPreviewUrl(localPreviewUrl); setUploadingAvatar(true); setStorageError(null); try { const storedFile = await uploadStorageFile(file); update("avatarUrl", storedFile.url); + setAvatarPreviewUrl(storedFile.url); } catch (error) { setStorageError(error instanceof Error ? error.message : "Не удалось сохранить аватар компании"); + setAvatarPreviewUrl(draft.avatarUrl ?? null); } finally { setUploadingAvatar(false); } @@ -1829,10 +1843,10 @@ function ClientEditorModal({ Аватар компании
- {draft.avatarUrl ? "Аватар подключён" : "Аватар не задан"} + {avatarPreviewUrl ? "Аватар подключён" : "Аватар не задан"} Показывается в верхнем переключателе компании.
- {draft.avatarUrl ? ( - ) : null}