Разработка списка избранного (Wishlist) в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Разработка списка избранного (Wishlist) в мобильном приложении
Простая
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Разработка списка избранного (Wishlist) в мобильном приложении

Wishlist — функция, которую недооценивают. Добавил товар, закрыл приложение, открыл через неделю с другого телефона — список должен быть там. Простая задача превращается в задачу синхронизации, управления конфликтами и оптимистичного UI.

Где хранить: локально или в облаке

Зависит от требований к авторизации:

  • Только авторизованные пользователи: Firestore, PostgreSQL, любая серверная БД. Список привязан к userId.
  • Гостевые пользователи + синхронизация при регистрации: AsyncStorage / MMKV для гостей, при логине — merge с серверным.

Вариант с merge — сложнее. При регистрации гость мог добавить 10 товаров, а его новый аккаунт уже имеет 5 (импорт из другого сервиса). Стратегия merge: union двух множеств, без дублей по productId.

Оптимистичный UI

Кнопка добавления в wishlist должна реагировать мгновенно — без ожидания ответа сервера. Классическая ошибка: ставить loading при нажатии и блокировать кнопку на время запроса. Пользователь видит задержку и думает, что не нажал.

const useWishlist = () => {
  const [wishlistIds, setWishlistIds] = useAtom(wishlistAtom);

  const toggle = useCallback(async (productId: string) => {
    const isAdding = !wishlistIds.has(productId);

    // Немедленное изменение UI
    setWishlistIds(prev => {
      const next = new Set(prev);
      isAdding ? next.add(productId) : next.delete(productId);
      return next;
    });

    try {
      if (isAdding) {
        await api.wishlist.add(productId);
      } else {
        await api.wishlist.remove(productId);
      }
    } catch {
      // Rollback при ошибке
      setWishlistIds(prev => {
        const next = new Set(prev);
        isAdding ? next.delete(productId) : next.add(productId);
        return next;
      });
      Toast.show('Не удалось обновить список избранного');
    }
  }, [wishlistIds]);

  return { wishlistIds, toggle };
};

MMKV для локального кэша

AsyncStorage — медленный. Для wishlist, который читается при каждом рендере карточки товара, используем MMKV (react-native-mmkv). Синхронный read — не нужен await:

import { MMKV } from 'react-native-mmkv';

const storage = new MMKV({ id: 'wishlist' });

const getLocalWishlist = (): Set<string> => {
  const raw = storage.getString('ids');
  return raw ? new Set(JSON.parse(raw)) : new Set();
};

const saveLocalWishlist = (ids: Set<string>) => {
  storage.set('ids', JSON.stringify([...ids]));
};

Синхронное чтение из MMKV на main thread — безопасно, операция занимает <0.1 мс.

Счётчик в иконке wishlist

Бейдж с числом элементов в wishlist — это производная от wishlistIds.size. Не делайте отдельный запрос за счётчиком. Если wishlist синхронизирован — размер множества уже известен.

Оценка

Wishlist с оптимистичным UI, MMKV-кэшем и cloud sync (Firestore или REST): 1–2 недели.