From 88bf1a92867f5463af8e92af6b8bd3f8e627e64b Mon Sep 17 00:00:00 2001 From: Tommy Parnell Date: Sun, 21 Jan 2018 23:45:19 -0500 Subject: [PATCH] start to abstract firebase from components --- src/containers/Edit.tsx | 39 ++++++++++++++------------ src/repositories/firebaseRepository.ts | 32 +++++++++++++++++++++ 2 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 src/repositories/firebaseRepository.ts diff --git a/src/containers/Edit.tsx b/src/containers/Edit.tsx index 8a135a1..fe2d350 100644 --- a/src/containers/Edit.tsx +++ b/src/containers/Edit.tsx @@ -5,12 +5,13 @@ import { Button, Card, CardText, CardTitle, Col, FormText, Input, Nav, NavbarBra import { Conditional } from "../components/Conditional"; import { Editor } from "../components/Editor"; import { Viewer } from "../components/Viewer"; -import {Document} from "../models/Document"; +import { Document } from "../models/Document"; import { LoginState } from "../models/LoginState"; +import { getDocument, saveDocument } from "../repositories/firebaseRepository"; import fbData from "../startup/firebase"; import { generateDocId, getLanguage } from "../util/doc"; -export interface EditState {document: Document; } +export interface EditState {document: Document; hasEdits?: boolean; } export interface EditProps {login: LoginState; docId: string; uid: string; showEdit?: boolean; } export class Edit extends React.Component { @@ -27,25 +28,26 @@ export class Edit extends React.Component { } public componentDidMount() { - this.ref = fbData.rebase.syncState(`docs/${this.props.uid}/${this.props.docId}`, { - context: this, - state: "document", - asArray: false, + getDocument(this.props.docId, this.props.uid) + .then((document) => { + this.setState({document}); }); } - public componentWillUnmount() { - fbData.rebase.removeBinding(this.ref); + public updateDocument() { + saveDocument(this.state.document, this.props.docId, this.props.login.uid) + .then(() => { + console.log("state set!"); + this.setState({hasEdits: false}); + }); } - public updateTitle(docTitle: string) { - this.setState({document: {Title: docTitle}}); + public onTitleUpdate(title: string) { + const doc = Object.apply({}, [{Title: title}, this.state.document]); + this.setState({hasEdits: true, document: doc}); } - public updateDocument(docBody: string) { - this.setState({ - document: { - Body: docBody, - }, - }); + public onBodyUpdate(body: string) { + const doc = Object.apply({}, [{Body: body}, this.state.document]); + this.setState({hasEdits: true, document: doc}); } public render() { @@ -91,14 +93,15 @@ export class Edit extends React.Component {
Permalink:

- +
- this.updateTitle(event.target.value)} value={this.state.document.Title} className="form-control" id="title-input" /> + this.onTitleUpdate(event.target.value)} value={this.state.document.Title} className="form-control" id="title-input" /> +
diff --git a/src/repositories/firebaseRepository.ts b/src/repositories/firebaseRepository.ts new file mode 100644 index 0000000..c174b37 --- /dev/null +++ b/src/repositories/firebaseRepository.ts @@ -0,0 +1,32 @@ +import { Document } from "../models/Document"; +import fbData from "../startup/firebase"; + +/** + * returns a promise of a document + * + * @export + * @param {string} docId + * @param {string} uid + * @returns + */ +export function getDocument(docId: string, uid: string): Promise { + if (!docId) { + throw new Error("No doc id passed"); + } + if (!uid) { + throw new Error("No uid passed"); + } + return fbData.rebase.fetch(`docs/${uid}/${docId}`, {asArray: false}); + +} + +export function getDocuments(uid: string): Promise { + return fbData.rebase.fetch(`docs/${uid}`, + { + asArray: true, + }); +} + +export function saveDocument(document: Document, docId: string, uid: string): Promise { + return fbData.rebase.post(`docs/${uid}/${document}`, {data: document}); +} \ No newline at end of file