@fayz-ai/plugin-agenda 0.1.3

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 (114) hide show
  1. package/README.md +51 -0
  2. package/dist/AgendaContext.d.ts +13 -0
  3. package/dist/AgendaContext.d.ts.map +1 -0
  4. package/dist/AgendaPage.d.ts +11 -0
  5. package/dist/AgendaPage.d.ts.map +1 -0
  6. package/dist/bridges/create-financial-bridge.d.ts +19 -0
  7. package/dist/bridges/create-financial-bridge.d.ts.map +1 -0
  8. package/dist/calendar-styles.d.ts +8 -0
  9. package/dist/calendar-styles.d.ts.map +1 -0
  10. package/dist/chunk-3LJKZQK4.js +12 -0
  11. package/dist/chunk-3LJKZQK4.js.map +1 -0
  12. package/dist/chunk-SYDBDI3Q.cjs +15 -0
  13. package/dist/chunk-SYDBDI3Q.cjs.map +1 -0
  14. package/dist/components/AgendaGeneralSettings.d.ts +3 -0
  15. package/dist/components/AgendaGeneralSettings.d.ts.map +1 -0
  16. package/dist/components/AppointmentModal.d.ts +16 -0
  17. package/dist/components/AppointmentModal.d.ts.map +1 -0
  18. package/dist/components/AppointmentPopover.d.ts +14 -0
  19. package/dist/components/AppointmentPopover.d.ts.map +1 -0
  20. package/dist/components/BookingPaymentPanel.d.ts +18 -0
  21. package/dist/components/BookingPaymentPanel.d.ts.map +1 -0
  22. package/dist/components/CalendarSidebar.d.ts +3 -0
  23. package/dist/components/CalendarSidebar.d.ts.map +1 -0
  24. package/dist/components/CalendarToolbar.d.ts +13 -0
  25. package/dist/components/CalendarToolbar.d.ts.map +1 -0
  26. package/dist/components/EventContextMenu.d.ts +14 -0
  27. package/dist/components/EventContextMenu.d.ts.map +1 -0
  28. package/dist/components/FloatingPanel.d.ts +27 -0
  29. package/dist/components/FloatingPanel.d.ts.map +1 -0
  30. package/dist/components/MiniCalendar.d.ts +9 -0
  31. package/dist/components/MiniCalendar.d.ts.map +1 -0
  32. package/dist/components/PaymentStatusBadge.d.ts +13 -0
  33. package/dist/components/PaymentStatusBadge.d.ts.map +1 -0
  34. package/dist/components/SearchCombobox.d.ts +38 -0
  35. package/dist/components/SearchCombobox.d.ts.map +1 -0
  36. package/dist/components/StatusBadge.d.ts +5 -0
  37. package/dist/components/StatusBadge.d.ts.map +1 -0
  38. package/dist/config.d.ts +151 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/data/index.d.ts +4 -0
  41. package/dist/data/index.d.ts.map +1 -0
  42. package/dist/data/mock.d.ts +3 -0
  43. package/dist/data/mock.d.ts.map +1 -0
  44. package/dist/data/supabase.d.ts +3 -0
  45. package/dist/data/supabase.d.ts.map +1 -0
  46. package/dist/data/types.d.ts +26 -0
  47. package/dist/data/types.d.ts.map +1 -0
  48. package/dist/financial-bridge.d.ts +92 -0
  49. package/dist/financial-bridge.d.ts.map +1 -0
  50. package/dist/hooks/useAgendaSettings.d.ts +7 -0
  51. package/dist/hooks/useAgendaSettings.d.ts.map +1 -0
  52. package/dist/index.cjs +5135 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +5120 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/tenant.d.ts +3 -0
  59. package/dist/lib/tenant.d.ts.map +1 -0
  60. package/dist/locales/en.d.ts +2 -0
  61. package/dist/locales/en.d.ts.map +1 -0
  62. package/dist/locales/index.d.ts +2 -0
  63. package/dist/locales/index.d.ts.map +1 -0
  64. package/dist/locales/pt-BR.d.ts +2 -0
  65. package/dist/locales/pt-BR.d.ts.map +1 -0
  66. package/dist/registries.d.ts +3 -0
  67. package/dist/registries.d.ts.map +1 -0
  68. package/dist/store.d.ts +66 -0
  69. package/dist/store.d.ts.map +1 -0
  70. package/dist/tenant-222EHYUC.cjs +16 -0
  71. package/dist/tenant-222EHYUC.cjs.map +1 -0
  72. package/dist/tenant-LAUWVUYB.js +3 -0
  73. package/dist/tenant-LAUWVUYB.js.map +1 -0
  74. package/dist/types.d.ts +202 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/views/CalendarView.d.ts +3 -0
  77. package/dist/views/CalendarView.d.ts.map +1 -0
  78. package/dist/views/ConfirmationsView.d.ts +3 -0
  79. package/dist/views/ConfirmationsView.d.ts.map +1 -0
  80. package/package.json +63 -0
  81. package/src/AgendaContext.tsx +11 -0
  82. package/src/AgendaPage.tsx +33 -0
  83. package/src/bridges/create-financial-bridge.ts +298 -0
  84. package/src/calendar-styles.css +245 -0
  85. package/src/calendar-styles.ts +285 -0
  86. package/src/components/AgendaGeneralSettings.tsx +64 -0
  87. package/src/components/AppointmentModal.tsx +1031 -0
  88. package/src/components/AppointmentPopover.tsx +221 -0
  89. package/src/components/BookingPaymentPanel.tsx +394 -0
  90. package/src/components/CalendarSidebar.tsx +119 -0
  91. package/src/components/CalendarToolbar.tsx +83 -0
  92. package/src/components/EventContextMenu.tsx +122 -0
  93. package/src/components/FloatingPanel.tsx +123 -0
  94. package/src/components/MiniCalendar.tsx +120 -0
  95. package/src/components/PaymentStatusBadge.tsx +62 -0
  96. package/src/components/SearchCombobox.tsx +216 -0
  97. package/src/components/StatusBadge.tsx +23 -0
  98. package/src/config.ts +269 -0
  99. package/src/data/index.ts +3 -0
  100. package/src/data/mock.ts +324 -0
  101. package/src/data/supabase.ts +570 -0
  102. package/src/data/types.ts +37 -0
  103. package/src/financial-bridge.ts +96 -0
  104. package/src/hooks/useAgendaSettings.ts +17 -0
  105. package/src/index.ts +180 -0
  106. package/src/lib/tenant.ts +3 -0
  107. package/src/locales/en.ts +207 -0
  108. package/src/locales/index.ts +7 -0
  109. package/src/locales/pt-BR.ts +207 -0
  110. package/src/registries.ts +36 -0
  111. package/src/store.ts +304 -0
  112. package/src/types.ts +265 -0
  113. package/src/views/CalendarView.tsx +904 -0
  114. package/src/views/ConfirmationsView.tsx +155 -0
