@chat21/chat21-web-widget 5.1.26 → 5.1.27-rc1

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.
Files changed (39) hide show
  1. package/.github/workflows/docker-community-push-latest.yml +23 -13
  2. package/.github/workflows/docker-image-tag-community-tag-push.yml +22 -12
  3. package/CHANGELOG.md +88 -13
  4. package/Dockerfile +4 -5
  5. package/angular.json +2 -1
  6. package/deploy_amazon_beta.sh +17 -7
  7. package/docs/changelog/this-branch.md +36 -0
  8. package/package.json +1 -1
  9. package/src/app/app.component.html +9 -2
  10. package/src/app/app.component.scss +59 -0
  11. package/src/app/app.component.ts +128 -33
  12. package/src/app/component/conversation-detail/conversation/conversation.component.html +13 -2
  13. package/src/app/component/conversation-detail/conversation/conversation.component.scss +30 -2
  14. package/src/app/component/conversation-detail/conversation/conversation.component.ts +190 -5
  15. package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.ts +16 -3
  16. package/src/app/component/conversation-detail/conversation-content/conversation-content.component.html +12 -9
  17. package/src/app/component/conversation-detail/conversation-content/conversation-content.component.scss +15 -1
  18. package/src/app/component/conversation-detail/conversation-content/conversation-content.component.ts +1 -1
  19. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.html +103 -80
  20. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.scss +40 -13
  21. package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.ts +40 -1
  22. package/src/app/component/conversation-detail/conversation-header/conversation-header.component.html +4 -4
  23. package/src/app/component/conversation-detail/conversation-header/conversation-header.component.ts +1 -0
  24. package/src/app/component/eyeeye-catcher-card/eyeeye-catcher-card.component.ts +0 -18
  25. package/src/app/component/home/home.component.html +3 -3
  26. package/src/app/component/launcher-button/launcher-button.component.html +1 -1
  27. package/src/app/component/launcher-button/launcher-button.component.ts +3 -2
  28. package/src/app/providers/global-settings.service.ts +38 -0
  29. package/src/app/providers/translator.service.ts +2 -0
  30. package/src/app/sass/_variables.scss +1 -0
  31. package/src/app/utils/globals.ts +8 -2
  32. package/src/assets/i18n/en.json +2 -0
  33. package/src/assets/i18n/es.json +2 -0
  34. package/src/assets/i18n/fr.json +2 -0
  35. package/src/assets/i18n/it.json +2 -0
  36. package/src/chat21-core/providers/tiledesk/tiledesk-requests.service.ts +1 -1
  37. package/src/chat21-core/utils/utils.ts +5 -2
  38. package/src/iframe-style.css +5 -5
  39. package/deploy_amazon_prod.sh +0 -41
@@ -1,10 +1,10 @@
1
1
  name: Docker Image Community latest CI
2
2
 
3
- on:
4
- push:
3
+ on:
4
+ push:
5
5
  branches: [ master ]
6
- pull_request:
7
- branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
8
 
9
9
  jobs:
10
10
  push_to_registry:
@@ -12,12 +12,22 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v2
16
- name: Check out the repo
17
- - uses: docker/build-push-action@v1
18
- with:
19
- username: ${{ secrets.DOCKERHUB_USERNAME }}
20
- password: ${{ secrets.DOCKERHUB_TOKEN }}
21
- repository: chat21/chat21-web-widget
22
- push: true
23
- tags: latest
15
+ - name: Check out the repo
16
+ uses: actions/checkout@v2
17
+
18
+ - name: Set up Docker Buildx
19
+ uses: docker/setup-buildx-action@v2
20
+
21
+ - name: Log in to Docker Hub
22
+ uses: docker/login-action@v2
23
+ with:
24
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
25
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
26
+
27
+ - name: Build and push multiarch Docker image
28
+ uses: docker/build-push-action@v3
29
+ with:
30
+ context: .
31
+ push: true
32
+ platforms: linux/amd64,linux/arm64
33
+ tags: chat21/chat21-web-widget:latest
@@ -3,20 +3,30 @@ name: Publish Docker Community image tags
3
3
  on:
4
4
  push:
5
5
  tags:
6
- - '**' # Push events to every tag including hierarchical tags like
7
- jobs:
6
+ - '**' # Trigger su qualsiasi tag
8
7
 
8
+ jobs:
9
9
  push_to_registry:
10
10
  name: Push Docker image to Docker Hub
11
11
  runs-on: ubuntu-latest
12
+
12
13
  steps:
