npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@up-im/medotvet_sdk

v0.0.9

Published

Полноценный клиент для работы с backend из React/Next. Ниже перечислены все методы из `src/api` и примеры интеграции.

Downloads

415

Readme

Medotvet SDK для React

Полноценный клиент для работы с backend из React/Next. Ниже перечислены все методы из src/api и примеры интеграции.

Установка

npm i @up-im/medotvet_sdk

Инициализация клиента

import { createClient } from "@up-im/medotvet_sdk"

const client = createClient({
	host: "https://api.example.com",
	wsHost: "wss://ws.example.com",
	// storage?: iStorage (опционально, по умолчанию localStorage)
})
  • Все запросы идут на host/api/* через fetch с FormData.
  • Методы с options.addToken требуют авторизацию; refresh токен обновляется aвтоматически.
  • В ответах ошибки приходят как ApiError(status, message).

Модули и методы

user

  • get() — вернуть пользователя из localStorage без запроса на сервер.
  • getFull() — получить профиль с backend; 401 без авторизации.
  • loginOrRegisterByPhone({ phone }) — старт регистрации/логина, шлёт SMS.
  • loginOrRegisterByPhoneConfirm({ phone, code }) — завершить вход, сохранить токены, вернуть пользователя.
  • setRef({ ref }) — ввести реферальный код; требует токен.
  • editUser(data: iUserEditProps) — обновить профиль; при смене email может вернуть false, тогда повторить с email_code.
  • logout() — локальный выход, чистит токены, шлёт событие logout.
  • logoutAllDevice() — удаляет refresh на сервере, чистит локально, рассылает logout.
  • onLogout — подписка на событие выхода client.user.onLogout(cb).
  • delete() — удалить аккаунт и связанные сущности, затем logout.
  • getMyReferer() — вернуть мой рефкод.
  • uploadDiploma(formData) — отправить файлы diploma[], ответ: { success, diploma_files, diploma_status }. Статусы экспортируются как DiplomaStatus (числовые значения).
  • getDiplomaStatus() — статус диплома (DiplomaStatus): 1 не загружен, 2 проверка, 3 принят, 4 отклонён + diploma_reject_reason.

content

  • getEnv() — общие настройки/реферальные вознаграждения.
  • checkAppVersion({ appStore, appVersion }) — проверка актуальности версии в сторе, ответ { isActual }.
  • getCloudVersion(appStore) — версия для обновления по воздуху (OTA).
  • getNodeTree(parent?) — дерево категорий.
  • getArticleList({ select, page?, filters?, sorters?, perPage? }) — статьи.
  • getArticleOne({ id }) — статья с полем item.
  • getPolicy() / getTerms() / getLoyalty() / getAgreement() — тексты.
  • getInstruction() — шаги "Как получить деньги", до 100 элементов.
  • getBanks({ page, searchTitle? }) — банки для выплат.
  • getSpecializationList({ page, searchTitle? }) — справочник специализаций.
  • getCityList({ page, searchTitle? }) — города с пагинацией.
  • getCityOne({ id }) — один город.
  • getBannerRand({ type, signal? }) — баннер по типу (требует токен).
  • getStoriesList({ select, page?, perPage? }) — сторисы, sku сжаты в { id, title }.
  • getStoriesOne({ id }) — сторис с sku приведённым к { id, title }.
  • getIntro() — приветственные слайды с сортировкой.

survey

  • getList({ page?, select?, bookmarks? }) — доступные опросы, сортировка по приоритету.
  • getBookmarks({ page?, select? }) — избранные опросы, 401 без авторизации.
  • getOne({ id }) — опрос с вопросами.
  • start(surveyId, signal?) — начать прохождение, ответ { success, userSurvey }.
  • saveAnswer({ userSurveyId, questionIndex, answer, signal? }) — сохранить ответ, возвращает { completed, next_question_index, message }.
  • cancel(userSurveyId, signal?) — отменить прохождение.
  • getHistory({ page? }) — история прохождений.

payment

  • addSBP({ sum, bank }) — заявка на выплату через СБП, вернёт iPayment.
  • addCard({ sum, card_number }) — заявка на карту, вернёт iPayment.
  • getList({ page?, select }) — список выплат, сортировка id desc.
  • balance() — баланс и суммы начислений/выплат.
  • getVerificationUrl() — ссылка на KYC SolarStaff и признак verified.
  • checkVerificationStatus() — статус KYC: not_started|pending|active|blocked + текст.

stat

  • add({ itemId, event }) — записать событие просмотра/квиза/ презентации; для CATALOG_SKU + PRESENTATION_SUCCESS|QUESTIONS_SUCCESS пишет и начисления.
  • getEvent({ sku: number[] }) — получить события пользователя по акциям.

chat (WebSocket)

  • Подключается к wsHost, авторизует token при onOpen.
  • messageSubscribe(cb) — подписка на входящие сообщения массивами; вернёт функцию отписки. История последних 10 пачек приходит сразу.
  • sendMessage({ text, file? }) — отправка текста/файла (конвертируется в base64). Доступно только пользователю с role === 0.
  • sendView({ id }) — отметить сообщение прочитанным.
  • getUnread() — количество непрочитанных через HTTP.
  • getMessages({ page }) — запросить сообщения по страницам через WS.
  • disconnect() — закрыть WebSocket вручную.

bookmarks

  • inBookmarks({ skuId }) — проверить избранное. Дебаунсит запросы, требует токен.
  • mutate({ skuId, isAdd }) — добавить/убрать из избранного и обновить кэш.
  • getTotal() — общее число избранных или null, использует кеш.

push

  • getList({ page?, filters?, select }) — список пушей, сортировка id desc.
  • countNew() — количество непрочитанных.
  • view({ pushId }) — отметить один пуш прочитанным.
  • viewAll() — отметить все пуши прочитанными.
  • register({ token, appStore }) — зарегистрировать push-токен.
  • unsubscribe() — отписаться от пушей.
  • isSubscribed() — признак активной подписки.

promocode

  • activate(code) — активировать промокод, ответ { sum }; требует токен.

test (верификационный тест по специальности)

  • getQuestions() — получить вопросы для теста верификации. Вопросы выбираются на основе специализаций пользователя (по 4 на каждую). Возвращает { questions: iTestQuestionForUser[] }.
  • submit(answers: iTestUserAnswer[]) — отправить результаты теста. answers — массив ответов с полями specialization, questionIndex, answer_indices, answer_time?. Возвращает { success, passed, message }.
  • getResults() — получить результаты последнего теста. Возвращает { hasResults, message?, testDate?, results?, passed? }. Если hasResults=false — тест ещё не проходился.
  • getStatus() — проверить статус прохождения теста. Возвращает { testPassed, testDate, canTakeTest }. canTakeTest всегда true — тест можно проходить неограниченно.

geoIp

  • detect() — определить город по IP.

Модели данных

iUser

interface iUser {
  id: number
  register_date: string | null
  role: UserRoleValue // 0-пользователь, 1-модератор, 2-админ
  phone: string | null
  phone_confirm: boolean
  email: string | null
  email_confirm: boolean
  firstname: string
  lastname: string
  middlename: string
  photo: string
  city: iCity | null
  specialization: number[] | null // специализации врача
  birthdate: string | null
  workplace_type: number | null // тип учреждения (ID)
  workplace_name: string | null // название учреждения
  diploma_status: DiplomaStatusValue // 1-не загружен, 2-проверка, 3-принят, 4-отклонён
  diploma_files: string[] | null
  diploma_reject_reason: string | null
  test_status: number | null // 1-не пройден, 2-пройден (TestStatus)
  ref: iUserData | null // пригласивший пользователь
  my_ref_code: string | null // рефкод для приглашения других
  agreement: boolean | null
}

iSurvey

interface iSurvey {
  id: number
  node: number
  title: string
  partner: number | null
  budget: number
  budget_min: number
  date_start: string | null
  date_end: string | null
  reward_base: number // базовое вознаграждение (50%)
  reward_max: number // макс. вознаграждение (100%)
  questions: iSurveyQuestion[] | null
  slots: number // всего мест
  slots_taken?: number // занято мест
  specialization: iRefItem[] | null // {id, title}[]
  city: iRefItem[] | null // только эти города
  city_not: iRefItem[] | null // кроме этих городов
  promo_title: string
  promo_subtitle: string
  promo_image: string
  promo_text: string
  promo_disclaimer: string
  text: string
  text_full: string
  public: boolean
  priority?: number // 1-4 для спецразмещения
}

iUserSurvey

const UserSurveyStatus = {
  queue: 0,       // в очереди
  in_progress: 1, // в процессе
  success: 2,     // завершён
  cancelled: 3,   // отменён
  timeout: 4      // таймаут
} as const

interface iUserSurvey {
  id: number
  reg_date: string
  user: number
  survey: number
  status: UserSurveyStatusValue
  date_start: string | null
  date_end: string | null
  timeout_at: string | null
  survey_title?: string
  reward_base?: number
  reward_max?: number
}

iPayment

interface iPayment {
  id: number
  reg_date: string
  status: PaymentStatusValue // 1-ожидание, 2-завершено, 3-ошибка, 4-отмена
  pay_type: PaymentTypeValue // 1-начисление, 2-выплата
  title: string
  receipt: number | null
  receipt_product: number | null
  catalog: number | null
  sku: number | null
  shop: number | null
  cashback_level: 0 | 1 | 2 | 3
  max_cashback_level: null | 0 | 1 | 2 | 3
  payout_type: PayoutTypeValue | null // 1-СБП, 2-карта
  last_error: string
  price: number // >0 начисление, <0 списание
}

iBalance

interface iBalance {
  accrued: number  // всего начислено
  paid: number     // всего выплачено
  invite_user: number // начислено от рефералов
  balance: number  // текущий баланс
}

iPush

interface iPush {
  id: number
  reg_date: string
  send_date: string | null
  user: number
  status: PushStatusValue // 1-ожидание, 2-отправлено, 3-ошибка
  mailing: number | null
  priority: number
  title: string
  text: string
  route: string
  view: boolean
}

iMessage (чат)

interface iMessageIncome {
  route: "/message"
  id: number
  date: Date
  from_user_id: number
  from_user_name: string
  text: string
  file: string | undefined
  view: 0 | 1
}

Test interfaces

// Вопрос теста для пользователя
interface iTestQuestionForUser {
  specialization: number
  questionIndex: number
  question: string
  answers: { title: string }[]
}

// Ответ пользователя
interface iTestUserAnswer {
  specialization: number
  questionIndex: number
  answer_indices: number[] // индексы выбранных ответов
  answer_time?: number // время ответа в секундах
}

// Результаты по специализациям
interface iTestResultBySpecialization {
  [specializationId: number]: {
    correct: number
    total: number
  }
}

// Статус теста
const TestStatus = {
  not_passed: 1,
  passed: 2,
} as const

DiplomaStatus

const DiplomaStatus = {
  not_uploaded: 1, // не загружен
  pending: 2,      // на проверке
  verified: 3,     // верифицирован
  rejected: 4,     // отклонён
} as const

iBanner

interface iBanner {
  banner_id: number
  sku_id: number
  image: string
  adv_info: string
}

iEnv

interface iEnv {
  referrer_cashback_percent: number
  referrer_register_bonus: number
  root_catalog_id: number
  payout_min_price: number
}