@rpg-engine/long-bow 0.4.9 → 0.4.81

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 (177) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/Marketplace/BuyPanel.d.ts +0 -1
  4. package/dist/components/Marketplace/ManagmentPanel.d.ts +0 -1
  5. package/dist/components/ProgressBar.d.ts +1 -0
  6. package/dist/long-bow.cjs.development.js +1566 -1595
  7. package/dist/long-bow.cjs.development.js.map +1 -1
  8. package/dist/long-bow.cjs.production.min.js +1 -1
  9. package/dist/long-bow.cjs.production.min.js.map +1 -1
  10. package/dist/long-bow.esm.js +1472 -1501
  11. package/dist/long-bow.esm.js.map +1 -1
  12. package/package.json +100 -100
  13. package/src/.DS_Store +0 -0
  14. package/src/components/.DS_Store +0 -0
  15. package/src/components/Abstractions/ModalPortal.tsx +22 -22
  16. package/src/components/Abstractions/SlotsContainer.tsx +62 -62
  17. package/src/components/Arrow/SelectArrow.tsx +69 -69
  18. package/src/components/Arrow/img/arrow01-left-clicked.png +0 -0
  19. package/src/components/Arrow/img/arrow01-left.png +0 -0
  20. package/src/components/Arrow/img/arrow01-right-clicked.png +0 -0
  21. package/src/components/Arrow/img/arrow01-right.png +0 -0
  22. package/src/components/Arrow/img/arrow02-left-clicked.png +0 -0
  23. package/src/components/Arrow/img/arrow02-left.png +0 -0
  24. package/src/components/Arrow/img/arrow02-right-clicked.png +0 -0
  25. package/src/components/Arrow/img/arrow02-right.png +0 -0
  26. package/src/components/Button.tsx +40 -40
  27. package/src/components/Character/CharacterSelection.tsx +98 -98
  28. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  29. package/src/components/Chat/Chat.tsx +196 -196
  30. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  31. package/src/components/CheckButton.tsx +65 -65
  32. package/src/components/CircularController/CircularController.tsx +282 -282
  33. package/src/components/ConfirmModal.tsx +87 -87
  34. package/src/components/CraftBook/CraftBook.tsx +286 -286
  35. package/src/components/CraftBook/CraftingRecipe.tsx +161 -161
  36. package/src/components/CraftBook/MockItems.ts +101 -101
  37. package/src/components/DraggableContainer.tsx +183 -183
  38. package/src/components/Dropdown.tsx +114 -114
  39. package/src/components/DropdownSelectorContainer.tsx +42 -42
  40. package/src/components/Equipment/EquipmentSet.tsx +199 -199
  41. package/src/components/HistoryDialog.tsx +104 -104
  42. package/src/components/Input.tsx +15 -15
  43. package/src/components/InputRadio.tsx +41 -41
  44. package/src/components/Item/Cards/ItemInfo.tsx +298 -298
  45. package/src/components/Item/Cards/ItemInfoDisplay.tsx +135 -135
  46. package/src/components/Item/Cards/ItemInfoWrapper.tsx +62 -62
  47. package/src/components/Item/Cards/ItemTooltip.tsx +83 -83
  48. package/src/components/Item/Cards/MobileItemTooltip.tsx +149 -149
  49. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  50. package/src/components/Item/Inventory/ItemContainer.tsx +231 -231
  51. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  52. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  53. package/src/components/Item/Inventory/ItemSlot.tsx +595 -595
  54. package/src/components/Item/Inventory/itemContainerHelper.ts +175 -175
  55. package/src/components/ListMenu.tsx +63 -63
  56. package/src/components/Marketplace/BuyPanel.tsx +296 -304
  57. package/src/components/Marketplace/ManagmentPanel.tsx +247 -255
  58. package/src/components/Marketplace/Marketplace.tsx +106 -106
  59. package/src/components/Marketplace/MarketplaceRows.tsx +161 -177
  60. package/src/components/Marketplace/filters/index.tsx +67 -67
  61. package/src/components/Multitab/Tab.tsx +66 -66
  62. package/src/components/Multitab/TabBody.tsx +13 -13
  63. package/src/components/Multitab/TabsContainer.tsx +97 -97
  64. package/src/components/NPCDialog/.DS_Store +0 -0
  65. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  66. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  67. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  68. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  69. package/src/components/NPCDialog/img/.DS_Store +0 -0
  70. package/src/components/Pager.tsx +94 -94
  71. package/src/components/ProgressBar.tsx +102 -95
  72. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  73. package/src/components/QuestInfo/QuestInfo.tsx +233 -233
  74. package/src/components/QuestList.tsx +135 -135
  75. package/src/components/RPGUIContainer.tsx +47 -47
  76. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  77. package/src/components/RPGUIRoot.tsx +14 -14
  78. package/src/components/RadioButton.tsx +53 -53
  79. package/src/components/RadioInput/RadioButton.tsx +96 -96
  80. package/src/components/RadioInput/RadioInput.tsx +102 -102
  81. package/src/components/RadioInput/instruments.ts +15 -15
  82. package/src/components/RangeSlider.tsx +78 -78
  83. package/src/components/RelativeListMenu.tsx +90 -90
  84. package/src/components/ScrollList.tsx +79 -79
  85. package/src/components/Shortcuts/Shortcuts.tsx +193 -193
  86. package/src/components/Shortcuts/ShortcutsSetter.tsx +139 -139
  87. package/src/components/Shortcuts/SingleShortcut.ts +82 -82
  88. package/src/components/Shortcuts/useShortcutCooldown.ts +23 -23
  89. package/src/components/SimpleProgressBar.tsx +62 -62
  90. package/src/components/SkillProgressBar.tsx +198 -198
  91. package/src/components/SkillsContainer.tsx +213 -213
  92. package/src/components/Spellbook/Spell.tsx +235 -235
  93. package/src/components/Spellbook/Spellbook.tsx +145 -145
  94. package/src/components/Spellbook/cards/MobileSpellTooltip.tsx +137 -137
  95. package/src/components/Spellbook/cards/SpellInfo.tsx +134 -134
  96. package/src/components/Spellbook/cards/SpellInfoDisplay.tsx +31 -31
  97. package/src/components/Spellbook/cards/SpellInfoWrapper.tsx +48 -48
  98. package/src/components/Spellbook/cards/SpellTooltip.tsx +70 -70
  99. package/src/components/Spellbook/constants.ts +7 -7
  100. package/src/components/Spellbook/mockSpells.ts +84 -84
  101. package/src/components/StaticBook/StaticBook.tsx +103 -103
  102. package/src/components/TextArea.tsx +11 -11
  103. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  104. package/src/components/TimeWidget/TimeWidget.tsx +65 -65
  105. package/src/components/TradingMenu/TradingItemRow.tsx +199 -199
  106. package/src/components/TradingMenu/TradingMenu.tsx +219 -219
  107. package/src/components/TradingMenu/items.mock.ts +48 -48
  108. package/src/components/Truncate.tsx +25 -25
  109. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  110. package/src/components/shared/Column.tsx +16 -16
  111. package/src/components/shared/Ellipsis.tsx +76 -76
  112. package/src/components/shared/SpriteFromAtlas.tsx +104 -104
  113. package/src/components/typography/DynamicText.tsx +49 -49
  114. package/src/constants/uiColors.ts +20 -20
  115. package/src/constants/uiDevices.ts +3 -3
  116. package/src/constants/uiFonts.ts +12 -12
  117. package/src/hooks/useEventListener.ts +21 -21
  118. package/src/hooks/useOutsideAlerter.ts +25 -25
  119. package/src/index.tsx +42 -42
  120. package/src/libs/CastingTypeHelper.ts +7 -7
  121. package/src/libs/StringHelpers.ts +3 -3
  122. package/src/libs/itemCounter.ts +21 -21
  123. package/src/mocks/.DS_Store +0 -0
  124. package/src/mocks/atlas/.DS_Store +0 -0
  125. package/src/mocks/atlas/entities/entities.json +20215 -20215
  126. package/src/mocks/atlas/icons/icons.json +735 -735
  127. package/src/mocks/atlas/items/items.json +12086 -12086
  128. package/src/mocks/equipmentSet.mocks.ts +391 -391
  129. package/src/mocks/itemContainer.mocks.ts +605 -605
  130. package/src/mocks/skills.mocks.ts +130 -130
  131. package/src/stories/Arrow.stories.tsx +26 -26
  132. package/src/stories/Button.stories.tsx +36 -36
  133. package/src/stories/CharacterSelection.stories.tsx +44 -44
  134. package/src/stories/CharacterStatus.stories.tsx +29 -29
  135. package/src/stories/Chat.stories.tsx +187 -187
  136. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  137. package/src/stories/CheckButton.stories.tsx +48 -48
  138. package/src/stories/CircullarController.stories.tsx +37 -37
  139. package/src/stories/CraftBook.stories.tsx +42 -42
  140. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  141. package/src/stories/DraggableContainer.stories.tsx +28 -28
  142. package/src/stories/Dropdown.stories.tsx +46 -46
  143. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  144. package/src/stories/EquipmentSet.stories.tsx +65 -65
  145. package/src/stories/HistoryDialog.stories.tsx +61 -61
  146. package/src/stories/ItemContainer.stories.tsx +201 -201
  147. package/src/stories/ItemInfoDisplay.stories.tsx +33 -33
  148. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  149. package/src/stories/ItemSelector.stories.tsx +77 -77
  150. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  151. package/src/stories/ListMenu.stories.tsx +56 -56
  152. package/src/stories/Marketplace.stories.tsx +53 -57
  153. package/src/stories/MarketplaceRows.stories.tsx +27 -27
  154. package/src/stories/Multitab.stories.tsx +51 -51
  155. package/src/stories/NPCDialog.stories.tsx +130 -130
  156. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  157. package/src/stories/ProgressBar.stories.tsx +24 -23
  158. package/src/stories/PropertySelect.stories.tsx +40 -40
  159. package/src/stories/QuestInfo.stories.tsx +107 -107
  160. package/src/stories/QuestList.stories.tsx +82 -82
  161. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  162. package/src/stories/RadioButton.stories.tsx +49 -49
  163. package/src/stories/RadioInput.stories.tsx +34 -34
  164. package/src/stories/RangeSlider.stories.tsx +64 -64
  165. package/src/stories/ScrollList.stories.tsx +85 -85
  166. package/src/stories/Shortcuts.stories.tsx +39 -39
  167. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  168. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  169. package/src/stories/SkillsContainer.stories.tsx +35 -35
  170. package/src/stories/SpellInfoDisplay.stories.tsx +27 -27
  171. package/src/stories/Spellbook.stories.tsx +104 -104
  172. package/src/stories/StaticBook.stories.tsx +32 -32
  173. package/src/stories/Text.stories.tsx +42 -42
  174. package/src/stories/TimeWidget.stories.tsx +27 -27
  175. package/src/stories/TradingMenu.stories.tsx +47 -47
  176. package/src/types/eventTypes.ts +4 -4
  177. package/src/types/index.d.ts +2 -2