13
- - name: Check out the repo
14
- uses: actions/checkout@v2
15
- - name: Push to Docker Hub
16
- uses: docker/build-push-action@v1
17
- with:
18
- username: ${{ secrets.DOCKERHUB_USERNAME }}
19
- password: ${{ secrets.DOCKERHUB_TOKEN }}
20
- repository: chat21/chat21-web-widget
21
- push: true
22
- tag_with_ref: true
14
+ - name: Check out the repo
15
+ uses: actions/checkout@v2
16
+
17
+ - name: Set up Docker Buildx
18
+ uses: docker/setup-buildx-action@v2
19
+
20
+ - name: Log in to Docker Hub
21
+ uses: docker/login-action@v2
22
+ with:
23
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
24
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
25
+
26
+ - name: Build and push multiarch Docker image
27
+ uses: docker/build-push-action@v3
28
+ with:
29
+ context: .
30
+ push: true
31
+ platforms: linux/amd64,linux/arm64
32
+ tags: chat21/chat21-web-widget:${{ github.ref_name }}
package/CHANGELOG.md CHANGED
@@ -6,29 +6,54 @@
6
6
  ### **Copyrigth**:
7
7
  *Tiledesk SRL*
8
8
 
9
- # 5.1.26
10
- - **bug fixed**: attachment buttons text alignment
9
+ # 5.1.27-rc1
10
+ - **added**: closeChatInConversation parameters
11
+ - **added**: close chat button under textarea footer component
11
12
 
12
- # 5.1.25
13
+ # 5.1.26-rc6
14
+ - **changed**: mobile always opens fullscreen and ignores legacy stored size”.
15
+ - **changed**: changed user-typing
16
+
17
+ # 5.1.26-rc5
18
+ - **changed**: Hide the resize-widget button when on mobile
19
+ - **added**: added "I'm thinking" when the bot responds
20
+
21
+ # 5.1.26-rc4
22
+ - **changed**: decoupled callout from signin
23
+
24
+ # 5.1.26-rc3
25
+ - **changed**: start with authentication if a proactive message has been set, so if a rule has been set on at one chatbot in the project
26
+
27
+ # 5.1.26-rc2
28
+ - **changed**: start with authentication if hasCalloutInWidgetConfig is true
29
+
30
+ # 5.1.26-rc1
31
+ - **bug fixed**: improved audio recording/upload flow by ignoring empty recorder chunks, preserving the recorder MIME type when creating the audio blob/file, and uploading audio directly without Base64 conversion
32
+
33
+
34
+ # 5.1.25-rc1
13
35
  - **bug fixed**: attachment buttons in messages now respect the container max width and wrap/break long labels instead of being clipped
14
36
 
15
- # 5.1.24
37
+ # 5.1.24-rc2
38
+ - **bug fixed**: minor fix in marked pipe to avoid rendering html tags
39
+
40
+ # 5.1.24-rc1
16
41
  - **security**: hardened Markdown link rendering by blocking dangerous protocols (e.g. `javascript:`, `data:`, `vbscript:`) and preventing unsafe links from being rendered as anchors
17
42
  - **changed**: refactored `MarkedPipe` to simplify Markdown parsing, improve link rendering via a custom `marked` renderer, and streamline newline handling (`\\n` → `\n`)
18
43
 
19
- # 5.1.23
20
- - **changed**: API for upload a file/iamges
21
-
22
- # 5.1.22
23
- - **changed**: Updated Launch.js for Wix and Shopify by bypassing scrdoc
24
-
25
- # 5.1.21
44
+ # 5.1.20-rc3
26
45
  - **bug fixed**: saved the widget's size state to local storage (in HP conversations)
27
46
 
28
- # 5.1.20
47
+ # 5.1.20-rc2
48
+ - **changed**: API for upload a file/iamges
29
49
  - **changed**: marked pipe do not render /n
30
50
 
51
+ # 5.1.20-rc1
52
+ - **changed**: API for upload a file/iamges
53
+
31
54
  # 5.1.19
55
+
56
+ # 5.1.19-rc1
32
57
  - **bug fixed**: show bottom scroll button and unread message badge only when I'm not at the bottom of the page
33
58
  - **changed**: allow HTML code to be inserted into messages, but do not parse the code. Ensure coexistence with Markdown.
34
59
  - **bug fixed**: after sending a multi-line message, the text area remains open on multiple lines.
@@ -38,6 +63,7 @@
38
63
  - **changed**: saved the widget's size state to local storage. The parameter flow is (default → storage → settings → URL)
39
64
 
40
65
  # 5.1.18
66
+ # 5.1.15-rc3
41
67
  - **added**: Implemented Shadow DOM in the text component to isolate HTML and Markdown rendering in a safe and protected context
