From 607e91e8cff768ea1f80e8bde250d1ba37debeb3 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 3 Apr 2023 12:56:29 -0400 Subject: [PATCH] Refactor Group Layout selection --- .../components/discover/layout-buttons.tsx | 42 +++++++++++++++++++ .../components/discover/search/results.tsx | 42 +++++-------------- app/soapbox/features/groups/popular.tsx | 40 ++++-------------- app/soapbox/features/groups/suggested.tsx | 40 ++++-------------- 4 files changed, 68 insertions(+), 96 deletions(-) create mode 100644 app/soapbox/features/groups/components/discover/layout-buttons.tsx diff --git a/app/soapbox/features/groups/components/discover/layout-buttons.tsx b/app/soapbox/features/groups/components/discover/layout-buttons.tsx new file mode 100644 index 000000000..eecdfaf83 --- /dev/null +++ b/app/soapbox/features/groups/components/discover/layout-buttons.tsx @@ -0,0 +1,42 @@ +import clsx from 'clsx'; +import React from 'react'; + +import { HStack, Icon } from 'soapbox/components/ui'; + +enum GroupLayout { + LIST = 'LIST', + GRID = 'GRID' +} + +interface ILayoutButtons { + layout: GroupLayout + onSelect(layout: GroupLayout): void +} + +const LayoutButtons = ({ layout, onSelect }: ILayoutButtons) => ( + + + + + +); + +export { LayoutButtons as default, GroupLayout }; \ No newline at end of file diff --git a/app/soapbox/features/groups/components/discover/search/results.tsx b/app/soapbox/features/groups/components/discover/search/results.tsx index 14e1e5a67..9df350375 100644 --- a/app/soapbox/features/groups/components/discover/search/results.tsx +++ b/app/soapbox/features/groups/components/discover/search/results.tsx @@ -3,22 +3,19 @@ import React, { useCallback, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import { Components, Virtuoso, VirtuosoGrid } from 'react-virtuoso'; -import { HStack, Icon, Stack, Text } from 'soapbox/components/ui'; +import { HStack, Stack, Text } from 'soapbox/components/ui'; import { useGroupSearch } from 'soapbox/hooks/api'; -import { Group } from 'soapbox/types/entities'; import GroupGridItem from '../group-grid-item'; import GroupListItem from '../group-list-item'; +import LayoutButtons, { GroupLayout } from '../layout-buttons'; + +import type { Group } from 'soapbox/types/entities'; interface Props { groupSearchResult: ReturnType } -enum Layout { - LIST = 'LIST', - GRID = 'GRID' -} - const GridList: Components['List'] = React.forwardRef((props, ref) => { const { context, ...rest } = props; return
; @@ -27,7 +24,7 @@ const GridList: Components['List'] = React.forwardRef((props, ref) => { export default (props: Props) => { const { groupSearchResult } = props; - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, isFetching, fetchNextPage } = groupSearchResult; @@ -65,32 +62,13 @@ export default (props: Props) => { /> - - - - - + setLayout(selectedLayout)} + /> - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? ( { const { context, ...rest } = props; return
; }); - const Popular: React.FC = () => { const intl = useIntl(); - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, fetchNextPage } = usePopularGroups(); @@ -61,32 +56,13 @@ const Popular: React.FC = () => { - - - - + setLayout(selectedLayout)} + /> } > - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? ( { const { context, ...rest } = props; return
; }); - const Suggested: React.FC = () => { const intl = useIntl(); - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, fetchNextPage } = useSuggestedGroups(); @@ -61,32 +56,13 @@ const Suggested: React.FC = () => { - - - - + setLayout(selectedLayout)} + /> } > - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? (