Skip to content

Commit 7f569e5

Browse files
committed
We now have a drop down component
1 parent 48e788c commit 7f569e5

File tree

5 files changed

+44
-23
lines changed

5 files changed

+44
-23
lines changed

resources/js/game/components/side-peeks/character-inventory/usable-items/usable-items.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import BaseInventoryItemDefinition from '../api-definitions/base-inventory-item-
1010

1111
import { GameDataError } from 'game-data/components/game-data-error';
1212

13+
import Dropdown from 'ui/drop-down/drop-down';
14+
import { DropdownItem } from 'ui/drop-down/types/drop-down-item';
1315
import Input from 'ui/input/input';
1416
import InfiniteLoader from 'ui/loading-bar/infinite-loader';
15-
import Dropdown from "ui/drop-down/drop-down";
16-
import {DropdownItem} from "ui/drop-down/types/drop-down-item";
1717

1818
const UsableItems = ({ character_id }: UsableItemsProps) => {
1919
const { data, error, loading, setSearchText, setFilters, onEndReached } =
@@ -42,7 +42,7 @@ const UsableItems = ({ character_id }: UsableItemsProps) => {
4242

4343
const handleClearFilters = () => {
4444
setFilters({});
45-
}
45+
};
4646

4747
if (error) {
4848
return <GameDataError />;
@@ -59,13 +59,17 @@ const UsableItems = ({ character_id }: UsableItemsProps) => {
5959
<Input on_change={onSearch} clearable />
6060
</div>
6161
<div className="pb-4 px-4 mt-4">
62-
<Dropdown items={[
63-
{'Increase Stats': 'increase-stats'},
64-
{'Effects Skills': 'effects-skills'},
65-
{'Effects Base Modifiers': 'effects-base-modifiers'},
66-
{'Damages Kingdoms': 'damages-kingdoms'},
67-
{'Holy Oils': 'holy-oils'}
68-
]} on_select={handleFilterChange} on_clear={handleClearFilters} />
62+
<Dropdown
63+
items={[
64+
{ 'Increase Stats': 'increase-stats' },
65+
{ 'Effects Skills': 'effects-skills' },
66+
{ 'Effects Base Modifiers': 'effects-base-modifiers' },
67+
{ 'Damages Kingdoms': 'damages-kingdoms' },
68+
{ 'Holy Oils': 'holy-oils' },
69+
]}
70+
on_select={handleFilterChange}
71+
on_clear={handleClearFilters}
72+
/>
6973
</div>
7074
<div className="flex-1 min-h-0">
7175
<UsableItemsList

resources/js/ui/drop-down/drop-down.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
import { isEmpty } from 'lodash';
12
import React, { ReactNode, useRef, useState, useEffect } from 'react';
3+
24
import DropdownProps from 'ui/drop-down/types/drop-down-props';
3-
import { isEmpty } from 'lodash';
45

5-
const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownProps) => {
6+
const Dropdown = ({
7+
items,
8+
on_select,
9+
all_click_outside,
10+
on_clear,
11+
}: DropdownProps) => {
612
const [open, setOpen] = useState(false);
713
const [selected, setSelected] = useState('');
814
const [focusedIndex, setFocusedIndex] = useState<number | null>(null);
@@ -21,10 +27,14 @@ const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownPro
2127
if (!open) return;
2228
if (e.key === 'ArrowDown') {
2329
e.preventDefault();
24-
setFocusedIndex((prev) => (prev === null || prev === items.length - 1 ? 0 : prev + 1));
30+
setFocusedIndex((prev) =>
31+
prev === null || prev === items.length - 1 ? 0 : prev + 1
32+
);
2533
} else if (e.key === 'ArrowUp') {
2634
e.preventDefault();
27-
setFocusedIndex((prev) => (prev === null || prev === 0 ? items.length - 1 : prev - 1));
35+
setFocusedIndex((prev) =>
36+
prev === null || prev === 0 ? items.length - 1 : prev - 1
37+
);
2838
} else if (e.key === 'Enter' || e.key === ' ') {
2939
e.preventDefault();
3040
if (focusedIndex !== null) {
@@ -51,7 +61,9 @@ const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownPro
5161

5262
const renderDropdownIcon = (): ReactNode => {
5363
if (isEmpty(selected)) {
54-
return <i className="fas fa-chevron-down text-gray-500 dark:text-gray-300"></i>;
64+
return (
65+
<i className="fas fa-chevron-down text-gray-500 dark:text-gray-300"></i>
66+
);
5567
}
5668

5769
return (
@@ -85,7 +97,7 @@ const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownPro
8597
setFocusedIndex(null);
8698
}}
8799
className={`px-4 py-2 cursor-pointer ${
88-
focusedIndex === idx ? 'bg-gray-200 dark:bg-gray-700' : ''
100+
focusedIndex === idx ? 'bg-gray-200 dark:bg-gray-700 rounded-md' : ''
89101
} hover:bg-gray-200 dark:hover:bg-gray-700`}
90102
>
91103
{label}
@@ -102,7 +114,9 @@ const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownPro
102114
id="dropdown-listbox"
103115
role="listbox"
104116
ref={listRef}
105-
aria-activedescendant={focusedIndex !== null ? `dropdown-item-${focusedIndex}` : undefined}
117+
aria-activedescendant={
118+
focusedIndex !== null ? `dropdown-item-${focusedIndex}` : undefined
119+
}
106120
className="absolute z-50 w-full mt-1 max-h-60 overflow-auto border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-900 text-black dark:text-white"
107121
>
108122
{renderItemsForDropdown()}
@@ -127,7 +141,9 @@ const Dropdown = ({ items, on_select, all_click_outside, on_clear }: DropdownPro
127141
onClick={() => setOpen((prev) => !prev)}
128142
className="w-full p-2 pr-10 pl-3 rounded-md border border-gray-500 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 flex items-center relative"
129143
>
130-
<span className="flex-1 truncate">{selected || 'Select an option'}</span>
144+
<span className="flex-1 truncate">
145+
{selected || 'Select an option'}
146+
</span>
131147
<span className="absolute right-3 top-1/2 -translate-y-1/2">
132148
{renderDropdownIcon()}
133149
</span>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export type DropdownItem = Record<string, string | number>;
1+
export type DropdownItem = Record<string, string | number>;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import {DropdownItem} from "ui/drop-down/types/drop-down-item";
1+
import { DropdownItem } from 'ui/drop-down/types/drop-down-item';
22

33
export default interface DropdownProps {
44
items: DropdownItem[];
55
on_select: (item: DropdownItem) => void;
66
on_clear: () => void;
77
all_click_outside?: boolean;
8-
};
8+
}

resources/js/ui/input/input.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useRef } from 'react';
2+
23
import InputProps from 'ui/input/types/input-props';
34

45
const Input = ({ on_change, clearable }: InputProps) => {
@@ -28,8 +29,8 @@ const Input = ({ on_change, clearable }: InputProps) => {
2829
>
2930
<i className="fas fa-times"></i>
3031
</button>
31-
)
32-
}
32+
);
33+
};
3334

3435
return (
3536
<div className="relative w-full">

0 commit comments

Comments
 (0)