@@ -1,304 +1,296 @@
1
- import { IEquipmentSet, IMarketplaceItem } from '@rpg-engine/shared';
2
- import React, { useEffect, useRef, useState } from 'react';
3
- import { AiFillCaretRight } from 'react-icons/ai';
4
- import styled from 'styled-components';
5
- import { ConfirmModal } from '../ConfirmModal';
6
- import { Dropdown } from '../Dropdown';
7
- import { Input } from '../Input';
8
- import { MarketplaceRows } from './MarketplaceRows';
9
- import { itemRarityOptions, itemTypeOptions, orderByOptions } from './filters';
10
-
11
- export interface IBuyPanelProps {
12
- items: IMarketplaceItem[];
13
- atlasJSON: any;
14
- atlasIMG: any;
15
- onClose: () => void;
16
- onChangeType: (value: string) => void;
17
- onChangeRarity: (value: string) => void;
18
- onChangeOrder: (value: string) => void;
19
- onChangeNameInput: (value: string) => void;
20
- onChangeMainLevelInput: (
21
- value: [number | undefined, number | undefined]
22
- ) => void;
23
- onChangeSecondaryLevelInput: (
24
- value: [number | undefined, number | undefined]
25
- ) => void;
26
- onChangePriceInput: (value: [number | undefined, number | undefined]) => void;
27
- scale?: number;
28
- equipmentSet?: IEquipmentSet | null;
29
- onMarketPlaceItemBuy?: (marketPlaceItemId: string) => void;
30
- characterId: string;
31
- enableHotkeys?: () => void;
32
- disableHotkeys?: () => void;
33
- currentPage: number;
34
- }
35
-
36
- export const BuyPanel: React.FC<IBuyPanelProps> = ({
37
- items,
38
- atlasIMG,
39
- atlasJSON,
40
- onChangeType,
41
- onChangeRarity,
42
- onChangeOrder,
43
- onChangeNameInput,
44
- onChangeMainLevelInput,
45
- onChangeSecondaryLevelInput,
46
- onChangePriceInput,
47
- equipmentSet,
48
- onMarketPlaceItemBuy,
49
- characterId,
50
- enableHotkeys,
51
- disableHotkeys,
52
- currentPage,
53
- }) => {
54
- const [name, setName] = useState('');
55
- const [mainLevel, setMainLevel] = useState<
56
- [number | undefined, number | undefined]
57
- >([undefined, undefined]);
58
- const [secondaryLevel, setSecondaryLevel] = useState<
59
- [number | undefined, number | undefined]
60
- >([undefined, undefined]);
61
- const [price, setPrice] = useState<[number | undefined, number | undefined]>([
62
- undefined,
63
- undefined,
64
- ]);
65
- const [buyingItemId, setBuyingItemId] = useState<string | null>(null);
66
-
67
- const itemsContainer = useRef<HTMLDivElement>(null);
68
-
69
- useEffect(() => {
70
- itemsContainer.current?.scrollTo(0, 0);
71
- }, [currentPage]);
72
-
73
- return (
74
- <>
75
- {buyingItemId && (
76
- <ConfirmModal
77
- onClose={setBuyingItemId.bind(null, null)}
78
- onConfirm={() => {
79
- onMarketPlaceItemBuy?.(buyingItemId);
80
- setBuyingItemId(null);
81
- enableHotkeys?.();
82
- }}
83
- message="Are you sure to buy this item?"
84
- />
85
- )}
86
- <InputWrapper>
87
- <p>Search By Name</p>
88
- <Input
89
- onChange={e => {
90
- setName(e.target.value);
91
- onChangeNameInput(e.target.value);
92
- }}
93
- value={name}
94
- placeholder="Enter name..."
95
- onBlur={enableHotkeys}
96
- onFocus={disableHotkeys}
97
- />
98
- </InputWrapper>
99
-
100
- <OptionsWrapper>
101
- <FilterInputsWrapper>
102
- <div>
103
- <p>Main level</p>
104
- <Input
105
- onChange={e => {
106
- setMainLevel([Number(e.target.value), mainLevel[1]]);
107
- onChangeMainLevelInput([Number(e.target.value), mainLevel[1]]);
108
- }}
109
- placeholder="Min"
110
- type="number"
111
- min={0}
112
- onBlur={enableHotkeys}
113
- onFocus={disableHotkeys}
114
- />
115
- <AiFillCaretRight />
116
- <Input
117
- onChange={e => {
118
- setMainLevel([mainLevel[0], Number(e.target.value)]);
119
- onChangeMainLevelInput([mainLevel[0], Number(e.target.value)]);
120
- }}
121
- placeholder="Max"
122
- type="number"
123
- min={0}
124
- onBlur={enableHotkeys}
125
- onFocus={disableHotkeys}
126
- />
127
- </div>
128
-
129
- <div>
130
- <p>Secondary level</p>
131
- <Input
132
- onChange={e => {
133
- setSecondaryLevel([Number(e.target.value), secondaryLevel[1]]);
134
- onChangeSecondaryLevelInput([
135
- Number(e.target.value),
136
- secondaryLevel[1],
137
- ]);
138
- }}
139
- placeholder="Min"
140
- type="number"
141
- min={0}
142
- onBlur={enableHotkeys}
143
- onFocus={disableHotkeys}
144
- />
145
- <AiFillCaretRight />
146
- <Input
147
- onChange={e => {
148
- setSecondaryLevel([secondaryLevel[0], Number(e.target.value)]);
149
- onChangeSecondaryLevelInput([
150
- secondaryLevel[0],
151
- Number(e.target.value),
152
- ]);
153
- }}
154
- placeholder="Max"
155
- type="number"
156
- min={0}
157
- onBlur={enableHotkeys}
158
- onFocus={disableHotkeys}
159
- />
160
- </div>
161
-
162
- <div>
163
- <p>Price</p>
164
- <Input
165
- onChange={e => {
166
- setPrice([Number(e.target.value), price[1]]);
167
- onChangePriceInput([Number(e.target.value), price[1]]);
168
- }}
169
- placeholder="Min"
170
- type="number"
171
- min={0}
172
- className="big-input"
173
- onBlur={enableHotkeys}
174
- onFocus={disableHotkeys}
175
- />
176
- <AiFillCaretRight />
177
- <Input
178
- onChange={e => {
179
- setPrice([price[0], Number(e.target.value)]);
180
- onChangePriceInput([price[0], Number(e.target.value)]);
181
- }}
182
- placeholder="Max"
183
- type="number"
184
- min={0}
185
- className="big-input"
186
- onBlur={enableHotkeys}
187
- onFocus={disableHotkeys}
188
- />
189
- </div>
190
- </FilterInputsWrapper>
191
-
192
- <WrapperContainer>
193
- <StyledDropdown
194
- options={itemTypeOptions}
195
- onChange={onChangeType}
196
- width="95%"
197
- />
198
- <StyledDropdown
199
- options={itemRarityOptions}
200
- onChange={onChangeRarity}
201
- width="95%"
202
- />
203
- <StyledDropdown
204
- options={orderByOptions}
205
- onChange={onChangeOrder}
206
- width="100%"
207
- />
208
- </WrapperContainer>
209
- </OptionsWrapper>
210
-
211
- <ItemComponentScrollWrapper id="MarketContainer" ref={itemsContainer}>
212
- {items?.map(({ item, price, _id, owner }, index) => (
213
- <MarketplaceRows
214
- key={`${item.key}_${index}`}
215
- atlasIMG={atlasIMG}
216
- atlasJSON={atlasJSON}
217
- item={item}
218
- itemPrice={price}
219
- equipmentSet={equipmentSet}
220
- onMarketPlaceItemBuy={setBuyingItemId.bind(null, _id)}
221
- disabled={owner === characterId}
222
- />
223
- ))}
224
- </ItemComponentScrollWrapper>
225
- </>
226
- );
227
- };
228
-
229
- const InputWrapper = styled.div`
230
- width: 95%;
231
- display: flex !important;
232
- justify-content: flex-start;
233
- align-items: center;
234
- margin: auto;
235
-
236
- p {
237
- width: auto;
238
- margin-right: 20px;
239
- }
240
-
241
- input {
242
- width: 68%;
243
- height: 10px;
244
- }
245
- `;
246
-
247
- const OptionsWrapper = styled.div`
248
- width: 100%;
249
- height: 100px;
250
- `;
251
-
252
- const FilterInputsWrapper = styled.div`
253
- width: 95%;
254
- display: flex;
255
- justify-content: space-between;
256
- align-items: center;
257
- margin-bottom: 10px;
258
- margin-left: 10px;
259
- gap: 5px;
260
- color: white;
261
- flex-wrap: wrap;
262
-
263
- p {
264
- width: auto;
265
- margin: 0;
266
- }
267
-
268
- input {
269
- width: 75px;
270
- height: 10px;
271
- }
272
-
273
- .big-input {
274
- width: 130px;
275
- }
276
- `;
277
-
278
- const WrapperContainer = styled.div`
279
- display: grid;
280
- grid-template-columns: 40% 30% 30%;
281
- justify-content: space-between;
282
- width: calc(100% - 40px);
283
- margin-left: 10px;
284
-
285
- .rpgui-content .rpgui-dropdown-imp-header {
286
- padding: 0px 10px 0 !important;
287
- }
288
- `;
289
-
290
- const ItemComponentScrollWrapper = styled.div`
291
- overflow-y: scroll;
292
- height: 390px;
293
- width: 100%;
294
- margin-top: 1rem;
295
-
296
- @media (max-width: 950px) {
297
- height: 250px;
298
- }
299
- `;
300
-
301
- const StyledDropdown = styled(Dropdown)`
302
- margin: 3px !important;
303
- width: 170px !important;
304
- `;
1
+ import { IEquipmentSet, IMarketplaceItem } from '@rpg-engine/shared';
2
+ import React, { useState } from 'react';
3
+ import { AiFillCaretRight } from 'react-icons/ai';
4
+ import styled from 'styled-components';
5
+ import { ConfirmModal } from '../ConfirmModal';
6
+ import { Dropdown } from '../Dropdown';
7
+ import { Input } from '../Input';
8
+ import { MarketplaceRows } from './MarketplaceRows';
9
+ import { itemRarityOptions, itemTypeOptions, orderByOptions } from './filters';
10
+
11
+ export interface IBuyPanelProps {
12
+ items: IMarketplaceItem[];
13
+ atlasJSON: any;
14
+ atlasIMG: any;
15
+ onClose: () => void;
16
+ onChangeType: (value: string) => void;
17
+ onChangeRarity: (value: string) => void;
18
+ onChangeOrder: (value: string) => void;
19
+ onChangeNameInput: (value: string) => void;
20
+ onChangeMainLevelInput: (
21
+ value: [number | undefined, number | undefined]
22
+ ) => void;
23
+ onChangeSecondaryLevelInput: (
24
+ value: [number | undefined, number | undefined]
25
+ ) => void;
26
+ onChangePriceInput: (value: [number | undefined, number | undefined]) => void;
27
+ scale?: number;
28
+ equipmentSet?: IEquipmentSet | null;
29
+ onMarketPlaceItemBuy?: (marketPlaceItemId: string) => void;
30
+ characterId: string;
31
+ enableHotkeys?: () => void;
32
+ disableHotkeys?: () => void;
33
+ }
34
+
35
+ export const BuyPanel: React.FC<IBuyPanelProps> = ({
36
+ items,
37
+ atlasIMG,
38
+ atlasJSON,
39
+ onChangeType,
40
+ onChangeRarity,
41
+ onChangeOrder,
42
+ onChangeNameInput,
43
+ onChangeMainLevelInput,
44
+ onChangeSecondaryLevelInput,
45
+ onChangePriceInput,
46
+ equipmentSet,
47
+ onMarketPlaceItemBuy,
48
+ characterId,
49
+ enableHotkeys,
50
+ disableHotkeys,
51
+ }) => {
52
+ const [name, setName] = useState('');
53
+ const [mainLevel, setMainLevel] = useState<
54
+ [number | undefined, number | undefined]
55
+ >([undefined, undefined]);
56
+ const [secondaryLevel, setSecondaryLevel] = useState<
57
+ [number | undefined, number | undefined]
58
+ >([undefined, undefined]);
59
+ const [price, setPrice] = useState<[number | undefined, number | undefined]>([
60
+ undefined,
61
+ undefined,
62
+ ]);
63
+ const [buyingItemId, setBuyingItemId] = useState<string | null>(null);
64
+
65
+ return (
66
+ <>
67
+ {buyingItemId && (
68
+ <ConfirmModal
69
+ onClose={setBuyingItemId.bind(null, null)}
70
+ onConfirm={() => {
71
+ onMarketPlaceItemBuy?.(buyingItemId);
72
+ setBuyingItemId(null);
73
+ enableHotkeys?.();
74
+ }}
75
+ message="Are you sure to buy this item?"
76
+ />
77
+ )}
78
+ <InputWrapper>
79
+ <p>Search By Name</p>
80
+ <Input
81
+ onChange={e => {
82
+ setName(e.target.value);
83
+ onChangeNameInput(e.target.value);
84
+ }}
85
+ value={name}
86
+ placeholder="Enter name..."
87
+ onBlur={enableHotkeys}
88
+ onFocus={disableHotkeys}
89
+ />
90
+ </InputWrapper>
91
+
92
+ <OptionsWrapper>
93
+ <FilterInputsWrapper>
94
+ <div>
95
+ <p>Main level</p>
96
+ <Input
97
+ onChange={e => {
98
+ setMainLevel([Number(e.target.value), mainLevel[1]]);
99
+ onChangeMainLevelInput([Number(e.target.value), mainLevel[1]]);
100
+ }}
101
+ placeholder="Min"
102
+ type="number"
103
+ min={0}
104
+ onBlur={enableHotkeys}
105
+ onFocus={disableHotkeys}
106
+ />
107
+ <AiFillCaretRight />
108
+ <Input
109
+ onChange={e => {
110
+ setMainLevel([mainLevel[0], Number(e.target.value)]);
111
+ onChangeMainLevelInput([mainLevel[0], Number(e.target.value)]);
112
+ }}
113
+ placeholder="Max"
114
+ type="number"
115
+ min={0}
116
+ onBlur={enableHotkeys}
117
+ onFocus={disableHotkeys}
118
+ />
119
+ </div>
120
+
121
+ <div>
122
+ <p>Secondary level</p>
123
+ <Input
124
+ onChange={e => {
125
+ setSecondaryLevel([Number(e.target.value), secondaryLevel[1]]);
126
+ onChangeSecondaryLevelInput([
127
+ Number(e.target.value),
128
+ secondaryLevel[1],
129
+ ]);
130
+ }}
131
+ placeholder="Min"
132
+ type="number"
133
+ min={0}
134
+ onBlur={enableHotkeys}
135
+ onFocus={disableHotkeys}
136
+ />
137
+ <AiFillCaretRight />
138
+ <Input
139
+ onChange={e => {
140
+ setSecondaryLevel([secondaryLevel[0], Number(e.target.value)]);
141
+ onChangeSecondaryLevelInput([
142
+ secondaryLevel[0],
143
+ Number(e.target.value),
144
+ ]);
145
+ }}
146
+ placeholder="Max"
147
+ type="number"
148
+ min={0}
149
+ onBlur={enableHotkeys}
150
+ onFocus={disableHotkeys}
151
+ />
152
+ </div>
153
+
154
+ <div>
155
+ <p>Price</p>
156
+ <Input
157
+ onChange={e => {
158
+ setPrice([Number(e.target.value), price[1]]);
159
+ onChangePriceInput([Number(e.target.value), price[1]]);
160
+ }}
161
+ placeholder="Min"
162
+ type="number"
163
+ min={0}
164
+ className="big-input"
165
+ onBlur={enableHotkeys}
166
+ onFocus={disableHotkeys}
167
+ />
168
+ <AiFillCaretRight />
169
+ <Input
170
+ onChange={e => {
171
+ setPrice([price[0], Number(e.target.value)]);
172
+ onChangePriceInput([price[0], Number(e.target.value)]);
173
+ }}
174
+ placeholder="Max"
175
+ type="number"
176
+ min={0}
177
+ className="big-input"
178
+ onBlur={enableHotkeys}
179
+ onFocus={disableHotkeys}
180
+ />
181
+ </div>
182
+ </FilterInputsWrapper>
183
+
184
+ <WrapperContainer>
185
+ <StyledDropdown
186
+ options={itemTypeOptions}
187
+ onChange={onChangeType}
188
+ width="95%"
189
+ />
190
+ <StyledDropdown
191
+ options={itemRarityOptions}
192
+ onChange={onChangeRarity}
193
+ width="95%"
194
+ />
195
+ <StyledDropdown
196
+ options={orderByOptions}
197
+ onChange={onChangeOrder}
198
+ width="100%"
199
+ />
200
+ </WrapperContainer>
201
+ </OptionsWrapper>
202
+
203
+ <ItemComponentScrollWrapper id="MarketContainer">
204
+ {items?.map(({ item, price, _id, owner }, index) => (
205
+ <MarketplaceRows
206
+ key={`${item.key}_${index}`}
207
+ atlasIMG={atlasIMG}
208
+ atlasJSON={atlasJSON}
209
+ item={item}
210
+ itemPrice={price}
211
+ equipmentSet={equipmentSet}
212
+ onMarketPlaceItemBuy={setBuyingItemId.bind(null, _id)}
213
+ disabled={owner === characterId}
214
+ />
215
+ ))}
216
+ </ItemComponentScrollWrapper>
217
+ </>
218
+ );
219
+ };
220
+
221
+ const InputWrapper = styled.div`
222
+ width: 95%;
223
+ display: flex !important;
224
+ justify-content: flex-start;
225
+ align-items: center;
226
+ margin: auto;
227
+
228
+ p {
229
+ width: auto;
230
+ margin-right: 20px;
231
+ }
232
+
233
+ input {
234
+ width: 68%;
235
+ height: 10px;
236
+ }
237
+ `;
238
+
239
+ const OptionsWrapper = styled.div`
240
+ width: 100%;
241
+ height: 100px;
242
+ `;
243
+
244
+ const FilterInputsWrapper = styled.div`
245
+ width: 95%;
246
+ display: flex;
247
+ justify-content: space-between;
248
+ align-items: center;
249
+ margin-bottom: 10px;
250
+ margin-left: 10px;
251
+ gap: 5px;
252
+ color: white;
253
+ flex-wrap: wrap;
254
+
255
+ p {
256
+ width: auto;
257
+ margin: 0;
258
+ }
259
+
260
+ input {
261
+ width: 75px;
262
+ height: 10px;
263
+ }
264
+
265
+ .big-input {
266
+ width: 130px;
267
+ }
268
+ `;
269
+
270
+ const WrapperContainer = styled.div`
271
+ display: grid;
272
+ grid-template-columns: 40% 30% 30%;
273
+ justify-content: space-between;
274
+ width: calc(100% - 40px);
275
+ margin-left: 10px;
276
+
277
+ .rpgui-content .rpgui-dropdown-imp-header {
278
+ padding: 0px 10px 0 !important;
279
+ }
280
+ `;
281
+
282
+ const ItemComponentScrollWrapper = styled.div`
283
+ overflow-y: scroll;
284
+ height: 390px;
285
+ width: 100%;
286
+ margin-top: 1rem;
287
+
288
+ @media (max-width: 950px) {
289
+ height: 250px;
290
+ }
291
+ `;
292
+
293
+ const StyledDropdown = styled(Dropdown)`
294
+ margin: 3px !important;
295
+ width: 170px !important;
296
+ `;