import {
getNotificationCount,
getSessionUser,
getUserDetails,
getUserNotifications,
markMultipleNotificationsAsRead
} from './api/auth.js'
import {
sendRNMessage
} from './api/consts.js'
import {
fetchTrendingEvents,
fetchTrendingUsers,
fetchTrendingVenues,
fetchEventCats
} from './api/discover.js'
import {
getPostsForGarage,
getUserGarage
} from './api/garage.js'
import {
fetchPosts,
getPostsForUser
} from './api/posts.js'
import {
fetchWastes,
getWastesForUser
} from './api/waste.js'
var createStore = Framework7.createStore
const DEFAULT_SEARCH_RESULTS = {
events: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
users: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
venues: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
top_results: {
events: [],
users: [],
venues: [],
},
success: false,
}
const DEFAULT_PAGINATED_DATA = {
data: [],
new_data: [],
total_pages: 0,
page: 1,
limit: 10,
}
const store = createStore({
state: {
user: null,
posts: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
wastes: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
following_posts: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
registerData: {
user_id: '',
email: '',
password: '',
username: '',
},
myGarage: [],
myPosts: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
myWastes: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
myTags: {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
garageViewPosts: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
garageViewTags: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
scannedData: null,
scanningQrCode: false,
paths: {}, // Object to store unique paths and their data
userPaths: {}, // Object to store unique user paths and their data
userPathsUpdated: false,
notifications: [],
// discover page
trendingEvents: [],
trendingVenues: [],
eventCategories: [],
filteredEvents: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
filteredVenues: {
data: [],
total_pages: 0,
page: 1,
limit: 10,
},
discoverSearchData: DEFAULT_SEARCH_RESULTS,
trendingUsers: DEFAULT_PAGINATED_DATA,
// Search results
searchResults: DEFAULT_SEARCH_RESULTS,
notificationCount: 0,
poorNetworkError: false,
},
getters: {
checkPoorNetworkError({
state
}) {
return state.poorNetworkError
},
getNotifCount({
state
}) {
return state.notificationCount
},
getTrendingUsers({
state
}) {
return state.trendingUsers
},
getSearchResults({
state
}) {
return state.searchResults
},
getFilteredEvents({
state
}) {
return state.filteredEvents
},
getFilteredVenues({
state
}) {
return state.filteredVenues
},
getEventCategories({
state
}) {
return state.eventCategories
},
getTrendingEvents({
state
}) {
return state.trendingEvents
},
getTrendingVenues({
state
}) {
return state.trendingVenues
},
getPathData({
state
}) {
return state.paths
},
getUserPathUpdated({
state
}) {
return state.userPathsUpdated
},
getUserPathData({
state
}) {
return state.userPaths
},
getGarageViewPosts({
state
}) {
return state.garageViewPosts
},
getGarageViewWastes({
state
}) {
return state.garageViewWastes
},
getGarageViewTags({
state
}) {
return state.garageViewTags
},
user({
state
}) {
return state.user
},
getRegisterData({
state
}) {
return state.registerData
},
isAuthenticated({
state
}) {
return !!state.user
},
posts({
state
}) {
return state.posts
},
wastes({
state
}) {
return state.wastes
},
followingPosts({
state
}) {
return state.following_posts
},
myGarage({
state
}) {
return state.myGarage
},
myPosts({
state
}) {
return state.myPosts
},
myWastes({
state
}) {
return state.myWastes
},
myTags({
state
}) {
return state.myTags
},
scannedData({
state
}) {
return state.scannedData
},
isScanningQrCode({
state
}) {
return state.scanningQrCode
},
getNotifications({
state
}) {
return state.notifications
},
},
actions: {
updatePost({
state
}, {
post_id,
caption
}) {
// loop through the posts and find the post with the post_id
const posts = state.posts.data
const post = posts.find(p => p.id == post_id)
const myPosts = state.myPosts.data
const myPost = myPosts.find(p => p.id == post_id)
// update the post with the new data
if (post) {
// update the post with the new data
post.caption = caption
// update the state with the new posts
state.posts = {
...state.posts,
data: posts,
}
}
if (myPost) {
myPost.caption = caption
state.myPosts = {
...state.myPosts,
data: myPosts,
}
}
},
markNotificationsAsRead({
state
}, notification_ids) {
markMultipleNotificationsAsRead(notification_ids)
state.notificationCount = 0
},
async notificationCount({
state
}) {
const response = await getNotificationCount()
state.notificationCount = response.count
},
setSearchResults({
state
}, payload) {
state.searchResults = payload
},
async filterEvents({
state
}, {
filters,
page = 1
}) {
try {
const events = await fetchTrendingEvents(page, true, filters)
const data = {
new_data: events.data,
data: [
...state.filteredEvents.data,
...events.data,
],
total_pages: events.total_pages,
page: page,
limit: events.limit,
}
state.filteredEvents = data
} catch (error) {
console.error('Failed to filter events', error)
state.filteredEvents = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
async filterTrendingUsers({
state
}, page = 1) {
try {
const response = await fetchTrendingUsers(page)
const data = {
new_data: response.data,
data: [
...state.trendingUsers.data,
...response.data,
],
total_pages: response.total_pages,
page: page,
limit: response.limit,
}
state.trendingUsers = data
} catch (error) {
console.log('Failed to fetch trending users', error);
state.trendingUsers = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
async filterVenues({
state
}, {
filters,
page = 1
}) {
try {
const events = await fetchTrendingVenues(page, true, filters)
let existingVenues = state.filteredVenues.data.length > 0 ? state.filteredVenues.data : state.trendingVenues.data
const data = {
new_data: events.data,
data: [
...existingVenues,
...events.data,
],
total_pages: events.total_pages,
page: page,
limit: events.limit,
}
state.filteredVenues = data
} catch (error) {
console.error('Failed to filter venues', error)
state.filteredVenues = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
async fetchEventCategories({
state
}) {
const categories = await fetchEventCats()
state.eventCategories = categories
},
async getTrendingEvents({
state
}) {
const events = await fetchTrendingEvents(1, false)
state.trendingEvents = events
},
async getTrendingVenues({
state
}) {
const venues = await fetchTrendingVenues(1, false)
state.trendingVenues = venues
},
async fetchNotifications({
state
}) {
const notifications = await getUserNotifications()
state.notifications = notifications
},
async getUserPosts({
state
}, {
user_id,
page = 1,
clear = false
}) {
const posts = await getPostsForUser(user_id, page)
let prevUserPosts = {
data: []
}
if (!clear) {
if (state.userPaths[`user-${user_id}-posts`]) {
prevUserPosts = state.userPaths[`user-${user_id}-posts`]
}
}
const data = {
new_data: posts.data,
data: [
...prevUserPosts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
cleared: clear,
}
state.userPaths[`user-${user_id}-posts`] = data
state.userPathsUpdated = true
},
async getUserTags({
state
}, {
user_id,
page = 1,
clear = false
}) {
const posts = await getPostsForUser(user_id, page, true)
let prevUserPosts = {
data: []
}
if (!clear) {
if (state.userPaths[`user-${user_id}-tags`]) {
prevUserPosts = state.userPaths[`user-${user_id}-tags`]
}
}
const data = {
new_data: posts.data,
data: [
...prevUserPosts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
cleared: clear,
}
state.userPaths[`user-${user_id}-tags`] = data
state.userPathsUpdated = true
},
clearPathData({
state
}) {
state.paths = {}
},
setPathData({
state
}, {
path,
data
}) {
// Ensure the path key exists
if (!state.paths[path]) {
state.paths[path] = {}
}
// Update the data for the given path
state.paths[path] = {
...state.paths[path],
...data,
}
},
removePathData({
state
}, path) {
if (state.paths[path]) {
delete state.paths[path]
}
},
async login({
state
}, {
token
}) {
try {
const userDetails = await getUserDetails(token)
if (!userDetails || !userDetails.success) {
window.localStorage.removeItem('token_u6_driver')
throw new Error('User not found')
}
window.localStorage.setItem('token_u6_driver', token)
state.user = userDetails.user
setTimeout(() => {
sendRNMessage({
type: "authData",
user_id: userDetails.user.id,
page: 'auth',
})
}, 1000)
} catch (error) {
console.error('Login failed', error)
}
},
logout({
state
}) {
state.user = null
window.localStorage.removeItem('token_u6_driver')
window.location.reload()
},
async updateUserDetails({
state
}, external = false) {
const token = window.localStorage.getItem('token_u6_driver')
if (!token) {
return this.logout()
}
try {
const userDetails = await getUserDetails(token)
if (!userDetails || !userDetails.success) {
window.localStorage.removeItem('token_u6_driver')
throw new Error('User not found')
}
window.localStorage.setItem('token_u6_driver', token)
state.user = {
...userDetails.user,
refreshed: true,
external_refresh: external,
}
} catch (error) {
console.error('Login failed', error)
}
},
async checkAuth(context) {
const token = await getSessionUser()
if (token) {
await context.dispatch('login', {
token: token
})
} else {
window.localStorage.removeItem('token_u6_driver')
}
},
async getPosts({
state
}, page = 1) {
try {
console.log('Fetching posts', page);
const posts = await fetchPosts(page)
const data = {
new_data: posts.data,
data: [
...state.posts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: posts.page,
limit: posts.limit,
}
state.posts = data
} catch (error) {
console.error('Failed to fetch posts', error)
if (error.name === 'RequestTimeout') {
state.poorNetworkError = true
}
state.posts = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
/*
async getPosts({
state
}, {
page = 1,
reset = false
}) {
try {
console.log('Fetching posts', page, reset);
const posts = await fetchPosts(page)
if (reset) {
state.posts = {
new_data: posts.data,
data: posts.data,
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
reset: true,
}
return
}
const data = {
new_data: posts.data,
data: [
...state.posts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.posts = data
} catch (error) {
console.error('Failed to fetch posts', error)
if (error.name === 'RequestTimeout') {
state.poorNetworkError = true
}
state.posts = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},*/
async getWastes({
state
}, {
page = 1,
reset = false
}) {
try {
console.log('Fetching wastes', page, reset);
const wastes = await fetchWastes(page)
if (reset) {
state.wastes = {
new_data: wastes.data,
data: wastes.data,
total_pages: wastes.total_pages,
page: page,
limit: wastes.limit,
reset: true,
}
return
}
const data = {
new_data: wastes.data,
data: [
...state.wastes.data,
...wastes.data,
],
total_pages: wastes.total_pages,
page: page,
limit: wastes.limit,
}
state.wastes = data
} catch (error) {
console.error('Failed to fetch wastes', error)
if (error.name === 'RequestTimeout') {
state.poorNetworkError = true
}
state.wastes = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
async setGarageViewPosts({
state
}, garage_id, page = 1) {
const posts = await getPostsForGarage(garage_id, page)
let prevData = state.garageViewPosts.data
if (page === 1) {
prevData = []
}
const data = {
data: [
...prevData,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.garageViewPosts = data
},
async setGarageViewTags({
state
}, garage_id, page = 1) {
const posts = await getPostsForGarage(garage_id, page, true)
let prevData = state.garageViewTags.data
if (page === 1) {
prevData = []
}
const data = {
data: [
...prevData,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.garageViewTags = data
},
async getFollowingPosts({
state
}, page = 1) {
try {
const posts = await fetchPosts(page, true)
const data = {
new_data: posts.data,
data: [
...state.following_posts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.following_posts = data
} catch (error) {
console.error('Failed to fetch following posts', error)
if (error.name === 'RequestTimeout') {
state.poorNetworkError = true
}
state.following_posts = {
new_data: [],
data: [],
total_pages: 0,
page: 1,
limit: 10,
}
}
},
async setRegisterData({
state
}, {
email,
password,
username,
user_id
}) {
state.registerData = {
email: email,
password: password,
username: username,
user_id: user_id,
}
},
async getMyGarage({
state
}) {
const garage = await getUserGarage(state.user.id)
state.myGarage = garage
},
async getMyPosts({
state
}, {
page = 1,
clear = false
}) {
const posts = await getPostsForUser(state.user.id, page)
if (clear) {
state.myPosts = {
new_data: posts.data,
data: posts.data,
total_pages: posts.total_pages || 0,
page: page,
limit: posts.limit || 10,
cleared: true,
}
return
}
const data = {
new_data: posts.data,
data: [
...state.myPosts.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.myPosts = data
},
async getMyWastes({
state
}, {
page = 1,
clear = false
})
{
const wastes = await getWastesForUser(state.user.id, page)
if (clear) {
state.myWastes = {
new_data: wastes.data,
data: wastes.data,
total_pages: wastes.total_pages || 0,
page: page,
limit: wastes.limit || 10,
cleared: true,
}
return
}
const data = {
new_data: wastes.data,
data: [
...state.myWastes.data,
...wastes.data,
],
total_pages: wastes.total_pages,
page: page,
limit: wastes.limit,
}
state.myWastes = data
},
async getMyTags({
state
}, {
page = 1,
clear = false
}) {
const posts = await getPostsForUser(state.user.id, page, true)
if (clear) {
state.myTags = {
new_data: posts.data,
data: posts.data,
total_pages: posts.total_pages || 0,
page: page,
limit: posts.limit || 10,
cleared: true,
}
return
}
const data = {
new_data: posts.data,
data: [
...state.myTags.data,
...posts.data,
],
total_pages: posts.total_pages,
page: page,
limit: posts.limit,
}
state.myTags = data
},
setScannedData({
state
}, data) {
state.scannedData = data
},
setScanningQrCode({
state
}, value) {
state.scanningQrCode = value
},
},
})
export default store