پرتوپرتو

پست اینستاگرام

کامپوننت نمایش پست اینستاگرام با دو حالت عمودی و افقی

معرفی

کامپوننت InstagramPost برای نمایش پست‌های اینستاگرام با دو حالت مختلف استفاده می‌شود:

  • حالت عمودی (Vertical): طراحی کاملاً مشابه اپ اینستاگرام که همیشه در حالت LTR نمایش داده می‌شود
  • حالت افقی (Horizontal): یک کارت افقی که برای نمایش در لیست‌ها و صفحات مناسب است

چه زمانی استفاده کنیم:

  • برای نمایش پیش‌نمایش پست اینستاگرام در داشبورد social listening
  • برای لیست پست‌های اینستاگرامی یک اینفلوئنسر
  • وقتی نیاز به نمایش آمار پست (لایک، کامنت، بازدید) در کنار محتوا دارید

چه زمانی استفاده نکنیم:

  • برای نمایش پست‌های پلتفرم‌های دیگر — InstagramPost مخصوص اینستاگرام است
  • برای embed واقعی — این کامپوننت یک replica UI است، نه embed

استفاده

حالت عمودی (Vertical)

P
partodata
Parto Data
Post media
123.5Klikes
1.2Kcomments
56.8Kviews
890shares
عکسphoto

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن می‌تواند تا 2200 کاراکتر باشد و شامل هشتگ‌ها و منشن‌های مختلف است. در این پست می‌توانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین می‌توانید ببینید که چگونه هشتگ‌ها و منشن‌ها به صورت خودکار استایل می‌شوند و قابل کلیک هستند. این ویژگی باعث می‌شود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند.

همین الان

حالت افقی (Horizontal)

Post media
P
partodata
Parto Data
123.5Klikes
1.2Kcomments
56.8Kviews
890shares
عکسphoto

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن می‌تواند تا 2200 کاراکتر باشد و شامل هشتگ‌ها و منشن‌های مختلف است. در این پست می‌توانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین می‌توانید ببینید که چگونه هشتگ‌ها و منشن‌ها به صورت خودکار استایل می‌شوند و قابل کلیک هستند. این ویژگی باعث می‌شود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند.

همین الان
import { InstagramPost } from '@parto-system-design/ui';

// حالت عمودی
<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'image',
      url: '/path/to/image.jpg',
      aspectRatio: '1:1',
    },
  ]}
  postType="image"
  caption="این یک پست نمونه است با #هشتگ و @منشن"
  profile={{
    username: 'partodata',
    fullName: 'Parto Data',
    avatarUrl: 'https://example.com/profile-picture.jpg', // لینک عکس پروفایل
  }}
  stats={{
    likes: 123456,
    comments: 1234,
    views: 56789,
    shares: 890,
  }}
  publishTime={new Date()}
/>

// حالت افقی
<InstagramPost
  variant="horizontal"
  media={[
    {
      type: 'image',
      url: '/path/to/image.jpg',
      aspectRatio: '1:1',
    },
  ]}
  postType="image"
  caption="این یک پست نمونه است با #هشتگ و @منشن"
  profile={{
    username: 'partodata',
    fullName: 'Parto Data',
  }}
  stats={{
    likes: 123456,
    comments: 1234,
    views: 56789,
    shares: 890,
  }}
  publishTime={new Date()}
/>

Playground

در playground زیر می‌توانید هر دو حالت را مشاهده کرده و تنظیمات مختلف را تست کنید:

حالت عمودی (Vertical)

P
partodata
Parto Data

رسانه‌ای موجود نیست

123,456likes
1,234comments
56,789views
890shares
عکسphoto

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن می‌تواند تا 2200 کاراکتر باشد و شامل هشتگ‌ها و منشن‌های مختلف است. در این پست می‌توانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین می‌توانید ببینید که چگونه هشتگ‌ها و منشن‌ها به صورت خودکار استایل می‌شوند و قابل کلیک هستند. این ویژگی باعث می‌شود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند. می‌توانید از این کامپوننت برای نمایش پست‌های اینستاگرام در اپلیکیشن خود استفاده کنید.

