cozy-client v.1.0

import CozyClient from 'cozy-client'

const client = new CozyClient({
  uri: 'http://cozy.tools:8080',
  token: '...'
})

client
  .find('io.cozy.todos', { checked: false })
  .then(
    ({ data }) => console.log(data)
  )

client
  .create('io.cozy.todos', { label: 'Buy bread' })
  .then(
    ({ data }) => client.save({ ...data, checked: true })
  )

client.destroy(document)

client.upload(file, dirPath)

client.download(files, 'my-archive')
import React from 'react'
import { Query } from 'cozy-client'

const query = cozy => cozy.find('io.cozy.todos').where({ checked: false })

const TodoList = () => (
  <Query query={query}>
    {({ data, fetchStatus }) =>
      fetchStatus !== 'loaded'
        ? <h1>Loading...</h1>
        : <ul>{data.map(todo => <li>{todo.label}</li>)}</ul>
    }
  </Query>
  • fetchStatus
  • data
  • hasMore
  • fetchMore()
  • refetch()

Mutations

import React from 'react'
import { Query } from 'cozy-client'
import TodoList from './TodoList'

const query = cozy => cozy.find('io.cozy.todos').where({ checked: false })

const TodoApp = () => (
  <Query query={query}>
    {({ data, fetchStatus }, { createDocument, deleteDocument }) =>
      fetchStatus !== 'loaded'
        ? <h1>Loading...</h1>
        : <TodoList 
            todos={data}
            onSubmit={createDocument} 
            onDelete={deleteDocument} />
    }
  </Query>
import React from 'react'
import { Query } from 'cozy-client'
import TodoList from './TodoList'

const query = cozy => cozy.find('io.cozy.todos').where({ checked: false })

const mutations = client => ({
  checkTodo: todo => client.save({ ...todo, checked: true })
})

const TodoApp = () => (
  <Query query={query} mutations={mutations}>
    {({ data, fetchStatus }, { createDocument, checkTodo }) =>
      fetchStatus !== 'loaded'
        ? <h1>Loading...</h1>
        : <TodoList 
            todos={data}
            onSubmit={createDocument} 
            onCheck={checkTodo} />
    }
  </Query>

Schémas

import CozyClient from 'cozy-client'

const TODO_SCHEMA = {
  todos: {
    doctype: 'io.cozy.todos',
    relationships: {
      attachments: {
        type: 'has-many',
        doctype: 'io.cozy.files'
      }
    }
  }
}

const client = new CozyClient({
  uri: '...',
  token: '...',
  schema: TODO_SCHEMA
})
import React from 'react'
import { Query } from 'cozy-client'
import TodoList from './TodoList'

const query = cozy => 
  cozy
    .find('io.cozy.todos')
    .where({ checked: false })
    .include(['attachments'])

const mutations = client => ({
  addAttachment: (todo, file) => 
    client
      .getAssociation(todo, 'attachments')
      .add(file)
})

const TodoApp = () => (
  <Query query={query} mutations={mutations}>
    {({ data, fetchStatus }, { createDocument, addAttachment }) =>
      fetchStatus !== 'loaded'
        ? <h1>Loading...</h1>
        : <TodoList 
            todos={data}
            onSubmit={createDocument} 
            addAttachment={addAttachment}
            hasAttachments={todo => todo.attachments.count !== 0} />
    }
  </Query>

Links

La nouvelle API de Contexte

Nouveauté React 16.3

Provider / Consumer

import React, { createContext } from 'react'

const { Provider, Consumer } = createContext({ firstName: 'John', lastName: 'Doe' })

// Render Provider with some value
<Provider value={{ firstName: 'Neil', lastName: 'Armstrong' }}>
  <App />
</Provider>
    
// Now anywhere inside <App /> you can consume this data
<Consumer>
  {({ firstName, lastName }) => <span>{`${firstName} ${lastName}`</span>}
</Consumer>

Applications

Sélection

import React from 'react'
import Selection from 'selection'

export const TodoApp = props => (
  <Selection>
    {selected => <TodoList selected={selected} />
  </Selection>
)
import React from 'react'
import createSelectionContext from 'selection'

const { Selection, Selected } = createSelectionContext()

export const TodoApp = props => (
  <Selection>
    <TodoList />
  </Selection>
)

// Quelque part dans l'arbre des composants
const TodoItem = todo => (
  <Selected item={todo}>
    {selected => <TodoRow todo={todo} selected={selected} />
  </Selected>
)

Partage

import React from 'react'
import { createQueryContext } from 'cozy-client'

const { QueryProvider, QueryConsumer } = createQueryContext(
  cozy => cozy.findSharings('io.cozy.photos.albums')
)

export const AlbumList = albums => (
  <QueryProvider>
    {albums.map(album => <AlbumRow album={album} />)}
  </QueryProvider>
)

// Qqe part...
export const AlbumItem = album => (
  <QueryConsumer>
    {shared => 
      <AlbumTitle title={album.title} withBadge={shared.indexOf(album.id) !== -1} />
    }
  </QueryConsumer>
)

cozy-client v.1.0

By goldoraf

cozy-client v.1.0

  • 705