@@ -0,0 +1,3 @@
1
+ export declare function setAgendaTenantId(id: string | undefined): void;
2
+ export declare function getAgendaTenantId(): string | undefined;
3
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/lib/tenant.ts"],"names":[],"mappings":"AACA,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,QAAW;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAAa"}
@@ -0,0 +1,2 @@
1
+ export declare const en: Record<string, string>;
2
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6MrC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const agendaLocales: Record<string, Record<string, string>>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/locales/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGhE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const ptBR: Record<string, string>;
2
+ //# sourceMappingURL=pt-BR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6MvC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PluginRegistryDef } from '@fayz-ai/core';
2
+ export declare const agendaRegistries: PluginRegistryDef[];
3
+ //# sourceMappingURL=registries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AA4BtD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAO/C,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { type StoreApi } from 'zustand/vanilla';
2
+ import type { AgendaDataProvider } from './data/types';
3
+ import type { AgendaFinancialBridge } from './financial-bridge';
4
+ import type { CalendarBooking, Professional, Schedule, CreateBookingInput, UpdateBookingInput } from './types';
5
+ export interface AgendaUIState {
6
+ bookings: CalendarBooking[];
7
+ bookingsLoading: boolean;
8
+ dateRange: {
9
+ start: string;
10
+ end: string;
11
+ };
12
+ currentView: string;
13
+ selectedDate: string;
14
+ professionals: Professional[];
15
+ professionalsLoading: boolean;
16
+ selectedProfessionalIds: string[];
17
+ selectedLocationId: string | null;
18
+ selectedStatuses: string[];
19
+ locations: Array<{
20
+ id: string;
21
+ name: string;
22
+ }>;
23
+ schedules: Schedule[];
24
+ schedulesLoading: boolean;
25
+ pendingConfirmations: CalendarBooking[];
26
+ confirmationsLoading: boolean;
27
+ appointmentModal: {
28
+ open: boolean;
29
+ mode: 'create' | 'edit';
30
+ bookingId?: string;
31
+ prefill?: Partial<CreateBookingInput> & {
32
+ endsAt?: string;
33
+ };
34
+ initialTab?: string;
35
+ };
36
+ fetchBookings(range: {
37
+ start: string;
38
+ end: string;
39
+ }): Promise<void>;
40
+ fetchProfessionals(): Promise<void>;
41
+ fetchLocations(): Promise<void>;
42
+ fetchSchedules(professionalId?: string): Promise<void>;
43
+ fetchConfirmations(): Promise<void>;
44
+ createBooking(input: CreateBookingInput): Promise<CalendarBooking>;
45
+ updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>;
46
+ deleteBooking(id: string): Promise<void>;
47
+ updateBookingStatus(id: string, status: string): Promise<void>;
48
+ rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>;
49
+ setFilters(filters: Partial<{
50
+ professionalIds: string[];
51
+ locationId: string | null;
52
+ statuses: string[];
53
+ }>): void;
54
+ setView(view: string): void;
55
+ setSelectedDate(date: string): void;
56
+ openAppointmentModal(mode: 'create' | 'edit', options?: {
57
+ bookingId?: string;
58
+ prefill?: Partial<CreateBookingInput> & {
59
+ endsAt?: string;
60
+ };
61
+ initialTab?: string;
62
+ }): void;
63
+ closeAppointmentModal(): void;
64
+ }
65
+ export declare function createAgendaStore(provider: AgendaDataProvider, financialBridge?: AgendaFinancialBridge): StoreApi<AgendaUIState>;
66
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkSYDBDI3Q_cjs = require('./chunk-SYDBDI3Q.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "getAgendaTenantId", {
8
+ enumerable: true,
9
+ get: function () { return chunkSYDBDI3Q_cjs.getAgendaTenantId; }
10
+ });
11
+ Object.defineProperty(exports, "setAgendaTenantId", {
12
+ enumerable: true,
13
+ get: function () { return chunkSYDBDI3Q_cjs.setAgendaTenantId; }
14
+ });
15
+ //# sourceMappingURL=tenant-222EHYUC.cjs.map
16
+ //# sourceMappingURL=tenant-222EHYUC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-222EHYUC.cjs"}
@@ -0,0 +1,3 @@
1
+ export { getAgendaTenantId, setAgendaTenantId } from './chunk-3LJKZQK4.js';
2
+ //# sourceMappingURL=tenant-LAUWVUYB.js.map
3
+ //# sourceMappingURL=tenant-LAUWVUYB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-LAUWVUYB.js"}
@@ -0,0 +1,202 @@
1
+ /** Booking status lifecycle */
2
+ export type BookingStatus = 'scheduled' | 'confirmed' | 'in_progress' | 'completed' | 'cancelled' | 'no_show';
3
+ /** Confirmation outreach status */
4
+ export type ConfirmationStatus = 'pending' | 'sent' | 'confirmed' | 'declined';
5
+ /** Booking type identifier — extensible via string literal union */
6
+ export type BookingTypeId = 'appointment' | 'task' | 'out_of_office' | 'block' | (string & {});
7
+ /** Configuration for a booking type (event type) */
8
+ export interface BookingTypeConfig {
9
+ id: BookingTypeId;
10
+ label: string;
11
+ icon: string;
12
+ color: string;
13
+ fields: {
14
+ client: boolean;
15
+ professional: boolean;
16
+ services: boolean;
17
+ location: boolean;
18
+ status: boolean;
19
+ };
20
+ requiresServices: boolean;
21
+ requiresClient: boolean;
22
+ }
23
+ /** A booking service line item (from saas_core.booking_items) */
24
+ export interface BookingService {
25
+ id: string;
26
+ serviceId: string | null;
27
+ name: string;
28
+ durationMinutes: number;
29
+ price: number;
30
+ assigneeId: string | null;
31
+ }
32
+ /** Calendar booking — the main entity rendered on the calendar (from v_bookings view on orders) */
33
+ export interface CalendarBooking {
34
+ id: string;
35
+ tenantId: string;
36
+ kind: string;
37
+ /** Lifecycle stage: booked, invoiced, paid, etc. */
38
+ stage?: string;
39
+ /** Financial direction: credit, debit, null */
40
+ direction?: string | null;
41
+ startsAt: string;
42
+ endsAt: string | null;
43
+ status: BookingStatus;
44
+ notes: string | null;
45
+ /** In unified model, orderId === id (the booking IS the order) */
46
+ orderId: string | null;
47
+ locationId: string | null;
48
+ metadata: Record<string, unknown>;
49
+ clientId: string | null;
50
+ clientName: string | null;
51
+ clientPhone: string | null;
52
+ clientEmail: string | null;
53
+ clientAvatarUrl: string | null;
54
+ professionalId: string | null;
55
+ professionalName: string | null;
56
+ professionalAvatarUrl: string | null;
57
+ locationName: string | null;
58
+ orderTotal: number | null;
59
+ orderStatus: string | null;
60
+ /** Payment status from financial bridge (enriched at runtime) */
61
+ paymentStatus?: import('./financial-bridge').BookingPaymentStatus;
62
+ services: BookingService[] | null;
63
+ totalDurationMinutes: number | null;
64
+ createdAt: string;
65
+ updatedAt: string;
66
+ }
67
+ /** Professional / staff resource for the calendar */
68
+ export interface Professional {
69
+ id: string;
70
+ name: string;
71
+ avatarUrl: string | null;
72
+ locationId: string | null;
73
+ locationName: string | null;
74
+ isActive: boolean;
75
+ }
76
+ /** Working hours schedule (from saas_core.schedules) */
77
+ export interface Schedule {
78
+ id: string;
79
+ tenantId: string;
80
+ kind: string;
81
+ assigneeId: string | null;
82
+ locationId: string | null;
83
+ dayOfWeek: number | null;
84
+ specificDate: string | null;
85
+ startsAt: string;
86
+ endsAt: string;
87
+ isActive: boolean;
88
+ metadata: Record<string, unknown>;
89
+ }
90
+ /** Available time slot */
91
+ export interface TimeSlot {
92
+ start: string;
93
+ end: string;
94
+ }
95
+ /** Confirmation record stored in booking metadata */
96
+ export interface ConfirmationRecord {
97
+ channel: string;
98
+ sentAt: string;
99
+ status: ConfirmationStatus;
100
+ confirmedAt?: string;
101
+ }
102
+ /**
103
+ * When a status is available for selection relative to the booking date.
104
+ * - 'always' — any date (e.g. scheduled, confirmed, cancelled)
105
+ * - 'today_or_past' — booking is today or earlier (e.g. completed, no_show)
106
+ * - 'today_only' — booking is today (e.g. in_progress)
107
+ */
108
+ export type StatusAvailability = 'always' | 'today_or_past' | 'today_only';
109
+ export interface StatusConfig {
110
+ value: string;
111
+ label: string;
112
+ color: string;
113
+ /** When this status can be selected (default: 'always') */
114
+ availableWhen?: StatusAvailability;
115
+ }
116
+ /** Check if a status is available for a given booking date */
117
+ export declare function isStatusAvailable(status: StatusConfig, bookingStartsAt: string): boolean;
118
+ /** Props passed to every booking modal tab component */
119
+ export interface BookingModalTabProps {
120
+ bookingId?: string;
121
+ clientId: string;
122
+ orderId: string | null;
123
+ services: Array<{
124
+ name: string;
125
+ price: number;
126
+ durationMinutes: number;
127
+ }>;
128
+ formatCurrency: (amount: number) => string;
129
+ onDataChange?: () => void;
130
+ }
131
+ /** A tab registered in the booking edit modal */
132
+ export interface BookingModalTab {
133
+ id: string;
134
+ label: string;
135
+ icon: string;
136
+ order: number;
137
+ component: React.ComponentType<BookingModalTabProps>;
138
+ visible?: (ctx: {
139
+ mode: 'create' | 'edit';
140
+ clientId?: string;
141
+ orderId?: string;
142
+ }) => boolean;
143
+ }
144
+ export interface CreateBookingInput {
145
+ kind?: BookingTypeId;
146
+ clientId: string;
147
+ professionalId: string;
148
+ locationId?: string;
149
+ startsAt: string;
150
+ notes?: string;
151
+ services: CreateBookingServiceInput[];
152
+ }
153
+ export interface CreateBookingServiceInput {
154
+ serviceId: string;
155
+ name: string;
156
+ durationMinutes: number;
157
+ price: number;
158
+ assigneeId?: string;
159
+ }
160
+ export interface UpdateBookingInput {
161
+ clientId?: string;
162
+ professionalId?: string;
163
+ locationId?: string;
164
+ startsAt?: string;
165
+ endsAt?: string;
166
+ status?: BookingStatus;
167
+ notes?: string;
168
+ services?: CreateBookingServiceInput[];
169
+ }
170
+ export interface SaveScheduleInput {
171
+ assigneeId: string;
172
+ locationId?: string;
173
+ dayOfWeek?: number;
174
+ specificDate?: string;
175
+ startsAt: string;
176
+ endsAt: string;
177
+ isActive?: boolean;
178
+ metadata?: Record<string, unknown>;
179
+ }
180
+ export interface BookingQuery {
181
+ dateRange: {
182
+ start: string;
183
+ end: string;
184
+ };
185
+ professionalIds?: string[];
186
+ locationId?: string;
187
+ statuses?: string[];
188
+ kind?: string;
189
+ }
190
+ export interface ConflictCheckParams {
191
+ assigneeId: string;
192
+ startsAt: string;
193
+ endsAt: string;
194
+ excludeBookingId?: string;
195
+ }
196
+ export interface AvailableSlotsParams {
197
+ assigneeId: string;
198
+ date: string;
199
+ durationMinutes: number;
200
+ slotInterval?: number;
201
+ }
202
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function CalendarView(): React.JSX.Element;
3
+ //# sourceMappingURL=CalendarView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../../src/views/CalendarView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AA4OhF,wBAAgB,YAAY,sBA2pB3B"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function ConfirmationsView(): React.JSX.Element;
3
+ //# sourceMappingURL=ConfirmationsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmationsView.d.ts","sourceRoot":"","sources":["../../src/views/ConfirmationsView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAiCxC,wBAAgB,iBAAiB,sBAyHhC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@fayz-ai/plugin-agenda",
3
+ "version": "0.1.3",
4
+ "description": "Fayz SDK — plugin-agenda plugin",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "source": "./src/index.ts",
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src"
20
+ ],
21
+ "peerDependencies": {
22
+ "react": "^18.0.0 || ^19.0.0",
23
+ "react-dom": "^18.0.0 || ^19.0.0"
24
+ },
25
+ "dependencies": {
26
+ "lucide-react": "^0.400.0",
27
+ "zustand": "^4.5.0",
28
+ "@fullcalendar/core": "^6.1.20",
29
+ "@fullcalendar/daygrid": "^6.1.20",
30
+ "@fullcalendar/timegrid": "^6.1.20",
31
+ "@fullcalendar/react": "^6.1.20",
32
+ "@fullcalendar/interaction": "^6.1.20",
33
+ "@tanstack/react-table": "^8.20.0",
34
+ "@fullcalendar/resource-timegrid": "^6.1.0",
35
+ "@fullcalendar/list": "^6.1.0",
36
+ "@fayz-ai/core": "^0.1.7",
37
+ "@fayz-ai/ui": "^0.1.7",
38
+ "@fayz-ai/saas": "^0.1.7",
39
+ "@fayz-ai/plugin-financial": "^0.1.2"
40
+ },
41
+ "devDependencies": {
42
+ "@types/react": "^18.3.0",
43
+ "react": "^18.3.0",
44
+ "tsup": "^8.2.0",
45
+ "typescript": "^5.5.0",
46
+ "@types/react-dom": "^18.3.0"
47
+ },
48
+ "license": "MIT",
49
+ "keywords": [
50
+ "fayz",
51
+ "fayz-plugin",
52
+ "fayz-sdk"
53
+ ],
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "scripts": {
58
+ "build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --noEmit false",
59
+ "dev": "tsup --watch",
60
+ "typecheck": "tsc --noEmit",
61
+ "clean": "rm -rf dist"
62
+ }
63
+ }
@@ -0,0 +1,11 @@
1
+ import { createPluginContext } from '@fayz-ai/saas'
2
+ import type { ResolvedAgendaConfig } from './config'
3
+ import type { AgendaDataProvider } from './data/types'
4
+ import type { AgendaUIState } from './store'
5
+
6
+ const ctx = createPluginContext<ResolvedAgendaConfig, AgendaDataProvider, AgendaUIState>('AgendaPage')
7
+
8
+ export const AgendaContextProvider = ctx.ContextProvider
9
+ export const useAgendaConfig = ctx.useConfig
10
+ export const useAgendaProvider = ctx.useProvider
11
+ export const useAgendaStore = ctx.useStore
@@ -0,0 +1,33 @@
1
+ import React from 'react'
2
+ import { usePluginRuntimeOptional } from '@fayz-ai/core'
3
+ import type { StoreApi } from 'zustand/vanilla'
4
+ import { AgendaContextProvider } from './AgendaContext'
5
+ import type { ResolvedAgendaConfig } from './config'
6
+ import type { AgendaDataProvider } from './data/types'
7
+ import type { AgendaUIState } from './store'
8
+ import { CalendarView } from './views/CalendarView'
9
+ import { setAgendaTenantId } from './lib/tenant'
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Main page — clean single-page calendar, no module nav wrapper
13
+ // ---------------------------------------------------------------------------
14
+
15
+ export function AgendaPage({ config, provider, store }: {
16
+ config: ResolvedAgendaConfig
17
+ provider: AgendaDataProvider
18
+ store: StoreApi<AgendaUIState>
19
+ }) {
20
+ const runtime = usePluginRuntimeOptional()
21
+ const tenantId = runtime?.context.tenant?.id
22
+
23
+ React.useEffect(() => {
24
+ setAgendaTenantId(tenantId)
25
+ return () => setAgendaTenantId(undefined)
26
+ }, [tenantId])
27
+
28
+ return (
29
+ <AgendaContextProvider config={config} provider={provider} store={store}>
30
+ <CalendarView />
31
+ </AgendaContextProvider>
32
+ )
33
+ }