42
68
  - **changed**: Adapted text component styles to support Shadow DOM (removed ::ng-deep, added styles for common markdown elements)
43
69
  - **security**: HTML/Markdown content is now rendered in an isolated Shadow DOM, improving security and preventing interference with the rest of the application
@@ -48,6 +74,12 @@
48
74
  # 5.1.16
49
75
  - **changed**: "close chat" header conversation menu button enabled in chatbot-panel.html
50
76
 
77
+ # 5.1.15-rc2
78
+ - **bug-fixed**: Bug fix for ifame message width
79
+
80
+ # 5.1.15-rc1
81
+ - **changed**: Load local translations before remote ones
82
+
51
83
  # 5.1.15
52
84
  - **changed**: Load local translations before remote ones
53
85
 
@@ -56,14 +88,57 @@
56
88
 
57
89
  # 5.1.13
58
90
  - **bug-fixed**: set default widget size
91
+
92
+ # 5.1.7-rc16
93
+ - **bug-fixed**: set default widget size
94
+
95
+ # 5.1.7-rc15
96
+ - **bug-fixed**: set the color of the buttons with visibility control to the font color
97
+
98
+ # 5.1.7-rc14
99
+ - **bug-fixed**: departmentId and departmentName is incorrect in attributes
100
+
101
+ # 5.1.7-rc13
102
+ - **changed**: Force authentication if ageChangeVisibilityDesktop or PageChangeVisibilityMobile is OPEN
103
+
104
+ # 5.1.7-rc12
105
+ - **changed**: Force authentication if ageChangeVisibilityDesktop or PageChangeVisibilityMobile is OPEN
106
+ - **changed**: Set the default autoStart value to false
107
+ - **added**: Added the open widget loading spinner
108
+ - **changed**: Load the widget without authentication and display the speech bubble
109
+
110
+ # 5.1.7-rc11
111
+ - **changed**: set default value autoStart false
112
+ - **added**:added loading spinner
113
+
114
+ # 5.1.7-rc10
115
+ - **changed**: load widget without authentication and display the balloon
116
+
117
+ # 5.1.7-rc9
118
+ - **removed**: 'DOMAIN_NOT_ALLOWED' in textarea footer component
119
+
120
+ # 5.1.7-rc8
121
+ # changes in the branch
122
+ - **changed**: Load local translations before remote ones
123
+ - **bug-fixed**: set default widget size
59
124
  - **changed**: Updated the translations of the tooltips in the footer-component
60
125
  - **changed**: Refactored the network-offline component and made it generic for displaying errors (now error-alert.component)
61
- - **bug-fixed**: set the color of the buttons with visibility control to the font color (setButtonColors function)
126
+
127
+ # 5.1.7-rc7
128
+ - **bug-fixed**: button new_conversation always appear. added subscription to conversationAdded
129
+
130
+ # 5.1.7-rc6
131
+ - **added**: Added MAX_ATTACHMENT_ERROR error message when uploading a file larger than 10 MB
62
132
 
63
133
  # 5.1.12
64
134
  - **bug-fixed**: check showEmojiFooterButton to enable/disable emojii
65
135
  - **bug-fixed**: markdown is fired as an emojii and blocked by isEmojii check fn
66
136
 
137
+ # 5.1.7-rc7
138
+ - **bug-fixed**: button new_conversation always appear. added subscription to conversationAdded
139
+
140
+ # 5.1.7-rc6
141
+ - **added**: Added MAX_ATTACHMENT_ERROR error message when uploading a file larger than 10 MB
67
142
 
68
143
  # 5.1.7-rc5
69
144
  - **bug-fixed**: bug fixed BUTTON STYLES
package/Dockerfile CHANGED
@@ -1,7 +1,7 @@
1
1
  ### STAGE 1: Build ###
2
2
 
3
3
  # We label our stage as ‘builder’
4
- FROM node:20.12.2-alpine3.19 as builder
4
+ FROM --platform=$BUILDPLATFORM node:20.12.2-alpine3.19 as builder
5
5
 
6
6
  COPY package.json package-lock.json ./
7
7
 
@@ -15,12 +15,11 @@ COPY . .
15
15
 
16
16
  ## Build the angular app in production mode and store the artifacts in dist folder
17
17
 
18
- RUN npx ng build --configuration="prod" --output-path=dist --base-href=./ --output-hashing=none
19
18
 
19
+ RUN npx ng build --configuration="prod" --output-path=dist --base-href=./ --output-hashing=none
20
20
 
21
21
  ### STAGE 2: Setup ###
22
-
23
- FROM nginx:1.14.1-alpine
22
+ FROM --platform=$BUILDPLATFORM nginx:1.14.1-alpine
24
23
 
