JBrowse 2 · React App examples

Persist & restore the session

onSnapshot out, session back in.

Open a view or a track, then reload: the app comes back as you left it. The stored snapshot goes in session, which restores it over the config’s defaultSession. The example removes the entry before using it, so a snapshot this build cannot open fails once rather than on every reload.

View source — 83 lines
import { useEffect } from 'react'

import { getSnapshot, onSnapshot } from '@jbrowse/mobx-state-tree'
import {
  JBrowseApp,
  createViewStateAsync,
  useCreateViewState,
} from '@jbrowse/react-app2'

const STORAGE_KEY = 'jbrowse-app-example-session'

const base = 'https://jbrowse.org/code/jb2/main/test_data/volvox'

const config = {
  assemblies: [
    { name: 'volvox', uri: 'https://jbrowse.org/genomes/volvox/volvox.2bit' },
  ],
  tracks: [
    {
      trackId: 'volvox_gff3',
      name: 'Volvox genes',
      uri: `${base}/volvox.sort.gff3.gz`,
    },
  ],
  defaultSession: {
    name: 'Persisted session',
    views: [
      {
        id: 'view-0',
        type: 'LinearGenomeView',
        assembly: 'volvox',
        loc: 'ctgA:1..50000',
        tracks: ['volvox_gff3'],
      },
    ],
  },
}

async function build() {
  const saved = localStorage.getItem(STORAGE_KEY)
  localStorage.removeItem(STORAGE_KEY)
  try {
    return await createViewStateAsync({
      config,
      session: saved ? JSON.parse(saved) : undefined,
    })
  } catch (e) {
    console.error(e)
    return createViewStateAsync({ config })
  }
}

export default function SessionPersistence() {
  const state = useCreateViewState(build)

  useEffect(() => {
    if (state) {
      const save = (snap: unknown) => {
        localStorage.setItem(STORAGE_KEY, JSON.stringify(snap))
      }
      save(getSnapshot(state.session))
      return onSnapshot(state.session, save)
    }
    return undefined
  }, [state])

  return state ? (
    <JBrowseApp
      viewState={state}
      headerButtons={
        <button
          type="button"
          onClick={() => {
            localStorage.removeItem(STORAGE_KEY)
            location.reload()
          }}
        >
          Reset saved session
        </button>
      }
    />
  ) : null
}