Pear Social Core — логотип

Pear Social Core

Готовая библиотека для социальной сети на чистом JavaScript. Чаты, клубы, посты, опросы, уведомления, истории, маркетплейс — всё внутри. Бесплатно. Открытый код. Лицензия MIT.

Скачать исходный код

Архитектура

Событийно-ориентированная библиотека с автоматическим сохранением в localStorage и опциональной интеграцией с Appwrite.

🔌 Событийная модель

Все изменения данных генерируют события, на которые можно подписаться через on() / off(). Это позволяет легко связывать UI с данными и строить реактивные интерфейсы без фреймворков.

💾 Локальное хранилище

По умолчанию все данные сохраняются в localStorage под ключом pear_social_core. Библиотека автоматически синхронизирует кеш при каждом изменении — никаких лишних действий.

☁️ Appwrite (опционально)

Для продакшена достаточно передать endpoint и project ID — библиотека начнёт работать с Appwrite Database, Realtime и Storage. Все запросы проходят через единый слой абстракции AppStorage.

📦 Глобальные объекты

AppCache — in-memory кеш для быстрого доступа к данным.
AppStorage — единый интерфейс для localStorage и Appwrite. Все модули библиотеки работают только через них.

Инициализация

Подключите библиотеку и настройте хранилище за пару строк.

<script src="social-core.js"></script> <script> // Базовая инициализация (только localStorage) PearSocialCore.init(); // С Appwrite PearSocialCore.init({ appwrite: { endpoint: 'https://cloud.appwrite.io/v1', projectId: 'your-project-id' } }); // Глобальные объекты доступны после init() console.log(AppCache); // In-memory кеш console.log(AppStorage); // Интерфейс хранилища </script>

Основные функции

Полный список API для построения социальной сети.

🔐 Авторизация и пользователи

checkAuth() → boolean
Проверяет, авторизован ли текущий пользователь. Возвращает true если токен сессии действителен.
const isLoggedIn = checkAuth(); if (!isLoggedIn) loginUser('email', 'password');
registerUser(data) → Promise<User>
Регистрирует нового пользователя. Принимает объект с полями email, password, name.
const user = await registerUser({ email: 'alice@example.com', password: 'securePass123', name: 'Алиса' });
loginUser(email, password) → Promise<User>
Авторизует пользователя по email и паролю. Сохраняет сессию в localStorage.
const user = await loginUser('alice@example.com', 'securePass123'); // user.token — токен сессии
logoutUser() → void
Завершает сессию, очищает токен и кеш пользователя.
logoutUser(); // Перенаправление на страницу входа window.location.href = '/login';

📰 Лента

renderFeed(container, options) → void
Рендерит ленту постов в указанный DOM-элемент. Опции: filter, limit, onPostClick.
renderFeed(document.getElementById('feed'), { limit: 20, filter: { clubId: 'club_123' } });
publishPost(content) → Promise<Post>
Публикует новый пост. Принимает text, media (массив файлов), clubId (опционально).
const post = await publishPost({ text: 'Всем привет! 🍐', media: ['https://.../photo.jpg'] });
toggleLike(postId) → Promise<Post>
Ставит или убирает лайк. Если лайк уже стоит — убирает, иначе добавляет.
const updated = await toggleLike('post_456'); console.log(updated.likesCount); // 42
addComment(postId, text) → Promise<Comment>
Добавляет комментарий к посту.
const comment = await addComment('post_456', 'Отличный пост!');

💬 Чаты

renderDialogs(container) → void
Рендерит список диалогов текущего пользователя.
renderDialogs(document.getElementById('dialogs'));
openChat(dialogId, container) → void
Открывает чат с указанным диалогом и рендерит историю сообщений.
openChat('dialog_789', document.getElementById('chat'));
sendMessage(dialogId, text) → Promise<Message>
Отправляет сообщение в диалог. Поддерживает текст и прикреплённые файлы.
const msg = await sendMessage('dialog_789', 'Привет! Как дела?');

🏛️ Клубы

renderClubs(container) → void
Рендерит список доступных клубов с возможностью поиска.
renderClubs(document.getElementById('clubs'));
createClub(data) → Promise<Club>
Создаёт новый клуб. Принимает name, description, avatar.
const club = await createClub({ name: 'Любители груш', description: 'Обсуждаем всё, что связано с Pear 🍐' });
joinClub(clubId) → Promise<void>
Вступает в указанный клуб.
await joinClub('club_123');

🔔 Уведомления

sendNotification(userId, data) → Promise<Notification>
Отправляет уведомление пользователю. Поддерживает типы: like, comment, follow, club_invite.
await sendNotification('user_789', { type: 'like', message: 'Ваш пост оценили!', postId: 'post_456' });
renderNotifications(container) → void
Рендерит список уведомлений текущего пользователя.
renderNotifications(document.getElementById('notifications'));

🔍 Поиск и рекомендации

doSearch(query, type) → Promise<SearchResults>
Поиск по пользователям, постам и клубам. type может быть users, posts, clubs или all.
const results = await doSearch('груша', 'all'); console.log(results.users, results.posts, results.clubs);
renderRecommendations(container) → void
Рендерит блок персональных рекомендаций (люди, клубы, посты).
renderRecommendations(document.getElementById('recommendations'));

