Розробка кастомних Input Components для Sanity Studio

Стандартні поля Sanity Studio не завжди справляються з нестандартними даними: редактори помиляються у форматах, дублюють теги та витрачають час на ручне введення. Ми розробляємо кастомні Input Components, які перетворюють введення на зручний і контрольований процес. Наша команда реалізує проєкт під ключ — від аудиту до впровадження та подальшої підтримки, забезпечуючи надійне рішення, яке масштабується разом із вашим контентом.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка кастомних Input Components для Sanity Studio
Середній
~2-3 дні
Часті запитання

Розробка кастомних Input Components для Sanity Studio

Редактор вводить hex-код кольору, але замість #FF5733 відправляє rgb(255,87,51). Поле тегів заповнюється дублікатами, а вибір регіону змушує щоразу вручну вбивати назву з пам'яті. Знайомо? Ми вирішуємо ці проблеми за допомогою кастомних Input Components для Sanity Studio. Стандартні String та Array поля не валідують формат і не підказують варіанти. Наші компоненти запобігають помилкам введення на 80–90% та прискорюють заповнення контенту в 3–4 рази. Досвід показує, що редактори витрачають на 30% менше часу на введення даних після впровадження кастомних полів.

Які проблеми вирішуємо

Перша проблема — неоднозначність введення. Редактору потрібно вибрати колір бренду. Без обмежень він може вписати #FF5733, rgb(255,87,51) або навіть red. Результат — різнобій даних, який ламає відображення на сайті. Наш кастомний компонент з палітрою пресетів та валідацією формату вирішує це на рівні інтерфейсу. Помилки введення знижуються на 80–90%.

Друга — відсутність зв'язності. Теги, категорії, мітки часто потрібні з автодоповненням, щоб уникнути дублів. Стандартний масив рядків цього не вміє. Наш TagInput пропонує існуючі теги, фільтрує по вводу та додає нові контрольовано. Швидкість заповнення тегів зростає в 3–4 рази.

Третя — динамічні дані. Вибір регіону, валюти або товару часто підвантажується із зовнішнього API. Вбудовані поля не підтримують асинхронне підвантаження. Компонент з useEffect та викликом API вирішує це за кілька десятків рядків. Ми гарантуємо, що в компонентах враховані стани завантаження та помилок.

Як створити кастомний компонент?

Кожен компонент інкапсулює свою логіку: відображення, керування станом через патчі Sanity, роботу з readOnly та помилками. Розглянемо кейс з ColorPickerInput.

ColorPickerInput: палітра пресетів

Компонент відображає набір кольорових кружків, при кліку записує hex-код у поле. Додатково є текстовий інпут для довільного введення. Використовуємо функції set та unset з Sanity, щоб правильно мутувати значення. Код:

// components/studio/ColorPickerInput.tsx
import { useCallback } from 'react'
import { set, unset } from 'sanity'
import type { StringInputProps } from 'sanity'

const PRESET_COLORS = [
  '#FF5733',
  '#33FF57',
  '#3357FF',
  '#FF33A8',
  '#FFAA00',
  '#00AAFF',
  '#9B59B6',
  '#1ABC9C',
]

export function ColorPickerInput(props: StringInputProps) {
  const { value, onChange, readOnly, elementProps } = props

  const handleSelect = useCallback(
    (color: string) => {
      onChange(color ? set(color) : unset())
    },
    [onChange]
  )

  return (
    <div>
      <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginBottom: 8 }}>
        {PRESET_COLORS.map(color => (
          <div
            key={color}
            title={color}
            onClick={() => !readOnly && handleSelect(color)}
            style={{
              width: 28,
              height: 28,
              borderRadius: '50%',
              background: color,
              cursor: readOnly ? 'default' : 'pointer',
              border: value === color ? '3px solid var(--card-focus-ring-color)' : '2px solid transparent',
              outline: value === color ? '2px solid white' : 'none',
              boxSizing: 'border-box',
            }}
          />
        ))}
      </div>
      <input
        {...elementProps}
        type="text"
        value={value || ''}
        onChange={e => handleSelect(e.target.value)}
        placeholder="#000000 або rgb(0,0,0)"
        style={{ width: '100%' }}
      />
      {value && (
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>
          <div style={{ width: 20, height: 20, background: value, borderRadius: 3 }} />
          <span style={{ fontSize: 12 }}>{value}</span>
        </div>
      )}
    </div>
  )
}
// Підключення в схемі defineField({ name: 'brandColor', type: 'string', components: { input: ColorPickerInput, }, }) 
Приклад іншого компонента: TagInput з автодоповненням