حالت افقی (Horizontal)

رسانه‌ای موجود نیست

P
partodata
Parto Data
123,456likes
1,234comments
56,789views
890shares
عکسphoto

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن می‌تواند تا 2200 کاراکتر باشد و شامل هشتگ‌ها و منشن‌های مختلف است. در این پست می‌توانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین می‌توانید ببینید که چگونه هشتگ‌ها و منشن‌ها به صورت خودکار استایل می‌شوند و قابل کلیک هستند. این ویژگی باعث می‌شود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند. می‌توانید از این کامپوننت برای نمایش پست‌های اینستاگرام در اپلیکیشن خود استفاده کنید.

تنظیمات اصلی

تنظیمات آمار، زمان و اکشن

غیرفعال کردن دکمه‌ها به صورت جداگانه (hover روی کارت برای مشاهده)

ابعاد استاندارد تصویر اینستاگرام

کامپوننت از استانداردهای ابعادی اینستاگرام پیروی می‌کند:

نوعنسبت ابعادتوضیح
عمودی (Portrait)4:5استاندارد اصلی اینستاگرام (1080×1350px)
مربعی (Square)1:1(1080×1080px)
افقی (Landscape)1.91:1 ≈ 16:9(1080×566px)

نکته: اگر aspectRatio برابر 9:16 یا 4:5 باشد، کامپوننت به صورت خودکار از نسبت 4:5 (استاندارد پرتریت اینستاگرام) استفاده می‌کند و تصویر با object-contain نمایش داده می‌شود تا کراپ نشود.

انواع مدیا

تصویر عمودی (Portrait) - استاندارد اینستاگرام

<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'image',
      url: '/instagram-posts/images/portrait.jpg',
      aspectRatio: '4:5', // استاندارد اینستاگرام برای پست عمودی
    },
  ]}
  postType="image"
  caption="پست با تصویر عمودی (4:5) - مشابه اینستاگرام"
/>

تصویر مربعی

<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'image',
      url: '/instagram-posts/images/image 1x1.png',
      aspectRatio: '1:1',
    },
  ]}
  postType="image"
  caption="پست با تصویر مربعی"
/>

ویدیو

<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'video',
      url: '/instagram-posts/images/image 16x9.png',
      aspectRatio: '16:9',
    },
  ]}
  postType="video"
  caption="پست با ویدیو"
/>

کاروسل

<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'image',
      url: '/instagram-posts/images/image 1x1.png',
      aspectRatio: '1:1',
    },
    {
      type: 'image',
      url: '/instagram-posts/images/image 9x16.png',
      aspectRatio: '9:16',
    },
    {
      type: 'video',
      url: '/instagram-posts/images/image 16x9.png',
      aspectRatio: '16:9',
    },
  ]}
  mediaType="carousel"
  postType="carousel"
  caption="پست با کاروسل"
/>

بدون مدیا (Placeholder)

<InstagramPost variant="vertical" caption="پست بدون مدیا" placeholderText="No media available" />

پروفایل

برای نمایش عکس پروفایل کاربر، می‌توانید از avatarUrl یا profilePicture استفاده کنید:

<InstagramPost
  variant="vertical"
  profile={{
    username: 'partodata',
    fullName: 'Parto Data',
    avatarUrl: '/path/to/profile-picture.jpg', // روش اول: استفاده از avatarUrl
    // یا
    profilePicture: '/path/to/profile-picture.jpg', // روش دوم: استفاده از profilePicture
  }}
  media={[...]}
/>

نکات مهم:

  • اگر avatarUrl یا profilePicture مشخص نشود، از حرف اول username به عنوان fallback استفاده می‌شود
  • می‌توانید از prop avatarUrl در سطح کامپوننت هم استفاده کنید که اولویت بالاتری دارد
  • عکس پروفایل به صورت دایره‌ای نمایش داده می‌شود

مثال با عکس پروفایل

<InstagramPost
  variant="vertical"
  profile={{
    username: 'partodata',
    fullName: 'Parto Data',
    avatarUrl: 'https://example.com/avatar.jpg',
  }}
  media={[...]}
