vuex#mapGetters TypeScript Examples
The following examples show how to use
vuex#mapGetters.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Breadcrumbs.ts From vue-storefront-1 with MIT License | 6 votes |
Breadcrumbs = {
computed: {
...mapGetters({
getBreadcrumbsRoutes: 'breadcrumbs/getBreadcrumbsRoutes',
getBreadcrumbsCurrent: 'breadcrumbs/getBreadcrumbsCurrent'
}),
paths () {
const routes = this.routes ? this.routes : this.getBreadcrumbsRoutes
if (this.withHomepage) {
return [
{ name: i18n.t('Homepage'), route_link: localizedRoute('/', currentStoreView().storeCode) },
...routes
]
}
return routes
},
current () {
return this.activeRoute || this.getBreadcrumbsCurrent
}
},
props: {
routes: {
type: Array,
required: false,
default: null
},
withHomepage: {
type: Boolean,
default: false
},
activeRoute: {
type: String,
default: ''
}
}
}
Example #2
Source File: CartSummary.ts From vue-storefront-1 with MIT License | 6 votes |
CartSummary = {
name: 'CartSummary',
mixins: [Microcart],
computed: {
...mapGetters({
totals: 'cart/getTotals',
isVirtualCart: 'cart/isVirtualCart'
})
}
}
Example #3
Source File: Compare.ts From vue-storefront-1 with MIT License | 6 votes |
Compare = {
name: 'Compare',
mixins: [compareMountedMixin],
computed: {
...mapGetters({
items: 'compare/getCompareItems',
allComparableAttributes: 'attribute/getAllComparableAttributes'
})
},
created () {
if (!config.entities.attribute.loadByAttributeMetadata) {
this.$store.dispatch('attribute/list', {
filterValues: [],
filterField: 'is_user_defined'
})
}
},
methods: {
removeFromCompare (product: Product) {
return this.$store.state['compare']
? this.$store.dispatch('compare/removeItem', product)
: false
}
},
asyncData ({ store, route, context }) { // this is for SSR purposes to prefetch data
return new Promise((resolve, reject) => {
if (context) context.output.cacheTags.add(`compare`)
resolve()
})
}
}
Example #4
Source File: UserOrders.ts From vue-storefront-1 with MIT License | 6 votes |
UserOrders = {
name: 'UserOrders',
computed: {
...mapGetters('user', ['getOrdersHistory']),
ordersHistory () {
return this.getOrdersHistory
},
isHistoryEmpty () {
return this.getOrdersHistory.length < 1
}
},
methods: {
async remakeOrder (products) {
this.$bus.$emit('notification-progress-start', this.$t('Please wait ...'))
const productsToAdd = []
for (const item of products) {
const product = await this.$store.dispatch('product/single', { options: { sku: item.sku } })
product.qty = item.qty_ordered
productsToAdd.push(product)
}
await this.$store.dispatch('cart/addItems', { productsToAdd })
this.$bus.$emit('notification-progress-stop', {})
// Redirect to the cart straight away.
this.$router.push(this.localizedRoute('/checkout'))
},
skipGrouped (items) {
return items.filter((item) => {
return !item.parent_item_id
})
}
}
}
Example #5
Source File: WishlistButton.ts From vue-storefront-1 with MIT License | 6 votes |
WishlistButton = {
mixins: [wishlistMountedMixin],
computed: {
...mapGetters('wishlist', ['getWishlistItemsCount'])
},
methods: {
toggleWishlist () {
this.$store.dispatch('ui/toggleWishlist')
}
}
}
Example #6
Source File: CategorySort.ts From vue-storefront-1 with MIT License | 5 votes |
CategorySort = {
name: 'SortBy',
data () {
return {
sortby: ''
}
},
mounted () {
const sort = this.getCurrentCategoryProductQuery && this.getCurrentCategoryProductQuery.sort ? this.getCurrentCategoryProductQuery.sort : null
if (sort) {
const sortingOptionValues = Object.values(this.sortingOptions)
const sortOptionExist = sortingOptionValues.includes(sort)
if (sortOptionExist) {
this.sortby = sort
}
}
},
methods: {
// emit to category, todo: move all logic inside
sort () {
this.$emit('change', this.sortby)
// this.$bus.$emit('list-change-sort', { attribute: this.sortby })
}
},
computed: {
...mapGetters('category', ['getCurrentCategoryProductQuery']),
sortingOptions () {
return config.products.sortByAttributes
},
sortingVariants () {
let variants = []
Object.keys(this.sortingOptions).map(label => {
variants.push({
label: label,
id: this.sortingOptions[label],
type: 'sort'
})
})
return variants
}
}
}
Example #7
Source File: UserSingleOrder.ts From vue-storefront-1 with MIT License | 5 votes |
UserSingleOrder = {
name: 'UserSingleOrder',
computed: {
...mapGetters({
ordersHistory: 'user/getOrdersHistory'
}),
order () {
return this.ordersHistory.find(order =>
parseInt(order.entity_id) === parseInt(this.$route.params.orderId)
)
},
paymentMethod () {
return this.order && this.order.payment.additional_information[0]
},
billingAddress () {
return this.order && this.order.billing_address
},
shippingAddress () {
return this.order && this.order.extension_attributes.shipping_assignments[0].shipping.address
},
singleOrderItems () {
if (!this.order) return []
return this.order.items.filter((item) => {
return !item.parent_item_id
})
}
},
methods: {
async remakeOrder (products) {
this.$bus.$emit('notification-progress-start', this.$t('Please wait ...'))
const productsToAdd = []
for (const item of products) {
const product = await this.$store.dispatch('product/single', { options: { sku: item.sku } })
product.qty = item.qty_ordered
productsToAdd.push(product)
}
await this.$store.dispatch('cart/addItems', { productsToAdd })
this.$bus.$emit('notification-progress-stop', {})
// Redirect to the cart straight away.
this.$router.push(this.localizedRoute('/checkout'))
},
skipGrouped (items) {
return items.filter((item) => {
return !item.parent_item_id
})
}
}
}
Example #8
Source File: App.ts From vscode-todo-md with MIT License | 4 votes |
// needs to be global for recursive rendering
@Component({
components: {
VueContext,
TaskDetails: async () => import('./components/TaskDetails.vue'),
},
computed: {
...mapState(['tasksAsTree', 'filterInputValue', 'config', 'defaultFileSpecified', 'activeDocumentOpened', 'selectedTaskLineNumber']),
...mapGetters(['filteredSortedTasks', 'autocompleteItems']),
},
})
export default class App extends Vue {
tasksAsTree!: TheTask[];
filteredSortedTasks!: TheTask[];
filterInputValue!: string;
config!: ExtensionConfig['webview'];
defaultFileSpecified!: boolean;
activeDocumentOpened!: boolean;
autocompleteItems!: any;
/**
* `-1` When no task is selected.
*/
selectedTaskLineNumber!: number;
/**
* Task rename modal input value
*/
newTaskTitle = '';
contextMenuTask!: TheTask;
filteredSuggestions: {
data: string[];
}[] = [];
isSuggestVisible = false;
/**
* Hack to prevent keydown event opening suggest
*/
shouldHideSuggest = false;
shouldRevokeAutoShowSuggest = false;
showNotification = SendMessage.showNotification;
taskDetailsManuallyTriggered = false;
get taskDetailsVisible() {
return (this.config.showTaskDetails || this.taskDetailsManuallyTriggered) && this.selectedTaskLineNumber !== -1;
}
$refs!: {
autosuggest: any;
taskContextMenu: any;
newTaskText: HTMLInputElement;
taskDetails: TaskDetails;
};
// ──────────────────────────────────────────────────────────────────────
/**
* Highlight filter matches for single autocomplete item
*/
fuzzyHighlight(value: string) {
return fuzzysort.highlight(fuzzysort.single(this.filterInputValue, value) || undefined, '<mark>', '</mark>');
}
/**
* Open autocomplete on Ctrl+Space
*/
openSuggest() {
if (!this.config.autoShowSuggest) {
this.config.autoShowSuggest = true;
this.shouldRevokeAutoShowSuggest = true;
}
this.shouldHideSuggest = false;
}
onOpenedSuggest() {
this.isSuggestVisible = true;
}
onClosedSuggest() {
this.isSuggestVisible = false;
if (this.shouldRevokeAutoShowSuggest) {
this.config.autoShowSuggest = false;
this.shouldRevokeAutoShowSuggest = false;
}
}
/**
* Event that is fired when typing in filter input
*/
onFilterInputChange(value: string) {
this.shouldHideSuggest = false;
selectTaskMutation(-1);
updateFilterValueMutation(value);
this.filteredSuggestions = [{
data: fuzzysort.go(value, this.autocompleteItems[0].data).map(item => item.target),
}];
Vue.nextTick(() => {
this.$refs.autosuggest.setCurrentIndex(0);
this.selectFirstTask();
});
this.updateWebviewCounter(this.filteredSortedTasks.length);
}
onFilterChangeDebounced = debounce(this.onFilterInputChange, 100);
/**
* Event fired when accepting autocomplete suggestions
*/
onSelected(e: { item: string }) {
if (e) {
this.onFilterInputChange(e.item);
App.focusFilterInput();
}
}
/**
* Handle Tab keypress as Autocomplete accept suggestion
* (only when autocomplete is visible)
*/
tabHandler(e: KeyboardEvent) {
const { listeners, setCurrentIndex, setChangeItem, getItemByIndex } = this.$refs.autosuggest;
const item = getItemByIndex(this.$refs.autosuggest.currentIndex);
if (!item) {
return;
}
e.preventDefault();
setChangeItem(item, true);
this.$refs.autosuggest.loading = true;
listeners.selected(true);
}
async downHandler(e: KeyboardEvent) {
if (!this.filteredSuggestions.length || this.filteredSuggestions[0].data[0] === this.filterInputValue || !this.isSuggestVisible) {
this.shouldHideSuggest = true;
const selectedTaskLineNumber = await selectNextTaskAction();
if (selectedTaskLineNumber && !this.isSuggestVisible) {
this.scrollIntoView(selectedTaskLineNumber);
e.preventDefault();
}
return;
}
}
async upHandler(e: KeyboardEvent) {
if (!this.filteredSuggestions.length || this.filteredSuggestions[0].data[0] === this.filterInputValue || !this.isSuggestVisible) {
const selectedTaskLineNumber = await selectPrevTaskAction();
if (selectedTaskLineNumber && !this.isSuggestVisible) {
this.scrollIntoView(selectedTaskLineNumber);
e.preventDefault();
}
return;
}
}
deleteTask() {
SendMessage.deleteTask(this.contextMenuTask.lineNumber);
}
revealTask() {
SendMessage.revealTask(this.contextMenuTask.lineNumber);
}
startTask() {
SendMessage.startTask(this.contextMenuTask.lineNumber);
}
setDueDate() {
SendMessage.setDueDate(this.contextMenuTask.lineNumber);
}
onTaskListScroll() {
this.$refs.taskContextMenu.close();
}
// ──────────────────────────────────────────────────────────────────────
selectFirstTask() {
const firstTask = this.filteredSortedTasks[0];
if (firstTask) {
selectTaskMutation(firstTask.lineNumber);
}
}
updateWebviewCounter(numberOfTasks: number) {
SendMessage.updateWebviewTitle(numberOfTasks);
}
static focusFilterInput() {
Vue.nextTick(() => {
const suggest = document.getElementById('autosuggest__input');
if (suggest) {
suggest.focus();
}
});
}
focusFilterInput = App.focusFilterInput;
scrollIntoView(lineNumber: number) {
const element = document.getElementById(`ln${lineNumber}`);
// @ts-ignore https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded
element.scrollIntoViewIfNeeded(false);
}
// ──────────────────────────────────────────────────────────────────────
mounted() {
SendMessage.webviewLoaded();
App.focusFilterInput();
window.addEventListener('focus', App.focusFilterInput);
setTimeout(() => {
this.selectFirstTask();
}, 100);
this.$root.$on(VueEvents.openTaskContextMenu, (data: {e: MouseEvent; task: TheTask}) => {
this.contextMenuTask = data.task;
this.$refs.taskContextMenu.open(data.e);
});
this.$root.$on(VueEvents.focusFilterInput, () => {
App.focusFilterInput();
});
window.addEventListener('click', e => {
const link = (e.target as HTMLElement).closest('a');
if (link && link.dataset.href) {
SendMessage.followLink(link.dataset.href);
}
});
window.addEventListener('keydown', e => {
if (e.key === 'ArrowRight') {
SendMessage.toggleTaskCollapse(this.selectedTaskLineNumber);
} else if (e.key === 'Delete' && e.shiftKey) {
if (this.selectedTaskLineNumber !== -1) {
SendMessage.deleteTask(this.selectedTaskLineNumber);
}
} else if (e.key === 'Escape') {
selectTaskMutation(-1);
this.taskDetailsManuallyTriggered = false;
this.focusFilterInput();
} else if (e.key === 'd' && e.altKey) {
const task = getTaskAtLineWebview(this.selectedTaskLineNumber);
if (task) {
toggleDoneMutation(task);
}
} else if (e.key === 'F2') {
this.taskDetailsManuallyTriggered = true;
setTimeout(() => {
this.$refs.taskDetails.$refs.detailsTaskTitle.focus();
}, 100);
}
});
}
}
Example #9
Source File: OrderReview.ts From vue-storefront-1 with MIT License | 4 votes |
OrderReview = {
name: 'OrderReview',
props: {
isActive: {
type: Boolean,
required: true
}
},
data () {
return {
isFilled: false,
orderReview: {
terms: false
}
}
},
computed: {
...mapGetters({
isVirtualCart: 'cart/isVirtualCart',
getShippingDetails: 'checkout/getShippingDetails',
getPersonalDetails: 'checkout/getPersonalDetails'
})
},
methods: {
placeOrder () {
if (this.getPersonalDetails.createAccount) {
this.register()
} else {
this.$bus.$emit('checkout-before-placeOrder')
}
},
async register () {
this.$bus.$emit('notification-progress-start', i18n.t('Registering the account ...'))
try {
const result = await this.$store.dispatch('user/register', {
email: this.getPersonalDetails.emailAddress,
password: this.getPersonalDetails.password,
firstname: this.getPersonalDetails.firstName,
lastname: this.getPersonalDetails.lastName,
addresses: [{
firstname: this.getShippingDetails.firstName,
lastname: this.getShippingDetails.lastName,
street: [this.getShippingDetails.streetAddress, this.getShippingDetails.apartmentNumber],
city: this.getShippingDetails.city,
...(this.getShippingDetails.state ? { region: { region: this.getShippingDetails.state } } : {}),
country_id: this.getShippingDetails.country,
postcode: this.getShippingDetails.zipCode,
...(this.getShippingDetails.phoneNumber ? { telephone: this.getShippingDetails.phoneNumber } : {}),
default_shipping: true
}]
})
if (result.code !== 200) {
this.$bus.$emit('notification-progress-stop')
this.onFailure(result)
// If error includes a word 'password', emit event that eventually focuses on a corresponding field
if (result.result.includes(i18n.t('password'))) {
this.$bus.$emit('checkout-after-validationError', 'password')
}
// If error includes a word 'mail', emit event that eventually focuses on a corresponding field
if (result.result.includes(i18n.t('email'))) {
this.$bus.$emit('checkout-after-validationError', 'email-address')
}
} else {
this.$bus.$emit('modal-hide', 'modal-signup')
await this.$store.dispatch('user/login', {
username: this.getPersonalDetails.emailAddress,
password: this.getPersonalDetails.password
})
this.$bus.$emit('notification-progress-stop')
this.$bus.$emit('checkout-before-placeOrder', result.result.id)
this.onSuccess()
}
} catch (err) {
this.$bus.$emit('notification-progress-stop')
Logger.error(err, 'checkout')()
}
}
}
}
Example #10
Source File: Payment.ts From vue-storefront-1 with MIT License | 4 votes |
Payment = {
name: 'Payment',
props: {
isActive: {
type: Boolean,
required: true
}
},
data () {
return {
isFilled: false,
countries: Countries,
payment: this.$store.getters['checkout/getPaymentDetails'],
generateInvoice: false,
sendToShippingAddress: false,
sendToBillingAddress: false
}
},
computed: {
...mapState({
currentUser: (state: RootState) => state.user.current,
shippingDetails: (state: RootState) => state.checkout.shippingDetails
}),
...mapGetters({
paymentMethods: 'checkout/getPaymentMethods',
paymentDetails: 'checkout/getPaymentDetails',
isVirtualCart: 'cart/isVirtualCart'
})
},
created () {
if (!this.payment.paymentMethod || this.notInMethods(this.payment.paymentMethod)) {
this.payment.paymentMethod = this.paymentMethods.length > 0 ? this.paymentMethods[0].code : 'cashondelivery'
}
},
beforeMount () {
this.$bus.$on('checkout-after-load', this.onCheckoutLoad)
},
mounted () {
if (this.payment.firstName) {
this.initializeBillingAddress()
} else {
if (this.payment.company) {
this.generateInvoice = true
}
}
this.changePaymentMethod()
},
beforeDestroy () {
this.$bus.$off('checkout-after-load', this.onCheckoutLoad)
},
watch: {
shippingDetails: {
handler () {
if (this.sendToShippingAddress) {
this.copyShippingToBillingAddress()
}
},
deep: true
},
sendToShippingAddress: {
handler () {
this.useShippingAddress()
}
},
sendToBillingAddress: {
handler () {
this.useBillingAddress()
}
},
generateInvoice: {
handler () {
this.useGenerateInvoice()
}
},
paymentMethods: {
handler: debounce(function () {
this.changePaymentMethod()
}, 500)
}
},
methods: {
sendDataToCheckout () {
this.$bus.$emit('checkout-after-paymentDetails', this.payment, this.$v)
this.isFilled = true
},
edit () {
if (this.isFilled) {
this.$bus.$emit('checkout-before-edit', 'payment')
}
},
hasBillingData () {
if (this.currentUser) {
if (this.currentUser.hasOwnProperty('default_billing')) {
return true
}
}
return false
},
initializeBillingAddress () {
let initialized = false
if (this.currentUser) {
if (this.currentUser.hasOwnProperty('default_billing')) {
let id = this.currentUser.default_billing
let addresses = this.currentUser.addresses
for (let i = 0; i < addresses.length; i++) {
if (toString(addresses[i].id) === toString(id)) {
this.payment = {
firstName: addresses[i].firstname,
lastName: addresses[i].lastname,
company: addresses[i].company,
country: addresses[i].country_id,
state: addresses[i].region.region ? addresses[i].region.region : '',
city: addresses[i].city,
streetAddress: addresses[i].street[0],
apartmentNumber: addresses[i].street[1],
zipCode: addresses[i].postcode,
taxId: addresses[i].vat_id,
phoneNumber: addresses[i].telephone,
paymentMethod: this.paymentMethods[0].code
}
this.generateInvoice = true
this.sendToBillingAddress = true
initialized = true
}
}
}
}
if (!initialized) {
this.payment = this.paymentDetails || {
firstName: '',
lastName: '',
company: '',
country: '',
state: '',
city: '',
streetAddress: '',
apartmentNumber: '',
postcode: '',
zipCode: '',
phoneNumber: '',
taxId: '',
paymentMethod: this.paymentMethods.length > 0 ? this.paymentMethods[0].code : ''
}
}
},
useShippingAddress () {
if (this.sendToShippingAddress) {
this.copyShippingToBillingAddress()
this.sendToBillingAddress = false
}
if (!this.sendToBillingAddress && !this.sendToShippingAddress) {
this.payment = this.paymentDetails
}
},
copyShippingToBillingAddress () {
this.payment = {
firstName: this.shippingDetails.firstName,
lastName: this.shippingDetails.lastName,
country: this.shippingDetails.country,
state: this.shippingDetails.state,
city: this.shippingDetails.city,
streetAddress: this.shippingDetails.streetAddress,
apartmentNumber: this.shippingDetails.apartmentNumber,
zipCode: this.shippingDetails.zipCode,
phoneNumber: this.shippingDetails.phoneNumber,
paymentMethod: this.paymentMethods.length > 0 ? this.paymentMethods[0].code : ''
}
},
useBillingAddress () {
if (this.sendToBillingAddress) {
let id = this.currentUser.default_billing
let addresses = this.currentUser.addresses
for (let i = 0; i < addresses.length; i++) {
if (toString(addresses[i].id) === toString(id)) {
this.payment = {
firstName: addresses[i].firstname,
lastName: addresses[i].lastname,
company: addresses[i].company,
country: addresses[i].country_id,
state: addresses[i].region.region ? addresses[i].region.region : '',
city: addresses[i].city,
streetAddress: addresses[i].street[0],
apartmentNumber: addresses[i].street[1],
zipCode: addresses[i].postcode,
taxId: addresses[i].vat_id,
phoneNumber: addresses[i].telephone,
paymentMethod: this.paymentMethods.length > 0 ? this.paymentMethods[0].code : ''
}
this.generateInvoice = true
}
}
this.sendToShippingAddress = false
}
if (!this.sendToBillingAddress && !this.sendToShippingAddress) {
this.payment = this.paymentDetails
this.generateInvoice = false
}
},
useGenerateInvoice () {
if (!this.generateInvoice) {
this.payment.company = ''
this.payment.taxId = ''
}
},
getCountryName () {
for (let i = 0; i < this.countries.length; i++) {
if (this.countries[i].code === this.payment.country) {
return this.countries[i].name
}
}
return ''
},
getPaymentMethod () {
for (let i = 0; i < this.paymentMethods.length; i++) {
if (this.paymentMethods[i].code === this.payment.paymentMethod) {
return {
title: this.paymentMethods[i].title ? this.paymentMethods[i].title : this.paymentMethods[i].name
}
}
}
return {
name: ''
}
},
notInMethods (method) {
let availableMethods = this.paymentMethods
if (availableMethods.find(item => item.code === method)) {
return false
}
return true
},
changePaymentMethod () {
// reset the additional payment method component container if exists.
if (document.getElementById('checkout-order-review-additional-container')) {
document.getElementById('checkout-order-review-additional-container').innerHTML = '<div id="checkout-order-review-additional"> </div>' // reset
}
// Let anyone listening know that we've changed payment method, usually a payment extension.
if (this.payment.paymentMethod) {
this.$bus.$emit('checkout-payment-method-changed', this.payment.paymentMethod)
}
},
changeCountry () {
this.$store.dispatch('checkout/updatePaymentDetails', { country: this.payment.country })
this.$store.dispatch('cart/syncPaymentMethods', { forceServerSync: true })
},
onCheckoutLoad () {
this.payment = this.$store.getters['checkout/getPaymentDetails']
}
}
}
Example #11
Source File: PersonalDetails.ts From vue-storefront-1 with MIT License | 4 votes |
PersonalDetails = {
name: 'PersonalDetails',
props: {
isActive: {
type: Boolean,
required: true
},
focusedField: {
type: String,
required: false
}
},
data () {
return {
isFilled: false,
personalDetails: this.$store.state.checkout.personalDetails,
createAccount: false,
acceptConditions: false,
password: '',
rPassword: '',
isValidationError: false
}
},
computed: {
...mapState({
currentUser: (state: RootState) => state.user.current
}),
...mapGetters({
isVirtualCart: 'cart/isVirtualCart'
})
},
methods: {
onLoggedIn (receivedData) {
this.personalDetails = {
firstName: receivedData.firstname,
lastName: receivedData.lastname,
emailAddress: receivedData.email
}
},
sendDataToCheckout () {
if (this.createAccount) {
this.personalDetails.password = this.password
this.personalDetails.createAccount = true
} else {
this.personalDetails.createAccount = false
}
this.$bus.$emit('checkout-after-personalDetails', this.personalDetails, this.$v)
this.isFilled = true
this.isValidationError = false
},
edit () {
if (this.isFilled) {
this.$bus.$emit('checkout-before-edit', 'personalDetails')
}
},
gotoAccount () {
this.$bus.$emit('modal-show', 'modal-signup')
},
onCheckoutLoad () {
this.personalDetails = this.$store.state.checkout.personalDetails
}
},
updated () {
// Perform focusing on a field, name of which is passed through 'focusedField' prop
if (this.focusedField && !this.isValidationError) {
if (this.focusedField === 'password') {
this.isValidationError = true
this.password = ''
this.rPassword = ''
this.$refs['password'].setFocus('password')
}
}
},
beforeMount () {
this.$bus.$on('checkout-after-load', this.onCheckoutLoad)
this.$bus.$on('user-after-loggedin', this.onLoggedIn)
},
beforeDestroy () {
this.$bus.$off('checkout-after-load', this.onCheckoutLoad)
this.$bus.$off('user-after-loggedin', this.onLoggedIn)
}
}
Example #12
Source File: Shipping.ts From vue-storefront-1 with MIT License | 4 votes |
Shipping = {
name: 'Shipping',
props: {
isActive: {
type: Boolean,
required: true
}
},
beforeDestroy () {
this.$bus.$off('checkout-after-load', this.onCheckoutLoad)
this.$bus.$off('checkout-after-personalDetails', this.onAfterPersonalDetails)
this.$bus.$off('checkout-after-shippingset', this.onAfterShippingSet)
},
beforeMount () {
this.$bus.$on('checkout-after-load', this.onCheckoutLoad)
this.$bus.$on('checkout-after-personalDetails', this.onAfterPersonalDetails)
this.$bus.$on('checkout-after-shippingset', this.onAfterShippingSet)
},
data () {
return {
isFilled: false,
countries: Countries,
shipping: this.$store.state.checkout.shippingDetails,
shipToMyAddress: false,
myAddressDetails: {
firstname: '',
lastname: '',
country: '',
region: '',
city: '',
street: ['', ''],
postcode: '',
telephone: ''
}
}
},
computed: {
...mapState({
currentUser: (state: RootState) => state.user.current
}),
...mapGetters({
shippingMethods: 'checkout/getShippingMethods'
}),
checkoutShippingDetails () {
return this.$store.state.checkout.shippingDetails
},
paymentMethod () {
return this.$store.getters['checkout/getPaymentMethods']
}
},
watch: {
shippingMethods: {
handler () {
this.checkDefaultShippingMethod()
}
},
shipToMyAddress: {
handler () {
this.useMyAddress()
}
},
'$route.hash': 'useMyAddress'
},
mounted () {
this.checkDefaultShippingAddress()
this.checkDefaultShippingMethod()
this.changeShippingMethod()
},
methods: {
checkDefaultShippingAddress () {
this.shipToMyAddress = this.hasShippingDetails()
},
checkDefaultShippingMethod () {
if (!this.shipping.shippingMethod || this.notInMethods(this.shipping.shippingMethod)) {
let shipping = this.shippingMethods.find(item => item.default)
if (!shipping && this.shippingMethods && this.shippingMethods.length > 0) {
shipping = this.shippingMethods[0]
}
this.shipping.shippingMethod = shipping.method_code
this.shipping.shippingCarrier = shipping.carrier_code
}
},
onAfterShippingSet (receivedData) {
this.shipping = receivedData
this.isFilled = true
},
onAfterPersonalDetails (receivedData) {
if (!this.isFilled) {
this.$store.dispatch('checkout/updatePropValue', ['firstName', receivedData.firstName])
this.$store.dispatch('checkout/updatePropValue', ['lastName', receivedData.lastName])
}
this.useMyAddress()
},
sendDataToCheckout () {
this.$bus.$emit('checkout-after-shippingDetails', this.shipping, this.$v)
this.isFilled = true
},
edit () {
if (this.isFilled) {
this.$bus.$emit('checkout-before-edit', 'shipping')
}
},
hasShippingDetails () {
if (this.currentUser) {
if (this.currentUser.hasOwnProperty('default_shipping')) {
let id = this.currentUser.default_shipping
let addresses = this.currentUser.addresses
for (let i = 0; i < addresses.length; i++) {
if (toString(addresses[i].id) === toString(id)) {
this.myAddressDetails = addresses[i]
return true
}
}
}
}
return false
},
useMyAddress () {
if (this.shipToMyAddress) {
this.$set(this, 'shipping', {
firstName: this.myAddressDetails.firstname,
lastName: this.myAddressDetails.lastname,
country: this.myAddressDetails.country_id,
state: this.myAddressDetails.region.region ? this.myAddressDetails.region.region : '',
city: this.myAddressDetails.city,
streetAddress: this.myAddressDetails.street[0],
apartmentNumber: this.myAddressDetails.street[1],
zipCode: this.myAddressDetails.postcode,
phoneNumber: this.myAddressDetails.telephone,
shippingMethod: this.checkoutShippingDetails.shippingMethod,
shippingCarrier: this.checkoutShippingDetails.shippingCarrier
})
} else {
this.$set(this, 'shipping', this.checkoutShippingDetails)
}
this.changeCountry()
},
getShippingMethod () {
for (let i = 0; i < this.shippingMethods.length; i++) {
if (this.shippingMethods[i].method_code === this.shipping.shippingMethod) {
return {
method_title: this.shippingMethods[i].method_title,
amount: this.shippingMethods[i].amount
}
}
}
return {
method_title: '',
amount: ''
}
},
getCountryName () {
for (let i = 0; i < this.countries.length; i++) {
if (this.countries[i].code === this.shipping.country) {
return this.countries[i].name
}
}
return ''
},
changeCountry () {
this.$bus.$emit('checkout-before-shippingMethods', this.shipping.country)
},
getCurrentShippingMethod () {
let shippingCode = this.shipping.shippingMethod
let currentMethod = this.shippingMethods ? this.shippingMethods.find(item => item.method_code === shippingCode) : {}
return currentMethod
},
changeShippingMethod () {
let currentShippingMethod = this.getCurrentShippingMethod()
if (currentShippingMethod) {
this.shipping = Object.assign(this.shipping, { shippingCarrier: currentShippingMethod.carrier_code })
this.$bus.$emit('checkout-after-shippingMethodChanged', {
country: this.shipping.country,
method_code: currentShippingMethod.method_code,
carrier_code: currentShippingMethod.carrier_code,
payment_method: this.paymentMethod[0].code
})
}
},
notInMethods (method) {
let availableMethods = this.shippingMethods
if (availableMethods.find(item => item.method_code === method)) {
return false
}
return true
},
onCheckoutLoad () {
this.shipping = this.$store.state.checkout.shippingDetails
}
}
}