پرتوپرتو

اطلاعات پروفایل (Profile Info)

نمایش اطلاعات پروفایل کاربر با آواتار، نام، یوزرنیم و اطلاعات اضافی

معرفی

کامپوننت Profile Info برای نمایش اطلاعات خلاصه پروفایل کاربر استفاده می‌شود. این کامپوننت شامل آواتار با حاشیه سفارشی، نام کاربر، نام کاربری (username)، اطلاعات اضافی (مثل زمان یا وضعیت) و دکمه اکشن است.

استفاده پایه

م

محسن یگانه

mohsene

۴:۲۱ ص
import { ProfileInfo } from '@parto-system-design/ui';

export default function MyComponent() {
  return (
    <ProfileInfo
      name="محسن یگانه"
      username="mohsene"
      avatarSrc="https://example.com/avatar.jpg"
      infoText="۴:۲۱ ص"
      infoIcon={<ClockIcon />}
      onActionClick={() => console.log('Action clicked')}
      onProfileClick={() => console.log('Profile clicked')}
    />
  );
}

مثال‌ها

اندازه‌های مختلف

کامپوننت در سه اندازه sm، md و lg موجود است.

ا

احمد رضایی

ahmad.rezaei

آنلاین
ف

فاطمه کریمی

fateme_karimi

۲ ساعت پیش
ع

علی محمدی

ali.m

دیروز
<ProfileInfo
  size="sm"
  name="احمد رضایی"
  username="ahmad.rezaei"
  avatarSrc="/avatar.jpg"
  infoText="آنلاین"
/>

<ProfileInfo
  size="md"
  name="فاطمه کریمی"
  username="fateme_karimi"
  avatarSrc="/avatar.jpg"
  infoText="۲ ساعت پیش"
/>

<ProfileInfo
  size="lg"
  name="علی محمدی"
  username="ali.m"
  avatarSrc="/avatar.jpg"
  infoText="دیروز"
/>

حالت‌های مختلف (Variants)

کامپوننت در سه variant موجود است: default، dark و transparent.

س

سارا احمدی

sara_ahmadi

آنلاین
ح

حسین رضایی

hosein.r

۱۰ دقیقه پیش
م

مریم جعفری

maryam_jafari

غیرفعال
<ProfileInfo
  variant="default"
  name="سارا احمدی"
  username="sara_ahmadi"
  infoText="آنلاین"
/>

<ProfileInfo
  variant="dark"
  name="حسین رضایی"
  username="hosein.r"
  infoText="۱۰ دقیقه پیش"
/>

<ProfileInfo
  variant="transparent"
  name="مریم جعفری"
  username="maryam_jafari"
  infoText="غیرفعال"
/>

تعاملی (Interactive)

می‌توانید با استفاده از onProfileClick و onActionClick رفتارهای سفارشی اضافه کنید.

ر

رضا کریمی

reza.karimi

آنلاین
ن

نیلوفر صالحی

niloofar_s

۵ دقیقه پیش
ا

امین احمدی

amin_a

۱ ساعت پیش
const [selected, setSelected] = React.useState<string | null>(null);

<ProfileInfo
  name="رضا کریمی"
  username="reza.karimi"
  avatarSrc="/avatar.jpg"
  infoText="آنلاین"
  onProfileClick={() => setSelected('reza')}
  onActionClick={() => console.log('Menu opened')}
  className={selected === 'reza' ? 'ring-2 ring-primary' : ''}
/>

بدون تصویر پروفایل

اگر تصویر پروفایل موجود نباشد، می‌توانید از initials استفاده کنید.

ک ج

کاربر جدید

new_user

تازه عضو شده
<ProfileInfo
  name="کاربر جدید"
  username="new_user"
  initials="ک ج"
  infoText="تازه عضو شده"
/>

Props

ProfileInfo

Prop

Type

مثال‌های کاربردی

لیست کاربران

const users = [
  {
    name: 'محسن یگانه',
    username: 'mohsene',
    avatarSrc: '/avatars/mohsen.jpg',
    status: 'آنلاین',
  },
  {
    name: 'علی احمدی',
    username: 'ali.a',
    avatarSrc: '/avatars/ali.jpg',
    status: '۲ ساعت پیش',
  },
  // ...
];

