Browse Source

Added Search Bar for both capsules and biographies. Small tweaks in code formatting and variable names.

Alejandro Soledad 1 year ago
parent
commit
d59018db12

+ 3
- 3
src/App.tsx View File

42
         <Route path="/home" exact={true}>
42
         <Route path="/home" exact={true}>
43
           <HomePage />
43
           <HomePage />
44
         </Route>
44
         </Route>
45
-        <Route path="/ListBiographie">
45
+        <Route path="/ListBiographies">
46
           <ListBiographies />
46
           <ListBiographies />
47
         </Route>
47
         </Route>
48
-        <Route path="/Biographie/:id">
48
+        <Route path="/Biography/:id">
49
           <Biography />
49
           <Biography />
50
         </Route>
50
         </Route>
51
         <Route path="/ListCapsules">
51
         <Route path="/ListCapsules">
52
           <ListCapsules />
52
           <ListCapsules />
53
         </Route>
53
         </Route>
54
-        <Route path="/Capsule">
54
+        <Route path="/Capsule/:id">
55
           <Capsule />
55
           <Capsule />
56
         </Route>
56
         </Route>
57
         <Route path="/Question">
57
         <Route path="/Question">

+ 0
- 0
src/components/BiographySearchBar.css View File


+ 36
- 16
src/components/BiographySearchBar.tsx View File

1
 import React, { useState } from 'react';
1
 import React, { useState } from 'react';
2
-import { IonItem, IonList, IonSearchbar, IonNavLink} from '@ionic/react';
2
+import { 
3
+  IonItem,
4
+  IonImg,
5
+  IonList, 
6
+  IonSearchbar,
7
+  IonCard, 
8
+  IonCardHeader,
9
+  IonCardTitle,
10
+  IonCardContent,
11
+  IonCardSubtitle,
12
+  IonIcon,
13
+} from '@ionic/react';
3
 import biographies from '../data/Biograph.json'
14
 import biographies from '../data/Biograph.json'
4
-import Biography from '../pages/Biography'
15
+import { square } from 'ionicons/icons';
5
 
16
 