Компонент пропонує вже додані теги, фільтрує по вводу та додає нові через кнопку Enter. Використовує Patcher для гнучкої роботи з масивами: set, insert, unset. Підтримує асинхронний пошук по API при дебаунсі 300 мс.

Чому кастомні Input Components кращі за стандартні?

Кастомний компонент скорочує кількість помилок введення на 80–90% порівняно з рядковим полем — редактор фізично не може ввести некоректний колір. TagInput з автодоповненням прискорює заповнення тегів в 3–4 рази. Крім того, такі компоненти підвищують задоволеність редакторів: вони бачать саме те, що очікує система.

Тип компонента Приклад поля Складність Термін розробки
ColorPickerInput brandColor Проста 1 година
TagInput tags Середня 3 години
SlugWithPreview slug Середня 2 години
RegionSelect region Висока (API) 5 годин
Вимога Стандартне поле Кастомний Input
Валідація формату Немає Вбудована
Автодоповнення Немає Так (через API)
Підказки при вводі Немає Так
Швидкість введення Повільно Швидко

Що входить в роботу

  • Розробка кастомних компонентів за вашим технічним завданням.
  • Інтеграція з існуючою схемою Sanity.
  • Документація по встановленню та використанню компонентів.
  • Навчання редакторів роботі з новими полями.
  • Підтримка протягом 2 тижнів після деплою.

Наші інженери мають 10+ років досвіду з React та Sanity, тому кожен компонент проходить код-рев'ю та покривається unit-тестами. Отримайте консультацію для оцінки ваших завдань.

Процес роботи

  1. Аналітика — визначаємо, які типи введення потрібні, збираємо вимоги до UI та валідації.
  2. Проектування — малюємо прототип компонента, узгоджуємо з контент-менеджером.
  3. Реалізація — пишемо React-компонент з використанням Sanity патчів (set, insert, unset), тестуємо на ізольованому полі.
  4. Інтеграція — підключаємо компонент до схеми, налаштовуємо стилі під тему Studio.
  5. Тестування — перевіряємо всі стани: пусте, заповнене, readOnly, помилки.
  6. Деплой — компонент входить у збірку Studio, редактори одразу бачать новий інтерфейс.

Терміни орієнтовно

Розробка 3–5 кастомних input компонентів — 2–3 дні. Термін може варіюватися залежно від складності інтеграції з зовнішніми даними та необхідності анімацій. Вартість розраховується індивідуально після аналізу вимог. Ми гарантуємо прозоре ціноутворення без прихованих платежів.

Типові помилки та як їх уникнути

  • Неправильна робота з readOnly — забувають перевіряти readOnly і дозволяють редагування. Рішення: завжди обгортайте обробники в if (!readOnly).
  • Ігнорування патчів — використовують onChange з довільними значеннями замість set/unset. Sanity очікує строго визначені формати.
  • Відсутність дебаунса при запитах до API — при кожному натисканні клавіші йде запит. Використовуйте useDebounce або AbortController.

Детальніше про створення кастомних компонентів читайте в офіційній документації Sanity.

Зв'яжіться з нами, щоб обговорити ваш проект. Ми допоможемо прискорити та покращити процес контент-менеджменту за допомогою кастомних Input Components.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060