25
24
  ## Copy our default nginx config
26
25
  COPY nginx.conf /etc/nginx/nginx.conf
@@ -33,4 +32,4 @@ COPY --from=builder /ng-app/dist/browser /usr/share/nginx/html
33
32
 
34
33
  RUN echo "Chat21 Web Widget Started!!"
35
34
 
36
- CMD ["/bin/sh", "-c", "envsubst < /usr/share/nginx/html/widget-config-template.json > /usr/share/nginx/html/widget-config.json && exec nginx -g 'daemon off;'"]
35
+ CMD ["/bin/sh", "-c", "envsubst < /usr/share/nginx/html/widget-config-template.json > /usr/share/nginx/html/widget-config.json && exec nginx -g 'daemon off;'"]
package/angular.json CHANGED
@@ -44,7 +44,8 @@
44
44
  "src/environments/real_data/widget-config-docker.json",
45
45
  "src/environments/real_data/widget-config-native-mqtt.json",
46
46
  "src/environments/real_data/widget-config-native-prod.json",
47
- "src/environments/real_data/widget-config-aws-stage.json"
47
+ "src/environments/real_data/widget-config-aws-stage.json",
48
+ "src/environments/real_data/widget-config-aws-aruba.json"
48
49
  ],
49
50
  "styles": [
50
51
  "src/app/sass/styles.scss"
@@ -2,8 +2,16 @@
2
2
  version=`node -e 'console.log(require("./package.json").version)'`
3
3
  echo "version $version"
4
4
 
5
+ npm i
6
+
7
+ cp src/environments/real_data/environment.pre.ts src/environments/environment.pre.ts
8
+
5
9
  ng build --configuration="pre" --aot=true --base-href
6
10
 
11
+ ### SET HASHING : START ###
12
+ cp ./src/launch_template.js ./dist/browser/launch.js
13
+ node ./src/build_launch.js
14
+ ### SET HASHING : END ###
7
15
 
8
16
  # ########## --->>>> NATIVE-MQTT folder START <<<<<------ ########## #
9
17
 
@@ -23,15 +31,17 @@ ng build --configuration="pre" --aot=true --base-href
23
31
 
24
32
 
25
33
  # ########## --->>>> FIREBASE folder START <<<<<------ ########## #
26
- cd dist
27
- aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control max-age=300
28
- aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control max-age=300
29
- cd ..
30
-
31
- #aws cloudfront create-invalidation --distribution-id E3EJDWEHY08CZZ --paths "/*"
32
- cd ..
34
+ cd dist/browser
35
+ aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control max-age=300 --exclude='launch.js' #7days
36
+ aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control "no-store,no-cache,private" --exclude='*' --include='launch.js'
37
+ aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control max-age=300 --exclude='launch.js' #7days
38
+ aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control "no-store,no-cache,private" --exclude='*' --include='launch.js'
39
+ cd ../..
33
40
 
34
41
  aws cloudfront create-invalidation --distribution-id E2V5O0YPR61V8P --paths "/*"
42
+
43
+ git restore src/environments/environment.pre.ts
44
+
35
45
  # echo new version deployed $NEW_VER/$NEW_BUILD/ on s3://tiledesk-widget-pre/v2
36
46
  echo new version deployed $version/ on s3://tiledesk-widget-pre/v5 and s3://tiledesk-widget-pre/v5/$version/
37
47
  echo available on https://s3.eu-west-1.amazonaws.com/tiledesk-widget-pre/v5/index.html
@@ -0,0 +1,36 @@
1
+ # This branch: identificazione bot o umano
2
+
3
+ ## Obiettivo
4
+
5
+ In questo branch e' stata introdotta una logica esplicita per capire, all'apertura della conversazione, se l'ultimo responder lato server e' un **bot** oppure un **umano**.
6
+
7
+ ## Come viene fatta l'identificazione
8
+
9
+ - La valutazione parte dai messaggi gia' caricati in conversazione.
10
+ - Viene cercato l'**ultimo messaggio ricevuto dal server** (non inviato dal client corrente).
11
+ - Quel messaggio viene classificato con una funzione dedicata (`classifyMessageSenderKind`) che usa piu' segnali:
12
+ - `attributes.flowAttributes.chatbot_id` (quando presente indica bot)
13
+ - pattern del mittente (es. `senderId` con prefisso bot, quando applicabile)
14
+ - informazioni del mittente (`sender_fullname` e metadati associati)
15
+
16
+ ## Regola speciale per messaggi di sistema
17
+
18
+ Se l'ultimo messaggio utile e' di tipo `system`, viene fatto un controllo aggiuntivo:
19
+
20
+ - se in `attributes` e' presente un evento con `messagelabel.key = MEMBER_JOINED_GROUP`
21
+ - e rappresenta il passaggio della conversazione a un operatore
22
+
23
+ allora la conversazione viene forzata a **Umano** anche se altri indizi potrebbero suggerire bot.
24
+
25
+ ## Risultato in UI
26
+
27
+ - In apertura conversazione viene mostrato un badge con stato:
28
+ - `Bot`
29
+ - `Umano`
30
+ - Questo stato viene ricalcolato al variare dei messaggi ricevuti.
31
+
32
+ ## Effetto sui feedback utente
33
+
34
+ - Il messaggio temporaneo `"sto pensando..."` viene mostrato solo quando la conversazione risulta di tipo **Bot**.
35
+ - Alla ricezione della prima risposta dal server, `"sto pensando..."` viene nascosto **immediatamente**.
36
+ - Non e' previsto alcun tempo minimo di visualizzazione del messaggio.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chat21/chat21-web-widget",
3
3
  "author": "Tiledesk SRL",
4
- "version": "5.1.26",
4
+ "version": "5.1.27-rc1",
5
5
  "license": "MIT",
6
6
  "homepage": "https://www.tiledesk.com",
7
7
  "repository": {
@@ -120,7 +120,7 @@
120
120
  ******* EYE-CATCHER (aka CALLOUT) *********
121
121
  *******************************************
122
122
  tabindex -> 20 -->
123
- <chat-eyeeye-catcher-card *ngIf="g.senderId && !g.isOpenNewMessage"
123
+ <chat-eyeeye-catcher-card *ngIf="!g.isOpenNewMessage"
124
124
  (onOpenChat)="onOpenCloseWidget($event)"
125
125
  (onCloseEyeCatcherCard)="onCloseEyeCatcherCard($event)">
126
126
  </chat-eyeeye-catcher-card>
@@ -145,5 +145,12 @@
145
145
  <chat-launcher-button *ngIf="isInitialized"
146
146
  (onButtonClicked)="onOpenCloseWidget($event)">
147
147
  </chat-launcher-button>
148
-
148
+
149
+ <!-- Loading Spinner -->
150
+ <div *ngIf="loading" class="tiledesk-loading-overlay">
151
+ <div class="tiledesk-loading-spinner">
152
+ <div class="spinner-circle"></div>
153
+ <div class="loading-text">{{ translationMap.get('LABEL_LOADING') }}</div>
154
+ </div>
155
+ </div>
149
156
  </div>
@@ -761,4 +761,63 @@ chat-root {
761
761
  }
762
762
  }
763
763
 
764
+ // ========= BEGIN: LOADING SPINNER ========= //
765
+ .tiledesk-loading-overlay {
766
+ position: absolute;
767
+ top: 0;
768
+ left: 0;
769
+ width: 100%;
770
+ height: 100%;
771
+ background-color: rgba(248, 249, 250, 0.95);
772
+ display: flex;
773
+ justify-content: center;
774
+ align-items: center;
775
+ z-index: 9999;
776
+ backdrop-filter: blur(2px);
777
+ }
778
+
779
+ .tiledesk-loading-spinner {
780
+ display: flex;
781
+ flex-direction: column;
782
+ align-items: center;
783
+ gap: 16px;
784
+ }
785
+
786
+ .spinner-circle {
787
+ width: 50px;
788
+ height: 50px;
789
+ border: 4px solid rgba(59, 130, 246, 0.2);
790
+ border-top-color: #3b82f6;
791
+ border-radius: 50%;
792
+ animation: spin 0.8s linear infinite;
793
+ }
794
+
795
+ @keyframes spin {
796
+ 0% {
797
+ transform: rotate(0deg);
798
+ }
799
+ 100% {
800
+ transform: rotate(360deg);
801
+ }
802
+ }
803
+
804
+ .loading-text {
805
+ font-family: var(--font-family-bubble-message, 'Roboto', 'Google Sans', Helvetica, Arial, sans-serif);
806
+ font-size: 14px;
807
+ font-weight: 500;
808
+ color: #3b82f6;
809
+ letter-spacing: 0.5px;
810
+ animation: pulse 1.5s ease-in-out infinite;
811
+ }
812
+
813
+ @keyframes pulse {
814
+ 0%, 100% {
815
+ opacity: 1;
816
+ }
817
+ 50% {
818
+ opacity: 0.5;
819
+ }
820
+ }
821
+ // ========= END: LOADING SPINNER ========= //
822
+
764
823
  }