diff --git a/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx b/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx
index b3624865..278200e1 100644
--- a/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx
+++ b/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx
@@ -8,6 +8,7 @@ import {
Text,
Textarea,
TextInput,
+ ThemeIcon,
} from '@mantine/core';
import { useForm } from '@mantine/form';
import { notifications } from '@mantine/notifications';
@@ -23,11 +24,13 @@ import { track } from '@vercel/analytics';
import useMyCollections from '@/features/collections/lib/queries/useMyCollections';
import { isMarginUri, getMarginUrl } from '@/lib/utils/margin';
import MarginLogo from '@/components/MarginLogo';
+import { Collection, CollectionAccessType } from '@semble/types';
+import { FaSeedling } from 'react-icons/fa6';
interface Props {
isOpen: boolean;
onClose: () => void;
- selectedCollection?: SelectableCollectionItem;
+ selectedCollection?: Collection;
initialUrl?: string;
}
@@ -176,6 +179,15 @@ export default function AddCardDrawer(props: Props) {
rightSection={
isMarginUri(col.uri) ? (
+ ) : col.accessType === CollectionAccessType.OPEN ? (
+
+
+
) : undefined
}
onClick={() => {
diff --git a/src/webapp/features/cards/components/addCardToModal/AddCardToModalContent.tsx b/src/webapp/features/cards/components/addCardToModal/AddCardToModalContent.tsx
index a58ac8e1..cbd8b7b1 100644
--- a/src/webapp/features/cards/components/addCardToModal/AddCardToModalContent.tsx
+++ b/src/webapp/features/cards/components/addCardToModal/AddCardToModalContent.tsx
@@ -1,6 +1,6 @@
'use client';
-import type { UrlCard } from '@semble/types';
+import type { Collection, UrlCard } from '@semble/types';
import { Stack } from '@mantine/core';
import { notifications } from '@mantine/notifications';
import { useState } from 'react';
@@ -13,12 +13,6 @@ import useAddCard from '@/features/cards/lib/mutations/useAddCard';
import { track } from '@vercel/analytics';
import AddCardActions from '../addCardActions/AddCardActions';
-interface SelectableCollectionItem {
- id: string;
- name: string;
- cardCount: number;
-}
-
interface Props {
onClose: () => void;
url: string;
@@ -49,7 +43,7 @@ export default function AddCardToModalContent(props: Props) {
);
const [selectedCollections, setSelectedCollections] =
- useState(collectionsWithCard);
+ useState(collectionsWithCard);
const isSaving = addCard.isPending || updateCardAssociations.isPending;
diff --git a/src/webapp/features/collections/components/collectionActions/CollectionActions.tsx b/src/webapp/features/collections/components/collectionActions/CollectionActions.tsx
index d61a01dc..2f6abf83 100644
--- a/src/webapp/features/collections/components/collectionActions/CollectionActions.tsx
+++ b/src/webapp/features/collections/components/collectionActions/CollectionActions.tsx
@@ -1,4 +1,4 @@
-import { CollectionAccessType } from '@semble/types';
+import { Collection, CollectionAccessType } from '@semble/types';
import { Group, Menu, ActionIcon, CopyButton, Button } from '@mantine/core';
import EditCollectionModal from '../editCollectionModal/EditCollectionModal';
import DeleteCollectionModal from '../deleteCollectionModal/DeleteCollectionModal';
@@ -12,14 +12,9 @@ import { notifications } from '@mantine/notifications';
import { useFeatureFlags } from '@/lib/clientFeatureFlags';
interface Props {
- id: string;
- rkey: string;
- name: string;
- description?: string;
- accessType?: CollectionAccessType;
- authorHandle: string;
- cardCount: number;
- uri?: string;
+ collection: Collection & {
+ rkey: string;
+ };
}
export default function CollectionActions(props: Props) {
@@ -29,17 +24,18 @@ export default function CollectionActions(props: Props) {
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [showAddDrawer, setShowAddDrawer] = useState(false);
- const isAuthor = user?.handle === props.authorHandle;
+ const isAuthor = user?.handle === props.collection.author?.handle;
const shareLink =
typeof window !== 'undefined'
- ? `${window.location.origin}/profile/${props.authorHandle}/collections/${props.rkey}`
+ ? `${window.location.origin}/profile/${props.collection.author?.handle}/collections/${props.collection.rkey}`
: '';
return (
{isAuthenticated &&
- (props.accessType === CollectionAccessType.OPEN || isAuthor) &&
+ (props.collection.accessType === CollectionAccessType.OPEN ||
+ isAuthor) &&
(featureFlags?.openCollections || isAuthor) && (
diff --git a/src/webapp/features/collections/components/collectionSelector/CollectionSelector.tsx b/src/webapp/features/collections/components/collectionSelector/CollectionSelector.tsx
index 3cb76f89..2c747167 100644
--- a/src/webapp/features/collections/components/collectionSelector/CollectionSelector.tsx
+++ b/src/webapp/features/collections/components/collectionSelector/CollectionSelector.tsx
@@ -6,6 +6,7 @@ import CollectionSelectorMyCollections from '../collectionSelectorMyCollections/
import CollectionSelectorOpenCollections from '../collectionSelectorOpenCollections/CollectionSelectorOpenCollections';
import { useFeatureFlags } from '@/lib/clientFeatureFlags';
import classes from './TabItem.module.css';
+import { Collection } from '@semble/types';
interface Props {
isOpen: boolean;
@@ -13,10 +14,8 @@ interface Props {
onCancel: () => void;
onSave: (e: React.FormEvent) => void;
isSaving?: boolean;
- selectedCollections: SelectableCollectionItem[];
- onSelectedCollectionsChange: (
- collectionIds: SelectableCollectionItem[],
- ) => void;
+ selectedCollections: Collection[];
+ onSelectedCollectionsChange: (collectionIds: Collection[]) => void;
}
export default function CollectionSelector(props: Props) {
diff --git a/src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.tsx b/src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.tsx
index f2493b45..87f52d19 100644
--- a/src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.tsx
+++ b/src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.tsx
@@ -1,47 +1,49 @@
-import { CheckboxCard, CheckboxIndicator, Group, Text } from '@mantine/core';
+import {
+ CheckboxCard,
+ CheckboxIndicator,
+ Group,
+ Text,
+ ThemeIcon,
+} from '@mantine/core';
import classes from './CollectionSelectorItem.module.css';
import { isMarginUri, getMarginUrl } from '@/lib/utils/margin';
import MarginLogo from '@/components/MarginLogo';
+import { Collection, CollectionAccessType } from '@semble/types';
+import { FaSeedling } from 'react-icons/fa6';
interface Props {
- value: string;
- name: string;
+ collection: Collection;
checked: boolean;
- cardCount: number;
- onChange: (checked: boolean, item: SelectableCollectionItem) => void;
- uri?: string;
- authorHandle?: string;
+ onChange: (checked: boolean, item: Collection) => void;
}
export default function CollectionSelectorItem(props: Props) {
- const marginUrl = getMarginUrl(props.uri, props.authorHandle);
+ const marginUrl = getMarginUrl(
+ props.collection.uri,
+ props.collection.author?.handle,
+ );
return (
- props.onChange(checked, {
- id: props.value,
- name: props.name,
- cardCount: props.cardCount,
- uri: props.uri,
- author: props.authorHandle
- ? { handle: props.authorHandle }
- : undefined,
- })
- }
+ onChange={(checked) => props.onChange(checked, props.collection)}
>
+ {props.collection.accessType === CollectionAccessType.OPEN && (
+
+
+
+ )}
- {props.name} {'·'} {props.cardCount}{' '}
- {props.cardCount === 1 ? 'card' : 'cards'}
+ {props.collection.name} {'·'} {props.collection.cardCount}{' '}
+ {props.collection.cardCount === 1 ? 'card' : 'cards'}
- {isMarginUri(props.uri) && (
+ {isMarginUri(props.collection.uri) && (
)}
diff --git a/src/webapp/features/collections/components/collectionSelectorItemList/CollectionSelectorItemList.tsx b/src/webapp/features/collections/components/collectionSelectorItemList/CollectionSelectorItemList.tsx
index a9a396f6..77536cb1 100644
--- a/src/webapp/features/collections/components/collectionSelectorItemList/CollectionSelectorItemList.tsx
+++ b/src/webapp/features/collections/components/collectionSelectorItemList/CollectionSelectorItemList.tsx
@@ -1,16 +1,7 @@
import React, { Fragment } from 'react';
import CollectionSelectorItem from '../collectionSelectorItem/CollectionSelectorItem';
import { Stack } from '@mantine/core';
-
-interface Collection {
- id: string;
- name: string;
- cardCount: number;
- uri?: string;
- author?: {
- handle: string;
- };
-}
+import { Collection } from '@semble/types';
interface Props {
collections: Collection[];
@@ -24,13 +15,9 @@ export default function CollectionSelectorItemList(props: Props) {
{props.collections.map((c) => (
col.id === c.id)}
onChange={(checked) => props.onChange(checked, c)}
- uri={c.uri}
- authorHandle={c.author?.handle}
/>
))}
diff --git a/src/webapp/features/collections/components/collectionSelectorMyCollections/CollectionSelectorMyCollections.tsx b/src/webapp/features/collections/components/collectionSelectorMyCollections/CollectionSelectorMyCollections.tsx
index 1cb6b5fa..e6223a34 100644
--- a/src/webapp/features/collections/components/collectionSelectorMyCollections/CollectionSelectorMyCollections.tsx
+++ b/src/webapp/features/collections/components/collectionSelectorMyCollections/CollectionSelectorMyCollections.tsx
@@ -18,12 +18,11 @@ import useCollectionSearch from '../../lib/queries/useCollectionSearch';
import useMyCollections from '../../lib/queries/useMyCollections';
import CollectionSelectorError from '../collectionSelector/Error.CollectionSelector';
import CreateCollectionDrawer from '../createCollectionDrawer/CreateCollectionDrawer';
+import { Collection } from '@semble/types';
interface Props {
- selectedCollections: SelectableCollectionItem[];
- onSelectedCollectionsChange: (
- collectionIds: SelectableCollectionItem[],
- ) => void;
+ selectedCollections: Collection[];
+ onSelectedCollectionsChange: (collectionIds: Collection[]) => void;
}
export default function CollectionSelectorMyCollections(props: Props) {
@@ -44,10 +43,7 @@ export default function CollectionSelectorMyCollections(props: Props) {
(c) => !props.selectedCollections.some((sel) => sel.id === c.id),
);
- const handleCollectionChange = (
- checked: boolean,
- item: SelectableCollectionItem,
- ) => {
+ const handleCollectionChange = (checked: boolean, item: Collection) => {
if (checked) {
if (!props.selectedCollections.some((col) => col.id === item.id)) {
props.onSelectedCollectionsChange([...props.selectedCollections, item]);
@@ -184,7 +180,7 @@ export default function CollectionSelectorMyCollections(props: Props) {
onCreate={(newCollection) => {
props.onSelectedCollectionsChange([
...props.selectedCollections,
- newCollection,
+ newCollection as Collection,
]);
setSearch('');
}}
diff --git a/src/webapp/features/collections/components/collectionSelectorOpenCollections/CollectionSelectorOpenCollections.tsx b/src/webapp/features/collections/components/collectionSelectorOpenCollections/CollectionSelectorOpenCollections.tsx
index 05a95961..09d551fd 100644
--- a/src/webapp/features/collections/components/collectionSelectorOpenCollections/CollectionSelectorOpenCollections.tsx
+++ b/src/webapp/features/collections/components/collectionSelectorOpenCollections/CollectionSelectorOpenCollections.tsx
@@ -17,13 +17,11 @@ import { useDebouncedValue } from '@mantine/hooks';
import CollectionSelectorError from '../collectionSelector/Error.CollectionSelector';
import CreateCollectionDrawer from '../createCollectionDrawer/CreateCollectionDrawer';
import useSearchCollections from '../../lib/queries/useSearchCollections';
-import { CollectionAccessType } from '@semble/types';
+import { Collection, CollectionAccessType } from '@semble/types';
interface Props {
- selectedCollections: SelectableCollectionItem[];
- onSelectedCollectionsChange: (
- collectionIds: SelectableCollectionItem[],
- ) => void;
+ selectedCollections: Collection[];
+ onSelectedCollectionsChange: (collectionIds: Collection[]) => void;
}
export default function CollectionSelectorOpenCollections(props: Props) {
@@ -50,10 +48,7 @@ export default function CollectionSelectorOpenCollections(props: Props) {
(c) => !props.selectedCollections.some((sel) => sel.id === c.id),
);
- const handleCollectionChange = (
- checked: boolean,
- item: SelectableCollectionItem,
- ) => {
+ const handleCollectionChange = (checked: boolean, item: Collection) => {
if (checked) {
if (!props.selectedCollections.some((col) => col.id === item.id)) {
props.onSelectedCollectionsChange([...props.selectedCollections, item]);
@@ -204,7 +199,7 @@ export default function CollectionSelectorOpenCollections(props: Props) {
onCreate={(newCollection) => {
props.onSelectedCollectionsChange([
...props.selectedCollections,
- newCollection,
+ newCollection as Collection,
]);
setSearch('');
}}
diff --git a/src/webapp/features/collections/components/createCollectionDrawer/CreateCollectionDrawer.tsx b/src/webapp/features/collections/components/createCollectionDrawer/CreateCollectionDrawer.tsx
index 6c2643aa..f2da2df3 100644
--- a/src/webapp/features/collections/components/createCollectionDrawer/CreateCollectionDrawer.tsx
+++ b/src/webapp/features/collections/components/createCollectionDrawer/CreateCollectionDrawer.tsx
@@ -1,4 +1,4 @@
-import { CollectionAccessType } from '@semble/types';
+import { Collection, CollectionAccessType } from '@semble/types';
import {
Button,
Container,
@@ -21,11 +21,9 @@ interface Props {
isOpen: boolean;
onClose: () => void;
initialName?: string;
- onCreate?: (newCollection: {
- id: string;
- name: string;
- cardCount: number;
- }) => void;
+ onCreate?: (
+ newCollection: Pick,
+ ) => void;
}
export default function createCollectionDrawer(props: Props) {
@@ -52,13 +50,12 @@ export default function createCollectionDrawer(props: Props) {
{
onSuccess: (newCollection) => {
props.onClose();
- if (newCollection) {
- props.onCreate &&
- props.onCreate({
- id: newCollection.collectionId,
- name: form.getValues().name,
- cardCount: 0,
- });
+ if (newCollection && props.onCreate) {
+ props.onCreate({
+ id: newCollection.collectionId,
+ name: form.getValues().name,
+ cardCount: 0,
+ });
}
},
onError: () => {
diff --git a/src/webapp/features/collections/containers/collectionContainer/CollectionContainer.tsx b/src/webapp/features/collections/containers/collectionContainer/CollectionContainer.tsx
index ec22cfd4..1c060d19 100644
--- a/src/webapp/features/collections/containers/collectionContainer/CollectionContainer.tsx
+++ b/src/webapp/features/collections/containers/collectionContainer/CollectionContainer.tsx
@@ -126,14 +126,10 @@ export default function CollectionContainer(props: Props) {
diff --git a/src/webapp/features/collections/containers/collectionContainerContent/CollectionContainerContent.tsx b/src/webapp/features/collections/containers/collectionContainerContent/CollectionContainerContent.tsx
index c56c7dcc..d31524c3 100644
--- a/src/webapp/features/collections/containers/collectionContainerContent/CollectionContainerContent.tsx
+++ b/src/webapp/features/collections/containers/collectionContainerContent/CollectionContainerContent.tsx
@@ -121,11 +121,7 @@ export default function CollectionContainerContent(props: Props) {
setShowAddDrawer(false)}
- selectedCollection={{
- id: firstPage.id,
- name: firstPage.name,
- cardCount: allCards.length,
- }}
+ selectedCollection={data.pages[0]}
/>
)}
diff --git a/src/webapp/features/collections/types/index.ts b/src/webapp/features/collections/types/index.ts
deleted file mode 100644
index e76c48dc..00000000
--- a/src/webapp/features/collections/types/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-interface SelectableCollectionItem {
- id: string;
- name: string;
- cardCount: number;
- uri?: string;
- author?: {
- handle: string;
- };
-}