Un flash est un petit service publié par une organisation et ouvert dans l’application Flash. Techniquement, c’est un seul fichier JavaScript, sans HTML ni CSS : il décrit ses écrans, et l’application les dessine avec des composants natifs.

Ce qui se passe à l’ouverture

  1. L’application récupère le fichier du flash et vérifie sa signature : un octet modifié, et le flash est refusé.
  2. Elle l’exécute dans un environnement isolé, avec FlashJS, sans accès direct au réseau, au stockage ni à la page.
  3. Le flash décrit ses écrans ; l’application les affiche et lui transmet les actions de l’utilisateur.
  4. À la fin, tout est détruit : rien ne reste sur le téléphone.

La fonction principale

Tout flash enregistre sa fonction principale avec flash.main. Elle reçoit un contexte (ctx) qui contient notamment les paramètres transmis par un flash appelant (ctx.params). La valeur qu’elle renvoie est transmise à l’appelant.

flash.main(async (ctx) => {
  const screen = await flash.ui.show({
    title: 'Bonjour',
    body: [{ type: 'text', text: 'Mon premier flash.' }],
    footer: [{ label: 'Terminer', action: 'done', style: 'primary' }],
  });
  await screen.next('done');
  return 'terminé'; // valeur transmise à l’appelant éventuel
});
L’objet global flash est le seul point d’accès au monde extérieur. fetch, document, localStorage et leurs semblables sont refusés à la publication.

Un exemple complet

Ce flash affiche un formulaire, salue l’utilisateur, puis ouvre un autre flash. C’est le flash de démonstration de l’application, vérifié de bout en bout.

flash.main(async (ctx) => {
  await flash.ui.configure({ title: 'Démo' });
  const screen = await flash.ui.show({
    title: 'Bienvenue',
    body: [
      { type: 'input', key: 'name', label: 'Votre prénom', required: true },
      { type: 'button', label: 'Ouvrir la calculette', action: 'calc', icon: 'add' },
    ],
    footer: [{ label: 'Dire bonjour', action: 'hello', style: 'primary', validate: true }],
  });

  screen.on('hello', async (event) => {
    await flash.ui.alert(`Bonjour ${event.values.name} !`, { title: 'Salutations' });
  });

  screen.on('calc', async () => {
    const result = await flash.call('demo.calcul', { a: 2, b: 3 });
    flash.ui.toast(result.hasValue ? `Résultat : ${result.value}` : 'Calcul annulé');
  });

  await new Promise(() => {}); // le flash reste ouvert jusqu’au bouton retour
});

Le bouton retour

Sans rien préciser, le bouton retour termine le flash sans valeur. Pour demander confirmation ou renvoyer une valeur, enregistrez un gestionnaire :

flash.onBack(async () => {
  const quit = await flash.ui.confirm('Abandonner la saisie ?');
  return quit ? flash.leave() : flash.stay();
});