6
 function SearchBar() {
17
 function SearchBar() {
7
-  const data: string [] = [];
8
 
18
 
9
-    for (var i = 0; i < biographies.length; i++){
10
-      data.push(biographies[i].title);
11
-    }
19
+  let [results, setResults] = useState([...biographies]);
12
 
20
 
13
-  let [results, setResults] = useState([...data]);
14
-
15
-  const handleChange = (ev: Event) => {
21
+  const filterSearch = (ev: Event) => {
16
     let query = "";
22
     let query = "";
17
     const target = ev.target as HTMLIonSearchbarElement;
23
     const target = ev.target as HTMLIonSearchbarElement;
18
     if (target) query = target.value!.toLowerCase();
24
     if (target) query = target.value!.toLowerCase();
19
 
25
 
20
-    setResults(data.filter(d => d.toLowerCase().indexOf(query) > -1));
26
+    setResults(biographies.filter(bio => {
27
+      return bio.title.toLowerCase().indexOf(query) > -1;
28
+    })
29
+    )
21
   }
30
   }
22
 
31
 
23
   return (
32
   return (
24
     <>
33
     <>
25
-      <IonSearchbar debounce={500} onIonChange={(ev) => handleChange(ev)}></IonSearchbar>
34
+      <IonSearchbar debounce={500} onIonChange={(ev) => filterSearch(ev)}></IonSearchbar>
26
 
35
 
27
       <IonList inset={true}>
36
       <IonList inset={true}>
28
         { results.map(result => (
37
         { results.map(result => (
29
-        <IonNavLink routerDirection="forward" component={() => <Biography/>}>
30
-          <IonItem button>
31
-            { result }
32
-          </IonItem>
33
-        </IonNavLink>
38
+          <>
39
+          <IonCard>
40
+            <IonItem routerLink={`/Biography/${result.id}`}>
41
+              <IonImg style={{ height: 300, width: 600 }} src={result.photo} alt='Logo'></IonImg>
42
+              <IonCardHeader>
43
+                <IonCardTitle>{result.title}</IonCardTitle>
44
+                <IonCardSubtitle>{result.tags}</IonCardSubtitle>
45
+              </IonCardHeader><IonCardContent>
46
+                {result.content}
47
+              </IonCardContent>
48
+            </IonItem>
49
+            <IonItem routerLink={`/Question`} detail={true}>
50
+              <IonIcon icon={square} />Tomar quiz
51
+            </IonItem>
52
+          </IonCard>
53
+        </>
34
         ))}
54
         ))}
35
       </IonList>
55
       </IonList>
36
     </>
56
     </>

+ 39
- 27
src/components/CapsuleSearchBar.tsx View File

1
 import React, { useState } from 'react';
1
 import React, { useState } from 'react';
2
-import { IonItem, IonList, IonSearchbar, IonNavLink} from '@ionic/react';
2
+import { 
3
+  IonItem, 
4
+  IonList, 
5
+  IonSearchbar,
6
+  IonCard, 
7
+  IonCardHeader,
8
+  IonCardTitle,
9
+} from '@ionic/react';
3
 import capsules from '../data/Capsule.json'
10
 import capsules from '../data/Capsule.json'
4
-import Capsule from '../pages/Capsule'
5
 
11
 
6
-function SearchBar() {
7
-  const data: string [] = [];
8
 
12
 
9
-    for (var i = 0; i < capsules.length; i++){
10
-      data.push(capsules[i].title);
11
-    }
13
+function SearchBar() {
12
 
14
 
13
-  let [results, setResults] = useState([...data]);
15
+  let [results, setResults] = useState([...capsules]);
14
 
16
 
15
-  const handleChange = (ev: Event) => {
17
+  const filterSearch = (ev: Event) => {
16
     let query = "";
18
     let query = "";
17
     const target = ev.target as HTMLIonSearchbarElement;
19
     const target = ev.target as HTMLIonSearchbarElement;
18
     if (target) query = target.value!.toLowerCase();
20
     if (target) query = target.value!.toLowerCase();
19
 
21
 
20
-    setResults(data.filter(d => d.toLowerCase().indexOf(query) > -1));
22
+    setResults(capsules.filter(cap => {
23
+      return cap.title.toLowerCase().indexOf(query) > -1;
24
+    })
25
+    )
21
   }
26
   }
22
 
27
 
23
   return (
28
   return (
24
     <>
29
     <>
25
-      <IonSearchbar debounce={500} onIonChange={(ev) => handleChange(ev)}></IonSearchbar>
30
+      <IonSearchbar debounce={500} onIonChange={(ev) => filterSearch(ev)}></IonSearchbar>
26
 
31
 
27
       <IonList inset={true}>
32
       <IonList inset={true}>
28
         { results.map(result => (
33
         { results.map(result => (
29
-        <IonNavLink routerDirection="forward" component={() => <Capsule/>}>
30
-          <IonItem button>
31
-            { result }
32
-          </IonItem>
33
-        </IonNavLink>
34
+            <IonCard>
35
+            <IonItem button routerLink={`/Capsule/${result.id}`}>
36
+              <IonCardHeader>
37
+                <IonCardTitle>{result.title}</IonCardTitle>
38
+              </IonCardHeader>
39
+            </IonItem>
40
+          </IonCard>
34
         ))}
41
         ))}
35
       </IonList>
42
       </IonList>
36
     </>
43
     </>
38
 }
45
 }
39
 export default SearchBar;
46
 export default SearchBar;
40
 
47
 
41
-/*
42
- <IonLabel>Breve Historia del baile en Puerto Rico</IonLabel>
43
-<IonNavLink routerDirection="forward" component={() => <Capsule />}>
44
-<IonButton>Visitar</IonButton>
45
-*/
46
 
48
 
47
 /*
49
 /*
48
-    <IonItem routerLink={`/message/${message.id}`} detail={true}>
49
-      <div slot="start" className="dot dot-unread"></div>
50
-      <IonLabel className="ion-text-wrap">
51
-
52
-      </IonLabel>
53
-    </IonItem>
50
+             <>
51
+                <IonCard>
52
+                  <IonItem routerLink={`/Biography/${listbio.id}`}>
53
+                    <IonImg style={{ height: 300, width: 600 }} src={RobertoClemente} alt='Logo'></IonImg>
54
+                    <IonCardHeader>
55
+                      <IonCardTitle>{listbio.title}</IonCardTitle>
56
+                      <IonCardSubtitle>{listbio.tags}</IonCardSubtitle>
57
+                    </IonCardHeader><IonCardContent>
58
+                      {listbio.content}
59
+                    </IonCardContent>
60
+                  </IonItem>
61
+                  <IonItem routerLink={`/Question`} detail={true}>
62
+                    <IonIcon icon={square} />Tomar quiz
63
+                  </IonItem>
64
+                </IonCard>
65
+              </>
54
 */
66
 */

+ 0
- 24
src/components/ExploreContainer.css View File

1
-.container {
2
-  text-align: center;
3
-  position: absolute;
4
-  left: 0;
5
-  right: 0;
6
-  top: 50%;
7
-  transform: translateY(-50%);
8
-}
9
-
10
-.container strong {
11
-  font-size: 20px;
12
-  line-height: 26px;
13
-}
14
-
15
-.container p {
16
-  font-size: 16px;
17
-  line-height: 22px;
18
-  color: #8c8c8c;
19
-  margin: 0;
20
-}
21
-
22
-.container a {
23
-  text-decoration: none;
24
-}

+ 0
- 16
src/components/ExploreContainer.tsx View File

1
-import './ExploreContainer.css';
2
-
3
-interface ContainerProps {
4
-  name: string;
5
-}
6
-
7
-const ExploreContainer: React.FC<ContainerProps> = ({ name }) => {
8
-  return (
9
-    <div className="container">
10
-      <strong>{name}</strong>
11
-      <p>Explore <a target="_blank" rel="noopener noreferrer" href="https://ionicframework.com/docs/components">UI Components</a></p>
12
-    </div>
13
-  );
14
-};
15
-
16
-export default ExploreContainer;

+ 2
- 2
src/data/Capsule.json View File

1
 [
1
 [
2
     {
2
     {
3
         "id": 0,
3
         "id": 0,
4
-        "title": "Breve Historia del baile en Puerto Rico",
5
-        "content": "Han existido distintas formas de danzar o bailar desde la historia muy antigua de la humanidad. En Puerto Rico el primer baile documentado por los cronistas de Indias es el llamado areito, con las variantes de escritura areyto y areíto. Era un baile coreado y musicalizado, dirigido por un guía. Esta manifestación de movimiento corporal, que Gonzalo Fernández de Oviedo llamó “bailar cantando”, fue común en los grupos indígenas de la región caribeña.",
4
+        "title": "Grandes deportistas puertorriqueños",
5
+        "content": "Uno de los aspectos culturales por los que Puerto Rico más se destaca en el mundo es por el deporte, además de por nuestra admiración y entusiasmo por los logros de nuestros deportistas de todas las disciplinas.",
6
         "photo": "../assets/BombaPuertorriquena.jpg"
6
         "photo": "../assets/BombaPuertorriquena.jpg"
7
     },
7
     },
8
     {
8
     {

+ 12
- 0
src/data/CapsuleInfo.ts View File

1
+import ListCapsule from '../data/Capsule.json';
2
+
3
+export interface CapsuleInfo {
4
+    id: number;
5
+    title: string;
6
+    content: string;
7
+    photo: string;
8
+}
9
+
10
+export const getCapsules = () => ListCapsule;
11
+
12
+export const getCapsule = (id: number) => ListCapsule.find(c => c.id === id);

+ 2
- 1
src/pages/Biography.tsx View File

48
                     </IonGrid>
48
                     </IonGrid>
49
                 </IonToolbar>
49
                 </IonToolbar>
50
             </IonHeader>
50
             </IonHeader>
51
+
51
             <IonContent fullscreen className="ion-padding">
52
             <IonContent fullscreen className="ion-padding">
52
                 {bioinfo ? (
53
                 {bioinfo ? (
53
                     <>
54
                     <>
62
                         </IonItem>
63
                         </IonItem>
63
                     </>
64
                     </>
64
                 ) : (
65
                 ) : (
65
-                    <div>Message not found</div>
66
+                    <div>Biography not found</div>
66
                 )}
67
                 )}
67
             </IonContent>
68
             </IonContent>
68
 
69
 

+ 24
- 23
src/pages/Capsule.tsx View File

5
     IonTitle,
5
     IonTitle,
6
     IonToolbar,
6
     IonToolbar,
7
     IonFooter,
7
     IonFooter,
8
-    IonNavLink,
9
     IonImg,
8
     IonImg,
10
     IonGrid,
9
     IonGrid,
11
     IonRow,
10
     IonRow,
12
     IonCol,
11
     IonCol,
13
-    IonButton,
14
     IonButtons,
12
     IonButtons,
15
-    IonBackButton
13
+    IonBackButton,
14
+    useIonViewWillEnter
16
 } from '@ionic/react';
15
 } from '@ionic/react';
17
-import React from 'react';
16
+import { useParams } from 'react-router';
17
+import React, { useState } from 'react';
18
 import './Capsule.css';
18
 import './Capsule.css';
19
-import Biography from './Biography';
19
+import { CapsuleInfo, getCapsule} from '../data/CapsuleInfo';
20
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
20
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
21
-import Bomba from '../assets/BombaPuertorriquena.jpg';
22
-import RobertoClemente from '../assets/RobertoClemente.jpg';
23
 
21
 
24
 const Capsule: React.FC = () => {
22
 const Capsule: React.FC = () => {
23
+    const [capinfo, setCapsule] = useState<CapsuleInfo>();
24
+    const params = useParams<{ id: string }>();
25
+
26
+    useIonViewWillEnter(() => {
27
+        const capsule = getCapsule(parseInt(params.id, 10));
28
+        setCapsule(capsule);
29
+    });
30
+
25
     return (
31
     return (
26
         <IonPage>
32
         <IonPage>
27
             <IonHeader>
33
             <IonHeader>
38
                     </IonGrid>
44
                     </IonGrid>
39
                 </IonToolbar>
45
                 </IonToolbar>
40
             </IonHeader>
46
             </IonHeader>
41
-            <IonContent fullscreen className="ion-padding">
42
-                <IonImg style={{ height: 300, width: 600 }} src={Bomba} alt='Logo'></IonImg>
43
-                <h1>Breve Historia del baile en Puerto Rico</h1>
44
 
47
 
45
-                <p>Han existido distintas formas de danzar o bailar desde la historia muy antigua de la humanidad. En Puerto Rico el primer baile documentado por los cronistas de Indias es el llamado areito, con las variantes de escritura areyto y areíto. Era un baile coreado y musicalizado, dirigido por un guía. Esta manifestación de movimiento corporal, que Gonzalo Fernández de Oviedo llamó “bailar cantando”, fue común en los grupos indígenas de la región caribeña.</p>
46
-                <p>Se ejecutaba en hileras, con los participantes cogidos de las manos, de los brazos o, según Bartolomé de las Casas, “los brazos de los unos puestos sobre los hombros de los otros”. Según Pedro Mártir de Anglería, los participantes llevaban caracoles en los brazos y piernas, con los que producían “un ruido agradable”. Narraban una historia y el guía indicaba qué pasos y cantos se repetirían hasta que ésta culminara.</p>
47
-                <p>Aunque la llegada de los conquistadores españoles produjo una rápida desaparición de la población indígena y de cualquier expresión autóctona que las autoridades consideraran pagana, Fray Iñigo Abbad y Lasierra afirmaba en 1789 que “la diversión más apreciable para estos isleños son los bailes; los tienen sin más motivo que el de pasar el tiempo y rara vez faltan en una cosa u otra”.</p>
48
-
49
-                <h2>Information about important figures</h2>
50
-                <IonGrid fixed={true}>
51
-                    <IonRow>
52
-                        <IonImg style={{ height: 150, width: 300 }} src={RobertoClemente} alt='Logo'></IonImg>
53
-                        <IonNavLink routerDirection="forward" component={() => <Biography />} >
54
-                            <IonButton color="light">Roberto Clemente</IonButton>
55
-                        </IonNavLink>
56
-                    </IonRow>
57
-                </IonGrid>
48
+            <IonContent fullscreen className="ion-padding">
49
+            {capinfo ? (
50
+                    <>
51
+                        <IonImg style={{ height: 300, width: 600 }} src={capinfo.photo} alt='Logo'></IonImg>
52
+                        <h1>{capinfo.title}</h1>
58
 
53
 
54
+                        <p>{capinfo.content}</p>
55
+                    </>
56
+                ) : (
57
+                    <div>Capsule not found</div>
58
+                )}
59
             </IonContent>
59
             </IonContent>
60
+
60
             <IonFooter>
61
             <IonFooter>
61
                 <IonToolbar className="Footer-Color">
62
                 <IonToolbar className="Footer-Color">
62
                     <div className='Item-Center'>
63
                     <div className='Item-Center'>

+ 1
- 1
src/pages/HomePage.tsx View File

41
       </IonHeader>
41
       </IonHeader>
42
       <IonContent fullscreen>
42
       <IonContent fullscreen>
43
         <div className='Item-Center'>
43
         <div className='Item-Center'>
44
-          <IonItem routerLink={`/ListBiographie`} detail={true}>
44
+          <IonItem routerLink={`/ListBiographies`} detail={true}>
45
             <IonCard>
45
             <IonCard>
46
               <IonCardHeader>
46
               <IonCardHeader>
47
                 <IonCardTitle>Biografías</IonCardTitle>
47
                 <IonCardTitle>Biografías</IonCardTitle>

+ 3
- 34
src/pages/ListBiographies.tsx View File

1
 import {
1
 import {
2
   IonImg,
2
   IonImg,
3
-  IonCard,
4
-  IonCardContent,
5
-  IonCardHeader,
6
-  IonCardSubtitle,
7
-  IonCardTitle,
8
-  IonSearchbar,
9
   IonContent,
3
   IonContent,
10
   IonHeader,
4
   IonHeader,
11
   IonPage,
5
   IonPage,
17
   IonCol,
11
   IonCol,
18
   IonButtons,
12
   IonButtons,
19
   IonBackButton,
13
   IonBackButton,
20
-  IonItem,
21
-  IonIcon
22
 } from '@ionic/react';
14
 } from '@ionic/react';
23
 import './ListBiographies.css';
15
 import './ListBiographies.css';
24
-import { square } from 'ionicons/icons';
25
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
16
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
26
-import RobertoClemente from '../assets/RobertoClemente.jpg';
27
-import ListBio from '../data/Biograph.json';
28
 import SearchBar from '../components/BiographySearchBar';
17
 import SearchBar from '../components/BiographySearchBar';
29
 
18
 
30
 const ListBiographies: React.FC = () => {
19
 const ListBiographies: React.FC = () => {
44
           </IonGrid>
33
           </IonGrid>
45
         </IonToolbar>
34
         </IonToolbar>
46
       </IonHeader>
35
       </IonHeader>
36
+
47
       <IonContent fullscreen>
37
       <IonContent fullscreen>
48
-        <IonSearchbar></IonSearchbar>
49
-        {
50
-          ListBio && ListBio.map(listbio => {
51
-            return (
52
-              <>
53
-                <IonCard>
54
-                  <IonItem routerLink={`/Biographie/${listbio.id}`}>
55
-                    <IonImg style={{ height: 300, width: 600 }} src={RobertoClemente} alt='Logo'></IonImg>
56
-                    <IonCardHeader>
57
-                      <IonCardTitle>{listbio.title}</IonCardTitle>
58
-                      <IonCardSubtitle>{listbio.tags}</IonCardSubtitle>
59
-                    </IonCardHeader><IonCardContent>
60
-                      {listbio.content}
61
-                    </IonCardContent>
62
-                  </IonItem>
63
-                  <IonItem routerLink={`/Question`} detail={true}>
64
-                    <IonIcon icon={square} />Tomar quiz
65
-                  </IonItem>
66
-                </IonCard>
67
-              </>
68
-            )
69
-          })
70
-        }
38
+        <SearchBar></SearchBar>
71
       </IonContent>
39
       </IonContent>
40
+      
72
       <IonFooter>
41
       <IonFooter>
73
         <IonToolbar className="Footer-Color">
42
         <IonToolbar className="Footer-Color">
74
           <div className='Item-Center'>
43
           <div className='Item-Center'>

+ 4
- 13
src/pages/ListCapsules.tsx View File

10
   IonRow,
10
   IonRow,
11
   IonCol,
11
   IonCol,
12
   IonButtons,
12
   IonButtons,
13
-  IonBackButton
13
+  IonBackButton,
14
 } from '@ionic/react';
14
 } from '@ionic/react';
15
 import './ListCapsules.css';
15
 import './ListCapsules.css';
16
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
16
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
33
           </IonGrid>
33
           </IonGrid>
34
         </IonToolbar>
34
         </IonToolbar>
35
       </IonHeader>
35
       </IonHeader>
36
+
36
       <IonContent fullscreen>
37
       <IonContent fullscreen>
37
-        <IonSearchbar></IonSearchbar>
38
-        <IonList inset={true}>
39
-          <IonItem routerLink={`/Capsule`} detail={true}>
40
-            <IonLabel>Breve Historia del baile en Puerto Rico</IonLabel>
41
-          </IonItem>
42
-          <IonItem>
43
-            <IonLabel>Cápsula#2</IonLabel>
44
-          </IonItem>
45
-          <IonItem>
46
-            <IonLabel>Cápsula#3</IonLabel>
47
-          </IonItem>
48
-        </IonList>
38
+        <SearchBar></SearchBar>
49
       </IonContent>
39
       </IonContent>
40
+
50
       <IonFooter>
41
       <IonFooter>
51
         <IonToolbar className="Footer-Color">
42
         <IonToolbar className="Footer-Color">
52
           <div className='Item-Center'>
43
           <div className='Item-Center'>