Skip to content
Snippets Groups Projects
index.tsx 3.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { useEffect, useState } from "react";
    
    import styles from "./style.module.scss";
    
    
    import { request } from "../../../utils/api"
    import { api } from "../../../constants/routes"
    
    import MyBreadcrumbs from "components/atoms/MyBreadcrumbs";
    
    import InputGroup from "react-bootstrap/InputGroup";
    import FormControl from "react-bootstrap/FormControl";
    
    import Button from "react-bootstrap/Button";
    
    import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
    
    import { faInfoCircle } from "@fortawesome/free-solid-svg-icons";
    
    import QuickAccessView from "components/molecules/QuickAccessView";
    import ResourcesFolderView from "components/molecules/ResourcesFolderView";
    
    danieldeng2's avatar
    danieldeng2 committed
    import CurrentDirectoryView from "components/molecules/CurrentDirectoryView";
    import { useParams } from "react-router-dom";
    
    export interface Resource {
      title: string;
      type: string;
      tags: string[];
      folder: string;
      id: number;
    }
    
    
    danieldeng2's avatar
    danieldeng2 committed
    const ModuleResources: React.FC<{ year: string}> = ({year}) => {
      let {id, scope } = useParams();
    
    danieldeng2's avatar
    danieldeng2 committed
      scope = scope === undefined ? "" : scope;
    
    	
    	const module_code = id.startsWith("CO") ? id.slice(2) : id;
    
    	//maybe refactor into class?
    	const [error, setError] = useState(null);
      const [isLoaded, setIsLoaded] = useState(false);
      const [resources, setResources] = useState<Resource[]>([]);
    
      let quickAccessItems = resources.filter(
    
    danieldeng2's avatar
    danieldeng2 committed
        ({ tags, folder }) =>
          tags.includes("new") && (scope === "" || scope === folder)
      );
    
    
      let currentDirectoryFiles = resources.filter(
    
    danieldeng2's avatar
    danieldeng2 committed
        ({ folder }) => folder === scope
    
      let folders: { title: string; id: number;}[] = Array.from(new Set<string>(resources.map((res: Resource) => { 
        return res.folder; }))).map((title: string) => {
          return {
            title: title,
            id: 0,
          };
        })
    
      useEffect(() => {
        setIsLoaded(false);
    
        const onSuccess = (data: { json: () => Promise<any>; }) => {
          let resourceArr : Resource[] = [];
          data.json().then(json => {
            for (const key in json) {
              let resource = json[key]
              resourceArr.push({
                title: resource.title,
                type: resource.type,
                tags: resource.tags,
                folder: resource.category,
                id: resource.id,
              } as Resource);
            }
            setResources(resourceArr);
            setIsLoaded(true);
          });
    
        const onFailure = (error: { text: () => Promise<any>; }) => {
          error.text().then(errorText => {
            setError(errorText);
            setIsLoaded(true);
          });
    
        request(api.MATERIALS_RESOURCES, "GET", onSuccess, onFailure, {
          "year": year,
          "course": module_code
        })
      }, [year, module_code]);
    
          <InputGroup>
            <FormControl
              className={styles.searchBar}
              aria-label="Search"
              placeholder="Search..."
            />
            <InputGroup.Append>
    
              <Button variant="secondary" className={styles.searchBarIcon}>
    
                <FontAwesomeIcon size="1x" icon={faInfoCircle} />
              </Button>
            </InputGroup.Append>
    
          {isLoaded ? (
          error ? <> Error retrieving data: {error} </> : <>
    
          {scope === "" && folders.length > 0 ? <ResourcesFolderView folderItems={folders} /> : null}
    
          {scope !== "" && currentDirectoryFiles.length > 0 ? <CurrentDirectoryView documentItems={currentDirectoryFiles} /> : null}
    			{scope === "" && quickAccessItems.length > 0 ? <QuickAccessView quickAccessItems={quickAccessItems} /> : null}
    
    danieldeng2's avatar
    danieldeng2 committed
    export default ModuleResources;