in website/src/pages/ShowcaseCardPage.tsx [180:314]
export default function ShowcaseCardPage({
setActiveTags,
selectedTags,
location,
setSelectedTags,
readSearchTags,
replaceSearchTags,
setSelectedCheckbox,
}: {
setActiveTags: React.Dispatch<React.SetStateAction<TagType[]>>;
selectedTags: TagType[];
location;
setSelectedTags: React.Dispatch<React.SetStateAction<TagType[]>>;
readSearchTags: (search: string) => TagType[];
replaceSearchTags: (search: string, newTags: TagType[]) => string;
setSelectedCheckbox: React.Dispatch<React.SetStateAction<TagType[]>>;
}) {
const [selectedOptions, setSelectedOptions] = useState<string[]>([]);
const [loading, setLoading] = useState(true);
const [searchName, setSearchName] = useState<string | null>(null);
const [selectedUsers, setSelectedUsers] = useState<User[]>([]);
const history = useHistory();
const searchParams = new URLSearchParams(location.search);
const clearAll = () => {
setSelectedTags([]);
setSelectedCheckbox([]);
searchParams.delete("tags");
history.push({
...location,
search: searchParams.toString(),
state: prepareUserState(),
});
};
useEffect(() => {
setSelectedTags(readSearchTags(location.search));
setSelectedUsers(readSortChoice(selectedOptions[0]));
setSearchName(readSearchName(location.search));
restoreUserState(location.state);
setLoading(false);
}, [location, selectedOptions]);
var cards = useMemo(
() => filterUsers(selectedUsers, selectedTags, searchName),
[selectedUsers, selectedTags, searchName]
);
useEffect(() => {
const unionTags = new Set<TagType>();
cards.forEach((user) => {
const tags = [
...user.tags,
...(user.languages || []),
...(user.azureServices || []),
];
tags.forEach((tag) => unionTags.add(tag))
});
setActiveTags(Array.from(unionTags));
}, [cards]);
const sortByOnSelect = (event, data) => {
setLoading(true);
setSelectedOptions(data.selectedOptions);
};
const templateNumber = cards ? cards.length : 0;
return (
<>
<div
style={{
display: "flex",
alignItems: "center",
}}
>
<div
style={{
display: "flex",
gap: "4px",
flex: 1,
}}
>
<Text size={400}>Viewing</Text>
<Text size={400} weight="bold">
{templateNumber}
</Text>
{templateNumber != 1 ? (
<Text size={400}>templates</Text>
) : (
<Text size={400}>template</Text>
)}
{InputValue != null ? (
<>
<Text size={400}>for</Text>
<Text size={400} weight="bold">
'{InputValue}'
</Text>
</>
) : null}
</div>
<div
style={{
display: "flex",
gap: "8px",
alignItems: "center",
}}
>
<Text size={400}>Sort by: </Text>
<Combobox
style={{ minWidth: "unset" }}
input={{ style: { width: "130px" } }}
defaultValue={SORT_BY_OPTIONS[2]}
defaultSelectedOptions={[SORT_BY_OPTIONS[2]]}
aria-label="Sort by"
onOptionSelect={sortByOnSelect}
>
{SORT_BY_OPTIONS.map((option) => (
<Option key={option}>{option}</Option>
))}
</Combobox>
</div>
</div>
<FilterAppliedBar
clearAll={clearAll}
selectedTags={selectedTags}
readSearchTags={readSearchTags}
replaceSearchTags={replaceSearchTags}
/>
{loading ? (
<Spinner labelPosition="below" label="Loading..." />
) : (
<ShowcaseCards filteredUsers={cards} />
)}
</>
);
}