@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 constDiplomaStatus
const DiplomaStatus = {
not_uploaded: 1, // не загружен
pending: 2, // на проверке
verified: 3, // верифицирован
rejected: 4, // отклонён
} as constiBanner
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
}