@up-im/medotvet_sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/apcheki_sdk.mdc +90 -0
- package/README.md +136 -0
- package/dist/api/abstract.d.ts +21 -0
- package/dist/api/abstract.js +125 -0
- package/dist/api/bookmarks.d.ts +28 -0
- package/dist/api/bookmarks.js +121 -0
- package/dist/api/chat.d.ts +30 -0
- package/dist/api/chat.js +118 -0
- package/dist/api/content.d.ts +154 -0
- package/dist/api/content.js +237 -0
- package/dist/api/geoIp.d.ts +8 -0
- package/dist/api/geoIp.js +14 -0
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.js +31 -0
- package/dist/api/payment.d.ts +54 -0
- package/dist/api/payment.js +90 -0
- package/dist/api/promocode.d.ts +9 -0
- package/dist/api/promocode.js +22 -0
- package/dist/api/push.d.ts +54 -0
- package/dist/api/push.js +99 -0
- package/dist/api/receipt.d.ts +34 -0
- package/dist/api/receipt.js +60 -0
- package/dist/api/stat.d.ts +21 -0
- package/dist/api/stat.js +75 -0
- package/dist/api/survey.d.ts +82 -0
- package/dist/api/survey.js +122 -0
- package/dist/api/user.d.ts +80 -0
- package/dist/api/user.js +167 -0
- package/dist/eventBus/abstract.d.ts +4 -0
- package/dist/eventBus/abstract.js +29 -0
- package/dist/eventBus/userLogin.d.ts +5 -0
- package/dist/eventBus/userLogin.js +11 -0
- package/dist/eventBus/userLogout.d.ts +4 -0
- package/dist/eventBus/userLogout.js +11 -0
- package/dist/http/apiError.d.ts +4 -0
- package/dist/http/apiError.js +10 -0
- package/dist/http/apiRoute.d.ts +98 -0
- package/dist/http/apiRoute.js +197 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -0
- package/dist/interfaces/BannerType.d.ts +5 -0
- package/dist/interfaces/BannerType.js +7 -0
- package/dist/interfaces/apiStatEvents.d.ts +1 -0
- package/dist/interfaces/apiStatEvents.js +18 -0
- package/dist/interfaces/diplomaStatus.d.ts +8 -0
- package/dist/interfaces/diplomaStatus.js +9 -0
- package/dist/interfaces/iAppStore.d.ts +1 -0
- package/dist/interfaces/iAppStore.js +2 -0
- package/dist/interfaces/iAppVersionCheck.d.ts +5 -0
- package/dist/interfaces/iAppVersionCheck.js +2 -0
- package/dist/interfaces/iArticle.d.ts +15 -0
- package/dist/interfaces/iArticle.js +2 -0
- package/dist/interfaces/iBalance.d.ts +6 -0
- package/dist/interfaces/iBalance.js +2 -0
- package/dist/interfaces/iBank.d.ts +4 -0
- package/dist/interfaces/iBank.js +2 -0
- package/dist/interfaces/iBanner.d.ts +6 -0
- package/dist/interfaces/iBanner.js +2 -0
- package/dist/interfaces/iBookmark.d.ts +3 -0
- package/dist/interfaces/iBookmark.js +2 -0
- package/dist/interfaces/iBrand.d.ts +6 -0
- package/dist/interfaces/iBrand.js +2 -0
- package/dist/interfaces/iCatalog.d.ts +50 -0
- package/dist/interfaces/iCatalog.js +2 -0
- package/dist/interfaces/iCatalogNode.d.ts +3 -0
- package/dist/interfaces/iCatalogNode.js +2 -0
- package/dist/interfaces/iCatalogPreview.d.ts +17 -0
- package/dist/interfaces/iCatalogPreview.js +2 -0
- package/dist/interfaces/iCity.d.ts +4 -0
- package/dist/interfaces/iCity.js +2 -0
- package/dist/interfaces/iContentItem.d.ts +7 -0
- package/dist/interfaces/iContentItem.js +2 -0
- package/dist/interfaces/iEnv.d.ts +6 -0
- package/dist/interfaces/iEnv.js +2 -0
- package/dist/interfaces/iFilter.d.ts +11 -0
- package/dist/interfaces/iFilter.js +2 -0
- package/dist/interfaces/iGetNodeListProps.d.ts +8 -0
- package/dist/interfaces/iGetNodeListProps.js +2 -0
- package/dist/interfaces/iInstruction.d.ts +6 -0
- package/dist/interfaces/iInstruction.js +2 -0
- package/dist/interfaces/iIntro.d.ts +6 -0
- package/dist/interfaces/iIntro.js +2 -0
- package/dist/interfaces/iMessage.d.ts +25 -0
- package/dist/interfaces/iMessage.js +2 -0
- package/dist/interfaces/iNode.d.ts +26 -0
- package/dist/interfaces/iNode.js +2 -0
- package/dist/interfaces/iNodeTree.d.ts +14 -0
- package/dist/interfaces/iNodeTree.js +2 -0
- package/dist/interfaces/iPagingItems.d.ts +9 -0
- package/dist/interfaces/iPagingItems.js +2 -0
- package/dist/interfaces/iPayment.d.ts +20 -0
- package/dist/interfaces/iPayment.js +2 -0
- package/dist/interfaces/iPush.d.ts +14 -0
- package/dist/interfaces/iPush.js +2 -0
- package/dist/interfaces/iQuestion.d.ts +7 -0
- package/dist/interfaces/iQuestion.js +2 -0
- package/dist/interfaces/iReceipt.d.ts +20 -0
- package/dist/interfaces/iReceipt.js +2 -0
- package/dist/interfaces/iReceiptAddProps.d.ts +8 -0
- package/dist/interfaces/iReceiptAddProps.js +2 -0
- package/dist/interfaces/iReceiptProduct.d.ts +7 -0
- package/dist/interfaces/iReceiptProduct.js +2 -0
- package/dist/interfaces/iSearchParams.d.ts +11 -0
- package/dist/interfaces/iSearchParams.js +2 -0
- package/dist/interfaces/iShop.d.ts +6 -0
- package/dist/interfaces/iShop.js +2 -0
- package/dist/interfaces/iShopAddress.d.ts +5 -0
- package/dist/interfaces/iShopAddress.js +2 -0
- package/dist/interfaces/iSorter.d.ts +7 -0
- package/dist/interfaces/iSorter.js +2 -0
- package/dist/interfaces/iSpecialization.d.ts +4 -0
- package/dist/interfaces/iSpecialization.js +2 -0
- package/dist/interfaces/iStatView.d.ts +4 -0
- package/dist/interfaces/iStatView.js +2 -0
- package/dist/interfaces/iStorage.d.ts +5 -0
- package/dist/interfaces/iStorage.js +2 -0
- package/dist/interfaces/iStories.d.ts +13 -0
- package/dist/interfaces/iStories.js +2 -0
- package/dist/interfaces/iSubstance.d.ts +4 -0
- package/dist/interfaces/iSubstance.js +2 -0
- package/dist/interfaces/iSurvey.d.ts +36 -0
- package/dist/interfaces/iSurvey.js +2 -0
- package/dist/interfaces/iSurveyQuestion.d.ts +11 -0
- package/dist/interfaces/iSurveyQuestion.js +2 -0
- package/dist/interfaces/iSymptoms.d.ts +4 -0
- package/dist/interfaces/iSymptoms.js +2 -0
- package/dist/interfaces/iTestQuestion.d.ts +20 -0
- package/dist/interfaces/iTestQuestion.js +2 -0
- package/dist/interfaces/iTestResult.d.ts +17 -0
- package/dist/interfaces/iTestResult.js +2 -0
- package/dist/interfaces/iText.d.ts +3 -0
- package/dist/interfaces/iText.js +2 -0
- package/dist/interfaces/iUser.d.ts +35 -0
- package/dist/interfaces/iUser.js +2 -0
- package/dist/interfaces/iUserData.d.ts +10 -0
- package/dist/interfaces/iUserData.js +2 -0
- package/dist/interfaces/iUserEditProps.d.ts +20 -0
- package/dist/interfaces/iUserEditProps.js +2 -0
- package/dist/interfaces/iUserStat.d.ts +7 -0
- package/dist/interfaces/iUserStat.js +2 -0
- package/dist/interfaces/iUserSurvey.d.ts +21 -0
- package/dist/interfaces/iUserSurvey.js +11 -0
- package/dist/interfaces/iUserTokens.d.ts +4 -0
- package/dist/interfaces/iUserTokens.js +2 -0
- package/dist/interfaces/intRange.d.ts +3 -0
- package/dist/interfaces/intRange.js +2 -0
- package/dist/interfaces/itemType.d.ts +9 -0
- package/dist/interfaces/itemType.js +11 -0
- package/dist/interfaces/paymentStatus.d.ts +7 -0
- package/dist/interfaces/paymentStatus.js +9 -0
- package/dist/interfaces/paymentType.d.ts +5 -0
- package/dist/interfaces/paymentType.js +7 -0
- package/dist/interfaces/payoutType.d.ts +5 -0
- package/dist/interfaces/payoutType.js +7 -0
- package/dist/interfaces/pushStatus.d.ts +6 -0
- package/dist/interfaces/pushStatus.js +8 -0
- package/dist/interfaces/receiptStatus.d.ts +7 -0
- package/dist/interfaces/receiptStatus.js +9 -0
- package/dist/interfaces/testStatus.d.ts +6 -0
- package/dist/interfaces/testStatus.js +7 -0
- package/dist/interfaces/userRole.d.ts +6 -0
- package/dist/interfaces/userRole.js +14 -0
- package/dist/interfaces/userStatEvent.d.ts +5 -0
- package/dist/interfaces/userStatEvent.js +7 -0
- package/dist/interfaces/viewEventType.d.ts +13 -0
- package/dist/interfaces/viewEventType.js +19 -0
- package/dist/service/webSocketClient.d.ts +21 -0
- package/dist/service/webSocketClient.js +87 -0
- package/dist/storage/default.d.ts +2 -0
- package/dist/storage/default.js +8 -0
- package/dist/storage/user.d.ts +21 -0
- package/dist/storage/user.js +107 -0
- package/dist/utils/queryString.d.ts +3 -0
- package/dist/utils/queryString.js +21 -0
- package/package.json +31 -0
- package/src/api/abstract.ts +136 -0
- package/src/api/bookmarks.ts +109 -0
- package/src/api/chat.ts +127 -0
- package/src/api/content.ts +258 -0
- package/src/api/geoIp.ts +12 -0
- package/src/api/index.ts +38 -0
- package/src/api/payment.ts +105 -0
- package/src/api/promocode.ts +18 -0
- package/src/api/push.ts +102 -0
- package/src/api/stat.ts +74 -0
- package/src/api/survey.ts +164 -0
- package/src/api/user.ts +176 -0
- package/src/eventBus/abstract.ts +33 -0
- package/src/eventBus/userLogin.ts +13 -0
- package/src/eventBus/userLogout.ts +12 -0
- package/src/http/apiError.ts +9 -0
- package/src/http/apiRoute.ts +234 -0
- package/src/index.ts +2 -0
- package/src/interfaces/BannerType.ts +6 -0
- package/src/interfaces/apiStatEvents.ts +18 -0
- package/src/interfaces/diplomaStatus.ts +10 -0
- package/src/interfaces/iAppStore.ts +1 -0
- package/src/interfaces/iArticle.ts +12 -0
- package/src/interfaces/iBalance.ts +6 -0
- package/src/interfaces/iBank.ts +4 -0
- package/src/interfaces/iBanner.ts +6 -0
- package/src/interfaces/iBookmark.ts +3 -0
- package/src/interfaces/iCity.ts +4 -0
- package/src/interfaces/iContentItem.ts +6 -0
- package/src/interfaces/iEnv.ts +6 -0
- package/src/interfaces/iFilter.ts +16 -0
- package/src/interfaces/iGetNodeListProps.ts +9 -0
- package/src/interfaces/iInstruction.ts +6 -0
- package/src/interfaces/iIntro.ts +6 -0
- package/src/interfaces/iMessage.ts +25 -0
- package/src/interfaces/iNode.ts +24 -0
- package/src/interfaces/iNodeTree.ts +14 -0
- package/src/interfaces/iPagingItems.ts +8 -0
- package/src/interfaces/iPayment.ts +28 -0
- package/src/interfaces/iPush.ts +15 -0
- package/src/interfaces/iQuestion.ts +4 -0
- package/src/interfaces/iSearchParams.ts +12 -0
- package/src/interfaces/iSorter.ts +10 -0
- package/src/interfaces/iSpecialization.ts +4 -0
- package/src/interfaces/iStatView.ts +4 -0
- package/src/interfaces/iStorage.ts +5 -0
- package/src/interfaces/iStories.ts +10 -0
- package/src/interfaces/iSubstance.ts +4 -0
- package/src/interfaces/iSurvey.ts +38 -0
- package/src/interfaces/iSurveyQuestion.ts +15 -0
- package/src/interfaces/iSymptoms.ts +4 -0
- package/src/interfaces/iTestQuestion.ts +21 -0
- package/src/interfaces/iTestResult.ts +20 -0
- package/src/interfaces/iText.ts +3 -0
- package/src/interfaces/iUser.ts +37 -0
- package/src/interfaces/iUserData.ts +10 -0
- package/src/interfaces/iUserEditProps.ts +16 -0
- package/src/interfaces/iUserStat.ts +8 -0
- package/src/interfaces/iUserSurvey.ts +23 -0
- package/src/interfaces/iUserTokens.ts +4 -0
- package/src/interfaces/intRange.ts +5 -0
- package/src/interfaces/itemType.ts +10 -0
- package/src/interfaces/paymentStatus.ts +8 -0
- package/src/interfaces/paymentType.ts +6 -0
- package/src/interfaces/payoutType.ts +6 -0
- package/src/interfaces/pushStatus.ts +7 -0
- package/src/interfaces/testStatus.ts +8 -0
- package/src/interfaces/userRole.ts +13 -0
- package/src/interfaces/userStatEvent.ts +6 -0
- package/src/interfaces/viewEventType.ts +17 -0
- package/src/service/webSocketClient.ts +94 -0
- package/src/storage/default.ts +7 -0
- package/src/storage/user.ts +109 -0
- package/src/utils/queryString.ts +22 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { ApiAbstract } from "./abstract"
|
|
2
|
+
import { iSurvey } from "../interfaces/iSurvey"
|
|
3
|
+
import { iUserSurvey } from "../interfaces/iUserSurvey"
|
|
4
|
+
import { iPagingItems } from "../interfaces/iPagingItems"
|
|
5
|
+
import { ApiError } from "../http/apiError"
|
|
6
|
+
import {
|
|
7
|
+
apiRouteSurveyList,
|
|
8
|
+
apiRouteSurveyItem,
|
|
9
|
+
apiRouteSurveyStart,
|
|
10
|
+
apiRouteSurveySaveAnswer,
|
|
11
|
+
apiRouteSurveyCancel,
|
|
12
|
+
apiRouteSurveyHistory
|
|
13
|
+
} from "../http/apiRoute"
|
|
14
|
+
|
|
15
|
+
export class ApiSurvey extends ApiAbstract {
|
|
16
|
+
/**
|
|
17
|
+
* Получить список доступных опросов
|
|
18
|
+
* @param {number} page - номер страницы (с 1)
|
|
19
|
+
* @param {keyof iSurvey} select - выбор полей ответа
|
|
20
|
+
* @param {boolean} bookmarks - только избранные опросы
|
|
21
|
+
*/
|
|
22
|
+
async getList<Keys extends keyof iSurvey>({
|
|
23
|
+
page = 1,
|
|
24
|
+
select,
|
|
25
|
+
bookmarks,
|
|
26
|
+
}: {
|
|
27
|
+
page: number
|
|
28
|
+
select?: Keys[]
|
|
29
|
+
bookmarks?: boolean
|
|
30
|
+
}) {
|
|
31
|
+
return await this.fetcher<iPagingItems<Pick<iSurvey, Keys>>>({
|
|
32
|
+
route: apiRouteSurveyList({
|
|
33
|
+
page,
|
|
34
|
+
sorters: ["priority asc", "id desc"],
|
|
35
|
+
select,
|
|
36
|
+
bookmarks
|
|
37
|
+
}),
|
|
38
|
+
options: { addToken: true }
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Получить список избранных опросов
|
|
44
|
+
* @param {number} page - номер страницы (с 1)
|
|
45
|
+
* @param {keyof iSurvey} select - выбор полей ответа
|
|
46
|
+
*/
|
|
47
|
+
async getBookmarks<Keys extends keyof iSurvey>({
|
|
48
|
+
page = 1,
|
|
49
|
+
select,
|
|
50
|
+
}: {
|
|
51
|
+
page: number
|
|
52
|
+
select?: Keys[]
|
|
53
|
+
}) {
|
|
54
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
55
|
+
|
|
56
|
+
return await this.fetcher<iPagingItems<Pick<iSurvey, Keys>>>({
|
|
57
|
+
route: apiRouteSurveyList({
|
|
58
|
+
page,
|
|
59
|
+
sorters: ["priority desc", "id desc"],
|
|
60
|
+
select,
|
|
61
|
+
bookmarks: true
|
|
62
|
+
}),
|
|
63
|
+
options: { addToken: true }
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Получить один опрос с вопросами
|
|
69
|
+
* @param {number} id - id опроса
|
|
70
|
+
*/
|
|
71
|
+
async getOne({ id }: { id: number }) {
|
|
72
|
+
return (await this.fetcher<{ item: iSurvey }>({
|
|
73
|
+
route: apiRouteSurveyItem(id),
|
|
74
|
+
options: { addToken: true }
|
|
75
|
+
})).item
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Начать прохождение опроса
|
|
80
|
+
* @param {number} surveyId - id опроса
|
|
81
|
+
* @param {AbortSignal} signal
|
|
82
|
+
*/
|
|
83
|
+
async start(surveyId: number, signal?: AbortSignal | null) {
|
|
84
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
85
|
+
|
|
86
|
+
return await this.fetcher<{ success: boolean, userSurvey: iUserSurvey }>({
|
|
87
|
+
route: apiRouteSurveyStart(surveyId),
|
|
88
|
+
postBody: {},
|
|
89
|
+
options: {
|
|
90
|
+
addToken: true,
|
|
91
|
+
signal
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Сохранить ответ на вопрос
|
|
98
|
+
* @param {number} userSurveyId - id прохождения опроса
|
|
99
|
+
* @param {number} questionIndex - индекс вопроса
|
|
100
|
+
* @param {number | number[] | string} answer - ответ (для single: number, для multiple: number[], для text: string)
|
|
101
|
+
* @param {AbortSignal} signal
|
|
102
|
+
*/
|
|
103
|
+
async saveAnswer({
|
|
104
|
+
userSurveyId,
|
|
105
|
+
questionIndex,
|
|
106
|
+
answer,
|
|
107
|
+
signal
|
|
108
|
+
}: {
|
|
109
|
+
userSurveyId: number
|
|
110
|
+
questionIndex: number
|
|
111
|
+
answer: number | number[] | string
|
|
112
|
+
signal?: AbortSignal | null
|
|
113
|
+
}) {
|
|
114
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
115
|
+
|
|
116
|
+
return await this.fetcher<{
|
|
117
|
+
success: boolean
|
|
118
|
+
completed: boolean
|
|
119
|
+
next_question_index: number | null
|
|
120
|
+
message: string
|
|
121
|
+
}>({
|
|
122
|
+
route: apiRouteSurveySaveAnswer(userSurveyId),
|
|
123
|
+
postBody: {
|
|
124
|
+
question_index: questionIndex,
|
|
125
|
+
answer
|
|
126
|
+
},
|
|
127
|
+
options: {
|
|
128
|
+
addToken: true,
|
|
129
|
+
signal
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Отменить прохождение опроса
|
|
136
|
+
* @param {number} userSurveyId - id прохождения опроса
|
|
137
|
+
* @param {AbortSignal} signal
|
|
138
|
+
*/
|
|
139
|
+
async cancel(userSurveyId: number, signal?: AbortSignal | null) {
|
|
140
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
141
|
+
|
|
142
|
+
return await this.fetcher<{ success: boolean, message: string }>({
|
|
143
|
+
route: apiRouteSurveyCancel(userSurveyId),
|
|
144
|
+
postBody: {},
|
|
145
|
+
options: {
|
|
146
|
+
addToken: true,
|
|
147
|
+
signal
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Получить историю прохождений опросов пользователя
|
|
154
|
+
* @param {number} page - номер страницы (с 1)
|
|
155
|
+
*/
|
|
156
|
+
async getHistory({ page = 1 }: { page?: number } = {}) {
|
|
157
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
158
|
+
|
|
159
|
+
return await this.fetcher<iPagingItems<iUserSurvey>>({
|
|
160
|
+
route: apiRouteSurveyHistory({ page }),
|
|
161
|
+
options: { addToken: true }
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
}
|
package/src/api/user.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
|
|
2
|
+
import { ApiError } from "../http/apiError"
|
|
3
|
+
import {
|
|
4
|
+
apiRouteUserDelete,
|
|
5
|
+
apiRouteUserEdit,
|
|
6
|
+
apiRouteUserGetMe,
|
|
7
|
+
apiRouteUserLoginWithCode,
|
|
8
|
+
apiRouteUserLogout,
|
|
9
|
+
apiRouteUserSetRef,
|
|
10
|
+
apiRouteUserDiplomaUpload,
|
|
11
|
+
apiRouteUserDiplomaStatus
|
|
12
|
+
} from "../http/apiRoute"
|
|
13
|
+
import { iUserEditProps } from "../interfaces/iUserEditProps"
|
|
14
|
+
import { iUser } from "../interfaces/iUser"
|
|
15
|
+
import { iUserTokens } from "../interfaces/iUserTokens"
|
|
16
|
+
import { DiplomaStatusValue } from "../interfaces/diplomaStatus"
|
|
17
|
+
import { ApiAbstract } from "./abstract"
|
|
18
|
+
import { eventBusUserLogin } from "../eventBus/userLogin"
|
|
19
|
+
import { eventBusUserLogout } from "../eventBus/userLogout"
|
|
20
|
+
|
|
21
|
+
export class ApiUser extends ApiAbstract {
|
|
22
|
+
/**
|
|
23
|
+
* получает пользователя из расшифрованного JWT токена без запроса на backend
|
|
24
|
+
*/
|
|
25
|
+
get() {
|
|
26
|
+
return this.userStorage.getUser()
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* получает полную информацию о пользователе с сервера
|
|
30
|
+
*/
|
|
31
|
+
async getFull() {
|
|
32
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
33
|
+
return this.fetcher<iUser>({ route: apiRouteUserGetMe, options: { addToken: true } })
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 1ый этап регистрации или авторизации
|
|
37
|
+
*/
|
|
38
|
+
async loginOrRegisterByPhone({ phone }: { phone: string }) {
|
|
39
|
+
try {
|
|
40
|
+
await this.fetcher({ route: apiRouteUserLoginWithCode, postBody: { login: phone } })
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (error instanceof ApiError && error.message == "confirm_phone") return
|
|
43
|
+
throw error
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 2ой этап регистрации или авторизации - ввод кода подтверждения
|
|
48
|
+
*/
|
|
49
|
+
async loginOrRegisterByPhoneConfirm({ phone, code }: { phone: string, code: string }) {
|
|
50
|
+
const data = await this.fetcher<iUserTokens>({
|
|
51
|
+
route: apiRouteUserLoginWithCode,
|
|
52
|
+
postBody: { login: phone, phone_code: code }
|
|
53
|
+
})
|
|
54
|
+
const user = await this.userStorage.setUser(data.accessToken, data.refreshToken)
|
|
55
|
+
if (user) eventBusUserLogin.broadcast(user)
|
|
56
|
+
return user
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ввод реферального кода другого пользователя
|
|
60
|
+
* @param {string} props.ref - реферальный код
|
|
61
|
+
*/
|
|
62
|
+
async setRef({ ref }: { ref: string }) {
|
|
63
|
+
await this.fetcher({
|
|
64
|
+
route: apiRouteUserSetRef,
|
|
65
|
+
postBody: { ref },
|
|
66
|
+
options: { addToken: true }
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* редактирование пользователя
|
|
71
|
+
* если метод вернул false - то необходимо ввести код из email и передать его в data.email_code
|
|
72
|
+
* @param {string} props.email - опционально, для смены email. Если емейл не меняется то не передаем этот параметр или передаем пустую строку
|
|
73
|
+
* @param {number} props.city - id города
|
|
74
|
+
* @param {string} props.email_code - код отправленный на email. Первый раз метод вызывается без него, если метод вернул false необходимо вызвать повторно передав код из email
|
|
75
|
+
*/
|
|
76
|
+
async editUser(data: iUserEditProps) {
|
|
77
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
78
|
+
try {
|
|
79
|
+
await this.fetcher({
|
|
80
|
+
route: apiRouteUserEdit,
|
|
81
|
+
postBody: data,
|
|
82
|
+
options: { addToken: true }
|
|
83
|
+
})
|
|
84
|
+
if (data.firstname?.length && data.lastname?.length) {
|
|
85
|
+
await this.userStorage.saveUser({ firstname: data.firstname, lastname: data.lastname })
|
|
86
|
+
}
|
|
87
|
+
return true
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (error instanceof ApiError && error.message == "confirm_email") return false
|
|
90
|
+
throw error
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* выход из ЛК
|
|
96
|
+
*/
|
|
97
|
+
async logout() {
|
|
98
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
99
|
+
await this.userStorage.clearUser()
|
|
100
|
+
await eventBusUserLogout.broadcast()
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* выход из ЛК (выход со всех устройств, на сервере будет удален refresh token, accessToken продолжит действовать остаток своего времени. Другие устройства разлогинет в течении 5 минут)
|
|
104
|
+
*/
|
|
105
|
+
async logoutAllDevice() {
|
|
106
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
107
|
+
await this.fetcher({
|
|
108
|
+
route: apiRouteUserLogout,
|
|
109
|
+
postBody: { logout: 1 },
|
|
110
|
+
options: { addToken: true }
|
|
111
|
+
})
|
|
112
|
+
await this.userStorage.clearUser()
|
|
113
|
+
await eventBusUserLogout.broadcast()
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* подписка на событие logout
|
|
117
|
+
*/
|
|
118
|
+
onLogout = eventBusUserLogout.subscribe
|
|
119
|
+
/**
|
|
120
|
+
* удаление аккаунта пользователя, сделавшего запрос и всех связанных с ним сущностей (уведомлений, выплат, чеков, статистики и т.д.)
|
|
121
|
+
*/
|
|
122
|
+
async delete() {
|
|
123
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
124
|
+
await this.fetcher({
|
|
125
|
+
route: apiRouteUserDelete,
|
|
126
|
+
postBody: { confirm: "1" },
|
|
127
|
+
options: { addToken: true }
|
|
128
|
+
})
|
|
129
|
+
await this.userStorage.clearUser()
|
|
130
|
+
await eventBusUserLogout.broadcast()
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* возвращает реф. код пользователя, который другие пользователя вводят при регистрации
|
|
135
|
+
*/
|
|
136
|
+
async getMyReferer() {
|
|
137
|
+
return (await this.getFull())?.my_ref_code
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// =====================================================
|
|
141
|
+
// Методы для работы с дипломом (Medotvet)
|
|
142
|
+
// =====================================================
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Загрузить файлы диплома
|
|
146
|
+
* @param formData - FormData с файлами (ключ "diploma[]")
|
|
147
|
+
*/
|
|
148
|
+
async uploadDiploma(formData: FormData) {
|
|
149
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
150
|
+
return await this.fetcher<{
|
|
151
|
+
success: boolean,
|
|
152
|
+
diploma_files: string[],
|
|
153
|
+
diploma_status: DiplomaStatusValue
|
|
154
|
+
}>({
|
|
155
|
+
route: apiRouteUserDiplomaUpload,
|
|
156
|
+
postBody: formData,
|
|
157
|
+
options: { addToken: true }
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Получить статус диплома
|
|
163
|
+
* @returns diploma_status: 1-не загружен, 2-на проверке, 3-верифицирован, 4-отклонен
|
|
164
|
+
*/
|
|
165
|
+
async getDiplomaStatus() {
|
|
166
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
167
|
+
return await this.fetcher<{
|
|
168
|
+
diploma_status: DiplomaStatusValue,
|
|
169
|
+
diploma_files: string[],
|
|
170
|
+
diploma_reject_reason: string | null
|
|
171
|
+
}>({
|
|
172
|
+
route: apiRouteUserDiplomaStatus,
|
|
173
|
+
options: { addToken: true }
|
|
174
|
+
})
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const subscriptions: { [key: string]: Set<(...args: any[]) => Promise<void>> } = {}
|
|
2
|
+
|
|
3
|
+
const subscribe = (eventName: string, callback: (...args: any[]) => Promise<void>) => {
|
|
4
|
+
if (!subscriptions[eventName]) {
|
|
5
|
+
subscriptions[eventName] = new Set()
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const callbacks = subscriptions[eventName]
|
|
9
|
+
callbacks.add(callback)
|
|
10
|
+
|
|
11
|
+
return () => {
|
|
12
|
+
callbacks.delete(callback)
|
|
13
|
+
|
|
14
|
+
if (callbacks.size === 0) {
|
|
15
|
+
delete subscriptions[eventName]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const broadcast = async (eventName: string, ...args: any[]) => {
|
|
21
|
+
if (!subscriptions[eventName]) return
|
|
22
|
+
|
|
23
|
+
const callbacks = subscriptions[eventName]
|
|
24
|
+
|
|
25
|
+
for (const callback of Array.from(callbacks)) {
|
|
26
|
+
await callback(...args)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const abstract = {
|
|
31
|
+
subscribe,
|
|
32
|
+
broadcast
|
|
33
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { abstract } from "./abstract"
|
|
2
|
+
import { iUserData } from "../interfaces/iUserData"
|
|
3
|
+
|
|
4
|
+
const eventName = "userLogin"
|
|
5
|
+
|
|
6
|
+
const subscribe = (callback: (user: iUserData) => Promise<void>) => abstract.subscribe(eventName, callback)
|
|
7
|
+
|
|
8
|
+
const broadcast = (user: iUserData) => abstract.broadcast(eventName, user)
|
|
9
|
+
|
|
10
|
+
export const eventBusUserLogin = {
|
|
11
|
+
subscribe,
|
|
12
|
+
broadcast
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { abstract } from "./abstract"
|
|
2
|
+
|
|
3
|
+
const eventName = "userLogout"
|
|
4
|
+
|
|
5
|
+
const subscribe = (callback: () => Promise<void>) => abstract.subscribe(eventName, callback)
|
|
6
|
+
|
|
7
|
+
const broadcast = () => abstract.broadcast(eventName)
|
|
8
|
+
|
|
9
|
+
export const eventBusUserLogout = {
|
|
10
|
+
subscribe,
|
|
11
|
+
broadcast
|
|
12
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { iAppStore } from "../interfaces/iAppStore"
|
|
2
|
+
import { iFilter } from "../interfaces/iFilter"
|
|
3
|
+
import { iGetNodeListProps } from "../interfaces/iGetNodeListProps"
|
|
4
|
+
import { iPayment } from "../interfaces/iPayment"
|
|
5
|
+
import { iPush } from "../interfaces/iPush"
|
|
6
|
+
import { iSurvey } from "../interfaces/iSurvey"
|
|
7
|
+
import { queryString } from "../utils/queryString"
|
|
8
|
+
|
|
9
|
+
export const apiRouteEnv = "/env"
|
|
10
|
+
export const apiRouteCheckAppVersion = (appStore: iAppStore, appVersion: string) => `/env/check_app_version/${appStore}/${appVersion}`
|
|
11
|
+
export const apiRouteGetCloudVersion = (appStore: iAppStore) => `/env/get_cloud_version/${appStore}`
|
|
12
|
+
|
|
13
|
+
export const apiRouteList = <T>({
|
|
14
|
+
nodeCode,
|
|
15
|
+
nodeGenerator,
|
|
16
|
+
page = 1,//отсчет страниц с первой, чтобы не было путаницы
|
|
17
|
+
filters = undefined,
|
|
18
|
+
sorters = undefined,
|
|
19
|
+
select = undefined,
|
|
20
|
+
perPage = undefined,
|
|
21
|
+
subNodes = false,
|
|
22
|
+
}: {
|
|
23
|
+
nodeCode: string,
|
|
24
|
+
nodeGenerator?: string[]
|
|
25
|
+
page?: number,
|
|
26
|
+
filters?: iFilter<T>,
|
|
27
|
+
sorters?: string[]
|
|
28
|
+
select?: string[]
|
|
29
|
+
perPage?: number
|
|
30
|
+
subNodes?: boolean
|
|
31
|
+
}) => {
|
|
32
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
33
|
+
if (!nodeCode.includes("/type") && !nodeCode.includes("/tag/")) {
|
|
34
|
+
nodeCode = nodeCode.replaceAll("/", ".")
|
|
35
|
+
}
|
|
36
|
+
const getParams: string[] = []
|
|
37
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
38
|
+
if (sorters) getParams.push(queryString({ sorter: sorters }))
|
|
39
|
+
if (select) getParams.push('select=' + select.join(","))
|
|
40
|
+
if (perPage) getParams.push('perpage=' + perPage)
|
|
41
|
+
if (subNodes) getParams.push('subnodes')
|
|
42
|
+
return `/content/${nodeCode}/list/${page}` +
|
|
43
|
+
(nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '') +
|
|
44
|
+
(getParams ? '?' : '') +
|
|
45
|
+
getParams.join("&")
|
|
46
|
+
}
|
|
47
|
+
//метод получает фильтры и доступные значения фильтра
|
|
48
|
+
export const apiRouteFilters = <T>({
|
|
49
|
+
nodeCode,
|
|
50
|
+
nodeGenerator,
|
|
51
|
+
filters = undefined,
|
|
52
|
+
subNodes = false,
|
|
53
|
+
}: {
|
|
54
|
+
nodeCode: string,
|
|
55
|
+
nodeGenerator?: string[]
|
|
56
|
+
filters?: iFilter<T>,
|
|
57
|
+
subNodes?: boolean
|
|
58
|
+
}) => {
|
|
59
|
+
if (!nodeCode.includes("/type") && !nodeCode.includes("/tag/")) {
|
|
60
|
+
nodeCode = nodeCode.replaceAll("/", ".")
|
|
61
|
+
}
|
|
62
|
+
const getParams: string[] = []
|
|
63
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
64
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
65
|
+
if (subNodes) getParams.push('subnodes')
|
|
66
|
+
return `/content/${nodeCode}/filters` +
|
|
67
|
+
(nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '') +
|
|
68
|
+
(getParams ? '?' : '') +
|
|
69
|
+
getParams.join("&")
|
|
70
|
+
}
|
|
71
|
+
export const apiRouteItem = (nodeCode: string, itemCode: string) =>
|
|
72
|
+
`/content/${nodeCode.replaceAll("/", ".")}/item/code/${itemCode}`
|
|
73
|
+
|
|
74
|
+
export const apiRouteItemById = (nodeCode: string, itemId: number) =>
|
|
75
|
+
`/content/${nodeCode.replaceAll("/", ".")}/item/id/${itemId}`
|
|
76
|
+
|
|
77
|
+
export const apiRouteNodeTree = (parent: number = 0) => `/node/tree/${parent}`
|
|
78
|
+
//метод получает фильтры, возвращает подкатегории в которых есть товары по этим фильтрам
|
|
79
|
+
export const apiRouteNodeTreeContentByFilters = <T>({
|
|
80
|
+
parent,
|
|
81
|
+
filters = undefined,
|
|
82
|
+
subNodes,
|
|
83
|
+
}: {
|
|
84
|
+
parent: number,
|
|
85
|
+
filters?: iFilter<T>,
|
|
86
|
+
subNodes: boolean
|
|
87
|
+
}) => {
|
|
88
|
+
const getParams: string[] = []
|
|
89
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
90
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
91
|
+
if (subNodes) getParams.push('subnodes')
|
|
92
|
+
return `/node/tree/by_content_filters/${parent}` +
|
|
93
|
+
(getParams ? '?' : '') +
|
|
94
|
+
getParams.join("&")
|
|
95
|
+
}
|
|
96
|
+
export const apiRouteNodeList = <T>({
|
|
97
|
+
page = 1,//отсчет страниц с первой, чтобы не было путаницы
|
|
98
|
+
filters = undefined,
|
|
99
|
+
sorter = undefined,
|
|
100
|
+
perPage = undefined,
|
|
101
|
+
setParams = false
|
|
102
|
+
}: iGetNodeListProps<T>) => {
|
|
103
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
104
|
+
const getParams: string[] = []
|
|
105
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
106
|
+
if (sorter) getParams.push(queryString({ sorter: sorter }))
|
|
107
|
+
if (perPage) getParams.push('perpage=' + perPage)
|
|
108
|
+
if (setParams) getParams.push('set_params')
|
|
109
|
+
return `/node/list/${page}` +
|
|
110
|
+
(getParams ? '?' : '') +
|
|
111
|
+
getParams.join("&")
|
|
112
|
+
}
|
|
113
|
+
export const apiRouteNode = (nodeCode: string, nodeGenerator?: string[]) =>
|
|
114
|
+
`/node/item/${nodeCode.replaceAll("/", ".")}` +
|
|
115
|
+
(nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '')
|
|
116
|
+
export const apiRouteNodeById = (nodeId: number) => `/node/item/id/${nodeId}`
|
|
117
|
+
export const apiRouteNodeGeneratedLinks = (nodeCode: string, pageIndex: number = 0, isAll: boolean = false) =>
|
|
118
|
+
`/content/${nodeCode.replaceAll("/", ".")}/generator_links/${pageIndex + 1}${isAll ? '/all' : ""}`
|
|
119
|
+
|
|
120
|
+
//basket
|
|
121
|
+
export const apiRouteBasketTotal = () => `/basket/total`
|
|
122
|
+
export const apiRouteBasketGet = () => `/basket/get`
|
|
123
|
+
export const apiRouteBasketMutate = () => `/basket/mutate`
|
|
124
|
+
export const apiRouteBasketMoveToDraft = () => `/basket/move_to_draft`
|
|
125
|
+
//geo
|
|
126
|
+
export const apiRouteGeoDetect = `/geo/detect`
|
|
127
|
+
//user
|
|
128
|
+
export const apiRouteUserGetMe = `/user/get_me`
|
|
129
|
+
export const apiRouteUserRefresh = `/user/refresh`
|
|
130
|
+
export const apiRouteUserLoginWithCode = `/user/login_with_code`
|
|
131
|
+
export const apiRouteUserEdit = '/user/edit'
|
|
132
|
+
export const apiRouteUserUploadPhoto = '/user/upload_photo'
|
|
133
|
+
export const apiRouteUserLogout = '/user/logout'
|
|
134
|
+
export const apiRouteUserDelete = '/user/delete'
|
|
135
|
+
export const apiRouteUserSetRef = '/user/set_ref'
|
|
136
|
+
// Диплом (Medotvet)
|
|
137
|
+
export const apiRouteUserDiplomaUpload = '/user/diploma'
|
|
138
|
+
export const apiRouteUserDiplomaStatus = '/user/diploma/status'
|
|
139
|
+
//survey
|
|
140
|
+
export const apiRouteSurveyList = ({
|
|
141
|
+
page = 1,
|
|
142
|
+
filters = undefined,
|
|
143
|
+
sorters = undefined,
|
|
144
|
+
select = undefined,
|
|
145
|
+
bookmarks = false,
|
|
146
|
+
}: {
|
|
147
|
+
page?: number,
|
|
148
|
+
filters?: iFilter<iSurvey>,
|
|
149
|
+
sorters?: string[],
|
|
150
|
+
select?: string[],
|
|
151
|
+
bookmarks?: boolean
|
|
152
|
+
}) => {
|
|
153
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
154
|
+
const getParams: string[] = []
|
|
155
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
156
|
+
if (sorters) getParams.push(queryString({ sorter: sorters }))
|
|
157
|
+
if (select) getParams.push('select=' + select.join(","))
|
|
158
|
+
return `/survey/${bookmarks ? 'bookmarks' : 'list'}/${page}` +
|
|
159
|
+
(getParams.length ? '?' : '') +
|
|
160
|
+
getParams.join("&")
|
|
161
|
+
}
|
|
162
|
+
export const apiRouteSurveyItem = (id: number) => `/survey/item/${id}`
|
|
163
|
+
export const apiRouteSurveyStart = (surveyId: number) => `/survey/${surveyId}/start`
|
|
164
|
+
export const apiRouteSurveySaveAnswer = (userSurveyId: number) => `/survey/${userSurveyId}/answer`
|
|
165
|
+
export const apiRouteSurveyCancel = (userSurveyId: number) => `/survey/${userSurveyId}/cancel`
|
|
166
|
+
export const apiRouteSurveyHistory = ({ page = 1 }: { page?: number } = {}) => `/survey/history/${page}`
|
|
167
|
+
//payment
|
|
168
|
+
export const apiRoutePaymentAdd = '/payment/add'
|
|
169
|
+
export const apiRoutePaymentList = ({
|
|
170
|
+
page = 1,//отсчет страниц с первой, чтобы не было путаницы
|
|
171
|
+
filters = undefined,
|
|
172
|
+
sorters = undefined,
|
|
173
|
+
select = undefined,
|
|
174
|
+
}: {
|
|
175
|
+
page?: number,
|
|
176
|
+
filters?: iFilter<iPayment>,
|
|
177
|
+
sorters?: string[],
|
|
178
|
+
select?: string[]
|
|
179
|
+
}) => {
|
|
180
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
181
|
+
const getParams: string[] = []
|
|
182
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
183
|
+
if (sorters) getParams.push(queryString({ sorter: sorters }))
|
|
184
|
+
if (select) getParams.push('select=' + select.join(","))
|
|
185
|
+
return `/payment/list/${page}` +
|
|
186
|
+
(getParams ? '?' : '') +
|
|
187
|
+
getParams.join("&")
|
|
188
|
+
}
|
|
189
|
+
export const apiRoutePaymentBalance = '/payment/balance'
|
|
190
|
+
export const apiRoutePaymentVerificationUrl = '/payment/verification_url'
|
|
191
|
+
export const apiRoutePaymentVerificationStatus = '/payment/verification_status'
|
|
192
|
+
//stat
|
|
193
|
+
export const apiRouteViewAdd = '/view/add'
|
|
194
|
+
export const apiRouteStatAdd = '/stat/add'
|
|
195
|
+
export const apiRouteStatGet = '/stat/get'
|
|
196
|
+
//bookmarks
|
|
197
|
+
export const apiRouteBookmarksGet = '/bookmarks/get'
|
|
198
|
+
export const apiRouteBookmarksAdd = '/bookmarks/add'
|
|
199
|
+
export const apiRouteBookmarksRemove = '/bookmarks/remove'
|
|
200
|
+
export const apiRouteBookmarksCount = '/bookmarks/count'
|
|
201
|
+
//banner
|
|
202
|
+
export const apiRouteBannerGetRand = (type: number) => `/banner/get_rand/${type}`
|
|
203
|
+
//push
|
|
204
|
+
export const apiRoutePushList = ({
|
|
205
|
+
page = 1,//отсчет страниц с первой, чтобы не было путаницы
|
|
206
|
+
filters = undefined,
|
|
207
|
+
sorters = undefined,
|
|
208
|
+
select = undefined,
|
|
209
|
+
}: {
|
|
210
|
+
page?: number,
|
|
211
|
+
filters?: iFilter<iPush>,
|
|
212
|
+
sorters?: string[],
|
|
213
|
+
select?: string[]
|
|
214
|
+
}) => {
|
|
215
|
+
const hasFilters = filters && Object.keys(filters).length
|
|
216
|
+
const getParams: string[] = []
|
|
217
|
+
if (hasFilters) getParams.push(queryString({ filters: filters }))
|
|
218
|
+
if (sorters) getParams.push(queryString({ sorter: sorters }))
|
|
219
|
+
if (select) getParams.push('select=' + select.join(","))
|
|
220
|
+
return `/push/list/${page}` +
|
|
221
|
+
(getParams ? '?' : '') +
|
|
222
|
+
getParams.join("&")
|
|
223
|
+
}
|
|
224
|
+
export const apiRoutePushCountNew = '/push/count_new'
|
|
225
|
+
export const apiRoutePushRegister = '/push/register'
|
|
226
|
+
export const apiRoutePushUnsubscribe = '/push/unsubscribe'
|
|
227
|
+
export const apiRoutePushIsSubscribed = '/push/is_subscribed'
|
|
228
|
+
|
|
229
|
+
export const apiRoutePushView = '/push/view'
|
|
230
|
+
export const apiRoutePushViewAll = '/push/view_all'
|
|
231
|
+
|
|
232
|
+
export const apiRouteChatUnread = '/chat/unread'
|
|
233
|
+
|
|
234
|
+
export const apiRoutePromocodeActivate = '/promocode/activate'
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const apiStatEvents = [
|
|
2
|
+
"ARTICLES/VIEW",//открытие статьи
|
|
3
|
+
"ARTICLES/READ",//прочтение статьи
|
|
4
|
+
"ARTICLES/SKU_BTN",//клик по кнопке акции в статье
|
|
5
|
+
|
|
6
|
+
"CATALOG_SKU/VIEW", // открытие акции
|
|
7
|
+
"CATALOG_SKU/FAVORITE", //добавление акции в избранное
|
|
8
|
+
"CATALOG_SKU/PROMO_BLOCK", //клик по промоблоку
|
|
9
|
+
"CATALOG_SKU/PRESENTATION_CLICK", //клик по презентации
|
|
10
|
+
"CATALOG_SKU/PRESENTATION_SUCCESS", //полностью посмотрели презентацию
|
|
11
|
+
"CATALOG_SKU/QUESTIONS_CLICK",//клик по квизу (вопросам)
|
|
12
|
+
"CATALOG_SKU/QUESTIONS_SUCCESS",//ответили правильно на все вопросы
|
|
13
|
+
|
|
14
|
+
"BANNER/VIEW",//просмотр баннера
|
|
15
|
+
"BANNER/CLICK",//клик по баннеру
|
|
16
|
+
|
|
17
|
+
"STORIES/VIEW"//просмотр сториса
|
|
18
|
+
] as const
|