@instockng/storefront-ui 1.0.107 → 1.0.108

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 (250) hide show
  1. package/dist/components/AssistantDrawer.d.ts +1 -3
  2. package/dist/components/AssistantDrawer.d.ts.map +1 -1
  3. package/dist/contexts/AssistantContext.d.ts +19 -0
  4. package/dist/contexts/AssistantContext.d.ts.map +1 -0
  5. package/dist/index.d.ts +1 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.mjs +56 -56
  8. package/dist/index10.mjs +103 -73
  9. package/dist/index100.mjs +52 -7
  10. package/dist/index101.mjs +5 -74
  11. package/dist/index102.mjs +4 -3
  12. package/dist/index103.mjs +179 -2
  13. package/dist/index104.mjs +49 -79
  14. package/dist/index105.mjs +68 -53
  15. package/dist/index106.mjs +2 -6
  16. package/dist/index107.mjs +5 -4
  17. package/dist/index108.mjs +1123 -168
  18. package/dist/index109.mjs +20 -53
  19. package/dist/index11.mjs +73 -189
  20. package/dist/index110.mjs +55 -69
  21. package/dist/index111.mjs +33 -2
  22. package/dist/index112.mjs +2 -37
  23. package/dist/index113.mjs +2 -43
  24. package/dist/index115.mjs +1 -1
  25. package/dist/index116.mjs +1 -1
  26. package/dist/index117.mjs +8 -8
  27. package/dist/index118.mjs +6 -6
  28. package/dist/index119.mjs +3 -3
  29. package/dist/index12.mjs +171 -106
  30. package/dist/index120.mjs +1 -1
  31. package/dist/index121.mjs +1 -1
  32. package/dist/index122.mjs +1 -1
  33. package/dist/index123.mjs +2 -2
  34. package/dist/index124.mjs +2 -2
  35. package/dist/index125.mjs +3 -3
  36. package/dist/index126.mjs +1 -1
  37. package/dist/index127.mjs +3 -3
  38. package/dist/index128.mjs +2 -2
  39. package/dist/index129.mjs +2 -2
  40. package/dist/index13.mjs +127 -98
  41. package/dist/index130.mjs +1 -1
  42. package/dist/index131.mjs +3 -3
  43. package/dist/index132.mjs +1 -1
  44. package/dist/index133.mjs +1 -1
  45. package/dist/index134.mjs +3 -3
  46. package/dist/index135.mjs +2 -2
  47. package/dist/index136.mjs +4 -4
  48. package/dist/index137.mjs +1 -1
  49. package/dist/index138.mjs +3 -3
  50. package/dist/index139.mjs +4 -4
  51. package/dist/index14.mjs +94 -90
  52. package/dist/index140.mjs +1 -1
  53. package/dist/index141.mjs +1 -1
  54. package/dist/index142.mjs +1 -1
  55. package/dist/index143.mjs +1 -1
  56. package/dist/index144.mjs +1 -1
  57. package/dist/index145.mjs +1 -1
  58. package/dist/index146.mjs +1 -1
  59. package/dist/index147.mjs +2 -2
  60. package/dist/index148.mjs +3 -3
  61. package/dist/index15.mjs +84 -149
  62. package/dist/index151.mjs +1 -1
  63. package/dist/index153.mjs +2 -2
  64. package/dist/index154.mjs +1 -1
  65. package/dist/index155.mjs +6 -6
  66. package/dist/index156.mjs +2 -2
  67. package/dist/index157.mjs +2 -2
  68. package/dist/index159.mjs +2 -2
  69. package/dist/index16.mjs +157 -203
  70. package/dist/index160.mjs +2 -2
  71. package/dist/index161.mjs +1 -1
  72. package/dist/index163.mjs +8 -8
  73. package/dist/index164.mjs +8 -8
  74. package/dist/index165.mjs +2 -2
  75. package/dist/index167.mjs +2 -2
  76. package/dist/index168.mjs +2 -18
  77. package/dist/index169.mjs +11 -25
  78. package/dist/index17.mjs +197 -106
  79. package/dist/index170.mjs +26 -32
  80. package/dist/index171.mjs +32 -12
  81. package/dist/index172.mjs +9 -9
  82. package/dist/index173.mjs +18 -2
  83. package/dist/index174.mjs +2 -20
  84. package/dist/index175.mjs +13 -39
  85. package/dist/index176.mjs +46 -2
  86. package/dist/index177.mjs +2 -30
  87. package/dist/index178.mjs +24 -12
  88. package/dist/index179.mjs +18 -2
  89. package/dist/index18.mjs +96 -129
  90. package/dist/index180.mjs +2 -2
  91. package/dist/index181.mjs +2 -2
  92. package/dist/index182.mjs +2 -2
  93. package/dist/index183.mjs +2 -72
  94. package/dist/index184.mjs +72 -2
  95. package/dist/index185.mjs +2 -53
  96. package/dist/index186.mjs +53 -2
  97. package/dist/index187.mjs +2 -36
  98. package/dist/index188.mjs +30 -146
  99. package/dist/index189.mjs +152 -2
  100. package/dist/index19.mjs +140 -87
  101. package/dist/index190.mjs +2 -2
  102. package/dist/index191.mjs +2 -19
  103. package/dist/index192.mjs +19 -2
  104. package/dist/index193.mjs +2 -2
  105. package/dist/index194.mjs +2 -26
  106. package/dist/index195.mjs +26 -2
  107. package/dist/index196.mjs +2 -2
  108. package/dist/index197.mjs +2 -24
  109. package/dist/index198.mjs +17 -16
  110. package/dist/index199.mjs +23 -2
  111. package/dist/index2.mjs +29 -15
  112. package/dist/index20.mjs +82 -708
  113. package/dist/index201.mjs +2 -2
  114. package/dist/index202.mjs +2 -23
  115. package/dist/index203.mjs +23 -2
  116. package/dist/index204.mjs +2 -23
  117. package/dist/index205.mjs +23 -2
  118. package/dist/index206.mjs +2 -2
  119. package/dist/index208.mjs +2 -23
  120. package/dist/index209.mjs +23 -2
  121. package/dist/index21.mjs +688 -229
  122. package/dist/index210.mjs +2 -23
  123. package/dist/index211.mjs +23 -2
  124. package/dist/index212.mjs +2 -2
  125. package/dist/index213.mjs +2 -2
  126. package/dist/index215.mjs +2 -2
  127. package/dist/index216.mjs +2 -2
  128. package/dist/index217.mjs +2 -2
  129. package/dist/index218.mjs +2 -2
  130. package/dist/index219.mjs +2 -127
  131. package/dist/index22.mjs +260 -42
  132. package/dist/index220.mjs +127 -2
  133. package/dist/index221.mjs +2 -74
  134. package/dist/index222.mjs +59 -59
  135. package/dist/index223.mjs +74 -2
  136. package/dist/index224.mjs +30 -12
  137. package/dist/index225.mjs +11 -7
  138. package/dist/index226.mjs +3 -11
  139. package/dist/index227.mjs +3 -4
  140. package/dist/index228.mjs +13 -33
  141. package/dist/index229.mjs +7 -31
  142. package/dist/index23.mjs +42 -21
  143. package/dist/index230.mjs +11 -27
  144. package/dist/index231.mjs +5 -61
  145. package/dist/index232.mjs +33 -31
  146. package/dist/index233.mjs +31 -11
  147. package/dist/index234.mjs +28 -4
  148. package/dist/index235.mjs +61 -4
  149. package/dist/index236.mjs +2 -2
  150. package/dist/index237.mjs +108 -2
  151. package/dist/index238.mjs +2 -2
  152. package/dist/index239.mjs +2 -2
  153. package/dist/index240.mjs +2 -2
  154. package/dist/index241.mjs +2 -2
  155. package/dist/index242.mjs +2 -2
  156. package/dist/index243.mjs +2 -2
  157. package/dist/index244.mjs +2 -108
  158. package/dist/index245.mjs +2 -2
  159. package/dist/index247.mjs +3 -3
  160. package/dist/index250.mjs +1 -1
  161. package/dist/index252.mjs +2 -2
  162. package/dist/index253.mjs +1 -1
  163. package/dist/index254.mjs +2 -2
  164. package/dist/index262.mjs +2 -2
  165. package/dist/index263.mjs +2 -4
  166. package/dist/index264.mjs +4 -2
  167. package/dist/index265.mjs +2 -2
  168. package/dist/index266.mjs +2 -2
  169. package/dist/index267.mjs +3 -2
  170. package/dist/index268.mjs +2 -2
  171. package/dist/index269.mjs +2 -18
  172. package/dist/index270.mjs +16 -46
  173. package/dist/index271.mjs +13 -2
  174. package/dist/index272.mjs +6 -2
  175. package/dist/index273.mjs +30 -2
  176. package/dist/index275.mjs +2 -91
  177. package/dist/index276.mjs +18 -2
  178. package/dist/index277.mjs +47 -3
  179. package/dist/index278.mjs +2 -2
  180. package/dist/index279.mjs +2 -2
  181. package/dist/index280.mjs +2 -17
  182. package/dist/index281.mjs +2 -13
  183. package/dist/index282.mjs +91 -6
  184. package/dist/index283.mjs +2 -30
  185. package/dist/index3.mjs +3 -3
  186. package/dist/index4.mjs +34 -101
  187. package/dist/index43.mjs +1 -1
  188. package/dist/index44.mjs +1 -1
  189. package/dist/index45.mjs +1 -1
  190. package/dist/index46.mjs +1 -1
  191. package/dist/index47.mjs +1 -1
  192. package/dist/index48.mjs +2 -2
  193. package/dist/index5.mjs +92 -102
  194. package/dist/index50.mjs +2 -2
  195. package/dist/index54.mjs +3 -3
  196. package/dist/index58.mjs +1 -1
  197. package/dist/index6.mjs +111 -15
  198. package/dist/index63.mjs +17 -17
  199. package/dist/index64.mjs +2 -2
  200. package/dist/index65.mjs +1 -1
  201. package/dist/index66.mjs +1 -1
  202. package/dist/index67.mjs +1 -1
  203. package/dist/index68.mjs +1 -1
  204. package/dist/index69.mjs +1 -1
  205. package/dist/index7.mjs +15 -195
  206. package/dist/index70.mjs +1 -1
  207. package/dist/index71.mjs +1 -1
  208. package/dist/index72.mjs +1 -1
  209. package/dist/index73.mjs +1 -1
  210. package/dist/index74.mjs +1 -1
  211. package/dist/index75.mjs +1 -1
  212. package/dist/index76.mjs +1 -1
  213. package/dist/index77.mjs +1 -1
  214. package/dist/index78.mjs +1 -1
  215. package/dist/index79.mjs +4 -23
  216. package/dist/index8.mjs +135 -189
  217. package/dist/index80.mjs +24 -2
  218. package/dist/index81.mjs +2 -153
  219. package/dist/index82.mjs +149 -19
  220. package/dist/index83.mjs +21 -73
  221. package/dist/index84.mjs +74 -14
  222. package/dist/index85.mjs +14 -62
  223. package/dist/index86.mjs +62 -4
  224. package/dist/index87.mjs +37 -2
  225. package/dist/index88.mjs +42 -5
  226. package/dist/index89.mjs +230 -1129
  227. package/dist/index9.mjs +240 -99
  228. package/dist/index90.mjs +5 -19
  229. package/dist/index91.mjs +127 -48
  230. package/dist/index92.mjs +67 -32
  231. package/dist/index93.mjs +87 -2
  232. package/dist/index94.mjs +23 -229
  233. package/dist/index95.mjs +8 -5
  234. package/dist/index96.mjs +66 -125
  235. package/dist/index97.mjs +3 -67
  236. package/dist/index98.mjs +2 -87
  237. package/dist/index99.mjs +78 -24
  238. package/dist/providers/StorefrontProvider.d.ts +3 -1
  239. package/dist/providers/StorefrontProvider.d.ts.map +1 -1
  240. package/dist/styles.css +1 -1
  241. package/package.json +1 -1
  242. package/src/components/AssistantDrawer.stories.tsx +0 -50
  243. package/src/components/AssistantDrawer.tsx +4 -8
  244. package/src/contexts/AssistantContext.tsx +62 -0
  245. package/src/index.ts +3 -2
  246. package/src/providers/StorefrontProvider.tsx +17 -2
  247. package/dist/components/SearchAssistantTrigger.d.ts +0 -12
  248. package/dist/components/SearchAssistantTrigger.d.ts.map +0 -1
  249. package/src/components/SearchAssistantTrigger.stories.tsx +0 -35
  250. package/src/components/SearchAssistantTrigger.tsx +0 -41
