@la-main-verte/shared-types 1.0.71 → 1.0.73

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@la-main-verte/shared-types",
3
- "version": "1.0.71",
3
+ "version": "1.0.73",
4
4
  "description": "Shared TypeScript interfaces for frontend of la-main-verte app",
5
5
  "main": "src/index.js",
6
6
  "types": "src/index.d.ts",
@@ -1,7 +1,7 @@
1
- import type { HOME } from './home.api'
2
-
3
- export namespace GARDEN_ZONE_BLUEPRINT {
4
- export interface Response {
5
- sections: HOME.SectionI[]
6
- }
7
- }
1
+ import type { HOME } from './home.api'
2
+
3
+ export namespace GARDEN_ZONE_BLUEPRINT {
4
+ export interface Response {
5
+ sections: HOME.SectionI[]
6
+ }
7
+ }
package/src/home.api.d.ts CHANGED
@@ -1,252 +1,252 @@
1
- import type { PlantI } from './plant'
2
- import type { SelectionI } from './selection'
3
- import type { TaskI } from './task'
4
-
5
- export namespace HOME {
6
- export type HeroCardMode = 'featuredSelection' | 'featuredPlant'
7
-
8
- export type SectionComponentType =
9
- | 'Header'
10
- | 'HeroCards'
11
- | 'PlantCarousel'
12
- | 'HeroCardsCarousel'
13
- | 'WideCardsCarousel'
14
- | 'Weather'
15
- | 'AdviceCarousel'
16
- | 'OnboardingCard'
17
- | 'UpcomingTasks'
18
-
19
- export type CarouselComponentType = Extract<
20
- SectionComponentType,
21
- 'PlantCarousel' | 'HeroCardsCarousel' | 'WideCardsCarousel'
22
- >
23
-
24
- export interface WeatherDayI {
25
- date: string
26
- minTempC: number
27
- maxTempC: number
28
- iconUrl: string | null
29
- condition?: string | null
30
- }
31
-
32
- export interface WeatherSectionI {
33
- componentType: 'Weather'
34
- title: string
35
- subtitle?: string
36
- locationName: string
37
- timezone: string
38
- days: WeatherDayI[]
39
- lastUpdatedAt: string
40
- dataSource: 'weatherapi'
41
- backgroundColor?: string
42
- }
43
-
44
- export interface HeaderSectionI {
45
- componentType: 'Header'
46
- title: string
47
- subtitle: string
48
- }
49
-
50
- export interface AdviceI {
51
- id?: string | number
52
- title: string
53
- markdownContent: string
54
- titleColor?: string
55
- backgroundColor?: string
56
- }
57
-
58
- export interface AdviceSectionI {
59
- componentType: 'AdviceCarousel'
60
- title?: string
61
- subtitle?: string
62
- advices: AdviceI[]
63
- }
64
-
65
- export interface WideCardAuthorI {
66
- name?: string | null
67
- imageURL?: string | null
68
- }
69
-
70
- export interface WideCardItemI {
71
- id?: string | number
72
- title?: string | null
73
- text: string
74
- badgeText?: string | null
75
- thumbnailImageURL: string
76
- author?: WideCardAuthorI | null
77
- link?: string | null
78
- metadata?: Record<string, unknown>
79
- }
80
-
81
- export interface WideCardsCarouselSectionI {
82
- componentType: 'WideCardsCarousel'
83
- title: string
84
- subtitle?: string
85
- cards: WideCardItemI[]
86
- }
87
-
88
- export interface HeroCardBlueprintI {
89
- mode: HeroCardMode
90
- title?: string | null
91
- description?: string | null
92
- backgroundColor?: string | null
93
- backgroundImageUrl?: string | null
94
- ctaLabel?: string | null
95
- ctaRoute?: string | null
96
- previewPlants?: PlantI[]
97
- selection?: SelectionI | null
98
- plant?: PlantI | null
99
- }
100
-
101
- export interface HeroCardsSectionI {
102
- componentType: 'HeroCards'
103
- title?: string | null
104
- subtitle?: string | null
105
- cards: HeroCardBlueprintI[]
106
- }
107
-
108
- export interface PlantCarouselSectionI {
109
- componentType: 'PlantCarousel'
110
- title: string
111
- subtitle?: string
112
- selection: SelectionI
113
- displayRanking?: boolean
114
- }
115
-
116
- export interface HeroCardsCarouselSectionI {
117
- componentType: 'HeroCardsCarousel'
118
- selections: SelectionI[]
119
- }
120
-
121
- export interface FamilyRecommendationI {
122
- family: string
123
- headline: string
124
- plants: PlantI[]
125
- }
126
-
127
- export interface FamilyExplorerSectionI {
128
- componentType: 'FamilyExplorer'
129
- title: string
130
- subtitle?: string
131
- families: FamilyRecommendationI[]
132
- }
133
-
134
- export interface OnboardingStepI {
135
- id: string
136
- title: string
137
- description: string
138
- isCompleted: boolean
139
- ctaLink: string
140
- }
141
-
142
- export interface OnboardingCardSectionI {
143
- componentType: 'OnboardingCard'
144
- title: string
145
- subtitle: string
146
- steps: OnboardingStepI[]
147
- completedStepsCount: number
148
- totalStepsCount: number
149
- }
150
-
151
- /** Minimal plant info for preview display in grouped tasks */
152
- export interface TaskPlantPreviewI {
153
- name: string
154
- slug: string
155
- imageURL?: string | null
156
- }
157
-
158
- /** Family group info when multiple plants share the same task */
159
- export interface TaskFamilyGroupI {
160
- familyName: string
161
- plantsCount: number
162
- plants: TaskPlantPreviewI[]
163
- }
164
-
165
- export interface UpcomingTaskI {
166
- task: TaskI
167
- plantName: string
168
- plantSlug: string
169
- plantImageURL?: string | null
170
- gardenName: string
171
- gardenCategory: string
172
- selectionSlug: string
173
- /** If this task is grouped by family */
174
- familyGroup?: TaskFamilyGroupI
175
- }
176
-
177
- export interface UpcomingTaskAdviceI {
178
- content: string
179
- taskName: string
180
- plantName: string
181
- plantSlug: string
182
- plantImageURL?: string | null
183
- gardenName: string
184
- gardenCategory: string
185
- selectionSlug: string
186
- task: TaskI
187
- /** If this task is grouped by family */
188
- familyGroup?: TaskFamilyGroupI
189
- }
190
-
191
- export interface UpcomingTasksSectionI {
192
- componentType: 'UpcomingTasks'
193
- title: string
194
- subtitle?: string
195
- advices: UpcomingTaskAdviceI[]
196
- }
197
-
198
- /** Preview plant for WhenToSeedWhat section */
199
- export interface WhenToSeedWhatPlantPreviewI {
200
- id: number
201
- name: string
202
- family?: string | null
203
- slug: string
204
- imageURL?: string | null
205
- }
206
-
207
- /** A generic link card section with title, subtitle, URL, and optional preview images */
208
- export interface LinkCardSectionI {
209
- componentType: 'LinkCard'
210
- title: string
211
- subtitle?: string
212
- url: string
213
- previewPlants?: WhenToSeedWhatPlantPreviewI[]
214
- backgroundColor?: string
215
- /** Show a red badge indicator (replaces the plant preview stack when true) */
216
- showBadge?: boolean
217
- /** Optional badge count to display */
218
- badgeCount?: number
219
- }
220
-
221
- export type SectionI =
222
- | HeaderSectionI
223
- | HeroCardsSectionI
224
- | PlantCarouselSectionI
225
- | HeroCardsCarouselSectionI
226
- | WideCardsCarouselSectionI
227
- | WeatherSectionI
228
- | AdviceSectionI
229
- | OnboardingCardSectionI
230
- | UpcomingTasksSectionI
231
- | LinkCardSectionI
232
-
233
- export interface Response {
234
- sections: SectionI[]
235
- weather?: WeatherSectionI
236
- advice?: AdviceSectionI
237
- }
238
-
239
- export interface HeroCardItemI {
240
- id?: string | null
241
- mode: HeroCardMode
242
- title?: string | null
243
- description?: string | null
244
- backgroundColor?: string | null
245
- backgroundImageUrl?: string | null
246
- previewPlants?: PlantI[]
247
- ctaLabel?: string | null
248
- selection?: SelectionI | null
249
- plant?: PlantI | null
250
- ctaRoute?: string | null
251
- }
252
- }
1
+ import type { PlantI } from './plant'
2
+ import type { SelectionI } from './selection'
3
+ import type { TaskI } from './task'
4
+
5
+ export namespace HOME {
6
+ export type HeroCardMode = 'featuredSelection' | 'featuredPlant'
7
+
8
+ export type SectionComponentType =
9
+ | 'Header'
10
+ | 'HeroCards'
11
+ | 'PlantCarousel'
12
+ | 'HeroCardsCarousel'
13
+ | 'WideCardsCarousel'
14
+ | 'Weather'
15
+ | 'AdviceCarousel'
16
+ | 'OnboardingCard'
17
+ | 'UpcomingTasks'
18
+
19
+ export type CarouselComponentType = Extract<
20
+ SectionComponentType,
21
+ 'PlantCarousel' | 'HeroCardsCarousel' | 'WideCardsCarousel'
22
+ >
23
+
24
+ export interface WeatherDayI {
25
+ date: string
26
+ minTempC: number
27
+ maxTempC: number
28
+ iconUrl: string | null
29
+ condition?: string | null
30
+ }
31
+
32
+ export interface WeatherSectionI {
33
+ componentType: 'Weather'
34
+ title: string
35
+ subtitle?: string
36
+ locationName: string
37
+ timezone: string
38
+ days: WeatherDayI[]
39
+ lastUpdatedAt: string
40
+ dataSource: 'weatherapi'
41
+ backgroundColor?: string
42
+ }
43
+
44
+ export interface HeaderSectionI {
45
+ componentType: 'Header'
46
+ title: string
47
+ subtitle: string
48
+ }
49
+
50
+ export interface AdviceI {
51
+ id?: string | number
52
+ title: string
53
+ markdownContent: string
54
+ titleColor?: string
55
+ backgroundColor?: string
56
+ }
57
+
58
+ export interface AdviceSectionI {
59
+ componentType: 'AdviceCarousel'
60
+ title?: string
61
+ subtitle?: string
62
+ advices: AdviceI[]
63
+ }
64
+
65
+ export interface WideCardAuthorI {
66
+ name?: string | null
67
+ imageURL?: string | null
68
+ }
69
+
70
+ export interface WideCardItemI {
71
+ id?: string | number
72
+ title?: string | null
73
+ text: string
74
+ badgeText?: string | null
75
+ thumbnailImageURL: string
76
+ author?: WideCardAuthorI | null
77
+ link?: string | null
78
+ metadata?: Record<string, unknown>
79
+ }
80
+
81
+ export interface WideCardsCarouselSectionI {
82
+ componentType: 'WideCardsCarousel'
83
+ title: string
84
+ subtitle?: string
85
+ cards: WideCardItemI[]
86
+ }
87
+
88
+ export interface HeroCardBlueprintI {
89
+ mode: HeroCardMode
90
+ title?: string | null
91
+ description?: string | null
92
+ backgroundColor?: string | null
93
+ backgroundImageUrl?: string | null
94
+ ctaLabel?: string | null
95
+ ctaRoute?: string | null
96
+ previewPlants?: PlantI[]
97
+ selection?: SelectionI | null
98
+ plant?: PlantI | null
99
+ }
100
+
101
+ export interface HeroCardsSectionI {
102
+ componentType: 'HeroCards'
103
+ title?: string | null
104
+ subtitle?: string | null
105
+ cards: HeroCardBlueprintI[]
106
+ }
107
+
108
+ export interface PlantCarouselSectionI {
109
+ componentType: 'PlantCarousel'
110
+ title: string
111
+ subtitle?: string
112
+ selection: SelectionI
113
+ displayRanking?: boolean
114
+ }
115
+
116
+ export interface HeroCardsCarouselSectionI {
117
+ componentType: 'HeroCardsCarousel'
118
+ selections: SelectionI[]
119
+ }
120
+
121
+ export interface FamilyRecommendationI {
122
+ family: string
123
+ headline: string
124
+ plants: PlantI[]
125
+ }
126
+
127
+ export interface FamilyExplorerSectionI {
128
+ componentType: 'FamilyExplorer'
129
+ title: string
130
+ subtitle?: string
131
+ families: FamilyRecommendationI[]
132
+ }
133
+
134
+ export interface OnboardingStepI {
135
+ id: string
136
+ title: string
137
+ description: string
138
+ isCompleted: boolean
139
+ ctaLink: string
140
+ }
141
+
142
+ export interface OnboardingCardSectionI {
143
+ componentType: 'OnboardingCard'
144
+ title: string
145
+ subtitle: string
146
+ steps: OnboardingStepI[]
147
+ completedStepsCount: number
148
+ totalStepsCount: number
149
+ }
150
+
151
+ /** Minimal plant info for preview display in grouped tasks */
152
+ export interface TaskPlantPreviewI {
153
+ name: string
154
+ slug: string
155
+ imageURL?: string | null
156
+ }
157
+
158
+ /** Family group info when multiple plants share the same task */
159
+ export interface TaskFamilyGroupI {
160
+ familyName: string
161
+ plantsCount: number
162
+ plants: TaskPlantPreviewI[]
163
+ }
164
+
165
+ export interface UpcomingTaskI {
166
+ task: TaskI
167
+ plantName: string
168
+ plantSlug: string
169
+ plantImageURL?: string | null
170
+ gardenName: string
171
+ gardenCategory: string
172
+ selectionSlug: string
173
+ /** If this task is grouped by family */
174
+ familyGroup?: TaskFamilyGroupI
175
+ }
176
+
177
+ export interface UpcomingTaskAdviceI {
178
+ content: string
179
+ taskName: string
180
+ plantName: string
181
+ plantSlug: string
182
+ plantImageURL?: string | null
183
+ gardenName: string
184
+ gardenCategory: string
185
+ selectionSlug: string
186
+ task: TaskI
187
+ /** If this task is grouped by family */
188
+ familyGroup?: TaskFamilyGroupI
189
+ }
190
+
191
+ export interface UpcomingTasksSectionI {
192
+ componentType: 'UpcomingTasks'
193
+ title: string
194
+ subtitle?: string
195
+ advices: UpcomingTaskAdviceI[]
196
+ }
197
+
198
+ /** Preview plant for WhenToSeedWhat section */
199
+ export interface WhenToSeedWhatPlantPreviewI {
200
+ id: number
201
+ name: string
202
+ family?: string | null
203
+ slug: string
204
+ imageURL?: string | null
205
+ }
206
+
207
+ /** A generic link card section with title, subtitle, URL, and optional preview images */
208
+ export interface LinkCardSectionI {
209
+ componentType: 'LinkCard'
210
+ title: string
211
+ subtitle?: string
212
+ url: string
213
+ previewPlants?: WhenToSeedWhatPlantPreviewI[]
214
+ backgroundColor?: string
215
+ /** Show a red badge indicator (replaces the plant preview stack when true) */
216
+ showBadge?: boolean
217
+ /** Optional badge count to display */
218
+ badgeCount?: number
219
+ }
220
+
221
+ export type SectionI =
222
+ | HeaderSectionI
223
+ | HeroCardsSectionI
224
+ | PlantCarouselSectionI
225
+ | HeroCardsCarouselSectionI
226
+ | WideCardsCarouselSectionI
227
+ | WeatherSectionI
228
+ | AdviceSectionI
229
+ | OnboardingCardSectionI
230
+ | UpcomingTasksSectionI
231
+ | LinkCardSectionI
232
+
233
+ export interface Response {
234
+ sections: SectionI[]
235
+ weather?: WeatherSectionI
236
+ advice?: AdviceSectionI
237
+ }
238
+
239
+ export interface HeroCardItemI {
240
+ id?: string | null
241
+ mode: HeroCardMode
242
+ title?: string | null
243
+ description?: string | null
244
+ backgroundColor?: string | null
245
+ backgroundImageUrl?: string | null
246
+ previewPlants?: PlantI[]
247
+ ctaLabel?: string | null
248
+ selection?: SelectionI | null
249
+ plant?: PlantI | null
250
+ ctaRoute?: string | null
251
+ }
252
+ }
package/src/member.d.ts CHANGED
@@ -1,72 +1,72 @@
1
- import type { NoteI } from './note'
2
- import type { SelectionI } from './selection'
3
-
4
- export interface MemberI {
5
- id: number
6
- email: string
7
- firstName: string
8
- lastName: string
9
- /** Virtual field to get the user's full name */
10
- fullName?: string | null
11
- city?: string
12
- hardinessZoneName?: string
13
- createdAt: Date
14
- updatedAt: Date
15
- lastFreezingDate?: Date
16
- firstFreezingDate?: Date
17
- /**
18
- * Number of unread Crisp messages
19
- */
20
- unreadMessagesCount?: number
21
- notes?: NoteI[]
22
- selections?: SelectionI[]
23
- userActivities?: UserActivityI[]
24
- /**
25
- * hasAnActiveSubscription is a VIRTUAL FIELD used to check if the user has an active subscription
26
- */
27
- hasAnActiveSubscription?: boolean
28
- /**
29
- * Acts as a one-way not identifiable token.
30
- * Crisp uses this token to identify the user conversation
31
- */
32
- userToken: string
33
- /**
34
- * HMAC signature used by Crisp identity verification.
35
- * Signed on the backend from the user email.
36
- */
37
- crispUserEmailSignature?: string
38
- /**
39
- * neverAddedATask <=> Has the use ever open the task form?
40
- * Yes it is misleading, ticket is open to change it.
41
- * It was too intense to force the user to add a task.
42
- */
43
- neverAddedATask?: boolean
44
- neverAddedAPlant?: boolean
45
- neverAddedANote?: boolean
46
- neverTriedSpacingSection?: boolean
47
- neverTriedAiAgent?: boolean
48
- neverDeletedAPlant?: boolean
49
- neverDeletedATask?: boolean
50
- neverEditedATask?: boolean
51
- finishedOnboarding: boolean
52
- hasDownloadedNativeApp?: boolean
53
- unitSystem: 'imperial' | 'metric'
54
- gardenZoneTimelessPreference?: boolean
55
- subscriptionEndDate?: Date
56
- /**
57
- * Last fertilizer ID chosen by the user.
58
- * Used as the default fertilizer for new garden zones.
59
- */
60
- lastFertilizerIdChosen?: number
61
- /**
62
- * Virtual field to get the app badge count
63
- * ----------------------------------------
64
- * For now, it's just the number of unread messages.
65
- */
66
- badgeCount?: number
67
- /**
68
- * Number of unread alerts, cached version of unread alerts (the table) count
69
- */
70
- unreadAlertsCount?: number
71
- isAdmin: boolean
72
- }
1
+ import type { NoteI } from './note'
2
+ import type { SelectionI } from './selection'
3
+
4
+ export interface MemberI {
5
+ id: number
6
+ email: string
7
+ firstName: string
8
+ lastName: string
9
+ /** Virtual field to get the user's full name */
10
+ fullName?: string | null
11
+ city?: string
12
+ hardinessZoneName?: string
13
+ createdAt: Date
14
+ updatedAt: Date
15
+ lastFreezingDate?: Date
16
+ firstFreezingDate?: Date
17
+ /**
18
+ * Number of unread Crisp messages
19
+ */
20
+ unreadMessagesCount?: number
21
+ notes?: NoteI[]
22
+ selections?: SelectionI[]
23
+ userActivities?: UserActivityI[]
24
+ /**
25
+ * hasAnActiveSubscription is a VIRTUAL FIELD used to check if the user has an active subscription
26
+ */
27
+ hasAnActiveSubscription?: boolean
28
+ /**
29
+ * Acts as a one-way not identifiable token.
30
+ * Crisp uses this token to identify the user conversation
31
+ */
32
+ userToken: string
33
+ /**
34
+ * HMAC signature used by Crisp identity verification.
35
+ * Signed on the backend from the user email.
36
+ */
37
+ crispUserEmailSignature?: string
38
+ /**
39
+ * neverAddedATask <=> Has the use ever open the task form?
40
+ * Yes it is misleading, ticket is open to change it.
41
+ * It was too intense to force the user to add a task.
42
+ */
43
+ neverAddedATask?: boolean
44
+ neverAddedAPlant?: boolean
45
+ neverAddedANote?: boolean
46
+ neverTriedSpacingSection?: boolean
47
+ neverTriedAiAgent?: boolean
48
+ neverDeletedAPlant?: boolean
49
+ neverDeletedATask?: boolean
50
+ neverEditedATask?: boolean
51
+ finishedOnboarding: boolean
52
+ hasDownloadedNativeApp?: boolean
53
+ unitSystem: 'imperial' | 'metric'
54
+ gardenZoneTimelessPreference?: boolean
55
+ subscriptionEndDate?: Date
56
+ /**
57
+ * Last fertilizer ID chosen by the user.
58
+ * Used as the default fertilizer for new garden zones.
59
+ */
60
+ lastFertilizerIdChosen?: number
61
+ /**
62
+ * Virtual field to get the app badge count
63
+ * ----------------------------------------
64
+ * For now, it's just the number of unread messages.
65
+ */
66
+ badgeCount?: number
67
+ /**
68
+ * Number of unread alerts, cached version of unread alerts (the table) count
69
+ */
70
+ unreadAlertsCount?: number
71
+ isAdmin: boolean
72
+ }
@@ -33,4 +33,20 @@ export namespace PAGES {
33
33
  export interface MonthsPreviewResponse {
34
34
  months: MonthPreviewI[]
35
35
  }
36
+
37
+ export interface HelpVideoI {
38
+ id: string
39
+ youtubeVideoId: string
40
+ youtubeUrl: string
41
+ thumbnailUrl: string
42
+ title: string
43
+ subtitle: string
44
+ mp4Url: string | null
45
+ }
46
+
47
+ export interface HelpResponse {
48
+ title: string
49
+ subtitle?: string | null
50
+ videos: HelpVideoI[]
51
+ }
36
52
  }
