Skip to content

Commit 8ee0dd4

Browse files
committed
Week 5 solution: Add visibility and owner attributes to decks
1 parent eaf5283 commit 8ee0dd4

File tree

4 files changed

+61
-25
lines changed

4 files changed

+61
-25
lines changed

.firebase/hosting.YnVpbGQ.cache

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
asset-manifest.json,1593234178590,87c5078d84609a79373eae345b5be0dcbce16a10596d320b64fb55a7442310b5
2-
favicon.ico,1593234166094,a08fa4488c3ecef62d9effd03b3a989929bdcbecf5e905941f9034a15bd3dba3
3-
precache-manifest.57e88b941908e43f629a3c94be8a5ec4.js,1593234178590,f1cc40fe71b8eb50de615204918d3a8d2286e8561fdaebc558c9bbf575e6ab28
4-
index.html,1593234178590,4337e9ec08dd03b67a60b3f53d93960e0b50e44f58c6a2a07000cdca499480b5
5-
manifest.json,1593234166096,341d52628782f8ac9290bbfc43298afccb47b7cbfcee146ae30cf0f46bc30900
6-
service-worker.js,1593234178590,1d4bddc2c6a315132e526f16a88cd9dfbf964ca98ac5e41f5ac52a19e013f4ba
7-
logo192.png,1593234166095,caff018b7f1e8fd481eb1c50d75b0ef236bcd5078b1d15c8bb348453fee30293
8-
static/css/main.219eee2c.chunk.css,1593234178605,4347d08e217c04e1f5a2110d045f52f58aa98534ad519689d983249e1ab37a30
9-
static/css/main.219eee2c.chunk.css.map,1593234178604,8f0150377877b448bd8a7e1a28909ab9d2f9a1593fd8f74c67b49fcd4797bfb7
10-
static/js/2.4ba42089.chunk.js.LICENSE.txt,1593234178605,dd9d1b9bec559794681f77c3fdb43c6a7fb0be8ba26a7a1fca5f74b37e053554
11-
static/js/main.f69f2b0d.chunk.js,1593234178592,4f457c5ea344bb41cdf3066dab0895b1f5e90bbad4097374af6585ce97e30a9d
12-
static/js/runtime-main.7b067255.js,1593234178606,355ee36cff83c79265fa718c00e443e093fc34dd415f6d7399ba8d62ccb6f7d4
13-
static/js/main.f69f2b0d.chunk.js.map,1593234178606,b8f8030a276f8301f07e7ac71b31aac7e63b0f20106733dba7072fdb4ef618f9
14-
robots.txt,1593234166097,391d14b3c2f8c9143a27a28c7399585142228d4d1bdbe2c87ac946de411fa9a2
15-
static/js/runtime-main.7b067255.js.map,1593234178606,4c037c810ae89acd48c2cc8145d8ecff3599efcc4e218f9c6a55b4ef3338510b
16-
logo512.png,1593234166096,191fc21360b4ccfb1cda11a1efb97f489ed22672ca83f4064316802bbfdd750e
17-
static/js/2.4ba42089.chunk.js,1593234178606,3b0d9c2055c130ddb0b1a31969db147fb3839d11b058ce2e0e773b423cff4f97
18-
static/js/2.4ba42089.chunk.js.map,1593234178606,8fc7032a8595c5aab60d6d6f027f4a669897ecaf77cef2c138753681ffb8144c
1+
asset-manifest.json,1593934070074,72c53b4eaa18450ab570eb2785e51d7df5945180fd323ff15bf682cc2c64a62c
2+
index.html,1593934070073,d3db21928ffa7083498e972df191e487d1d0726a7eca151a9cbb54c5c10be167
3+
precache-manifest.e69a86ae19e3e961f34085d296792d3a.js,1593934070073,54bcde214d2a2bc9df9910298360a5471f4c1fcf11a18b101a12e37ec0cb05e1
4+
favicon.ico,1593934054050,a08fa4488c3ecef62d9effd03b3a989929bdcbecf5e905941f9034a15bd3dba3
5+
service-worker.js,1593934070073,15e89014f1f8a38465a8bba7daaf66403ec279e531d0a1a316f4dcae9287cd9b
6+
static/css/main.219eee2c.chunk.css,1593934070074,4347d08e217c04e1f5a2110d045f52f58aa98534ad519689d983249e1ab37a30
7+
logo192.png,1593934054051,caff018b7f1e8fd481eb1c50d75b0ef236bcd5078b1d15c8bb348453fee30293
8+
static/css/main.219eee2c.chunk.css.map,1593934070090,8f0150377877b448bd8a7e1a28909ab9d2f9a1593fd8f74c67b49fcd4797bfb7
9+
static/js/2.6d38b086.chunk.js.LICENSE.txt,1593934070074,dd9d1b9bec559794681f77c3fdb43c6a7fb0be8ba26a7a1fca5f74b37e053554
10+
static/js/main.62dd6f74.chunk.js,1593934070090,3abffb96ead57eaaa7d6ea9ab0d5168ddeeec8a77f1f3d4d5d1e04b66b0b1f64
11+
static/js/runtime-main.7b067255.js,1593934070090,355ee36cff83c79265fa718c00e443e093fc34dd415f6d7399ba8d62ccb6f7d4
12+
logo512.png,1593934054052,191fc21360b4ccfb1cda11a1efb97f489ed22672ca83f4064316802bbfdd750e
13+
static/js/runtime-main.7b067255.js.map,1593934070090,4c037c810ae89acd48c2cc8145d8ecff3599efcc4e218f9c6a55b4ef3338510b
14+
manifest.json,1593934054053,341d52628782f8ac9290bbfc43298afccb47b7cbfcee146ae30cf0f46bc30900
15+
robots.txt,1593934054054,391d14b3c2f8c9143a27a28c7399585142228d4d1bdbe2c87ac946de411fa9a2
16+
static/js/main.62dd6f74.chunk.js.map,1593934070090,444e33da47b7a98b6bf3f179e465c91fc9d4745f66a406cff7df6179d8db440c
17+
static/js/2.6d38b086.chunk.js,1593934070090,685eea2fd3d98914b9a8c96c6dde395e2d1f80ee82b70186a509928f5cd611bc
18+
static/js/2.6d38b086.chunk.js.map,1593934070091,73f1510781c301b06760ac669c0958d7d29c06ae56621b7ef3f86bf975b9e1af