@@ -0,0 +1,62 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
4
+ import { AssistantDrawer } from '../components/AssistantDrawer';
5
+
6
+ type AssistantContextType = {
7
+ /** Open the assistant drawer with a question. Pass productSlug if on a product page. */
8
+ ask: (question: string, productSlug?: string) => void;
9
+ /** Close the assistant drawer */
10
+ close: () => void;
11
+ /** Whether the drawer is currently open */
12
+ isOpen: boolean;
13
+ };
14
+
15
+ const AssistantContext = createContext<AssistantContextType | null>(null);
16
+
17
+ export function useAssistant() {
18
+ const ctx = useContext(AssistantContext);
19
+ if (!ctx) throw new Error('useAssistant must be used within StorefrontProvider');
20
+ return ctx;
21
+ }
22
+
23
+ export interface AssistantProviderProps {
24
+ children: ReactNode;
25
+ apiUrl: string;
26
+ brandSlug: string;
27
+ assistantName?: string;
28
+ }
29
+
30
+ export function AssistantProvider({
31
+ children,
32
+ apiUrl,
33
+ brandSlug,
34
+ assistantName,
35
+ }: AssistantProviderProps) {
36
+ const [isOpen, setIsOpen] = useState(false);
37
+ const [question, setQuestion] = useState('');
38
+ const [productSlug, setProductSlug] = useState<string | undefined>();
39
+
40
+ const ask = useCallback((q: string, slug?: string) => {
41
+ setQuestion(q);
42
+ setProductSlug(slug);
43
+ setIsOpen(true);
44
+ }, []);
45
+
46
+ const close = useCallback(() => setIsOpen(false), []);
47
+
48
+ return (
49
+ <AssistantContext.Provider value={{ ask, close, isOpen }}>
50
+ {children}
51
+ <AssistantDrawer
52
+ isOpen={isOpen}
53
+ onClose={close}
54
+ apiUrl={apiUrl}
55
+ brandSlug={brandSlug}
56
+ productSlug={productSlug}
57
+ initialQuestion={question}
58
+ assistantName={assistantName}
59
+ />
60
+ </AssistantContext.Provider>
61
+ );
62
+ }
package/src/index.ts CHANGED
@@ -11,6 +11,9 @@ export type { StorefrontProviderProps } from './providers/StorefrontProvider';
11
11
  // Export cart context (use this instead of prop drilling)