📸 Истории

renderStories(container) → void
Рендерит карусель историй. Автоматически обновляется каждые 24 часа.
renderStories(document.getElementById('stories'));
publishStory(media) → Promise<Story>
Публикует историю (изображение или видео). Истекает через 24 часа.
const story = await publishStory({ media: 'https://.../story.jpg', caption: 'Мой день 🍐' });

🏪 Маркетплейс

renderMarket(container, filters) → void
Рендерит витрину объявлений. Поддерживает фильтрацию по категории, цене и локации.
renderMarket(document.getElementById('market'), { category: 'electronics', maxPrice: 50000 });
createMarketAd(data) → Promise<Ad>
Создаёт объявление в маркетплейсе. Принимает title, description, price, category, images.
const ad = await createMarketAd({ title: 'MacBook Pro M3', price: 149999, category: 'electronics', images: ['https://.../mbp.jpg'] });

📅 События

renderEvents(container) → void
Рендерит календарь или список предстоящих событий.
renderEvents(document.getElementById('events'));
createEvent(data) → Promise<Event>
Создаёт событие. Принимает title, date, location, description, clubId.
const event = await createEvent({ title: 'Встреча Pear Community', date: '2025-06-15T18:00:00Z', location: 'Москва, ул. Тверская, 1', clubId: 'club_123' });

Структуры данных

Примеры JSON-объектов, с которыми работает библиотека.

👤 Пользователь (User)
ПолеТипОписание
$idstringУникальный идентификатор
emailstringEmail пользователя
namestringОтображаемое имя
avatarstring|nullURL аватара
biostringКраткая информация
createdAtstring (ISO)Дата регистрации
📝 Пост (Post)
ПолеТипОписание
$idstringУникальный идентификатор
authorIdstringID автора
textstringТекст поста
mediastring[]Массив URL вложений
clubIdstring|nullID клуба (если пост в клубе)
likesCountnumberКоличество лайков
commentsCountnumberКоличество комментариев
createdAtstring (ISO)Дата публикации
💬 Сообщение (Message)
ПолеТипОписание
$idstringУникальный идентификатор
dialogIdstringID диалога
senderIdstringID отправителя
textstringТекст сообщения
attachmentsstring[]Массив URL вложений
readbooleanПрочитано ли сообщение
createdAtstring (ISO)Дата отправки
🏛️ Клуб (Club)
ПолеТипОписание
$idstringУникальный идентификатор
namestringНазвание клуба
descriptionstringОписание клуба
avatarstring|nullURL аватара клуба
ownerIdstringID создателя
membersCountnumberКоличество участников
createdAtstring (ISO)Дата создания

Работа с хранилищем

Библиотека автоматически сохраняет данные в localStorage. Appwrite подключается опционально.

💾 localStorage (автоматически)

При каждом изменении данных библиотека сериализует весь кеш в JSON и сохраняет под ключом pear_social_core. При загрузке страницы данные восстанавливаются автоматически — пользователь видит последнее состояние мгновенно.

☁️ Appwrite (опционально)

Если передан конфиг Appwrite, библиотека дублирует все операции в облачную базу. Используются коллекции: users, posts, messages, clubs, notifications, stories, marketplace, events. Realtime-подписка обновляет UI мгновенно.

Настройка коллекций

Пример конфигурации коллекций для вашей базы данных (Appwrite).

// Конфигурация коллекций для Appwrite PearSocialCore.init({ appwrite: { endpoint: 'https://cloud.appwrite.io/v1', projectId: 'your-project-id', collections: { users: { dbId: 'db_main', collectionId: 'users' }, posts: { dbId: 'db_main', collectionId: 'posts' }, messages: { dbId: 'db_main', collectionId: 'messages' }, clubs: { dbId: 'db_main', collectionId: 'clubs' }, notifications: { dbId: 'db_main', collectionId: 'notifications' }, stories: { dbId: 'db_main', collectionId: 'stories' }, marketplace: { dbId: 'db_main', collectionId: 'marketplace' }, events: { dbId: 'db_main', collectionId: 'events' } } } });

Лицензия

Библиотека распространяется по лицензии MIT — можно использовать, модифицировать и распространять без ограничений.

📄 Открыть полный текст лицензии MIT
Лицензия MIT

Copyright (c) 2026 Pear

Данная лицензия разрешает лицам, получившим копию данного программного обеспечения
и сопутствующей документации (в дальнейшем — «Программное обеспечение»),
безвозмездно использовать Программное обеспечение без ограничений, включая
неограниченное право на использование, копирование, изменение, слияние, публикацию,
распространение, сублицензирование и/или продажу копий Программного обеспечения,
а также лицам, которым предоставляется данное Программное обеспечение, при
соблюдении следующих условий:

Указанное выше уведомление об авторском праве и данные условия должны быть
включены во все копии или значительные части данного Программного обеспечения.

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ
ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И
ОТСУТСТВИЯ НАРУШЕНИЙ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ,
В ТОМ ЧИСЛЕ, ПРИ ДЕЙСТВИИ ДОГОВОРА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ
ИЗ-ЗА ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С НИМ.