<div className="space-y-2" dir="rtl">
  {users.map((user) => (
    <ProfileInfo
      key={user.username}
      name={user.name}
      username={user.username}
      avatarSrc={user.avatarSrc}
      infoText={user.status}
      avatarBorderVariant="gold"
      onProfileClick={() => navigate(`/profile/${user.username}`)}
      onActionClick={() => openUserMenu(user)}
    />
  ))}
</div>

با منوی Dropdown

import { ProfileInfo } from '@parto-system-design/ui';
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@parto-system-design/ui';

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <div>
      <ProfileInfo
        name="محسن یگانه"
        username="mohsene"
        avatarSrc="/avatar.jpg"
        infoText="۴:۲۱ ص"
        infoIcon={<ClockIcon />}
      />
    </div>
  </DropdownMenuTrigger>
  <DropdownMenuContent align="end">
    <div dir="rtl">
      <DropdownMenuItem>مشاهده پروفایل</DropdownMenuItem>
      <DropdownMenuItem>ارسال پیام</DropdownMenuItem>
      <DropdownMenuItem>بلاک کردن</DropdownMenuItem>
    </div>
  </DropdownMenuContent>
</DropdownMenu>

در Sidebar

<Sidebar>
  <SidebarHeader>
    <ProfileInfo
      size="sm"
      variant="transparent"
      name="محسن یگانه"
      username="mohsene"
      avatarSrc="/avatar.jpg"
      infoText="آنلاین"
      avatarBorderVariant="primary"
      onProfileClick={() => navigate('/profile')}
      onActionClick={() => openSettings()}
    />
  </SidebarHeader>
  {/* ... */}
</Sidebar>

در Dialog یا Modal

<Dialog>
  <DialogContent>
    <div dir="rtl">
      <ProfileInfo
        size="lg"
        variant="transparent"
        name="محسن یگانه"
        username="mohsene"
        avatarSrc="/avatar.jpg"
        infoText="عضو از ۱۴۰۲"
        avatarBorderVariant="gold"
      />
      <div className="mt-4 space-y-2">
        <p>ایمیل: mohsen@example.com</p>
        <p>شماره تلفن: ۰۹۱۲۳۴۵۶۷۸۹</p>
      </div>
    </div>
  </DialogContent>
</Dialog>

نکات مهم

حاشیه آواتار

  • gold: حاشیه طلایی با گرادیانت (مشابه عکس نمونه) - مناسب برای نمایش پروفایل‌های ویژه یا برجسته
  • primary: حاشیه با رنگ اصلی برند - مناسب برای حالت انتخاب شده یا فعال
  • none: بدون حاشیه - حالت ساده و مینیمال

اندازه‌ها

  • sm: مناسب برای Sidebar، منوها و لیست‌های فشرده
  • md: اندازه پیش‌فرض، مناسب برای اکثر موارد استفاده
  • lg: مناسب برای صفحات پروفایل، Modal‌ها و نمایش جزئیات

RTL Support

کامپوننت به طور کامل از RTL پشتیبانی می‌کند. برای استفاده در محیط انگلیسی، dir="ltr" را به container اضافه کنید.

<div dir="ltr">
  <ProfileInfo
    name="Mohsen Yeganeh"
    username="mohsene"
    avatarSrc="/avatar.jpg"
    infoText="4:21 AM"
  />
</div>

Accessibility

  • کامپوننت از semantic HTML استفاده می‌کند
  • دکمه اکشن دارای aria-label است
  • برای بهبود دسترسی، می‌توانید aria-label سفارشی اضافه کنید
<ProfileInfo
  name="محسن یگانه"
  username="mohsene"
  aria-label="پروفایل محسن یگانه"
  // ...
/>

الهام‌گیری

این کامپوننت از رابط کاربری شبکه‌های اجتماعی مدرن مانند Instagram، Twitter و LinkedIn الهام گرفته شده است.