@escapenavigator/utils 1.10.175 → 2.0.0
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.
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import { WidgetChatConversationStatusEnum } from '@escapenavigator/types/dist/widget-chat/enum/widget-chat-conversation-status.enum';
|
|
2
|
+
import { WidgetChatMessageAuthorEnum } from '@escapenavigator/types/dist/widget-chat/enum/widget-chat-message-author.enum';
|
|
2
3
|
type ConversationAttentionInput = {
|
|
3
4
|
status?: WidgetChatConversationStatusEnum | null;
|
|
4
|
-
unreadCount: number;
|
|
5
5
|
aiEnabled: boolean;
|
|
6
6
|
aiPaused: boolean;
|
|
7
|
+
lastMessageAuthor?: WidgetChatMessageAuthorEnum | null;
|
|
7
8
|
};
|
|
8
9
|
/**
|
|
9
|
-
* Беседа «ждёт
|
|
10
|
-
* - есть непрочитанные сообщения посетителя;
|
|
10
|
+
* Беседа «ждёт ответа оператора» (для бейджа в меню и подсветки в списке) когда:
|
|
11
11
|
* - беседа не помечена решённой;
|
|
12
|
-
* - ИИ НЕ ведёт диалог сам —
|
|
13
|
-
*
|
|
12
|
+
* - ИИ НЕ ведёт диалог сам — он передал оператору (aiPaused) или вообще выключен;
|
|
13
|
+
* - последнее сообщение НЕ от staff, т.е. оператор ещё не ответил.
|
|
14
|
+
*
|
|
15
|
+
* ВАЖНО: признак НЕ зависит от прочтения (unreadCount). Раньше прочтение
|
|
16
|
+
* (mark-read) обнуляло unread и диалог «пропадал» из ожидания, хотя оператор
|
|
17
|
+
* так и не ответил. Теперь ожидание снимается только ответом оператора
|
|
18
|
+
* (lastMessageAuthor становится STAFF) или закрытием диалога.
|
|
14
19
|
*
|
|
15
20
|
* Пока ИИ общается (aiEnabled && !aiPaused), такие диалоги внимание оператора
|
|
16
21
|
* не требуют, поэтому в счётчик/подсветку не попадают.
|
|
17
22
|
*/
|
|
18
23
|
export declare const conversationAwaitsHuman: (conversation: ConversationAttentionInput) => boolean;
|
|
19
24
|
/**
|
|
20
|
-
*
|
|
25
|
+
* Число диалогов, которые реально ждут ответа оператора.
|
|
21
26
|
* Используется для бейджа в меню (app) и в таб-баре (mobile).
|
|
22
27
|
*/
|
|
23
28
|
export declare const countAwaitingHuman: (conversations: ConversationAttentionInput[]) => number;
|
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.countAwaitingHuman = exports.conversationAwaitsHuman = void 0;
|
|
4
4
|
const widget_chat_conversation_status_enum_1 = require("@escapenavigator/types/dist/widget-chat/enum/widget-chat-conversation-status.enum");
|
|
5
|
+
const widget_chat_message_author_enum_1 = require("@escapenavigator/types/dist/widget-chat/enum/widget-chat-message-author.enum");
|
|
5
6
|
/**
|
|
6
|
-
* Беседа «ждёт
|
|
7
|
-
* - есть непрочитанные сообщения посетителя;
|
|
7
|
+
* Беседа «ждёт ответа оператора» (для бейджа в меню и подсветки в списке) когда:
|
|
8
8
|
* - беседа не помечена решённой;
|
|
9
|
-
* - ИИ НЕ ведёт диалог сам —
|
|
10
|
-
*
|
|
9
|
+
* - ИИ НЕ ведёт диалог сам — он передал оператору (aiPaused) или вообще выключен;
|
|
10
|
+
* - последнее сообщение НЕ от staff, т.е. оператор ещё не ответил.
|
|
11
|
+
*
|
|
12
|
+
* ВАЖНО: признак НЕ зависит от прочтения (unreadCount). Раньше прочтение
|
|
13
|
+
* (mark-read) обнуляло unread и диалог «пропадал» из ожидания, хотя оператор
|
|
14
|
+
* так и не ответил. Теперь ожидание снимается только ответом оператора
|
|
15
|
+
* (lastMessageAuthor становится STAFF) или закрытием диалога.
|
|
11
16
|
*
|
|
12
17
|
* Пока ИИ общается (aiEnabled && !aiPaused), такие диалоги внимание оператора
|
|
13
18
|
* не требуют, поэтому в счётчик/подсветку не попадают.
|
|
@@ -15,14 +20,17 @@ const widget_chat_conversation_status_enum_1 = require("@escapenavigator/types/d
|
|
|
15
20
|
const conversationAwaitsHuman = (conversation) => {
|
|
16
21
|
if (conversation.status === widget_chat_conversation_status_enum_1.WidgetChatConversationStatusEnum.RESOLVED)
|
|
17
22
|
return false;
|
|
18
|
-
if (
|
|
23
|
+
if (conversation.lastMessageAuthor === widget_chat_message_author_enum_1.WidgetChatMessageAuthorEnum.STAFF)
|
|
24
|
+
return false;
|
|
25
|
+
if (!conversation.aiPaused && conversation.aiEnabled)
|
|
19
26
|
return false;
|
|
20
|
-
|
|
27
|
+
// Нет ни одного сообщения (диалог-заготовка) — ждать нечего.
|
|
28
|
+
return !!conversation.lastMessageAuthor;
|
|
21
29
|
};
|
|
22
30
|
exports.conversationAwaitsHuman = conversationAwaitsHuman;
|
|
23
31
|
/**
|
|
24
|
-
*
|
|
32
|
+
* Число диалогов, которые реально ждут ответа оператора.
|
|
25
33
|
* Используется для бейджа в меню (app) и в таб-баре (mobile).
|
|
26
34
|
*/
|
|
27
|
-
const countAwaitingHuman = (conversations) => conversations.reduce((sum, conversation) => sum + ((0, exports.conversationAwaitsHuman)(conversation) ?
|
|
35
|
+
const countAwaitingHuman = (conversations) => conversations.reduce((sum, conversation) => sum + ((0, exports.conversationAwaitsHuman)(conversation) ? 1 : 0), 0);
|
|
28
36
|
exports.countAwaitingHuman = countAwaitingHuman;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@escapenavigator/utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"test": "jest"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@escapenavigator/types": "^
|
|
17
|
+
"@escapenavigator/types": "^2.0.0",
|
|
18
18
|
"axios": "^0.21.4",
|
|
19
19
|
"class-transformer": "^0.5.1",
|
|
20
20
|
"class-validator": "^0.13.2",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"ts-jest": "^29.1.1",
|
|
29
29
|
"typescript": "^5.6"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "4bc136046ad634699417e72afff25e7b28dfbe7a"
|
|
32
32
|
}
|