12
12
  export { CartProvider, useCart } from './contexts/CartContext';
13
13
 
14
+ // Export AI assistant context
15
+ export { useAssistant } from './contexts/AssistantContext';
16
+
14
17
  // Export Meta Pixel tracking
15
18
  export { useMetaPixel, MetaPixelProvider } from './providers/MetaPixelProvider';
16
19
  export type { MetaPixelProviderProps, PurchaseItem } from './providers/MetaPixelProvider';
@@ -71,8 +74,6 @@ export type { AssistantDrawerProps } from './components/AssistantDrawer';
71
74
  export { ProductAssistantChips } from './components/ProductAssistantChips';
72
75
  export type { ProductAssistantChipsProps } from './components/ProductAssistantChips';
73
76
 
74
- export { SearchAssistantTrigger } from './components/SearchAssistantTrigger';
75
- export type { SearchAssistantTriggerProps } from './components/SearchAssistantTrigger';
76
77
 
77
78
  // Export UI primitives (for customization)
78
79
  export { Button } from './components/ui/button';
@@ -28,6 +28,7 @@
28
28
  import { ReactNode } from 'react';
29
29
  import { ApiClientProvider, useGetBrand } from '@instockng/api-client';
30
30
  import { CartProvider, CartProviderProps } from '../contexts/CartContext';
