Skip to content

Commit 295fdaa

Browse files
authored
Merge pull request #39 from quagliero/bug-trade-listener
Fixes #38 - much better handling of firebase listeners for trades
2 parents 3aa5ac8 + 792270e commit 295fdaa

File tree

5 files changed

+28
-37
lines changed

5 files changed

+28
-37
lines changed

src/api/index.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,21 @@ export default {
2020
once(url) {
2121
return db.ref(url).once('value');
2222
},
23+
// the firebase 'listen' events aren't promises, so pass in the raw response
24+
// to be used with an inline callback
2325
listenForValueEvents(url, cb) {
24-
// only method that isn't `thenable` and requires inline callback
2526
db.ref(url).on('value', (snapshot) => {
26-
cb(snapshot.val());
27+
cb(snapshot);
28+
});
29+
},
30+
listenForAddedEvents(url, cb) {
31+
db.ref(url).on('child_added', (snapshot) => {
32+
cb(snapshot);
33+
});
34+
},
35+
listenForChangeEvents(url, cb) {
36+
db.ref(url).on('child_changed', (snapshot) => {
37+
cb(snapshot);
2738
});
2839
},
2940
set(url, payload) {

src/components/User/MyTrades.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
{{ filter }}
2626
</a>
2727
</p>
28-
<template v-if="userTradesReceived">
28+
<template v-if="userTrades">
2929
<trade-panel
3030
v-if="expanded"
3131
v-for="trade in filteredTrades"
@@ -68,7 +68,6 @@
6868
'currentDraft',
6969
'currentUser',
7070
'userTrades',
71-
'userTradesReceived',
7271
]),
7372
filteredTrades() {
7473
return this.filterTradesBy(this.selectedTradeFilter);

src/store/modules/trade.js

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { set } from 'vue';
12
import { database as fireDb } from 'firebase';
23
import keys from 'lodash/keys';
34
import map from 'lodash/map';
45
import filter from 'lodash/filter';
5-
import reduce from 'lodash/reduce';
66
import some from 'lodash/some';
77
import * as types from '../mutations';
88
import api from '../../api';
@@ -25,15 +25,13 @@ const Trade = (tradeProps) => {
2525
const state = {
2626
current: {},
2727
userTrades: {},
28-
userTradesReceived: false,
2928
acceptedTrades: {},
3029
};
3130

3231
// getters
3332
const getters = {
3433
currentTrade: stateObj => stateObj.current,
3534
userTrades: stateObj => stateObj.userTrades,
36-
userTradesReceived: stateObj => stateObj.userTradesReceived,
3735
acceptedTrades: stateObj => stateObj.acceptedTrades,
3836
getTradeById: stateObj => tradeId => stateObj.userTrades[tradeId],
3937
};
@@ -102,27 +100,17 @@ const actions = {
102100
});
103101
},
104102
getUserTrades({ commit }, { draft, user }) {
105-
// @TODO figure out why every trade gets looped after proposing
106-
// guess maybe something to do with snapshotting inside the map
107-
api.listenForValueEvents(`tradesUsersPivot/${draft}/${user}`, (userTrades) => {
108-
const tradeIds = keys(userTrades);
109-
const ref = db.ref(`trades/${draft}`);
110-
111-
Promise.all(
112-
tradeIds.map((id) => new Promise((resolve) => {
113-
ref.child(id).on('value', (trade) => {
114-
const snapshot = trade.val();
115-
commit(types.RECEIVE_USER_TRADE, snapshot);
116-
resolve(snapshot);
117-
});
118-
})),
119-
).then((trades) => {
120-
commit(types.RECEIVE_USER_TRADES, reduce(trades, (all, t) => {
121-
all[t.id] = t;
122-
return all;
123-
}, {}));
103+
const url = `tradesUsersPivot/${draft}/${user}`;
104+
const ref = db.ref(`trades/${draft}`);
105+
const getUserTrade = (key) => {
106+
ref.child(key).on('value', (childSnapshot) => {
107+
const trade = childSnapshot.val();
108+
commit(types.RECEIVE_USER_TRADE, trade);
124109
});
125-
});
110+
};
111+
112+
api.listenForAddedEvents(url, (snapshot) => getUserTrade(snapshot.key));
113+
api.listenForChangeEvents(url, (snapshot) => getUserTrade(snapshot.key));
126114
},
127115
proposeTrade({ commit }, { trade, draft }) {
128116
const tradeKey = db.ref('trades').push().key;
@@ -269,13 +257,8 @@ const mutations = {
269257
[types.RECEIVE_ACCEPTED_TRADES](stateObj, acceptedTrades) {
270258
stateObj.acceptedTrades = acceptedTrades;
271259
},
272-
[types.RECEIVE_USER_TRADES](stateObj, trades) {
273-
stateObj.userTrades = trades;
274-
stateObj.userTradesReceived = true;
275-
},
276260
[types.RECEIVE_USER_TRADE](stateObj, trade) {
277-
console.log(trade.id);
278-
stateObj.userTrades[trade.id] = trade;
261+
set(stateObj.userTrades, trade.id, trade);
279262
},
280263
[types.SAVE_TRADE](stateObj, { trade }) {
281264
stateObj.savedTrades.push(trade);
@@ -294,7 +277,6 @@ const mutations = {
294277
},
295278
[types.DESTROY_SESSION](stateObj) {
296279
stateObj.userTrades = {};
297-
stateObj.userTradesReceived = false;
298280
stateObj.current = {};
299281
},
300282
};

src/store/modules/watchlist.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ const actions = {
1818
getWatchlist({ commit }, { draft, user }) {
1919
if (state.watchlistReceived === false) {
2020
if (draft && user) {
21-
api.listenForValueEvents(`watchlists/${draft}/${user}`, (watchlist) => {
22-
commit(types.RECEIVE_WATCHLIST, watchlist);
21+
api.listenForValueEvents(`watchlists/${draft}/${user}`, (snapshot) => {
22+
commit(types.RECEIVE_WATCHLIST, snapshot.val());
2323
});
2424
}
2525
}

src/store/mutations.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export const RECEIVE_PLAYERS = 'RECEIVE_PLAYERS';
3535
// Trades
3636
export const SELECT_GIVING_TEAM = 'SELECT_RECEIVING_TEAM';
3737
export const SELECT_RECEIVING_TEAM = 'SELECT_RECEIVING_TEAM';
38-
export const RECEIVE_USER_TRADES = 'RECEIVE_USER_TRADES';
3938
export const RECEIVE_USER_TRADE = 'RECEIVE_USER_TRADE';
4039
export const CREATE_TRADE = 'CREATE_TRADE';
4140
export const ADD_GIVING_TEAM_PICK = 'ADD_GIVING_TEAM_PICK';

0 commit comments

Comments
 (0)