tee3apps-cms-sdk-react 0.0.6 → 0.0.7

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": "tee3apps-cms-sdk-react",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Uses JSON to dynamically generate and render UI pages in a website",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/Page.tsx CHANGED
@@ -17,6 +17,7 @@ import GroupCategoryComponent, { GroupCategoryComponentProps } from './PageCompo
17
17
  import GroupImageList, { GroupImageListProps } from './PageComponents/Visual-Components/GroupImageList';
18
18
  import TabComponent, { TabComponentProps } from './PageComponents/Visual-Components/TabComponent';
19
19
  import ErrorBoundary from './ErrorBoundary';
20
+ import RichTextComponent, { RichTextComponentProps } from './PageComponents/Visual-Components/RichTextComponent';
20
21
  const Page = ({data}:any) => {
21
22
  const [deviceMode, setDeviceMode] = useState<string>('web');
22
23
  const [screenSize, setScreenSize] = useState({
@@ -64,7 +65,7 @@ const Page = ({data}:any) => {
64
65
  deviceMode={deviceMode}
65
66
  autoAdjustForImages={true}
66
67
  >
67
- {box.components.map((component: { name: string | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined; props: TextProps | LinkProps | ImageComponentProps | GroupProductComponentProps | VideoComponentProps | GroupBrandComponentProps | LottieComponentProps | CarouselProps | NavigationProps | GroupVideoListProps | GroupCategoryComponentProps | GroupImageListProps | TabComponentProps; }, compIndex: React.Key | null | undefined) => {
68
+ {box.components.map((component: { name: string | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined; props: TextProps | LinkProps | ImageComponentProps | GroupProductComponentProps | VideoComponentProps | GroupBrandComponentProps | LottieComponentProps | CarouselProps | NavigationProps | GroupVideoListProps | GroupCategoryComponentProps | GroupImageListProps | TabComponentProps | RichTextComponentProps; }, compIndex: React.Key | null | undefined) => {
68
69
  const getCurrentBoxHeight = () => {
69
70
  const validModes = ['web', 'mobileweb', 'mobileapp', 'tablet'] as const;
70
71
  const safeDeviceMode = validModes.includes(deviceMode as any)
@@ -102,7 +103,9 @@ const Page = ({data}:any) => {
102
103
  return <GroupImageList key={compIndex} props={component.props as GroupImageListProps} deviceMode={deviceMode} />;
103
104
  case 'TabComponent':
104
105
  return <TabComponent key={compIndex} props={component.props as TabComponentProps} deviceMode={deviceMode} />;
105
- default:
106
+ case 'RichTextComponent':
107
+ return <RichTextComponent key={compIndex} props={component.props as RichTextComponentProps} />;
108
+ default:
106
109
  return null;
107
110
  }
108
111
  } catch (err) {
@@ -127,6 +127,175 @@ const GroupProductComponent: React.FC<GroupProductComponentMainProps> = ({
127
127
  };
128
128
 
129
129
  const products = getProducts();
130
+
131
+ // Helper function to render product based on style
132
+ const renderProduct = (product: Product, key: string) => {
133
+ if (currentstyle === 'STYLE1') {
134
+ return (
135
+ <div key={key}>
136
+ <ProductListViewOne props={product} />
137
+ </div>
138
+ );
139
+ } else if (currentstyle === 'STYLE2') {
140
+ return (
141
+ <div key={key}>
142
+ <ProductListViewTwo props={product} />
143
+ </div>
144
+ );
145
+ } else {
146
+ // Default style (NONE) - inline JSX
147
+ return (
148
+ <a href={`/${product.code}`} target={'_blank'} rel="noopener noreferrer" style={{textDecoration:"none"}} key={key}>
149
+ <div
150
+ className="productImageSlide"
151
+ style={{
152
+ height: 'auto',
153
+ minWidth: deviceMode === 'mobileapp' || deviceMode === 'mobileweb' ? '120px' : '150px',
154
+ borderRadius: '8px',
155
+ overflow: 'hidden',
156
+ border: '1px solid #eee',
157
+ backgroundColor: '#fff',
158
+ display: 'flex',
159
+ flexDirection: 'column',
160
+ alignItems: 'center',
161
+ justifyContent: 'center',
162
+ padding: '12px',
163
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
164
+ transition: 'transform 0.2s ease',
165
+ cursor: 'pointer',
166
+ }}
167
+ onMouseOver={(e) => {
168
+ e.currentTarget.style.transform = 'translateY(-2px)';
169
+ e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
170
+ }}
171
+ onMouseOut={(e) => {
172
+ e.currentTarget.style.transform = 'translateY(0)';
173
+ e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
174
+ }}
175
+ >
176
+ <div
177
+ style={{
178
+ height: '120px',
179
+ width: '100%',
180
+ display: 'flex',
181
+ alignItems: 'center',
182
+ justifyContent: 'center',
183
+ marginBottom: '8px',
184
+ }}
185
+ >
186
+ <img
187
+ src={`${Linodeurl}${product.image?.url}`}
188
+ alt={typeof product.name === 'object' ? product.name.all : product.name}
189
+ style={{ width: '100%', height: '100%', objectFit: 'contain' }}
190
+ />
191
+ </div>
192
+
193
+ {showProductName && (
194
+ <div
195
+ style={{
196
+ marginTop: '8px',
197
+ textAlign: 'center',
198
+ fontSize: '14px',
199
+ fontWeight: '500',
200
+ color: '#333',
201
+ lineHeight: '1.4',
202
+ height: '40px',
203
+ overflow: 'hidden',
204
+ display: '-webkit-box',
205
+ WebkitLineClamp: 2,
206
+ WebkitBoxOrient: 'vertical',
207
+ }}
208
+ >
209
+ {typeof product.name === 'object' ? product.name.all : product.name}
210
+ <h1 style={{ fontSize: '16px', fontWeight: '700', color: '#333' }}>
211
+ {product?.price?.SP?.$numberDecimal}
212
+ </h1>
213
+ </div>
214
+ )}
215
+ </div>
216
+ </a>
217
+ );
218
+ }
219
+ };
220
+
221
+ // Helper function to render product card (for grid layouts)
222
+ const renderProductCard = (product: Product, key: string, imageHeight: string = '120px', fontSize: string = '14px', nameHeight: string = '40px', fontWeight: string = '500') => {
223
+ if (currentstyle === 'STYLE1') {
224
+ return (
225
+ <div key={key}>
226
+ <ProductListViewOne props={product} />
227
+ </div>
228
+ );
229
+ } else if (currentstyle === 'STYLE2') {
230
+ return (
231
+ <div key={key}>
232
+ <ProductListViewTwo props={product} />
233
+ </div>
234
+ );
235
+ } else {
236
+ // Default style (NONE) - inline JSX
237
+ return (
238
+ <div
239
+ key={key}
240
+ className="productImageSlide"
241
+ style={{
242
+ height: 'auto',
243
+ borderRadius: '8px',
244
+ overflow: 'hidden',
245
+ border: '1px solid #eee',
246
+ backgroundColor: '#fff',
247
+ display: 'flex',
248
+ flexDirection: 'column',
249
+ alignItems: 'center',
250
+ justifyContent: 'center',
251
+ padding: '12px',
252
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
253
+ transition: 'transform 0.2s ease',
254
+ cursor: 'pointer'
255
+ }}
256
+ onMouseOver={(e) => {
257
+ e.currentTarget.style.transform = 'translateY(-2px)';
258
+ e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
259
+ }}
260
+ onMouseOut={(e) => {
261
+ e.currentTarget.style.transform = 'translateY(0)';
262
+ e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
263
+ }}
264
+ >
265
+ <div style={{
266
+ height: imageHeight,
267
+ width: '100%',
268
+ display: 'flex',
269
+ alignItems: 'center',
270
+ justifyContent: 'center',
271
+ marginBottom: '8px'
272
+ }}>
273
+ <img
274
+ src={`${Linodeurl}${product.image?.all?.url || product.image?.url}`}
275
+ alt=""
276
+ style={{ width: '100%', height: '100%', objectFit: 'contain' }}
277
+ />
278
+ </div>
279
+ {showProductName && <div style={{
280
+ textAlign: 'center',
281
+ fontSize: fontSize,
282
+ fontWeight: fontWeight,
283
+ color: '#333',
284
+ lineHeight: '1.4',
285
+ ...(nameHeight === 'auto' ? {} : {
286
+ height: nameHeight,
287
+ overflow: 'hidden',
288
+ display: '-webkit-box',
289
+ WebkitLineClamp: 2,
290
+ WebkitBoxOrient: 'vertical'
291
+ })
292
+ }}>
293
+ {typeof product.name === 'object' ? (product.name as { all: string }).all : product.name}
294
+ </div>}
295
+ </div>
296
+ );
297
+ }
298
+ };
130
299
 
131
300
  // Carousel navigation functions
132
301
  const scrollLeft = () => {
@@ -300,100 +469,9 @@ const GroupProductComponent: React.FC<GroupProductComponentMainProps> = ({
300
469
  >
301
470
  {products.length > 0 ? (
302
471
  currentLayout === 'NONE' ? (
303
- products.slice(0, props.type === 'static' ? 15 : products.length).map((product) => {
304
- if (currentstyle === 'STYLE1') {
305
- return (
306
- <div key={product._id}>
307
- <ProductListViewOne props={product} />
308
- </div>
309
- );
310
- } else if (currentstyle === 'STYLE2') {
311
- return (
312
- <div key={product._id}>
313
- <ProductListViewTwo props={product} />
314
- </div>
315
- );
316
- } else {
317
- // Default style (NONE)
318
- return (
319
- <a href={`/${product.code}`} target={'_blank'} rel="noopener noreferrer" style={{textDecoration:"none"}}>
320
- <div
321
- key={product._id}
322
- className="productImageSlide"
323
- style={{
324
- height: 'auto',
325
- minWidth: deviceMode === 'mobileapp' || deviceMode === 'mobileweb' ? '120px' : '150px',
326
-
327
- borderRadius: '8px',
328
- overflow: 'hidden',
329
- border: '1px solid #eee',
330
- backgroundColor: '#fff',
331
- display: 'flex',
332
- flexDirection: 'column',
333
- alignItems: 'center',
334
- justifyContent: 'center',
335
- padding: '12px',
336
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
337
- transition: 'transform 0.2s ease',
338
- cursor: 'pointer',
339
- }}
340
- onMouseOver={(e) => {
341
- e.currentTarget.style.transform = 'translateY(-2px)';
342
- e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
343
- }}
344
- onMouseOut={(e) => {
345
- e.currentTarget.style.transform = 'translateY(0)';
346
- e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
347
- }}
348
- >
349
- <div
350
- style={{
351
- height: '120px',
352
- width: '100%',
353
- display: 'flex',
354
- alignItems: 'center',
355
- justifyContent: 'center',
356
- marginBottom: '8px',
357
- }}
358
- >
359
- <img
360
- src={`${Linodeurl}${product.image?.url}`}
361
- alt={typeof product.name === 'object' ? product.name.all : product.name}
362
- style={{ width: '100%', height: '100%', objectFit: 'contain' }}
363
- />
364
- </div>
365
-
366
- {showProductName && (
367
- <div
368
- style={{
369
- marginTop: '8px',
370
- textAlign: 'center',
371
- fontSize: '14px',
372
- fontWeight: '500',
373
- color: '#333',
374
- lineHeight: '1.4',
375
- height: '40px',
376
- overflow: 'hidden',
377
- display: '-webkit-box',
378
- WebkitLineClamp: 2,
379
- WebkitBoxOrient: 'vertical',
380
- }}
381
- >
382
- {typeof product.name === 'object' ? product.name.all : product.name}
383
- <h1 style={{ fontSize: '16px', fontWeight: '700', color: '#333' }}>
384
- {product?.price?.SP?.$numberDecimal}
385
- </h1>
386
- {/* <h2 style={{ fontSize: '14px', fontWeight: '500', color: '#666' }}>
387
- MRP: {product?.price?.MRP?.$numberDecimal}
388
- </h2> */}
389
- </div>
390
- )}
391
- </div>
392
- </a>
393
-
394
- );
395
- }
396
- })
472
+ products.slice(0, props.type === 'static' ? 15 : products.length).map((product) =>
473
+ renderProduct(product, product._id)
474
+ )
397
475
  ) : currentLayout === 'SMALL' ? (
398
476
  <div style={{
399
477
  display: 'grid',
@@ -402,64 +480,9 @@ const GroupProductComponent: React.FC<GroupProductComponentMainProps> = ({
402
480
  padding: '8px'
403
481
  }}>
404
482
  {
405
- products.map((product) => (
406
- <div
407
- key={product._id}
408
- className="productImageSlide"
409
- style={{
410
- height: 'auto',
411
- borderRadius: '8px',
412
- overflow: 'hidden',
413
- border: '1px solid #eee',
414
- backgroundColor: '#fff',
415
- display: 'flex',
416
- flexDirection: 'column',
417
- alignItems: 'center',
418
- justifyContent: 'center',
419
- padding: '12px',
420
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
421
- transition: 'transform 0.2s ease',
422
- cursor: 'pointer'
423
- }}
424
- onMouseOver={(e) => {
425
- e.currentTarget.style.transform = 'translateY(-2px)';
426
- e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
427
- }}
428
- onMouseOut={(e) => {
429
- e.currentTarget.style.transform = 'translateY(0)';
430
- e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
431
- }}
432
- >
433
- <div style={{
434
- height: '100px',
435
- width: '100%',
436
- display: 'flex',
437
- alignItems: 'center',
438
- justifyContent: 'center',
439
- marginBottom: '8px'
440
- }}>
441
- <img
442
- src={`${Linodeurl}${product.image?.all?.url}`}
443
- alt=""
444
- style={{ width: '100%', height: '100%', objectFit: 'contain' }}
445
- />
446
- </div>
447
- {showProductName && <div style={{
448
- textAlign: 'center',
449
- fontSize: '12px',
450
- fontWeight: '500',
451
- color: '#333',
452
- lineHeight: '1.4',
453
- height: '32px',
454
- overflow: 'hidden',
455
- display: '-webkit-box',
456
- WebkitLineClamp: 2,
457
- WebkitBoxOrient: 'vertical'
458
- }}>
459
- {typeof product.name === 'object' ? (product.name as { all: string }).all : product.name}
460
- </div>}
461
- </div>
462
- ))}
483
+ products.map((product) =>
484
+ renderProductCard(product, product._id, '100px', '12px', '32px')
485
+ )}
463
486
  </div>
464
487
  ) : currentLayout === 'MEDIUM' ? (
465
488
  <div style={{
@@ -469,118 +492,14 @@ const GroupProductComponent: React.FC<GroupProductComponentMainProps> = ({
469
492
  padding: '8px'
470
493
  }}>
471
494
  {
472
- products.map((product) => (
473
- <div
474
- key={product._id}
475
- className="productImageSlide"
476
- style={{
477
- height: 'auto',
478
- borderRadius: '8px',
479
- overflow: 'hidden',
480
- border: '1px solid #eee',
481
- backgroundColor: '#fff',
482
- display: 'flex',
483
- flexDirection: 'column',
484
- alignItems: 'center',
485
- justifyContent: 'center',
486
- padding: '12px',
487
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
488
- transition: 'transform 0.2s ease',
489
- cursor: 'pointer'
490
- }}
491
- onMouseOver={(e) => {
492
- e.currentTarget.style.transform = 'translateY(-2px)';
493
- e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
494
- }}
495
- onMouseOut={(e) => {
496
- e.currentTarget.style.transform = 'translateY(0)';
497
- e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
498
- }}
499
- >
500
- <div style={{
501
- height: '120px',
502
- width: '100%',
503
- display: 'flex',
504
- alignItems: 'center',
505
- justifyContent: 'center',
506
- marginBottom: '8px'
507
- }}>
508
- <img
509
- src={`${Linodeurl}${product.image?.all?.url}`}
510
- alt=""
511
- style={{ width: '100%', height: '100%', objectFit: 'contain' }}
512
- />
513
- </div>
514
- {showProductName && <div style={{
515
- textAlign: 'center',
516
- fontSize: '14px',
517
- fontWeight: '500',
518
- color: '#333',
519
- lineHeight: '1.4',
520
- height: '40px',
521
- overflow: 'hidden',
522
- display: '-webkit-box',
523
- WebkitLineClamp: 2,
524
- WebkitBoxOrient: 'vertical'
525
- }}>
526
- {typeof product.name === 'object' ? (product.name as { all: string }).all : product.name}
527
- </div>}
528
- </div>
529
- ))}
495
+ products.map((product) =>
496
+ renderProductCard(product, product._id, '120px', '14px', '40px')
497
+ )}
530
498
  </div>
531
499
  ) : currentLayout === 'MEDIUM_THREE' ? (
532
500
  <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', padding: '8px' }}>
533
501
  {products.length > 0 && (
534
- <div
535
- className="productImageSlide"
536
- style={{
537
- height: 'auto',
538
- borderRadius: '8px',
539
- overflow: 'hidden',
540
- border: '1px solid #eee',
541
- backgroundColor: '#fff',
542
- display: 'flex',
543
- flexDirection: 'column',
544
- alignItems: 'center',
545
- justifyContent: 'center',
546
- padding: '16px',
547
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
548
- transition: 'transform 0.2s ease',
549
- cursor: 'pointer'
550
- }}
551
- onMouseOver={(e) => {
552
- e.currentTarget.style.transform = 'translateY(-2px)';
553
- e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
554
- }}
555
- onMouseOut={(e) => {
556
- e.currentTarget.style.transform = 'translateY(0)';
557
- e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
558
- }}
559
- >
560
- <div style={{
561
- height: '160px',
562
- width: '100%',
563
- display: 'flex',
564
- alignItems: 'center',
565
- justifyContent: 'center',
566
- marginBottom: '12px'
567
- }}>
568
- <img
569
- src={`${Linodeurl}${products[0].image?.all?.url}`}
570
- alt=""
571
- style={{ width: '100%', height: '100%', objectFit: 'contain' }}
572
- />
573
- </div>
574
- {showProductName && <div style={{
575
- textAlign: 'center',
576
- fontSize: '16px',
577
- fontWeight: '600',
578
- color: '#333',
579
- lineHeight: '1.4'
580
- }}>
581
- {typeof products[0].name === 'object' ? (products[0].name as { all: string }).all : products[0].name}
582
- </div>}
583
- </div>
502
+ renderProductCard(products[0], products[0]._id, '160px', '16px', 'auto', '600')
584
503
  )}
585
504
  {products.length > 1 && (
586
505
  <div style={{
@@ -588,64 +507,9 @@ const GroupProductComponent: React.FC<GroupProductComponentMainProps> = ({
588
507
  gridTemplateColumns: 'repeat(2,1fr)',
589
508
  gap: '16px'
590
509
  }}>
591
- {products.slice(1).map((product) => (
592
- <div
593
- key={product._id}
594
- className="productImageSlide"
595
- style={{
596
- height: 'auto',
597
- borderRadius: '8px',
598
- overflow: 'hidden',
599
- border: '1px solid #eee',
600
- backgroundColor: '#fff',
601
- display: 'flex',
602
- flexDirection: 'column',
603
- alignItems: 'center',
604
- justifyContent: 'center',
605
- padding: '12px',
606
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
607
- transition: 'transform 0.2s ease',
608
- cursor: 'pointer'
609
- }}
610
- onMouseOver={(e) => {
611
- e.currentTarget.style.transform = 'translateY(-2px)';
612
- e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';
613
- }}
614
- onMouseOut={(e) => {
615
- e.currentTarget.style.transform = 'translateY(0)';
616
- e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
617
- }}
618
- >
619
- <div style={{
620
- height: '100px',
621
- width: '100%',
622
- display: 'flex',
623
- alignItems: 'center',
624
- justifyContent: 'center',
625
- marginBottom: '8px'
626
- }}>
627
- <img
628
- src={`${Linodeurl}${product.image?.all?.url}`}
629
- alt=""
630
- style={{ width: '100%', height: '100%', objectFit: 'contain' }}
631
- />
632
- </div>
633
- {showProductName && <div style={{
634
- textAlign: 'center',
635
- fontSize: '12px',
636
- fontWeight: '500',
637
- color: '#333',
638
- lineHeight: '1.4',
639
- height: '32px',
640
- overflow: 'hidden',
641
- display: '-webkit-box',
642
- WebkitLineClamp: 2,
643
- WebkitBoxOrient: 'vertical'
644
- }}>
645
- {typeof product.name === 'object' ? (product.name as { all: string }).all : product.name}
646
- </div>}
647
- </div>
648
- ))}
510
+ {products.slice(1).map((product) =>
511
+ renderProductCard(product, product._id, '100px', '12px', '32px', '500')
512
+ )}
649
513
  </div>
650
514
  )}
651
515
  </div>
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+
3
+ export interface RichTextComponentProps {
4
+ content: {
5
+ all: string;
6
+ };
7
+ }
8
+
9
+ const RichTextComponent: React.FC<{ props: RichTextComponentProps }> = ({ props }) => {
10
+ const htmlContent = props?.content?.all || '';
11
+
12
+ return (
13
+ <div
14
+ style={{
15
+ width: '100%',
16
+ maxWidth: '100%',
17
+ wordWrap: 'break-word',
18
+ overflowWrap: 'break-word',
19
+ boxSizing: 'border-box',
20
+ padding: '20px',
21
+ }}
22
+ dangerouslySetInnerHTML={{ __html: htmlContent }}
23
+ />
24
+ );
25
+ };
26
+
27
+ export default RichTextComponent;
28
+