浏览代码

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

父节点
当前提交
d59018db12

+ 3
- 3
src/App.tsx 查看文件

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

+ 0
- 0
src/components/BiographySearchBar.css 查看文件


+ 36
- 16
src/components/BiographySearchBar.tsx 查看文件

@@ -1,36 +1,56 @@
1 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 14
 import biographies from '../data/Biograph.json'
4
-import Biography from '../pages/Biography'
15
+import { square } from 'ionicons/icons';
5 16
 
6 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 22
     let query = "";
17 23
     const target = ev.target as HTMLIonSearchbarElement;
18 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 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 36
       <IonList inset={true}>
28 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 55
       </IonList>
36 56
     </>

+ 39
- 27
src/components/CapsuleSearchBar.tsx 查看文件

@@ -1,36 +1,43 @@
1 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 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 18
     let query = "";
17 19
     const target = ev.target as HTMLIonSearchbarElement;
18 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 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 32
       <IonList inset={true}>
28 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 42
       </IonList>
36 43
     </>
@@ -38,17 +45,22 @@ function SearchBar() {
38 45
 }
39 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 查看文件

@@ -1,24 +0,0 @@
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 查看文件

@@ -1,16 +0,0 @@
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 查看文件

@@ -1,8 +1,8 @@
1 1
 [
2 2
     {
3 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 6
         "photo": "../assets/BombaPuertorriquena.jpg"
7 7
     },
8 8
     {

+ 12
- 0
src/data/CapsuleInfo.ts 查看文件

@@ -0,0 +1,12 @@
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 查看文件

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

+ 24
- 23
src/pages/Capsule.tsx 查看文件

@@ -5,23 +5,29 @@ import {
5 5
     IonTitle,
6 6
     IonToolbar,
7 7
     IonFooter,
8
-    IonNavLink,
9 8
     IonImg,
10 9
     IonGrid,
11 10
     IonRow,
12 11
     IonCol,
13
-    IonButton,
14 12
     IonButtons,
15
-    IonBackButton
13
+    IonBackButton,
14
+    useIonViewWillEnter
16 15
 } from '@ionic/react';
17
-import React from 'react';
16
+import { useParams } from 'react-router';
17
+import React, { useState } from 'react';
18 18
 import './Capsule.css';
19
-import Biography from './Biography';
19
+import { CapsuleInfo, getCapsule} from '../data/CapsuleInfo';
20 20
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
21
-import Bomba from '../assets/BombaPuertorriquena.jpg';
22
-import RobertoClemente from '../assets/RobertoClemente.jpg';
23 21
 
24 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 31
     return (
26 32
         <IonPage>
27 33
             <IonHeader>
@@ -38,25 +44,20 @@ const Capsule: React.FC = () => {
38 44
                     </IonGrid>
39 45
                 </IonToolbar>
40 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 59
             </IonContent>
60
+
60 61
             <IonFooter>
61 62
                 <IonToolbar className="Footer-Color">
62 63
                     <div className='Item-Center'>

+ 1
- 1
src/pages/HomePage.tsx 查看文件

@@ -41,7 +41,7 @@ const HomePage: React.FC = () => {
41 41
       </IonHeader>
42 42
       <IonContent fullscreen>
43 43
         <div className='Item-Center'>
44
-          <IonItem routerLink={`/ListBiographie`} detail={true}>
44
+          <IonItem routerLink={`/ListBiographies`} detail={true}>
45 45
             <IonCard>
46 46
               <IonCardHeader>
47 47
                 <IonCardTitle>Biografías</IonCardTitle>

+ 3
- 34
src/pages/ListBiographies.tsx 查看文件

@@ -1,11 +1,5 @@
1 1
 import {
2 2
   IonImg,
3
-  IonCard,
4
-  IonCardContent,
5
-  IonCardHeader,
6
-  IonCardSubtitle,
7
-  IonCardTitle,
8
-  IonSearchbar,
9 3
   IonContent,
10 4
   IonHeader,
11 5
   IonPage,
@@ -17,14 +11,9 @@ import {
17 11
   IonCol,
18 12
   IonButtons,
19 13
   IonBackButton,
20
-  IonItem,
21
-  IonIcon
22 14
 } from '@ionic/react';
23 15
 import './ListBiographies.css';
24
-import { square } from 'ionicons/icons';
25 16
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
26
-import RobertoClemente from '../assets/RobertoClemente.jpg';
27
-import ListBio from '../data/Biograph.json';
28 17
 import SearchBar from '../components/BiographySearchBar';
29 18
 
30 19
 const ListBiographies: React.FC = () => {
@@ -44,31 +33,11 @@ const ListBiographies: React.FC = () => {
44 33
           </IonGrid>
45 34
         </IonToolbar>
46 35
       </IonHeader>
36
+
47 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 39
       </IonContent>
40
+      
72 41
       <IonFooter>
73 42
         <IonToolbar className="Footer-Color">
74 43
           <div className='Item-Center'>

+ 4
- 13
src/pages/ListCapsules.tsx 查看文件

@@ -10,7 +10,7 @@ import {
10 10
   IonRow,
11 11
   IonCol,
12 12
   IonButtons,
13
-  IonBackButton
13
+  IonBackButton,
14 14
 } from '@ionic/react';
15 15
 import './ListCapsules.css';
16 16
 import EnciclopediaPR from '../assets/EnciclopediaPR.png';
@@ -33,20 +33,11 @@ const ListCapsules: React.FC = () => {
33 33
           </IonGrid>
34 34
         </IonToolbar>
35 35
       </IonHeader>
36
+
36 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 39
       </IonContent>
40
+
50 41
       <IonFooter>
51 42
         <IonToolbar className="Footer-Color">
52 43
           <div className='Item-Center'>