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 ? (