npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@canvas-js/hooks

v0.12.5

Published

Hooks for using Canvas applications in React.

Downloads

1,810

Readme

@canvas-js/hooks

Hooks for using Canvas applications in React.

Table of Contents

useCanvas

The useCanvas hook initializes a Canvas application contract inside a React component. It accepts the same CanvasConfig object as Canvas.initialize in @canvas-js/core.

import { SIWESigner } from "@canvas-js/chain-ethereum"
import { useCanvas } from "@canvas-js/hooks"
import { useMemo } from "react"

export function MyApp() {
  const wallet = useMemo(() => {
    return ethers.Wallet.createRandom()
  }, [])
  const { app, error } = useCanvas({
    topic: "com.example.forum",
    contract: {
      // ...
    },
    signers: [new SIWESigner({ signer: wallet })],
    topic: "myapp",
  })
}

Note that app might be null the first time the hook runs.

useLiveQuery

The useLiveQuery hook maintains a live-updated frontend query on top of a Canvas application.

You can see a more complete example here.

Example usage:

import { useLiveQuery } from "@canvas-js/hooks"

export function MyComponent({ app }: { app?: Canvas }) {
  const threads = useLiveQuery<Thread>(app, "threads", {
    offset: page * 10,
    limit: 10,
    orderBy: { timestamp: "desc" },
    where: category === "all" ? undefined : { category },
  })
}

useTick

useTick(app: Canvas, condition: string | null, interval: number)

The useTick hook calls a tick() action on a contract at a regular interval.

Ticking happens client-side. Here are a few considerations:

  • Ticking will only run if the user has started a session.
  • If a client observes that any other user on the log has called tick() within the last interval, their tick will be skipped.
  • Contracts will stop ticking if no clients are online.

Note that useTick() does not do any special accounting for networking - it is possible that if two users start their timers at around the same time, their clocks will be synchronized and each will emit tick() events around the same time.

You should account for this in your application logic.

Conditional Ticking

Ticking can be configured to only run when a certain condition in the database is true.

const models = {
  state: {
    gameOver: "boolean"
  }
}

const actions = {
  toggleGameStart: (db) => {
    const { gameOver } = await db.state.get()
    db.state.set({ gameOver: !gameOver })
  }
  tick: (db} => {
    // ...
  }
}

const { app } = useCanvas({
  topic: "...",
  contract: { models, actions }
})

useTick(app, '!state.gameOver', 1000)

The condition can be any query of the form model.field or !model.field.

If would prefer not to use a condition, you can also leave it null.

useTick(app, null, 1000)