@fayz-ai/plugin-conversations 0.8.0 → 0.9.0-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.
Files changed (60) hide show
  1. package/dist/ConversationsContext.d.ts +18 -1
  2. package/dist/ConversationsContext.d.ts.map +1 -1
  3. package/dist/ConversationsPage.d.ts +3 -1
  4. package/dist/ConversationsPage.d.ts.map +1 -1
  5. package/dist/data/accents.d.ts +3 -0
  6. package/dist/data/accents.d.ts.map +1 -0
  7. package/dist/data/mock.d.ts +7 -1
  8. package/dist/data/mock.d.ts.map +1 -1
  9. package/dist/data/mock.test.d.ts +2 -0
  10. package/dist/data/mock.test.d.ts.map +1 -0
  11. package/dist/data/supabase.d.ts.map +1 -1
  12. package/dist/data/tables.d.ts +5 -0
  13. package/dist/data/tables.d.ts.map +1 -0
  14. package/dist/data/types.d.ts +2 -1
  15. package/dist/data/types.d.ts.map +1 -1
  16. package/dist/index.d.ts +16 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +667 -73
  19. package/dist/index.js.map +1 -1
  20. package/dist/locales/en.d.ts.map +1 -1
  21. package/dist/locales/index.d.ts.map +1 -1
  22. package/dist/locales/pt-BR.d.ts +2 -0
  23. package/dist/locales/pt-BR.d.ts.map +1 -0
  24. package/dist/migrations/index.d.ts +7 -0
  25. package/dist/migrations/index.d.ts.map +1 -0
  26. package/dist/store.d.ts +2 -1
  27. package/dist/store.d.ts.map +1 -1
  28. package/dist/types.d.ts +18 -0
  29. package/dist/types.d.ts.map +1 -1
  30. package/dist/views/ContactPanel.d.ts.map +1 -1
  31. package/dist/views/ConversationList.d.ts.map +1 -1
  32. package/dist/views/InboxView.d.ts.map +1 -1
  33. package/dist/views/MessageThread.d.ts.map +1 -1
  34. package/dist/views/NewConversationModal.d.ts +6 -0
  35. package/dist/views/NewConversationModal.d.ts.map +1 -0
  36. package/package.json +15 -11
  37. package/src/ConversationsContext.tsx +31 -1
  38. package/src/ConversationsPage.tsx +6 -3
  39. package/src/data/accents.ts +12 -0
  40. package/src/data/mock.test.ts +90 -0
  41. package/src/data/mock.ts +131 -12
  42. package/src/data/supabase.ts +69 -7
  43. package/src/data/tables.ts +7 -0
  44. package/src/data/types.ts +2 -0
  45. package/src/index.ts +69 -11
  46. package/src/locales/en.ts +64 -0
  47. package/src/locales/index.ts +2 -0
  48. package/src/locales/pt-BR.ts +68 -0
  49. package/src/migrations/001_conversations.sql +74 -0
  50. package/src/migrations/002_contact_person.sql +22 -0
  51. package/src/migrations/index.ts +108 -0
  52. package/src/store.ts +44 -1
  53. package/src/types.ts +19 -0
  54. package/src/views/ContactPanel.tsx +14 -12
  55. package/src/views/ConversationList.tsx +48 -21
  56. package/src/views/InboxView.tsx +3 -1
  57. package/src/views/MessageThread.tsx +14 -16
  58. package/src/views/NewConversationModal.tsx +204 -0
  59. package/dist/index.cjs +0 -904
  60. package/dist/index.cjs.map +0 -1
@@ -1,9 +1,26 @@
1
1
  import React from 'react';
2
2
  import { type StoreApi } from 'zustand';
3
+ import type { EntityLookup } from '@fayz-ai/saas';
3
4
  import type { ConversationsUIState } from './store';
