vue-mobx-finegrained
Version:
Vue 3 composable for a complete MobX state management integration.
369 lines (282 loc) • 8.19 kB
text/typescript
import { inject, injectable } from 'inversify'
import { action, makeObservable, observable, computed, comparer } from 'mobx'
import { AuthenticationRepository } from './AuthenticationRepository'
import { MessagesPresenter } from '../Core/Messages/MessagesPresenter'
import { MessagesRepository } from '../Core/Messages/MessagesRepository'
import { Router } from '../Routing/Router'
import { useMobX, notify } from '@/useMobX';
import { isReactive, watch } from "vue";
class Test {
hello = 1
}
export class LoginRegisterPresenter extends MessagesPresenter {
test
testNonObservable = 1
testNonObservableObject = {
prop: {
prop: {
prop: 1
}
}
}
object
authenticationRepository: AuthenticationRepository
messagesRepository: MessagesRepository
router: Router
email = null
password2 = {
alala: 1,
ba: {
sasa: {
va: 'hi',
},
rara: 'la'
}
}
password = [{
test: {
rest: {
lest: 'best'
}
},
arr: [1, 2]
}, 'asdvsdv', 'abasbd', 'absbasd']
option = null
observables = {
test: observable,
_string: observable,
_number: observable,
_boolean: observable,
_array: observable,
_arraySplice: observable,
_arrayUnshift: observable,
_arrayPop: observable,
_arrayShift: observable,
_object: observable,
_objectUpdate: observable,
_objectDelete: observable,
_nobject: observable,
_nobjectUpdate: observable,
_nobjectDelete: observable,
_arrayReassign: observable,
_objectReassign: observable,
_getterObject: observable,
getterObject: computed,
_getterArray: observable,
getterArray: computed,
_getterNestedArray: observable,
getterNestedArray: computed,
_getterNestedObject: observable,
getterNestedObject: computed,
mapObject: observable,
setObject: observable,
mapObjectVisual: observable,
setObjectVisual: observable,
email: observable,
password: observable,
password2: observable,
option: observable,
reset: action,
login: action,
register: action,
// addObjectProperty: action,
logOut: action,
// setAuthRepoTest: action,
awesome: computed,
viewTest: computed,
viewTest2: computed,
_awesome: observable
}
_string = 'string'
_number = 1
_boolean = true
_array = []
_arraySplice = [1, 3, 5]
_arrayUnshift = [1, 2]
_arrayPop = [1, 2]
_arrayShift = [1, 2]
_narray = [[[]]]
_narraySplice = [[[1, 3, 5]]]
_narrayUnshift = [[[1, 2]]]
_narrayPop = [[[1, 2]]]
_narrayShift = [[[1, 2]]]
_object = {}
_objectUpdate = { prop: 1 }
_objectDelete = { prop: 1 }
_nobject = { nest: { nest: {} } }
_nobjectUpdate = { nest: { nest: { prop: 1 } } }
_nobjectDelete = { nest: { nest: { prop: 1 } } }
_arrayReassign = [{ prop: 1 }]
_objectReassign = { prop: { prop: 1 } }
_getterArray = []
_getterNestedArray = [{ prop: 1, prop2: 2, prop3: { prop: 1 } }]
_getterObject = {}
_getterNestedObject = {
prop: 1,
prop2: 2,
prop3: { prop: 1, prop2: 2 }
}
mapObject = new Map()
setObject = new Set()
mapObjectVisual = new Map([[2,200]])
setObjectVisual = new Set([1])
get getterArray () {
return this._getterArray.map(el => {
return { prop: el.prop, prop2: el.prop2 }
})
}
set getterArray (value) {
this._getterArray = value
}
get getterNestedArray () {
return this._getterNestedArray.map(el => {
return { prop: el.prop, prop2: el.prop2, prop3: el.prop3 }
})
}
set getterNestedArray (value) {
this._getterNestedArray = value
}
get getterObject () {
return this._getterObject
}
get getterNestedObject () {
return this._getterNestedObject
}
get vm () {
const observables = {
...this.observables,
...this.messagesObservables
}
return useMobX(this, observables)
}
constructor () {
super()
makeObservable(this, this.observables)
this.init()
}
get viewTest () {
return this.authenticationRepository.testVariable.map(pm => {
return { test1: pm.test1 + '(mapped)', sub: pm.sub, test2: pm.test2 + '(mapped)' }
})
}
get viewTest2 () {
return this.authenticationRepository.testVariable2
}
set viewTest (value) {
this.authenticationRepository.testVariable = value
}
setAuthRepoTest () {
this.authenticationRepository.testVariable.push(
{ test1: 'test1!', test2: 'test1!', sub: { test: 'yes' } }
)
}
_awesome = 0
//
set viewTest (value) {
console.log('this!', this)
this.authenticationRepository.testVariable = value
}
setAuthRepoTest () {
this.authenticationRepository.testVariable.push(
{ test1: 'test1!', test2: 'test1!', sub: { test: 'yes' } }
)
}
_awesome = 0
get awesome () {
return this._awesome
}
set awesome (value) {
this._awesome = value
}
setAuthRepoArrayKey () {
console.log('this.authenticationRepository.testVariable[0]', this.authenticationRepository.testVariable[0])
this.authenticationRepository.testVariable[0].sub.test = 'aaaaaaaaaaa';
this.authenticationRepository.testVariable[0].sub.rest = 'aaaaaaaaaaa';
this.authenticationRepository.testVariable[0]
= notify(this.authenticationRepository.testVariable[0])
}
setInjectableObservableSubProperties () {
console.log('this.authenticationRepository.testVariable2', this.authenticationRepository.testVariable2)
this.authenticationRepository.testVariable2.awesome.super = 'test'
this.authenticationRepository.testVariable2.awesome.duper = 'test'
this.authenticationRepository.testVariable2
= notify(this.authenticationRepository.testVariable2)
}
setObjectSubProperty () {
delete this.password[0].test.rest.lest
}
addObjectSubProperty () {
this.password[0].test.bla = true
}
addObjectProperty () {
this.password2.test= true
this.password2.test2= true
this.password2.test2= true
}
deleteSubObjectProperty () {
delete this.password2.ba.sasa
}
setSpliceArrayProperty () {
this.password.splice(1, 1, 'test')
}
setSubProperty() {
this.password2.alala = 2
}
setProperty() {
this.password2 = { haha: true}
console.log('this.password2', this.password2)
}
setPushArrayItem () {
this.password.push('testing push')
}
setPushSubObjectArrayItem () {
// this.password[0].arr.splice(this.password[0].arr.length, 0, ['array', 'list'])
this.password[0].arr.push(['array', 'list'])
}
setViewTestViaMethod () {
this.viewTest = [{ test1: 'aloha', sub: { test: 'mmmmmm' } }]
}
reset () {
this.email = 'test@test.ca'
// this.password = ''
this.option = 'login'
}
async login () {
const loginPm = await this.authenticationRepository.login(this.email, this.password)
console.log('this', this)
this.unpackRepositoryPmToVm(loginPm, 'User logged in')
if (loginPm.success) {
this.router.goToId('homeLink')
}
}
async register () {
const registerPm = await this.authenticationRepository.register(this.email, this.password)
console.log('this', this)
this.unpackRepositoryPmToVm(registerPm, 'User registered')
}
async logOut () {
this.authenticationRepository.logOut()
this.router.goToId('loginLink')
}
formValid () {
const clientValidationMessages = []
if (this.email === '') clientValidationMessages.push('No email')
if (this.password === '') clientValidationMessages.push('No password')
this.messagesRepository.clientMessages = clientValidationMessages
return clientValidationMessages.length === 0
}
#testFunct () {
}
watchSomething = () => {
console.log(this.vm._objectReassign, isReactive(this.vm._objectReassign))
// console.log('this.vm', this.vm)
watch(this.vm._objectReassign, newValue => {
console.log('watching...')
}, { deep: true })
}
doArrayReassign () {
console.log('doArrayReassign', this._arrayReassign[0].newProp)
}
}