package/src/plant.d.ts CHANGED
@@ -37,6 +37,7 @@ export interface PlantI {
37
37
  weeksInTransplant: number
38
38
  weeksDuringWhichYouCanSeedOutdoor: number
39
39
  weeksToMaturity: number
40
+ daysToMaturity: number | null
40
41
  weeksToWaitAfterFreezingDate: number
41
42
  weeksToHarvest: number
42
43
  indoorSeeding: boolean
@@ -87,15 +88,6 @@ export interface PlantI {
87
88
  contextualSearchText?: string
88
89
  }
89
90
 
90
- interface PlantTagI {
91
- name: string
92
- /**
93
- * JSONB field containing plant-specific attributes for filtering
94
- * Ex: { growth: { type: 'déterminée' }, fruit: { color: 'rouge' } }
95
- */
96
- attributes?: PlantAttributesI
97
- }
98
-
99
91
  interface PlantInventoryI {
100
92
  id: number
101
93
  plantId: number
@@ -92,8 +92,8 @@ export namespace USERS {
92
92
  headers: RequestHeaders
93
93
  body: {
94
94
  city?: string
95
- lastFreezingDate?: string
96
- firstFreezingDate?: string
95
+ lastFreezingDate?: string | Date
96
+ firstFreezingDate?: string | Date
97
97
  moveDatesRequested?: boolean
98
98
  lastFertilizerIdChosen?: number
99
99
  lastOrganicMatterPercentage?: number