@dev.smartpricing/message-composer-layer 4.3.2-chat.0 → 4.4.1-next.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,4 +1,5 @@
1
1
  import { useQuery, useMutation, useQueryCache } from '@pinia/colada'
2
+ import type { MaybeRefOrGetter } from 'vue'
2
3
  import type {
3
4
  DuplicateMessageGroupBody,
4
5
  MessageGroup,
@@ -9,6 +10,16 @@ import { messageGroupsApi } from '~/api'
9
10
  import type { ListMessageGroupsOptions } from '~/api/messageGroups'
10
11
 
11
12
  // QUERIES
13
+
14
+ /**
15
+ * Colada merges `{ ...defaults, ...options }`, so forwarding `enabled: undefined`
16
+ * overrides its default `true` and silently disables the query: it then only
17
+ * runs on an explicit `refetch` (the library's 15 s poll, mutation invalidations).
18
+ * Forward `enabled` only when the caller set it.
19
+ */
20
+ function enabledOption(enabled?: MaybeRefOrGetter<boolean>) {
21
+ return enabled === undefined ? {} : { enabled }
22
+ }
12
23
  /**
13
24
  * One page of the server-side filtered list, in the Laravel envelope (ADR 0012).
14
25
  * The previous page stays as placeholder data while the next one loads, so
@@ -23,7 +34,7 @@ export function useMessageGroupListQuery(
23
34
  query: () => messageGroupsApi.list(toValue(options)),
24
35
  staleTime: 0,
25
36
  placeholderData: (previousData) => previousData,
26
- enabled: queryOptions.enabled,
37
+ ...enabledOption(queryOptions.enabled),
27
38
  })
28
39
  }
29
40
 
@@ -35,7 +46,7 @@ export function useMessageGroupQuery(
35
46
  key: () => ['message-groups', toValue(id)],
36
47
  query: () => messageGroupsApi.getById(toValue(id)),
37
48
  staleTime: 2 * 60 * 1000,
38
- enabled: queryOptions.enabled,
49
+ ...enabledOption(queryOptions.enabled),
39
50
  })
40
51
  }
41
52
 
@@ -2,6 +2,9 @@ import type { MessageGroupProduct } from '@dev.smartpricing/message-composer-uti
2
2
 
3
3
  export type MessagesKind = 'email' | 'whatsapp'
4
4
 
5
+ /** The step an operator was on when leaving the Message Send Flow. */
6
+ export type MessageSendFlowStep = 'message' | 'parameters'
7
+
5
8
  export interface MessageActionProperties {
6
9
  message_name: string
7
10
  languages: string[]
@@ -164,4 +167,14 @@ export interface TrackingEventMap {
164
167
  to_recipients: number
165
168
  language: string
166
169
  }
170
+
171
+ // === Message Send Flow (spec #67) ===
172
+ 'send_flow.confirm': {
173
+ message_name: string
174
+ message_category: string
175
+ language: string
176
+ parameters_count: number
177
+ }
178
+ 'send_flow.cancel': { step: MessageSendFlowStep }
179
+ 'send_flow.error': { code: string }
167
180
  }
@@ -761,3 +761,26 @@ export const messageGroupSelectTestIds = {
761
761
 
762
762
  /** @deprecated Use `messageGroupSelectTestIds` instead */
763
763
  export const templateSelectTestIds = messageGroupSelectTestIds
764
+
765
+ export const messageSendFlowTestIds = {
766
+ root: 'message-send-flow-root',
767
+ stepper: 'message-send-flow-stepper',
768
+ alert: 'message-send-flow-alert',
769
+ picker: 'message-send-flow-picker',
770
+ languageGroup: 'message-send-flow-language-group',
771
+ parametersForm: 'message-send-flow-parameters-form',
772
+ /** One per visible key; the key is on `data-parameter`. */
773
+ parameterInput: 'message-send-flow-parameter-input',
774
+ noParameters: 'message-send-flow-no-parameters',
775
+ /** Right panel, present on every step, holding the channel preview. */
776
+ previewPanel: 'message-send-flow-preview-panel',
777
+ preview: 'message-send-flow-preview',
778
+ /** The compiled email of the Preview step (`render_type` email_v1). */
779
+ emailPreview: 'message-send-flow-email-preview',
780
+ /** The Cancel/Back/Next/Confirm bar, inline or teleported to `actionsTo`. */
781
+ actions: 'message-send-flow-actions',
782
+ back: 'message-send-flow-back',
783
+ next: 'message-send-flow-next',
784
+ cancel: 'message-send-flow-cancel',
785
+ confirm: 'message-send-flow-confirm',
786
+ } as const
@@ -58,7 +58,9 @@ export default {
58
58
  messageGroupSelect: {
59
59
  inactive_tooltip:
60
60
  'Diese Nachrichtengruppe enthält nicht genehmigte oder fehlende Nachrichten',
61
+ not_sendable_tooltip: 'Diese Nachrichtengruppe enthält keine genehmigten Nachrichten',
61
62
  hide_inactive: 'Inaktive ausblenden',
63
+ hide_not_sendable: 'Nicht sendbare ausblenden',
62
64
  load_more: 'Mehr laden',
63
65
  },
64
66
  view_less: 'Weniger anzeigen',
@@ -854,6 +856,42 @@ export default {
854
856
  send_message: 'Nachricht senden',
855
857
  },
856
858
  },
859
+ send_flow: {
860
+ actions: {
861
+ back: 'Zurück',
862
+ cancel: 'Abbrechen',
863
+ confirm: 'Bestätigen',
864
+ next: 'Weiter',
865
+ },
866
+ errors: {
867
+ COMPILE_FAILED:
868
+ 'Die Nachricht konnte nicht vorbereitet werden. Bitte versuchen Sie es erneut.',
869
+ MISSING_PARAMETERS: 'Füllen Sie alle Parameter aus, bevor Sie bestätigen.',
870
+ NOT_SENDABLE:
871
+ '„{name}“ hat keine genehmigte Nachricht und kann nicht gesendet werden. Wählen Sie eine andere Nachrichtengruppe.',
872
+ TEMPLATE_NOT_APPROVED:
873
+ 'Diese Nachricht wurde von Meta nicht genehmigt und kann nicht gesendet werden.',
874
+ TEMPLATE_NOT_SUBMITTED:
875
+ 'Diese Nachricht wurde nicht bei Meta eingereicht und kann nicht gesendet werden.',
876
+ },
877
+ language: {
878
+ approved: 'Genehmigt',
879
+ approved_count: 'Genehmigte Sprachen für {name}: {count}',
880
+ not_sendable: 'Nicht sendbar ({status})',
881
+ },
882
+ no_parameters: 'Diese Nachricht hat keine auszufüllenden Parameter.',
883
+ not_sendable_hint: 'Ausgegraute Nachrichtengruppen haben keine genehmigte Nachricht.',
884
+ questions: {
885
+ language: 'In welcher Sprache?',
886
+ message: 'Welche Nachricht möchten Sie senden?',
887
+ parameters: 'Parameter ausfüllen',
888
+ preview: 'Das erhält der Gast',
889
+ },
890
+ steps: {
891
+ message: { description: 'Sendbare Nachrichtengruppe auswählen', title: 'Nachricht' },
892
+ parameters: { description: 'Felder ausfüllen', title: 'Parameter' },
893
+ },
894
+ },
857
895
  status: {
858
896
  approved: 'Genehmigt',
859
897
  draft: 'Entwurf',
@@ -56,7 +56,9 @@ export default {
56
56
  translation_failed: 'Translation failed',
57
57
  messageGroupSelect: {
58
58
  inactive_tooltip: 'This message group has unapproved or missing messages',
59
+ not_sendable_tooltip: 'This message group has no approved messages',
59
60
  hide_inactive: 'Hide inactive',
61
+ hide_not_sendable: 'Hide not sendable',
60
62
  load_more: 'Load more',
61
63
  },
62
64
  view_less: 'View less',
@@ -843,6 +845,39 @@ export default {
843
845
  send_message: 'Send message',
844
846
  },
845
847
  },
848
+ send_flow: {
849
+ actions: {
850
+ back: 'Back',
851
+ cancel: 'Cancel',
852
+ confirm: 'Confirm',
853
+ next: 'Next',
854
+ },
855
+ errors: {
856
+ COMPILE_FAILED: 'The message could not be prepared. Please try again.',
857
+ MISSING_PARAMETERS: 'Fill in every parameter before confirming.',
858
+ NOT_SENDABLE:
859
+ '"{name}" has no approved message and cannot be sent. Pick another message group.',
860
+ TEMPLATE_NOT_APPROVED: 'This message has not been approved by Meta and cannot be sent.',
861
+ TEMPLATE_NOT_SUBMITTED: 'This message has not been submitted to Meta and cannot be sent.',
862
+ },
863
+ language: {
864
+ approved: 'Approved',
865
+ approved_count: 'Approved languages for {name}: {count}',
866
+ not_sendable: 'Not sendable ({status})',
867
+ },
868
+ no_parameters: 'This message has no parameters to fill in.',
869
+ not_sendable_hint: 'Greyed-out message groups have no approved message.',
870
+ questions: {
871
+ language: 'In which language?',
872
+ message: 'Which message do you want to send?',
873
+ parameters: 'Fill in the parameters',
874
+ preview: 'This is what the guest will receive',
875
+ },
876
+ steps: {
877
+ message: { description: 'Pick a sendable message group', title: 'Message' },
878
+ parameters: { description: 'Fill in the blanks', title: 'Parameters' },
879
+ },
880
+ },
846
881
  status: {
847
882
  approved: 'Approved',
848
883
  draft: 'Draft',
@@ -57,7 +57,9 @@ export default {
57
57
  translation_failed: 'La traducción ha fallado',
58
58
  messageGroupSelect: {
59
59
  inactive_tooltip: 'Este grupo de mensajes tiene mensajes no aprobados o faltantes',
60
+ not_sendable_tooltip: 'Este grupo de mensajes no tiene mensajes aprobados',
60
61
  hide_inactive: 'Ocultar inactivos',
62
+ hide_not_sendable: 'Ocultar no enviables',
61
63
  load_more: 'Cargar más',
62
64
  },
63
65
  view_less: 'Ver menos',
@@ -852,6 +854,40 @@ export default {
852
854
  send_message: 'Enviar mensaje',
853
855
  },
854
856
  },
857
+ send_flow: {
858
+ actions: {
859
+ back: 'Atrás',
860
+ cancel: 'Cancelar',
861
+ confirm: 'Confirmar',
862
+ next: 'Siguiente',
863
+ },
864
+ errors: {
865
+ COMPILE_FAILED: 'No se ha podido preparar el mensaje. Inténtelo de nuevo.',
866
+ MISSING_PARAMETERS: 'Rellene todos los parámetros antes de confirmar.',
867
+ NOT_SENDABLE:
868
+ '"{name}" no tiene ningún mensaje aprobado y no se puede enviar. Elija otro grupo de mensajes.',
869
+ TEMPLATE_NOT_APPROVED: 'Meta no ha aprobado este mensaje y no se puede enviar.',
870
+ TEMPLATE_NOT_SUBMITTED:
871
+ 'Este mensaje no se ha enviado a Meta para su aprobación y no se puede enviar.',
872
+ },
873
+ language: {
874
+ approved: 'Aprobado',
875
+ approved_count: 'Idiomas aprobados para {name}: {count}',
876
+ not_sendable: 'No se puede enviar ({status})',
877
+ },
878
+ no_parameters: 'Este mensaje no tiene parámetros que rellenar.',
879
+ not_sendable_hint: 'Los grupos de mensajes en gris no tienen ningún mensaje aprobado.',
880
+ questions: {
881
+ language: '¿En qué idioma?',
882
+ message: '¿Qué mensaje quiere enviar?',
883
+ parameters: 'Rellenar los parámetros',
884
+ preview: 'Esto es lo que recibirá el huésped',
885
+ },
886
+ steps: {
887
+ message: { description: 'Elegir un grupo de mensajes que se pueda enviar', title: 'Mensaje' },
888
+ parameters: { description: 'Rellenar los campos', title: 'Parámetros' },
889
+ },
890
+ },
855
891
  status: {
856
892
  approved: 'Aprobado',
857
893
  draft: 'Borrador',
@@ -57,7 +57,9 @@ export default {
57
57
  translation_failed: 'Échec de la traduction',
58
58
  messageGroupSelect: {
59
59
  inactive_tooltip: 'Ce groupe de messages contient des messages non approuvés ou manquants',
60
+ not_sendable_tooltip: 'Ce groupe de messages ne contient aucun message approuvé',
60
61
  hide_inactive: 'Masquer inactifs',
62
+ hide_not_sendable: 'Masquer non envoyables',
61
63
  load_more: 'Charger plus',
62
64
  },
63
65
  view_less: 'Afficher moins',
@@ -856,6 +858,39 @@ export default {
856
858
  send_message: 'Envoyer le message',
857
859
  },
858
860
  },
861
+ send_flow: {
862
+ actions: {
863
+ back: 'Retour',
864
+ cancel: 'Annuler',
865
+ confirm: 'Confirmer',
866
+ next: 'Suivant',
867
+ },
868
+ errors: {
869
+ COMPILE_FAILED: 'Le message n’a pas pu être préparé. Veuillez réessayer.',
870
+ MISSING_PARAMETERS: 'Renseignez tous les paramètres avant de confirmer.',
871
+ NOT_SENDABLE:
872
+ '« {name} » n’a aucun message approuvé et ne peut pas être envoyé. Choisissez un autre groupe de messages.',
873
+ TEMPLATE_NOT_APPROVED: 'Ce message n’a pas été approuvé par Meta et ne peut pas être envoyé.',
874
+ TEMPLATE_NOT_SUBMITTED: 'Ce message n’a pas été soumis à Meta et ne peut pas être envoyé.',
875
+ },
876
+ language: {
877
+ approved: 'Approuvé',
878
+ approved_count: 'Langues approuvées pour {name} : {count}',
879
+ not_sendable: 'Non envoyable ({status})',
880
+ },
881
+ no_parameters: 'Ce message n’a aucun paramètre à renseigner.',
882
+ not_sendable_hint: 'Les groupes de messages grisés n’ont aucun message approuvé.',
883
+ questions: {
884
+ language: 'Dans quelle langue ?',
885
+ message: 'Quel message voulez-vous envoyer ?',
886
+ parameters: 'Renseignez les paramètres',
887
+ preview: 'Voici ce que le client recevra',
888
+ },
889
+ steps: {
890
+ message: { description: 'Choisissez un groupe de messages envoyable', title: 'Message' },
891
+ parameters: { description: 'Remplissez les champs', title: 'Paramètres' },
892
+ },
893
+ },
859
894
  status: {
860
895
  approved: 'Approuvé',
861
896
  draft: 'Brouillon',
@@ -56,7 +56,9 @@ export default {
56
56
  translation_failed: 'Traduzione non riuscita',
57
57
  messageGroupSelect: {
58
58
  inactive_tooltip: 'Questo gruppo di messaggi contiene messaggi non approvati o mancanti',
59
+ not_sendable_tooltip: 'Questo gruppo di messaggi non contiene messaggi approvati',
59
60
  hide_inactive: 'Nascondi inattivi',
61
+ hide_not_sendable: 'Nascondi non inviabili',
60
62
  load_more: 'Carica altri',
61
63
  },
62
64
  view_less: 'Mostra meno',
@@ -849,6 +851,41 @@ export default {
849
851
  send_message: 'Invia messaggio',
850
852
  },
851
853
  },
854
+ send_flow: {
855
+ actions: {
856
+ back: 'Indietro',
857
+ cancel: 'Annulla',
858
+ confirm: 'Conferma',
859
+ next: 'Avanti',
860
+ },
861
+ errors: {
862
+ COMPILE_FAILED: 'Non è stato possibile preparare il messaggio. Riprova.',
863
+ MISSING_PARAMETERS: 'Compila tutti i parametri prima di confermare.',
864
+ NOT_SENDABLE:
865
+ '"{name}" non ha nessun messaggio approvato e non può essere inviato. Scegli un altro gruppo di messaggi.',
866
+ TEMPLATE_NOT_APPROVED:
867
+ 'Questo messaggio non è stato approvato da Meta e non può essere inviato.',
868
+ TEMPLATE_NOT_SUBMITTED:
869
+ 'Questo messaggio non è stato sottoposto a Meta e non può essere inviato.',
870
+ },
871
+ language: {
872
+ approved: 'Approvato',
873
+ approved_count: 'Lingue approvate per {name}: {count}',
874
+ not_sendable: 'Non inviabile ({status})',
875
+ },
876
+ no_parameters: 'Questo messaggio non ha parametri da compilare.',
877
+ not_sendable_hint: 'I gruppi di messaggi in grigio non hanno nessun messaggio approvato.',
878
+ questions: {
879
+ language: 'In quale lingua?',
880
+ message: 'Quale messaggio vuoi inviare?',
881
+ parameters: 'Compila i parametri',
882
+ preview: 'Ecco cosa riceverà l’ospite',
883
+ },
884
+ steps: {
885
+ message: { description: 'Scegli un gruppo di messaggi inviabile', title: 'Messaggio' },
886
+ parameters: { description: 'Compila i campi', title: 'Parametri' },
887
+ },
888
+ },
852
889
  status: {
853
890
  approved: 'Approvato',
854
891
  draft: 'Bozza',
package/nuxt.config.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  export default defineNuxtConfig({
2
2
  compatibilityDate: '2025-07-15',
3
3
  ssr: false,
4
- experimental: {
5
- viteEnvironmentApi: true,
6
- },
7
4
  devtools: { enabled: true },
8
5
  imports: {
9
6
  dirs: ['stores', 'queries'],
@@ -57,9 +54,11 @@ export default defineNuxtConfig({
57
54
  runtimeConfig: {
58
55
  public: {
59
56
  COMPOSER_API_URL: '',
57
+ // BACKEND_BASE_URL, PLATFORM_URL and CSRF_COOKIE_NAME are declared by
58
+ // platform-layer (extended above); the host sets them once for both.
60
59
  BACKEND_BASE_URL: '',
61
60
  PLATFORM_URL: '',
62
- ENV_CSRF_COOKIE_NAME: 'smt_csrf',
61
+ CSRF_COOKIE_NAME: '',
63
62
  },
64
63
  },
65
64
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dev.smartpricing/message-composer-layer",
3
- "version": "4.3.2-chat.0",
3
+ "version": "4.4.1-next.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./nuxt.config.ts",
@@ -12,7 +12,6 @@
12
12
  "app.config.ts"
13
13
  ],
14
14
  "dependencies": {
15
- "@dev.smartpricing/platform-layer": "^0.0.23",
16
15
  "@formkit/drag-and-drop": "^0.5.3",
17
16
  "@pinia/colada": "^1.3.0",
18
17
  "@tiptap/extension-character-count": "^3.23.4",
@@ -36,9 +35,10 @@
36
35
  "vue-router": "^5.0.7",
37
36
  "vue3-emoji-picker": "^1.1.8",
38
37
  "zod": "^4.4.3",
39
- "@dev.smartpricing/message-composer-utils": "4.3.2-chat.0"
38
+ "@dev.smartpricing/message-composer-utils": "4.4.1-next.0"
40
39
  },
41
40
  "devDependencies": {
41
+ "@dev.smartpricing/platform-layer": "^0.0.23",
42
42
  "@nuxt/eslint": "^1.15.2",
43
43
  "@nuxt/test-utils": "^4.0.3",
44
44
  "@playwright/test": "^1.60.0",
@@ -48,6 +48,7 @@
48
48
  "vue-tsc": "^3.2.9"
49
49
  },
50
50
  "peerDependencies": {
51
+ "@dev.smartpricing/platform-layer": ">=0.0.20",
51
52
  "nuxt-ui-layer": ">=1.3.0"
52
53
  },
53
54
  "scripts": {