0.1.0 • Published 11 months ago

automerge-repo-react-hooks v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
11 months ago

React Hooks for Automerge Repo

Example usage

App Setup

import React, { StrictMode } from "react"
import ReactDOM from "react-dom/client"
import localforage from "localforage"

import { Repo, DocCollection } from "automerge-repo"

import { BroadcastChannelNetworkAdapter } from "automerge-repo-network-broadcastchannel"
import { LocalFirstRelayNetworkAdapter } from "automerge-repo-network-localfirstrelay"

import App, { RootDocument } from "./App.js"
import { RepoContext } from "automerge-repo-react-hooks"

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const sharedWorker = new SharedWorker(
  new URL("./shared-worker.js", import.meta.url),
  { type: "module", name: "automerge-repo-shared-worker" }
)

async function getRepo(url: string): Promise<DocCollection> {
  return await Repo({
    network: [
      new BroadcastChannelNetworkAdapter(),
      new LocalFirstRelayNetworkAdapter("wss://local-first-relay.glitch.me/"),
    ],
    sharePolicy: peerId => peerId.includes("shared-worker"),
  })
}

async function getRootDocument(repo: DocCollection, initFunction: any) {
  let docId: string | null = window.location.hash.replace(/^#/, "")
  if (!docId) {
    docId = await localforage.getItem("root")
  }
  let rootHandle

  if (!docId) {
    rootHandle = repo.create()
    rootHandle.change(initFunction)
    await localforage.setItem("root", rootHandle.documentId)
  } else {
    rootHandle = await repo.find(docId)
    window.location.hash = docId
  }
  return rootHandle
}

const initFunction = (d: RootDocument) => {
  d.items = []
}

const queryString = window.location.search // Returns:'?q=123'

// Further parsing:
const params = new URLSearchParams(queryString)
const hostname = params.get("host") || "automerge-storage-demo.glitch.me"

getRepo(`wss://${hostname}`).then(repo => {
  getRootDocument(repo, initFunction).then(rootDoc => {
    const rootElem = document.getElementById("root")
    if (!rootElem) {
      throw new Error("The 'root' element wasn't found in the host HTML doc.")
    }
    const root = ReactDOM.createRoot(rootElem)
    root.render(
      <StrictMode>
        <RepoContext.Provider value={repo}>
          <App rootDocumentId={rootDoc.documentId} />
        </RepoContext.Provider>
      </StrictMode>
    )
  })
})
0.0.55

11 months ago

0.0.56

11 months ago

0.1.0

11 months ago

0.0.51

12 months ago

0.0.52

12 months ago

0.0.53

12 months ago

0.0.54

12 months ago

0.0.45

1 year ago

0.0.50

1 year ago

0.0.48

1 year ago

0.0.40

1 year ago

0.0.41

1 year ago

0.0.42

1 year ago

0.0.32

1 year ago

0.0.44

1 year ago

0.0.31

2 years ago

0.0.20

2 years ago

0.0.15

2 years ago

0.0.16

2 years ago

0.0.19

2 years ago

0.0.14

2 years ago

0.0.13

2 years ago

0.0.11

2 years ago