@radish-la/world-auth
Version:
Extending World Auth SDK for React
2 lines (1 loc) • 2.52 kB
JavaScript
"use client";var h=()=>crypto.randomUUID().replace(/-/g,""),c=e=>`__session__world__${encodeURIComponent(e||"__")}`;function S(e){let s=localStorage.getItem(e);return s?JSON.parse(s):null}import{useEffect as x,useState as E}from"react";import{MiniKit as U}from"@worldcoin/minikit-js";import{useEffect as C}from"react";import{atom as K,useAtom as v}from"jotai";var P=K({}),m=()=>v(P),V=K(null),d=()=>{let[e]=m(),[s,o]=v(V);return C(()=>{let t=S(c(e.appName));o(t?.user||null)},[e.appName]),[s,o]};var M=({onWrongEnvironment:e,onLoginSuccess:s,onLoginError:o}={})=>{let[t]=m(),[u,p]=E(!1),[f,y]=E(!0),[r,a]=d(),i=c(t.appName),A=()=>{localStorage.removeItem(i),a(W())},W=()=>(p(!1),null),N=async()=>{if(!f)return console.error("MiniKit:NotInstalled"),(e||t.onWrongEnvironment)?.(),W();try{p(!0);let n=h(),{finalPayload:g}=await U.commandsAsync.walletAuth({nonce:n,expirationTime:new Date(new Date().getTime()+7*24*60*60*1e3),notBefore:new Date(new Date().getTime()-24*60*60*1e3),statement:`Allow ${t.appName||"this app"} to view your wallet.`});if(g.status==="error")throw new Error("PayloadError");if(typeof t.withValidator!="function")throw new Error("NoValidatorFound");let{isValid:_}=await t.withValidator({nonce:n,payload:g});if(!_)throw new Error("InvalidSession");let l=U.user;return l||(l={walletAddress:g.address,username:"",profilePictureUrl:""}),localStorage.setItem(i,JSON.stringify({nonce:n,payload:g,user:l})),s?.(l),a(l),l}catch(n){console.error("Error:",n),o?.(n)}return W()};x(()=>{r?.walletAddress&&p(!1),!r?.username&&r?.walletAddress&&U.getUserByAddress(r.walletAddress).then(n=>{n.walletAddress&&a(n)})},[r]),x(()=>{y(U?.isInstalled())},[t.appName,t.appId]);let I=!!r?.walletAddress;return{signIn:N,address:r?.walletAddress,user:I?r:null,recklesslySetUser:a,signOut:A,isConnecting:u,isMiniApp:f,isConnected:I}};var Q=()=>{let[e]=d();return e?.walletAddress?e:null};import{MiniKit as O}from"@worldcoin/minikit-js";import{useEffect as w,useRef as D}from"react";import{Fragment as R,jsx as B}from"react/jsx-runtime";function se({children:e,appId:s,appName:o,withValidator:t,onWrongEnvironment:u}){let[,p]=m(),[,f]=d(),{signOut:y}=M(),r=D(t),a=D(u);return w(()=>{r.current=t,a.current=u}),w(()=>{p(i=>({...i,appId:s,appName:o,withValidator:r.current,onWrongEnvironment:a.current}))},[s,o]),w(()=>{let i=S(c(o));i&&r.current(i).then(({isValid:A})=>{A?f(i.user):y()})},[o]),w(()=>{O.install()},[]),B(R,{children:e})}export{se as WorldAppProvider,h as generateNonce,M as useWorldAuth,Q as useWorldUser};