@inorain_development/hotel-smarters-chat-ui 1.0.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.
- package/README.md +110 -0
- package/lib/commonjs/features/chat/components/common/cart-icon.native.js +36 -0
- package/lib/commonjs/features/chat/components/common/cart-icon.native.js.map +1 -0
- package/lib/commonjs/features/chat/components/common/collapsible.js +20 -0
- package/lib/commonjs/features/chat/components/common/collapsible.js.map +1 -0
- package/lib/commonjs/features/chat/components/common/collapsible.native.js +38 -0
- package/lib/commonjs/features/chat/components/common/collapsible.native.js.map +1 -0
- package/lib/commonjs/features/chat/components/product/index.js +13 -0
- package/lib/commonjs/features/chat/components/product/index.js.map +1 -0
- package/lib/commonjs/features/chat/components/product/product.js +83 -0
- package/lib/commonjs/features/chat/components/product/product.js.map +1 -0
- package/lib/commonjs/features/chat/components/product/product.model.js +6 -0
- package/lib/commonjs/features/chat/components/product/product.model.js.map +1 -0
- package/lib/commonjs/features/chat/components/product/product.native.js +125 -0
- package/lib/commonjs/features/chat/components/product/product.native.js.map +1 -0
- package/lib/commonjs/features/chat/components/service/index.js +13 -0
- package/lib/commonjs/features/chat/components/service/index.js.map +1 -0
- package/lib/commonjs/features/chat/components/service/service.js +83 -0
- package/lib/commonjs/features/chat/components/service/service.js.map +1 -0
- package/lib/commonjs/features/chat/components/service/service.model.js +6 -0
- package/lib/commonjs/features/chat/components/service/service.model.js.map +1 -0
- package/lib/commonjs/features/chat/components/service/service.native.js +106 -0
- package/lib/commonjs/features/chat/components/service/service.native.js.map +1 -0
- package/lib/commonjs/features/chat/index.d.js +6 -0
- package/lib/commonjs/features/chat/index.d.js.map +1 -0
- package/lib/commonjs/features/chat/index.d.ts.map +1 -0
- package/lib/commonjs/features/chat/index.js +46 -0
- package/lib/commonjs/features/chat/index.js.map +1 -0
- package/lib/commonjs/features/chat/model/chat.model.js +23 -0
- package/lib/commonjs/features/chat/model/chat.model.js.map +1 -0
- package/lib/commonjs/features/chat/renderer/index.js +13 -0
- package/lib/commonjs/features/chat/renderer/index.js.map +1 -0
- package/lib/commonjs/features/chat/renderer/renderer.js +32 -0
- package/lib/commonjs/features/chat/renderer/renderer.js.map +1 -0
- package/lib/commonjs/features/chat/renderer/renderer.native.js +32 -0
- package/lib/commonjs/features/chat/renderer/renderer.native.js.map +1 -0
- package/lib/commonjs/index.d.js +17 -0
- package/lib/commonjs/index.d.js.map +1 -0
- package/lib/commonjs/index.d.ts.map +1 -0
- package/lib/commonjs/index.js +17 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/native.d.js +6 -0
- package/lib/commonjs/native.d.js.map +1 -0
- package/lib/commonjs/native.d.ts.map +1 -0
- package/lib/commonjs/native.js +46 -0
- package/lib/commonjs/native.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/styles/global.css +3 -0
- package/lib/commonjs/utils/i18n.utils.js +12 -0
- package/lib/commonjs/utils/i18n.utils.js.map +1 -0
- package/lib/commonjs/utils/theme.utils.js +37 -0
- package/lib/commonjs/utils/theme.utils.js.map +1 -0
- package/lib/commonjs/utils/use-expandable-list.js +23 -0
- package/lib/commonjs/utils/use-expandable-list.js.map +1 -0
- package/lib/commonjs/web.d.js +6 -0
- package/lib/commonjs/web.d.js.map +1 -0
- package/lib/commonjs/web.d.ts.map +1 -0
- package/lib/commonjs/web.js +46 -0
- package/lib/commonjs/web.js.map +1 -0
- package/lib/module/features/chat/components/common/cart-icon.native.js +32 -0
- package/lib/module/features/chat/components/common/cart-icon.native.js.map +1 -0
- package/lib/module/features/chat/components/common/collapsible.js +16 -0
- package/lib/module/features/chat/components/common/collapsible.js.map +1 -0
- package/lib/module/features/chat/components/common/collapsible.native.js +34 -0
- package/lib/module/features/chat/components/common/collapsible.native.js.map +1 -0
- package/lib/module/features/chat/components/product/index.js +4 -0
- package/lib/module/features/chat/components/product/index.js.map +1 -0
- package/lib/module/features/chat/components/product/product.js +79 -0
- package/lib/module/features/chat/components/product/product.js.map +1 -0
- package/lib/module/features/chat/components/product/product.model.js +4 -0
- package/lib/module/features/chat/components/product/product.model.js.map +1 -0
- package/lib/module/features/chat/components/product/product.native.js +121 -0
- package/lib/module/features/chat/components/product/product.native.js.map +1 -0
- package/lib/module/features/chat/components/service/index.js +4 -0
- package/lib/module/features/chat/components/service/index.js.map +1 -0
- package/lib/module/features/chat/components/service/service.js +79 -0
- package/lib/module/features/chat/components/service/service.js.map +1 -0
- package/lib/module/features/chat/components/service/service.model.js +4 -0
- package/lib/module/features/chat/components/service/service.model.js.map +1 -0
- package/lib/module/features/chat/components/service/service.native.js +102 -0
- package/lib/module/features/chat/components/service/service.native.js.map +1 -0
- package/lib/module/features/chat/index.d.js +10 -0
- package/lib/module/features/chat/index.d.js.map +1 -0
- package/lib/module/features/chat/index.d.ts.map +1 -0
- package/lib/module/features/chat/index.js +7 -0
- package/lib/module/features/chat/index.js.map +1 -0
- package/lib/module/features/chat/model/chat.model.js +19 -0
- package/lib/module/features/chat/model/chat.model.js.map +1 -0
- package/lib/module/features/chat/renderer/index.js +4 -0
- package/lib/module/features/chat/renderer/index.js.map +1 -0
- package/lib/module/features/chat/renderer/renderer.js +28 -0
- package/lib/module/features/chat/renderer/renderer.js.map +1 -0
- package/lib/module/features/chat/renderer/renderer.native.js +28 -0
- package/lib/module/features/chat/renderer/renderer.native.js.map +1 -0
- package/lib/module/index.d.js +13 -0
- package/lib/module/index.d.js.map +1 -0
- package/lib/module/index.d.ts.map +1 -0
- package/lib/module/index.js +13 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native.d.js +11 -0
- package/lib/module/native.d.js.map +1 -0
- package/lib/module/native.d.ts.map +1 -0
- package/lib/module/native.js +7 -0
- package/lib/module/native.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/styles/global.css +3 -0
- package/lib/module/utils/i18n.utils.js +8 -0
- package/lib/module/utils/i18n.utils.js.map +1 -0
- package/lib/module/utils/theme.utils.js +33 -0
- package/lib/module/utils/theme.utils.js.map +1 -0
- package/lib/module/utils/use-expandable-list.js +19 -0
- package/lib/module/utils/use-expandable-list.js.map +1 -0
- package/lib/module/web.d.js +10 -0
- package/lib/module/web.d.js.map +1 -0
- package/lib/module/web.d.ts.map +1 -0
- package/lib/module/web.js +7 -0
- package/lib/module/web.js.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/common/cart-icon.native.d.ts +6 -0
- package/lib/typescript/commonjs/features/chat/components/common/cart-icon.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/common/collapsible.d.ts +6 -0
- package/lib/typescript/commonjs/features/chat/components/common/collapsible.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/common/collapsible.native.d.ts +6 -0
- package/lib/typescript/commonjs/features/chat/components/common/collapsible.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/product/index.d.ts +3 -0
- package/lib/typescript/commonjs/features/chat/components/product/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.d.ts +4 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.model.d.ts +10 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.model.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.native.d.ts +4 -0
- package/lib/typescript/commonjs/features/chat/components/product/product.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/service/index.d.ts +3 -0
- package/lib/typescript/commonjs/features/chat/components/service/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.d.ts +4 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.model.d.ts +10 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.model.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.native.d.ts +4 -0
- package/lib/typescript/commonjs/features/chat/components/service/service.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/index.d.ts +8 -0
- package/lib/typescript/commonjs/features/chat/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/model/chat.model.d.ts +31 -0
- package/lib/typescript/commonjs/features/chat/model/chat.model.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/renderer/index.d.ts +2 -0
- package/lib/typescript/commonjs/features/chat/renderer/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/renderer/renderer.d.ts +5 -0
- package/lib/typescript/commonjs/features/chat/renderer/renderer.d.ts.map +1 -0
- package/lib/typescript/commonjs/features/chat/renderer/renderer.native.d.ts +5 -0
- package/lib/typescript/commonjs/features/chat/renderer/renderer.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +11 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/native.d.ts +8 -0
- package/lib/typescript/commonjs/native.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/utils/i18n.utils.d.ts +3 -0
- package/lib/typescript/commonjs/utils/i18n.utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/theme.utils.d.ts +16 -0
- package/lib/typescript/commonjs/utils/theme.utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/use-expandable-list.d.ts +8 -0
- package/lib/typescript/commonjs/utils/use-expandable-list.d.ts.map +1 -0
- package/lib/typescript/commonjs/web.d.ts +8 -0
- package/lib/typescript/commonjs/web.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/common/cart-icon.native.d.ts +6 -0
- package/lib/typescript/module/features/chat/components/common/cart-icon.native.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/common/collapsible.d.ts +6 -0
- package/lib/typescript/module/features/chat/components/common/collapsible.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/common/collapsible.native.d.ts +6 -0
- package/lib/typescript/module/features/chat/components/common/collapsible.native.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/product/index.d.ts +3 -0
- package/lib/typescript/module/features/chat/components/product/index.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/product/product.d.ts +4 -0
- package/lib/typescript/module/features/chat/components/product/product.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/product/product.model.d.ts +10 -0
- package/lib/typescript/module/features/chat/components/product/product.model.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/product/product.native.d.ts +4 -0
- package/lib/typescript/module/features/chat/components/product/product.native.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/service/index.d.ts +3 -0
- package/lib/typescript/module/features/chat/components/service/index.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/service/service.d.ts +4 -0
- package/lib/typescript/module/features/chat/components/service/service.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/service/service.model.d.ts +10 -0
- package/lib/typescript/module/features/chat/components/service/service.model.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/components/service/service.native.d.ts +4 -0
- package/lib/typescript/module/features/chat/components/service/service.native.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/index.d.ts +8 -0
- package/lib/typescript/module/features/chat/index.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/model/chat.model.d.ts +31 -0
- package/lib/typescript/module/features/chat/model/chat.model.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/renderer/index.d.ts +2 -0
- package/lib/typescript/module/features/chat/renderer/index.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/renderer/renderer.d.ts +5 -0
- package/lib/typescript/module/features/chat/renderer/renderer.d.ts.map +1 -0
- package/lib/typescript/module/features/chat/renderer/renderer.native.d.ts +5 -0
- package/lib/typescript/module/features/chat/renderer/renderer.native.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +11 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/native.d.ts +8 -0
- package/lib/typescript/module/native.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/utils/i18n.utils.d.ts +3 -0
- package/lib/typescript/module/utils/i18n.utils.d.ts.map +1 -0
- package/lib/typescript/module/utils/theme.utils.d.ts +16 -0
- package/lib/typescript/module/utils/theme.utils.d.ts.map +1 -0
- package/lib/typescript/module/utils/use-expandable-list.d.ts +8 -0
- package/lib/typescript/module/utils/use-expandable-list.d.ts.map +1 -0
- package/lib/typescript/module/web.d.ts +8 -0
- package/lib/typescript/module/web.d.ts.map +1 -0
- package/nativewind-env.d.ts +1 -0
- package/package.json +142 -0
- package/src/features/chat/components/common/cart-icon.native.tsx +20 -0
- package/src/features/chat/components/common/collapsible.native.tsx +28 -0
- package/src/features/chat/components/common/collapsible.tsx +13 -0
- package/src/features/chat/components/product/index.ts +2 -0
- package/src/features/chat/components/product/product.model.ts +10 -0
- package/src/features/chat/components/product/product.native.tsx +117 -0
- package/src/features/chat/components/product/product.tsx +80 -0
- package/src/features/chat/components/service/index.ts +2 -0
- package/src/features/chat/components/service/service.model.ts +10 -0
- package/src/features/chat/components/service/service.native.tsx +96 -0
- package/src/features/chat/components/service/service.tsx +80 -0
- package/src/features/chat/index.d.ts +8 -0
- package/src/features/chat/index.d.ts.map +1 -0
- package/src/features/chat/index.ts +13 -0
- package/src/features/chat/model/chat.model.ts +36 -0
- package/src/features/chat/renderer/index.ts +1 -0
- package/src/features/chat/renderer/renderer.native.tsx +22 -0
- package/src/features/chat/renderer/renderer.tsx +22 -0
- package/src/index.d.ts +11 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +10 -0
- package/src/native.d.ts +9 -0
- package/src/native.d.ts.map +1 -0
- package/src/native.ts +13 -0
- package/src/styles/global.css +3 -0
- package/src/utils/i18n.utils.ts +7 -0
- package/src/utils/theme.utils.ts +47 -0
- package/src/utils/use-expandable-list.ts +12 -0
- package/src/web.d.ts +8 -0
- package/src/web.d.ts.map +1 -0
- package/src/web.ts +13 -0
- package/tailwind.config.js +43 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Fragment } from 'react';
|
|
2
|
+
import { Image, Pressable, Text, View } from 'react-native';
|
|
3
|
+
import { getThemeClasses } from '../../../../utils/theme.utils';
|
|
4
|
+
import { resolveText } from '../../../../utils/i18n.utils';
|
|
5
|
+
import { useExpandableList } from '../../../../utils/use-expandable-list';
|
|
6
|
+
import { Collapsible } from '../common/collapsible.native';
|
|
7
|
+
import { Theme } from '../../model/chat.model';
|
|
8
|
+
import type { ChatComponentProps } from '../../model/chat.model';
|
|
9
|
+
import type { ServiceItem } from './service.model';
|
|
10
|
+
|
|
11
|
+
export function Service({
|
|
12
|
+
data,
|
|
13
|
+
theme = Theme.Dark,
|
|
14
|
+
language,
|
|
15
|
+
actionLabel = 'Request',
|
|
16
|
+
onAction,
|
|
17
|
+
onSelect,
|
|
18
|
+
}: ChatComponentProps<ServiceItem>) {
|
|
19
|
+
const c = getThemeClasses(theme);
|
|
20
|
+
const items = Array.isArray(data) ? data : [data];
|
|
21
|
+
const { head, rest, expanded, hasMore, toggle } = useExpandableList(items);
|
|
22
|
+
|
|
23
|
+
const renderRow = (item: ServiceItem) => {
|
|
24
|
+
const name = resolveText(item.name, language);
|
|
25
|
+
const description = resolveText(item.description, language);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<Pressable className="flex-row items-center gap-3" onPress={() => onSelect?.(item)}>
|
|
29
|
+
<Image
|
|
30
|
+
accessibilityLabel={name}
|
|
31
|
+
source={{ uri: item.image }}
|
|
32
|
+
className={`h-14 w-14 rounded-lg down-sm:h-12 down-sm:w-12 ${c.iconBg}`}
|
|
33
|
+
/>
|
|
34
|
+
|
|
35
|
+
<View className="flex-1 gap-1">
|
|
36
|
+
<View className="flex-row items-center justify-between gap-2">
|
|
37
|
+
<Text className={`flex-1 text-base font-bold down-sm:text-sm ${c.title}`} numberOfLines={1}>
|
|
38
|
+
{name}
|
|
39
|
+
</Text>
|
|
40
|
+
<Text className={`text-base font-bold down-sm:text-sm ${c.price}`}>{item.price}</Text>
|
|
41
|
+
</View>
|
|
42
|
+
|
|
43
|
+
<View className="flex-row items-center justify-between gap-2">
|
|
44
|
+
<Text className={`flex-1 text-sm down-sm:text-xs ${c.subtitle}`} numberOfLines={2}>
|
|
45
|
+
{description}
|
|
46
|
+
</Text>
|
|
47
|
+
<Pressable
|
|
48
|
+
accessibilityRole="button"
|
|
49
|
+
onPress={() => onAction?.(item)}
|
|
50
|
+
className={`rounded-xl border px-3 py-1.5 ${c.actionBorder}`}
|
|
51
|
+
>
|
|
52
|
+
<Text className={`text-sm font-medium ${c.actionText}`}>{actionLabel}</Text>
|
|
53
|
+
</Pressable>
|
|
54
|
+
</View>
|
|
55
|
+
</View>
|
|
56
|
+
</Pressable>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<View className="gap-2">
|
|
62
|
+
<View className={`rounded-2xl border px-3 py-2 ${c.surface} ${c.border}`}>
|
|
63
|
+
{head.map((item, index) => (
|
|
64
|
+
<Fragment key={item.id}>
|
|
65
|
+
{index > 0 ? <View className={`my-2.5 h-px ${c.divider}`} /> : null}
|
|
66
|
+
{renderRow(item)}
|
|
67
|
+
</Fragment>
|
|
68
|
+
))}
|
|
69
|
+
|
|
70
|
+
{hasMore ? (
|
|
71
|
+
<>
|
|
72
|
+
<Collapsible expanded={expanded}>
|
|
73
|
+
{rest.map((item) => (
|
|
74
|
+
<Fragment key={item.id}>
|
|
75
|
+
<View className={`my-2.5 h-px ${c.divider}`} />
|
|
76
|
+
{renderRow(item)}
|
|
77
|
+
</Fragment>
|
|
78
|
+
))}
|
|
79
|
+
</Collapsible>
|
|
80
|
+
|
|
81
|
+
<View className="mt-2 items-center">
|
|
82
|
+
<Pressable
|
|
83
|
+
onPress={toggle}
|
|
84
|
+
className={`rounded-xl border px-4 py-1.5 ${c.actionBorder}`}
|
|
85
|
+
>
|
|
86
|
+
<Text className={`text-sm font-medium ${c.actionText}`}>
|
|
87
|
+
{expanded ? 'Show less' : 'Show more'}
|
|
88
|
+
</Text>
|
|
89
|
+
</Pressable>
|
|
90
|
+
</View>
|
|
91
|
+
</>
|
|
92
|
+
) : null}
|
|
93
|
+
</View>
|
|
94
|
+
</View>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Fragment } from 'react';
|
|
2
|
+
import { getThemeClasses } from '../../../../utils/theme.utils';
|
|
3
|
+
import { resolveText } from '../../../../utils/i18n.utils';
|
|
4
|
+
import { useExpandableList } from '../../../../utils/use-expandable-list';
|
|
5
|
+
import { Collapsible } from '../common/collapsible';
|
|
6
|
+
import { Theme } from '../../model/chat.model';
|
|
7
|
+
import type { ChatComponentProps } from '../../model/chat.model';
|
|
8
|
+
import type { ServiceItem } from './service.model';
|
|
9
|
+
|
|
10
|
+
export function Service({
|
|
11
|
+
data,
|
|
12
|
+
theme = Theme.Dark,
|
|
13
|
+
language,
|
|
14
|
+
onSelect,
|
|
15
|
+
}: ChatComponentProps<ServiceItem>) {
|
|
16
|
+
const c = getThemeClasses(theme);
|
|
17
|
+
const items = Array.isArray(data) ? data : [data];
|
|
18
|
+
const { head, rest, expanded, hasMore, toggle } = useExpandableList(items);
|
|
19
|
+
|
|
20
|
+
const renderRow = (item: ServiceItem) => {
|
|
21
|
+
const name = resolveText(item.name, language);
|
|
22
|
+
const description = resolveText(item.description, language);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div
|
|
26
|
+
className="flex cursor-pointer items-center gap-3"
|
|
27
|
+
onClick={() => onSelect?.(item)}
|
|
28
|
+
>
|
|
29
|
+
<img
|
|
30
|
+
src={item.image}
|
|
31
|
+
alt={name}
|
|
32
|
+
className={`h-14 w-14 rounded-lg object-cover down-sm:h-12 down-sm:w-12 ${c.iconBg}`}
|
|
33
|
+
/>
|
|
34
|
+
|
|
35
|
+
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
36
|
+
<div className="flex items-center justify-between gap-2">
|
|
37
|
+
<span className={`flex-1 truncate text-base font-bold down-sm:text-sm ${c.title}`}>{name}</span>
|
|
38
|
+
<span className={`shrink-0 text-base font-bold down-sm:text-sm ${c.price}`}>{item.price}</span>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<span className={`line-clamp-2 text-sm down-sm:text-xs ${c.subtitle}`}>{description}</span>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div className={`rounded-2xl border px-3 py-2 ${c.surface} ${c.border}`}>
|
|
49
|
+
{head.map((item, index) => (
|
|
50
|
+
<Fragment key={item.id}>
|
|
51
|
+
{index > 0 ? <div className={`my-2.5 h-px ${c.divider}`} /> : null}
|
|
52
|
+
{renderRow(item)}
|
|
53
|
+
</Fragment>
|
|
54
|
+
))}
|
|
55
|
+
|
|
56
|
+
{hasMore ? (
|
|
57
|
+
<>
|
|
58
|
+
<Collapsible expanded={expanded}>
|
|
59
|
+
{rest.map((item) => (
|
|
60
|
+
<Fragment key={item.id}>
|
|
61
|
+
<div className={`my-2.5 h-px ${c.divider}`} />
|
|
62
|
+
{renderRow(item)}
|
|
63
|
+
</Fragment>
|
|
64
|
+
))}
|
|
65
|
+
</Collapsible>
|
|
66
|
+
|
|
67
|
+
<div className="mt-2 flex justify-center">
|
|
68
|
+
<button
|
|
69
|
+
type="button"
|
|
70
|
+
onClick={toggle}
|
|
71
|
+
className={`rounded-xl border px-4 py-1.5 text-sm font-medium ${c.actionBorder} ${c.actionText}`}
|
|
72
|
+
>
|
|
73
|
+
{expanded ? 'Show less' : 'Show more'}
|
|
74
|
+
</button>
|
|
75
|
+
</div>
|
|
76
|
+
</>
|
|
77
|
+
) : null}
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Product } from './components/product';
|
|
2
|
+
export { Service } from './components/service';
|
|
3
|
+
export { ChatComponentRenderer } from './renderer';
|
|
4
|
+
export { ComponentType, ItemAction, Theme } from './model/chat.model';
|
|
5
|
+
export type { ProductItem } from './components/product/product.model';
|
|
6
|
+
export type { ServiceItem } from './components/service/service.model';
|
|
7
|
+
export type {
|
|
8
|
+
ActionHandler,
|
|
9
|
+
ChatComponentProps,
|
|
10
|
+
ItemCount,
|
|
11
|
+
Language,
|
|
12
|
+
LocalizedText,
|
|
13
|
+
} from './model/chat.model';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export enum Theme {
|
|
2
|
+
Dark = 'dark',
|
|
3
|
+
Light = 'light',
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export type Language = string;
|
|
7
|
+
export type LocalizedText = Record<string, string>;
|
|
8
|
+
|
|
9
|
+
export enum ComponentType {
|
|
10
|
+
Product = 'product',
|
|
11
|
+
ProductList = 'productList',
|
|
12
|
+
Service = 'service',
|
|
13
|
+
ServiceList = 'serviceList',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export enum ItemAction {
|
|
17
|
+
Add = 'add',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type ActionHandler<TItem = unknown> = (item: TItem, action?: ItemAction) => void;
|
|
21
|
+
|
|
22
|
+
export interface ItemCount {
|
|
23
|
+
id: number;
|
|
24
|
+
count: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ChatComponentProps<TItem = unknown> {
|
|
28
|
+
type: ComponentType;
|
|
29
|
+
data: TItem | TItem[];
|
|
30
|
+
language?: Language;
|
|
31
|
+
onAction?: ActionHandler<TItem>;
|
|
32
|
+
onSelect?: ActionHandler<TItem>;
|
|
33
|
+
actionLabel?: string;
|
|
34
|
+
counts?: ItemCount[];
|
|
35
|
+
theme?: Theme;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ChatComponentRenderer } from './renderer';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Product } from '../components/product/product.native';
|
|
2
|
+
import { Service } from '../components/service/service.native';
|
|
3
|
+
import type { ProductItem } from '../components/product/product.model';
|
|
4
|
+
import type { ServiceItem } from '../components/service/service.model';
|
|
5
|
+
import { ComponentType } from '../model/chat.model';
|
|
6
|
+
import type { ChatComponentProps } from '../model/chat.model';
|
|
7
|
+
|
|
8
|
+
export function ChatComponentRenderer({
|
|
9
|
+
type,
|
|
10
|
+
...rest
|
|
11
|
+
}: ChatComponentProps<ProductItem | ServiceItem>) {
|
|
12
|
+
switch (type) {
|
|
13
|
+
case ComponentType.Product:
|
|
14
|
+
case ComponentType.ProductList:
|
|
15
|
+
return <Product type={type} {...(rest as Omit<ChatComponentProps<ProductItem>, 'type'>)} />;
|
|
16
|
+
case ComponentType.Service:
|
|
17
|
+
case ComponentType.ServiceList:
|
|
18
|
+
return <Service type={type} {...(rest as Omit<ChatComponentProps<ServiceItem>, 'type'>)} />;
|
|
19
|
+
default:
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Product } from '../components/product/product';
|
|
2
|
+
import { Service } from '../components/service/service';
|
|
3
|
+
import type { ProductItem } from '../components/product/product.model';
|
|
4
|
+
import type { ServiceItem } from '../components/service/service.model';
|
|
5
|
+
import { ComponentType } from '../model/chat.model';
|
|
6
|
+
import type { ChatComponentProps } from '../model/chat.model';
|
|
7
|
+
|
|
8
|
+
export function ChatComponentRenderer({
|
|
9
|
+
type,
|
|
10
|
+
...rest
|
|
11
|
+
}: ChatComponentProps<ProductItem | ServiceItem>) {
|
|
12
|
+
switch (type) {
|
|
13
|
+
case ComponentType.Product:
|
|
14
|
+
case ComponentType.ProductList:
|
|
15
|
+
return <Product type={type} {...(rest as Omit<ChatComponentProps<ProductItem>, 'type'>)} />;
|
|
16
|
+
case ComponentType.Service:
|
|
17
|
+
case ComponentType.ServiceList:
|
|
18
|
+
return <Service type={type} {...(rest as Omit<ChatComponentProps<ServiceItem>, 'type'>)} />;
|
|
19
|
+
default:
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root entry (aggregator). Defaults to the web/DOM build.
|
|
3
|
+
*
|
|
4
|
+
* Prefer importing the explicit platform entry in apps:
|
|
5
|
+
* - `hotel-smarters-chat-ui/native` -> React Native (mobile + web client via react-native-web)
|
|
6
|
+
* - `hotel-smarters-chat-ui/web` -> React DOM (admin)
|
|
7
|
+
*
|
|
8
|
+
* Public exports are added here once domain components exist.
|
|
9
|
+
*/
|
|
10
|
+
export * from './web';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,OAAO,CAAC"}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root entry (aggregator). Defaults to the web/DOM build.
|
|
3
|
+
*
|
|
4
|
+
* Prefer importing the explicit platform entry in apps:
|
|
5
|
+
* - `@inorain_development/hotel-smarters-chat-ui/native` -> React Native (mobile + web client via react-native-web)
|
|
6
|
+
* - `@inorain_development/hotel-smarters-chat-ui/web` -> React DOM (admin)
|
|
7
|
+
*
|
|
8
|
+
* Public exports are added here once domain components exist.
|
|
9
|
+
*/
|
|
10
|
+
export * from './web';
|
package/src/native.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native entry (mobile + web client via react-native-web).
|
|
3
|
+
* Re-exports the `*.native.tsx` (React Native) component implementations.
|
|
4
|
+
*
|
|
5
|
+
* Placeholder until domain components are added, e.g.:
|
|
6
|
+
* export { Event } from './features/chat/components/Event/Event.native';
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC"}
|
package/src/native.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Product } from './features/chat/components/product/product.native';
|
|
2
|
+
export { Service } from './features/chat/components/service/service.native';
|
|
3
|
+
export { ChatComponentRenderer } from './features/chat/renderer/renderer.native';
|
|
4
|
+
export { ComponentType, ItemAction, Theme } from './features/chat/model/chat.model';
|
|
5
|
+
export type { ProductItem } from './features/chat/components/product/product.model';
|
|
6
|
+
export type { ServiceItem } from './features/chat/components/service/service.model';
|
|
7
|
+
export type {
|
|
8
|
+
ActionHandler,
|
|
9
|
+
ChatComponentProps,
|
|
10
|
+
ItemCount,
|
|
11
|
+
Language,
|
|
12
|
+
LocalizedText,
|
|
13
|
+
} from './features/chat/model/chat.model';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Language, LocalizedText } from '../features/chat/model/chat.model';
|
|
2
|
+
|
|
3
|
+
export function resolveText(text: LocalizedText, language?: Language): string {
|
|
4
|
+
if (language && text[language] != null) return text[language];
|
|
5
|
+
const first = Object.values(text)[0];
|
|
6
|
+
return first ?? '';
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Theme } from '../features/chat/model/chat.model';
|
|
2
|
+
|
|
3
|
+
export interface ThemeClasses {
|
|
4
|
+
surface: string;
|
|
5
|
+
border: string;
|
|
6
|
+
title: string;
|
|
7
|
+
subtitle: string;
|
|
8
|
+
price: string;
|
|
9
|
+
actionBorder: string;
|
|
10
|
+
actionText: string;
|
|
11
|
+
divider: string;
|
|
12
|
+
iconBg: string;
|
|
13
|
+
iconText: string;
|
|
14
|
+
iconColor: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const DARK: ThemeClasses = {
|
|
18
|
+
surface: 'bg-chat-surface-dark',
|
|
19
|
+
border: 'border-chat-border-dark',
|
|
20
|
+
title: 'text-white',
|
|
21
|
+
subtitle: 'text-chat-subtitle-dark',
|
|
22
|
+
price: 'text-white',
|
|
23
|
+
actionBorder: 'border-neutral-700',
|
|
24
|
+
actionText: 'text-white',
|
|
25
|
+
divider: 'bg-neutral-800',
|
|
26
|
+
iconBg: 'bg-indigo-500/20',
|
|
27
|
+
iconText: 'text-indigo-300',
|
|
28
|
+
iconColor: '#a5b4fc',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const LIGHT: ThemeClasses = {
|
|
32
|
+
surface: 'bg-chat-surface-light',
|
|
33
|
+
border: 'border-chat-border-light',
|
|
34
|
+
title: 'text-neutral-900',
|
|
35
|
+
subtitle: 'text-neutral-500',
|
|
36
|
+
price: 'text-neutral-900',
|
|
37
|
+
actionBorder: 'border-slate-400',
|
|
38
|
+
actionText: 'text-neutral-900',
|
|
39
|
+
divider: 'bg-slate-300',
|
|
40
|
+
iconBg: 'bg-indigo-500/15',
|
|
41
|
+
iconText: 'text-indigo-500',
|
|
42
|
+
iconColor: '#6366f1',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export function getThemeClasses(theme: Theme = Theme.Dark): ThemeClasses {
|
|
46
|
+
return theme === Theme.Light ? LIGHT : DARK;
|
|
47
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
const COLLAPSED_COUNT = 3;
|
|
4
|
+
|
|
5
|
+
export function useExpandableList<T>(items: T[], limit = COLLAPSED_COUNT) {
|
|
6
|
+
const [expanded, setExpanded] = useState(false);
|
|
7
|
+
const hasMore = items.length > limit;
|
|
8
|
+
const head = hasMore ? items.slice(0, limit) : items;
|
|
9
|
+
const rest = hasMore ? items.slice(limit) : [];
|
|
10
|
+
const toggle = () => setExpanded((v) => !v);
|
|
11
|
+
return { head, rest, expanded, hasMore, toggle };
|
|
12
|
+
}
|
package/src/web.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web / DOM entry (admin). Re-exports the `*.tsx` (DOM) component implementations.
|
|
3
|
+
*
|
|
4
|
+
* Placeholder until domain components are added, e.g.:
|
|
5
|
+
* export { Event } from './features/chat/components/Event/Event';
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=web.d.ts.map
|
package/src/web.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["web.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
|
package/src/web.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Product } from './features/chat/components/product/product';
|
|
2
|
+
export { Service } from './features/chat/components/service/service';
|
|
3
|
+
export { ChatComponentRenderer } from './features/chat/renderer/renderer';
|
|
4
|
+
export { ComponentType, ItemAction, Theme } from './features/chat/model/chat.model';
|
|
5
|
+
export type { ProductItem } from './features/chat/components/product/product.model';
|
|
6
|
+
export type { ServiceItem } from './features/chat/components/service/service.model';
|
|
7
|
+
export type {
|
|
8
|
+
ActionHandler,
|
|
9
|
+
ChatComponentProps,
|
|
10
|
+
ItemCount,
|
|
11
|
+
Language,
|
|
12
|
+
LocalizedText,
|
|
13
|
+
} from './features/chat/model/chat.model';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Tailwind config for both web (tailwindcss) and React Native (NativeWind).
|
|
3
|
+
*
|
|
4
|
+
* Consumers can extend this via `presets: [require('@inorain_development/hotel-smarters-chat-ui/tailwind.config')]`
|
|
5
|
+
* so design tokens stay in sync across admin (DOM) and mobile/web-RN (NativeWind).
|
|
6
|
+
*/
|
|
7
|
+
/** @type {import('tailwindcss').Config} */
|
|
8
|
+
module.exports = {
|
|
9
|
+
// NativeWind preset enables Tailwind class compilation in React Native.
|
|
10
|
+
presets: [require('nativewind/preset')],
|
|
11
|
+
content: ['./src/**/*.{ts,tsx}'],
|
|
12
|
+
theme: {
|
|
13
|
+
extend: {
|
|
14
|
+
colors: {
|
|
15
|
+
chat: {
|
|
16
|
+
'surface-dark': 'rgb(26, 28, 40)',
|
|
17
|
+
'surface-light': '#dfeaf2',
|
|
18
|
+
'border-dark': 'rgba(255, 255, 255, 0.06)',
|
|
19
|
+
'border-light': '#b4cbdc',
|
|
20
|
+
'subtitle-dark': 'rgb(130, 132, 154)',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
screens: {
|
|
25
|
+
xs: { min: '0' },
|
|
26
|
+
xsm: { min: '380px' },
|
|
27
|
+
sm: { min: '576px' },
|
|
28
|
+
md: { min: '786px' },
|
|
29
|
+
lg: { min: '1024px' },
|
|
30
|
+
xl: { min: '1280px' },
|
|
31
|
+
xxl: { min: '1366px' },
|
|
32
|
+
'lg-xl': { min: '1512px' },
|
|
33
|
+
'down-lg-xl': { max: '1512px' },
|
|
34
|
+
'down-xxl': { max: '1399px' },
|
|
35
|
+
'down-xl': { max: '1279px' },
|
|
36
|
+
'down-lg': { max: '1023px' },
|
|
37
|
+
'down-md': { max: '785px' },
|
|
38
|
+
'down-sm': { max: '575px' },
|
|
39
|
+
'down-xsm': { max: '380px' }
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
plugins: [],
|
|
43
|
+
};
|