MCPcopy Create free account
hub / github.com/atomicdata-dev/atomic-data-browser / Collection

Function Collection

data-browser/src/views/CollectionPage.tsx:47–225  ·  view source on GitHub ↗

A View for collections. Contains logic for switching between various views.

({ resource }: ResourcePageProps)

Source from the content-addressed store, hash-verified

45
46/** A View for collections. Contains logic for switching between various views. */
47function Collection({ resource }: ResourcePageProps): JSX.Element {
48 const title = useTitle(resource);
49 const [description] = useString(resource, properties.description);
50 const viewportWidth = useViewport();
51 // If a user is on a smaller screen, it's probably best to show a Cardlist
52 const defaultView = viewportWidth < 700 ? 0 : 1;
53 const [displayStyleIndex, setDisplayStyle] = useLocalStorage(
54 'CollectionDisplayStyle',
55 defaultView,
56 );
57 const [members] = useArray(resource, properties.collection.members);
58 const [valueFilter] = useString(resource, properties.collection.value);
59 const [propertyFilter] = useString(resource, properties.collection.property);
60 // We use the currentPage and totalpages from the Collection Resource itself - not the query param. This gives us a default value.
61 const [currentPage] = useNumber(resource, properties.collection.currentPage);
62 const [totalPages] = useNumber(resource, properties.collection.totalPages);
63 // Query parameters for Collections
64 const [, setPage] = useSubjectParam('current_page');
65 const [sortBy, setSortBy] = useSubjectParam('sort_by');
66
67 // We kind of assume here that all Collections will be filtered by an `is-a` prop and `Class` value.
68 // But we can also have a collection of thing that share the same creator.
69 // If that happens, we need a different approach to rendering the Headers
70 const classResource = useResource(valueFilter);
71 const [requiredProps] = useArray(classResource, properties.requires);
72 const [recommendedProps] = useArray(classResource, properties.recommends);
73 const propsArrayFull = requiredProps.concat(recommendedProps);
74
75 // Info about the current Class
76 const [classDescription] = useString(classResource, properties.description);
77 const [classTitle] = useString(classResource, properties.shortname);
78 const [showClassDescription, setShowClassDescription] = React.useState(false);
79
80 const isClass = valueFilter && propertyFilter == properties.isA;
81
82 const store = useStore();
83
84 React.useEffect(() => {
85 // Always refresh the collection when opening this page.
86 // We don't have cool collection invalidation yet.
87 store.fetchResource(resource.getSubject());
88 }, []);
89
90 function handleToggleView() {
91 setDisplayStyle(getNextDisplayStyleIndex());
92 }
93
94 function getNextDisplayStyleIndex() {
95 let newIndex = displayStyleIndex + 1;
96 if (newIndex >= displayStyles.length) {
97 newIndex = 0;
98 }
99 return newIndex;
100 }
101
102 function handlePrevPage() {
103 if (currentPage !== 0) {
104 setPage(currentPage - 1);

Callers

nothing calls this directly

Calls 13

useTitleFunction · 0.90
useStringFunction · 0.90
useViewportFunction · 0.90
useLocalStorageFunction · 0.90
useArrayFunction · 0.90
useNumberFunction · 0.90
useSubjectParamFunction · 0.90
useResourceFunction · 0.90
useStoreFunction · 0.90
getNextDisplayStyleIndexFunction · 0.85
fetchResourceMethod · 0.80
getSubjectMethod · 0.80

Tested by

no test coverage detected