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

حالت افقی (Horizontal)

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 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)
No media available
حالت افقی (Horizontal)
No media available
این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 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) - با آیکونImage1: ویدیو (Video) - با آیکونVideo2: اسلاید (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
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