Skip to content

Instantly share code, notes, and snippets.

@cray0000
Last active June 6, 2018 10:59
Show Gist options
  • Save cray0000/99002d19ff224c2739e3c5c7a76a5366 to your computer and use it in GitHub Desktop.
Save cray0000/99002d19ff224c2739e3c5c7a76a5366 to your computer and use it in GitHub Desktop.
ROUGH Example on how to use new React Sharedb (not working)
import React from 'react'
import {model, subscribe} from 'react-sharedb'
model.set('_session.userId', model.id()) // Это приходит из сервака
/*
# Текущий юзер хранится в _session.userId
users {
firstName
lastName
}
games {
title
}
players {
gameId,
userId
}
*/
// доставем user
@subscribe(() => ({
userId: '_session.userId',
user: ['users', model.get('_session.userId')],
users: ['users', {}]
}), (props) => {
let { user } = props.scope
return {
addresses: ['addresses', { userId: user.id }]
}
})
class App extends React.Component {
constructor (...args) {
super(...args)
let { $scope, $user, $userId, $users } = this.props
$users // то же самое что и $scope.at('users') -- то есть это массив, а не коллекция
model.ref('_session.user', $user.path())
model.set('_session.userId', 'NewUserId')
$scope.set('userId', 'NewUserId')
$userId.set('NewUserId')
$scope.start('fullName', $user.at('firstName'), $user.at('lastName'), this.getFullName)
setInterval(this.doTask, 1000)
}
getFullName = (firstName, lastName) => {
return firstName + ' ' + lastName
}
handleSomething = () => {
}
doTask = () => {
let { $scope } = this.props
let { scope } = this.props
console.log(scope.myName) // 'Pavel'
$scope.setEach({
myName: 'Artur',
points: 2000
})
console.log(scope.myName) // 'Artur'
}
onInputChange = (e) => {
let { $game } = this.props
let value = e.target.value
$game.set('title', value)
}
render () {
let { scope } = this.props
let { get } = this.props.$scope
let { myName, user, userId, showFullName, game } = this.props.scope
return (
<div>
<div>{get(`game.users.${userId}.scores.points`) || 'Default'}</div>
{ showFullName && <div>scope.fullName</div> }
<input
value={myName}
onChange={this.onInputChange}
/>
<button onClick={this.handleSomething}>Handle something</button>
<button onClick={this.doTask}>Do task</button>
<PageGame
user={user}
/>
</div>
)
}
}
// доставем user
@subscribe(() => ({
userId: '_session.userId',
user: '_session.user',
game: ['games', 'myGameId']
}))
class PageGame extends React.Component {
constructor (...args) {
super(...args)
let { $user, $game } = this.props
model.ref('_page.game', $game)
$user.set('firstName', 'Tim')
}
}
@subscribe(() => ({
game: '_page.game'
}))
class Player extends React.Component {
}
class Profile extends React.Component {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment