@polybase/react
Advanced tools
| import React from 'react'; | ||
| import { Polybase } from '@polybase/client'; | ||
| import type { AuthState } from '@polybase/auth'; | ||
| import { Auth, AuthBase, PolybaseBase } from './types'; | ||
| export interface AuthContextValue<T extends AuthBase> { | ||
| auth: T; | ||
| state: AuthState | null; | ||
| loading: boolean; | ||
| } | ||
| export declare const AuthContext: React.Context<AuthContextValue<Auth>>; | ||
| export interface AuthProviderProps<T, P> { | ||
| children: React.ReactNode; | ||
| polybase: P; | ||
| auth: T; | ||
| } | ||
| export declare function AuthProvider<T extends Auth = Auth, P extends PolybaseBase = Polybase>({ children, auth, polybase }: AuthProviderProps<T, P>): JSX.Element; | ||
| //# sourceMappingURL=AuthProvider.d.ts.map |
| {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAA;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,QAAQ;IAClD,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,eAAO,MAAM,WAAW,uCAStB,CAAA;AAEF,MAAM,WAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,CAAA;IACX,IAAI,EAAE,CAAC,CAAA;CACR;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,YAAY,GAAG,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,eA0B3I"} |
| "use strict"; | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| 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()); | ||
| }); | ||
| }; | ||
| var __generator = (this && this.__generator) || function (thisArg, body) { | ||
| var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
| return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
| function verb(n) { return function (v) { return step([n, v]); }; } | ||
| function step(op) { | ||
| if (f) throw new TypeError("Generator is already executing."); | ||
| while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
| if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
| if (y = 0, t) op = [op[0] & 2, t.value]; | ||
| switch (op[0]) { | ||
| case 0: case 1: t = op; break; | ||
| case 4: _.label++; return { value: op[1], done: false }; | ||
| case 5: _.label++; y = op[1]; op = [0]; continue; | ||
| case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
| default: | ||
| if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
| if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
| if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
| if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
| if (t[2]) _.ops.pop(); | ||
| _.trys.pop(); continue; | ||
| } | ||
| op = body.call(thisArg, _); | ||
| } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
| if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
| } | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.AuthProvider = exports.AuthContext = void 0; | ||
| var react_1 = __importStar(require("react")); | ||
| exports.AuthContext = (0, react_1.createContext)({ | ||
| auth: { | ||
| signIn: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { | ||
| throw new Error('signIn: Not implemented'); | ||
| }); }); }, | ||
| signOut: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { | ||
| throw new Error('signOut: Not implemented'); | ||
| }); }); }, | ||
| ethPersonalSign: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { | ||
| throw new Error('ethPersonalSign: Not implemented'); | ||
| }); }); }, | ||
| onAuthUpdate: function (cb) { throw new Error('onAuthUpdate: Not implemented'); }, | ||
| }, | ||
| loading: true, | ||
| state: null, | ||
| }); | ||
| function AuthProvider(_a) { | ||
| var _this = this; | ||
| var children = _a.children, auth = _a.auth, polybase = _a.polybase; | ||
| var _b = (0, react_1.useState)(null), authState = _b[0], setAuthState = _b[1]; | ||
| var _c = (0, react_1.useState)(true), loading = _c[0], setLoading = _c[1]; | ||
| (0, react_1.useEffect)(function () { | ||
| if (!auth) | ||
| return; | ||
| return auth.onAuthUpdate(function (authState) { | ||
| setAuthState(authState); | ||
| setLoading(false); | ||
| polybase.signer(function (data) { return __awaiter(_this, void 0, void 0, function () { | ||
| var _a; | ||
| return __generator(this, function (_b) { | ||
| switch (_b.label) { | ||
| case 0: | ||
| _a = { h: 'eth-personal-sign' }; | ||
| return [4 /*yield*/, auth.ethPersonalSign(data)]; | ||
| case 1: return [2 /*return*/, (_a.sig = _b.sent(), _a)]; | ||
| } | ||
| }); | ||
| }); }); | ||
| }); | ||
| }, [auth, polybase]); | ||
| var value = (0, react_1.useMemo)(function () { return ({ | ||
| auth: auth, | ||
| state: authState, | ||
| loading: loading, | ||
| }); }, [auth, authState, loading]); | ||
| return (react_1.default.createElement(exports.AuthContext.Provider, { value: value }, children)); | ||
| } | ||
| exports.AuthProvider = AuthProvider; | ||
| //# sourceMappingURL=AuthProvider.js.map |
| {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA0E;AAW7D,QAAA,WAAW,GAAG,IAAA,qBAAa,EAAyB;IAC/D,IAAI,EAAE;QACJ,MAAM,EAAE;YAAc,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;iBAAE;QAClE,OAAO,EAAE;YAAc,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;iBAAE;QACpE,eAAe,EAAE;YAAc,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;iBAAE;QACpF,YAAY,EAAE,UAAC,EAAE,IAAO,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA,CAAC,CAAC;KAC3E;IACD,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;CACZ,CAAC,CAAA;AAQF,SAAgB,YAAY,CAA2D,EAAqD;IAA5I,iBA0BC;QA1BwF,QAAQ,cAAA,EAAE,IAAI,UAAA,EAAE,QAAQ,cAAA;IACzG,IAAA,KAA4B,IAAA,gBAAQ,EAAmB,IAAI,CAAC,EAA3D,SAAS,QAAA,EAAE,YAAY,QAAoC,CAAA;IAC5D,IAAA,KAAwB,IAAA,gBAAQ,EAAC,IAAI,CAAC,EAArC,OAAO,QAAA,EAAE,UAAU,QAAkB,CAAA;IAE5C,IAAA,iBAAS,EAAC;QACR,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,UAAC,SAAS;YACjC,YAAY,CAAC,SAAS,CAAC,CAAA;YACvB,UAAU,CAAC,KAAK,CAAC,CAAA;YACjB,QAAQ,CAAC,MAAM,CAAC,UAAO,IAAY;;;;;mCACxB,CAAC,EAAE,mBAAmB;4BAAO,qBAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAA;gCAAtE,uBAAiC,MAAG,GAAE,SAAgC,OAAE;;;iBACzE,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpB,IAAM,KAAK,GAAG,IAAA,eAAO,EAAC,cAAM,OAAA,CAAC;QAC3B,IAAI,MAAA;QACJ,KAAK,EAAE,SAAS;QAChB,OAAO,SAAA;KACR,CAAC,EAJ0B,CAI1B,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAE/B,OAAO,CACL,8BAAC,mBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAC/B,QAAQ,CACY,CACxB,CAAA;AACH,CAAC;AA1BD,oCA0BC"} |
| import type { AuthState } from '@polybase/auth'; | ||
| import type { Signer } from '@polybase/client'; | ||
| export interface SignInParameters { | ||
| force?: boolean; | ||
| } | ||
| export interface Auth extends AuthBase { | ||
| signIn: (params?: SignInParameters) => Promise<AuthState | null>; | ||
| signOut: () => Promise<void>; | ||
| } | ||
| export interface AuthBase { | ||
| ethPersonalSign: (msg: string) => Promise<string>; | ||
| onAuthUpdate: (listener: (state: AuthState | null) => void) => () => void; | ||
| } | ||
| export interface PolybaseBase { | ||
| signer: (fn: Signer) => void; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,IAAK,SAAQ,QAAQ;IACpC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IAChE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CAC1E;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""} |
| export declare function useAuth(): import("./AuthProvider").AuthContextValue<import("./types").Auth>; | ||
| //# sourceMappingURL=useAuth.d.ts.map |
| {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/auth/useAuth.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,sEAEtB"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.useAuth = void 0; | ||
| var react_1 = require("react"); | ||
| var AuthProvider_1 = require("./AuthProvider"); | ||
| function useAuth() { | ||
| return (0, react_1.useContext)(AuthProvider_1.AuthContext); | ||
| } | ||
| exports.useAuth = useAuth; | ||
| //# sourceMappingURL=useAuth.js.map |
| {"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/auth/useAuth.ts"],"names":[],"mappings":";;;AAAA,+BAAkC;AAClC,+CAA4C;AAE5C,SAAgB,OAAO;IACrB,OAAO,IAAA,kBAAU,EAAC,0BAAW,CAAC,CAAA;AAChC,CAAC;AAFD,0BAEC"} |
| /** | ||
| * Returns the current auth state and loading state. Requires to be a child of | ||
| * an AuthProvider. | ||
| * | ||
| * @returns [isLoggedIn, loading] | ||
| */ | ||
| export declare function useIsAuthenticated(): [null | boolean, boolean]; | ||
| //# sourceMappingURL=useIsAuthenticated.d.ts.map |
| {"version":3,"file":"useIsAuthenticated.d.ts","sourceRoot":"","sources":["../../src/auth/useIsAuthenticated.tsx"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,CAG9D"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.useIsAuthenticated = void 0; | ||
| var react_1 = require("react"); | ||
| var AuthProvider_1 = require("./AuthProvider"); | ||
| /** | ||
| * Returns the current auth state and loading state. Requires to be a child of | ||
| * an AuthProvider. | ||
| * | ||
| * @returns [isLoggedIn, loading] | ||
| */ | ||
| function useIsAuthenticated() { | ||
| var auth = (0, react_1.useContext)(AuthProvider_1.AuthContext); | ||
| return [auth.loading ? null : !!auth.state, auth.loading]; | ||
| } | ||
| exports.useIsAuthenticated = useIsAuthenticated; | ||
| //# sourceMappingURL=useIsAuthenticated.js.map |
| {"version":3,"file":"useIsAuthenticated.js","sourceRoot":"","sources":["../../src/auth/useIsAuthenticated.tsx"],"names":[],"mappings":";;;AAAA,+BAAkC;AAClC,+CAA4C;AAE5C;;;;;GAKG;AACH,SAAgB,kBAAkB;IAChC,IAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,0BAAW,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;AAC3D,CAAC;AAHD,gDAGC"} |
| import React from 'react' | ||
| import { renderHook, act } from '@testing-library/react-hooks' | ||
| import '@testing-library/jest-dom/extend-expect' | ||
| import { AuthProvider } from '../AuthProvider' | ||
| import { useAuth } from '../useAuth' | ||
| import { Signer } from '@polybase/client' | ||
| import { Auth, PolybaseBase } from '../types' | ||
| import { Auth as PolybaseAuth, AuthState } from '@polybase/auth' | ||
| let auth: Auth | ||
| let polybase: PolybaseBase | ||
| let fn: (state: AuthState | null) => void | ||
| let authState: AuthState | ||
| beforeEach(() => { | ||
| auth = { | ||
| ethPersonalSign: jest.fn(async () => 'ethPersonalSign'), | ||
| onAuthUpdate: jest.fn((cb) => { fn = cb; return () => { } }), | ||
| signIn: jest.fn(async () => authState), | ||
| signOut: jest.fn(), | ||
| } | ||
| polybase = { | ||
| signer: jest.fn((fn: Signer) => { }), | ||
| } | ||
| }) | ||
| test('should be set to loading on init', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useAuth(), { wrapper }) | ||
| expect(result.current.loading).toBe(true) | ||
| }) | ||
| test('should load signed in auth state', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useAuth(), { wrapper }) | ||
| act(() => { | ||
| fn({ userId: '0x123', type: 'metamask' }) | ||
| }) | ||
| expect(result.current.loading).toBe(false) | ||
| expect(result.current.state).toEqual({ userId: '0x123', type: 'metamask' }) | ||
| }) | ||
| test('should load not signed in auth state', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useAuth(), { wrapper }) | ||
| act(() => { | ||
| fn(null) | ||
| }) | ||
| expect(result.current.loading).toBe(false) | ||
| expect(result.current.state).toEqual(null) | ||
| }) | ||
| test('should work with @polybase/auth', () => { | ||
| auth = new PolybaseAuth() | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useAuth(), { wrapper }) | ||
| act(() => { | ||
| fn(null) | ||
| }) | ||
| expect(result.current.loading).toBe(false) | ||
| expect(result.current.state).toEqual(null) | ||
| }) |
| import React from 'react' | ||
| import { renderHook, act } from '@testing-library/react-hooks' | ||
| import '@testing-library/jest-dom/extend-expect' | ||
| import { AuthProvider } from '../AuthProvider' | ||
| import { useIsAuthenticated } from '../useIsAuthenticated' | ||
| import { Signer } from '@polybase/client' | ||
| import { Auth, PolybaseBase } from '../types' | ||
| import type { AuthState } from '@polybase/auth' | ||
| let auth: Auth | ||
| let polybase: PolybaseBase | ||
| let fn: (state: AuthState | null) => void | ||
| let authState: AuthState | ||
| beforeEach(() => { | ||
| auth = { | ||
| ethPersonalSign: jest.fn(async () => 'ethPersonalSign'), | ||
| onAuthUpdate: jest.fn((cb) => { fn = cb; return () => { } }), | ||
| signIn: jest.fn(async () => authState), | ||
| signOut: jest.fn(), | ||
| } | ||
| polybase = { | ||
| signer: jest.fn((fn: Signer) => { }), | ||
| } | ||
| }) | ||
| test('should be set to loading on init', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useIsAuthenticated(), { wrapper }) | ||
| expect(result.current).toEqual([null, true]) | ||
| }) | ||
| test('should load signed in auth state', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useIsAuthenticated(), { wrapper }) | ||
| act(() => { | ||
| fn({ userId: '0x123', type: 'metamask' }) | ||
| }) | ||
| expect(result.current).toEqual([true, false]) | ||
| }) | ||
| test('should load not signed in auth state', () => { | ||
| const wrapper: React.FC = ({ children }: any) => ( | ||
| <AuthProvider auth={auth} polybase={polybase}> | ||
| {children} | ||
| </AuthProvider> | ||
| ) | ||
| const { result } = renderHook(() => useIsAuthenticated(), { wrapper }) | ||
| act(() => { | ||
| fn(null) | ||
| }) | ||
| expect(result.current).toEqual([false, false]) | ||
| }) |
| import React, { createContext, useState, useEffect, useMemo } from 'react' | ||
| import { Polybase } from '@polybase/client' | ||
| import type { AuthState } from '@polybase/auth' | ||
| import { Auth, AuthBase, PolybaseBase } from './types' | ||
| export interface AuthContextValue<T extends AuthBase> { | ||
| auth: T, | ||
| state: AuthState | null | ||
| loading: boolean | ||
| } | ||
| export const AuthContext = createContext<AuthContextValue<Auth>>({ | ||
| auth: { | ||
| signIn: async () => { throw new Error('signIn: Not implemented') }, | ||
| signOut: async () => { throw new Error('signOut: Not implemented') }, | ||
| ethPersonalSign: async () => { throw new Error('ethPersonalSign: Not implemented') }, | ||
| onAuthUpdate: (cb) => { throw new Error('onAuthUpdate: Not implemented') }, | ||
| }, | ||
| loading: true, | ||
| state: null, | ||
| }) | ||
| export interface AuthProviderProps<T, P> { | ||
| children: React.ReactNode | ||
| polybase: P | ||
| auth: T | ||
| } | ||
| export function AuthProvider<T extends Auth = Auth, P extends PolybaseBase = Polybase>({ children, auth, polybase }: AuthProviderProps<T, P>) { | ||
| const [authState, setAuthState] = useState<AuthState | null>(null) | ||
| const [loading, setLoading] = useState(true) | ||
| useEffect(() => { | ||
| if (!auth) return | ||
| return auth.onAuthUpdate((authState) => { | ||
| setAuthState(authState) | ||
| setLoading(false) | ||
| polybase.signer(async (data: string) => { | ||
| return { h: 'eth-personal-sign', sig: await auth.ethPersonalSign(data) } | ||
| }) | ||
| }) | ||
| }, [auth, polybase]) | ||
| const value = useMemo(() => ({ | ||
| auth, | ||
| state: authState, | ||
| loading, | ||
| }), [auth, authState, loading]) | ||
| return ( | ||
| <AuthContext.Provider value={value}> | ||
| {children} | ||
| </AuthContext.Provider> | ||
| ) | ||
| } |
| import type { AuthState } from '@polybase/auth' | ||
| import type { Signer } from '@polybase/client' | ||
| export interface SignInParameters { | ||
| force?: boolean | ||
| } | ||
| export interface Auth extends AuthBase { | ||
| signIn: (params?: SignInParameters) => Promise<AuthState | null> | ||
| signOut: () => Promise<void> | ||
| } | ||
| export interface AuthBase { | ||
| ethPersonalSign: (msg: string) => Promise<string> | ||
| onAuthUpdate: (listener: (state: AuthState | null) => void) => () => void | ||
| } | ||
| export interface PolybaseBase { | ||
| signer: (fn: Signer) => void | ||
| } |
| import { useContext } from 'react' | ||
| import { AuthContext } from './AuthProvider' | ||
| export function useAuth() { | ||
| return useContext(AuthContext) | ||
| } |
| import { useContext } from 'react' | ||
| import { AuthContext } from './AuthProvider' | ||
| /** | ||
| * Returns the current auth state and loading state. Requires to be a child of | ||
| * an AuthProvider. | ||
| * | ||
| * @returns [isLoggedIn, loading] | ||
| */ | ||
| export function useIsAuthenticated(): [null | boolean, boolean] { | ||
| const auth = useContext(AuthContext) | ||
| return [auth.loading ? null : !!auth.state, auth.loading] | ||
| } |
+3
-0
@@ -7,2 +7,5 @@ export * from './PolybaseProvider'; | ||
| export * from './usePolybase'; | ||
| export * from './auth/AuthProvider'; | ||
| export * from './auth/useAuth'; | ||
| export * from './auth/useIsAuthenticated'; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA"} |
+3
-0
@@ -23,2 +23,5 @@ "use strict"; | ||
| __exportStar(require("./usePolybase"), exports); | ||
| __exportStar(require("./auth/AuthProvider"), exports); | ||
| __exportStar(require("./auth/useAuth"), exports); | ||
| __exportStar(require("./auth/useIsAuthenticated"), exports); | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAkC;AAClC,kDAA+B;AAC/B,sDAAmC;AACnC,8CAA2B;AAC3B,kDAA+B;AAC/B,gDAA6B"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAkC;AAClC,kDAA+B;AAC/B,sDAAmC;AACnC,8CAA2B;AAC3B,kDAA+B;AAC/B,gDAA6B;AAC7B,sDAAmC;AACnC,iDAA8B;AAC9B,4DAAyC"} |
+12
-3
| { | ||
| "name": "@polybase/react", | ||
| "description": "React wrapper for @polybase/client", | ||
| "version": "0.3.35", | ||
| "version": "0.3.36", | ||
| "main": "./dist/index.js", | ||
@@ -17,2 +17,3 @@ "types": "./dist/index.d.ts", | ||
| "prepare": "yarn build", | ||
| "test": "jest ./src", | ||
| "fix": "yarn eslint \"./src/**/*.{ts,tsx}\" --fix" | ||
@@ -28,6 +29,11 @@ }, | ||
| ], | ||
| "testEnvironment": "node" | ||
| "testEnvironment": "jsdom" | ||
| }, | ||
| "devDependencies": { | ||
| "@polybase/auth": "^0.3.36", | ||
| "@polybase/client": "^0.3.36", | ||
| "@sinonjs/fake-timers": "^10.0.2", | ||
| "@testing-library/jest-dom": "^5.16.5", | ||
| "@testing-library/react": "^14.0.0", | ||
| "@testing-library/react-hooks": "^8.0.1", | ||
| "@types/jest": "^29.2.4", | ||
@@ -47,2 +53,4 @@ "@types/react": "^18.0.26", | ||
| "jest": "^29.3.1", | ||
| "react": ">=16.8", | ||
| "react-test-renderer": "^18.2.0", | ||
| "rimraf": "^3.0.2", | ||
@@ -53,6 +61,7 @@ "ts-jest": "^29.0.3", | ||
| "peerDependencies": { | ||
| "@polybase/auth": "*", | ||
| "@polybase/client": "*", | ||
| "react": ">=16.8" | ||
| }, | ||
| "gitHead": "041e2442ca8167d8df7397571e3dbcd530070477" | ||
| "gitHead": "d69e4e700a6a0ef1d0d69be903bb97b1904d3b3f" | ||
| } |
+3
-0
@@ -7,1 +7,4 @@ export * from './PolybaseProvider' | ||
| export * from './usePolybase' | ||
| export * from './auth/AuthProvider' | ||
| export * from './auth/useAuth' | ||
| export * from './auth/useIsAuthenticated' |
44941
83.09%59
59.46%739
115.45%3
50%25
38.89%