Learn more  » Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

skava / @skava/ui   js

Repository URL to install this package:

Version: 4.2.0-a11y.0 

/ src / components / molecules / DragAndDrop / state.ts

import { isObj } from 'exotic'

import { observable, action, computed } from 'xmobx/mobx'
import { oneStorage } from '@skava/persistence'
import { products } from './PLP_template.fixtures'
import { filterList } from './fixture'
import { reArrangeProducts } from './deps'
import { DraggableStateProps, ProductProps } from './typings'

export class DraggableState implements DraggableStateProps {
  @observable
  collisionProductId = 'none'

  @observable
  originalProducts: Array<ProductProps> = products

  @observable
  reArrangedProducts: Array<ProductProps> = []

  @observable
  isDragging = false

  @observable
  isActive = false

  @action.bound
  setItem(key: string, value: unknown) {
    this[key] = value
  }

  @computed
  get products() {
    if (this.reArrangedProducts.length) {
      return this.reArrangedProducts
    }
    return this.originalProducts
  }
  @computed
  get filterList() {
    if (this.reArrangedProducts.length) {
      return this.reArrangedProducts
    }
    return filterList
  }

  @action.bound
  onDragOver(value: string) {
    this.setItem('collisionProductId', value)
  }

  @action.bound
  onDragEnd(currentDragId: string, isFilter?: boolean) {
    const clonedProductList = isFilter
      ? reArrangeProducts(
          this.collisionProductId,
          currentDragId,
          this.filterList
        )
      : reArrangeProducts(this.collisionProductId, currentDragId, this.products)
    this.setItem('collisionProductId', 'none')
    this.setItem('reArrangedProducts', clonedProductList)
  }

  @action
  setDeletedProducts = (item: ProductProps) => {
    const removedProductsList: Array<string> = oneStorage.has('removedProducts')
      ? oneStorage.get('removedProducts')
      : []
    removedProductsList.push(item.id)
    oneStorage.set('removedProducts', removedProductsList)
  }
  @action.bound
  deleteProduct(index: number) {
    const clonedProductList = this.products
    const removedProduct = clonedProductList.splice(index, 1)
    this.setDeletedProducts(removedProduct[0])
    this.setItem('reArrangedProducts', clonedProductList)
  }
  @action
  replaceProductData = (index: number, product: ProductProps) => {
    this.products.splice(index, 1, product)
    this.setItem('reArrangedProducts', this.products)
  }
  @action
  setUpdatedProductsList = (product: ProductProps) => {
    const modifiedAttributes: ProductProps = {
      id: product.id,
      variant: product.variant,
      images: product.images,
    }
    let modifiedProducts = new Map([])
    let modifiedProductsList = []
    if (oneStorage.has('modifiedProducts')) {
      const clonedList = oneStorage.get('modifiedProducts')
      clonedList.forEach(value => {
        modifiedProducts.set(value.id, value)
      })
    }
    modifiedProducts.set(modifiedAttributes.id, modifiedAttributes)
    modifiedProducts.forEach((value, key) => {
      modifiedProductsList.push(value)
    })
    oneStorage.set('modifiedProducts', modifiedProductsList)
  }

  @action.bound
  updateProducts(updateParams) {
    const { product, shouldRemove } = updateParams
    this.products.forEach((item, index: number) => {
      if (item.id === product.id) {
        if (shouldRemove) {
          this.deleteProduct(index)
          return
        } else {
          this.replaceProductData(index, product)
          this.setUpdatedProductsList(product)
          return
        }
      }
    })
  }
}