31
+ import { AssistantProvider } from '../contexts/AssistantContext';
31
32
  import { MetaPixelProvider } from './MetaPixelProvider';
32
33
  import { TikTokPixelProvider } from './TikTokPixelProvider';
33
34
 
@@ -41,6 +42,8 @@ export interface StorefrontProviderProps {
41
42
  initialCartId?: string;
42
43
  /** Optional: Props to pass to the ShoppingCart component */
43
44
  shoppingCartProps?: CartProviderProps['shoppingCartProps'];
45
+ /** Optional: AI assistant display name */
46
+ assistantName?: string;
44
47
  }
45
48
 
46
49
  /**
@@ -51,7 +54,9 @@ function StorefrontProviderInner({
51
54
  brandSlug,
52
55
  initialCartId,
53
56
  shoppingCartProps,
54
- }: Omit<StorefrontProviderProps, 'apiUrl'>) {
57
+ assistantName,
58
+ apiUrl,
59
+ }: Omit<StorefrontProviderProps, 'apiUrl'> & { apiUrl: string }) {
55
60
  const { data: brand } = useGetBrand(brandSlug);
56
61
 
57
62
  return (
@@ -62,7 +67,13 @@ function StorefrontProviderInner({
62
67
  initialCartId={initialCartId}
63
68
  shoppingCartProps={shoppingCartProps}
64
69
  >
65
- {children}
70
+ <AssistantProvider
71
+ apiUrl={apiUrl}
72
+ brandSlug={brandSlug}
73
+ assistantName={assistantName}
74
+ >
75
+ {children}
76
+ </AssistantProvider>
66
77
  </CartProvider>
67
78
  </TikTokPixelProvider>
68
79
  </MetaPixelProvider>
@@ -83,9 +94,11 @@ export function StorefrontProvider({
83
94
  apiUrl,
84
95
  initialCartId,
85
96
  shoppingCartProps,
97
+ assistantName,
86
98
  }: StorefrontProviderProps) {
87
99
  // Storefront-ui doesn't use authenticated endpoints, so provide a no-op getAuthToken
88
100
  const getAuthToken = async () => '';
101
+ const resolvedApiUrl = apiUrl || 'https://oms-api.instock.ng';
89
102
 
90
103
  return (
91
104
  <ApiClientProvider getAuthToken={getAuthToken} {...(apiUrl && { baseURL: apiUrl })}>
@@ -93,6 +106,8 @@ export function StorefrontProvider({
93
106
  brandSlug={brandSlug}
94
107
  initialCartId={initialCartId}
95
108
  shoppingCartProps={shoppingCartProps}
109
+ assistantName={assistantName}
110
+ apiUrl={resolvedApiUrl}
96
111
  >
97
112
  {children}
98
113
  </StorefrontProviderInner>
@@ -1,12 +0,0 @@
1
- export interface SearchAssistantTriggerProps {
2
- /** The search query to pre-fill */
3
- searchQuery?: string;
4
- /** Callback to open the drawer with a question */
5
- onAsk: (question: string) => void;
6
- /** Custom class name */
7
- className?: string;
8
- /** Custom label */
9
- label?: string;
10
- }
11
- export declare function SearchAssistantTrigger({ searchQuery, onAsk, className, label, }: SearchAssistantTriggerProps): import("react/jsx-runtime").JSX.Element;
12
- //# sourceMappingURL=SearchAssistantTrigger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchAssistantTrigger.d.ts","sourceRoot":"","sources":["../../src/components/SearchAssistantTrigger.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,2BAA2B;IAC1C,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAgB,EAChB,KAAK,EACL,SAAS,EACT,KAAgB,GACjB,EAAE,2BAA2B,2CAW7B"}
@@ -1,35 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { SearchAssistantTrigger } from './SearchAssistantTrigger';
3
-
4
- const meta = {
5
- title: 'Components/SearchAssistantTrigger',
6
- component: SearchAssistantTrigger,
7
- parameters: {
8
- layout: 'centered',
9
- },
10
- tags: ['autodocs'],
11
- } satisfies Meta<typeof SearchAssistantTrigger>;
12
-
13
- export default meta;
14
- type Story = StoryObj<typeof meta>;
15
-
16
- export const Default: Story = {
17
- args: {
18
- searchQuery: 'toys for babies',
19
- onAsk: (question) => console.log('Asked:', question),
20
- },
21
- };
22
-
23
- export const CustomLabel: Story = {
24
- args: {
25
- searchQuery: 'maternity leggings',
26
- onAsk: (question) => console.log('Asked:', question),
27
- label: 'Ask AI about "maternity leggings"',
28
- },
29
- };
30
-
31
- export const EmptyQuery: Story = {
32
- args: {
33
- onAsk: (question) => console.log('Asked:', question),
34
- },
35
- };
@@ -1,41 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * SearchAssistantTrigger Component
5
- *
6
- * "Ask AI" button shown in search results (e.g., when search returns no results).
7
- * Clicking opens the AssistantDrawer with the search query as the question.
8
- */
9
-
10
- import { Sparkles } from 'lucide-react';
11
- import { Button } from './ui/button';
12
- import { cn } from '../lib/utils';
13
-
14
- export interface SearchAssistantTriggerProps {
15
- /** The search query to pre-fill */
16
- searchQuery?: string;
17
- /** Callback to open the drawer with a question */
18
- onAsk: (question: string) => void;
19
- /** Custom class name */
20
- className?: string;
21
- /** Custom label */
22
- label?: string;
23
- }
24
-
25
- export function SearchAssistantTrigger({
26
- searchQuery = '',
27
- onAsk,
28
- className,
29
- label = 'Ask AI',
30
- }: SearchAssistantTriggerProps) {
31
- return (
32
- <Button
33
- variant="outline"
34
- onClick={() => onAsk(searchQuery)}
35
- className={cn('gap-2', className)}
36
- >
37
- <Sparkles className="h-4 w-4 text-orange-500" />
38
- {label}
39
- </Button>
40
- );
41
- }