پرتوپرتو

ورودی هشتگ (Hashtag Input)

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

معرفی

کامپوننت HashtagInput مشابه TagInput است با این تفاوت که هشتگ‌ها را با پیشوند # نمایش می‌دهد. مقدار ذخیره‌شده بدون # است (فقط کلمه کلیدی)، اما نمایش آن با # همراه است.

کاربر می‌تواند هشتگ را با یا بدون # وارد کند — کامپوننت به‌صورت خودکار # اضافی را حذف می‌کند.

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

  • برای ورود هشتگ‌های شبکه‌های اجتماعی (اینستاگرام، توییتر و ...)
  • وقتی مقادیر ورودی باید با پیشوند # نمایش داده شوند
  • در فرم‌های مدیریت پست‌های شبکه اجتماعی

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

  • برای tag های غیرهشتگ — از TagInput استفاده کنید
  • وقتی هشتگ‌ها باید از لیست انتخاب شوند — از MultiSelect استفاده کنید

استفاده

#پرتو#تهران

مقادیر ذخیره‌شده: #پرتو, #تهران

import { HashtagInput } from '@parto-system-design/ui'

export default function MyComponent() {
  const [hashtags, setHashtags] = React.useState<string[]>(['پرتو', 'تهران'])

  return <HashtagInput value={hashtags} onChange={setHashtags} placeholder="هشتگ جدید اضافه کنید..." />
}

نکته: مقادیر در value/onChange بدون # ذخیره می‌شوند. مثلاً ['پرتو', 'تهران'] در خروجی به #پرتو و #تهران تبدیل می‌شود.

حداکثر تعداد هشتگ

#بلاگر#اینفلوئنسر#تهران

3/10 هشتگ

<HashtagInput value={hashtags} onChange={setHashtags} placeholder="#هشتگ جدید..." maxTags={10} />

حالت غیرفعال

#ایران#تهران
<HashtagInput defaultValue={['ایران', 'تهران']} disabled />

مثال عملی: فرم هشتگ پست اینستاگرام

import { HashtagInput, Label, Button } from '@parto-system-design/ui'

export default function PostForm() {
  const [hashtags, setHashtags] = React.useState<string[]>([])

  const handleSubmit = () => {
    // hashtags = ['پرتو', 'تهران', 'بلاگر']
    // برای ارسال به API بدون # استفاده می‌شود
    const formattedHashtags = hashtags.map((h) => `#${h}`).join(' ')
    console.log(formattedHashtags) // '#پرتو #تهران #بلاگر'
  }

  return (
    <div className="space-y-4" dir="rtl">
      <div className="space-y-2">
        <Label>هشتگ‌های پست (حداکثر ۳۰)</Label>
        <HashtagInput value={hashtags} onChange={setHashtags} placeholder="#هشتگ بزنید..." maxTags={30} />
        <p className="text-xs text-muted-foreground">{hashtags.length}/30 هشتگ</p>
      </div>
      <Button onClick={handleSubmit}>انتشار پست</Button>
    </div>
  )
}

تفاوت با TagInput

ویژگیTagInputHashtagInput
نمایشتگ#تگ
ذخیره‌سازیبا مقدار خامبدون #
ورودی کاربرمتن آزادمی‌تواند # داشته باشد یا نداشته باشد
کاربردتگ‌های عمومیهشتگ‌های شبکه اجتماعی

رفتار کیبورد

کلیدعملکرد
Enterاضافه کردن هشتگ جدید (با یا بدون #)
Backspaceحذف آخرین هشتگ (در صورت خالی بودن input)
کلیک روی ×حذف همان هشتگ

Props

Prop

Type

حالت‌ها و انواع

حالت کنترل‌شده

با value و onChange آرایه هشتگ‌ها را مدیریت کنید (مقادیر بدون #).

حالت غیرکنترل‌شده

با defaultValue مقدار اولیه را تنظیم کنید.

با محدودیت تعداد

با maxTags حداکثر تعداد هشتگ‌ها را محدود کنید (مثلاً ۳۰ برای اینستاگرام).

حالت غیرفعال

با disabled ورودی و حذف هشتگ‌ها غیرفعال می‌شود.

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

بکنید

  • از maxTags با مقدار مناسب پلتفرم استفاده کنید (مثلاً ۳۰ برای اینستاگرام) - شمارنده هشتگ‌ها را در کنار فیلد نمایش دهید تا کاربر محدودیت را بداند - توجه داشته باشید که مقادیر onChange بدون # هستند — هنگام ارسال به API فرمت کنید

نکنید

  • برای تگ‌های عمومی بدون پیشوند # از HashtagInput استفاده نکنید — TagInput مناسب‌تر است - بدون maxTags در فرم‌های شبکه اجتماعی رها نکنید — هر پلتفرم محدودیت دارد - هشتگ‌های دارای فاصله یا کاراکتر خاص را بدون اعتبارسنجی قبول نکنید

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

  • اضافه کردن هشتگ با Enter (با یا بدون #)
  • حذف آخرین هشتگ با Backspace (در صورت خالی بودن input)
  • حذف هشتگ با کلیک روی دکمه ×
  • پیشوند # به‌صورت خودکار به مقدار ذخیره‌شده اضافه نمی‌شود (فقط نمایشی است)
  • جلوگیری از ورود هشتگ‌های تکراری
  • دکمه حذف هر هشتگ دارای متن sr-only برای screen reader
  • کاملاً سازگار با RTL (فارسی، عربی)

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

  • اگر نیاز به تگ‌های عمومی بدون پیشوند # دارید → TagInput
  • اگر هشتگ‌ها باید از لیست مشخصی انتخاب شوند → MultiSelect
  • اگر نیاز به نمایش هشتگ‌ها به صورت فیلتر قابل حذف دارید → FilterChip