src/CardEditor.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class CardEditor extends React.Component {
1717
front: '',
1818
back: '',
1919
name: '',
20+
private: false,
2021
};
2122
}
2223

@@ -40,12 +41,24 @@ class CardEditor extends React.Component {
4041
handleChange = event =>
4142
this.setState({ [event.target.name]: event.target.value });
4243

44+
handleCheckboxChange = event =>
45+
this.setState({ [event.target.name]: event.target.checked });
46+
4347
createDeck = () => {
4448
const deckId = this.props.firebase.push('/flashcards').key;
4549
const updates = {};
46-
const newDeck = { cards: this.state.cards, name: this.state.name };
50+
const newDeck = {
51+
cards: this.state.cards,
52+
name: this.state.name,
53+
owner: this.props.isLoggedIn,
54+
visibility: this.state.private ? 'private' : 'public',
55+
};
4756
updates[`/flashcards/${deckId}`] = newDeck;
48-
updates[`/homepage/${deckId}`] = { name: this.state.name };
57+
updates[`/homepage/${deckId}`] = {
58+
name: this.state.name,
59+
owner: this.props.isLoggedIn,
60+
visibility: this.state.private ? 'private' : 'public',
61+
};
4962
const onComplete = () => this.props.history.push(`/viewer/${deckId}`);
5063
this.props.firebase.update('/', updates, onComplete);
5164
};
@@ -105,6 +118,16 @@ class CardEditor extends React.Component {
105118
/>
106119
<button onClick={this.addCard}>Add card</button>
107120
<hr />
121+
<div>
122+
Make this deck private{' '}
123+
<input
124+
name="private"
125+
onChange={this.handleCheckboxChange}
126+
type="checkbox"
127+
value={this.state.private}
128+
/>
129+
</div>
130+
<br />
108131
<div>
109132
<button
110133
disabled={!this.state.name.trim() || this.state.cards.length === 0}

src/CardViewer.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import React from 'react';
22
import './CardViewer.css';
33

44
import { Link, withRouter } from 'react-router-dom';
5-
import { firebaseConnect, isLoaded, isEmpty } from 'react-redux-firebase';
5+
import {
6+
firebaseConnect,
7+
isLoaded,
8+
isEmpty,
9+
populate,
10+
} from 'react-redux-firebase';
611
import { connect } from 'react-redux';
712
import { compose } from 'redux';
813

@@ -53,6 +58,7 @@ class CardViewer extends React.Component {
5358
return (
5459
<div>
5560
<h2>{this.props.name}</h2>
61+
<h4>Created by {this.props.username}</h4>
5662
Card {this.state.currentIndex + 1} out of {this.props.cards.length}.
5763
<div className="card" onClick={this.flipCard}>
5864
{card}
@@ -77,18 +83,21 @@ class CardViewer extends React.Component {
7783
}
7884
}
7985

86+
const populates = [{ child: 'owner', root: 'users' }];
87+
8088
const mapStateToProps = (state, props) => {
81-
const deck = state.firebase.data[props.match.params.deckId];
89+
const deck = populate(state.firebase, props.match.params.deckId, populates);
8290
const name = deck && deck.name;
8391
const cards = deck && deck.cards;
84-
return { cards: cards, name: name };
92+
const username = deck && deck.owner && deck.owner.username;
93+
return { cards: cards, name: name, username: username };
8594
};
8695

8796
export default compose(
8897
withRouter,
8998
firebaseConnect(props => {
9099
const deckId = props.match.params.deckId;
91-
return [{ path: `/flashcards/${deckId}`, storeAs: deckId }];
100+
return [{ path: `/flashcards/${deckId}`, storeAs: deckId, populates }];
92101
}),
93102
connect(mapStateToProps),
94103
)(CardViewer);

src/Homepage.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@ const Homepage = props => {
1010
}
1111

1212
const decks = Object.keys(props.homepage).map(deckId => {
13+
const deck = props.homepage[deckId];
14+
if (deck.visibility === 'private' && deck.owner !== props.isLoggedIn) {
15+
return null;
16+
}
1317
return (
1418
<div key={deckId}>
15-
<Link to={`/viewer/${deckId}`}>{props.homepage[deckId].name}</Link>
19+
<Link to={`/viewer/${deckId}`}>{deck.name}</Link>
1620
</div>
1721
);
1822
});

0 commit comments

Comments
 (0)