FastComments.com

Add Comments to Your SolidJS App


Это официальная библиотека SolidJS для FastComments.

Встраивайте виджеты живых комментариев, чата и рецензий в ваше приложение на SolidJS.

Репозиторий

Посмотреть на GitHub


Установка Internal Link

npm install fastcomments-solidjs

Использование Internal Link

import { FastCommentsCommentWidget } from 'fastcomments-solidjs';

export default function App() {
  return <FastCommentsCommentWidget tenantId="demo" urlId="some-page-id" />;
}

Реагирование на изменения конфигурации (императивный обработчик) Internal Link

Solid не отслеживает автоматически глубокие мутации произвольных объектов, поэтому изменения config после первого рендера должны быть отправлены явно. Каждый виджет принимает apiRef, который возвращает handle; вызовите handle.update(partial) внутри createEffect, чтобы обеспечить реактивность:

import { createEffect, createSignal } from 'solid-js';
import { FastCommentsCommentWidget, type FastCommentsCommentWidgetHandle } from 'fastcomments-solidjs';

export default function Paginated() {
  const [page, setPage] = createSignal(0);
  let handle: FastCommentsCommentWidgetHandle | undefined;
  createEffect(() => handle?.update({ urlId: `product-${page()}` }));

  return (
    <>
      <button onClick={() => setPage(page() + 1)}>next</button>
      <FastCommentsCommentWidget
        apiRef={(h) => (handle = h)}
        tenantId="demo"
        urlId={`product-${page()}`}
      />
    </>
  );
}

update() безопасно вызывать в любой момент:

  • До загрузки скрипта: partial сохраняется и применяется при init.
  • Во время асинхронной инициализации (reviews-summary, user-activity-feed): partial ставится в очередь и применяется, когда callback разрешится.
  • После init: он напрямую перенаправляется в метод .update() живого виджета.

Императивный handle API

interface WidgetHandle<Config> {
  getInstance: () => WidgetInstance | null;   // последний живой экземпляр (или null до монтирования)
  onInstance: (cb: (instance: WidgetInstance) => void) => void; // срабатывает один раз, когда экземпляр готов
  update: (partial: Partial<Config>) => void; // объединяет и отправляет конфигурацию
}

Используйте getInstance() для императивных действий, которые не покрываются .update(), например openProfile:

const openProfile = () =>
  (handle?.getInstance() as { openProfile?: (o: { userId: string }) => void } | null)
    ?.openProfile?.({ userId: 'demo' });

Компоненты Internal Link

Каждый виджет из fastcomments-react доступен под тем же именем:

Component Handle type Embed loaded
FastCommentsCommentWidget FastCommentsCommentWidgetHandle Флагманский виджет для живого комментирования
FastCommentsCommentCountWidget FastCommentsCommentCountWidgetHandle Встроенный бейдж с подсчётом комментариев
FastCommentsLiveChatWidget FastCommentsLiveChatWidgetHandle Потоковый виджет живого чата
FastCommentsCollabChatWidget FastCommentsCollabChatWidgetHandle Совместный чат, привязанный к тексту
FastCommentsImageChatWidget FastCommentsImageChatWidgetHandle Комментирование регионов изображения
FastCommentsRecentCommentsWidget FastCommentsRecentCommentsWidgetHandle Лента последних комментариев
FastCommentsRecentDiscussionsWidget FastCommentsRecentDiscussionsWidgetHandle Лента последних обсуждений
FastCommentsReviewsSummaryWidget FastCommentsReviewsSummaryWidgetHandle Сводка рейтинга в звёздах
FastCommentsTopPagesWidget FastCommentsTopPagesWidgetHandle Рейтинг страниц с наибольшим количеством комментариев
FastCommentsUserActivityFeedWidget FastCommentsUserActivityFeedWidgetHandle Хронология активности пользователя

Виджеты, которые монтируются в существующий элемент

FastCommentsCollabChatWidget и FastCommentsImageChatWidget монтируются в элемент, предоставленный вызывающей стороной. Передайте accessor targetRef, который возвращает элемент после его монтирования:

import { FastCommentsImageChatWidget } from 'fastcomments-solidjs';

export default function ImageChat() {
  let img: HTMLImageElement | undefined;
  return (
    <>
      <img ref={img} src="/screenshot.png" alt="" />
      <FastCommentsImageChatWidget
        tenantId="demo"
        urlId="my-image"
        targetRef={() => img}
      />
    </>
  );
}

Регионы

Передайте region="eu", чтобы направить трафик виджета через кластер ЕС.

Демонстрация Internal Link

Полноценное демонстрационное приложение находится в examples/example-showcase/. Оно повторяет демонстрацию для React и охватывает каждый виджет, а также распространённые сценарии (тёмная тема, пагинация, SSO, обратные вызовы).

cd examples/example-showcase
npm install
npm run dev

Сборка Internal Link

npm install
npm run build       # библиотека -> dist/
npm test            # vitest smoke-тест
npm run build:demo  # демонстрация -> demo-dist/

Нужна помощь?

Если вы столкнулись с проблемами или у вас есть вопросы по библиотеке SolidJS, пожалуйста:

Участие

Вклады приветствуются! Пожалуйста, посетите репозиторий на GitHub для руководства по внесению вклада.