Plugins & accounts
Plugins, authenticated data and the web worker.
External plugin
Pass the records loadPlugins returns through unchanged. The RPC worker loads
its own copy from each record’s definition, so mapping to p.plugin leaves
the plugin on the main thread only. The
plugin store lists published plugins.
View source — 76 lines
import { useEffect, useState } from 'react'
import { ErrorBanner } from '@jbrowse/core/ui'
import {
JBrowseLinearGenomeView,
createViewState,
destroyViewState,
loadPlugins,
} from '@jbrowse/react-linear-genome-view2'
import type { ViewModel } from '@jbrowse/react-linear-genome-view2'
export default function WithExternalPlugin() {
const [error, setError] = useState<unknown>()
const [viewState, setViewState] = useState<ViewModel>()
useEffect(() => {
const mount = {
unmounted: false,
engine: undefined as ViewModel | undefined,
}
void (async () => {
try {
const plugins = await loadPlugins([
{
name: 'UCSC',
url: 'https://unpkg.com/jbrowse-plugin-ucsc@^1/dist/jbrowse-plugin-ucsc.umd.production.min.js',
},
])
if (mount.unmounted) {
return
}
const state = createViewState({
assembly: {
name: 'hg19',
aliases: ['GRCh37'],
uri: 'https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz',
refNameAliases: {
uri: 'https://s3.amazonaws.com/jbrowse.org/genomes/hg19/hg19_aliases.txt',
},
},
plugins,
tracks: [
{
type: 'FeatureTrack',
trackId: 'segdups_ucsc_hg19',
name: 'UCSC SegDups',
assemblyNames: ['hg19'],
adapter: { type: 'UCSCAdapter', track: 'genomicSuperDups' },
},
],
location: '1:2,467,681..2,667,681',
})
await state.session.view.launchTrack('segdups_ucsc_hg19')
mount.engine = state
setViewState(state)
} catch (e) {
setError(e)
}
})()
return () => {
mount.unmounted = true
if (mount.engine) {
destroyViewState(mount.engine)
}
}
}, [])
return error ? (
<ErrorBanner error={error} />
) : !viewState ? (
<div>Loading...</div>
) : (
<JBrowseLinearGenomeView viewState={viewState} />
)
}Inline plugins
View source — 64 lines
import Plugin from '@jbrowse/core/Plugin'
import { extendViewType } from '@jbrowse/core/pluggableElementTypes'
import {
JBrowseLinearGenomeView,
useCreateViewState,
} from '@jbrowse/react-linear-genome-view2'
import type PluginManager from '@jbrowse/core/PluginManager'
class HighlightRegionPlugin extends Plugin {
name = 'HighlightRegionPlugin'
install(pluginManager: PluginManager) {
extendViewType(pluginManager, 'LinearGenomeView', stateModel =>
stateModel.extend(self => {
const superRubberBandMenuItems = self.rubberBandMenuItems
return {
views: {
rubberBandMenuItems() {
return [
...superRubberBandMenuItems(),
{
label: 'Console log selected region',
onClick: () => {
const { leftOffset, rightOffset } = self
console.log(
self.getSelectedRegions(leftOffset, rightOffset),
)
},
},
]
},
},
}
}),
)
}
configure() {}
}
export default function WithInlinePlugins() {
const state = useCreateViewState({
assembly: {
name: 'volvox',
uri: 'https://jbrowse.org/genomes/volvox/volvox.2bit',
},
plugins: [HighlightRegionPlugin],
tracks: [
{
type: 'FeatureTrack',
trackId: 'volvox_gff3',
name: 'Volvox genes',
assemblyNames: ['volvox'],
adapter: {
type: 'Gff3TabixAdapter',
uri: 'https://jbrowse.org/code/jb2/main/test_data/volvox/volvox.sort.gff3.gz',
},
},
],
location: 'ctgA:1105..1221',
})
return state ? <JBrowseLinearGenomeView viewState={state} /> : null
}Internet accounts (authentication)
DropboxOAuthInternetAccount and GoogleDriveOAuthInternetAccount do not work
in an embedded view, which cannot control redirects and popups. Run the OAuth
flow in your host app and pass the token to
ExternalTokenInternetAccount.
View source — 40 lines
import {
JBrowseLinearGenomeView,
useCreateViewState,
} from '@jbrowse/react-linear-genome-view2'
export default function WithInternetAccounts() {
const state = useCreateViewState({
assembly: {
name: 'volvox',
uri: 'https://jbrowse.org/genomes/volvox/volvox.2bit',
},
tracks: [
{
type: 'QuantitativeTrack',
trackId: 'google_bigwig',
name: 'Google Drive BigWig',
assemblyNames: ['volvox'],
adapter: {
type: 'BigWigAdapter',
bigWigLocation: {
locationType: 'UriLocation',
uri: 'https://www.googleapis.com/drive/v3/files/1PIvZCOJioK9eBL1Vuvfa4L_Fv9zTooHk?alt=media',
internetAccountId: 'manualGoogleEntry',
},
},
},
],
location: 'ctgA:1105..1221',
internetAccounts: [
{
type: 'ExternalTokenInternetAccount',
internetAccountId: 'manualGoogleEntry',
name: 'Google Drive Manual Token Entry',
description: 'Manually enter a token to access Google Drive files',
tokenType: 'Bearer',
},
],
})
return state ? <JBrowseLinearGenomeView viewState={state} /> : null
}Web worker RPC
Under webpack, import
@jbrowse/react-linear-genome-view2/esm/makeWorkerInstance instead of the
?worker entry, and set output.publicPath: 'auto' so the worker finds its own
URL. A module worker, which Vite builds here, cannot load a UMD plugin; a
classic worker can.
View source — 24 lines
import {
JBrowseLinearGenomeView,
useCreateViewState,
} from '@jbrowse/react-linear-genome-view2'
import RpcWorker from '@jbrowse/react-linear-genome-view2/esm/rpcWorker?worker'
export default function WithWebWorker() {
const state = useCreateViewState({
assembly: {
name: 'volvox',
uri: 'https://jbrowse.org/genomes/volvox/volvox.2bit',
},
tracks: [
{
trackId: 'volvox_gff3',
name: 'Volvox genes',
uri: 'https://jbrowse.org/code/jb2/main/test_data/volvox/volvox.sort.gff3.gz',
},
],
init: { loc: 'ctgA:1105..1221', tracks: ['volvox_gff3'] },
makeWorkerInstance: () => new RpcWorker(),
})
return state ? <JBrowseLinearGenomeView viewState={state} /> : null
}