پرتوپرتو

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

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

معرفی

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

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

استفاده

حالت عمودی (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={0} // 0: عکس, 1: ویدیو, 2: اسلاید
  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={0} // 0: عکس, 1: ویدیو, 2: اسلاید
  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

No media available

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

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

حالت افقی (Horizontal)

No media available

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

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

تنظیمات اصلی

تنظیمات آمار و زمان

دکمه‌ها فقط هنگام hover نمایش داده می‌شوند

انواع مدیا

تصویر واحد

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

ویدیو

<InstagramPost
  variant="vertical"
  media={[
    {
      type: 'video',
      url: '/instagram-posts/videos/video 16x9.mp4',
      aspectRatio: '16:9',
    },
  ]}
  postType={1} // 1: ویدیو
  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/videos/video 16x9.mp4',
      aspectRatio: '16:9',
    },
  ]}
  mediaType="carousel"
  postType={2} // 2: اسلاید
  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={0} // 0: عکس (با آیکون Image)
  stats={{
    likes: 123456,
    comments: 1234,
    views: 56789,
    shares: 890,
  }}
/>

مقادیر postType

  • 0: عکس (Photo) - با آیکون Image
  • 1: ویدیو (Video) - با آیکون Video
  • 2: اسلاید (Carousel/Slide) - با آیکون Images

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

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

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

// پست اسلاید
<InstagramPost
  postType={2}
  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/..."
/>

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

حالت عمودی (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
}

ویژگی‌ها

  • دو حالت نمایش: عمودی و افقی
  • پشتیبانی از انواع مدیا (تصویر، ویدیو، کاروسل)
  • پارس خودکار هشتگ‌ها و منشن‌ها
  • قابلیت expand/collapse برای کپشن (در حالت عمودی)
  • فرمت‌بندی عدد و زمان قابل تنظیم
  • دکمه‌های اکشن با tooltip فارسی
  • Responsive و سازگار با موبایل
  • Accessibility با ARIA labels
  • RTL/LTR support