UNPKG

@nomyx/gun-sync

Version:

A lightweight, powerful library for synchronizing application state in real-time using Gun.js.

77 lines (76 loc) 3.01 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useGunUser = useGunUser; const react_1 = require("react"); const context_1 = require("./context"); /** * A hook to manage the full user authentication lifecycle with Gun.js. */ function useGunUser(gunInstance) { const gun = gunInstance || (0, context_1.useGun)(); const user = gun.user(); const [state, setState] = (0, react_1.useState)({ isLoggedIn: false, isLoading: true, user: null, }); (0, react_1.useEffect)(() => { // Check initial auth state gun.on('auth', (ack) => { setState({ isLoggedIn: !!user.is, isLoading: false, user: user.is, error: ack.err, }); }); // This recalls the auth state on component mount user.recall({ sessionStorage: true }); }, [gun, user]); const signUp = (0, react_1.useCallback)((alias, pass) => __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { user.create(alias, pass, (ack) => { if (ack.err) { setState(s => (Object.assign(Object.assign({}, s), { error: ack.err }))); reject(new Error(ack.err)); } else { resolve(); } }); }); }), [user]); const signIn = (0, react_1.useCallback)((alias, pass) => __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { user.auth(alias, pass, (ack) => { if (ack.err) { setState(s => (Object.assign(Object.assign({}, s), { error: ack.err }))); reject(new Error(ack.err)); } else { // The 'auth' event listener will handle setting the state resolve(); } }); }); }), [user]); const signOut = (0, react_1.useCallback)(() => { user.leave(); setState({ isLoggedIn: false, isLoading: false, user: null, error: undefined, }); }, [user]); return [state, { signUp, signIn, signOut }]; }