В настоящее время я работаю над своим первым приложением React с внутренним интерфейсом Firebase, и я встроил панель поиска, предоставленную Algolia. Все работает нормально, но я бы хотел добавить кнопку «добавить в мою коллекцию» на каждый элемент, чтобы пользователь мог добавить элемент в свою личную коллекцию.
Мне удалось сделать это, когда я работал исключительно через Firebase, но в моей поисковой системе мои данные поступают из Алголии, которая сама получает данные от Firebase, поэтому я немного растерялся.
После обучения по интеграции Algolia в React у меня был следующий код:
import React from 'react';
import withAuthorization from './withAuthorization';
import * as firebase from 'firebase';
import {database, } from '../firebase/firebase';
import Image from 'react-image-resizer';
import {
InstantSearch,
SearchBox,
Hits,
Highlight
} from 'react-instantsearch/dom';
const Hit = ({hit}) =>
<div className="hit">
<div className="hit-image">
<img src={hit.avatarURL} height={150} with={150}/>
</div>
<div className="hit-content">
<div className="hit-marque">
{hit.marque}
</div>
<div className="hit-numero">
{hit.numero}
</div>
<div className="hit-marquesuite">
{hit.marquesuite}
</div>
<div className="hit-cote">
{hit.cote}
</div>
<div className="hit-collection">
<button className="btn btn-success">Ajouter à ma collection</button>
</div>
</div>
</div>
const Sidebar = () =>
<div className="sidebar">
</div>
const Content = () =>
<div className="content">
<Hits hitComponent={Hit}/>
</div>
class Catalogue extends React.Component {
constructor(){
super();
this.state = {
catalogue: {},
};
}
//Item from Firebase
componentDidMount() {
database.once('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
});
});
const capsRef = firebase.database().ref(`catalogue`).orderByChild(`marque`);
capsRef.on('value', (snapshot) => {
let newState = [];
snapshot.forEach(function(childSnapshot) {
newState.push({
id: childSnapshot.key,
marque: childSnapshot.val().marque,
marquesuite: childSnapshot.val().marquesuite,
numero: childSnapshot.val().numero,
reference: childSnapshot.val().reference,
cote: childSnapshot.val().cote,
avatar: childSnapshot.val().avatar,
avatarURL: childSnapshot.val().avatarURL,
});
});
this.setState ({
catalogue: newState
});
});
}
// Add item to user collection
addToCollection(key, e) {
const userUid = firebase.auth().currentUser.uid;
const collection = {
marque: this.state.catalogue[key].marque,
marquesuite: this.state.catalogue[key].marquesuite,
numero: this.state.catalogue[key].numero,
reference: this.state.catalogue[key].reference,
cote: this.state.catalogue[key].cote,
avatarURL:this.state.catalogue[key].avatarURL
};
firebase.database().ref(`users/${userUid}/collection`).child('items').ref.push(collection);
}
render(){
if(this.state.catalogue === null) {
return <p>Le catalogue est vide</p>
}
const catalogue= Object.keys(this.state.catalogue).map(key => {
return (
<div className="item col-md-2" key={key}>
<img src={this.state.catalogue[key].avatarURL} height={150} with={150}/>
<h3>{this.state.catalogue[key].marque}</h3>
<h3>{this.state.catalogue[key].numero}</h3>
<h4>{this.state.catalogue[key].marquesuite}</h4>
<h4>{this.state.catalogue[key].reference}</h4>
<p>{this.state.catalogue[key].cote}</p>
<div className="text-center">
<button className="btn btn-success" onClick={this.addToCollection.bind(this, key)}>Ajouter à ma collection</button>
</div>
</div>
)
});
return (
<div class="container-fluid">
<h1 class="text-center">Catalogue de capsule</h1>
<InstantSearch
apiKey="MyApiKey"
appId="MyAppId"
indexName="catalogue">
<header className="header">
<SearchBox translations={{placeholder:'Rechercher une capsule'}}/>
</header>
<main>
<Content/>
</main>
</InstantSearch>
</div>
)
}
}
const authCondition = (authUser) => !!authUser;
export default withAuthorization(authCondition)(Catalogue);
Я должен признать, что это смесь до и после интеграции Алголии.
Но с этим кодом моя функция AddToCollection не работает, и у меня появляется сообщение об ошибке. Как я могу заставить мою функцию AddToCollection работать в моем const Hit?
Заранее благодарю за помощь