initial: bootstrap from BukidBountyApp base
This commit is contained in:
160
resources/js/stores/store.js
Normal file
160
resources/js/stores/store.js
Normal file
@@ -0,0 +1,160 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import axios from 'axios'
|
||||
import { useOPFS } from '../composables/useOPFS'
|
||||
|
||||
const opfs = useOPFS()
|
||||
const CACHE_KEY_STORES = 'cached_stores.json'
|
||||
|
||||
export const useStoreStore = defineStore('store', {
|
||||
state: () => ({
|
||||
stores: [],
|
||||
currentStore: null,
|
||||
storeProducts: [],
|
||||
loading: false,
|
||||
error: null
|
||||
}),
|
||||
actions: {
|
||||
async fetchStores() {
|
||||
this.loading = true
|
||||
this.error = null
|
||||
|
||||
// Load from cache first
|
||||
try {
|
||||
const cachedStores = await opfs.loadJSON(CACHE_KEY_STORES)
|
||||
if (cachedStores && Array.isArray(cachedStores)) {
|
||||
this.stores = cachedStores
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('Failed to load stores from cache:', e)
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await axios.get('/api/stores')
|
||||
this.stores = response.data || []
|
||||
|
||||
// Save to cache
|
||||
await opfs.saveJSON(CACHE_KEY_STORES, this.stores)
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch stores:', error)
|
||||
this.error = error.message
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
|
||||
async fetchStoreByHash(hash) {
|
||||
this.loading = true
|
||||
this.error = null
|
||||
try {
|
||||
const response = await axios.get(`/api/stores/${hash}`)
|
||||
if (response.data && response.data.success) {
|
||||
this.currentStore = response.data.store
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch store:', error)
|
||||
this.error = error.message
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
|
||||
async createStore(data) {
|
||||
this.loading = true
|
||||
this.error = null
|
||||
try {
|
||||
const response = await axios.post('/api/stores', data)
|
||||
if (response.data && response.data.success) {
|
||||
this.stores.push(response.data.store)
|
||||
}
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('Failed to create store:', error)
|
||||
this.error = error.message
|
||||
throw error
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
|
||||
async updateStore(id, data) {
|
||||
this.loading = true
|
||||
this.error = null
|
||||
try {
|
||||
const response = await axios.put(`/api/stores/${id}`, data)
|
||||
if (response.data && response.data.success) {
|
||||
const index = this.stores.findIndex(s => s.id === id)
|
||||
if (index !== -1) {
|
||||
this.stores[index] = response.data.store
|
||||
}
|
||||
}
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('Failed to update store:', error)
|
||||
this.error = error.message
|
||||
throw error
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
|
||||
async deleteStore(id) {
|
||||
this.loading = true
|
||||
this.error = null
|
||||
try {
|
||||
const response = await axios.delete(`/api/stores/${id}`)
|
||||
if (response.data && response.data.success) {
|
||||
this.stores = this.stores.filter(s => s.id !== id)
|
||||
}
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('Failed to delete store:', error)
|
||||
this.error = error.message
|
||||
throw error
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
|
||||
async fetchStoreProducts(storeId) {
|
||||
try {
|
||||
const response = await axios.get(`/api/stores/${storeId}/products`)
|
||||
this.storeProducts = response.data || []
|
||||
return this.storeProducts
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch store products:', error)
|
||||
throw error
|
||||
}
|
||||
},
|
||||
|
||||
async addProductToStore(storeId, productId, quantity, price) {
|
||||
try {
|
||||
const response = await axios.post(`/api/stores/${storeId}/products`, {
|
||||
product_id: productId,
|
||||
quantity: quantity,
|
||||
price: price
|
||||
})
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('Failed to add product to store:', error)
|
||||
throw error
|
||||
}
|
||||
},
|
||||
|
||||
async removeProductFromStore(storeId, productId) {
|
||||
try {
|
||||
const response = await axios.delete(`/api/stores/${storeId}/products/${productId}`)
|
||||
if (response.data && response.data.success) {
|
||||
this.storeProducts = this.storeProducts.filter(p => p.product_id !== productId)
|
||||
}
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('Failed to remove product from store:', error)
|
||||
throw error
|
||||
}
|
||||
},
|
||||
|
||||
resetCurrentStore() {
|
||||
this.currentStore = null
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user