/>

مثال بدون عکس پروفایل

<InstagramPost
  variant="vertical"
  profile={{
    username: 'partodata',
    fullName: 'Parto Data',
    // بدون avatarUrl یا profilePicture
  }}
  media={[...]}
/>

کپشن

کپشن می‌تواند شامل هشتگ‌ها و منشن‌ها باشد که به صورت خودکار پارس و استایل می‌شوند:

<InstagramPost
  variant="vertical"
  caption="این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت"
  media={[...]}
/>
  • در حالت عمودی: کپشن به صورت پیش‌فرض کوتاه می‌شود و با کلیک روی "more" می‌توان آن را کامل مشاهده کرد
  • در حالت افقی: کپشن به صورت خودکار به 4 خط محدود می‌شود

آمار پست

<InstagramPost
  variant="vertical"
  stats={{
    likes: 123456,
    comments: 1234,
    views: 56789,
    shares: 890,
  }}
  numberFormat="short" // یا 'exact'
  showLikes={true}
  showComments={true}
  showViews={true}
  showShares={true}
/>

فرمت عدد

  • exact: نمایش دقیق با جداکننده (مثل 123,456)
  • short: نمایش کوتاه اینستاگرامی (مثل 123K, 2.4M)

نوع پست

با استفاده از prop postType می‌توانید نوع پست را مشخص کنید. نوع پست با آیکون مرتبط بعد از تعداد اشتراک نمایش داده می‌شود:

<InstagramPost
  variant="vertical"
  media={[...]}
  postType="image"
  stats={{
    likes: 123456,
    comments: 1234,
    views: 56789,
    shares: 890,
  }}
/>

مقادیر postType

  • "image": عکس (Photo) - با آیکون Image
  • "video": ویدیو (Video) - با آیکون Video
  • "carousel": اسلاید (Carousel/Slide) - با آیکون Images

مثال‌های استفاده

// پست عکس
<InstagramPost
  postType="image"
  media={[{ type: 'image', url: '...' }]}
  stats={{ shares: 890 }}
/>

// پست ویدیو
<InstagramPost
  postType="video"
  media={[{ type: 'video', url: '...' }]}
  stats={{ shares: 890 }}
/>

// پست اسلاید
<InstagramPost
  postType="carousel"
  media={[...]} // چندین تصویر
  mediaType="carousel"
  stats={{ shares: 890 }}
/>

نکته: اگر postType مشخص نشود، نوع پست نمایش داده نمی‌شود.

زمان انتشار

<InstagramPost
  variant="vertical"
  publishTime={new Date(Date.now() - 2 * 60 * 60 * 1000)} // 2 hours ago
  timeFormat="relative" // یا 'absolute'
/>
  • relative: نمایش نسبی (مثل "2 hours ago") با نمایش دقیق در hover
  • absolute: نمایش تاریخ کامل (مثل "Jan 15, 2024 at 3:30 PM")

دکمه‌های اکشن

دکمه‌های اکشن فقط هنگام hover روی کارت نمایش داده می‌شوند و هر کدام tooltip فارسی دارند:

<InstagramPost
  variant="vertical"
  showActions={true}
  onCommentAnalyzer={() => console.log('Comment Analyzer')}
  onBooster={() => console.log('Booster')}
  onAIAnalysis={() => console.log('AI Analysis')}
  onOpenInstagram={() => window.open('https://instagram.com/...')}
  instagramUrl="https://instagram.com/p/..."
/>

غیرفعال کردن دکمه‌ها به صورت جداگانه

هر دکمه اکشن به صورت مستقل قابل disable کردن است. دکمه‌های disable شده با opacity پایین‌تر نمایش داده می‌شوند و tooltip آن‌ها وضعیت غیرفعال را نشان می‌دهد:

