入门库
作为支持 Starcoin 的网站开发人员,将用户发送到异地安装 StarMask 会带来挑战。 最值得注意的是,您必须通知用户在安装后返回您的站点并刷新他们的浏览器。 只有在刷新之后,您的站点才会检测到用户新安装的 StarMask 扩展。 我们 StarMask 非常关心用户体验,我们知道这个工作流程需要改进。
StarMask 现在提供了一个 starmask 入门库,旨在改善和简化入门体验。 新库公开了一个 API 来启动入门流程。在此过程中,它将您的站点注册为入门请求的来源。 StarMask 将在用户完成入门流程后检查此来源。 如果找到来源,StarMask 入门流程的最终确认按钮将指示用户将被重定向回您的站点。
开始使用
使用 npm 或 yarn 安装
@starcoin/starmask-onboarding。导入入门库或将其包含在您的页面中。
// 作为一个 ES6 模块
import StarMaskOnboarding from "@starcoin/starmask-onboarding";
// 或者作为一个 ES5 模块
const StarMaskOnboarding = require("@starcoin/starmask-onboarding");
如果您愿意,可以改为包含库附带的预构建 ES5 包:
<script src="./starmask-onboarding.bundle.js"></script>
- 创建 Onboarding 库的新实例
 
const onboarding = new StarMaskOnboarding();
- 响应用户事件(例如,单击按钮)启动入门流程。
 
onboarding.startOnboarding();
例子
基本用法
const onboarding = new StarMaskOnboarding();
onboarding.startOnboarding();
使用 React
import StarMaskOnboarding from "@starcoin/starmask-onboarding";
import React from "react";
const ONBOARD_TEXT = "Click here to install StarMask!";
const CONNECT_TEXT = "Connect";
const CONNECTED_TEXT = "Connected";
export function OnboardingButton() {
  const [buttonText, setButtonText] = React.useState(ONBOARD_TEXT);
  const [isDisabled, setDisabled] = React.useState(false);
  const [accounts, setAccounts] = React.useState([]);
  const onboarding = React.useRef();
  React.useEffect(() => {
    if (!onboarding.current) {
      onboarding.current = new StarMaskOnboarding();
    }
  }, []);
  React.useEffect(() => {
    if (StarMaskOnboarding.isStarMaskInstalled()) {
      if (accounts.length > 0) {
        setButtonText(CONNECTED_TEXT);
        setDisabled(true);
        onboarding.current?.stopOnboarding();
      } else {
        setButtonText(CONNECT_TEXT);
        setDisabled(false);
      }
    }
  }, [accounts]);
  React.useEffect(() => {
    function handleNewAccounts(newAccounts) {
      setAccounts(newAccounts);
    }
    if (StarMaskOnboarding.isStarMaskInstalled()) {
      window.starcoin
        .request({ method: "stc_requestAccounts" })
        .then(handleNewAccounts);
      window.starcoin.on("accountsChanged", handleNewAccounts);
      return () => {
        window.starcoin.removeListener("accountsChanged", handleNewAccounts);
      };
    }
  }, []);
  const onClick = () => {
    if (StarMaskOnboarding.isStarMaskInstalled()) {
      window.starcoin
        .request({ method: "stc_requestAccounts" })
        .then((newAccounts) => setAccounts(newAccounts));
    } else {
      onboarding.current?.startOnboarding();
    }
  };
  return (
    <button disabled={isDisabled} onClick={onClick}>
      {buttonText}
    </button>
  );
}
使用 TypeScript
我们使用 @starcoin/starmask-onboarding 发布我们的 TypeScript 类型。
在使用 onboarding 库时修改上面的示例以获得类型安全很简单:
  -const onboarding = React.useRef();
  +const onboarding = React.useRef<StarMaskOnboarding>();
执行此步骤将为您提供库公开的方法的编辑器自动完成功能,并提供有用的文档。

使用 Vanilla Javascript + HTML
<!DOCTYPE html>
<html lang="en-CA">
  <head>
    <title>StarMask Onboarding Example</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <h1>Sample Dapp</h1>
    <button id="onboard">Loading...</button>
    <script src="./starmask-onboarding.bundle.js"></script>
    <script>
      window.addEventListener("DOMContentLoaded", () => {
        const onboarding = new StarMaskOnboarding();
        const onboardButton = document.getElementById("onboard");
        let accounts;
        const updateButton = () => {
          if (!StarMaskOnboarding.isStarMaskInstalled()) {
            onboardButton.innerText = "Click here to install StarMask!";
            onboardButton.onclick = () => {
              onboardButton.innerText = "Onboarding in progress";
              onboardButton.disabled = true;
              onboarding.startOnboarding();
            };
          } else if (accounts && accounts.length > 0) {
            onboardButton.innerText = "Connected";
            onboardButton.disabled = true;
            onboarding.stopOnboarding();
          } else {
            onboardButton.innerText = "Connect";
            onboardButton.onclick = async () => {
              await window.starcoin.request({
                method: "stc_requestAccounts",
              });
            };
          }
        };
        updateButton();
        if (StarMaskOnboarding.isStarMaskInstalled()) {
          window.starcoin.on("accountsChanged", (newAccounts) => {
            accounts = newAccounts;
            updateButton();
          });
        }
      });
    </script>
  </body>
</html>
Onboarding Diagram
这是载入库、转发器和扩展程序之间的交互图:
