@rpg-engine/long-bow 0.3.96 → 0.3.98

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 (182) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/CircularController/CircularController.d.ts +1 -0
  4. package/dist/components/Shortcuts/Shortcuts.d.ts +1 -0
  5. package/dist/components/Shortcuts/useShortcutCooldown.d.ts +4 -0
  6. package/dist/components/Spellbook/Spell.d.ts +5 -4
  7. package/dist/components/Spellbook/Spellbook.d.ts +3 -2
  8. package/dist/components/Spellbook/cards/MobileSpellTooltip.d.ts +15 -0
  9. package/dist/components/Spellbook/cards/SpellInfo.d.ts +7 -0
  10. package/dist/components/Spellbook/cards/SpellInfoDisplay.d.ts +7 -0
  11. package/dist/components/Spellbook/cards/SpellInfoWrapper.d.ts +9 -0
  12. package/dist/components/Spellbook/cards/SpellTooltip.d.ts +6 -0
  13. package/dist/components/Spellbook/mockSpells.d.ts +2 -2
  14. package/dist/libs/CastingTypeHelper.d.ts +1 -0
  15. package/dist/long-bow.cjs.development.js +1525 -1255
  16. package/dist/long-bow.cjs.development.js.map +1 -1
  17. package/dist/long-bow.cjs.production.min.js +1 -1
  18. package/dist/long-bow.cjs.production.min.js.map +1 -1
  19. package/dist/long-bow.esm.js +1531 -1261
  20. package/dist/long-bow.esm.js.map +1 -1
  21. package/dist/stories/SpellInfoDisplay.stories.d.ts +8 -0
  22. package/package.json +100 -100
  23. package/src/.DS_Store +0 -0
  24. package/src/components/.DS_Store +0 -0
  25. package/src/components/Abstractions/ModalPortal.tsx +22 -22
  26. package/src/components/Abstractions/SlotsContainer.tsx +62 -62
  27. package/src/components/Arrow/SelectArrow.tsx +69 -69
  28. package/src/components/Arrow/img/arrow01-left-clicked.png +0 -0
  29. package/src/components/Arrow/img/arrow01-left.png +0 -0
  30. package/src/components/Arrow/img/arrow01-right-clicked.png +0 -0
  31. package/src/components/Arrow/img/arrow01-right.png +0 -0
  32. package/src/components/Arrow/img/arrow02-left-clicked.png +0 -0
  33. package/src/components/Arrow/img/arrow02-left.png +0 -0
  34. package/src/components/Arrow/img/arrow02-right-clicked.png +0 -0
  35. package/src/components/Arrow/img/arrow02-right.png +0 -0
  36. package/src/components/Button.tsx +40 -40
  37. package/src/components/Character/CharacterSelection.tsx +98 -98
  38. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  39. package/src/components/Chat/Chat.tsx +196 -196
  40. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  41. package/src/components/CheckButton.tsx +65 -65
  42. package/src/components/CircularController/CircularController.tsx +282 -249
  43. package/src/components/CraftBook/CraftBook.tsx +286 -286
  44. package/src/components/CraftBook/CraftingRecipe.tsx +161 -161
  45. package/src/components/CraftBook/MockItems.ts +101 -101
  46. package/src/components/DraggableContainer.tsx +180 -180
  47. package/src/components/DropdownSelectorContainer.tsx +42 -42
  48. package/src/components/Equipment/EquipmentSet.tsx +199 -199
  49. package/src/components/HistoryDialog.tsx +104 -104
  50. package/src/components/Input.tsx +15 -15
  51. package/src/components/InputRadio.tsx +41 -41
  52. package/src/components/Item/Cards/ItemInfo.tsx +298 -288
  53. package/src/components/Item/Cards/ItemInfoDisplay.tsx +135 -135
  54. package/src/components/Item/Cards/ItemInfoWrapper.tsx +62 -62
  55. package/src/components/Item/Cards/ItemTooltip.tsx +83 -83
  56. package/src/components/Item/Cards/MobileItemTooltip.tsx +149 -149
  57. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  58. package/src/components/Item/Inventory/ItemContainer.tsx +231 -231
  59. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  60. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  61. package/src/components/Item/Inventory/ItemSlot.tsx +580 -580
  62. package/src/components/Item/Inventory/itemContainerHelper.ts +175 -175
  63. package/src/components/ListMenu.tsx +63 -63
  64. package/src/components/Marketplace/Marketplace.tsx +132 -132
  65. package/src/components/Marketplace/MarketplaceRows.tsx +171 -171
  66. package/src/components/Marketplace/__mocks__/index.tsx +65 -65
  67. package/src/components/Multitab/Tab.tsx +66 -66
  68. package/src/components/Multitab/TabBody.tsx +13 -13
  69. package/src/components/Multitab/TabsContainer.tsx +97 -97
  70. package/src/components/NPCDialog/.DS_Store +0 -0
  71. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  72. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  73. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  74. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  75. package/src/components/NPCDialog/img/.DS_Store +0 -0
  76. package/src/components/ProgressBar.tsx +92 -92
  77. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  78. package/src/components/QuestInfo/QuestInfo.tsx +233 -233
  79. package/src/components/QuestList.tsx +135 -135
  80. package/src/components/RPGUIContainer.tsx +47 -47
  81. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  82. package/src/components/RPGUIRoot.tsx +14 -14
  83. package/src/components/RadioButton.tsx +53 -53
  84. package/src/components/RadioInput/RadioButton.tsx +96 -96
  85. package/src/components/RadioInput/RadioInput.tsx +102 -102
  86. package/src/components/RadioInput/instruments.ts +15 -15
  87. package/src/components/RangeSlider.tsx +78 -78
  88. package/src/components/RelativeListMenu.tsx +90 -90
  89. package/src/components/ScrollList.tsx +79 -79
  90. package/src/components/Shortcuts/Shortcuts.tsx +192 -153
  91. package/src/components/Shortcuts/ShortcutsSetter.tsx +139 -139
  92. package/src/components/Shortcuts/SingleShortcut.ts +82 -62
  93. package/src/components/Shortcuts/useShortcutCooldown.ts +24 -0
  94. package/src/components/SimpleProgressBar.tsx +62 -62
  95. package/src/components/SkillProgressBar.tsx +133 -133
  96. package/src/components/SkillsContainer.tsx +206 -206
  97. package/src/components/Spellbook/Spell.tsx +236 -201
  98. package/src/components/Spellbook/Spellbook.tsx +159 -153
  99. package/src/components/Spellbook/cards/MobileSpellTooltip.tsx +137 -0
  100. package/src/components/Spellbook/cards/SpellInfo.tsx +132 -0
  101. package/src/components/Spellbook/cards/SpellInfoDisplay.tsx +31 -0
  102. package/src/components/Spellbook/cards/SpellInfoWrapper.tsx +48 -0
  103. package/src/components/Spellbook/cards/SpellTooltip.tsx +70 -0
  104. package/src/components/Spellbook/constants.ts +8 -8
  105. package/src/components/Spellbook/mockSpells.ts +85 -60
  106. package/src/components/StaticBook/StaticBook.tsx +103 -103
  107. package/src/components/TextArea.tsx +11 -11
  108. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  109. package/src/components/TimeWidget/TimeWidget.tsx +65 -65
  110. package/src/components/TradingMenu/TradingItemRow.tsx +199 -199
  111. package/src/components/TradingMenu/TradingMenu.tsx +219 -219
  112. package/src/components/TradingMenu/items.mock.ts +48 -48
  113. package/src/components/Truncate.tsx +25 -25
  114. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  115. package/src/components/shared/Column.tsx +16 -16
  116. package/src/components/shared/Ellipsis.tsx +68 -68
  117. package/src/components/shared/SpriteFromAtlas.tsx +104 -104
  118. package/src/components/typography/DynamicText.tsx +49 -49
  119. package/src/constants/uiColors.ts +20 -20
  120. package/src/constants/uiDevices.ts +3 -3
  121. package/src/constants/uiFonts.ts +12 -12
  122. package/src/hooks/useEventListener.ts +21 -21
  123. package/src/hooks/useOutsideAlerter.ts +25 -25
  124. package/src/index.tsx +42 -42
  125. package/src/libs/CastingTypeHelper.ts +8 -0
  126. package/src/libs/StringHelpers.ts +3 -3
  127. package/src/libs/itemCounter.ts +21 -21
  128. package/src/mocks/.DS_Store +0 -0
  129. package/src/mocks/atlas/.DS_Store +0 -0
  130. package/src/mocks/atlas/entities/entities.json +20215 -20215
  131. package/src/mocks/atlas/icons/icons.json +735 -735
  132. package/src/mocks/atlas/items/items.json +12086 -12086
  133. package/src/mocks/equipmentSet.mocks.ts +391 -391
  134. package/src/mocks/itemContainer.mocks.ts +605 -605
  135. package/src/mocks/skills.mocks.ts +128 -128
  136. package/src/stories/Arrow.stories.tsx +26 -26
  137. package/src/stories/Button.stories.tsx +36 -36
  138. package/src/stories/CharacterSelection.stories.tsx +44 -44
  139. package/src/stories/CharacterStatus.stories.tsx +29 -29
  140. package/src/stories/Chat.stories.tsx +187 -187
  141. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  142. package/src/stories/CheckButton.stories.tsx +48 -48
  143. package/src/stories/CircullarController.stories.tsx +37 -37
  144. package/src/stories/CraftBook.stories.tsx +42 -42
  145. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  146. package/src/stories/DraggableContainer.stories.tsx +28 -28
  147. package/src/stories/Dropdown.stories.tsx +46 -46
  148. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  149. package/src/stories/EquipmentSet.stories.tsx +65 -65
  150. package/src/stories/HistoryDialog.stories.tsx +61 -61
  151. package/src/stories/ItemContainer.stories.tsx +201 -201
  152. package/src/stories/ItemInfoDisplay.stories.tsx +33 -33
  153. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  154. package/src/stories/ItemSelector.stories.tsx +77 -77
  155. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  156. package/src/stories/ListMenu.stories.tsx +56 -56
  157. package/src/stories/Marketplace.stories.tsx +42 -42
  158. package/src/stories/MarketplaceRows.stories.tsx +28 -28
  159. package/src/stories/Multitab.stories.tsx +51 -51
  160. package/src/stories/NPCDialog.stories.tsx +130 -130
  161. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  162. package/src/stories/ProgressBar.stories.tsx +23 -23
  163. package/src/stories/PropertySelect.stories.tsx +40 -40
  164. package/src/stories/QuestInfo.stories.tsx +107 -107
  165. package/src/stories/QuestList.stories.tsx +82 -82
  166. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  167. package/src/stories/RadioButton.stories.tsx +49 -49
  168. package/src/stories/RadioInput.stories.tsx +34 -34
  169. package/src/stories/RangeSlider.stories.tsx +64 -64
  170. package/src/stories/ScrollList.stories.tsx +85 -85
  171. package/src/stories/Shortcuts.stories.tsx +39 -39
  172. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  173. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  174. package/src/stories/SkillsContainer.stories.tsx +35 -35
  175. package/src/stories/SpellInfoDisplay.stories.tsx +27 -0
  176. package/src/stories/Spellbook.stories.tsx +104 -104
  177. package/src/stories/StaticBook.stories.tsx +32 -32
  178. package/src/stories/Text.stories.tsx +42 -42
  179. package/src/stories/TimeWidget.stories.tsx +27 -27
  180. package/src/stories/TradingMenu.stories.tsx +47 -47
  181. package/src/types/eventTypes.ts +4 -4
  182. package/src/types/index.d.ts +2 -2