<InstagramPost
  variant="vertical"
  showActions={true}
  // غیرفعال کردن دکمه تحلیل کامنت (مثلاً در صورت نداشتن دسترسی)
  disableCommentAnalyzer={true}
  // غیرفعال کردن بوستر (مثلاً در صورت اتمام اشتراک)
  disableBooster={true}
  // سایر دکمه‌ها فعال می‌مانند
  disableAIAnalysis={false}
  disableOpenInstagram={false}
  onCommentAnalyzer={() => console.log('Comment Analyzer')}
  onBooster={() => console.log('Booster')}
  onAIAnalysis={() => console.log('AI Analysis')}
  onOpenInstagram={() => window.open('https://instagram.com/...')}
/>
Propدکمه مربوطهپیش‌فرض
disableCommentAnalyzer💬 تحلیل کامنت‌هاfalse
disableBooster🚀 بوسترfalse
disableAIAnalysis✨ تحلیل هوش مصنوعیfalse
disableOpenInstagram📸 باز کردن در اینستاگرامfalse

تفاوت‌های حالت عمودی و افقی

حالت عمودی (Vertical)

  • طراحی مشابه اپ اینستاگرام
  • همیشه LTR (حتی در محیط RTL)
  • عرض محدود (max-w-sm)
  • کپشن با قابلیت expand/collapse
  • مناسب برای نمایش جزئیات کامل پست

حالت افقی (Horizontal)

  • کارت افقی با عرض کامل
  • ارتفاع محدود (حدود 4 خط کپشن)
  • عکس در سمت راست (حدود 20% عرض)
  • محتوای دیگر در سمت چپ
  • کپشن به 4 خط محدود می‌شود
  • مناسب برای نمایش در لیست‌ها

Props

Prop

Type

Types

interface MediaItem {
  type: 'image' | 'video'
  url: string
  aspectRatio?: '16:9' | '9:16' | '1:1' | '4:5' | '5:4'
}

interface PostStats {
  likes?: number
  comments?: number
  views?: number
  shares?: number
}

interface ProfileInfo {
  username: string
  fullName?: string
  profilePicture?: string
}

راهنمای استفاده

بکنید

  • از variant="vertical" برای نمایش جزئیات کامل و از variant="horizontal" برای لیست‌ها استفاده کنید - همیشه profile با username مشخص کنید تا هویت پست واضح باشد - از numberFormat="short" برای فضاهای محدود استفاده کنید

نکنید

  • حالت عمودی را در فضای کمتر از ۳۰۰px عرض قرار ندهید — محتوا فشرده می‌شود - showActions را بدون تعریف callback‌ها فعال نکنید — دکمه بدون عملکرد گمراه‌کننده است - از این کامپوننت برای پلتفرم‌های غیر اینستاگرام استفاده نکنید — طراحی مخصوص اینستاگرام است

دسترسی‌پذیری

  • ARIA labels برای دکمه‌های اکشن (تحلیل کامنت، بوستر، AI، اینستاگرام)
  • aria-expanded روی دکمه expand کپشن
  • aria-controls برای پانل کپشن
  • ناوبری کامل با کیبورد
  • کنتراست رنگی مناسب برای خوانایی

راست‌چین و چپ‌چین (RTL/LTR)

با استفاده از prop dir می‌توانید جهت نمایش کامپوننت را تغییر دهید.

راست‌چین (RTL)

در حالت راست‌چین، کپشن و چیدمان عناصر به صورت راست به چپ نمایش داده می‌شوند.

<InstagramPost
  variant="vertical"
  dir="rtl"
  caption="این یک متن راست‌چین است."
  // ... سایر پراپ‌ها
/>

چپ‌چین (LTR)

در حالت چپ‌چین، کپشن و چیدمان عناصر به صورت چپ به راست نمایش داده می‌شوند (مناسب برای متون انگلیسی).

<InstagramPost
  variant="vertical"
  dir="ltr"
  caption="This is a left-to-right text."
  // ... سایر پراپ‌ها
/>

کامپوننت‌های مرتبط

  • CommentCard — اگر نیاز به نمایش کامنت‌های اینستاگرام با تحلیل احساسات دارید، از CommentCard استفاده کنید
  • SocialPlatformBadge — اگر فقط نمایش آیکون پلتفرم نیاز دارید بدون محتوای پست، از SocialPlatformBadge استفاده کنید