@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
JavaScript
;
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 }];
}