A View for collections. Contains logic for switching between various views.
({ resource }: ResourcePageProps)
| 45 | |
| 46 | /** A View for collections. Contains logic for switching between various views. */ |
| 47 | function 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); |
nothing calls this directly
no test coverage detected