diff --git a/client-web/src/core/infrastructure/i18n.ts b/client-web/src/core/infrastructure/i18n.ts
index e962aa0..b1835df 100644
--- a/client-web/src/core/infrastructure/i18n.ts
+++ b/client-web/src/core/infrastructure/i18n.ts
@@ -98,6 +98,7 @@ const translations = {
sendError: 'Ошибка отправки',
// New chat
newChat: 'Новый чат',
+ add: 'Добавить',
menu: 'Меню',
// Date picker
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
@@ -384,6 +385,7 @@ const translations = {
fileBtn: 'File',
sendError: 'Send error',
newChat: 'New chat',
+ add: 'Add',
menu: 'Menu',
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
weekDays: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
diff --git a/client-web/src/core/presentation/components/ui/Avatar.tsx b/client-web/src/core/presentation/components/ui/Avatar.tsx
index a3a904b..44022ce 100644
--- a/client-web/src/core/presentation/components/ui/Avatar.tsx
+++ b/client-web/src/core/presentation/components/ui/Avatar.tsx
@@ -31,16 +31,16 @@ function AvatarInner({ src, name, size = 'md', className = '', online }: AvatarP
const gradientClass = generateAvatarColor(name || '');
return (
-
+
{src ? (

) : (
{initials}
diff --git a/client-web/src/core/presentation/layouts/GlobalNavBar.tsx b/client-web/src/core/presentation/layouts/GlobalNavBar.tsx
index a679437..76ee18b 100644
--- a/client-web/src/core/presentation/layouts/GlobalNavBar.tsx
+++ b/client-web/src/core/presentation/layouts/GlobalNavBar.tsx
@@ -45,10 +45,10 @@ export default function GlobalNavBar({ activeTab, onTabChange }: GlobalNavBarPro
-
+
diff --git a/client-web/src/core/presentation/layouts/SideMenu.tsx b/client-web/src/core/presentation/layouts/SideMenu.tsx
index 700aa0d..6b3dc68 100644
--- a/client-web/src/core/presentation/layouts/SideMenu.tsx
+++ b/client-web/src/core/presentation/layouts/SideMenu.tsx
@@ -40,6 +40,8 @@ import DatePicker from '../components/ui/DatePicker';
import TelegramImportModal from '../../../modules/users/presentation/components/TelegramImportModal';
import type { User as UserType, UserPresence, FriendRequest, FriendWithId } from '../../domain/types';
+import { getInitials } from '../../utils/utils';
+
type SideView = 'main' | 'profile' | 'settings' | 'about' | 'themes' | 'friends';
interface SideMenuProps {
@@ -135,12 +137,7 @@ export default function SideMenu({ isOpen, onClose, onOpenProfile }: SideMenuPro
onClose();
};
- const initials = (user?.displayName || user?.userName || user?.username || '??')
- .split(' ')
- .map((w: string) => w[0])
- .join('')
- .slice(0, 2)
- .toUpperCase();
+ const initials = getInitials(user?.displayName || user?.userName || user?.username || '??');
const menuItems = [
{ icon: User, label: t('myProfile'), onClick: () => { onClose(); onOpenProfile(); } },
@@ -173,12 +170,12 @@ export default function SideMenu({ isOpen, onClose, onOpenProfile }: SideMenuPro
{/* Avatar with glow ring */}
{ onClose(); onOpenProfile(); }}>
-
+
{user?.avatar ? (
-

+

) : (
-
+
{initials}
)}
@@ -518,10 +515,10 @@ export default function SideMenu({ isOpen, onClose, onOpenProfile }: SideMenuPro
{friendSearchResults.map((u) => (
{u.avatar ? (
-

+

) : (
-
- {(u.displayName || u.username || '?')[0].toUpperCase()}
+
+ {getInitials(u.displayName || u.username || '?')}
)}
@@ -553,10 +550,10 @@ export default function SideMenu({ isOpen, onClose, onOpenProfile }: SideMenuPro
{friendRequests.map((req) => (
{req.user.avatar ? (
-

+

) : (
-
- {(req.user.displayName || req.user.username || '?')[0].toUpperCase()}
+
+ {getInitials(req.user.displayName || req.user.username || '?')}
)}
@@ -598,10 +595,10 @@ export default function SideMenu({ isOpen, onClose, onOpenProfile }: SideMenuPro
{friend.avatar ? (
-

+

) : (
-
- {(friend.displayName || friend.username || '?')[0].toUpperCase()}
+
+ {getInitials(friend.displayName || friend.username || '?')}
)}
{friend.isOnline && (
diff --git a/client-web/src/core/presentation/layouts/Sidebar.tsx b/client-web/src/core/presentation/layouts/Sidebar.tsx
index 79ba782..13288cc 100644
--- a/client-web/src/core/presentation/layouts/Sidebar.tsx
+++ b/client-web/src/core/presentation/layouts/Sidebar.tsx
@@ -122,38 +122,44 @@ export default function Sidebar() {
- {/* Story circles */}
- {(storyGroups.length > 0 || true) && (
-
- {/* Add story circle */}
-
+ {/* Stories Section */}
+
+
+ {t('stories') || 'ИСТОРИИ'}
+
+
- {storyGroups.map((group, idx) => {
- const avatar = group.user.avatarUrl || group.user.avatar;
- const avatarUrl = avatar ? `${API_URL}${avatar}` : null;
- const isMine = group.user.id === user?.id;
- return (
-