KvalityUI

Визиты, заявки, звонки

Списки записей в ответе агента: карточки визитов, список заявок, карточки звонков.

Визиты

Живой код — редактируйте
const sessionsData = {
  period: { from: "2026-10-13", to: "2026-10-19", days: 7 },
  caveats: [],
  total: 3,
  items: [
    {
      id: "session-1",
      at: "2026-10-19T09:14:00Z",
      source: "Яндекс Директ",
      campaign: "Поиск · Москва",
      device: "mobile",
      landingPath: "/ceny",
      activeSeconds: 184,
      wallSeconds: 260,
      hasReplay: true,
      outcome: "submitted",
      submissionId: "submission-1",
      lastField: null
    },
    {
      id: "session-2",
      at: "2026-10-19T11:02:00Z",
      source: "Органика",
      campaign: null,
      device: "desktop",
      landingPath: "/",
      activeSeconds: 96,
      wallSeconds: 140,
      hasReplay: true,
      outcome: "abandoned",
      submissionId: null,
      lastField: "Телефон"
    },
    {
      id: "session-3",
      at: "2026-10-18T17:40:00Z",
      source: "Соцсети",
      campaign: null,
      device: "mobile",
      landingPath: "/otzyvy",
      activeSeconds: 32,
      wallSeconds: 40,
      hasReplay: false,
      outcome: "browsed",
      submissionId: null,
      lastField: null
    }
  ]
};

render(
  <SessionCards data={sessionsData} />
);

Заявки

Живой код — редактируйте
const submissionsData = {
  period: { from: "2026-10-13", to: "2026-10-19", days: 7 },
  caveats: [],
  total: 3,
  items: [
    {
      id: "submission-1",
      at: "2026-10-19T09:18:00Z",
      status: "analyzed",
      source: "Яндекс Директ",
      campaign: "Поиск · Москва",
      score: 82,
      aiLevel: "high",
      managerLevel: null,
      sessionDbId: "session-1",
      pagePath: "/ceny",
      reasons: ["Долго изучал цены", "Вернулся на сайт"]
    },
    {
      id: "submission-2",
      at: "2026-10-18T14:05:00Z",
      status: "analyzed",
      source: "Органика",
      campaign: null,
      score: 47,
      aiLevel: "medium",
      managerLevel: "medium",
      sessionDbId: "session-4",
      pagePath: "/"
    },
    {
      id: "submission-3",
      at: "2026-10-17T21:47:00Z",
      status: "analyzed",
      source: null,
      campaign: null,
      score: 12,
      aiLevel: "low",
      managerLevel: null,
      sessionDbId: "session-5",
      reasons: ["Форма заполнена за 2 секунды"]
    }
  ]
};

render(
  <SubmissionList data={submissionsData} />
);

Звонки

Живой код — редактируйте
const callsData = {
  period: { from: "2026-10-13", to: "2026-10-19", days: 7 },
  caveats: [],
  total: 2,
  items: [
    {
      id: "call-1",
      at: "2026-10-19T10:30:00Z",
      source: "Яндекс Директ",
      outcome: "answered",
      durationS: 312,
      matched: true,
      aiLevel: "high",
      intent: "Хочет рассчитать стоимость под ключ"
    },
    {
      id: "call-2",
      at: "2026-10-18T16:12:00Z",
      source: null,
      outcome: "missed",
      durationS: 0,
      matched: false,
      aiLevel: null
    }
  ]
};

render(
  <CallCards data={callsData} />
);

Со ссылками и записью визита

В приложении AnalyticsLinksProvider подставляет ссылки на заявки и звонки и диалог записи. Здесь — заглушки:

Живой код — редактируйте
const sessionsData = {
  period: { from: "2026-10-13", to: "2026-10-19", days: 7 },
  caveats: [],
  total: 3,
  items: [
    {
      id: "session-1",
      at: "2026-10-19T09:14:00Z",
      source: "Яндекс Директ",
      campaign: "Поиск · Москва",
      device: "mobile",
      landingPath: "/ceny",
      activeSeconds: 184,
      wallSeconds: 260,
      hasReplay: true,
      outcome: "submitted",
      submissionId: "submission-1",
      lastField: null
    },
    {
      id: "session-2",
      at: "2026-10-19T11:02:00Z",
      source: "Органика",
      campaign: null,
      device: "desktop",
      landingPath: "/",
      activeSeconds: 96,
      wallSeconds: 140,
      hasReplay: true,
      outcome: "abandoned",
      submissionId: null,
      lastField: "Телефон"
    },
    {
      id: "session-3",
      at: "2026-10-18T17:40:00Z",
      source: "Соцсети",
      campaign: null,
      device: "mobile",
      landingPath: "/otzyvy",
      activeSeconds: 32,
      wallSeconds: 40,
      hasReplay: false,
      outcome: "browsed",
      submissionId: null,
      lastField: null
    }
  ]
};

function ReplayStub({ open, onOpenChange, name }) {
  return (
    <ConfirmDialog
      open={open}
      onOpenChange={onOpenChange}
      title={name}
      description="Здесь откроется плеер записи визита"
      confirmText="Закрыть"
      onConfirm={() => onOpenChange(false)}
    />
  );
}

render(
  <AnalyticsLinksProvider
    value={{
      submissionHref: (id) => '#' + id,
      callHref: (id) => '#' + id,
      ReplayDialog: ReplayStub
    }}
  >
    <SessionCards data={sessionsData} />
  </AnalyticsLinksProvider>
);

On this page