Utilisation des Intents


#1

Bonjour,

Je me suis remis au développement de mon application de streaming vidéo sur la plateforme Cozy que j’avais entamée il y a quelques mois. Mais je suis confronté à un problème.

Pour que l’utilisateur puisse choisir la vidéo qu’il veut lire, j’aimerais récupérer tous les fichiers présents sur le Cozy et les afficher sous forme de liste, exactement comme le fait l’application Drive. J’avais commencé à développer cette interface en m’inspirant du code de Drive et c’est en parcourant les sources que je me suis rendu compte de l’existence des Intents !

Si je ne me trompe pas, Drive offre différents services listés dans son manifest.webapp:

"intents": [
    {
      "action": "OPEN",
      "type": ["io.cozy.files"],
      "href": "/intents"
    },
    {
      "action": "PICK",
      "type": ["io.cozy.files"],
      "href": "/intents"
    },
    {
      "action": "GET_URL",
      "type": ["io.cozy.files"],
      "href": "/intents"
    },
    {
      "action": "OPEN",
      "type": ["io.cozy.suggestions"],
      "href": "/intents"
    }
  ]

J’essaie d’utiliser l’action ‘OPEN’ dans mon application avec ce code :

class Player extends Component {
  constructor(props, context) {
    super(props, context)
    
    // ...

    this.client = client
  }

  componentDidMount() {
    this.client.intents.create('OPEN', 'io.cozy.files').start(this.intentViewer)
  }

  render() {
    return (
      <div
        id="intentViewer"
        ref={intentViewer => (this.intentViewer = intentViewer)}
      />
    )
  }
}

J’utilise ensuite cozy-app-dev pour servir l’application Drive et mon application.

Mais à l’exécution j’obtiens l’erreur suivante dans la console du navigateur :

Unhandled promise rejection Error: "Unable to find a service"
	pickService helpers.js:47
	prom client.js:53
	Promise es6.promise.js:177
	start client.js:52
	prom intents.js:44
	run es6.promise.js:75
	notify es6.promise.js:92
	flush _microtask.js:18
 es6.promise.js:110

J’ai bien sûr enregistré la permission d’accéder au doctype io.cozy.files dans le manifest.webapp de mon application :

"permissions": {
    "apps": {
      "description": "Required by the cozy-bar to display the icons of the apps",
      "type": "io.cozy.apps",
      "verbs": ["GET"]
    },
    "files": {
      "description": "Required to read video files",
      "type": "io.cozy.files"
    }
  }

Qu’est-ce que je fais mal ? Merci d’avance !


#2

Bonjour,

J’utilise ensuite cozy-app-dev pour servir l’application Drive et mon application.

Oops, on a un petit bug côté serveur qui fait que l’on n’arrive pas à servir des intents pour des applications servies par cozy-app-dev (et non pas installées). Je vais regarder pour corriger ça rapidement, mais en attendant, si tu installes Drive, ça devrait fonctionner.


#3

Ah oui ça marche beaucoup mieux comme ça !

Merci :smile:


#4

Voilà, je viens d’ouvrir une pull request sur github pour corriger ce problème : https://github.com/cozy/cozy-stack/pull/1817.


#5

Bonjour,

J’ai bien réussi à utiliser l’intent “OPEN” (j’ai d’ailleurs découvert cozy-interapp qui facilite bien le travail), mais son comportement me surprend.

Je m’explique, l’embedder n’affiche que les dossiers et non les fichiers : quand je rentre dans un dossier qui ne contient que des fichiers il me dit qu’il n’y a pas de fichiers dans le dossier, mais s’il contient des dossiers il les affiche. C’est le comportement normal ?

Mon but serait de lister tous les types de fichiers, afin que l’utilisateur puisse en sélectionner un, et que l’intent retourne l’id du fichier sélectionné dans mon appli. Je ne sais pas d’ailleurs si cet intent est censé retourner quelque chose à sa complétion. Il y a de la doc quelque part sur les intents de Drive ?


#6

Hello @asuuga,

Désolé, j’avais oublié de te transmettre la réponse de l’équipe technique.

Oui, c’est le comportement normal.
Nous avons pour l’instant deux Intent :

  • l’un permet d’afficher un dossier / fichier dont on connaît l’identifiant ;
  • le second permet de sélectionner un dossier (il es notamment utilisé pour choisir le dossier de destination des imports de facture).

Ça ne serait pas très compliqué d’ajouter une option pour permettre d’afficher également les fichiers, mais jusqu’à présent nous n’en avons pas eu besoin, et donc cette option n’est pas disponible. Si tu veux essayer de mettre les mains dans le code pour ajouter une telle option, nous pouvons te guider :wink: