|  | @@ -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>
 |