@@ -1,106 +1,106 @@
1
- import React, { useEffect, useState } from 'react';
2
- import styled from 'styled-components';
3
- import { uiFonts } from '../../constants/uiFonts';
4
- import SelectArrow from '../Arrow/SelectArrow';
5
- import { Ellipsis } from '../shared/Ellipsis';
6
-
7
- export interface IPropertySelectProps {
8
- availableProperties: Array<IPropertiesProps>;
9
- selectedProperty?: IPropertiesProps;
10
- children?: React.ReactNode;
11
- onChange: (selectedProperty: IPropertiesProps) => void;
12
- }
13
-
14
- export interface IPropertiesProps {
15
- id: string;
16
- name: string;
17
- }
18
-
19
- export const PropertySelect: React.FC<IPropertySelectProps> = ({
20
- availableProperties,
21
- onChange,
22
- }) => {
23
- const [currentIndex, setCurrentIndex] = useState(0);
24
- const propertiesLength = availableProperties.length - 1;
25
-
26
- const onLeftClick = () => {
27
- if (currentIndex === 0) setCurrentIndex(propertiesLength);
28
- else setCurrentIndex(index => index - 1);
29
- };
30
- const onRightClick = () => {
31
- if (currentIndex === propertiesLength) setCurrentIndex(0);
32
- else setCurrentIndex(index => index + 1);
33
- };
34
-
35
- useEffect(() => {
36
- onChange(availableProperties[currentIndex]);
37
- }, [currentIndex]);
38
-
39
- useEffect(() => {
40
- setCurrentIndex(0);
41
- }, [JSON.stringify(availableProperties)]);
42
-
43
- const getCurrentSelectionName = () => {
44
- const item = availableProperties[currentIndex];
45
- if (item) {
46
- return item.name;
47
- }
48
- return '';
49
- };
50
-
51
- return (
52
- <Container>
53
- <TextOverlay>
54
- <p>
55
- <Item>
56
- <Ellipsis maxLines={1} maxWidth="60%" center>
57
- {getCurrentSelectionName()}
58
- </Ellipsis>
59
- </Item>
60
- </p>
61
- </TextOverlay>
62
- <div className="rpgui-progress-track"></div>
63
-
64
- <SelectArrow direction="left" onPointerDown={onLeftClick}></SelectArrow>
65
- <SelectArrow direction="right" onPointerDown={onRightClick}></SelectArrow>
66
- </Container>
67
- );
68
- };
69
-
70
- const Item = styled.span`
71
- font-size: 1rem;
72
- color: white;
73
- text-align: center;
74
- z-index: 1;
75
- position: absolute;
76
- top: 12px;
77
- width: 100%;
78
-
79
- p {
80
- margin: 0 auto;
81
- font-size: ${uiFonts.size.small};
82
- }
83
- `;
84
-
85
- const TextOverlay = styled.div`
86
- width: 100%;
87
- position: relative;
88
- `;
89
-
90
- interface IContainerProps {
91
- percentageWidth?: number;
92
- minWidth?: number;
93
- style?: Record<string, any>;
94
- }
95
-
96
- const Container = styled.div<IContainerProps>`
97
- position: relative;
98
- display: flex;
99
- flex-direction: column;
100
- justify-content: start;
101
- align-items: flex-start;
102
- min-width: 100px;
103
- width: 40%;
104
- `;
105
-
106
- export default PropertySelect;
1
+ import React, { useEffect, useState } from 'react';
2
+ import styled from 'styled-components';
3
+ import { uiFonts } from '../../constants/uiFonts';
4
+ import SelectArrow from '../Arrow/SelectArrow';
5
+ import { Ellipsis } from '../shared/Ellipsis';
6
+
7
+ export interface IPropertySelectProps {
8
+ availableProperties: Array<IPropertiesProps>;
9
+ selectedProperty?: IPropertiesProps;
10
+ children?: React.ReactNode;
11
+ onChange: (selectedProperty: IPropertiesProps) => void;
12
+ }
13
+
14
+ export interface IPropertiesProps {
15
+ id: string;
16
+ name: string;
17
+ }
18
+
19
+ export const PropertySelect: React.FC<IPropertySelectProps> = ({
20
+ availableProperties,
21
+ onChange,
22
+ }) => {
23
+ const [currentIndex, setCurrentIndex] = useState(0);
24
+ const propertiesLength = availableProperties.length - 1;
25
+
26
+ const onLeftClick = () => {
27
+ if (currentIndex === 0) setCurrentIndex(propertiesLength);
28
+ else setCurrentIndex(index => index - 1);
29
+ };
30
+ const onRightClick = () => {
31
+ if (currentIndex === propertiesLength) setCurrentIndex(0);
32
+ else setCurrentIndex(index => index + 1);
33
+ };
34
+
35
+ useEffect(() => {
36
+ onChange(availableProperties[currentIndex]);
37
+ }, [currentIndex]);
38
+
39
+ useEffect(() => {
40
+ setCurrentIndex(0);
41
+ }, [JSON.stringify(availableProperties)]);
42
+
43
+ const getCurrentSelectionName = () => {
44
+ const item = availableProperties[currentIndex];
45
+ if (item) {
46
+ return item.name;
47
+ }
48
+ return '';
49
+ };
50
+
51
+ return (
52
+ <Container>
53
+ <TextOverlay>
54
+ <p>
55
+ <Item>
56
+ <Ellipsis maxLines={1} maxWidth="60%" center>
57
+ {getCurrentSelectionName()}
58
+ </Ellipsis>
59
+ </Item>
60
+ </p>
61
+ </TextOverlay>
62
+ <div className="rpgui-progress-track"></div>
63
+
64
+ <SelectArrow direction="left" onPointerDown={onLeftClick}></SelectArrow>
65
+ <SelectArrow direction="right" onPointerDown={onRightClick}></SelectArrow>
66
+ </Container>
67
+ );
68
+ };
69
+
70
+ const Item = styled.span`
71
+ font-size: 1rem;
72
+ color: white;
73
+ text-align: center;
74
+ z-index: 1;
75
+ position: absolute;
76
+ top: 12px;
77
+ width: 100%;
78
+
79
+ p {
80
+ margin: 0 auto;
81
+ font-size: ${uiFonts.size.small};
82
+ }
83
+ `;
84
+
85
+ const TextOverlay = styled.div`
86
+ width: 100%;
87
+ position: relative;
88
+ `;
89
+
90
+ interface IContainerProps {
91
+ percentageWidth?: number;
92
+ minWidth?: number;
93
+ style?: Record<string, any>;
94
+ }
95
+
96
+ const Container = styled.div<IContainerProps>`
97
+ position: relative;
98
+ display: flex;
99
+ flex-direction: column;
100
+ justify-content: start;
101
+ align-items: flex-start;
102
+ min-width: 100px;
103
+ width: 40%;
104
+ `;
105
+
106
+ export default PropertySelect;
@@ -1,233 +1,233 @@
1
- import { IQuest } from '@rpg-engine/shared';
2
- import React, { useEffect, useState } from 'react';
3
- import styled from 'styled-components';
4
- import { uiColors } from '../../constants/uiColors';
5
- import { uiFonts } from '../../constants/uiFonts';
6
- import SelectArrow from '../Arrow/SelectArrow';
7
- import { Button, ButtonTypes } from '../Button';
8
- import { DraggableContainer } from '../DraggableContainer';
9
-
10
- import { RPGUIContainerTypes } from '../RPGUIContainer';
11
- import { Column } from '../shared/Column';
12
- import thumbnailDefault from './img/default.png';
13
-
14
- export interface IQuestsButtonProps {
15
- disabled: boolean;
16
- title: string;
17
- onClick: (questId: string, npcId: string) => void;
18
- }
19
-
20
- export interface IQuestInfoProps {
21
- onClose?: () => void;
22
- buttons?: IQuestsButtonProps[];
23
- quests: IQuest[];
24
- onChangeQuest: (currentQuestIndex: number, currentQuestId: string) => void;
25
- scale?: number;
26
- }
27
-
28
- export const QuestInfo: React.FC<IQuestInfoProps> = ({
29
- quests,
30
- onClose,
31
- buttons,
32
- onChangeQuest,
33
- scale,
34
- }) => {
35
- const [currentIndex, setCurrentIndex] = useState(0);
36
- const questsLength = quests.length - 1;
37
-
38
- useEffect(() => {
39
- if (onChangeQuest) {
40
- onChangeQuest(currentIndex, quests[currentIndex]._id);
41
- }
42
- }, [currentIndex]);
43
-
44
- const onLeftClick = () => {
45
- if (currentIndex === 0) setCurrentIndex(questsLength);
46
- else setCurrentIndex(index => index - 1);
47
- };
48
- const onRightClick = () => {
49
- if (currentIndex === questsLength) setCurrentIndex(0);
50
- else setCurrentIndex(index => index + 1);
51
- };
52
-
53
- return (
54
- <QuestDraggableContainer
55
- type={RPGUIContainerTypes.Framed}
56
- onCloseButton={() => {
57
- if (onClose) onClose();
58
- }}
59
- width="730px"
60
- cancelDrag=".equipment-container-body .arrow-selector"
61
- scale={scale}
62
- >
63
- {quests.length >= 2 ? (
64
- <QuestsContainer>
65
- {currentIndex !== 0 && (
66
- <SelectArrow
67
- direction="left"
68
- onPointerDown={onLeftClick}
69
- ></SelectArrow>
70
- )}
71
- {currentIndex !== quests.length - 1 && (
72
- <SelectArrow
73
- direction="right"
74
- onPointerDown={onRightClick}
75
- ></SelectArrow>
76
- )}
77
-
78
- <QuestContainer>
79
- <TitleContainer className="drag-handler">
80
- <Title>
81
- <Thumbnail
82
- src={quests[currentIndex].thumbnail || thumbnailDefault}
83
- />
84
- {quests[currentIndex].title}
85
- </Title>
86
- <QuestSplitDiv>
87
- <hr className="golden" />
88
- </QuestSplitDiv>
89
- </TitleContainer>
90
- <Content>
91
- <p>{quests[currentIndex].description}</p>
92
- </Content>
93
- <QuestColumn className="dark-background" justifyContent="flex-end">
94
- {buttons &&
95
- buttons.map((button, index) => (
96
- <Button
97
- key={index}
98
- onPointerDown={() =>
99
- button.onClick(
100
- quests[currentIndex]._id,
101
- quests[currentIndex].npcId
102
- )
103
- }
104
- disabled={button.disabled}
105
- buttonType={ButtonTypes.RPGUIButton}
106
- id={`button-${index}`}
107
- >
108
- {button.title}
109
- </Button>
110
- ))}
111
- </QuestColumn>
112
- </QuestContainer>
113
- </QuestsContainer>
114
- ) : (
115
- <QuestsContainer>
116
- <QuestContainer>
117
- <TitleContainer className="drag-handler">
118
- <Title>
119
- <Thumbnail src={quests[0].thumbnail || thumbnailDefault} />
120
- {quests[0].title}
121
- </Title>
122
- <QuestSplitDiv>
123
- <hr className="golden" />
124
- </QuestSplitDiv>
125
- </TitleContainer>
126
- <Content>
127
- <p>{quests[0].description}</p>
128
- </Content>
129
- <QuestColumn className="dark-background" justifyContent="flex-end">
130
- {buttons &&
131
- buttons.map((button, index) => (
132
- <Button
133
- key={index}
134
- onPointerDown={() =>
135
- button.onClick(quests[0]._id, quests[0].npcId)
136
- }
137
- disabled={button.disabled}
138
- buttonType={ButtonTypes.RPGUIButton}
139
- id={`button-${index}`}
140
- >
141
- {button.title}
142
- </Button>
143
- ))}
144
- </QuestColumn>
145
- </QuestContainer>
146
- </QuestsContainer>
147
- )}
148
- </QuestDraggableContainer>
149
- );
150
- };
151
-
152
- const QuestDraggableContainer = styled(DraggableContainer)`
153
- border: 1px solid black;
154
- width: 600px;
155
- padding: 0 0 0 0 !important;
156
- .DraggableContainer__TitleContainer-sc-184mpyl-2 {
157
- height: auto;
158
- }
159
- .container-close {
160
- position: absolute;
161
- margin-left: auto;
162
- top: 20px;
163
- padding-right: 5px;
164
- }
165
- img {
166
- display: inline-block;
167
- vertical-align: middle;
168
- line-height: normal;
169
- }
170
- `;
171
-
172
- const QuestContainer = styled.div`
173
- margin-right: 40px;
174
- margin-left: 40px;
175
- `;
176
-
177
- const QuestsContainer = styled.div`
178
- display: flex;
179
- align-items: center;
180
- `;
181
-
182
- const Content = styled.div`
183
- padding: 18px;
184
- h1 {
185
- text-align: left;
186
- margin: 14px 0px;
187
- }
188
- `;
189
-
190
- const QuestSplitDiv = styled.div`
191
- width: 100%;
192
- font-size: 11px;
193
- margin-bottom: 10px;
194
- hr {
195
- margin: 0px;
196
- padding: 0px;
197
- }
198
- p {
199
- margin-bottom: 0px;
200
- }
201
- `;
202
-
203
- const QuestColumn = styled(Column)`
204
- padding-top: 5px;
205
- margin-bottom: 20px;
206
- display: flex;
207
- justify-content: space-evenly;
208
- `;
209
-
210
- const TitleContainer = styled.div`
211
- width: 100%;
212
- display: flex;
213
- flex-wrap: wrap;
214
- justify-content: flex-start;
215
- align-items: center;
216
- margin-top: 1rem;
217
- `;
218
-
219
- const Title = styled.h1`
220
- color: white;
221
- z-index: 22;
222
- font-size: ${uiFonts.size.medium} !important;
223
- color: ${uiColors.yellow} !important;
224
- `;
225
-
226
- const Thumbnail = styled.img`
227
- color: white;
228
- z-index: 22;
229
- width: 32px * 1.5;
230
- margin-right: 0.5rem;
231
- position: relative;
232
- top: -4px;
233
- `;
1
+ import { IQuest } from '@rpg-engine/shared';
2
+ import React, { useEffect, useState } from 'react';
3
+ import styled from 'styled-components';
4
+ import { uiColors } from '../../constants/uiColors';
5
+ import { uiFonts } from '../../constants/uiFonts';
6
+ import SelectArrow from '../Arrow/SelectArrow';
7
+ import { Button, ButtonTypes } from '../Button';
8
+ import { DraggableContainer } from '../DraggableContainer';
9
+
10
+ import { RPGUIContainerTypes } from '../RPGUIContainer';
11
+ import { Column } from '../shared/Column';
12
+ import thumbnailDefault from './img/default.png';
13
+
14
+ export interface IQuestsButtonProps {
15
+ disabled: boolean;
16
+ title: string;
17
+ onClick: (questId: string, npcId: string) => void;
18
+ }
19
+
20
+ export interface IQuestInfoProps {
21
+ onClose?: () => void;
22
+ buttons?: IQuestsButtonProps[];
23
+ quests: IQuest[];
24
+ onChangeQuest: (currentQuestIndex: number, currentQuestId: string) => void;
25
+ scale?: number;
26
+ }
27
+
28
+ export const QuestInfo: React.FC<IQuestInfoProps> = ({
29
+ quests,
30
+ onClose,
31
+ buttons,
32
+ onChangeQuest,
33
+ scale,
34
+ }) => {
35
+ const [currentIndex, setCurrentIndex] = useState(0);
36
+ const questsLength = quests.length - 1;
37
+
38
+ useEffect(() => {
39
+ if (onChangeQuest) {
40
+ onChangeQuest(currentIndex, quests[currentIndex]._id);
41
+ }
42
+ }, [currentIndex]);
43
+
44
+ const onLeftClick = () => {
45
+ if (currentIndex === 0) setCurrentIndex(questsLength);
46
+ else setCurrentIndex(index => index - 1);
47
+ };
48
+ const onRightClick = () => {
49
+ if (currentIndex === questsLength) setCurrentIndex(0);
50
+ else setCurrentIndex(index => index + 1);
51
+ };
52
+
53
+ return (
54
+ <QuestDraggableContainer
55
+ type={RPGUIContainerTypes.Framed}
56
+ onCloseButton={() => {
57
+ if (onClose) onClose();
58
+ }}
59
+ width="730px"
60
+ cancelDrag=".equipment-container-body .arrow-selector"
61
+ scale={scale}
62
+ >
63
+ {quests.length >= 2 ? (
64
+ <QuestsContainer>
65
+ {currentIndex !== 0 && (
66
+ <SelectArrow
67
+ direction="left"
68
+ onPointerDown={onLeftClick}
69
+ ></SelectArrow>
70
+ )}
71
+ {currentIndex !== quests.length - 1 && (
72
+ <SelectArrow
73
+ direction="right"
74
+ onPointerDown={onRightClick}
75
+ ></SelectArrow>
76
+ )}
77
+
78
+ <QuestContainer>
79
+ <TitleContainer className="drag-handler">
80
+ <Title>
81
+ <Thumbnail
82
+ src={quests[currentIndex].thumbnail || thumbnailDefault}
83
+ />
84
+ {quests[currentIndex].title}
85
+ </Title>
86
+ <QuestSplitDiv>
87
+ <hr className="golden" />
88
+ </QuestSplitDiv>
89
+ </TitleContainer>
90
+ <Content>
91
+ <p>{quests[currentIndex].description}</p>
92
+ </Content>
93
+ <QuestColumn className="dark-background" justifyContent="flex-end">
94
+ {buttons &&
95
+ buttons.map((button, index) => (
96
+ <Button
97
+ key={index}
98
+ onPointerDown={() =>
99
+ button.onClick(
100
+ quests[currentIndex]._id,
101
+ quests[currentIndex].npcId
102
+ )
103
+ }
104
+ disabled={button.disabled}
105
+ buttonType={ButtonTypes.RPGUIButton}
106
+ id={`button-${index}`}
107
+ >
108
+ {button.title}
109
+ </Button>
110
+ ))}
111
+ </QuestColumn>
112
+ </QuestContainer>
113
+ </QuestsContainer>
114
+ ) : (
115
+ <QuestsContainer>
116
+ <QuestContainer>
117
+ <TitleContainer className="drag-handler">
118
+ <Title>
119
+ <Thumbnail src={quests[0].thumbnail || thumbnailDefault} />
120
+ {quests[0].title}
121
+ </Title>
122
+ <QuestSplitDiv>
123
+ <hr className="golden" />
124
+ </QuestSplitDiv>
125
+ </TitleContainer>
126
+ <Content>
127
+ <p>{quests[0].description}</p>
128
+ </Content>
129
+ <QuestColumn className="dark-background" justifyContent="flex-end">
130
+ {buttons &&
131
+ buttons.map((button, index) => (
132
+ <Button
133
+ key={index}
134
+ onPointerDown={() =>
135
+ button.onClick(quests[0]._id, quests[0].npcId)
136
+ }
137
+ disabled={button.disabled}
138
+ buttonType={ButtonTypes.RPGUIButton}
139
+ id={`button-${index}`}
140
+ >
141
+ {button.title}
142
+ </Button>
143
+ ))}
144
+ </QuestColumn>
145
+ </QuestContainer>
146
+ </QuestsContainer>
147
+ )}
148
+ </QuestDraggableContainer>
149
+ );
150
+ };
151
+
152
+ const QuestDraggableContainer = styled(DraggableContainer)`
153
+ border: 1px solid black;
154
+ width: 600px;
155
+ padding: 0 0 0 0 !important;
156
+ .DraggableContainer__TitleContainer-sc-184mpyl-2 {
157
+ height: auto;
158
+ }
159
+ .container-close {
160
+ position: absolute;
161
+ margin-left: auto;
162
+ top: 20px;
163
+ padding-right: 5px;
164
+ }
165
+ img {
166
+ display: inline-block;
167
+ vertical-align: middle;
168
+ line-height: normal;
169
+ }
170
+ `;
171
+
172
+ const QuestContainer = styled.div`
173
+ margin-right: 40px;
174
+ margin-left: 40px;
175
+ `;
176
+
177
+ const QuestsContainer = styled.div`
178
+ display: flex;
179
+ align-items: center;
180
+ `;
181
+
182
+ const Content = styled.div`
183
+ padding: 18px;
184
+ h1 {
185
+ text-align: left;
186
+ margin: 14px 0px;
187
+ }
188
+ `;
189
+
190
+ const QuestSplitDiv = styled.div`
191
+ width: 100%;
192
+ font-size: 11px;
193
+ margin-bottom: 10px;
194
+ hr {
195
+ margin: 0px;
196
+ padding: 0px;
197
+ }
198
+ p {
199
+ margin-bottom: 0px;
200
+ }
201
+ `;
202
+
203
+ const QuestColumn = styled(Column)`
204
+ padding-top: 5px;
205
+ margin-bottom: 20px;
206
+ display: flex;
207
+ justify-content: space-evenly;
208
+ `;
209
+
210
+ const TitleContainer = styled.div`
211
+ width: 100%;
212
+ display: flex;
213
+ flex-wrap: wrap;
214
+ justify-content: flex-start;
215
+ align-items: center;
216
+ margin-top: 1rem;
217
+ `;
218
+
219
+ const Title = styled.h1`
220
+ color: white;
221
+ z-index: 22;
222
+ font-size: ${uiFonts.size.medium} !important;
223
+ color: ${uiColors.yellow} !important;
224
+ `;
225
+
226
+ const Thumbnail = styled.img`
227
+ color: white;
228
+ z-index: 22;
229
+ width: 32px * 1.5;
230
+ margin-right: 0.5rem;
231
+ position: relative;
232
+ top: -4px;
233
+ `;