@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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/dist/assets/cam-icon.d.ts +2 -0
  4. package/dist/assets/cam-icon.js +7 -0
  5. package/dist/assets/cam-icon.js.map +1 -0
  6. package/dist/assets/cam-icon.png +0 -0
  7. package/dist/assets/chevron-icon.d.ts +2 -0
  8. package/dist/assets/chevron-icon.js +7 -0
  9. package/dist/assets/chevron-icon.js.map +1 -0
  10. package/dist/assets/chevron-icon.png +0 -0
  11. package/dist/assets/close-icon.d.ts +2 -0
  12. package/dist/assets/close-icon.js +7 -0
  13. package/dist/assets/close-icon.js.map +1 -0
  14. package/dist/assets/close-icon.png +0 -0
  15. package/dist/assets/filter-icon.d.ts +2 -0
  16. package/dist/assets/filter-icon.js +7 -0
  17. package/dist/assets/filter-icon.js.map +1 -0
  18. package/dist/assets/filter-icon.png +0 -0
  19. package/dist/assets/search-icon.d.ts +2 -0
  20. package/dist/assets/search-icon.js +7 -0
  21. package/dist/assets/search-icon.js.map +1 -0
  22. package/dist/assets/search-icon.png +0 -0
  23. package/dist/cam-icon-II34AEJC.png +0 -0
  24. package/dist/chevron-icon-7YWXX66A.png +0 -0
  25. package/dist/close-icon-VE65QPHD.png +0 -0
  26. package/dist/comments/AllCommentsModal.d.ts +11 -0
  27. package/dist/comments/AllCommentsModal.js +84 -0
  28. package/dist/comments/AllCommentsModal.js.map +1 -0
  29. package/dist/comments/index.d.ts +9 -0
  30. package/dist/comments/index.js +67 -0
  31. package/dist/comments/index.js.map +1 -0
  32. package/dist/components/ProductCard.d.ts +16 -0
  33. package/dist/components/ProductCard.js +123 -0
  34. package/dist/components/ProductCard.js.map +1 -0
  35. package/dist/components/SearchInput.d.ts +16 -0
  36. package/dist/components/SearchInput.js +186 -0
  37. package/dist/components/SearchInput.js.map +1 -0
  38. package/dist/constants.d.ts +7 -0
  39. package/dist/constants.js +31 -0
  40. package/dist/constants.js.map +1 -0
  41. package/dist/filter-icon-TNVJNKA2.png +0 -0
  42. package/dist/index.d.ts +18 -0
  43. package/dist/index.js +22 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/search/FilterModal.d.ts +28 -0
  46. package/dist/search/FilterModal.js +444 -0
  47. package/dist/search/FilterModal.js.map +1 -0
  48. package/dist/search/index.d.ts +39 -0
  49. package/dist/search/index.js +652 -0
  50. package/dist/search/index.js.map +1 -0
  51. package/dist/search-icon-6SVD6L4Q.png +0 -0
  52. package/dist/tracking.d.ts +11 -0
  53. package/dist/tracking.js +79 -0
  54. package/dist/tracking.js.map +1 -0
  55. package/dist/types.d.ts +14 -0
  56. package/dist/types.js +4 -0
  57. package/dist/types.js.map +1 -0
  58. 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":";;;;;;;;;AAWA,MAAM,kBAAA,GAAqB,CAAC,wCAAA,EAAgC,UAAA,EAAY,MAAM,CAAA;AAY9E,MAAM,cAAc,CAAC;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAa;AACX,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE1D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,cAAA,EAAgB;AACtC,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAC/B,GAAG,GAAG,CAAA;AACN,IAAA,OAAO,MAAM,cAAc,cAAc,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,cAAA,EAAgB,KAAA,CAAM,MAAM,CAAC,CAAA;AAEjC,EAAA,MAAM,YAAA,GAAeC,aAAA;AAAA,IACnB,MAAM,mBAAmB,WAAW,CAAA;AAAA,IACpC,CAAC,WAAW;AAAA,GACd;AAEA,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,cAAA,EAAgB;AAExC,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,CAAC,UAAA,IAAc,cAAA,GAAiB,YAAA,CAAa,MAAA,EAAQ;AACvD,MAAA,OAAA,GAAU,UAAA,CAAW,MAAM,iBAAA,CAAkB,CAAC,SAAS,IAAA,GAAO,CAAC,GAAG,EAAE,CAAA;AAAA,IACtE,CAAA,MAAA,IAAW,CAAC,UAAA,IAAc,cAAA,KAAmB,aAAa,MAAA,EAAQ;AAChE,MAAA,OAAA,GAAU,UAAA,CAAW,MAAM,aAAA,CAAc,IAAI,GAAG,GAAG,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,UAAA,IAAc,cAAA,GAAiB,CAAA,EAAG;AAC3C,MAAA,OAAA,GAAU,UAAA,CAAW,MAAM,iBAAA,CAAkB,CAAC,SAAS,IAAA,GAAO,CAAC,GAAG,EAAE,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,WAAW,MAAM;AACzB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,cAAA,CAAe,CAAC,IAAA,KAAA,CAAU,IAAA,GAAO,CAAA,IAAK,mBAAmB,MAAM,CAAA;AAAA,MACjE,GAAG,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,YAAA,EAAc,cAAA,EAAgB,YAAY,cAAA,EAAgB,KAAA,CAAM,MAAM,CAAC,CAAA;AAE3E,EAAA,MAAM,mBAAA,GAAsB,CAAA,EAAG,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,cAAc,CAAC,CAAA,EAAG,UAAA,GAAa,GAAA,GAAM,EAAE,CAAA,CAAA;AAC5F,EAAA,uBACEE,sBAAA,CAAA,aAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,eAAA,EAAA,kBAClBD,sBAAA,CAAA,aAAA;AAAA,IAACC,gBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,MAAA,CAAO,YAAA;AAAA,QACP;AAAA,UACE,iBAAiB,WAAA,CAAY,oBAAA;AAAA,UAC7B,mBAAmB,WAAA,CAAY;AAAA;AACjC;AACF,KAAA;AAAA,oBAEAD,sBAAA,CAAA,aAAA;AAAA,MAACE,qBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,YAAA,EAAc,QAAA;AAAA,QACd,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACrC,MAAA,EAAQ,MAAM,iBAAA,CAAkB,KAAK,CAAA;AAAA,QACrC,KAAA,EAAO,CAAC,MAAA,CAAO,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,CAAY,kBAAkB,CAAA;AAAA,QAC7D,WAAA,EAAY,EAAA;AAAA,QACZ,gBAAgB,WAAA,CAAY,WAAA;AAAA,QAC5B,WAAA,EAAa,KAAA;AAAA,QACb,cAAA,EAAe,eAAA;AAAA,QACf,aAAA,EAAc;AAAA;AAAA,KAChB;AAAA,IACC,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,cAAA,mBACtBF,sBAAA,CAAA,aAAA;AAAA,MAACG,gBAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAc,MAAA;AAAA,QACd,KAAA,EAAO;AAAA,UACL,MAAA,CAAO,mBAAA;AAAA,UACP,EAAE,KAAA,EAAO,WAAA,CAAY,cAAA;AAAe;AACtC,OAAA;AAAA,MAEC;AAAA,KACH,GACE,IAAA;AAAA,oBACJH,sBAAA,CAAA,aAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,aAAA,EAAA,EACjB,aAAA,mBACCD,sBAAA,CAAA,aAAA,CAACI,qBAAA,EAAA,EAAU,OAAA,EAAS,EAAA,EAAI,OAAA,EAAS,WAAA,EAAA,kBAC/BJ,sBAAA,CAAA,aAAA;AAAA,MAACG,gBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,MAAA,CAAO,SAAA;AAAA,UACP,EAAE,KAAA,EAAO,WAAA,CAAY,eAAA;AAAgB;AACvC,OAAA;AAAA,MACD;AAAA,KAGH,CAAA,mBAEAH,sBAAA,CAAA,aAAA,CAACI,qBAAA,EAAA,EAAU,SAAS,EAAA,EAAA,kBAClBJ,sBAAA,CAAA,aAAA;AAAA,MAACK,iBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,QAAQ,2BAA2B,CAAA;AAAA,QAC3C,KAAA,EAAO;AAAA,UACL,MAAA,CAAO,UAAA;AAAA,UACP,EAAE,SAAA,EAAW,WAAA,CAAY,aAAA;AAAc;AACzC;AAAA,KAEJ,CAEJ;AAAA,GACF,EAEC,CAAC,mBAAA,mBACAL,sBAAA,CAAA,aAAA,CAACI,yBAAU,KAAA,EAAO,MAAA,CAAO,oBAAA,EAAsB,OAAA,EAAS,YAAA,EAAA,kBACtDJ,sBAAA,CAAA,aAAA;AAAA,IAACK,iBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,QAAQ,0BAA0B,CAAA;AAAA,MAC1C,KAAA,EAAO;AAAA,QACL,MAAA,CAAO,WAAA;AAAA,QACP,EAAE,SAAA,EAAW,WAAA,CAAY,aAAA;AAAc;AACzC;AAAA,GAEJ,IACE,IACN,CAAA;AAEJ,CAAA;AAEA,MAAM,MAAA,GAASC,uBAAW,MAAA,CAAO;AAAA,EAC/B,eAAA,EAAiB;AAAA,IACf,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK;AAAA,GACP;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,EAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,eAAA,EAAiB,SAAA;AAAA,IACjB,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,SAAA;AAAA,IACnB,cAAA,EAAgB,QAAA;AAAA,IAChB,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,GAAA,EAAK,EAAA;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,aAAA,EAAe;AAAA,IACb,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK,EAAA;AAAA,IACL,UAAA,EAAY;AAAA,GACd;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAC,CAAA;AAED,IAAO,mBAAA,GAAQ","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,7 @@
1
+ declare const TRACK_ENDPOINT = "https://api.woopze.com/api/tracking/event";
2
+ declare const fetchVisualSearch: ({ apiKey, model_code, }: {
3
+ apiKey: string;
4
+ model_code: string;
5
+ }) => Promise<any>;
6
+
7
+ export { TRACK_ENDPOINT, fetchVisualSearch };
@@ -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
@@ -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 };