@woopze/react-native-sdk 0.1.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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/assets/cam-icon.d.ts +2 -0
- package/dist/assets/cam-icon.js +7 -0
- package/dist/assets/cam-icon.js.map +1 -0
- package/dist/assets/cam-icon.png +0 -0
- package/dist/assets/chevron-icon.d.ts +2 -0
- package/dist/assets/chevron-icon.js +7 -0
- package/dist/assets/chevron-icon.js.map +1 -0
- package/dist/assets/chevron-icon.png +0 -0
- package/dist/assets/close-icon.d.ts +2 -0
- package/dist/assets/close-icon.js +7 -0
- package/dist/assets/close-icon.js.map +1 -0
- package/dist/assets/close-icon.png +0 -0
- package/dist/assets/filter-icon.d.ts +2 -0
- package/dist/assets/filter-icon.js +7 -0
- package/dist/assets/filter-icon.js.map +1 -0
- package/dist/assets/filter-icon.png +0 -0
- package/dist/assets/search-icon.d.ts +2 -0
- package/dist/assets/search-icon.js +7 -0
- package/dist/assets/search-icon.js.map +1 -0
- package/dist/assets/search-icon.png +0 -0
- package/dist/cam-icon-II34AEJC.png +0 -0
- package/dist/chevron-icon-7YWXX66A.png +0 -0
- package/dist/close-icon-VE65QPHD.png +0 -0
- package/dist/comments/AllCommentsModal.d.ts +11 -0
- package/dist/comments/AllCommentsModal.js +84 -0
- package/dist/comments/AllCommentsModal.js.map +1 -0
- package/dist/comments/index.d.ts +9 -0
- package/dist/comments/index.js +67 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/components/ProductCard.d.ts +16 -0
- package/dist/components/ProductCard.js +123 -0
- package/dist/components/ProductCard.js.map +1 -0
- package/dist/components/SearchInput.d.ts +16 -0
- package/dist/components/SearchInput.js +186 -0
- package/dist/components/SearchInput.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +31 -0
- package/dist/constants.js.map +1 -0
- package/dist/filter-icon-TNVJNKA2.png +0 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/search/FilterModal.d.ts +28 -0
- package/dist/search/FilterModal.js +444 -0
- package/dist/search/FilterModal.js.map +1 -0
- package/dist/search/index.d.ts +39 -0
- package/dist/search/index.js +652 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search-icon-6SVD6L4Q.png +0 -0
- package/dist/tracking.d.ts +11 -0
- package/dist/tracking.js +79 -0
- package/dist/tracking.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var reactNative = require('react-native');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
9
|
+
|
|
10
|
+
const placeholderPhrases = ["Ne aramak istedi\u011Finizi yaz\u0131n", "Pantolon", "Etek"];
|
|
11
|
+
const SearchInput = ({
|
|
12
|
+
query,
|
|
13
|
+
setQuery,
|
|
14
|
+
hideHeaderCloseIcon,
|
|
15
|
+
isResultsMode,
|
|
16
|
+
clearSearch,
|
|
17
|
+
onClosePress,
|
|
18
|
+
mergedTheme
|
|
19
|
+
}) => {
|
|
20
|
+
const [phraseIndex, setPhraseIndex] = React.useState(0);
|
|
21
|
+
const [characterCount, setCharacterCount] = React.useState(0);
|
|
22
|
+
const [showCursor, setShowCursor] = React.useState(true);
|
|
23
|
+
const [isDeleting, setIsDeleting] = React.useState(false);
|
|
24
|
+
const [isInputFocused, setIsInputFocused] = React.useState(false);
|
|
25
|
+
React.useEffect(() => {
|
|
26
|
+
if (query.length > 0 || isInputFocused) {
|
|
27
|
+
setShowCursor(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const cursorInterval = setInterval(() => {
|
|
31
|
+
setShowCursor((prev) => !prev);
|
|
32
|
+
}, 500);
|
|
33
|
+
return () => clearInterval(cursorInterval);
|
|
34
|
+
}, [isInputFocused, query.length]);
|
|
35
|
+
const activePhrase = React.useMemo(
|
|
36
|
+
() => placeholderPhrases[phraseIndex],
|
|
37
|
+
[phraseIndex]
|
|
38
|
+
);
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
if (query.length > 0 || isInputFocused) return;
|
|
41
|
+
let timeout;
|
|
42
|
+
if (!isDeleting && characterCount < activePhrase.length) {
|
|
43
|
+
timeout = setTimeout(() => setCharacterCount((prev) => prev + 1), 65);
|
|
44
|
+
} else if (!isDeleting && characterCount === activePhrase.length) {
|
|
45
|
+
timeout = setTimeout(() => setIsDeleting(true), 900);
|
|
46
|
+
} else if (isDeleting && characterCount > 0) {
|
|
47
|
+
timeout = setTimeout(() => setCharacterCount((prev) => prev - 1), 45);
|
|
48
|
+
} else {
|
|
49
|
+
timeout = setTimeout(() => {
|
|
50
|
+
setIsDeleting(false);
|
|
51
|
+
setPhraseIndex((prev) => (prev + 1) % placeholderPhrases.length);
|
|
52
|
+
}, 260);
|
|
53
|
+
}
|
|
54
|
+
return () => clearTimeout(timeout);
|
|
55
|
+
}, [activePhrase, characterCount, isDeleting, isInputFocused, query.length]);
|
|
56
|
+
const animatedPlaceholder = `${activePhrase.slice(0, characterCount)}${showCursor ? "|" : ""}`;
|
|
57
|
+
return /* @__PURE__ */ React__default.default.createElement(reactNative.View, { style: styles.searchContainer }, /* @__PURE__ */ React__default.default.createElement(
|
|
58
|
+
reactNative.View,
|
|
59
|
+
{
|
|
60
|
+
style: [
|
|
61
|
+
styles.searchHeader,
|
|
62
|
+
{
|
|
63
|
+
backgroundColor: mergedTheme.inputBackgroundColor,
|
|
64
|
+
borderBottomColor: mergedTheme.borderColor
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
/* @__PURE__ */ React__default.default.createElement(
|
|
69
|
+
reactNative.TextInput,
|
|
70
|
+
{
|
|
71
|
+
value: query,
|
|
72
|
+
onChangeText: setQuery,
|
|
73
|
+
onFocus: () => setIsInputFocused(true),
|
|
74
|
+
onBlur: () => setIsInputFocused(false),
|
|
75
|
+
style: [styles.input, { color: mergedTheme.textPrimaryColor }],
|
|
76
|
+
placeholder: "",
|
|
77
|
+
selectionColor: mergedTheme.accentColor,
|
|
78
|
+
autoCorrect: false,
|
|
79
|
+
submitBehavior: "blurAndSubmit",
|
|
80
|
+
returnKeyType: "search"
|
|
81
|
+
}
|
|
82
|
+
),
|
|
83
|
+
query.length === 0 && !isInputFocused ? /* @__PURE__ */ React__default.default.createElement(
|
|
84
|
+
reactNative.Text,
|
|
85
|
+
{
|
|
86
|
+
pointerEvents: "none",
|
|
87
|
+
style: [
|
|
88
|
+
styles.animatedPlaceholder,
|
|
89
|
+
{ color: mergedTheme.mutedTextColor }
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
animatedPlaceholder
|
|
93
|
+
) : null,
|
|
94
|
+
/* @__PURE__ */ React__default.default.createElement(reactNative.View, { style: styles.headerActions }, isResultsMode ? /* @__PURE__ */ React__default.default.createElement(reactNative.Pressable, { hitSlop: 10, onPress: clearSearch }, /* @__PURE__ */ React__default.default.createElement(
|
|
95
|
+
reactNative.Text,
|
|
96
|
+
{
|
|
97
|
+
style: [
|
|
98
|
+
styles.clearText,
|
|
99
|
+
{ color: mergedTheme.buttonTextColor }
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"Temizle"
|
|
103
|
+
)) : /* @__PURE__ */ React__default.default.createElement(reactNative.Pressable, { hitSlop: 10 }, /* @__PURE__ */ React__default.default.createElement(
|
|
104
|
+
reactNative.Image,
|
|
105
|
+
{
|
|
106
|
+
source: require("../assets/search-icon.png"),
|
|
107
|
+
style: [
|
|
108
|
+
styles.headerIcon,
|
|
109
|
+
{ tintColor: mergedTheme.iconTintColor }
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
)))
|
|
113
|
+
), !hideHeaderCloseIcon ? /* @__PURE__ */ React__default.default.createElement(reactNative.Pressable, { style: styles.closeButtonContainer, onPress: onClosePress }, /* @__PURE__ */ React__default.default.createElement(
|
|
114
|
+
reactNative.Image,
|
|
115
|
+
{
|
|
116
|
+
source: require("../assets/close-icon.png"),
|
|
117
|
+
style: [
|
|
118
|
+
styles.closeButton,
|
|
119
|
+
{ tintColor: mergedTheme.iconTintColor }
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
)) : null);
|
|
123
|
+
};
|
|
124
|
+
const styles = reactNative.StyleSheet.create({
|
|
125
|
+
searchContainer: {
|
|
126
|
+
flexDirection: "row",
|
|
127
|
+
alignItems: "center",
|
|
128
|
+
gap: 12
|
|
129
|
+
},
|
|
130
|
+
searchHeader: {
|
|
131
|
+
height: 46,
|
|
132
|
+
flex: 1,
|
|
133
|
+
backgroundColor: "#efefef",
|
|
134
|
+
borderBottomWidth: 1,
|
|
135
|
+
borderBottomColor: "#1f1f1f",
|
|
136
|
+
justifyContent: "center",
|
|
137
|
+
paddingLeft: 8,
|
|
138
|
+
paddingRight: 12
|
|
139
|
+
},
|
|
140
|
+
input: {
|
|
141
|
+
color: "#111",
|
|
142
|
+
fontSize: 15,
|
|
143
|
+
height: 44,
|
|
144
|
+
padding: 0,
|
|
145
|
+
paddingRight: 90,
|
|
146
|
+
fontFamily: "System"
|
|
147
|
+
},
|
|
148
|
+
animatedPlaceholder: {
|
|
149
|
+
position: "absolute",
|
|
150
|
+
left: 8,
|
|
151
|
+
top: 13,
|
|
152
|
+
color: "#6f6f6f",
|
|
153
|
+
fontSize: 14
|
|
154
|
+
},
|
|
155
|
+
closeButtonContainer: {
|
|
156
|
+
width: 18,
|
|
157
|
+
height: 18,
|
|
158
|
+
alignItems: "center",
|
|
159
|
+
justifyContent: "center"
|
|
160
|
+
},
|
|
161
|
+
clearText: {
|
|
162
|
+
color: "#6a6a6a",
|
|
163
|
+
fontSize: 13,
|
|
164
|
+
fontWeight: "600"
|
|
165
|
+
},
|
|
166
|
+
closeButton: {
|
|
167
|
+
width: 14,
|
|
168
|
+
height: 14
|
|
169
|
+
},
|
|
170
|
+
headerActions: {
|
|
171
|
+
position: "absolute",
|
|
172
|
+
right: 12,
|
|
173
|
+
flexDirection: "row",
|
|
174
|
+
gap: 14,
|
|
175
|
+
alignItems: "center"
|
|
176
|
+
},
|
|
177
|
+
headerIcon: {
|
|
178
|
+
width: 20,
|
|
179
|
+
height: 20
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
var SearchInput_default = SearchInput;
|
|
183
|
+
|
|
184
|
+
module.exports = SearchInput_default;
|
|
185
|
+
//# sourceMappingURL=SearchInput.js.map
|
|
186
|
+
//# sourceMappingURL=SearchInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/SearchInput.tsx"],"names":["useState","useEffect","useMemo","React","View","TextInput","Text","Pressable","Image","StyleSheet"],"mappings":"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","file":"SearchInput.js","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport {\n Image,\n Text,\n View,\n StyleSheet,\n TextInput,\n Pressable,\n} from \"react-native\";\nimport { WoopzeSearchTheme } from \"../search\";\n\nconst placeholderPhrases = [\"Ne aramak istediğinizi yazın\", \"Pantolon\", \"Etek\"];\n\ntype Props = {\n query: string;\n setQuery: (query: string) => void;\n hideHeaderCloseIcon: boolean;\n isResultsMode: boolean;\n clearSearch: () => void;\n onClosePress: (() => void) | undefined;\n mergedTheme: WoopzeSearchTheme;\n};\n\nconst SearchInput = ({\n query,\n setQuery,\n hideHeaderCloseIcon,\n isResultsMode,\n clearSearch,\n onClosePress,\n mergedTheme,\n}: Props) => {\n const [phraseIndex, setPhraseIndex] = useState(0);\n const [characterCount, setCharacterCount] = useState(0);\n const [showCursor, setShowCursor] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isInputFocused, setIsInputFocused] = useState(false);\n\n useEffect(() => {\n if (query.length > 0 || isInputFocused) {\n setShowCursor(false);\n return;\n }\n\n const cursorInterval = setInterval(() => {\n setShowCursor((prev) => !prev);\n }, 500);\n return () => clearInterval(cursorInterval);\n }, [isInputFocused, query.length]);\n\n const activePhrase = useMemo(\n () => placeholderPhrases[phraseIndex],\n [phraseIndex],\n );\n\n useEffect(() => {\n if (query.length > 0 || isInputFocused) return;\n\n let timeout: ReturnType<typeof setTimeout>;\n\n if (!isDeleting && characterCount < activePhrase.length) {\n timeout = setTimeout(() => setCharacterCount((prev) => prev + 1), 65);\n } else if (!isDeleting && characterCount === activePhrase.length) {\n timeout = setTimeout(() => setIsDeleting(true), 900);\n } else if (isDeleting && characterCount > 0) {\n timeout = setTimeout(() => setCharacterCount((prev) => prev - 1), 45);\n } else {\n timeout = setTimeout(() => {\n setIsDeleting(false);\n setPhraseIndex((prev) => (prev + 1) % placeholderPhrases.length);\n }, 260);\n }\n\n return () => clearTimeout(timeout);\n }, [activePhrase, characterCount, isDeleting, isInputFocused, query.length]);\n\n const animatedPlaceholder = `${activePhrase.slice(0, characterCount)}${showCursor ? \"|\" : \"\"}`;\n return (\n <View style={styles.searchContainer}>\n <View\n style={[\n styles.searchHeader,\n {\n backgroundColor: mergedTheme.inputBackgroundColor,\n borderBottomColor: mergedTheme.borderColor,\n },\n ]}\n >\n <TextInput\n value={query}\n onChangeText={setQuery}\n onFocus={() => setIsInputFocused(true)}\n onBlur={() => setIsInputFocused(false)}\n style={[styles.input, { color: mergedTheme.textPrimaryColor }]}\n placeholder=\"\"\n selectionColor={mergedTheme.accentColor}\n autoCorrect={false}\n submitBehavior=\"blurAndSubmit\"\n returnKeyType=\"search\"\n />\n {query.length === 0 && !isInputFocused ? (\n <Text\n pointerEvents=\"none\"\n style={[\n styles.animatedPlaceholder,\n { color: mergedTheme.mutedTextColor },\n ]}\n >\n {animatedPlaceholder}\n </Text>\n ) : null}\n <View style={styles.headerActions}>\n {isResultsMode ? (\n <Pressable hitSlop={10} onPress={clearSearch}>\n <Text\n style={[\n styles.clearText,\n { color: mergedTheme.buttonTextColor },\n ]}\n >\n Temizle\n </Text>\n </Pressable>\n ) : (\n <Pressable hitSlop={10}>\n <Image\n source={require(\"../assets/search-icon.png\")}\n style={[\n styles.headerIcon,\n { tintColor: mergedTheme.iconTintColor },\n ]}\n />\n </Pressable>\n )}\n </View>\n </View>\n\n {!hideHeaderCloseIcon ? (\n <Pressable style={styles.closeButtonContainer} onPress={onClosePress}>\n <Image\n source={require(\"../assets/close-icon.png\")}\n style={[\n styles.closeButton,\n { tintColor: mergedTheme.iconTintColor },\n ]}\n />\n </Pressable>\n ) : null}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n searchContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 12,\n },\n searchHeader: {\n height: 46,\n flex: 1,\n backgroundColor: \"#efefef\",\n borderBottomWidth: 1,\n borderBottomColor: \"#1f1f1f\",\n justifyContent: \"center\",\n paddingLeft: 8,\n paddingRight: 12,\n },\n input: {\n color: \"#111\",\n fontSize: 15,\n height: 44,\n padding: 0,\n paddingRight: 90,\n fontFamily: \"System\",\n },\n animatedPlaceholder: {\n position: \"absolute\",\n left: 8,\n top: 13,\n color: \"#6f6f6f\",\n fontSize: 14,\n },\n closeButtonContainer: {\n width: 18,\n height: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n clearText: {\n color: \"#6a6a6a\",\n fontSize: 13,\n fontWeight: \"600\",\n },\n closeButton: {\n width: 14,\n height: 14,\n },\n headerActions: {\n position: \"absolute\",\n right: 12,\n flexDirection: \"row\",\n gap: 14,\n alignItems: \"center\",\n },\n headerIcon: {\n width: 20,\n height: 20,\n },\n});\n\nexport default SearchInput;\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const TRACK_ENDPOINT = "https://api.woopze.com/api/tracking/event";
|
|
4
|
+
const fetchVisualSearch = async ({
|
|
5
|
+
apiKey,
|
|
6
|
+
model_code
|
|
7
|
+
}) => {
|
|
8
|
+
const response = await fetch(
|
|
9
|
+
"https://app.woopze.com/service/modules/mod_36/visual-search",
|
|
10
|
+
{
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
"Content-Type": "application/json",
|
|
14
|
+
Accept: "application/json"
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
apiKey,
|
|
18
|
+
model_code
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(`Request failed: ${response.status}`);
|
|
24
|
+
}
|
|
25
|
+
return await response.json();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
exports.TRACK_ENDPOINT = TRACK_ENDPOINT;
|
|
29
|
+
exports.fetchVisualSearch = fetchVisualSearch;
|
|
30
|
+
//# sourceMappingURL=constants.js.map
|
|
31
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";;AAAO,MAAM,cAAA,GAAiB;AAE9B,MAAM,oBAAoB,OAAO;AAAA,EAC/B,MAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,6DAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,MAAA;AAAA,QACA;AAAA,OACD;AAAA;AACH,GACF;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B","file":"constants.js","sourcesContent":["export const TRACK_ENDPOINT = \"https://api.woopze.com/api/tracking/event\";\n\nconst fetchVisualSearch = async ({\n apiKey,\n model_code,\n}: {\n apiKey: string;\n model_code: string;\n}) => {\n const response = await fetch(\n \"https://app.woopze.com/service/modules/mod_36/visual-search\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({\n apiKey,\n model_code,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status}`);\n }\n\n return await response.json();\n};\n\nexport { fetchVisualSearch };\n"]}
|
|
Binary file
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import WoopzeSearchScreen from './search/index.js';
|
|
3
|
+
export { WoopzeSearchProps, WoopzeSearchTheme } from './search/index.js';
|
|
4
|
+
import { trackEvent, initializeFunc } from './tracking.js';
|
|
5
|
+
export { WoopzeEventBody, WoopzeInitialize } from './tracking.js';
|
|
6
|
+
import 'react-native';
|
|
7
|
+
|
|
8
|
+
declare const Woopze: {
|
|
9
|
+
Search: typeof WoopzeSearchScreen;
|
|
10
|
+
track: typeof trackEvent;
|
|
11
|
+
initialize: typeof initializeFunc;
|
|
12
|
+
Comments: ({ apiKey, modelCode }: {
|
|
13
|
+
apiKey: string;
|
|
14
|
+
modelCode: string;
|
|
15
|
+
}) => React.JSX.Element | null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { Woopze as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Search = require('./search');
|
|
4
|
+
var tracking = require('./tracking');
|
|
5
|
+
var Comments = require('./comments');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var Search__default = /*#__PURE__*/_interopDefault(Search);
|
|
10
|
+
var Comments__default = /*#__PURE__*/_interopDefault(Comments);
|
|
11
|
+
|
|
12
|
+
const Woopze = {
|
|
13
|
+
Search: Search__default.default,
|
|
14
|
+
track: tracking.trackEvent,
|
|
15
|
+
initialize: tracking.initializeFunc,
|
|
16
|
+
Comments: Comments__default.default
|
|
17
|
+
};
|
|
18
|
+
var index_default = Woopze;
|
|
19
|
+
|
|
20
|
+
module.exports = index_default;
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["Search","trackEvent","initializeFunc","Comments"],"mappings":";;;;;;;;;;;AAOA,MAAM,MAAA,GAAS;AAAA,UACbA,uBAAA;AAAA,EACA,KAAA,EAAOC,mBAAA;AAAA,EACP,UAAA,EAAYC,uBAAA;AAAA,YACZC;AACF,CAAA;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["import Search from \"./search\";\nimport { initializeFunc, trackEvent } from \"./tracking\";\nimport Comments from \"./comments\";\n\nexport type { WoopzeEventBody, WoopzeInitialize } from \"./tracking\";\nexport type { WoopzeSearchProps, WoopzeSearchTheme } from \"./search\";\n\nconst Woopze = {\n Search,\n track: trackEvent,\n initialize: initializeFunc,\n Comments,\n};\n\nexport default Woopze;\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
type FacetConfigItem = {
|
|
4
|
+
type: string;
|
|
5
|
+
label: string;
|
|
6
|
+
order: number;
|
|
7
|
+
visible: boolean;
|
|
8
|
+
};
|
|
9
|
+
type AppliedFilters = {
|
|
10
|
+
categories: string[];
|
|
11
|
+
facets: Record<string, string[]>;
|
|
12
|
+
minPrice: number | null;
|
|
13
|
+
maxPrice: number | null;
|
|
14
|
+
};
|
|
15
|
+
type FilterModalProps = {
|
|
16
|
+
visible: boolean;
|
|
17
|
+
onClose: () => void;
|
|
18
|
+
facetDistribution: Record<string, Record<string, number>>;
|
|
19
|
+
facetConfig: Record<string, FacetConfigItem>;
|
|
20
|
+
defaultMinPrice: number;
|
|
21
|
+
defaultMaxPrice: number;
|
|
22
|
+
appliedFilters: AppliedFilters;
|
|
23
|
+
onApply: (filters: AppliedFilters) => void;
|
|
24
|
+
onReset: () => void;
|
|
25
|
+
};
|
|
26
|
+
declare function FilterModal({ visible, onClose, facetDistribution, facetConfig, defaultMinPrice, defaultMaxPrice, appliedFilters, onApply, onReset, }: FilterModalProps): React__default.JSX.Element;
|
|
27
|
+
|
|
28
|
+
export { type AppliedFilters, FilterModal as default };
|