|
@@ -11,22 +11,26 @@
|
|
|
|
|
|
<hr class="section-horizontal-rule" />
|
|
|
|
|
|
- <activity-item
|
|
|
- class="item activity-item universal-item"
|
|
|
- v-for="activity in sortedActivities"
|
|
|
- :key="activity._id"
|
|
|
- :activity="activity"
|
|
|
- >
|
|
|
- <div slot="actions">
|
|
|
- <a
|
|
|
- v-if="userId === myUserId"
|
|
|
- href="#"
|
|
|
- @click.prevent="hideActivity(activity._id)"
|
|
|
- >
|
|
|
- <i class="material-icons hide-icon">visibility_off</i>
|
|
|
- </a>
|
|
|
- </div>
|
|
|
- </activity-item>
|
|
|
+ <div id="activity-items" @scroll="handleScroll">
|
|
|
+ <activity-item
|
|
|
+ class="item activity-item universal-item"
|
|
|
+ v-for="activity in activities"
|
|
|
+ :key="activity._id"
|
|
|
+ :activity="activity"
|
|
|
+ >
|
|
|
+ <div slot="actions">
|
|
|
+ <a
|
|
|
+ v-if="userId === myUserId"
|
|
|
+ href="#"
|
|
|
+ @click.prevent="hideActivity(activity._id)"
|
|
|
+ >
|
|
|
+ <i class="material-icons hide-icon"
|
|
|
+ >visibility_off</i
|
|
|
+ >
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ </activity-item>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div v-else>
|
|
|
<h3>No recent activity.</h3>
|
|
@@ -35,7 +39,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { mapState, mapActions } from "vuex";
|
|
|
+import { mapState } from "vuex";
|
|
|
import Toast from "toasters";
|
|
|
|
|
|
import io from "../../../io";
|
|
@@ -50,15 +54,17 @@ export default {
|
|
|
default: ""
|
|
|
}
|
|
|
},
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ activities: [],
|
|
|
+ position: 1,
|
|
|
+ maxPosition: 1,
|
|
|
+ offsettedFromNextSet: 0,
|
|
|
+ isGettingSet: false
|
|
|
+ };
|
|
|
+ },
|
|
|
computed: {
|
|
|
- sortedActivities() {
|
|
|
- const { activities } = this;
|
|
|
- return activities.sort(
|
|
|
- (x, y) => new Date(y.createdAt) - new Date(x.createdAt)
|
|
|
- );
|
|
|
- },
|
|
|
...mapState({
|
|
|
- activities: state => state.user.activities.activities,
|
|
|
...mapState("modalVisibility", {
|
|
|
modals: state => state.modals.station
|
|
|
}),
|
|
@@ -78,25 +84,30 @@ export default {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- this.socket.emit("activities.getSet", this.userId, 1, res => {
|
|
|
- if (res.status === "success")
|
|
|
- this.addSetOfActivities({
|
|
|
- activities: res.data,
|
|
|
- set: 1
|
|
|
- });
|
|
|
+ this.socket.emit("activities.length", this.userId, length => {
|
|
|
+ this.maxPosition = Math.ceil(length / 15) + 1;
|
|
|
+ this.getSet();
|
|
|
});
|
|
|
|
|
|
- this.socket.on("event:activity.create", activity =>
|
|
|
- this.addActivity(activity)
|
|
|
- );
|
|
|
+ this.socket.on("event:activity.create", activity => {
|
|
|
+ this.activities.unshift(activity);
|
|
|
+ this.offsettedFromNextSet += 1;
|
|
|
+ });
|
|
|
|
|
|
- this.socket.on("event:activity.hide", activityId =>
|
|
|
- this.removeActivity(activityId)
|
|
|
- );
|
|
|
+ this.socket.on("event:activity.hide", activityId => {
|
|
|
+ this.activities = this.activities.filter(
|
|
|
+ activity => activity._id !== activityId
|
|
|
+ );
|
|
|
|
|
|
- this.socket.on("event:activity.removeAllForUser", () =>
|
|
|
- this.removeAllActivities()
|
|
|
- );
|
|
|
+ this.offsettedFromNextSet -= 1;
|
|
|
+ });
|
|
|
+
|
|
|
+ this.socket.on("event:activity.removeAllForUser", () => {
|
|
|
+ this.activities = [];
|
|
|
+ this.position = 1;
|
|
|
+ this.maxPosition = 1;
|
|
|
+ this.offsettedFromNextSet = 0;
|
|
|
+ });
|
|
|
});
|
|
|
},
|
|
|
methods: {
|
|
@@ -106,12 +117,45 @@ export default {
|
|
|
new Toast({ content: res.message, timeout: 3000 });
|
|
|
});
|
|
|
},
|
|
|
- ...mapActions("user/activities", [
|
|
|
- "addSetOfActivities",
|
|
|
- "addActivity",
|
|
|
- "removeActivity",
|
|
|
- "removeAllActivities"
|
|
|
- ])
|
|
|
+ getSet() {
|
|
|
+ if (this.isGettingSet) return;
|
|
|
+ if (this.position >= this.maxPosition) return;
|
|
|
+
|
|
|
+ this.isGettingSet = true;
|
|
|
+
|
|
|
+ this.socket.emit(
|
|
|
+ "activities.getSet",
|
|
|
+ this.userId,
|
|
|
+ this.position,
|
|
|
+ this.offsettedFromNextSet,
|
|
|
+ res => {
|
|
|
+ if (res.status === "success") {
|
|
|
+ this.activities.push(...res.data);
|
|
|
+ this.position += 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.isGettingSet = false;
|
|
|
+ }
|
|
|
+ );
|
|
|
+ },
|
|
|
+ handleScroll(event) {
|
|
|
+ const scrollPosition =
|
|
|
+ event.target.clientHeight + event.target.scrollTop;
|
|
|
+ const bottomPosition = event.target.scrollHeight;
|
|
|
+
|
|
|
+ if (this.loadAllSongs) return false;
|
|
|
+
|
|
|
+ if (scrollPosition + 100 >= bottomPosition) this.getSet();
|
|
|
+
|
|
|
+ return this.maxPosition === this.position;
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+#activity-items {
|
|
|
+ overflow: auto;
|
|
|
+ height: 600px;
|
|
|
+}
|
|
|
+</style>
|