Skip to content

Commit adc6e6d

Browse files
committed
refactor(tsx): convert Filtering Pagination and Search components
1 parent 43933e5 commit adc6e6d

File tree

3 files changed

+40
-28
lines changed

3 files changed

+40
-28
lines changed

src/ui/components/Filtering/Filtering.jsx renamed to src/ui/components/Filtering/Filtering.tsx

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,44 @@
11
import React, { useState } from 'react';
22
import './Filtering.css';
33

4-
const Filtering = ({ onFilterChange }) => {
5-
const [isOpen, setIsOpen] = useState(false); // State to toggle dropdown open/close
6-
const [selectedOption, setSelectedOption] = useState('Sort by'); // Initial state
7-
const [sortOrder, setSortOrder] = useState('asc'); // Track sort order (asc/desc)
4+
export type FilterOption = 'Date Modified' | 'Date Created' | 'Alphabetical' | 'Sort by';
5+
export type SortOrder = 'asc' | 'desc';
6+
7+
interface FilteringProps {
8+
onFilterChange: (option: FilterOption, order: SortOrder) => void;
9+
}
10+
11+
const Filtering: React.FC<FilteringProps> = ({ onFilterChange }) => {
12+
const [isOpen, setIsOpen] = useState(false);
13+
const [selectedOption, setSelectedOption] = useState<FilterOption>('Sort by');
14+
const [sortOrder, setSortOrder] = useState<SortOrder>('asc');
815

916
const toggleDropdown = () => {
10-
setIsOpen(!isOpen); // Toggle dropdown open/close state
17+
setIsOpen(!isOpen);
1118
};
1219

13-
const toggleSortOrder = () => {
14-
// Toggle sort order only if an option is selected
20+
const toggleSortOrder = (e: React.MouseEvent) => {
21+
e.stopPropagation();
1522
if (selectedOption !== 'Sort by') {
1623
const newSortOrder = sortOrder === 'asc' ? 'desc' : 'asc';
1724
setSortOrder(newSortOrder);
18-
onFilterChange(selectedOption, newSortOrder); // Trigger filtering with new order
25+
onFilterChange(selectedOption, newSortOrder);
1926
}
2027
};
2128

22-
const handleOptionClick = (option) => {
23-
// Handle filter option selection
29+
const handleOptionClick = (option: FilterOption) => {
2430
setSelectedOption(option);
25-
onFilterChange(option, sortOrder); // Call the parent function with selected filter and order
26-
setIsOpen(false); // Collapse the dropdown after selection
31+
onFilterChange(option, sortOrder);
32+
setIsOpen(false);
2733
};
2834

2935
return (
3036
<div className='filtering-container'>
3137
<div className='dropdown'>
32-
{/* Make the entire button clickable for toggling dropdown */}
3338
<button onClick={toggleDropdown} className='dropdown-toggle'>
3439
{selectedOption}
35-
{/* Render the up/down arrow next to selected option */}
3640
{selectedOption !== 'Sort by' && (
37-
<span
38-
onClick={(e) => {
39-
e.stopPropagation();
40-
toggleSortOrder();
41-
}}
42-
>
43-
{sortOrder === 'asc' ? ' ↑' : ' ↓'}
44-
</span>
41+
<span onClick={toggleSortOrder}>{sortOrder === 'asc' ? ' ↑' : ' ↓'}</span>
4542
)}
4643
<span className='dropdown-arrow'></span>
4744
</button>

src/ui/components/Pagination/Pagination.jsx renamed to src/ui/components/Pagination/Pagination.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
import React from 'react';
22
import './Pagination.css';
33

4-
export default function Pagination({ currentPage, totalItems = 0, itemsPerPage, onPageChange }) {
4+
interface PaginationProps {
5+
currentPage: number;
6+
totalItems?: number;
7+
itemsPerPage: number;
8+
onPageChange: (page: number) => void;
9+
}
10+
11+
const Pagination: React.FC<PaginationProps> = ({
12+
currentPage,
13+
totalItems = 0,
14+
itemsPerPage,
15+
onPageChange,
16+
}) => {
517
const totalPages = Math.ceil(totalItems / itemsPerPage);
618

7-
const handlePageClick = (page) => {
19+
const handlePageClick = (page: number) => {
820
if (page >= 1 && page <= totalPages) {
921
onPageChange(page);
1022
}
@@ -27,10 +39,12 @@ export default function Pagination({ currentPage, totalItems = 0, itemsPerPage,
2739
<button
2840
className='pageButton'
2941
onClick={() => handlePageClick(currentPage + 1)}
30-
disabled={currentPage === totalPages}
42+
disabled={currentPage === totalPages || totalPages === 0}
3143
>
3244
Next
3345
</button>
3446
</div>
3547
);
36-
}
48+
};
49+
50+
export default Pagination;

src/ui/components/Search/Search.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import SearchIcon from '@material-ui/icons/Search';
66

77
interface SearchProps {
88
onSearch: (query: string) => void;
9+
placeholder?: string;
910
}
1011

11-
const Search: React.FC<SearchProps> = ({ onSearch }) => {
12+
const Search: React.FC<SearchProps> = ({ onSearch, placeholder = 'Search...' }) => {
1213
const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {
1314
const query = event.target.value;
1415
onSearch(query);
@@ -22,7 +23,7 @@ const Search: React.FC<SearchProps> = ({ onSearch }) => {
2223
fullWidth
2324
margin='normal'
2425
onChange={handleSearchChange}
25-
placeholder='Search...'
26+
placeholder={placeholder}
2627
InputProps={{
2728
startAdornment: (
2829
<InputAdornment position='start'>

0 commit comments

Comments
 (0)