4
- export declare function ConversationsContextProvider({ store, children, }: {
5
+ /**
6
+ * App-tunable knobs the inbox UI reads. Kept tiny on purpose: everything here
7
+ * describes the APP's data shape (which people are "contacts" in this vertical),
8
+ * never product policy.
9
+ */
10
+ export interface ResolvedConversationsConfig {
11
+ /** `people.kind` used when the compose modal creates a contact. */
12
+ contactKind: string;
13
+ /** Per-vertical extension table linked by `person_id` (skipped when absent). */
14
+ contactExtensionTable?: string;
15
+ /** Search source for the contact picker. Defaults to the person archetype. */
16
+ contactLookup?: EntityLookup;
17
+ }
18
+ export declare const DEFAULT_CONVERSATIONS_CONFIG: ResolvedConversationsConfig;
19
+ export declare function ConversationsContextProvider({ store, config, children, }: {
5
20
  store: StoreApi<ConversationsUIState>;
21
+ config?: ResolvedConversationsConfig;
6
22
  children?: React.ReactNode;
7
23
  }): React.JSX.Element;
8
24
  export declare function useConversationsStore<T>(selector: (state: ConversationsUIState) => T): T;
25
+ export declare function useConversationsConfig(): ResolvedConversationsConfig;
9
26
  //# sourceMappingURL=ConversationsContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationsContext.d.ts","sourceRoot":"","sources":["../src/ConversationsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAInD,wBAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,qBAEA;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,CAAC,GAAG,CAAC,CAIxF"}
1
+ {"version":3,"file":"ConversationsContext.d.ts","sourceRoot":"","sources":["../src/ConversationsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAA;IACnB,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,YAAY,CAAA;CAC7B;AAED,eAAO,MAAM,4BAA4B,EAAE,2BAE1C,CAAA;AAKD,wBAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,MAAqC,EACrC,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,2BAA2B,CAAA;IACpC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,qBAMA;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,CAAC,GAAG,CAAC,CAIxF;AAED,wBAAgB,sBAAsB,IAAI,2BAA2B,CAEpE"}
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
2
  import type { StoreApi } from 'zustand/vanilla';
3
+ import { type ResolvedConversationsConfig } from './ConversationsContext';
3
4
  import type { ConversationsUIState } from './store';
4
- export declare function ConversationsPage({ store }: {
5
+ export declare function ConversationsPage({ store, config }: {
5
6
  store: StoreApi<ConversationsUIState>;
7
+ config?: ResolvedConversationsConfig;
6
8
  }): React.JSX.Element;
7
9
  //# sourceMappingURL=ConversationsPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationsPage.d.ts","sourceRoot":"","sources":["../src/ConversationsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGnD,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;CAAE,qBAWrF"}
1
+ {"version":3,"file":"ConversationsPage.d.ts","sourceRoot":"","sources":["../src/ConversationsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAgC,KAAK,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACvG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGnD,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IACnD,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,2BAA2B,CAAA;CACrC,qBAWA"}
@@ -0,0 +1,3 @@
1
+ import type { Channel } from '../types';
2
+ export declare const CHANNEL_ACCENT_HEX: Record<Channel, string>;
3
+ //# sourceMappingURL=accents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accents.d.ts","sourceRoot":"","sources":["../../src/data/accents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAKvC,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAMtD,CAAA"}
@@ -1,3 +1,9 @@
1
1
  import type { ConversationsProvider } from './types';
2
- export declare function createMockConversationsProvider(): ConversationsProvider;
2
+ export interface MockConversationsConfig {
3
+ /** Tenant id (value or getter) used to namespace the localStorage snapshot. */
4
+ tenantId?: string | (() => string | undefined);
5
+ /** Display name stamped as the author of outbound messages. */
6
+ selfAuthor?: string;
7
+ }
8
+ export declare function createMockConversationsProvider(config?: MockConversationsConfig): ConversationsProvider;
3
9
  //# sourceMappingURL=mock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAoFpD,wBAAgB,+BAA+B,IAAI,qBAAqB,CAyDvE"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAsFpD,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAaD,wBAAgB,+BAA+B,CAC7C,MAAM,CAAC,EAAE,uBAAuB,GAC/B,qBAAqB,CA0JvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.test.d.ts","sourceRoot":"","sources":["../../src/data/mock.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/data/supabase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAoBpD,MAAM,WAAW,2BAA2B;IAC1C,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAkCD,wBAAgB,mCAAmC,CACjD,MAAM,CAAC,EAAE,2BAA2B,GACnC,qBAAqB,CAyIvB"}
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/data/supabase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAuBpD,MAAM,WAAW,2BAA2B;IAC1C,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAmCD,wBAAgB,mCAAmC,CACjD,MAAM,CAAC,EAAE,2BAA2B,GACnC,qBAAqB,CAmMvB"}
@@ -0,0 +1,5 @@
1
+ export declare const T: {
2
+ readonly conversations: "plg_conversations";
3
+ readonly messages: "plg_conversation_messages";
4
+ };
5
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/data/tables.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,CAAC;;;CAGJ,CAAA"}
@@ -1,7 +1,8 @@
1
- import type { Conversation, Message, ListConversationsQuery, SendMessageInput, ConversationStatus } from '../types';
1
+ import type { Conversation, Message, ListConversationsQuery, SendMessageInput, CreateConversationInput, ConversationStatus } from '../types';
2
2
  export interface ConversationsProvider {
3
3
  listConversations(query?: ListConversationsQuery): Promise<Conversation[]>;
4
4
  getMessages(conversationId: string): Promise<Message[]>;
5
+ createConversation(input: CreateConversationInput): Promise<Conversation>;
5
6
  sendMessage(input: SendMessageInput): Promise<Message>;
6
7
  markRead(conversationId: string): Promise<void>;
7
8
  setStatus(conversationId: string, status: ConversationStatus): Promise<Conversation>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,EACP,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,KAAK,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC1E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACvD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACrF"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,EACP,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,KAAK,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC1E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACvD,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACzE,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACrF"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core';
2
+ import type { EntityLookup } from '@fayz-ai/saas';
2
3
  import type { ConversationsProvider } from './data/types';
3
4
  export interface ConversationsPluginOptions {
4
5
  navPosition?: number;
@@ -7,10 +8,23 @@ export interface ConversationsPluginOptions {
7
8
  scope?: PluginScope;
8
9
  verticalId?: VerticalId;
9
10
  dataProvider?: ConversationsProvider;
11
+ /**
12
+ * `people.kind` for contacts created from the compose modal's picker. Each
13
+ * vertical names its people differently (beauty 'client', agency 'lead'),
14
+ * hence a knob rather than a hardcoded value. Default: 'contact'.
15
+ */
16
+ contactKind?: string;
17
+ /**
18
+ * Per-vertical extension table linked by `person_id` (e.g. 'clients'). Pools
19
+ * without it live off `public.people` alone — absent is not an error.
20
+ */
21
+ contactExtensionTable?: string;
22
+ /** Custom search source for the picker. Defaults to the person archetype lookup. */
23
+ contactLookup?: EntityLookup;
10
24
  }
11
25
  export declare function createConversationsPlugin(options?: ConversationsPluginOptions): PluginManifest;
12
26
  export type { ConversationsProvider } from './data/types';
13
- export type { Conversation, Message, Channel } from './types';
14
- export { createMockConversationsProvider } from './data/mock';
27
+ export type { Conversation, Message, Channel, CreateConversationInput } from './types';
28
+ export { createMockConversationsProvider, type MockConversationsConfig } from './data/mock';
15
29
  export { createSupabaseConversationsProvider, type SupabaseConversationsConfig, } from './data/supabase';
16
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAezD,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,qBAAqB,CAAA;CACrC;AAYD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,cAAc,CAqF9F;AAED,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EACL,mCAAmC,EACnC,KAAK,2BAA2B,GACjC,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAkBzD,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,qBAAqB,CAAA;IAEpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oFAAoF;IACpF,aAAa,CAAC,EAAE,YAAY,CAAA;CAC7B;AA2BD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,cAAc,CA6G9F;AAED,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AACtF,OAAO,EAAE,+BAA+B,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC3F,OAAO,EACL,mCAAmC,EACnC,KAAK,2BAA2B,GACjC,MAAM,iBAAiB,CAAA"}